From 4be5d04dd7f757b4378858baa6663e622f899004 Mon Sep 17 00:00:00 2001 From: fangyang2021 <3020949587@qq.com> Date: Thu, 21 Nov 2024 12:35:26 +0800 Subject: [PATCH] first commit --- .gitignore | 52 + admin/pom.xml | 96 + admin/src/main/java/com/yyy/Application.java | 17 + .../com/yyy/web/config/SwaggerConfig.java | 150 + .../controller/common/CommonController.java | 154 + .../web/controller/ums/OauthController.java | 88 + .../web/controller/ums/UmsMenuController.java | 104 + .../ums/UmsOrganizationController.java | 115 + .../web/controller/ums/UmsRoleController.java | 99 + .../web/controller/ums/UmsUserController.java | 236 + admin/src/main/resources/application-dev.yml | 70 + admin/src/main/resources/application-prod.yml | 60 + admin/src/main/resources/application.yml | 54 + admin/src/main/resources/banner.txt | 22 + admin/src/main/resources/logback-spring.xml | 152 + .../main/resources/mybatis/mybatis-config.xml | 20 + common/pom.xml | 128 + .../yyy/common/annotation/excel/Excel.java | 186 + .../yyy/common/annotation/excel/Excels.java | 17 + .../common/annotation/tree/TreeNodeId.java | 16 + .../common/annotation/tree/TreeNodeName.java | 16 + .../annotation/tree/TreeNodeParentId.java | 16 + .../common/annotation/word/WordExport.java | 30 + .../java/com/yyy/common/config/AppConfig.java | 192 + .../java/com/yyy/common/config/QRConfig.java | 30 + .../com/yyy/common/config/ServerConfig.java | 33 + .../com/yyy/common/config/WordConfig.java | 75 + .../com/yyy/common/constant/Constants.java | 154 + .../common/constant/ScheduleConstants.java | 49 + .../yyy/common/constant/ShiroConstants.java | 77 + .../core/controller/BaseController.java | 254 ++ .../com/yyy/common/core/domain/Result.java | 69 + .../yyy/common/core/domain/ResultCode.java | 32 + .../yyy/common/core/domain/dto/LoginDto.java | 34 + .../common/core/domain/dto/UmsMenuDto.java | 54 + .../core/domain/dto/UmsOrganizationDto.java | 44 + .../common/core/domain/dto/UmsRoleDto.java | 44 + .../common/core/domain/dto/UmsUserAddDto.java | 60 + .../yyy/common/core/domain/dto/UmsUserKV.java | 18 + .../core/domain/dto/UmsUserPasswordDto.java | 33 + .../core/domain/dto/UmsUserQueryDto.java | 46 + .../core/domain/dto/UmsUserSelfDto.java | 39 + .../core/domain/entity/SysDictData.java | 233 + .../common/core/domain/entity/UmsMenu.java | 118 + .../core/domain/entity/UmsOrganization.java | 100 + .../common/core/domain/entity/UmsRole.java | 104 + .../core/domain/entity/UmsRoleMenu.java | 34 + .../common/core/domain/entity/UmsUser.java | 177 + .../domain/entity/UmsUserOrganization.java | 34 + .../core/domain/entity/UmsUserRole.java | 34 + .../yyy/common/core/domain/vo/LoginVo.java | 47 + .../yyy/common/core/domain/vo/UmsMenuVo.java | 68 + .../core/domain/vo/UmsOrganizationVo.java | 52 + .../yyy/common/core/domain/vo/UmsRoleVo.java | 60 + .../yyy/common/core/domain/vo/UmsUserVo.java | 69 + .../com/yyy/common/core/page/PageDomain.java | 89 + .../yyy/common/core/page/TableDataInfo.java | 85 + .../yyy/common/core/page/TableSupport.java | 56 + .../com/yyy/common/core/qr/PdfCellUtill.java | 118 + .../common/core/qr/QrCodeManageAction.java | 196 + .../com/yyy/common/core/text/CharsetKit.java | 88 + .../com/yyy/common/core/text/Convert.java | 1007 +++++ .../yyy/common/core/text/StrFormatter.java | 93 + .../com/yyy/common/enums/AssetStatusEnum.java | 43 + .../yyy/common/enums/BusinessStatusEnum.java | 29 + .../java/com/yyy/common/enums/ConfigEnum.java | 23 + .../com/yyy/common/enums/DetectTypeEnum.java | 71 + .../com/yyy/common/enums/EncodingEum.java | 46 + .../yyy/common/enums/FieldDataTypeEnum.java | 44 + .../java/com/yyy/common/enums/FlowStatus.java | 54 + .../com/yyy/common/enums/JobTypeEnum.java | 39 + .../common/enums/OrganizationTypeEnum.java | 39 + .../yyy/common/enums/PlanCycleTypeEnum.java | 36 + .../com/yyy/common/enums/PlanTypeEnum.java | 63 + .../com/yyy/common/enums/ScrapTypeEnum.java | 35 + .../java/com/yyy/common/enums/SexEnum.java | 29 + .../enums/StockTackingDetailStatusEnum.java | 28 + .../common/enums/StocktakingStatusEnum.java | 24 + .../com/yyy/common/enums/UserStatusEnum.java | 28 + .../yyy/common/enums/WordContentTypeEnum.java | 76 + .../yyy/common/enums/WordPluginsTypeEnum.java | 55 + .../yyy/common/enums/WorkReportTypeEnum.java | 44 + .../yyy/common/exception/CustomException.java | 41 + .../common/exception/DemoModeException.java | 13 + .../yyy/common/exception/GlobalException.java | 56 + .../common/exception/ServiceException.java | 56 + .../yyy/common/exception/UtilException.java | 24 + .../common/exception/base/BaseException.java | 21 + .../common/exception/file/FileException.java | 17 + .../FileNameLengthLimitExceededException.java | 13 + .../file/FileSizeLimitExceededException.java | 14 + .../exception/file/FileUploadException.java | 59 + .../file/InvalidExtensionException.java | 78 + .../common/exception/job/TaskException.java | 32 + .../exception/user/BlackListException.java | 14 + .../exception/user/CaptchaException.java | 16 + .../exception/user/RoleBlockedException.java | 14 + .../exception/user/UserBlockedException.java | 14 + .../exception/user/UserDeleteException.java | 14 + .../common/exception/user/UserException.java | 16 + .../user/UserNotExistsException.java | 14 + .../user/UserPasswordNotMatchException.java | 14 + .../UserPasswordRetryLimitCountException.java | 14 + ...UserPasswordRetryLimitExceedException.java | 14 + .../factory/word/AbstractImportStrategy.java | 15 + .../common/factory/word/ImportStrategy.java | 14 + ...artMultiSeriesReferenceImportStrategy.java | 43 + ...rtSingleSeriesReferenceImportStrategy.java | 37 + .../labels/ChartsReferenceImportStrategy.java | 43 + .../labels/ImgReferenceImportStrategy.java | 22 + .../labels/IncludeImportStrategy.java | 23 + .../labels/LoopColumnTableImportStrategy.java | 28 + .../labels/LoopRowTableImportStrategy.java | 52 + .../labels/NumberingImportStrategy.java | 22 + .../labels/PictureImportStrategy.java | 32 + .../labels/SectionImportStrategy.java | 59 + .../strategy/labels/TableImportStrategy.java | 62 + .../strategy/labels/TextImportStrategy.java | 38 + .../plugins/MyLoopRowTableRenderPolicy.java | 158 + .../java/com/yyy/common/form/FieldData.java | 68 + .../com/yyy/common/utils/bean/BeanUtils.java | 104 + .../yyy/common/utils/chart/ChartValue.java | 19 + .../com/yyy/common/utils/common/CMDUtils.java | 28 + .../yyy/common/utils/common/CacheUtils.java | 358 ++ .../yyy/common/utils/common/DateUtils.java | 250 ++ .../yyy/common/utils/common/DictUtils.java | 246 ++ .../common/utils/common/ExceptionUtil.java | 39 + .../com/yyy/common/utils/common/MD5Utils.java | 48 + .../com/yyy/common/utils/common/OSUtils.java | 7 + .../yyy/common/utils/common/PageUtils.java | 29 + .../yyy/common/utils/common/ServletUtils.java | 230 + .../yyy/common/utils/common/StringUtils.java | 636 +++ .../com/yyy/common/utils/common/Threads.java | 94 + .../yyy/common/utils/eam/DocumentsUtil.java | 4 + .../utils/eam/ResidualValueCalculator.java | 71 + .../yyy/common/utils/file/FileTypeUtils.java | 135 + .../common/utils/file/FileUploadUtils.java | 271 ++ .../com/yyy/common/utils/file/FileUtils.java | 245 ++ .../com/yyy/common/utils/file/ImageUtils.java | 259 ++ .../yyy/common/utils/file/MimeTypeUtils.java | 59 + .../common/utils/poi/ExcelHandlerAdapter.java | 25 + .../com/yyy/common/utils/poi/ExcelUtil.java | 1718 ++++++++ .../com/yyy/common/utils/poi/FormData.java | 37 + .../yyy/common/utils/poi/FormExportUtils.java | 577 +++ .../yyy/common/utils/poi/FormMetaData.java | 50 + .../com/yyy/common/utils/poi/PDFUtils.java | 165 + .../yyy/common/utils/poi/RichTextUtils.java | 101 + .../common/utils/reflect/ReflectUtils.java | 405 ++ .../yyy/common/utils/security/JwtUtils.java | 58 + .../common/utils/security/SessionHolder.java | 22 + .../yyy/common/utils/spring/SpringUtils.java | 157 + .../com/yyy/common/utils/sql/SqlUtil.java | 76 + .../common/utils/tree/TreeBuilderUtil.java | 71 + .../com/yyy/common/utils/tree/TreeNode.java | 152 + .../com/yyy/common/utils/uuid/IdUtils.java | 47 + .../java/com/yyy/common/utils/uuid/Seq.java | 87 + .../yyy/common/utils/uuid/SnowFlakeUtil.java | 75 + .../java/com/yyy/common/utils/uuid/UUID.java | 485 +++ flowable/pom.xml | 93 + .../common/constant/ProcessConstants.java | 79 + .../flowable/common/enums/FlowComment.java | 40 + .../yyy/flowable/config/FlowableConfig.java | 30 + .../config/MyDefaultProcessDiagramCanvas.java | 95 + .../controller/EamHomeController.java | 61 + .../controller/FlDeviceController.java | 232 + .../flowable/controller/FlFormController.java | 136 + .../controller/FlFormItemController.java | 155 + .../controller/FlowDefinitionController.java | 202 + .../controller/FlowInstanceController.java | 77 + .../controller/FlowTaskController.java | 275 ++ .../flowable/domain/FlowableNodeParams.java | 27 + .../flowable/domain/dto/FlowCommentDto.java | 21 + .../flowable/domain/dto/FlowFromFieldDTO.java | 11 + .../yyy/flowable/domain/dto/FlowNextDto.java | 17 + .../flowable/domain/dto/FlowSaveXmlVo.java | 24 + .../yyy/flowable/domain/dto/FlowTaskDto.java | 102 + .../domain/dto/FlowTaskMessageDto.java | 36 + .../flowable/domain/dto/FlowViewerDto.java | 19 + .../yyy/flowable/domain/vo/FlowQueryVo.java | 31 + .../yyy/flowable/domain/vo/FlowTaskVo.java | 54 + .../flowable/domain/vo/ReturnTaskNodeVo.java | 20 + .../flowable/factory/FlowServiceFactory.java | 39 + ...tomInjectUserTaskInProcessInstanceCmd.java | 297 ++ .../flow/CustomProcessDiagramCanvas.java | 366 ++ .../flow/CustomProcessDiagramGenerator.java | 400 ++ .../yyy/flowable/flow/FindNextNodeUtil.java | 253 ++ .../com/yyy/flowable/flow/FlowableUtils.java | 585 +++ .../listener/FlowExecutionListener.java | 34 + .../flowable/listener/FlowTaskListener.java | 56 + .../service/FlowGlobalProcessService.java | 16 + .../service/IFlowDefinitionService.java | 87 + .../service/IFlowInstanceService.java | 50 + .../flowable/service/IFlowTaskService.java | 221 + .../impl/FlowDefinitionServiceImpl.java | 284 ++ .../impl/FlowGlobalProcessServiceImpl.java | 302 ++ .../service/impl/FlowInstanceServiceImpl.java | 148 + .../service/impl/FlowTaskServiceImpl.java | 1606 +++++++ .../java/com/yyy/flowable/task/SysTask.java | 94 + framework/pom.xml | 52 + .../aspect/GlobalExceptionHandler.java | 78 + .../framework/aspect/GlobalRequestAspect.java | 103 + .../aspect/GlobalResponseAspect.java | 64 + .../com/yyy/framework/aspect/SqlHandler.java | 35 + .../framework/config/MyBatisPlusConfig.java | 27 + .../shiro/service/SysPasswordService.java | 79 + kernel/pom.xml | 22 + .../com/yyy/kernel/device/AbstractDevice.java | 44 + .../java/com/yyy/kernel/device/IDevice.java | 40 + .../yyy/kernel/device/model/MockDevice.java | 31 + .../com/yyy/kernel/enums/DeviceStatus.java | 12 + .../java/com/yyy/kernel/enums/DeviceType.java | 12 + .../com/yyy/kernel/service/DeviceService.java | 119 + modules/pom.xml | 28 + .../com/yyy/minio/config/MinioConfig.java | 45 + pom.xml | 372 ++ quartz/pom.xml | 39 + .../com/yyy/quartz/config/ScheduleConfig.java | 56 + .../quartz/controller/SysJobController.java | 171 + .../controller/SysJobLogController.java | 67 + .../com/yyy/quartz/domain/JobMessage.java | 15 + .../java/com/yyy/quartz/domain/SysJob.java | 275 ++ .../java/com/yyy/quartz/domain/SysJobLog.java | 175 + .../yyy/quartz/mapper/SysJobLogMapper.java | 67 + .../com/yyy/quartz/mapper/SysJobMapper.java | 78 + .../yyy/quartz/service/ISysJobLogService.java | 57 + .../yyy/quartz/service/ISysJobService.java | 110 + .../service/impl/SysJobLogServiceImpl.java | 88 + .../service/impl/SysJobServiceImpl.java | 270 ++ .../main/java/com/yyy/quartz/task/RyTask.java | 27 + .../yyy/quartz/util/AbstractQuartzJob.java | 117 + .../java/com/yyy/quartz/util/CronUtils.java | 93 + .../com/yyy/quartz/util/JobInvokeUtil.java | 191 + .../QuartzDisallowConcurrentExecution.java | 18 + .../yyy/quartz/util/QuartzJobExecution.java | 17 + .../com/yyy/quartz/util/ScheduleUtils.java | 130 + .../mapper/quartz/SysJobLogMapper.xml | 94 + .../resources/mapper/quartz/SysJobMapper.xml | 123 + sql/eam2.sql | 3810 +++++++++++++++++ sql/quartz.sql | 216 + system/pom.xml | 33 + .../system/controller/EamAssetController.java | 472 ++ .../controller/EamAssetLogController.java | 75 + .../EamBasicCategoryController.java | 147 + .../EamBasicFinancialCategoryController.java | 104 + .../EamBasicMaintenanceVendorController.java | 98 + ...EamBasicManufacturersVendorController.java | 93 + .../EamBasicPositionController.java | 104 + .../EamBasicSupplierVendorController.java | 97 + .../controller/EamBasicTeamController.java | 107 + .../EamBasicWarehouseController.java | 98 + .../EamBusinessAllocateController.java | 172 + .../EamBusinessBorrowController.java | 168 + .../EamBusinessCollectionController.java | 175 + .../controller/EamBusinessController.java | 53 + .../EamBusinessOutboundController.java | 175 + .../EamBusinessRetirementController.java | 187 + .../EamBusinessReturnController.java | 169 + .../EamBusinessReturnInventoryController.java | 135 + .../EamBusinessStorageController.java | 188 + .../EamBusinessTransferController.java | 174 + .../controller/EamDeviceController.java | 185 + .../system/controller/EamPlanController.java | 115 + .../controller/EamRepairController.java | 143 + .../controller/EamRepairFaultController.java | 136 + .../controller/EamRepairTypeController.java | 98 + .../EamStocktakingDetailsController.java | 107 + .../EamStocktakingJobController.java | 196 + .../EamStocktakingPlanController.java | 121 + .../system/controller/QrCodeController.java | 39 + .../system/controller/SysAlarmController.java | 69 + .../controller/SysConfigController.java | 98 + .../controller/SysDictDataController.java | 93 + .../controller/SysDictTypeController.java | 93 + .../controller/SysFormLogController.java | 139 + .../controller/SysFormTempController.java | 333 ++ .../system/controller/SysLogController.java | 91 + .../yyy/system/controller/TestController.java | 103 + .../com/yyy/system/entity/bo/JobDefect.java | 124 + .../com/yyy/system/entity/bo/SpareParts.java | 44 + .../yyy/system/entity/dto/DeviceJobDto.java | 74 + .../system/entity/dto/DeviceJobQueryDto.java | 33 + .../system/entity/dto/DeviceJobRepairDto.java | 75 + .../system/entity/dto/DevicePlanAddDto.java | 135 + .../system/entity/dto/DevicePlanQueryDto.java | 32 + .../yyy/system/entity/dto/EamAssetDto.java | 171 + .../yyy/system/entity/dto/EamAssetLogDto.java | 35 + .../system/entity/dto/EamAssetQueryDto.java | 64 + .../entity/dto/EamBasicCategoryDto.java | 50 + .../dto/EamBasicFinancialCategoryDto.java | 42 + .../dto/EamBasicMaintenanceVendorDto.java | 52 + .../dto/EamBasicManufacturersVendorDto.java | 38 + .../entity/dto/EamBasicPositionDto.java | 36 + .../entity/dto/EamBasicSupplierVendorDto.java | 52 + .../system/entity/dto/EamBasicTeamDto.java | 51 + .../entity/dto/EamBasicWarehouseDto.java | 32 + .../entity/dto/EamBusinessAllocateDto.java | 63 + .../entity/dto/EamBusinessBorrowDto.java | 64 + .../entity/dto/EamBusinessCollectionDto.java | 70 + .../yyy/system/entity/dto/EamBusinessDto.java | 39 + .../entity/dto/EamBusinessOutboundDto.java | 86 + .../dto/EamBusinessRegistrationDto.java | 59 + .../entity/dto/EamBusinessRetirementDto.java | 61 + .../entity/dto/EamBusinessReturnDto.java | 64 + .../dto/EamBusinessReturnInventoryDto.java | 71 + .../entity/dto/EamBusinessStorageDto.java | 68 + .../entity/dto/EamBusinessTransferDto.java | 72 + .../yyy/system/entity/dto/EamRepairDto.java | 52 + .../system/entity/dto/EamRepairFaultDto.java | 42 + .../system/entity/dto/EamRepairTypeDto.java | 34 + .../system/entity/dto/EamSparePartsDto.java | 23 + .../entity/dto/EamStocktakingDetailsDto.java | 43 + .../entity/dto/EamStocktakingJobDto.java | 87 + .../entity/dto/EamStocktakingPlanDto.java | 72 + .../entity/dto/EamWarehouseAssetDto.java | 28 + .../entity/dto/EamWarehouseInventoryDto.java | 43 + .../com/yyy/system/entity/dto/FlFormDto.java | 64 + .../entity/dto/FlFormItemCalendarDto.java | 37 + .../yyy/system/entity/dto/FlFormItemDto.java | 62 + .../yyy/system/entity/dto/FlListenerDto.java | 56 + .../yyy/system/entity/dto/FlowProcDefDto.java | 56 + .../yyy/system/entity/dto/SysConfigDto.java | 48 + .../yyy/system/entity/dto/SysDictDataDto.java | 63 + .../yyy/system/entity/dto/SysDictTypeDto.java | 48 + .../system/entity/dto/SysFormLogAddDto.java | 39 + .../entity/dto/SysFormLogQuarryDto.java | 30 + .../yyy/system/entity/dto/SysFormTempDto.java | 41 + .../com/yyy/system/entity/dto/SysLogDto.java | 32 + .../yyy/system/entity/dto/WordExportDto.java | 27 + .../entity/dto/WorkReportGenerateDto.java | 118 + .../system/entity/dto/WorkReportItemDto.java | 40 + .../system/entity/dto/WorkReportQueryDto.java | 46 + .../system/entity/excel/EamAssetExcel.java | 128 + .../entity/excel/EamAssetExportExcel.java | 165 + .../system/entity/excel/SysFormTempExcel.java | 83 + .../com/yyy/system/entity/pojo/EamAsset.java | 399 ++ .../yyy/system/entity/pojo/EamAssetLog.java | 89 + .../system/entity/pojo/EamBasicCategory.java | 113 + .../pojo/EamBasicFinancialCategory.java | 95 + .../pojo/EamBasicMaintenanceVendor.java | 119 + .../pojo/EamBasicManufacturersVendor.java | 89 + .../system/entity/pojo/EamBasicPosition.java | 82 + .../entity/pojo/EamBasicSupplierVendor.java | 118 + .../yyy/system/entity/pojo/EamBasicTeam.java | 86 + .../system/entity/pojo/EamBasicWarehouse.java | 77 + .../entity/pojo/EamBusinessAllocate.java | 136 + .../system/entity/pojo/EamBusinessBorrow.java | 132 + .../entity/pojo/EamBusinessCollection.java | 151 + .../entity/pojo/EamBusinessOutbound.java | 150 + .../entity/pojo/EamBusinessRegistration.java | 97 + .../entity/pojo/EamBusinessRetirement.java | 141 + .../system/entity/pojo/EamBusinessReturn.java | 149 + .../pojo/EamBusinessReturnInventory.java | 151 + .../entity/pojo/EamBusinessStorage.java | 144 + .../entity/pojo/EamBusinessTransfer.java | 156 + .../com/yyy/system/entity/pojo/EamRepair.java | 116 + .../system/entity/pojo/EamRepairFault.java | 101 + .../yyy/system/entity/pojo/EamRepairType.java | 83 + .../entity/pojo/EamStocktakingDetails.java | 101 + .../system/entity/pojo/EamStocktakingJob.java | 181 + .../entity/pojo/EamStocktakingPlan.java | 181 + .../system/entity/pojo/EamWarehouseAsset.java | 40 + .../entity/pojo/EamWarehouseInventory.java | 44 + .../com/yyy/system/entity/pojo/FlForm.java | 123 + .../yyy/system/entity/pojo/FlFormItem.java | 109 + .../yyy/system/entity/pojo/FlListener.java | 101 + .../com/yyy/system/entity/pojo/SysConfig.java | 82 + .../yyy/system/entity/pojo/SysDictData.java | 113 + .../yyy/system/entity/pojo/SysDictType.java | 81 + .../yyy/system/entity/pojo/SysFormLog.java | 84 + .../yyy/system/entity/pojo/SysFormTemp.java | 93 + .../com/yyy/system/entity/pojo/SysLog.java | 50 + .../com/yyy/system/entity/vo/AlarmVo.java | 34 + .../com/yyy/system/entity/vo/DeviceJobVo.java | 144 + .../com/yyy/system/entity/vo/DeviceVo.java | 47 + .../yyy/system/entity/vo/EamAssetLogVo.java | 57 + .../com/yyy/system/entity/vo/EamAssetVo.java | 196 + .../system/entity/vo/EamBasicCategoryVo.java | 70 + .../vo/EamBasicFinancialCategoryVo.java | 64 + .../vo/EamBasicMaintenanceVendorVo.java | 75 + .../vo/EamBasicManufacturersVendorVo.java | 60 + .../system/entity/vo/EamBasicPositionVo.java | 57 + .../entity/vo/EamBasicSupplierVendorVo.java | 75 + .../yyy/system/entity/vo/EamBasicTeamVo.java | 84 + .../system/entity/vo/EamBasicWarehouseVo.java | 52 + .../yyy/system/entity/vo/EamBigScreenVo.java | 52 + .../entity/vo/EamBusinessAllocateVo.java | 84 + .../system/entity/vo/EamBusinessBorrowVo.java | 82 + .../entity/vo/EamBusinessCollectionVo.java | 90 + .../entity/vo/EamBusinessOutboundVo.java | 91 + .../entity/vo/EamBusinessRegistrationVo.java | 65 + .../entity/vo/EamBusinessRetirementVo.java | 89 + .../vo/EamBusinessReturnInventoryVo.java | 93 + .../system/entity/vo/EamBusinessReturnVo.java | 89 + .../entity/vo/EamBusinessStorageVo.java | 97 + .../entity/vo/EamBusinessTransferVo.java | 93 + .../yyy/system/entity/vo/EamBusinessVo.java | 51 + .../com/yyy/system/entity/vo/EamChartVo.java | 22 + .../yyy/system/entity/vo/EamDeviceLogVo.java | 68 + .../com/yyy/system/entity/vo/EamHomeVo.java | 55 + .../system/entity/vo/EamRepairFaultVo.java | 69 + .../yyy/system/entity/vo/EamRepairTypeVo.java | 57 + .../com/yyy/system/entity/vo/EamRepairVo.java | 77 + .../yyy/system/entity/vo/EamStatisticsVo.java | 22 + .../entity/vo/EamStocktakingDetailsVo.java | 71 + .../system/entity/vo/EamStocktakingJobVo.java | 115 + .../entity/vo/EamStocktakingPlanVo.java | 102 + .../com/yyy/system/entity/vo/EamTotalVo.java | 26 + .../system/entity/vo/EamWarehouseAssetVo.java | 50 + .../entity/vo/EamWarehouseInventoryVo.java | 85 + .../system/entity/vo/EamWarningBorrowVo.java | 95 + .../entity/vo/FlFormItemCalendarVo.java | 54 + .../yyy/system/entity/vo/FlFormItemVo.java | 88 + .../com/yyy/system/entity/vo/FlFormVo.java | 95 + .../yyy/system/entity/vo/FlListenerVo.java | 82 + .../com/yyy/system/entity/vo/FlowNode.java | 37 + .../entity/vo/OperationalStatisticsVo.java | 56 + .../system/entity/vo/ProcessHomePageVo.java | 28 + .../com/yyy/system/entity/vo/SysConfigVo.java | 71 + .../yyy/system/entity/vo/SysDictDataVo.java | 86 + .../yyy/system/entity/vo/SysDictTypeVo.java | 71 + .../yyy/system/entity/vo/SysFormLogVo.java | 67 + .../yyy/system/entity/vo/SysFormTempVo.java | 87 + .../com/yyy/system/entity/vo/SysLogVo.java | 53 + .../yyy/system/entity/vo/WorkReportData.java | 40 + .../yyy/system/entity/vo/WorkReportItem.java | 34 + .../yyy/system/entity/vo/WorkReportVo.java | 41 + .../word/enums/SanitaryConditionEnum.java | 35 + .../system/entity/word/form/RepairForm.java | 45 + .../entity/word/form/ReplacementParts.java | 16 + .../yyy/system/mapper/EamAssetLogMapper.java | 18 + .../com/yyy/system/mapper/EamAssetMapper.java | 34 + .../system/mapper/EamBasicCategoryMapper.java | 16 + .../EamBasicFinancialCategoryMapper.java | 15 + .../EamBasicMaintenanceVendorMapper.java | 15 + .../EamBasicManufacturersVendorMapper.java | 18 + .../system/mapper/EamBasicPositionMapper.java | 15 + .../mapper/EamBasicSupplierVendorMapper.java | 15 + .../yyy/system/mapper/EamBasicTeamMapper.java | 15 + .../mapper/EamBasicWarehouseMapper.java | 15 + .../mapper/EamBusinessAllocateMapper.java | 15 + .../mapper/EamBusinessBorrowMapper.java | 15 + .../mapper/EamBusinessCollectionMapper.java | 15 + .../mapper/EamBusinessOutboundMapper.java | 15 + .../mapper/EamBusinessRegistrationMapper.java | 15 + .../mapper/EamBusinessRetirementMapper.java | 15 + .../EamBusinessReturnInventoryMapper.java | 15 + .../mapper/EamBusinessReturnMapper.java | 15 + .../mapper/EamBusinessStorageMapper.java | 15 + .../mapper/EamBusinessTransferMapper.java | 15 + .../system/mapper/EamRepairFaultMapper.java | 15 + .../yyy/system/mapper/EamRepairMapper.java | 15 + .../system/mapper/EamRepairTypeMapper.java | 15 + .../mapper/EamStocktakingDetailsMapper.java | 15 + .../mapper/EamStocktakingJobMapper.java | 15 + .../mapper/EamStocktakingPlanMapper.java | 15 + .../mapper/EamWarehouseAssetMapper.java | 19 + .../mapper/EamWarehouseInventoryMapper.java | 23 + .../yyy/system/mapper/FlFormItemMapper.java | 15 + .../com/yyy/system/mapper/FlFormMapper.java | 15 + .../yyy/system/mapper/FlListenerMapper.java | 15 + .../yyy/system/mapper/FlowDeployMapper.java | 29 + .../yyy/system/mapper/SysConfigMapper.java | 15 + .../yyy/system/mapper/SysDictDataMapper.java | 15 + .../yyy/system/mapper/SysDictTypeMapper.java | 15 + .../yyy/system/mapper/SysFormLogMapper.java | 15 + .../yyy/system/mapper/SysFormTempMapper.java | 15 + .../com/yyy/system/mapper/SysLogMapper.java | 15 + .../com/yyy/system/mapper/UmsMenuMapper.java | 24 + .../system/mapper/UmsOrganizationMapper.java | 14 + .../com/yyy/system/mapper/UmsRoleMapper.java | 22 + .../yyy/system/mapper/UmsRoleMenuMapper.java | 15 + .../com/yyy/system/mapper/UmsUserMapper.java | 17 + .../mapper/UmsUserOrganizationMapper.java | 14 + .../yyy/system/mapper/UmsUserRoleMapper.java | 14 + .../yyy/system/service/DevicePlanService.java | 66 + .../system/service/EamAssetLogService.java | 23 + .../yyy/system/service/EamAssetService.java | 58 + .../service/EamBasicCategoryService.java | 18 + .../EamBasicFinancialCategoryService.java | 15 + .../EamBasicMaintenanceVendorService.java | 15 + .../EamBasicManufacturersVendorService.java | 18 + .../service/EamBasicPositionService.java | 15 + .../EamBasicSupplierVendorService.java | 15 + .../system/service/EamBasicTeamService.java | 15 + .../service/EamBasicWarehouseService.java | 15 + .../service/EamBusinessAllocateService.java | 20 + .../service/EamBusinessBorrowService.java | 19 + .../service/EamBusinessCollectionService.java | 22 + .../service/EamBusinessOutboundService.java | 19 + .../EamBusinessRegistrationService.java | 20 + .../service/EamBusinessRetirementService.java | 22 + .../EamBusinessReturnInventoryService.java | 22 + .../service/EamBusinessReturnService.java | 23 + .../system/service/EamBusinessService.java | 19 + .../service/EamBusinessStorageService.java | 19 + .../service/EamBusinessTransferService.java | 22 + .../system/service/EamRepairFaultService.java | 23 + .../yyy/system/service/EamRepairService.java | 24 + .../system/service/EamRepairTypeService.java | 15 + .../service/EamStocktakingDetailsService.java | 17 + .../service/EamStocktakingJobService.java | 17 + .../service/EamStocktakingPlanService.java | 17 + .../service/EamWarehouseAssetService.java | 22 + .../yyy/system/service/FlFormItemService.java | 38 + .../com/yyy/system/service/FlFormService.java | 19 + .../yyy/system/service/FlListenerService.java | 15 + .../yyy/system/service/SysConfigService.java | 15 + .../system/service/SysDictDataService.java | 27 + .../system/service/SysDictTypeService.java | 15 + .../yyy/system/service/SysFormLogService.java | 15 + .../system/service/SysFormTempService.java | 15 + .../com/yyy/system/service/SysLogService.java | 15 + .../yyy/system/service/UmsMenuService.java | 27 + .../service/UmsOrganizationService.java | 13 + .../system/service/UmsRoleMenuService.java | 12 + .../yyy/system/service/UmsRoleService.java | 33 + .../yyy/system/service/UmsUserService.java | 55 + .../yyy/system/service/WordExportService.java | 25 + .../service/impl/DevicePlanServiceImpl.java | 272 ++ .../service/impl/EamAssetLogServiceImpl.java | 58 + .../service/impl/EamAssetServiceImpl.java | 636 +++ .../impl/EamBasicCategoryServiceImpl.java | 38 + .../EamBasicFinancialCategoryServiceImpl.java | 35 + .../EamBasicMaintenanceVendorServiceImpl.java | 35 + ...amBasicManufacturersVendorServiceImpl.java | 40 + .../impl/EamBasicPositionServiceImpl.java | 35 + .../EamBasicSupplierVendorServiceImpl.java | 39 + .../service/impl/EamBasicTeamServiceImpl.java | 35 + .../impl/EamBasicWarehouseServiceImpl.java | 35 + .../impl/EamBusinessAllocateServiceImpl.java | 72 + .../impl/EamBusinessBorrowServiceImpl.java | 66 + .../EamBusinessCollectionServiceImpl.java | 103 + .../impl/EamBusinessOutboundServiceImpl.java | 77 + .../EamBusinessRegistrationServiceImpl.java | 52 + .../EamBusinessRetirementServiceImpl.java | 88 + ...EamBusinessReturnInventoryServiceImpl.java | 81 + .../impl/EamBusinessReturnServiceImpl.java | 74 + .../service/impl/EamBusinessServiceImpl.java | 223 + .../impl/EamBusinessStorageServiceImpl.java | 81 + .../impl/EamBusinessTransferServiceImpl.java | 99 + .../impl/EamRepairFaultServiceImpl.java | 60 + .../service/impl/EamRepairServiceImpl.java | 95 + .../impl/EamRepairTypeServiceImpl.java | 35 + .../EamStocktakingDetailsServiceImpl.java | 56 + .../impl/EamStocktakingJobServiceImpl.java | 80 + .../impl/EamStocktakingPlanServiceImpl.java | 81 + .../impl/EamWarehouseAssetServiceImpl.java | 100 + .../service/impl/FlFormItemServiceImpl.java | 230 + .../service/impl/FlFormServiceImpl.java | 74 + .../service/impl/FlListenerServiceImpl.java | 35 + .../service/impl/SysConfigServiceImpl.java | 35 + .../service/impl/SysDictDataServiceImpl.java | 49 + .../service/impl/SysDictTypeServiceImpl.java | 35 + .../service/impl/SysFormLogServiceImpl.java | 34 + .../service/impl/SysFormTempServiceImpl.java | 35 + .../service/impl/SysLogServiceImpl.java | 35 + .../service/impl/UmsMenuServiceImpl.java | 62 + .../impl/UmsOrganizationServiceImpl.java | 29 + .../service/impl/UmsRoleMenuServiceImpl.java | 25 + .../service/impl/UmsRoleServiceImpl.java | 89 + .../service/impl/UmsUserServiceImpl.java | 187 + .../service/impl/WordExportServiceImpl.java | 265 ++ .../resources/mapper/EamAssetLogMapper.xml | 63 + .../main/resources/mapper/EamAssetMapper.xml | 563 +++ .../mapper/EamBasicCategoryMapper.xml | 72 + .../EamBasicFinancialCategoryMapper.xml | 67 + .../EamBasicMaintenanceVendorMapper.xml | 83 + .../EamBasicManufacturersVendorMapper.xml | 63 + .../mapper/EamBasicPositionMapper.xml | 58 + .../mapper/EamBasicSupplierVendorMapper.xml | 82 + .../resources/mapper/EamBasicTeamMapper.xml | 67 + .../mapper/EamBasicWarehouseMapper.xml | 54 + .../mapper/EamBusinessAllocateMapper.xml | 88 + .../mapper/EamBusinessBorrowMapper.xml | 88 + .../mapper/EamBusinessCollectionMapper.xml | 96 + .../mapper/EamBusinessOutboundMapper.xml | 96 + .../mapper/EamBusinessRegistrationMapper.xml | 72 + .../mapper/EamBusinessRetirementMapper.xml | 96 + .../EamBusinessReturnInventoryMapper.xml | 96 + .../mapper/EamBusinessReturnMapper.xml | 96 + .../mapper/EamBusinessStorageMapper.xml | 92 + .../mapper/EamBusinessTransferMapper.xml | 100 + .../resources/mapper/EamRepairFaultMapper.xml | 72 + .../main/resources/mapper/EamRepairMapper.xml | 80 + .../resources/mapper/EamRepairTypeMapper.xml | 59 + .../mapper/EamStocktakingDetailsMapper.xml | 72 + .../mapper/EamStocktakingJobMapper.xml | 108 + .../mapper/EamStocktakingPlanMapper.xml | 108 + .../mapper/EamWarehouseAssetMapper.xml | 49 + .../mapper/EamWarehouseInventoryMapper.xml | 125 + .../resources/mapper/FlFormItemMapper.xml | 80 + .../main/resources/mapper/FlFormMapper.xml | 80 + .../resources/mapper/FlListenerMapper.xml | 71 + .../main/resources/mapper/SysConfigMapper.xml | 58 + .../resources/mapper/SysDictDataMapper.xml | 79 + .../resources/mapper/SysDictTypeMapper.xml | 59 + .../resources/mapper/SysFormLogMapper.xml | 66 + .../resources/mapper/SysFormTempMapper.xml | 71 + .../main/resources/mapper/SysLogMapper.xml | 38 + .../main/resources/mapper/UmsMenuMapper.xml | 47 + .../mapper/UmsOrganizationMapper.xml | 79 + .../main/resources/mapper/UmsRoleMapper.xml | 42 + .../resources/mapper/UmsRoleMenuMapper.xml | 15 + .../main/resources/mapper/UmsUserMapper.xml | 78 + .../mapper/UmsUserOrganizationMapper.xml | 31 + .../resources/mapper/UmsUserRoleMapper.xml | 31 + .../mapper/flowable/FlowDeployMapper.xml | 67 + system/src/main/resources/test.bpmn20.xml | 81 + .../resources/员工资产交接.bpmn20.xml | 48 + .../resources/员工资产报修.bpmn20.xml | 48 + .../resources/员工资产报失.bpmn20.xml | 48 + .../resources/员工资产申请.bpmn20.xml | 48 + .../resources/物品领用申请.bpmn20.xml | 48 + .../resources/设备保养任务.bpmn20.xml | 81 + .../resources/设备巡检任务.bpmn20.xml | 81 + .../resources/设备报修维修.bpmn20.xml | 81 + .../resources/设备盘点任务.bpmn20.xml | 81 + .../resources/资产设备报废.bpmn20.xml | 48 + .../resources/资产采购申请.bpmn20.xml | 48 + 619 files changed, 56978 insertions(+) create mode 100644 .gitignore create mode 100644 admin/pom.xml create mode 100644 admin/src/main/java/com/yyy/Application.java create mode 100644 admin/src/main/java/com/yyy/web/config/SwaggerConfig.java create mode 100644 admin/src/main/java/com/yyy/web/controller/common/CommonController.java create mode 100644 admin/src/main/java/com/yyy/web/controller/ums/OauthController.java create mode 100644 admin/src/main/java/com/yyy/web/controller/ums/UmsMenuController.java create mode 100644 admin/src/main/java/com/yyy/web/controller/ums/UmsOrganizationController.java create mode 100644 admin/src/main/java/com/yyy/web/controller/ums/UmsRoleController.java create mode 100644 admin/src/main/java/com/yyy/web/controller/ums/UmsUserController.java create mode 100644 admin/src/main/resources/application-dev.yml create mode 100644 admin/src/main/resources/application-prod.yml create mode 100644 admin/src/main/resources/application.yml create mode 100644 admin/src/main/resources/banner.txt create mode 100644 admin/src/main/resources/logback-spring.xml create mode 100644 admin/src/main/resources/mybatis/mybatis-config.xml create mode 100644 common/pom.xml create mode 100644 common/src/main/java/com/yyy/common/annotation/excel/Excel.java create mode 100644 common/src/main/java/com/yyy/common/annotation/excel/Excels.java create mode 100644 common/src/main/java/com/yyy/common/annotation/tree/TreeNodeId.java create mode 100644 common/src/main/java/com/yyy/common/annotation/tree/TreeNodeName.java create mode 100644 common/src/main/java/com/yyy/common/annotation/tree/TreeNodeParentId.java create mode 100644 common/src/main/java/com/yyy/common/annotation/word/WordExport.java create mode 100644 common/src/main/java/com/yyy/common/config/AppConfig.java create mode 100644 common/src/main/java/com/yyy/common/config/QRConfig.java create mode 100644 common/src/main/java/com/yyy/common/config/ServerConfig.java create mode 100644 common/src/main/java/com/yyy/common/config/WordConfig.java create mode 100644 common/src/main/java/com/yyy/common/constant/Constants.java create mode 100644 common/src/main/java/com/yyy/common/constant/ScheduleConstants.java create mode 100644 common/src/main/java/com/yyy/common/constant/ShiroConstants.java create mode 100644 common/src/main/java/com/yyy/common/core/controller/BaseController.java create mode 100644 common/src/main/java/com/yyy/common/core/domain/Result.java create mode 100644 common/src/main/java/com/yyy/common/core/domain/ResultCode.java create mode 100644 common/src/main/java/com/yyy/common/core/domain/dto/LoginDto.java create mode 100644 common/src/main/java/com/yyy/common/core/domain/dto/UmsMenuDto.java create mode 100644 common/src/main/java/com/yyy/common/core/domain/dto/UmsOrganizationDto.java create mode 100644 common/src/main/java/com/yyy/common/core/domain/dto/UmsRoleDto.java create mode 100644 common/src/main/java/com/yyy/common/core/domain/dto/UmsUserAddDto.java create mode 100644 common/src/main/java/com/yyy/common/core/domain/dto/UmsUserKV.java create mode 100644 common/src/main/java/com/yyy/common/core/domain/dto/UmsUserPasswordDto.java create mode 100644 common/src/main/java/com/yyy/common/core/domain/dto/UmsUserQueryDto.java create mode 100644 common/src/main/java/com/yyy/common/core/domain/dto/UmsUserSelfDto.java create mode 100644 common/src/main/java/com/yyy/common/core/domain/entity/SysDictData.java create mode 100644 common/src/main/java/com/yyy/common/core/domain/entity/UmsMenu.java create mode 100644 common/src/main/java/com/yyy/common/core/domain/entity/UmsOrganization.java create mode 100644 common/src/main/java/com/yyy/common/core/domain/entity/UmsRole.java create mode 100644 common/src/main/java/com/yyy/common/core/domain/entity/UmsRoleMenu.java create mode 100644 common/src/main/java/com/yyy/common/core/domain/entity/UmsUser.java create mode 100644 common/src/main/java/com/yyy/common/core/domain/entity/UmsUserOrganization.java create mode 100644 common/src/main/java/com/yyy/common/core/domain/entity/UmsUserRole.java create mode 100644 common/src/main/java/com/yyy/common/core/domain/vo/LoginVo.java create mode 100644 common/src/main/java/com/yyy/common/core/domain/vo/UmsMenuVo.java create mode 100644 common/src/main/java/com/yyy/common/core/domain/vo/UmsOrganizationVo.java create mode 100644 common/src/main/java/com/yyy/common/core/domain/vo/UmsRoleVo.java create mode 100644 common/src/main/java/com/yyy/common/core/domain/vo/UmsUserVo.java create mode 100644 common/src/main/java/com/yyy/common/core/page/PageDomain.java create mode 100644 common/src/main/java/com/yyy/common/core/page/TableDataInfo.java create mode 100644 common/src/main/java/com/yyy/common/core/page/TableSupport.java create mode 100644 common/src/main/java/com/yyy/common/core/qr/PdfCellUtill.java create mode 100644 common/src/main/java/com/yyy/common/core/qr/QrCodeManageAction.java create mode 100644 common/src/main/java/com/yyy/common/core/text/CharsetKit.java create mode 100644 common/src/main/java/com/yyy/common/core/text/Convert.java create mode 100644 common/src/main/java/com/yyy/common/core/text/StrFormatter.java create mode 100644 common/src/main/java/com/yyy/common/enums/AssetStatusEnum.java create mode 100644 common/src/main/java/com/yyy/common/enums/BusinessStatusEnum.java create mode 100644 common/src/main/java/com/yyy/common/enums/ConfigEnum.java create mode 100644 common/src/main/java/com/yyy/common/enums/DetectTypeEnum.java create mode 100644 common/src/main/java/com/yyy/common/enums/EncodingEum.java create mode 100644 common/src/main/java/com/yyy/common/enums/FieldDataTypeEnum.java create mode 100644 common/src/main/java/com/yyy/common/enums/FlowStatus.java create mode 100644 common/src/main/java/com/yyy/common/enums/JobTypeEnum.java create mode 100644 common/src/main/java/com/yyy/common/enums/OrganizationTypeEnum.java create mode 100644 common/src/main/java/com/yyy/common/enums/PlanCycleTypeEnum.java create mode 100644 common/src/main/java/com/yyy/common/enums/PlanTypeEnum.java create mode 100644 common/src/main/java/com/yyy/common/enums/ScrapTypeEnum.java create mode 100644 common/src/main/java/com/yyy/common/enums/SexEnum.java create mode 100644 common/src/main/java/com/yyy/common/enums/StockTackingDetailStatusEnum.java create mode 100644 common/src/main/java/com/yyy/common/enums/StocktakingStatusEnum.java create mode 100644 common/src/main/java/com/yyy/common/enums/UserStatusEnum.java create mode 100644 common/src/main/java/com/yyy/common/enums/WordContentTypeEnum.java create mode 100644 common/src/main/java/com/yyy/common/enums/WordPluginsTypeEnum.java create mode 100644 common/src/main/java/com/yyy/common/enums/WorkReportTypeEnum.java create mode 100644 common/src/main/java/com/yyy/common/exception/CustomException.java create mode 100644 common/src/main/java/com/yyy/common/exception/DemoModeException.java create mode 100644 common/src/main/java/com/yyy/common/exception/GlobalException.java create mode 100644 common/src/main/java/com/yyy/common/exception/ServiceException.java create mode 100644 common/src/main/java/com/yyy/common/exception/UtilException.java create mode 100644 common/src/main/java/com/yyy/common/exception/base/BaseException.java create mode 100644 common/src/main/java/com/yyy/common/exception/file/FileException.java create mode 100644 common/src/main/java/com/yyy/common/exception/file/FileNameLengthLimitExceededException.java create mode 100644 common/src/main/java/com/yyy/common/exception/file/FileSizeLimitExceededException.java create mode 100644 common/src/main/java/com/yyy/common/exception/file/FileUploadException.java create mode 100644 common/src/main/java/com/yyy/common/exception/file/InvalidExtensionException.java create mode 100644 common/src/main/java/com/yyy/common/exception/job/TaskException.java create mode 100644 common/src/main/java/com/yyy/common/exception/user/BlackListException.java create mode 100644 common/src/main/java/com/yyy/common/exception/user/CaptchaException.java create mode 100644 common/src/main/java/com/yyy/common/exception/user/RoleBlockedException.java create mode 100644 common/src/main/java/com/yyy/common/exception/user/UserBlockedException.java create mode 100644 common/src/main/java/com/yyy/common/exception/user/UserDeleteException.java create mode 100644 common/src/main/java/com/yyy/common/exception/user/UserException.java create mode 100644 common/src/main/java/com/yyy/common/exception/user/UserNotExistsException.java create mode 100644 common/src/main/java/com/yyy/common/exception/user/UserPasswordNotMatchException.java create mode 100644 common/src/main/java/com/yyy/common/exception/user/UserPasswordRetryLimitCountException.java create mode 100644 common/src/main/java/com/yyy/common/exception/user/UserPasswordRetryLimitExceedException.java create mode 100644 common/src/main/java/com/yyy/common/factory/word/AbstractImportStrategy.java create mode 100644 common/src/main/java/com/yyy/common/factory/word/ImportStrategy.java create mode 100644 common/src/main/java/com/yyy/common/factory/word/strategy/labels/ChartMultiSeriesReferenceImportStrategy.java create mode 100644 common/src/main/java/com/yyy/common/factory/word/strategy/labels/ChartSingleSeriesReferenceImportStrategy.java create mode 100644 common/src/main/java/com/yyy/common/factory/word/strategy/labels/ChartsReferenceImportStrategy.java create mode 100644 common/src/main/java/com/yyy/common/factory/word/strategy/labels/ImgReferenceImportStrategy.java create mode 100644 common/src/main/java/com/yyy/common/factory/word/strategy/labels/IncludeImportStrategy.java create mode 100644 common/src/main/java/com/yyy/common/factory/word/strategy/labels/LoopColumnTableImportStrategy.java create mode 100644 common/src/main/java/com/yyy/common/factory/word/strategy/labels/LoopRowTableImportStrategy.java create mode 100644 common/src/main/java/com/yyy/common/factory/word/strategy/labels/NumberingImportStrategy.java create mode 100644 common/src/main/java/com/yyy/common/factory/word/strategy/labels/PictureImportStrategy.java create mode 100644 common/src/main/java/com/yyy/common/factory/word/strategy/labels/SectionImportStrategy.java create mode 100644 common/src/main/java/com/yyy/common/factory/word/strategy/labels/TableImportStrategy.java create mode 100644 common/src/main/java/com/yyy/common/factory/word/strategy/labels/TextImportStrategy.java create mode 100644 common/src/main/java/com/yyy/common/factory/word/strategy/plugins/MyLoopRowTableRenderPolicy.java create mode 100644 common/src/main/java/com/yyy/common/form/FieldData.java create mode 100644 common/src/main/java/com/yyy/common/utils/bean/BeanUtils.java create mode 100644 common/src/main/java/com/yyy/common/utils/chart/ChartValue.java create mode 100644 common/src/main/java/com/yyy/common/utils/common/CMDUtils.java create mode 100644 common/src/main/java/com/yyy/common/utils/common/CacheUtils.java create mode 100644 common/src/main/java/com/yyy/common/utils/common/DateUtils.java create mode 100644 common/src/main/java/com/yyy/common/utils/common/DictUtils.java create mode 100644 common/src/main/java/com/yyy/common/utils/common/ExceptionUtil.java create mode 100644 common/src/main/java/com/yyy/common/utils/common/MD5Utils.java create mode 100644 common/src/main/java/com/yyy/common/utils/common/OSUtils.java create mode 100644 common/src/main/java/com/yyy/common/utils/common/PageUtils.java create mode 100644 common/src/main/java/com/yyy/common/utils/common/ServletUtils.java create mode 100644 common/src/main/java/com/yyy/common/utils/common/StringUtils.java create mode 100644 common/src/main/java/com/yyy/common/utils/common/Threads.java create mode 100644 common/src/main/java/com/yyy/common/utils/eam/DocumentsUtil.java create mode 100644 common/src/main/java/com/yyy/common/utils/eam/ResidualValueCalculator.java create mode 100644 common/src/main/java/com/yyy/common/utils/file/FileTypeUtils.java create mode 100644 common/src/main/java/com/yyy/common/utils/file/FileUploadUtils.java create mode 100644 common/src/main/java/com/yyy/common/utils/file/FileUtils.java create mode 100644 common/src/main/java/com/yyy/common/utils/file/ImageUtils.java create mode 100644 common/src/main/java/com/yyy/common/utils/file/MimeTypeUtils.java create mode 100644 common/src/main/java/com/yyy/common/utils/poi/ExcelHandlerAdapter.java create mode 100644 common/src/main/java/com/yyy/common/utils/poi/ExcelUtil.java create mode 100644 common/src/main/java/com/yyy/common/utils/poi/FormData.java create mode 100644 common/src/main/java/com/yyy/common/utils/poi/FormExportUtils.java create mode 100644 common/src/main/java/com/yyy/common/utils/poi/FormMetaData.java create mode 100644 common/src/main/java/com/yyy/common/utils/poi/PDFUtils.java create mode 100644 common/src/main/java/com/yyy/common/utils/poi/RichTextUtils.java create mode 100644 common/src/main/java/com/yyy/common/utils/reflect/ReflectUtils.java create mode 100644 common/src/main/java/com/yyy/common/utils/security/JwtUtils.java create mode 100644 common/src/main/java/com/yyy/common/utils/security/SessionHolder.java create mode 100644 common/src/main/java/com/yyy/common/utils/spring/SpringUtils.java create mode 100644 common/src/main/java/com/yyy/common/utils/sql/SqlUtil.java create mode 100644 common/src/main/java/com/yyy/common/utils/tree/TreeBuilderUtil.java create mode 100644 common/src/main/java/com/yyy/common/utils/tree/TreeNode.java create mode 100644 common/src/main/java/com/yyy/common/utils/uuid/IdUtils.java create mode 100644 common/src/main/java/com/yyy/common/utils/uuid/Seq.java create mode 100644 common/src/main/java/com/yyy/common/utils/uuid/SnowFlakeUtil.java create mode 100644 common/src/main/java/com/yyy/common/utils/uuid/UUID.java create mode 100644 flowable/pom.xml create mode 100644 flowable/src/main/java/com/yyy/flowable/common/constant/ProcessConstants.java create mode 100644 flowable/src/main/java/com/yyy/flowable/common/enums/FlowComment.java create mode 100644 flowable/src/main/java/com/yyy/flowable/config/FlowableConfig.java create mode 100644 flowable/src/main/java/com/yyy/flowable/config/MyDefaultProcessDiagramCanvas.java create mode 100644 flowable/src/main/java/com/yyy/flowable/controller/EamHomeController.java create mode 100644 flowable/src/main/java/com/yyy/flowable/controller/FlDeviceController.java create mode 100644 flowable/src/main/java/com/yyy/flowable/controller/FlFormController.java create mode 100644 flowable/src/main/java/com/yyy/flowable/controller/FlFormItemController.java create mode 100644 flowable/src/main/java/com/yyy/flowable/controller/FlowDefinitionController.java create mode 100644 flowable/src/main/java/com/yyy/flowable/controller/FlowInstanceController.java create mode 100644 flowable/src/main/java/com/yyy/flowable/controller/FlowTaskController.java create mode 100644 flowable/src/main/java/com/yyy/flowable/domain/FlowableNodeParams.java create mode 100644 flowable/src/main/java/com/yyy/flowable/domain/dto/FlowCommentDto.java create mode 100644 flowable/src/main/java/com/yyy/flowable/domain/dto/FlowFromFieldDTO.java create mode 100644 flowable/src/main/java/com/yyy/flowable/domain/dto/FlowNextDto.java create mode 100644 flowable/src/main/java/com/yyy/flowable/domain/dto/FlowSaveXmlVo.java create mode 100644 flowable/src/main/java/com/yyy/flowable/domain/dto/FlowTaskDto.java create mode 100644 flowable/src/main/java/com/yyy/flowable/domain/dto/FlowTaskMessageDto.java create mode 100644 flowable/src/main/java/com/yyy/flowable/domain/dto/FlowViewerDto.java create mode 100644 flowable/src/main/java/com/yyy/flowable/domain/vo/FlowQueryVo.java create mode 100644 flowable/src/main/java/com/yyy/flowable/domain/vo/FlowTaskVo.java create mode 100644 flowable/src/main/java/com/yyy/flowable/domain/vo/ReturnTaskNodeVo.java create mode 100644 flowable/src/main/java/com/yyy/flowable/factory/FlowServiceFactory.java create mode 100644 flowable/src/main/java/com/yyy/flowable/flow/CustomInjectUserTaskInProcessInstanceCmd.java create mode 100644 flowable/src/main/java/com/yyy/flowable/flow/CustomProcessDiagramCanvas.java create mode 100644 flowable/src/main/java/com/yyy/flowable/flow/CustomProcessDiagramGenerator.java create mode 100644 flowable/src/main/java/com/yyy/flowable/flow/FindNextNodeUtil.java create mode 100644 flowable/src/main/java/com/yyy/flowable/flow/FlowableUtils.java create mode 100644 flowable/src/main/java/com/yyy/flowable/listener/FlowExecutionListener.java create mode 100644 flowable/src/main/java/com/yyy/flowable/listener/FlowTaskListener.java create mode 100644 flowable/src/main/java/com/yyy/flowable/service/FlowGlobalProcessService.java create mode 100644 flowable/src/main/java/com/yyy/flowable/service/IFlowDefinitionService.java create mode 100644 flowable/src/main/java/com/yyy/flowable/service/IFlowInstanceService.java create mode 100644 flowable/src/main/java/com/yyy/flowable/service/IFlowTaskService.java create mode 100644 flowable/src/main/java/com/yyy/flowable/service/impl/FlowDefinitionServiceImpl.java create mode 100644 flowable/src/main/java/com/yyy/flowable/service/impl/FlowGlobalProcessServiceImpl.java create mode 100644 flowable/src/main/java/com/yyy/flowable/service/impl/FlowInstanceServiceImpl.java create mode 100644 flowable/src/main/java/com/yyy/flowable/service/impl/FlowTaskServiceImpl.java create mode 100644 flowable/src/main/java/com/yyy/flowable/task/SysTask.java create mode 100644 framework/pom.xml create mode 100644 framework/src/main/java/com/yyy/framework/aspect/GlobalExceptionHandler.java create mode 100644 framework/src/main/java/com/yyy/framework/aspect/GlobalRequestAspect.java create mode 100644 framework/src/main/java/com/yyy/framework/aspect/GlobalResponseAspect.java create mode 100644 framework/src/main/java/com/yyy/framework/aspect/SqlHandler.java create mode 100644 framework/src/main/java/com/yyy/framework/config/MyBatisPlusConfig.java create mode 100644 framework/src/main/java/com/yyy/framework/shiro/service/SysPasswordService.java create mode 100644 kernel/pom.xml create mode 100644 kernel/src/main/java/com/yyy/kernel/device/AbstractDevice.java create mode 100644 kernel/src/main/java/com/yyy/kernel/device/IDevice.java create mode 100644 kernel/src/main/java/com/yyy/kernel/device/model/MockDevice.java create mode 100644 kernel/src/main/java/com/yyy/kernel/enums/DeviceStatus.java create mode 100644 kernel/src/main/java/com/yyy/kernel/enums/DeviceType.java create mode 100644 kernel/src/main/java/com/yyy/kernel/service/DeviceService.java create mode 100644 modules/pom.xml create mode 100644 modules/src/main/java/com/yyy/minio/config/MinioConfig.java create mode 100644 pom.xml create mode 100644 quartz/pom.xml create mode 100644 quartz/src/main/java/com/yyy/quartz/config/ScheduleConfig.java create mode 100644 quartz/src/main/java/com/yyy/quartz/controller/SysJobController.java create mode 100644 quartz/src/main/java/com/yyy/quartz/controller/SysJobLogController.java create mode 100644 quartz/src/main/java/com/yyy/quartz/domain/JobMessage.java create mode 100644 quartz/src/main/java/com/yyy/quartz/domain/SysJob.java create mode 100644 quartz/src/main/java/com/yyy/quartz/domain/SysJobLog.java create mode 100644 quartz/src/main/java/com/yyy/quartz/mapper/SysJobLogMapper.java create mode 100644 quartz/src/main/java/com/yyy/quartz/mapper/SysJobMapper.java create mode 100644 quartz/src/main/java/com/yyy/quartz/service/ISysJobLogService.java create mode 100644 quartz/src/main/java/com/yyy/quartz/service/ISysJobService.java create mode 100644 quartz/src/main/java/com/yyy/quartz/service/impl/SysJobLogServiceImpl.java create mode 100644 quartz/src/main/java/com/yyy/quartz/service/impl/SysJobServiceImpl.java create mode 100644 quartz/src/main/java/com/yyy/quartz/task/RyTask.java create mode 100644 quartz/src/main/java/com/yyy/quartz/util/AbstractQuartzJob.java create mode 100644 quartz/src/main/java/com/yyy/quartz/util/CronUtils.java create mode 100644 quartz/src/main/java/com/yyy/quartz/util/JobInvokeUtil.java create mode 100644 quartz/src/main/java/com/yyy/quartz/util/QuartzDisallowConcurrentExecution.java create mode 100644 quartz/src/main/java/com/yyy/quartz/util/QuartzJobExecution.java create mode 100644 quartz/src/main/java/com/yyy/quartz/util/ScheduleUtils.java create mode 100644 quartz/src/main/resources/mapper/quartz/SysJobLogMapper.xml create mode 100644 quartz/src/main/resources/mapper/quartz/SysJobMapper.xml create mode 100644 sql/eam2.sql create mode 100644 sql/quartz.sql create mode 100644 system/pom.xml create mode 100644 system/src/main/java/com/yyy/system/controller/EamAssetController.java create mode 100644 system/src/main/java/com/yyy/system/controller/EamAssetLogController.java create mode 100644 system/src/main/java/com/yyy/system/controller/EamBasicCategoryController.java create mode 100644 system/src/main/java/com/yyy/system/controller/EamBasicFinancialCategoryController.java create mode 100644 system/src/main/java/com/yyy/system/controller/EamBasicMaintenanceVendorController.java create mode 100644 system/src/main/java/com/yyy/system/controller/EamBasicManufacturersVendorController.java create mode 100644 system/src/main/java/com/yyy/system/controller/EamBasicPositionController.java create mode 100644 system/src/main/java/com/yyy/system/controller/EamBasicSupplierVendorController.java create mode 100644 system/src/main/java/com/yyy/system/controller/EamBasicTeamController.java create mode 100644 system/src/main/java/com/yyy/system/controller/EamBasicWarehouseController.java create mode 100644 system/src/main/java/com/yyy/system/controller/EamBusinessAllocateController.java create mode 100644 system/src/main/java/com/yyy/system/controller/EamBusinessBorrowController.java create mode 100644 system/src/main/java/com/yyy/system/controller/EamBusinessCollectionController.java create mode 100644 system/src/main/java/com/yyy/system/controller/EamBusinessController.java create mode 100644 system/src/main/java/com/yyy/system/controller/EamBusinessOutboundController.java create mode 100644 system/src/main/java/com/yyy/system/controller/EamBusinessRetirementController.java create mode 100644 system/src/main/java/com/yyy/system/controller/EamBusinessReturnController.java create mode 100644 system/src/main/java/com/yyy/system/controller/EamBusinessReturnInventoryController.java create mode 100644 system/src/main/java/com/yyy/system/controller/EamBusinessStorageController.java create mode 100644 system/src/main/java/com/yyy/system/controller/EamBusinessTransferController.java create mode 100644 system/src/main/java/com/yyy/system/controller/EamDeviceController.java create mode 100644 system/src/main/java/com/yyy/system/controller/EamPlanController.java create mode 100644 system/src/main/java/com/yyy/system/controller/EamRepairController.java create mode 100644 system/src/main/java/com/yyy/system/controller/EamRepairFaultController.java create mode 100644 system/src/main/java/com/yyy/system/controller/EamRepairTypeController.java create mode 100644 system/src/main/java/com/yyy/system/controller/EamStocktakingDetailsController.java create mode 100644 system/src/main/java/com/yyy/system/controller/EamStocktakingJobController.java create mode 100644 system/src/main/java/com/yyy/system/controller/EamStocktakingPlanController.java create mode 100644 system/src/main/java/com/yyy/system/controller/QrCodeController.java create mode 100644 system/src/main/java/com/yyy/system/controller/SysAlarmController.java create mode 100644 system/src/main/java/com/yyy/system/controller/SysConfigController.java create mode 100644 system/src/main/java/com/yyy/system/controller/SysDictDataController.java create mode 100644 system/src/main/java/com/yyy/system/controller/SysDictTypeController.java create mode 100644 system/src/main/java/com/yyy/system/controller/SysFormLogController.java create mode 100644 system/src/main/java/com/yyy/system/controller/SysFormTempController.java create mode 100644 system/src/main/java/com/yyy/system/controller/SysLogController.java create mode 100644 system/src/main/java/com/yyy/system/controller/TestController.java create mode 100644 system/src/main/java/com/yyy/system/entity/bo/JobDefect.java create mode 100644 system/src/main/java/com/yyy/system/entity/bo/SpareParts.java create mode 100644 system/src/main/java/com/yyy/system/entity/dto/DeviceJobDto.java create mode 100644 system/src/main/java/com/yyy/system/entity/dto/DeviceJobQueryDto.java create mode 100644 system/src/main/java/com/yyy/system/entity/dto/DeviceJobRepairDto.java create mode 100644 system/src/main/java/com/yyy/system/entity/dto/DevicePlanAddDto.java create mode 100644 system/src/main/java/com/yyy/system/entity/dto/DevicePlanQueryDto.java create mode 100644 system/src/main/java/com/yyy/system/entity/dto/EamAssetDto.java create mode 100644 system/src/main/java/com/yyy/system/entity/dto/EamAssetLogDto.java create mode 100644 system/src/main/java/com/yyy/system/entity/dto/EamAssetQueryDto.java create mode 100644 system/src/main/java/com/yyy/system/entity/dto/EamBasicCategoryDto.java create mode 100644 system/src/main/java/com/yyy/system/entity/dto/EamBasicFinancialCategoryDto.java create mode 100644 system/src/main/java/com/yyy/system/entity/dto/EamBasicMaintenanceVendorDto.java create mode 100644 system/src/main/java/com/yyy/system/entity/dto/EamBasicManufacturersVendorDto.java create mode 100644 system/src/main/java/com/yyy/system/entity/dto/EamBasicPositionDto.java create mode 100644 system/src/main/java/com/yyy/system/entity/dto/EamBasicSupplierVendorDto.java create mode 100644 system/src/main/java/com/yyy/system/entity/dto/EamBasicTeamDto.java create mode 100644 system/src/main/java/com/yyy/system/entity/dto/EamBasicWarehouseDto.java create mode 100644 system/src/main/java/com/yyy/system/entity/dto/EamBusinessAllocateDto.java create mode 100644 system/src/main/java/com/yyy/system/entity/dto/EamBusinessBorrowDto.java create mode 100644 system/src/main/java/com/yyy/system/entity/dto/EamBusinessCollectionDto.java create mode 100644 system/src/main/java/com/yyy/system/entity/dto/EamBusinessDto.java create mode 100644 system/src/main/java/com/yyy/system/entity/dto/EamBusinessOutboundDto.java create mode 100644 system/src/main/java/com/yyy/system/entity/dto/EamBusinessRegistrationDto.java create mode 100644 system/src/main/java/com/yyy/system/entity/dto/EamBusinessRetirementDto.java create mode 100644 system/src/main/java/com/yyy/system/entity/dto/EamBusinessReturnDto.java create mode 100644 system/src/main/java/com/yyy/system/entity/dto/EamBusinessReturnInventoryDto.java create mode 100644 system/src/main/java/com/yyy/system/entity/dto/EamBusinessStorageDto.java create mode 100644 system/src/main/java/com/yyy/system/entity/dto/EamBusinessTransferDto.java create mode 100644 system/src/main/java/com/yyy/system/entity/dto/EamRepairDto.java create mode 100644 system/src/main/java/com/yyy/system/entity/dto/EamRepairFaultDto.java create mode 100644 system/src/main/java/com/yyy/system/entity/dto/EamRepairTypeDto.java create mode 100644 system/src/main/java/com/yyy/system/entity/dto/EamSparePartsDto.java create mode 100644 system/src/main/java/com/yyy/system/entity/dto/EamStocktakingDetailsDto.java create mode 100644 system/src/main/java/com/yyy/system/entity/dto/EamStocktakingJobDto.java create mode 100644 system/src/main/java/com/yyy/system/entity/dto/EamStocktakingPlanDto.java create mode 100644 system/src/main/java/com/yyy/system/entity/dto/EamWarehouseAssetDto.java create mode 100644 system/src/main/java/com/yyy/system/entity/dto/EamWarehouseInventoryDto.java create mode 100644 system/src/main/java/com/yyy/system/entity/dto/FlFormDto.java create mode 100644 system/src/main/java/com/yyy/system/entity/dto/FlFormItemCalendarDto.java create mode 100644 system/src/main/java/com/yyy/system/entity/dto/FlFormItemDto.java create mode 100644 system/src/main/java/com/yyy/system/entity/dto/FlListenerDto.java create mode 100644 system/src/main/java/com/yyy/system/entity/dto/FlowProcDefDto.java create mode 100644 system/src/main/java/com/yyy/system/entity/dto/SysConfigDto.java create mode 100644 system/src/main/java/com/yyy/system/entity/dto/SysDictDataDto.java create mode 100644 system/src/main/java/com/yyy/system/entity/dto/SysDictTypeDto.java create mode 100644 system/src/main/java/com/yyy/system/entity/dto/SysFormLogAddDto.java create mode 100644 system/src/main/java/com/yyy/system/entity/dto/SysFormLogQuarryDto.java create mode 100644 system/src/main/java/com/yyy/system/entity/dto/SysFormTempDto.java create mode 100644 system/src/main/java/com/yyy/system/entity/dto/SysLogDto.java create mode 100644 system/src/main/java/com/yyy/system/entity/dto/WordExportDto.java create mode 100644 system/src/main/java/com/yyy/system/entity/dto/WorkReportGenerateDto.java create mode 100644 system/src/main/java/com/yyy/system/entity/dto/WorkReportItemDto.java create mode 100644 system/src/main/java/com/yyy/system/entity/dto/WorkReportQueryDto.java create mode 100644 system/src/main/java/com/yyy/system/entity/excel/EamAssetExcel.java create mode 100644 system/src/main/java/com/yyy/system/entity/excel/EamAssetExportExcel.java create mode 100644 system/src/main/java/com/yyy/system/entity/excel/SysFormTempExcel.java create mode 100644 system/src/main/java/com/yyy/system/entity/pojo/EamAsset.java create mode 100644 system/src/main/java/com/yyy/system/entity/pojo/EamAssetLog.java create mode 100644 system/src/main/java/com/yyy/system/entity/pojo/EamBasicCategory.java create mode 100644 system/src/main/java/com/yyy/system/entity/pojo/EamBasicFinancialCategory.java create mode 100644 system/src/main/java/com/yyy/system/entity/pojo/EamBasicMaintenanceVendor.java create mode 100644 system/src/main/java/com/yyy/system/entity/pojo/EamBasicManufacturersVendor.java create mode 100644 system/src/main/java/com/yyy/system/entity/pojo/EamBasicPosition.java create mode 100644 system/src/main/java/com/yyy/system/entity/pojo/EamBasicSupplierVendor.java create mode 100644 system/src/main/java/com/yyy/system/entity/pojo/EamBasicTeam.java create mode 100644 system/src/main/java/com/yyy/system/entity/pojo/EamBasicWarehouse.java create mode 100644 system/src/main/java/com/yyy/system/entity/pojo/EamBusinessAllocate.java create mode 100644 system/src/main/java/com/yyy/system/entity/pojo/EamBusinessBorrow.java create mode 100644 system/src/main/java/com/yyy/system/entity/pojo/EamBusinessCollection.java create mode 100644 system/src/main/java/com/yyy/system/entity/pojo/EamBusinessOutbound.java create mode 100644 system/src/main/java/com/yyy/system/entity/pojo/EamBusinessRegistration.java create mode 100644 system/src/main/java/com/yyy/system/entity/pojo/EamBusinessRetirement.java create mode 100644 system/src/main/java/com/yyy/system/entity/pojo/EamBusinessReturn.java create mode 100644 system/src/main/java/com/yyy/system/entity/pojo/EamBusinessReturnInventory.java create mode 100644 system/src/main/java/com/yyy/system/entity/pojo/EamBusinessStorage.java create mode 100644 system/src/main/java/com/yyy/system/entity/pojo/EamBusinessTransfer.java create mode 100644 system/src/main/java/com/yyy/system/entity/pojo/EamRepair.java create mode 100644 system/src/main/java/com/yyy/system/entity/pojo/EamRepairFault.java create mode 100644 system/src/main/java/com/yyy/system/entity/pojo/EamRepairType.java create mode 100644 system/src/main/java/com/yyy/system/entity/pojo/EamStocktakingDetails.java create mode 100644 system/src/main/java/com/yyy/system/entity/pojo/EamStocktakingJob.java create mode 100644 system/src/main/java/com/yyy/system/entity/pojo/EamStocktakingPlan.java create mode 100644 system/src/main/java/com/yyy/system/entity/pojo/EamWarehouseAsset.java create mode 100644 system/src/main/java/com/yyy/system/entity/pojo/EamWarehouseInventory.java create mode 100644 system/src/main/java/com/yyy/system/entity/pojo/FlForm.java create mode 100644 system/src/main/java/com/yyy/system/entity/pojo/FlFormItem.java create mode 100644 system/src/main/java/com/yyy/system/entity/pojo/FlListener.java create mode 100644 system/src/main/java/com/yyy/system/entity/pojo/SysConfig.java create mode 100644 system/src/main/java/com/yyy/system/entity/pojo/SysDictData.java create mode 100644 system/src/main/java/com/yyy/system/entity/pojo/SysDictType.java create mode 100644 system/src/main/java/com/yyy/system/entity/pojo/SysFormLog.java create mode 100644 system/src/main/java/com/yyy/system/entity/pojo/SysFormTemp.java create mode 100644 system/src/main/java/com/yyy/system/entity/pojo/SysLog.java create mode 100644 system/src/main/java/com/yyy/system/entity/vo/AlarmVo.java create mode 100644 system/src/main/java/com/yyy/system/entity/vo/DeviceJobVo.java create mode 100644 system/src/main/java/com/yyy/system/entity/vo/DeviceVo.java create mode 100644 system/src/main/java/com/yyy/system/entity/vo/EamAssetLogVo.java create mode 100644 system/src/main/java/com/yyy/system/entity/vo/EamAssetVo.java create mode 100644 system/src/main/java/com/yyy/system/entity/vo/EamBasicCategoryVo.java create mode 100644 system/src/main/java/com/yyy/system/entity/vo/EamBasicFinancialCategoryVo.java create mode 100644 system/src/main/java/com/yyy/system/entity/vo/EamBasicMaintenanceVendorVo.java create mode 100644 system/src/main/java/com/yyy/system/entity/vo/EamBasicManufacturersVendorVo.java create mode 100644 system/src/main/java/com/yyy/system/entity/vo/EamBasicPositionVo.java create mode 100644 system/src/main/java/com/yyy/system/entity/vo/EamBasicSupplierVendorVo.java create mode 100644 system/src/main/java/com/yyy/system/entity/vo/EamBasicTeamVo.java create mode 100644 system/src/main/java/com/yyy/system/entity/vo/EamBasicWarehouseVo.java create mode 100644 system/src/main/java/com/yyy/system/entity/vo/EamBigScreenVo.java create mode 100644 system/src/main/java/com/yyy/system/entity/vo/EamBusinessAllocateVo.java create mode 100644 system/src/main/java/com/yyy/system/entity/vo/EamBusinessBorrowVo.java create mode 100644 system/src/main/java/com/yyy/system/entity/vo/EamBusinessCollectionVo.java create mode 100644 system/src/main/java/com/yyy/system/entity/vo/EamBusinessOutboundVo.java create mode 100644 system/src/main/java/com/yyy/system/entity/vo/EamBusinessRegistrationVo.java create mode 100644 system/src/main/java/com/yyy/system/entity/vo/EamBusinessRetirementVo.java create mode 100644 system/src/main/java/com/yyy/system/entity/vo/EamBusinessReturnInventoryVo.java create mode 100644 system/src/main/java/com/yyy/system/entity/vo/EamBusinessReturnVo.java create mode 100644 system/src/main/java/com/yyy/system/entity/vo/EamBusinessStorageVo.java create mode 100644 system/src/main/java/com/yyy/system/entity/vo/EamBusinessTransferVo.java create mode 100644 system/src/main/java/com/yyy/system/entity/vo/EamBusinessVo.java create mode 100644 system/src/main/java/com/yyy/system/entity/vo/EamChartVo.java create mode 100644 system/src/main/java/com/yyy/system/entity/vo/EamDeviceLogVo.java create mode 100644 system/src/main/java/com/yyy/system/entity/vo/EamHomeVo.java create mode 100644 system/src/main/java/com/yyy/system/entity/vo/EamRepairFaultVo.java create mode 100644 system/src/main/java/com/yyy/system/entity/vo/EamRepairTypeVo.java create mode 100644 system/src/main/java/com/yyy/system/entity/vo/EamRepairVo.java create mode 100644 system/src/main/java/com/yyy/system/entity/vo/EamStatisticsVo.java create mode 100644 system/src/main/java/com/yyy/system/entity/vo/EamStocktakingDetailsVo.java create mode 100644 system/src/main/java/com/yyy/system/entity/vo/EamStocktakingJobVo.java create mode 100644 system/src/main/java/com/yyy/system/entity/vo/EamStocktakingPlanVo.java create mode 100644 system/src/main/java/com/yyy/system/entity/vo/EamTotalVo.java create mode 100644 system/src/main/java/com/yyy/system/entity/vo/EamWarehouseAssetVo.java create mode 100644 system/src/main/java/com/yyy/system/entity/vo/EamWarehouseInventoryVo.java create mode 100644 system/src/main/java/com/yyy/system/entity/vo/EamWarningBorrowVo.java create mode 100644 system/src/main/java/com/yyy/system/entity/vo/FlFormItemCalendarVo.java create mode 100644 system/src/main/java/com/yyy/system/entity/vo/FlFormItemVo.java create mode 100644 system/src/main/java/com/yyy/system/entity/vo/FlFormVo.java create mode 100644 system/src/main/java/com/yyy/system/entity/vo/FlListenerVo.java create mode 100644 system/src/main/java/com/yyy/system/entity/vo/FlowNode.java create mode 100644 system/src/main/java/com/yyy/system/entity/vo/OperationalStatisticsVo.java create mode 100644 system/src/main/java/com/yyy/system/entity/vo/ProcessHomePageVo.java create mode 100644 system/src/main/java/com/yyy/system/entity/vo/SysConfigVo.java create mode 100644 system/src/main/java/com/yyy/system/entity/vo/SysDictDataVo.java create mode 100644 system/src/main/java/com/yyy/system/entity/vo/SysDictTypeVo.java create mode 100644 system/src/main/java/com/yyy/system/entity/vo/SysFormLogVo.java create mode 100644 system/src/main/java/com/yyy/system/entity/vo/SysFormTempVo.java create mode 100644 system/src/main/java/com/yyy/system/entity/vo/SysLogVo.java create mode 100644 system/src/main/java/com/yyy/system/entity/vo/WorkReportData.java create mode 100644 system/src/main/java/com/yyy/system/entity/vo/WorkReportItem.java create mode 100644 system/src/main/java/com/yyy/system/entity/vo/WorkReportVo.java create mode 100644 system/src/main/java/com/yyy/system/entity/word/enums/SanitaryConditionEnum.java create mode 100644 system/src/main/java/com/yyy/system/entity/word/form/RepairForm.java create mode 100644 system/src/main/java/com/yyy/system/entity/word/form/ReplacementParts.java create mode 100644 system/src/main/java/com/yyy/system/mapper/EamAssetLogMapper.java create mode 100644 system/src/main/java/com/yyy/system/mapper/EamAssetMapper.java create mode 100644 system/src/main/java/com/yyy/system/mapper/EamBasicCategoryMapper.java create mode 100644 system/src/main/java/com/yyy/system/mapper/EamBasicFinancialCategoryMapper.java create mode 100644 system/src/main/java/com/yyy/system/mapper/EamBasicMaintenanceVendorMapper.java create mode 100644 system/src/main/java/com/yyy/system/mapper/EamBasicManufacturersVendorMapper.java create mode 100644 system/src/main/java/com/yyy/system/mapper/EamBasicPositionMapper.java create mode 100644 system/src/main/java/com/yyy/system/mapper/EamBasicSupplierVendorMapper.java create mode 100644 system/src/main/java/com/yyy/system/mapper/EamBasicTeamMapper.java create mode 100644 system/src/main/java/com/yyy/system/mapper/EamBasicWarehouseMapper.java create mode 100644 system/src/main/java/com/yyy/system/mapper/EamBusinessAllocateMapper.java create mode 100644 system/src/main/java/com/yyy/system/mapper/EamBusinessBorrowMapper.java create mode 100644 system/src/main/java/com/yyy/system/mapper/EamBusinessCollectionMapper.java create mode 100644 system/src/main/java/com/yyy/system/mapper/EamBusinessOutboundMapper.java create mode 100644 system/src/main/java/com/yyy/system/mapper/EamBusinessRegistrationMapper.java create mode 100644 system/src/main/java/com/yyy/system/mapper/EamBusinessRetirementMapper.java create mode 100644 system/src/main/java/com/yyy/system/mapper/EamBusinessReturnInventoryMapper.java create mode 100644 system/src/main/java/com/yyy/system/mapper/EamBusinessReturnMapper.java create mode 100644 system/src/main/java/com/yyy/system/mapper/EamBusinessStorageMapper.java create mode 100644 system/src/main/java/com/yyy/system/mapper/EamBusinessTransferMapper.java create mode 100644 system/src/main/java/com/yyy/system/mapper/EamRepairFaultMapper.java create mode 100644 system/src/main/java/com/yyy/system/mapper/EamRepairMapper.java create mode 100644 system/src/main/java/com/yyy/system/mapper/EamRepairTypeMapper.java create mode 100644 system/src/main/java/com/yyy/system/mapper/EamStocktakingDetailsMapper.java create mode 100644 system/src/main/java/com/yyy/system/mapper/EamStocktakingJobMapper.java create mode 100644 system/src/main/java/com/yyy/system/mapper/EamStocktakingPlanMapper.java create mode 100644 system/src/main/java/com/yyy/system/mapper/EamWarehouseAssetMapper.java create mode 100644 system/src/main/java/com/yyy/system/mapper/EamWarehouseInventoryMapper.java create mode 100644 system/src/main/java/com/yyy/system/mapper/FlFormItemMapper.java create mode 100644 system/src/main/java/com/yyy/system/mapper/FlFormMapper.java create mode 100644 system/src/main/java/com/yyy/system/mapper/FlListenerMapper.java create mode 100644 system/src/main/java/com/yyy/system/mapper/FlowDeployMapper.java create mode 100644 system/src/main/java/com/yyy/system/mapper/SysConfigMapper.java create mode 100644 system/src/main/java/com/yyy/system/mapper/SysDictDataMapper.java create mode 100644 system/src/main/java/com/yyy/system/mapper/SysDictTypeMapper.java create mode 100644 system/src/main/java/com/yyy/system/mapper/SysFormLogMapper.java create mode 100644 system/src/main/java/com/yyy/system/mapper/SysFormTempMapper.java create mode 100644 system/src/main/java/com/yyy/system/mapper/SysLogMapper.java create mode 100644 system/src/main/java/com/yyy/system/mapper/UmsMenuMapper.java create mode 100644 system/src/main/java/com/yyy/system/mapper/UmsOrganizationMapper.java create mode 100644 system/src/main/java/com/yyy/system/mapper/UmsRoleMapper.java create mode 100644 system/src/main/java/com/yyy/system/mapper/UmsRoleMenuMapper.java create mode 100644 system/src/main/java/com/yyy/system/mapper/UmsUserMapper.java create mode 100644 system/src/main/java/com/yyy/system/mapper/UmsUserOrganizationMapper.java create mode 100644 system/src/main/java/com/yyy/system/mapper/UmsUserRoleMapper.java create mode 100644 system/src/main/java/com/yyy/system/service/DevicePlanService.java create mode 100644 system/src/main/java/com/yyy/system/service/EamAssetLogService.java create mode 100644 system/src/main/java/com/yyy/system/service/EamAssetService.java create mode 100644 system/src/main/java/com/yyy/system/service/EamBasicCategoryService.java create mode 100644 system/src/main/java/com/yyy/system/service/EamBasicFinancialCategoryService.java create mode 100644 system/src/main/java/com/yyy/system/service/EamBasicMaintenanceVendorService.java create mode 100644 system/src/main/java/com/yyy/system/service/EamBasicManufacturersVendorService.java create mode 100644 system/src/main/java/com/yyy/system/service/EamBasicPositionService.java create mode 100644 system/src/main/java/com/yyy/system/service/EamBasicSupplierVendorService.java create mode 100644 system/src/main/java/com/yyy/system/service/EamBasicTeamService.java create mode 100644 system/src/main/java/com/yyy/system/service/EamBasicWarehouseService.java create mode 100644 system/src/main/java/com/yyy/system/service/EamBusinessAllocateService.java create mode 100644 system/src/main/java/com/yyy/system/service/EamBusinessBorrowService.java create mode 100644 system/src/main/java/com/yyy/system/service/EamBusinessCollectionService.java create mode 100644 system/src/main/java/com/yyy/system/service/EamBusinessOutboundService.java create mode 100644 system/src/main/java/com/yyy/system/service/EamBusinessRegistrationService.java create mode 100644 system/src/main/java/com/yyy/system/service/EamBusinessRetirementService.java create mode 100644 system/src/main/java/com/yyy/system/service/EamBusinessReturnInventoryService.java create mode 100644 system/src/main/java/com/yyy/system/service/EamBusinessReturnService.java create mode 100644 system/src/main/java/com/yyy/system/service/EamBusinessService.java create mode 100644 system/src/main/java/com/yyy/system/service/EamBusinessStorageService.java create mode 100644 system/src/main/java/com/yyy/system/service/EamBusinessTransferService.java create mode 100644 system/src/main/java/com/yyy/system/service/EamRepairFaultService.java create mode 100644 system/src/main/java/com/yyy/system/service/EamRepairService.java create mode 100644 system/src/main/java/com/yyy/system/service/EamRepairTypeService.java create mode 100644 system/src/main/java/com/yyy/system/service/EamStocktakingDetailsService.java create mode 100644 system/src/main/java/com/yyy/system/service/EamStocktakingJobService.java create mode 100644 system/src/main/java/com/yyy/system/service/EamStocktakingPlanService.java create mode 100644 system/src/main/java/com/yyy/system/service/EamWarehouseAssetService.java create mode 100644 system/src/main/java/com/yyy/system/service/FlFormItemService.java create mode 100644 system/src/main/java/com/yyy/system/service/FlFormService.java create mode 100644 system/src/main/java/com/yyy/system/service/FlListenerService.java create mode 100644 system/src/main/java/com/yyy/system/service/SysConfigService.java create mode 100644 system/src/main/java/com/yyy/system/service/SysDictDataService.java create mode 100644 system/src/main/java/com/yyy/system/service/SysDictTypeService.java create mode 100644 system/src/main/java/com/yyy/system/service/SysFormLogService.java create mode 100644 system/src/main/java/com/yyy/system/service/SysFormTempService.java create mode 100644 system/src/main/java/com/yyy/system/service/SysLogService.java create mode 100644 system/src/main/java/com/yyy/system/service/UmsMenuService.java create mode 100644 system/src/main/java/com/yyy/system/service/UmsOrganizationService.java create mode 100644 system/src/main/java/com/yyy/system/service/UmsRoleMenuService.java create mode 100644 system/src/main/java/com/yyy/system/service/UmsRoleService.java create mode 100644 system/src/main/java/com/yyy/system/service/UmsUserService.java create mode 100644 system/src/main/java/com/yyy/system/service/WordExportService.java create mode 100644 system/src/main/java/com/yyy/system/service/impl/DevicePlanServiceImpl.java create mode 100644 system/src/main/java/com/yyy/system/service/impl/EamAssetLogServiceImpl.java create mode 100644 system/src/main/java/com/yyy/system/service/impl/EamAssetServiceImpl.java create mode 100644 system/src/main/java/com/yyy/system/service/impl/EamBasicCategoryServiceImpl.java create mode 100644 system/src/main/java/com/yyy/system/service/impl/EamBasicFinancialCategoryServiceImpl.java create mode 100644 system/src/main/java/com/yyy/system/service/impl/EamBasicMaintenanceVendorServiceImpl.java create mode 100644 system/src/main/java/com/yyy/system/service/impl/EamBasicManufacturersVendorServiceImpl.java create mode 100644 system/src/main/java/com/yyy/system/service/impl/EamBasicPositionServiceImpl.java create mode 100644 system/src/main/java/com/yyy/system/service/impl/EamBasicSupplierVendorServiceImpl.java create mode 100644 system/src/main/java/com/yyy/system/service/impl/EamBasicTeamServiceImpl.java create mode 100644 system/src/main/java/com/yyy/system/service/impl/EamBasicWarehouseServiceImpl.java create mode 100644 system/src/main/java/com/yyy/system/service/impl/EamBusinessAllocateServiceImpl.java create mode 100644 system/src/main/java/com/yyy/system/service/impl/EamBusinessBorrowServiceImpl.java create mode 100644 system/src/main/java/com/yyy/system/service/impl/EamBusinessCollectionServiceImpl.java create mode 100644 system/src/main/java/com/yyy/system/service/impl/EamBusinessOutboundServiceImpl.java create mode 100644 system/src/main/java/com/yyy/system/service/impl/EamBusinessRegistrationServiceImpl.java create mode 100644 system/src/main/java/com/yyy/system/service/impl/EamBusinessRetirementServiceImpl.java create mode 100644 system/src/main/java/com/yyy/system/service/impl/EamBusinessReturnInventoryServiceImpl.java create mode 100644 system/src/main/java/com/yyy/system/service/impl/EamBusinessReturnServiceImpl.java create mode 100644 system/src/main/java/com/yyy/system/service/impl/EamBusinessServiceImpl.java create mode 100644 system/src/main/java/com/yyy/system/service/impl/EamBusinessStorageServiceImpl.java create mode 100644 system/src/main/java/com/yyy/system/service/impl/EamBusinessTransferServiceImpl.java create mode 100644 system/src/main/java/com/yyy/system/service/impl/EamRepairFaultServiceImpl.java create mode 100644 system/src/main/java/com/yyy/system/service/impl/EamRepairServiceImpl.java create mode 100644 system/src/main/java/com/yyy/system/service/impl/EamRepairTypeServiceImpl.java create mode 100644 system/src/main/java/com/yyy/system/service/impl/EamStocktakingDetailsServiceImpl.java create mode 100644 system/src/main/java/com/yyy/system/service/impl/EamStocktakingJobServiceImpl.java create mode 100644 system/src/main/java/com/yyy/system/service/impl/EamStocktakingPlanServiceImpl.java create mode 100644 system/src/main/java/com/yyy/system/service/impl/EamWarehouseAssetServiceImpl.java create mode 100644 system/src/main/java/com/yyy/system/service/impl/FlFormItemServiceImpl.java create mode 100644 system/src/main/java/com/yyy/system/service/impl/FlFormServiceImpl.java create mode 100644 system/src/main/java/com/yyy/system/service/impl/FlListenerServiceImpl.java create mode 100644 system/src/main/java/com/yyy/system/service/impl/SysConfigServiceImpl.java create mode 100644 system/src/main/java/com/yyy/system/service/impl/SysDictDataServiceImpl.java create mode 100644 system/src/main/java/com/yyy/system/service/impl/SysDictTypeServiceImpl.java create mode 100644 system/src/main/java/com/yyy/system/service/impl/SysFormLogServiceImpl.java create mode 100644 system/src/main/java/com/yyy/system/service/impl/SysFormTempServiceImpl.java create mode 100644 system/src/main/java/com/yyy/system/service/impl/SysLogServiceImpl.java create mode 100644 system/src/main/java/com/yyy/system/service/impl/UmsMenuServiceImpl.java create mode 100644 system/src/main/java/com/yyy/system/service/impl/UmsOrganizationServiceImpl.java create mode 100644 system/src/main/java/com/yyy/system/service/impl/UmsRoleMenuServiceImpl.java create mode 100644 system/src/main/java/com/yyy/system/service/impl/UmsRoleServiceImpl.java create mode 100644 system/src/main/java/com/yyy/system/service/impl/UmsUserServiceImpl.java create mode 100644 system/src/main/java/com/yyy/system/service/impl/WordExportServiceImpl.java create mode 100644 system/src/main/resources/mapper/EamAssetLogMapper.xml create mode 100644 system/src/main/resources/mapper/EamAssetMapper.xml create mode 100644 system/src/main/resources/mapper/EamBasicCategoryMapper.xml create mode 100644 system/src/main/resources/mapper/EamBasicFinancialCategoryMapper.xml create mode 100644 system/src/main/resources/mapper/EamBasicMaintenanceVendorMapper.xml create mode 100644 system/src/main/resources/mapper/EamBasicManufacturersVendorMapper.xml create mode 100644 system/src/main/resources/mapper/EamBasicPositionMapper.xml create mode 100644 system/src/main/resources/mapper/EamBasicSupplierVendorMapper.xml create mode 100644 system/src/main/resources/mapper/EamBasicTeamMapper.xml create mode 100644 system/src/main/resources/mapper/EamBasicWarehouseMapper.xml create mode 100644 system/src/main/resources/mapper/EamBusinessAllocateMapper.xml create mode 100644 system/src/main/resources/mapper/EamBusinessBorrowMapper.xml create mode 100644 system/src/main/resources/mapper/EamBusinessCollectionMapper.xml create mode 100644 system/src/main/resources/mapper/EamBusinessOutboundMapper.xml create mode 100644 system/src/main/resources/mapper/EamBusinessRegistrationMapper.xml create mode 100644 system/src/main/resources/mapper/EamBusinessRetirementMapper.xml create mode 100644 system/src/main/resources/mapper/EamBusinessReturnInventoryMapper.xml create mode 100644 system/src/main/resources/mapper/EamBusinessReturnMapper.xml create mode 100644 system/src/main/resources/mapper/EamBusinessStorageMapper.xml create mode 100644 system/src/main/resources/mapper/EamBusinessTransferMapper.xml create mode 100644 system/src/main/resources/mapper/EamRepairFaultMapper.xml create mode 100644 system/src/main/resources/mapper/EamRepairMapper.xml create mode 100644 system/src/main/resources/mapper/EamRepairTypeMapper.xml create mode 100644 system/src/main/resources/mapper/EamStocktakingDetailsMapper.xml create mode 100644 system/src/main/resources/mapper/EamStocktakingJobMapper.xml create mode 100644 system/src/main/resources/mapper/EamStocktakingPlanMapper.xml create mode 100644 system/src/main/resources/mapper/EamWarehouseAssetMapper.xml create mode 100644 system/src/main/resources/mapper/EamWarehouseInventoryMapper.xml create mode 100644 system/src/main/resources/mapper/FlFormItemMapper.xml create mode 100644 system/src/main/resources/mapper/FlFormMapper.xml create mode 100644 system/src/main/resources/mapper/FlListenerMapper.xml create mode 100644 system/src/main/resources/mapper/SysConfigMapper.xml create mode 100644 system/src/main/resources/mapper/SysDictDataMapper.xml create mode 100644 system/src/main/resources/mapper/SysDictTypeMapper.xml create mode 100644 system/src/main/resources/mapper/SysFormLogMapper.xml create mode 100644 system/src/main/resources/mapper/SysFormTempMapper.xml create mode 100644 system/src/main/resources/mapper/SysLogMapper.xml create mode 100644 system/src/main/resources/mapper/UmsMenuMapper.xml create mode 100644 system/src/main/resources/mapper/UmsOrganizationMapper.xml create mode 100644 system/src/main/resources/mapper/UmsRoleMapper.xml create mode 100644 system/src/main/resources/mapper/UmsRoleMenuMapper.xml create mode 100644 system/src/main/resources/mapper/UmsUserMapper.xml create mode 100644 system/src/main/resources/mapper/UmsUserOrganizationMapper.xml create mode 100644 system/src/main/resources/mapper/UmsUserRoleMapper.xml create mode 100644 system/src/main/resources/mapper/flowable/FlowDeployMapper.xml create mode 100644 system/src/main/resources/test.bpmn20.xml create mode 100644 system/src/main/resources/员工资产交接.bpmn20.xml create mode 100644 system/src/main/resources/员工资产报修.bpmn20.xml create mode 100644 system/src/main/resources/员工资产报失.bpmn20.xml create mode 100644 system/src/main/resources/员工资产申请.bpmn20.xml create mode 100644 system/src/main/resources/物品领用申请.bpmn20.xml create mode 100644 system/src/main/resources/设备保养任务.bpmn20.xml create mode 100644 system/src/main/resources/设备巡检任务.bpmn20.xml create mode 100644 system/src/main/resources/设备报修维修.bpmn20.xml create mode 100644 system/src/main/resources/设备盘点任务.bpmn20.xml create mode 100644 system/src/main/resources/资产设备报废.bpmn20.xml create mode 100644 system/src/main/resources/资产采购申请.bpmn20.xml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..645b2db --- /dev/null +++ b/.gitignore @@ -0,0 +1,52 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/** +!**/src/test/** +doc/ +license/ +logs/ +script/ +deploy/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +.log +*.exe + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr +.mvn +mvnw* + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ + +### VS Code ### +.vscode/ + +### generated files ### +bin/ +gen/ + +### MAC ### +.DS_Store + +### Other ### +logs/ +log +temp/ diff --git a/admin/pom.xml b/admin/pom.xml new file mode 100644 index 0000000..c790d2f --- /dev/null +++ b/admin/pom.xml @@ -0,0 +1,96 @@ + + + + yyy + com.yyy + 1.0-SNAPSHOT + + 4.0.0 + jar + admin + + web服务入口,用户相关模板 + + + + com.yyy + framework + 1.0-SNAPSHOT + + + + com.yyy + flowable + 1.0-SNAPSHOT + + + + com.yyy + license + 1.0-SNAPSHOT + + + + com.yyy + quartz + 1.0-SNAPSHOT + + + + org.springframework.boot + spring-boot-devtools + true + + + + org.springframework.boot + spring-boot-starter-web + + + + mysql + mysql-connector-java + + + org.springframework.boot + spring-boot-starter-jdbc + + + com.alibaba + druid-spring-boot-starter + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + 2.7.6 + + true + + + + + repackage + + + + + + org.apache.maven.plugins + maven-war-plugin + 3.0.0 + + false + ${project.artifactId} + + + + ${project.artifactId} + + \ No newline at end of file diff --git a/admin/src/main/java/com/yyy/Application.java b/admin/src/main/java/com/yyy/Application.java new file mode 100644 index 0000000..57c7987 --- /dev/null +++ b/admin/src/main/java/com/yyy/Application.java @@ -0,0 +1,17 @@ +package com.yyy; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; + +/** + * @Author: fy + * @Date: 2024/03/21 + * @Description:主启动类 + */ +@SpringBootApplication +public class Application { + public static void main(String[] args) { + SpringApplication.run(Application.class,args); + } +} diff --git a/admin/src/main/java/com/yyy/web/config/SwaggerConfig.java b/admin/src/main/java/com/yyy/web/config/SwaggerConfig.java new file mode 100644 index 0000000..14979f2 --- /dev/null +++ b/admin/src/main/java/com/yyy/web/config/SwaggerConfig.java @@ -0,0 +1,150 @@ +package com.yyy.web.config; + + +import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.builders.RequestParameterBuilder; +import springfox.documentation.service.*; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; + +import java.util.Collections; + +/** + * @Description knife4j配置类, 访问url:http://ip:port/doc.html + **/ +@EnableKnife4j +@Configuration +public class SwaggerConfig { + @Value("${swagger.base-package}") + private String basePackage; + @Value("${swagger.description}") + private String description; + @Value("${swagger.version}") + private String version; + @Value("${swagger.title}") + private String title; + @Value("${swagger.enabled}") + private boolean enabled; + + @Bean + public Docket api() { + return new Docket(DocumentationType.SWAGGER_2) + .enable(enabled) + .apiInfo(apiInfo()) + .globalRequestParameters( + Collections.singletonList(new RequestParameterBuilder() + .name("Authorization") + .in(ParameterType.HEADER) + .required(true) + .build())) + .produces(Collections.singleton("application/json")) + .consumes(Collections.singleton("application/json")).select() + .apis(RequestHandlerSelectors.basePackage(basePackage)) + .paths(PathSelectors.any()) + .build(); + } + + private ApiInfo apiInfo() { + return new ApiInfoBuilder() + .description(description) + .version(version) + .title(title) + .build(); + } + + @Bean + public Docket api_v2() { + return new Docket(DocumentationType.SWAGGER_2) + .apiInfo(apiInfo()) + .globalRequestParameters(Collections.singletonList(new RequestParameterBuilder() + .name("Authorization") + .in(ParameterType.HEADER) + .required(true) + .build())) + .select() + .apis(RequestHandlerSelectors.any()) + .paths(PathSelectors.ant("/api/v2/**") + .or(PathSelectors.ant("/api/eamBasicCategory/tree")) + .or(PathSelectors.ant("/api/eamBasicCategory/query")) + .or(PathSelectors.ant("/api/eamBasicCategory/add")) + .or(PathSelectors.ant("/api/eamBasicCategory/update")) + .or(PathSelectors.ant("/api/eamBasicCategory/importTemplate")) + .or(PathSelectors.ant("/api/eamBasicCategory/importData")) + .or(PathSelectors.ant("/api/eamAsset/list")) + .or(PathSelectors.ant("/api/eamAsset/query")) + .or(PathSelectors.ant("/api/eamAsset/add")) + .or(PathSelectors.ant("/api/eamAsset/update")) + .or(PathSelectors.ant("/api/eamAsset/importTemplate")) + .or(PathSelectors.ant("/api/flowable/task/claim")) + .or(PathSelectors.ant("/api/flowable/task/assignTask")) + .or(PathSelectors.ant("/api/flowable/task/revokeProcess")) + .or(PathSelectors.ant("/api/flowable/instance/updateState")) + .or(PathSelectors.ant("/api/flowable/instance/delete/{instanceIds}")) + .or(PathSelectors.ant("/api/flForm/update")) + .or(PathSelectors.ant("/api/flFormItem/home")) + .or(PathSelectors.ant("/api/flFormItem/calendar")) + .or(PathSelectors.ant("/api/eamAssetLog/list")) + + ) + .build() + .groupName("二期相关接口") + .pathMapping("/"); + } + + @Bean + public Docket api_flowable() { + return new Docket(DocumentationType.SWAGGER_2) + .apiInfo(apiInfo()) + .globalRequestParameters(Collections.singletonList(new RequestParameterBuilder() + .name("Authorization") + .in(ParameterType.HEADER) + .required(true) + .build())) + .select() + .apis(RequestHandlerSelectors.any()) + .paths(PathSelectors.ant("/api/flowable/**")) + .build() + .groupName("审批流相关接口") + .pathMapping("/"); + } + + @Bean + public Docket api_license() { + return new Docket(DocumentationType.SWAGGER_2) + .apiInfo(apiInfo()) + .globalRequestParameters(Collections.singletonList(new RequestParameterBuilder() + .name("Authorization") + .in(ParameterType.HEADER) + .required(true) + .build())) + .select() + .apis(RequestHandlerSelectors.any()) + .paths(PathSelectors.ant("/api/license/**")) + .build() + .groupName("加密证书相关接口") + .pathMapping("/"); + } + + @Bean + public Docket api_quartz() { + return new Docket(DocumentationType.SWAGGER_2) + .apiInfo(apiInfo()) + .globalRequestParameters(Collections.singletonList(new RequestParameterBuilder() + .name("Authorization") + .in(ParameterType.HEADER) + .required(true) + .build())) + .select() + .apis(RequestHandlerSelectors.any()) + .paths(PathSelectors.ant("/api/monitor/**")) + .build() + .groupName("调度任务相关接口") + .pathMapping("/"); + } +} diff --git a/admin/src/main/java/com/yyy/web/controller/common/CommonController.java b/admin/src/main/java/com/yyy/web/controller/common/CommonController.java new file mode 100644 index 0000000..cb0f52b --- /dev/null +++ b/admin/src/main/java/com/yyy/web/controller/common/CommonController.java @@ -0,0 +1,154 @@ +package com.yyy.web.controller.common; + +import com.alibaba.fastjson.JSONObject; +import com.yyy.common.config.AppConfig; +import com.yyy.common.config.ServerConfig; +import com.yyy.common.constant.Constants; +import com.yyy.common.core.domain.Result; +import com.yyy.common.core.domain.ResultCode; +import com.yyy.common.utils.common.StringUtils; +import com.yyy.common.utils.file.FileUploadUtils; +import com.yyy.common.utils.file.FileUtils; +import io.swagger.annotations.ApiOperation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.ArrayList; +import java.util.List; + +/** + * @Author: fy + * @Date: 2024/03/21 + * @Description:通用请求处理 + */ +@Controller +@RequestMapping("/api/common") +public class CommonController { + private static final Logger log = LoggerFactory.getLogger(CommonController.class); + + private static final String FILE_DELIMETER = ","; + + @Autowired + private ServerConfig serverConfig; + + /** + * 通用下载请求 + * + * @param fileName 文件名称 + * @param delete 是否删除 + */ + @ApiOperation(value = "通用下载请求") + @PostMapping("/download") + public void fileDownload(String fileName, Boolean delete, HttpServletResponse response, HttpServletRequest request) { + try { + if (!FileUtils.checkAllowDownload(fileName)) { + throw new Exception(StringUtils.format("文件名称({})非法,不允许下载。 ", fileName)); + } + String realFileName = System.currentTimeMillis() + fileName.substring(fileName.indexOf("_") + 1); + String filePath = AppConfig.getDownloadPath() + fileName; + + response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); + FileUtils.setAttachmentResponseHeader(response, realFileName); + FileUtils.writeBytes(filePath, response.getOutputStream()); + if (delete) { + FileUtils.deleteFile(filePath); + } + } catch (Exception e) { + log.error("下载文件失败", e); + } + } + + /** + * 通用上传请求(单个) + */ + @ApiOperation(value = "通用上传请求(单个)") + @PostMapping("/upload") + @ResponseBody + public Result uploadFile(MultipartFile file) throws Exception { + try { + // 上传文件路径 + String filePath = AppConfig.getUploadPath(); + // 上传并返回新文件名称 + String fileName = FileUploadUtils.upload(filePath, file); + String url = serverConfig.getUrl() + fileName; + + JSONObject result = new JSONObject(); + result.put("url", url); + result.put("fileName", fileName); + result.put("newFileName", FileUtils.getName(fileName)); + result.put("originalFilename", file.getOriginalFilename()); + return new Result(ResultCode.success, result); + } catch (Exception e) { + return new Result(ResultCode.operate_failure, e.getMessage()); + } + } + + /** + * 通用上传请求(多个) + */ + @ApiOperation(value = "通用上传请求(多个)") + @PostMapping("/uploads") + @ResponseBody + public Result uploadFiles(List files) throws Exception { + try { + // 上传文件路径 + String filePath = AppConfig.getUploadPath(); + List urls = new ArrayList(); + List fileNames = new ArrayList(); + List newFileNames = new ArrayList(); + List originalFilenames = new ArrayList(); + for (MultipartFile file : files) { + // 上传并返回新文件名称 + String fileName = FileUploadUtils.upload(filePath, file); + String url = serverConfig.getUrl() + fileName; + urls.add(url); + fileNames.add(fileName); + newFileNames.add(FileUtils.getName(fileName)); + originalFilenames.add(file.getOriginalFilename()); + } + JSONObject result = new JSONObject(); + result.put("urls", StringUtils.join(urls, FILE_DELIMETER)); + result.put("fileNames", StringUtils.join(fileNames, FILE_DELIMETER)); + result.put("newFileNames", StringUtils.join(newFileNames, FILE_DELIMETER)); + result.put("originalFilenames", StringUtils.join(originalFilenames, FILE_DELIMETER)); + return new Result(ResultCode.success, result); + } catch (Exception e) { + return new Result(ResultCode.operate_failure, e.getMessage()); + } + } + + /** + * 本地资源通用下载 + */ + @ApiOperation(value = "本地资源通用下载") + @PostMapping("/download/resource") + public void resourceDownload(String resource, HttpServletRequest request, HttpServletResponse response) + throws Exception { + try { + if (!FileUtils.checkAllowDownload(resource)) { + throw new Exception(StringUtils.format("资源文件({})非法,不允许下载。 ", resource)); + } + // 本地资源路径 + String localPath = AppConfig.getProfile(); + // 数据库资源地址 + String downloadPath = localPath + StringUtils.substringAfter(resource, Constants.RESOURCE_PREFIX); + // 下载名称 + String downloadName = StringUtils.substringAfterLast(downloadPath, "/"); + response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); + FileUtils.setAttachmentResponseHeader(response, downloadName); + FileUtils.writeBytes(downloadPath, response.getOutputStream()); + } catch (Exception e) { + log.error("下载文件失败", e); + } + } +} diff --git a/admin/src/main/java/com/yyy/web/controller/ums/OauthController.java b/admin/src/main/java/com/yyy/web/controller/ums/OauthController.java new file mode 100644 index 0000000..b0d474f --- /dev/null +++ b/admin/src/main/java/com/yyy/web/controller/ums/OauthController.java @@ -0,0 +1,88 @@ +package com.yyy.web.controller.ums; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.yyy.common.core.controller.BaseController; +import com.yyy.common.core.domain.Result; +import com.yyy.common.core.domain.dto.LoginDto; +import com.yyy.common.core.domain.entity.UmsUser; +import com.yyy.common.core.domain.vo.LoginVo; +import com.yyy.common.utils.common.MD5Utils; +import com.yyy.common.utils.security.JwtUtils; +import com.yyy.system.service.UmsMenuService; +import com.yyy.system.service.UmsOrganizationService; +import com.yyy.system.service.UmsRoleService; +import com.yyy.system.service.UmsUserService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import java.util.Set; + +/** + * @Description:登录授权相关接口 + */ +@RestController +@Api(tags = "登录授权相关接口") +@RequestMapping("api/oauth") +public class OauthController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(OauthController.class); + /** + * 服务对象 + */ + @Resource + private UmsOrganizationService umsOrganizationService; + @Resource + private UmsUserService umsUserService; + @Resource + private UmsRoleService roleService; + @Resource + private UmsMenuService umsMenuService; + + @Resource + private JwtUtils jwtUtils; + + /** + * 登录 + */ + @PostMapping("/login") + @ApiOperation(value = "登录") + public Result login(@RequestBody LoginDto loginDto, HttpServletRequest request) { + UmsUser user; + { + user = umsUserService.getOne(new QueryWrapper().eq("login_name", loginDto.getLoginName())); + if (user == null || !StringUtils.equals(user.getPassword(), MD5Utils.inputPassToDBPass(loginDto.getPassword(), user.getSalt()))) { + return Result.INVALID_USER_PASS; + } + } + Set roleSet = roleService.selectRoleKeys(user.getUserId()); + Set permsSet = umsMenuService.selectPermsByUserId(user.getUserId()); + String Authorization = jwtUtils.getToken(user.getUserId(), request.getSession().getId(), "1.0.0", "web"); + return success(LoginVo.builder() + .loginName(user.getLoginName()) + .userName(user.getUserName()) + .avatar(user.getAvatar()) + .phone(user.getPhone()) + .email(user.getEmail()) + .Authorization(Authorization) + .roles(roleSet) + .permissions(permsSet) + .build()); + } + + /** + * 登出 + */ + @PostMapping("/logout") + @ApiOperation(value = "登出") + public Result logout() { + return success(); + } +} diff --git a/admin/src/main/java/com/yyy/web/controller/ums/UmsMenuController.java b/admin/src/main/java/com/yyy/web/controller/ums/UmsMenuController.java new file mode 100644 index 0000000..15485c9 --- /dev/null +++ b/admin/src/main/java/com/yyy/web/controller/ums/UmsMenuController.java @@ -0,0 +1,104 @@ +package com.yyy.web.controller.ums; + + +import com.yyy.common.core.controller.BaseController; +import com.yyy.common.core.domain.Result; +import com.yyy.common.core.domain.dto.UmsMenuDto; +import com.yyy.common.core.domain.entity.UmsMenu; +import com.yyy.common.core.domain.vo.UmsMenuVo; +import com.yyy.common.core.page.TableDataInfo; +import com.yyy.common.utils.bean.BeanUtils; +import com.yyy.system.service.UmsMenuService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 菜单表(ums_menu)表控制层 + * @author Fangy + * @since 2024-04-03 17:18:31 + */ +@RestController +@Api(tags = "菜单表") +@RequestMapping("api/umsMenu") +public class UmsMenuController extends BaseController { + + private static final Logger logger = LoggerFactory.getLogger(UmsMenuController.class); + /** + * 服务对象 + */ + @Resource + private UmsMenuService umsMenuService; + + /** + * 查询分页数据 + * + */ + @PostMapping("/list") + @ApiOperation(value = "查询分页数据") + public TableDataInfo list(@RequestBody UmsMenuDto umsMenuDto) { + startPage(); + List list = umsMenuService.query(umsMenuDto); + return getDataTable(UmsMenuVo.ToVo(list)); + } + + @PostMapping("/listAll") + @ApiOperation(value = "查询所有数据") + public Result listAll() { + return success(UmsMenuVo.ToVo(umsMenuService.query(new UmsMenuDto()))); + } + + + /** + * 查询详情数据 + * + */ + @PostMapping("/query") + @ApiOperation(value = "查询详情数据") + public Result query(@RequestParam Long id) { + return success(UmsMenuVo.ToVo(umsMenuService.getById(id))); + } + + /** + * 新增数据 + * + */ + @PostMapping("/add") + @ApiOperation(value = "新增数据") + public Result add(@Validated @RequestBody UmsMenuDto umsMenuDto) { + UmsMenu umsMenu = new UmsMenu(); + BeanUtils.copyProperties(umsMenuDto, umsMenu); + umsMenu.setCreateUser(getUserId()); + return umsMenuService.save(umsMenu)?success():error(); + } + + /** + * 修改数据 + * + */ + @PostMapping("/update") + @ApiOperation(value = "修改数据") + public Result update(@Validated @RequestBody UmsMenuDto umsMenuDto) { + UmsMenu umsMenu = new UmsMenu(); + BeanUtils.copyProperties(umsMenuDto, umsMenu); + umsMenu.setUpdateUser(getUserId()); + return umsMenuService.updateById(umsMenu) ? success() : error(); + } + + /** + * 删除数据 + * + */ + @PostMapping("/delete") + @ApiOperation(value = "删除数据") + public Result delete(@RequestBody List idList) { + return umsMenuService.removeBatchByIds(idList) ? success() : error(); + } +} + diff --git a/admin/src/main/java/com/yyy/web/controller/ums/UmsOrganizationController.java b/admin/src/main/java/com/yyy/web/controller/ums/UmsOrganizationController.java new file mode 100644 index 0000000..f328308 --- /dev/null +++ b/admin/src/main/java/com/yyy/web/controller/ums/UmsOrganizationController.java @@ -0,0 +1,115 @@ +package com.yyy.web.controller.ums; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.yyy.common.core.controller.BaseController; +import com.yyy.common.core.domain.Result; +import com.yyy.common.core.domain.dto.UmsOrganizationDto; +import com.yyy.common.core.domain.entity.UmsOrganization; +import com.yyy.common.core.domain.vo.UmsOrganizationVo; +import com.yyy.common.core.page.TableDataInfo; +import com.yyy.common.enums.OrganizationTypeEnum; +import com.yyy.common.utils.bean.BeanUtils; +import com.yyy.common.utils.common.StringUtils; +import com.yyy.system.service.UmsOrganizationService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 组织信息表(ums_organization)表控制层 + * + * @author Fangy + * @since 2024-04-03 09:47:06 + */ +@RestController +@Api(tags = "组织信息表") +@RequestMapping("api/umsOrganization") +public class UmsOrganizationController extends BaseController { + + private static final Logger logger = LoggerFactory.getLogger(UmsOrganizationController.class); + /** + * 服务对象 + */ + @Resource + private UmsOrganizationService umsOrganizationService; + + /** + * 组织树 + */ + @PostMapping("/tree") + @ApiOperation(value = "组织树") + public Result> tree() { + return success(UmsOrganizationVo.ToVo(umsOrganizationService.list(new QueryWrapper().eq("is_deleted", 0)))); + } + + /** + * 查询详情数据 + */ + @PostMapping("/query") + @ApiOperation(value = "查询详情数据") + public Result query(@RequestParam Long id) { + return success(UmsOrganizationVo.ToVo(umsOrganizationService.getById(id))); + } + + /** + * 新增数据 + */ + @PostMapping("/add") + @ApiOperation(value = "新增数据") + public Result add(@Validated @RequestBody UmsOrganizationDto umsOrganizationDto) { + if (umsOrganizationDto.getParentId()==null){ + umsOrganizationDto.setParentId(0L); + } + UmsOrganization parent = umsOrganizationService.getById(umsOrganizationDto.getParentId()); + if (parent!=null){ + String msg = OrganizationTypeEnum.enable(parent.getOrganizationType(),umsOrganizationDto.getOrganizationType()!=null?umsOrganizationDto.getOrganizationType():OrganizationTypeEnum.COMPANY.getCode()); + if (StringUtils.isNotEmpty(msg)){ + return error(msg); + } + } + + UmsOrganization umsOrganization = new UmsOrganization(); + BeanUtils.copyProperties(umsOrganizationDto, umsOrganization); + umsOrganization.setCreateUser(getUserId()); + return umsOrganizationService.save(umsOrganization) ? success() : error(); + } + + /** + * 修改数据 + */ + @PostMapping("/update") + @ApiOperation(value = "修改数据") + public Result update(@Validated @RequestBody UmsOrganizationDto umsOrganizationDto) { + UmsOrganization parent = umsOrganizationService.getById(umsOrganizationService.getById(umsOrganizationDto.getOrganizationId()).getParentId()); + if (parent!=null){ + String msg = OrganizationTypeEnum.enable(parent.getOrganizationType(),umsOrganizationDto.getOrganizationType()!=null?umsOrganizationDto.getOrganizationType():OrganizationTypeEnum.COMPANY.getCode()); + if (StringUtils.isNotEmpty(msg)){ + return error(msg); + } + } + UmsOrganization umsOrganization = new UmsOrganization(); + BeanUtils.copyProperties(umsOrganizationDto, umsOrganization); + umsOrganization.setUpdateUser(getUserId()); + return umsOrganizationService.updateById(umsOrganization) ? success() : error(); + } + + /** + * 删除数据 + */ + @PostMapping("/delete") + @ApiOperation(value = "删除数据") + public Result delete(@RequestBody List idList) { + if (idList.contains(1L)){ + return error("总公司不允许删除"); + } + return umsOrganizationService.removeBatchByIds(idList) ? success() : error(); + } +} + diff --git a/admin/src/main/java/com/yyy/web/controller/ums/UmsRoleController.java b/admin/src/main/java/com/yyy/web/controller/ums/UmsRoleController.java new file mode 100644 index 0000000..076bc92 --- /dev/null +++ b/admin/src/main/java/com/yyy/web/controller/ums/UmsRoleController.java @@ -0,0 +1,99 @@ +package com.yyy.web.controller.ums; + +import com.yyy.common.core.controller.BaseController; +import com.yyy.common.core.domain.Result; +import com.yyy.common.core.domain.dto.UmsRoleDto; +import com.yyy.common.core.domain.entity.UmsRole; +import com.yyy.common.core.domain.vo.UmsRoleVo; +import com.yyy.common.core.page.TableDataInfo; +import com.yyy.common.utils.bean.BeanUtils; +import com.yyy.system.service.UmsRoleService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 角色表(ums_role)表控制层 + * + * @author Fangy + * @since 2024-04-03 16:14:02 + */ +@RestController +@Api(tags = "角色表") +@RequestMapping("api/umsRole") +public class UmsRoleController extends BaseController { + + private static final Logger logger = LoggerFactory.getLogger(UmsRoleController.class); + /** + * 服务对象 + */ + @Resource + private UmsRoleService umsRoleService; + + /** + * 查询分页数据 + */ + @PostMapping("/list") + @ApiOperation(value = "查询分页数据") + public TableDataInfo list(@RequestBody UmsRoleDto umsRoleDto) { + startPage(); + List list = umsRoleService.query(umsRoleDto); + return getDataTable(UmsRoleVo.ToVo(list)); + } + + /** + * 查询详情数据 + */ + @PostMapping("/query") + @ApiOperation(value = "查询详情数据") + public Result query(@RequestParam Long id) { + return success(UmsRoleVo.ToVo(umsRoleService.getById(id))); + } + + /** + * 新增数据 + */ + @PostMapping("/add") + @ApiOperation(value = "新增数据") + public Result add(@Validated @RequestBody UmsRoleDto umsRoleDto) { + Long id = umsRoleService.selectLatestPrimaryKey() + 1; + UmsRole umsRole = new UmsRole(); + BeanUtils.copyProperties(umsRoleDto, umsRole); + umsRole.setCreateUser(getUserId()); + umsRole.setRoleId(id); + if (umsRoleService.save(umsRole)){ + umsRoleService.bindMenu(id, umsRoleDto.getMenuIdList()); + return success(); + }else { + return error(); + } + } + + /** + * 修改数据 + */ + @PostMapping("/update") + @ApiOperation(value = "修改数据") + public Result update(@Validated @RequestBody UmsRoleDto umsRoleDto) { + UmsRole umsRole = new UmsRole(); + BeanUtils.copyProperties(umsRoleDto, umsRole); + umsRole.setUpdateUser(getUserId()); + return umsRoleService.updateById(umsRole) && umsRoleService.bindMenu(umsRoleDto.getRoleId(), umsRoleDto.getMenuIdList()) ? success() : error(); + } + + /** + * 删除数据 + */ + @PostMapping("/delete") + @ApiOperation(value = "删除数据") + public Result delete(@RequestBody List idList) { + return umsRoleService.removeBatchByIds(idList) ? success() : error(); + } +} + diff --git a/admin/src/main/java/com/yyy/web/controller/ums/UmsUserController.java b/admin/src/main/java/com/yyy/web/controller/ums/UmsUserController.java new file mode 100644 index 0000000..1810f12 --- /dev/null +++ b/admin/src/main/java/com/yyy/web/controller/ums/UmsUserController.java @@ -0,0 +1,236 @@ +package com.yyy.web.controller.ums; + + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.yyy.common.core.controller.BaseController; +import com.yyy.common.core.domain.Result; +import com.yyy.common.core.domain.dto.UmsUserAddDto; +import com.yyy.common.core.domain.dto.UmsUserPasswordDto; +import com.yyy.common.core.domain.dto.UmsUserQueryDto; +import com.yyy.common.core.domain.dto.UmsUserSelfDto; +import com.yyy.common.core.domain.entity.UmsUser; +import com.yyy.common.core.domain.vo.UmsUserVo; +import com.yyy.common.core.page.TableDataInfo; +import com.yyy.common.enums.ConfigEnum; +import com.yyy.common.utils.bean.BeanUtils; +import com.yyy.common.utils.common.MD5Utils; +import com.yyy.common.utils.common.StringUtils; +import com.yyy.common.utils.poi.ExcelUtil; +import com.yyy.system.service.UmsUserService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 用户表(ums_user)表控制层 + * + * @author Fangy + * @since 2024-03-22 17:31:32 + */ +@RestController +@Api(tags = "用户表") +@RequestMapping("api/umsUser") +public class UmsUserController extends BaseController { + + private static final Logger logger = LoggerFactory.getLogger(UmsUserController.class); + /** + * 服务对象 + */ + @Resource + private UmsUserService umsUserService; + + /** + * 分页查询 + */ + @PostMapping("/list") + @ApiOperation(value = "分页查询数据") + public TableDataInfo list(@RequestBody UmsUserQueryDto umsUserDto) { + startPage(); + List list = umsUserService.list(umsUserDto); + return getDataTable(UmsUserVo.ToVo(list)); + } + + /** + * 查询详情 + */ + @PostMapping("/query") + @ApiOperation(value = "查询详情") + public Result query(@RequestParam Long userId) { + return success(UmsUserVo.ToVo(umsUserService.getById(userId))); + } + + @PostMapping("/queryByIds") + @ApiOperation(value = "查询多个") + public Result queryByIds(@RequestBody List idList) { + return success(UmsUserVo.ToVo(umsUserService.listByIds(idList))); + } + + /** + * 新增 + */ + @PostMapping("/add") + @ApiOperation(value = "新增") + public Result add(@Validated @RequestBody UmsUserAddDto umsUserDto) { + if (!umsUserService.checkLoginNameUnique(null, umsUserDto.getLoginName())) { + return error("新增用户'" + umsUserDto.getLoginName() + "'失败,登录账号已存在"); + } else if (!umsUserService.checkPhoneUnique(null, umsUserDto.getPhone())) { + return error("新增用户'" + umsUserDto.getLoginName() + "'失败,手机号码已存在"); + } else if (StringUtils.isNotEmpty(umsUserDto.getEmail()) && !umsUserService.checkEmailUnique(null, umsUserDto.getEmail())) { + return error("新增用户'" + umsUserDto.getLoginName() + "'失败,邮箱账号已存在"); + } + String salt = MD5Utils.randomSalt(); + UmsUser user = new UmsUser(); + BeanUtils.copyProperties(umsUserDto, user); + user.setPassword(MD5Utils.inputPassToDBPass(umsUserDto.getPassword(), salt)); + user.setSalt(salt); + user.setCreateUser(getUserId()); + if (!umsUserService.save(user)) { + return error(); + } + Long userId = umsUserService.getOne(new QueryWrapper().eq("login_name", umsUserDto.getLoginName())).getUserId(); + if (umsUserDto.getOrganizationId() != null) { + umsUserService.bindPost(userId, umsUserDto.getOrganizationId()); + } + umsUserService.bindRole(userId, umsUserDto.getRoleId() != null ? umsUserDto.getRoleId() : Long.parseLong(ConfigEnum.DEFAULT_ROLE_ID.getInfo())); + return success(); + } + + /** + * 修改 + */ + @PostMapping("/update") + @ApiOperation(value = "修改") + public Result update(@Validated @RequestBody UmsUserAddDto umsUserDto) { + if (!umsUserService.checkLoginNameUnique(umsUserDto.getUserId(), umsUserDto.getLoginName())) { + return error("修改用户'" + umsUserDto.getLoginName() + "'失败,登录账号已存在"); + } else if (!umsUserService.checkPhoneUnique(umsUserDto.getUserId(), umsUserDto.getPhone())) { + return error("修改用户'" + umsUserDto.getLoginName() + "'失败,手机号码已存在"); + } else if (StringUtils.isNotEmpty(umsUserDto.getEmail()) && !umsUserService.checkEmailUnique(umsUserDto.getUserId(), umsUserDto.getEmail())) { + return error("修改用户'" + umsUserDto.getLoginName() + "'失败,邮箱账号已存在"); + } + if (!umsUserService.update(umsUserDto, getUserId())) { + return error(); + } + if (umsUserDto.getOrganizationId() != null) { + umsUserService.unbindPost(umsUserDto.getUserId()); + umsUserService.bindPost(umsUserDto.getUserId(), umsUserDto.getOrganizationId()); + } + if (umsUserDto.getRoleId() != null) { + umsUserService.unbindRole(umsUserDto.getUserId()); + umsUserService.bindRole(umsUserDto.getUserId(), umsUserDto.getRoleId()); + } + return success(); + } + + /** + * 修改个人基本信息 + */ + @PostMapping("/update/selfInfo") + @ApiOperation(value = "修改个人基本信息") + public Result selfInfo(@Validated @RequestBody UmsUserSelfDto userSelfDto) { + if (StringUtils.isNotEmpty(userSelfDto.getPhone()) && !umsUserService.checkPhoneUnique(getUserId(), userSelfDto.getPhone())) { + return error("操作失败,手机号码已存在"); + } else if (StringUtils.isNotEmpty(userSelfDto.getEmail()) && !umsUserService.checkEmailUnique(getUserId(), userSelfDto.getEmail())) { + return error("操作失败,邮箱账号已存在"); + } + UmsUserAddDto umsUserDto = new UmsUserAddDto(); + BeanUtils.copyProperties(userSelfDto, umsUserDto); + umsUserDto.setUserId(getUserId()); + return umsUserService.update(umsUserDto, getUserId()) ? success() : error(); + } + + /** + * 修改个人密码 + */ + @PostMapping("/update/selfPassword") + @ApiOperation(value = "修改个人密码") + public Result selfPassword(@Validated @RequestBody UmsUserPasswordDto umsUserPasswordDto) { + UmsUser user = umsUserService.getById(getUserId()); + if (!user.getPassword().equals(MD5Utils.inputPassToDBPass(umsUserPasswordDto.getOldPassword(), user.getSalt()))) { + return error("操作失败,旧密码错误,请重新输入!"); + } else if (umsUserPasswordDto.getOldPassword().equals(umsUserPasswordDto.getNewPassword())) { + return error("操作失败,旧密码与新密码一致,请重新输入!"); + } else if (!umsUserPasswordDto.getNewPassword().equals(umsUserPasswordDto.getCheckPassword())) { + return error("操作失败,两次输入的新密码不一致,请重新输入!"); + } + String salt = MD5Utils.randomSalt(); + user.setPassword(MD5Utils.inputPassToDBPass(umsUserPasswordDto.getNewPassword(), salt)); + user.setSalt(salt); + user.setCreateUser(getUserId()); + return umsUserService.updateById(user) ? success() : error(); + } + + /** + * 删除 + */ + @PostMapping("/delete") + @ApiOperation(value = "删除") + public Result delete(@RequestBody List idList) { + if(idList.contains(1L)){ + return error("删除失败,该用户为超级管理员,不允许删除!"); + } + umsUserService.unbindRole(idList); + umsUserService.unbindPost(idList); + return umsUserService.removeBatchByIds(idList) ? success() : error(); + } + + /** + * 用户-导出 + */ + @PostMapping("/export") + @ApiOperation(value = "导出用户数据excel") + public void export(@RequestBody List idList, HttpServletResponse response) { + List list = umsUserService.listByIds(idList); + ExcelUtil util = new ExcelUtil(UmsUser.class); + util.exportExcel(response, list, "用户数据"); + } + + /** + * 用户-导入 + */ + @PostMapping("/importData") + @ApiOperation(value = "导入用户数据excel") + public Result importData(MultipartFile file) throws Exception { + ExcelUtil util = new ExcelUtil<>(UmsUser.class); + List userList = util.importExcel(file.getInputStream()); + String salt = MD5Utils.randomSalt(); + Long userId = umsUserService.selectLatestPrimaryKey() + 1; + userList.forEach(user -> { + + }); + for (UmsUser user : userList) { + user.setPassword(MD5Utils.inputPassToDBPass("123456", salt)); + user.setSalt(salt); + user.setCreateUser(getUserId()); + + if (user.get_umsOrganization().getOrganizationId() != null) { + umsUserService.bindPost(userId, user.get_umsOrganization().getOrganizationId()); + } + umsUserService.bindRole(userId, user.get_umsRole().getRoleId() != null ? user.get_umsRole().getRoleId() : Long.parseLong(ConfigEnum.DEFAULT_ROLE_ID.getInfo())); + userId++; + + } + umsUserService.saveBatch(userList); + + return success(); + } + + /** + * 用户-导入模板 + */ + @PostMapping("/importTemplate") + @ApiOperation(value = "导入用户数据excel模板") + public void importTemplate(HttpServletResponse response) { + ExcelUtil util = new ExcelUtil(UmsUser.class); + util.importTemplateExcel(response, "用户数据"); + } +} + diff --git a/admin/src/main/resources/application-dev.yml b/admin/src/main/resources/application-dev.yml new file mode 100644 index 0000000..bb0c459 --- /dev/null +++ b/admin/src/main/resources/application-dev.yml @@ -0,0 +1,70 @@ +# 项目相关配置 +app: + # 名称 + name: 名称 + # 版本 + version: 2.0.0 + # 版权 + copyright: yyy版权所有 + # 版权年份 + copyrightYear: 2024 + # 文件路径 + profile: "D:/data/eam" + +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为80 + port: 80 + servlet: + # 应用的访问路径 + context-path: / + tomcat: + # tomcat的URI编码 + uri-encoding: UTF-8 + # 连接数满后的排队数,默认为100 + accept-count: 1000 + threads: + # tomcat最大线程数,默认为200 + max: 800 + # Tomcat启动初始化的线程数,默认值10 + min-spare: 100 + +# 日志配置 +logging: + level: + com.yyy: debug + org.mybatis: debug + org.springframework: debug + +# mysql连接信息 +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://localhost:3306/eam2?nullDatabaseMeansCurrent=true + username: root + password: 123456 + type: com.mysql.cj.jdbc.MysqlDataSource + +#spring: +# datasource: +# driver-class-name: com.mysql.cj.jdbc.Driver +# url: jdbc:mysql://47.109.27.8:3306/eam2?nullDatabaseMeansCurrent=true +# username: admin +# password: "@Jiluo2019" +# type: com.mysql.cj.jdbc.MysqlDataSource + +qr: + ttf: "/ttf/SimHei.ttf" + +# License 相关配置 +license: + # 主题 + subject: license_eam + # 公钥别称 + publicAlias: publicCert + # 访问公钥的密码 + storePass: jiluo2019 + # license 位置 + licensePath: D:/license/license.lic + # 公钥位置 + publicKeysStorePath: D:/license/publicCerts.keystore \ No newline at end of file diff --git a/admin/src/main/resources/application-prod.yml b/admin/src/main/resources/application-prod.yml new file mode 100644 index 0000000..d170c06 --- /dev/null +++ b/admin/src/main/resources/application-prod.yml @@ -0,0 +1,60 @@ +app: + # 名称 + name: 固定资产管理系统 + # 版本 + version: 2.0.0 + # 版权 + copyright: 成都积络科技版权所有 + # 版权年份 + copyrightYear: 2024 + # 文件路径 + profile: "/data/eam" + +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为80 + port: 8282 + servlet: + # 应用的访问路径 + context-path: / + tomcat: + # tomcat的URI编码 + uri-encoding: UTF-8 + # 连接数满后的排队数,默认为100 + accept-count: 1000 + threads: + # tomcat最大线程数,默认为200 + max: 800 + # Tomcat启动初始化的线程数,默认值10 + min-spare: 100 + +# 日志配置 +logging: + level: + com.yyy: debug + org.springframework: warn + +# 数据源配置 +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://localhost:3306/eam2?nullDatabaseMeansCurrent=true + username: admin + password: "@Jiluo2019" + type: com.mysql.cj.jdbc.MysqlDataSource + +qr: + ttf: "/ttf/SimHei.ttf" + +# License 相关配置 +license: + # 主题 + subject: license_eam + # 公钥别称 + publicAlias: publicCert + # 访问公钥的密码 + storePass: jiluo2019 + # license 位置 + licensePath: /data/eam/license/license.lic + # 公钥位置 + publicKeysStorePath: /data/eam/license/publicCerts.keystore \ No newline at end of file diff --git a/admin/src/main/resources/application.yml b/admin/src/main/resources/application.yml new file mode 100644 index 0000000..1122ef3 --- /dev/null +++ b/admin/src/main/resources/application.yml @@ -0,0 +1,54 @@ + +# Spring配置 +spring: + application: + name: yyy + profiles: + active: prod + jackson: + time-zone: GMT+8 + date-format: yyyy-MM-dd HH:mm:ss + # 文件上传 + servlet: + multipart: + # 单个文件大小 + max-file-size: 10MB + # 设置总上传的文件大小 + max-request-size: 20MB + # mvc策略 + mvc: + pathmatch: + matching-strategy: ANT_PATH_MATCHER + +# MyBatis +mybatis: + # 搜索指定包别名 + typeAliasesPackage: com.yyy.common.core.domain.entity,com.yyy.system.domain,com.yyy.quartz.domain + # 配置mapper的扫描,找到所有的mapper.xml映射文件 + mapperLocations: classpath*:mapper/*Mapper.xml,classpath*:mapper/quartz/*Mapper.xml + # 加载全局的配置文件 + configLocation: classpath:mybatis/mybatis-config.xml + +# Swagger配置 +swagger: + base-package: "com.yyy" + description: "" + version: "1.0" + title: "接口文档" + enabled: true #是否开启swagger + +minio: + endpoint: http://localhost #Minio服务ip + port: 9000 + accessKey: minioadmin #访问的key + secretKey: minioadmin #访问的秘钥 + secure: false + bucketName: "defaultbucket" #默认存储桶名称 + enabled: false #是否开启minio + +jwt: + config: + header: Authorization + refreshTime: 3600000 # 刷新时间 1小时 + expiresTime: 7200000 # 过期 2小时 + secretKey: jiluo2019 diff --git a/admin/src/main/resources/banner.txt b/admin/src/main/resources/banner.txt new file mode 100644 index 0000000..de2209a --- /dev/null +++ b/admin/src/main/resources/banner.txt @@ -0,0 +1,22 @@ +//////////////////////////////////////////////////////////////////// +// _ooOoo_ // +// o8888888o // +// 88" . "88 // +// (| ^_^ |) // +// O\ = /O // +// ____/`---'\____ // +// .' \\| |// `. // +// / \\||| : |||// \ // +// / _||||| -:- |||||- \ // +// | | \\\ - /// | | // +// | \_| ''\---/'' | | // +// \ .-\__ `-` ___/-. / // +// ___`. .' /--.--\ `. . ___ // +// ."" '< `.___\_<|>_/___.' >'"". // +// | | : `- \`.;`\ _ /`;.`/ - ` : | | // +// \ \ `-. \_ __\ /__ _/ .-` / / // +// ========`-.____`-.___\_____/___.-`____.-'======== // +// `=---=' // +// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ // +// 佛祖保佑 永不宕机 永无BUG // +//////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/admin/src/main/resources/logback-spring.xml b/admin/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..d4b96e2 --- /dev/null +++ b/admin/src/main/resources/logback-spring.xml @@ -0,0 +1,152 @@ + + + + + + + eam + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${log.level} + + + ${CONSOLE_LOG_PATTERN} + + UTF-8 + + + + + + + + ${log.path}/${log.name}/${log.name}-info.log + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %.-${log.length}msg%n + UTF-8 + + + + ${log.path}/${log.name}/${log.name}-info-%d{yyyy-MM-dd}.%i.log + + ${log.max.file} + + ${log.max.history} + + ${log.max.size} + + + + INFO + ACCEPT + DENY + + + + + + ${log.path}/${log.name}/${log.name}-warn.log + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %.-${log.length}msg%n + UTF-8 + + + ${log.path}/${log.name}/${log.name}-warn-%d{yyyy-MM-dd}.%i.log + ${log.max.file} + ${log.max.history} + ${log.max.size} + + + WARN + ACCEPT + DENY + + + + + + ${log.path}/${log.name}/${log.name}-error.log + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %.-${log.length}msg%n + UTF-8 + + + ${log.path}/${log.name}/${log.name}-error-%d{yyyy-MM-dd}.%i.log + ${log.max.file} + ${log.max.history} + ${log.max.size} + + + ERROR + ACCEPT + DENY + + + + + + ${log.path}/${log.name}/${log.name}-protocol.log + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %.-${log.length}msg%n + UTF-8 + + + ${log.path}/${log.name}/${log.name}-protocol-%d{yyyy-MM-dd}.%i.log + ${log.max.file} + ${log.max.history} + ${log.max.size} + + + + + + ${log.path}/${log.name}/${log.name}-message.log + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %.-${log.length}msg%n + UTF-8 + + + ${log.path}/${log.name}/${log.name}-message-%d{yyyy-MM-dd}.%i.log + ${log.max.file} + ${log.max.history} + ${log.max.size} + + + + + + + + + + + + + + \ No newline at end of file diff --git a/admin/src/main/resources/mybatis/mybatis-config.xml b/admin/src/main/resources/mybatis/mybatis-config.xml new file mode 100644 index 0000000..68a75af --- /dev/null +++ b/admin/src/main/resources/mybatis/mybatis-config.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + diff --git a/common/pom.xml b/common/pom.xml new file mode 100644 index 0000000..d2e0a38 --- /dev/null +++ b/common/pom.xml @@ -0,0 +1,128 @@ + + + + yyy + com.yyy + 1.0-SNAPSHOT + + 4.0.0 + + common + 通用工具 + + + + + + org.springframework + spring-context-support + + + + + org.springframework + spring-web + + + + + org.apache.shiro + shiro-core + + + + + org.apache.shiro + shiro-ehcache + + + + org.springframework.boot + spring-boot-starter-validation + + + + + + javax.servlet + javax.servlet-api + + + + + com.github.pagehelper + pagehelper-spring-boot-starter + + + + + com.baomidou + mybatis-plus-boot-starter + + + + com.github.xiaoymin + knife4j-spring-boot-starter + + + + com.google.guava + guava + + + + + com.auth0 + java-jwt + + + + org.apache.poi + poi-ooxml + + + + org.apache.poi + poi-scratchpad + + + + com.itextpdf + itextpdf + + + com.google.zxing + core + + + com.google.zxing + javase + + + + com.deepoove + poi-tl + + + + com.alibaba + easyexcel + + + + com.documents4j + documents4j-local + + + com.documents4j + documents4j-transformer-msoffice-word + + + + org.jsoup + jsoup + + + \ No newline at end of file diff --git a/common/src/main/java/com/yyy/common/annotation/excel/Excel.java b/common/src/main/java/com/yyy/common/annotation/excel/Excel.java new file mode 100644 index 0000000..1194ae3 --- /dev/null +++ b/common/src/main/java/com/yyy/common/annotation/excel/Excel.java @@ -0,0 +1,186 @@ +package com.yyy.common.annotation.excel; + +import com.yyy.common.utils.poi.ExcelHandlerAdapter; +import org.apache.poi.ss.usermodel.HorizontalAlignment; +import org.apache.poi.ss.usermodel.IndexedColors; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import java.math.BigDecimal; + +/** + * 自定义导出Excel数据注解 + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface Excel +{ + /** + * 导出时在excel中排序 + */ + public int sort() default Integer.MAX_VALUE; + + /** + * 导出到Excel中的名字. + */ + public String name() default ""; + + /** + * 日期格式, 如: yyyy-MM-dd + */ + public String dateFormat() default ""; + + /** + * 如果是字典类型,请设置字典的type值 (如: sys_user_sex) + */ + public String dictType() default ""; + + /** + * 读取内容转表达式 (如: 0=男,1=女,2=未知) + */ + public String readConverterExp() default ""; + + /** + * 分隔符,读取字符串组内容 + */ + public String separator() default ","; + + /** + * BigDecimal 精度 默认:-1(默认不开启BigDecimal格式化) + */ + public int scale() default -1; + + /** + * BigDecimal 舍入规则 默认:BigDecimal.ROUND_HALF_EVEN + */ + public int roundingMode() default BigDecimal.ROUND_HALF_EVEN; + + /** + * 导出时在excel中每个列的高度 + */ + public double height() default 14; + + /** + * 导出时在excel中每个列的宽度 + */ + public double width() default 16; + + /** + * 文字后缀,如% 90 变成90% + */ + public String suffix() default ""; + + /** + * 当值为空时,字段的默认值 + */ + public String defaultValue() default ""; + + /** + * 提示信息 + */ + public String prompt() default ""; + + /** + * 设置只能选择不能输入的列内容. + */ + public String[] combo() default {}; + + /** + * 是否需要纵向合并单元格,应对需求:含有list集合单元格) + */ + public boolean needMerge() default false; + + /** + * 是否导出数据,应对需求:有时我们需要导出一份模板,这是标题需要但内容需要用户手工填写. + */ + public boolean isExport() default true; + + /** + * 另一个类中的属性名称,支持多级获取,以小数点隔开 + */ + public String targetAttr() default ""; + + /** + * 是否自动统计数据,在最后追加一行统计数据总和 + */ + public boolean isStatistics() default false; + + /** + * 导出类型(0数字 1字符串 2图片) + */ + public ColumnType cellType() default ColumnType.STRING; + + /** + * 导出列头背景颜色 + */ + public IndexedColors headerBackgroundColor() default IndexedColors.SKY_BLUE; + + /** + * 导出列头字体颜色 + */ + public IndexedColors headerColor() default IndexedColors.WHITE; + + /** + * 导出单元格背景颜色 + */ + public IndexedColors backgroundColor() default IndexedColors.WHITE; + + /** + * 导出单元格字体颜色 + */ + public IndexedColors color() default IndexedColors.BLACK; + + /** + * 导出字段对齐方式 + */ + public HorizontalAlignment align() default HorizontalAlignment.CENTER; + + /** + * 自定义数据处理器 + */ + public Class handler() default ExcelHandlerAdapter.class; + + /** + * 自定义数据处理器参数 + */ + public String[] args() default {}; + + /** + * 字段类型(0:导出导入;1:仅导出;2:仅导入) + */ + Type type() default Type.ALL; + + public enum Type + { + ALL(0), EXPORT(1), IMPORT(2); + private final int value; + + Type(int value) + { + this.value = value; + } + + public int value() + { + return this.value; + } + } + + public enum ColumnType + { + NUMERIC(0), STRING(1), IMAGE(2); + private final int value; + + ColumnType(int value) + { + this.value = value; + } + + public int value() + { + return this.value; + } + } +} \ No newline at end of file diff --git a/common/src/main/java/com/yyy/common/annotation/excel/Excels.java b/common/src/main/java/com/yyy/common/annotation/excel/Excels.java new file mode 100644 index 0000000..488daba --- /dev/null +++ b/common/src/main/java/com/yyy/common/annotation/excel/Excels.java @@ -0,0 +1,17 @@ +package com.yyy.common.annotation.excel; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Excel注解集 + * + */ +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +public @interface Excels +{ + Excel[] value(); +} \ No newline at end of file diff --git a/common/src/main/java/com/yyy/common/annotation/tree/TreeNodeId.java b/common/src/main/java/com/yyy/common/annotation/tree/TreeNodeId.java new file mode 100644 index 0000000..60c5e25 --- /dev/null +++ b/common/src/main/java/com/yyy/common/annotation/tree/TreeNodeId.java @@ -0,0 +1,16 @@ +package com.yyy.common.annotation.tree; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * @Description:树节点ID注解 + * @Version: 1.0 + * @Author: yyy + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface TreeNodeId { +} diff --git a/common/src/main/java/com/yyy/common/annotation/tree/TreeNodeName.java b/common/src/main/java/com/yyy/common/annotation/tree/TreeNodeName.java new file mode 100644 index 0000000..a9155e2 --- /dev/null +++ b/common/src/main/java/com/yyy/common/annotation/tree/TreeNodeName.java @@ -0,0 +1,16 @@ +package com.yyy.common.annotation.tree; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * @Description:树节点名称注解 + * @Version: 1.0 + * @Author: yyy + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface TreeNodeName { +} diff --git a/common/src/main/java/com/yyy/common/annotation/tree/TreeNodeParentId.java b/common/src/main/java/com/yyy/common/annotation/tree/TreeNodeParentId.java new file mode 100644 index 0000000..d635f9f --- /dev/null +++ b/common/src/main/java/com/yyy/common/annotation/tree/TreeNodeParentId.java @@ -0,0 +1,16 @@ +package com.yyy.common.annotation.tree; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * @Description:树节点父ID注解 + * @Version: 1.0 + * @Author: yyy + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface TreeNodeParentId { +} diff --git a/common/src/main/java/com/yyy/common/annotation/word/WordExport.java b/common/src/main/java/com/yyy/common/annotation/word/WordExport.java new file mode 100644 index 0000000..1d840e0 --- /dev/null +++ b/common/src/main/java/com/yyy/common/annotation/word/WordExport.java @@ -0,0 +1,30 @@ +package com.yyy.common.annotation.word; + +import com.yyy.common.enums.WordContentTypeEnum; +import com.yyy.common.enums.WordPluginsTypeEnum; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +public @interface WordExport { + + String key(); + + String name(); + + int sort() default 0; + + String format() default ""; + + int width() default 120; + + int height() default 120; + + WordContentTypeEnum content_type() default WordContentTypeEnum.TEXT; + + WordPluginsTypeEnum plugin_type() default WordPluginsTypeEnum.Default; +} diff --git a/common/src/main/java/com/yyy/common/config/AppConfig.java b/common/src/main/java/com/yyy/common/config/AppConfig.java new file mode 100644 index 0000000..74c8ae8 --- /dev/null +++ b/common/src/main/java/com/yyy/common/config/AppConfig.java @@ -0,0 +1,192 @@ +package com.yyy.common.config; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; + +/** + * @Author: fy + * @Date: 2024/03/22 + * @Description:全局配置类 + */ +@Component +@ConfigurationProperties(prefix = "app") +public class AppConfig { + /** 项目名称 */ + private static String name = "xxx"; + + /** 版本 */ + private static String version = "1.0.0"; + + /** 版权 */ + private static String copyright = "成都积络科技版权所有"; + + /** 版权年份 */ + private static String copyrightYear = "2024"; + + /** 上传路径 */ + private static String profile = "/data/eam"; + + // 实例变量用于注入 + @Value("${app.name}") + private String tempName; + + @Value("${app.version}") + private String tempVersion; + + @Value("${app.copyright}") + private String tempCopyright; + + @Value("${app.copyrightYear}") + private String tempCopyrightYear; + + @Value("${app.profile}") + private String tempProfile; + + @PostConstruct + public void init() { + if (tempName != null) { + name = tempName; + } + + if (tempVersion != null) { + version = tempVersion; + } + + if (tempCopyright != null) { + copyright = tempCopyright; + } + + if (tempCopyrightYear != null) { + copyrightYear = tempCopyrightYear; + } + + if (tempProfile != null) { + profile = tempProfile; + } + } + + public static String getName() { + return name; + } + + public static void setName(String name) { + AppConfig.name = name; + } + + public static String getVersion() { + return version; + } + + public static void setVersion(String version) { + AppConfig.version = version; + } + + public static String getCopyright() { + return copyright; + } + + public static void setCopyright(String copyright) { + AppConfig.copyright = copyright; + } + + public static String getCopyrightYear() { + return copyrightYear; + } + + public static void setCopyrightYear(String copyrightYear) { + AppConfig.copyrightYear = copyrightYear; + } + + public static String getProfile() { + return profile; + } + + public static void setProfile(String profile) { + AppConfig.profile = profile; + } + + + /** + * 获取导入上传路径 + */ + public static String getImportPath() + { + return getProfile() + "/import"; + } + + /** + * 获取头像上传路径 + */ + public static String getAvatarPath() + { + return getProfile() + "/avatar"; + } + + /** + * 获取下载路径 + */ + public static String getDownloadPath() + { + return getProfile() + "/download/"; + } + + /** + * 获取上传路径 + */ + public static String getUploadPath() + { + return getProfile() + "/upload"; + } + + /** + * 获取表单模板路径 + */ + public static String getTempPath() + { + return getProfile() + "/temp"; + } + + // getter 和 setter for temp variables + public String getTempName() { + return tempName; + } + + public void setTempName(String tempName) { + this.tempName = tempName; + } + + public String getTempVersion() { + return tempVersion; + } + + public void setTempVersion(String tempVersion) { + this.tempVersion = tempVersion; + } + + public String getTempCopyright() { + return tempCopyright; + } + + public void setTempCopyright(String tempCopyright) { + this.tempCopyright = tempCopyright; + } + + public String getTempCopyrightYear() { + return tempCopyrightYear; + } + + public void setTempCopyrightYear(String tempCopyrightYear) { + this.tempCopyrightYear = tempCopyrightYear; + } + + public String getTempProfile() { + return tempProfile; + } + + public void setTempProfile(String tempProfile) { + this.tempProfile = tempProfile; + } +} diff --git a/common/src/main/java/com/yyy/common/config/QRConfig.java b/common/src/main/java/com/yyy/common/config/QRConfig.java new file mode 100644 index 0000000..673ad81 --- /dev/null +++ b/common/src/main/java/com/yyy/common/config/QRConfig.java @@ -0,0 +1,30 @@ +package com.yyy.common.config; + +import cn.hutool.extra.qrcode.QrConfig; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.awt.*; + +/** + * @Author: fy + * @Date: 2024/03/20 + * @Description:采用JavaConfig的方式显示注入hutool中 生成二维码 + */ +@Configuration +public class QRConfig { + @Bean + public QrConfig qrConfig(){ + //初始宽度和高度 + QrConfig qrConfig=new QrConfig(300,300); + + //设置边距,即二维码和边框的距离 + qrConfig.setMargin(2); + //设置前景色 + qrConfig.setForeColor(Color.BLACK.getRGB()); + //设置背景色 + qrConfig.setBackColor(Color.WHITE.getRGB()); + + return qrConfig; + } +} diff --git a/common/src/main/java/com/yyy/common/config/ServerConfig.java b/common/src/main/java/com/yyy/common/config/ServerConfig.java new file mode 100644 index 0000000..3a5293b --- /dev/null +++ b/common/src/main/java/com/yyy/common/config/ServerConfig.java @@ -0,0 +1,33 @@ +package com.yyy.common.config; + +import com.yyy.common.utils.common.ServletUtils; +import org.springframework.stereotype.Component; + +import javax.servlet.http.HttpServletRequest; + +/** + * @Author: fy + * @Date: 2024/03/22 + * @Description:服务相关配置 + */ +@Component +public class ServerConfig +{ + /** + * 获取完整的请求路径,包括:域名,端口,上下文访问路径 + * + * @return 服务地址 + */ + public String getUrl() + { + HttpServletRequest request = ServletUtils.getRequest(); + return getDomain(request); + } + + public static String getDomain(HttpServletRequest request) + { + StringBuffer url = request.getRequestURL(); + String contextPath = request.getServletContext().getContextPath(); + return url.delete(url.length() - request.getRequestURI().length(), url.length()).append(contextPath).toString(); + } +} diff --git a/common/src/main/java/com/yyy/common/config/WordConfig.java b/common/src/main/java/com/yyy/common/config/WordConfig.java new file mode 100644 index 0000000..262881e --- /dev/null +++ b/common/src/main/java/com/yyy/common/config/WordConfig.java @@ -0,0 +1,75 @@ +package com.yyy.common.config; + +import com.deepoove.poi.config.Configure; +import com.deepoove.poi.config.ConfigureBuilder; +import com.deepoove.poi.policy.NumberingRenderPolicy; +import com.deepoove.poi.policy.PictureRenderPolicy; +import com.deepoove.poi.policy.TableRenderPolicy; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class WordConfig { + + /** + * 前后缀 默认使用 {{}} 的方式 + */ + private static String prefix = "{{"; + private static String suffix = "}}"; + + /** + * 标签类型 + */ + private static char pictureLabelType = '@'; + private static char tableLabelType = '#'; + private static char numberingLabelType = '*'; + + /** + * 标签正则表达式 + * 标签默认支持中文、字母、数字、下划线的组合,我们可以通过正则表达式来配置标签的规则,比如不允许中文:"[\\w]+(\\.[\\w]+)*" + * 比如允许除了标签前后缀外的任意字符:RegexUtils.createGeneral("{{", "}}") + */ + private static String regex = "((#)?[\\w\\u4e00-\\u9fa5]+(\\.[\\w\\u4e00-\\u9fa5]+)*)?"; + + /** + * 是否在模板标签中使用SpringEL表达式 + * {{name}} + * 类方法调用,转大写: {{name.toUpperCase()}} + * {{name == 'poi-tl'}} + * 判断条件 {{empty?:'这个字段为空'}} + * 三目运算符 {{sex ? '男' : '女'}} + * 类方法调用,时间格式化 {{new java.text.SimpleDateFormat('yyyy-MM-dd HH:mm:ss').format(time)}} + * 运算符 {{price/10000 + '万元'}} + * 数组列表使用下标访问 {{dogs[0].name}} + * 使用静态类方法 {{localDate.format(T(java.time.format.DateTimeFormatter).ofPattern('yyyy年MM月dd日'))}} + */ + private static boolean useSpringEL = false; + + /** + * 是否严格打印异常日志 + */ + private static boolean isLog = true; + + /** + * 标签数据类型不合法 + * 默认的行为会清空标签 + * builder.setValidErrorHandler(new DiscardHandler()); + * 执行严格的校验,直接抛出异常 + * builder.setValidErrorHandler(new AbortHandler()); + */ + + public static ConfigureBuilder getConfigure() { + ConfigureBuilder configureBuilder = Configure.builder() + .buildGramer(prefix, suffix) + .addPlugin(pictureLabelType, new PictureRenderPolicy()) + .addPlugin(tableLabelType, new TableRenderPolicy()) + .addPlugin(numberingLabelType, new NumberingRenderPolicy()); + + if (useSpringEL) { + configureBuilder.useSpringEL(isLog); + } else { + configureBuilder.useDefaultEL(isLog); + } + + return configureBuilder; + } +} diff --git a/common/src/main/java/com/yyy/common/constant/Constants.java b/common/src/main/java/com/yyy/common/constant/Constants.java new file mode 100644 index 0000000..efe8a55 --- /dev/null +++ b/common/src/main/java/com/yyy/common/constant/Constants.java @@ -0,0 +1,154 @@ +package com.yyy.common.constant; + +import com.google.common.collect.Lists; +import com.yyy.common.enums.FieldDataTypeEnum; +import com.yyy.common.utils.common.DateUtils; +import org.springframework.http.MediaType; + +import java.util.Date; +import java.util.List; +import java.util.Locale; + +/** + * @Author: fy + * @Date: 2024/03/21 + * @Description:通用常量信息 + */ +public class Constants { + public static final String SESSION_USER_KEY = "user"; + + public static final List SUPPORTED_MEDIA_TYPES = Lists.newArrayList( + MediaType.APPLICATION_JSON, + MediaType.APPLICATION_ATOM_XML, + MediaType.APPLICATION_FORM_URLENCODED, + MediaType.APPLICATION_OCTET_STREAM, + MediaType.APPLICATION_PDF, + MediaType.APPLICATION_RSS_XML, + MediaType.APPLICATION_XHTML_XML, + MediaType.APPLICATION_XML, + MediaType.IMAGE_GIF, + MediaType.IMAGE_JPEG, + MediaType.IMAGE_PNG, + MediaType.TEXT_EVENT_STREAM, + MediaType.TEXT_HTML, + MediaType.TEXT_MARKDOWN, + MediaType.TEXT_PLAIN, + MediaType.TEXT_XML + ); + + /** + * UTF-8 字符集 + */ + public static final String UTF8 = "UTF-8"; + + /** + * GBK 字符集 + */ + public static final String GBK = "GBK"; + + /** + * 系统语言 + */ + public static final Locale DEFAULT_LOCALE = Locale.SIMPLIFIED_CHINESE; + + /** + * http请求 + */ + public static final String HTTP = "http://"; + + /** + * https请求 + */ + public static final String HTTPS = "https://"; + + /** + * 通用成功标识 + */ + public static final String SUCCESS = "0"; + + /** + * 通用失败标识 + */ + public static final String FAIL = "1"; + + /** + * 登录成功 + */ + public static final String LOGIN_SUCCESS = "Success"; + + /** + * 注销 + */ + public static final String LOGOUT = "Logout"; + + /** + * 注册 + */ + public static final String REGISTER = "Register"; + + /** + * 登录失败 + */ + public static final String LOGIN_FAIL = "Error"; + + /** + * 系统用户授权缓存 + */ + public static final String SYS_AUTH_CACHE = "sys-authCache"; + + /** + * 参数管理 cache name + */ + public static final String SYS_CONFIG_CACHE = "sys-config"; + + /** + * 参数管理 cache key + */ + public static final String SYS_CONFIG_KEY = "sys_config:"; + + /** + * 字典管理 cache name + */ + public static final String SYS_DICT_CACHE = "sys-dict"; + + /** + * 字典管理 cache key + */ + public static final String SYS_DICT_KEY = "sys_dict:"; + + /** + * 资源映射路径 前缀 + */ + public static final String RESOURCE_PREFIX = "/file"; + + /** + * RMI 远程方法调用 + */ + public static final String LOOKUP_RMI = "rmi:"; + + /** + * LDAP 远程方法调用 + */ + public static final String LOOKUP_LDAP = "ldap:"; + + /** + * LDAPS 远程方法调用 + */ + public static final String LOOKUP_LDAPS = "ldaps:"; + + /** + * 定时任务白名单配置(仅允许访问的包名,如其他需要可以自行添加) + */ + public static final String[] JOB_WHITELIST_STR = { "com.yyy.quartz.task", "com.yyy.flowable.task" }; + + /** + * 定时任务违规的字符 + */ + public static final String[] JOB_ERROR_STR = { "java.net.URL", "javax.naming.InitialContext", "org.yaml.snakeyaml", + "org.springframework", "org.apache", "com.yyy.common.utils.file", "com.yyy.common.config", "com.yyy.generator" }; + + /** + * 默认日期 + */ + public static final Date DEFAULT_DATE = DateUtils.parseDate("2099-12-31 23:59:59"); +} diff --git a/common/src/main/java/com/yyy/common/constant/ScheduleConstants.java b/common/src/main/java/com/yyy/common/constant/ScheduleConstants.java new file mode 100644 index 0000000..148780c --- /dev/null +++ b/common/src/main/java/com/yyy/common/constant/ScheduleConstants.java @@ -0,0 +1,49 @@ +package com.yyy.common.constant; + +/** + * 任务调度通用常量 + * + */ +public class ScheduleConstants +{ + public static final String TASK_CLASS_NAME = "TASK_CLASS_NAME"; + + /** 执行目标key */ + public static final String TASK_PROPERTIES = "TASK_PROPERTIES"; + + /** 默认 */ + public static final String MISFIRE_DEFAULT = "0"; + + /** 立即触发执行 */ + public static final String MISFIRE_IGNORE_MISFIRES = "1"; + + /** 触发一次执行 */ + public static final String MISFIRE_FIRE_AND_PROCEED = "2"; + + /** 不触发立即执行 */ + public static final String MISFIRE_DO_NOTHING = "3"; + + public enum Status + { + /** + * 正常 + */ + NORMAL("0"), + /** + * 暂停 + */ + PAUSE("1"); + + private String value; + + private Status(String value) + { + this.value = value; + } + + public String getValue() + { + return value; + } + } +} \ No newline at end of file diff --git a/common/src/main/java/com/yyy/common/constant/ShiroConstants.java b/common/src/main/java/com/yyy/common/constant/ShiroConstants.java new file mode 100644 index 0000000..a30ac8a --- /dev/null +++ b/common/src/main/java/com/yyy/common/constant/ShiroConstants.java @@ -0,0 +1,77 @@ +package com.yyy.common.constant; + +/** + * Shiro通用常量 + */ +public class ShiroConstants +{ + /** + * 当前登录的用户 + */ + public static final String CURRENT_USER = "currentUser"; + + /** + * 用户名字段 + */ + public static final String CURRENT_USERNAME = "username"; + + /** + * 锁定屏幕字段 + */ + public static final String LOCK_SCREEN = "lockscreen"; + + /** + * 消息key + */ + public static final String MESSAGE = "message"; + + /** + * 错误key + */ + public static final String ERROR = "errorMsg"; + + /** + * 编码格式 + */ + public static final String ENCODING = "UTF-8"; + + /** + * 当前在线会话 + */ + public static final String ONLINE_SESSION = "online_session"; + + /** + * 验证码key + */ + public static final String CURRENT_CAPTCHA = "captcha"; + + /** + * 验证码开关 + */ + public static final String CURRENT_ENABLED = "captchaEnabled"; + + /** + * 验证码类型 + */ + public static final String CURRENT_TYPE = "captchaType"; + + /** + * 验证码 + */ + public static final String CURRENT_VALIDATECODE = "validateCode"; + + /** + * 验证码错误 + */ + public static final String CAPTCHA_ERROR = "captchaError"; + + /** + * 登录记录缓存 + */ + public static final String LOGIN_RECORD_CACHE = "loginRecordCache"; + + /** + * 系统活跃用户缓存 + */ + public static final String SYS_USERCACHE = "sys-userCache"; +} diff --git a/common/src/main/java/com/yyy/common/core/controller/BaseController.java b/common/src/main/java/com/yyy/common/core/controller/BaseController.java new file mode 100644 index 0000000..2d50a64 --- /dev/null +++ b/common/src/main/java/com/yyy/common/core/controller/BaseController.java @@ -0,0 +1,254 @@ +package com.yyy.common.core.controller; + +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.yyy.common.core.domain.Result; +import com.yyy.common.core.domain.ResultCode; +import com.yyy.common.core.domain.entity.UmsUser; +import com.yyy.common.core.page.PageDomain; +import com.yyy.common.core.page.TableDataInfo; +import com.yyy.common.core.page.TableSupport; +import com.yyy.common.utils.common.*; +import com.yyy.common.utils.security.JwtUtils; +import com.yyy.common.utils.sql.SqlUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.WebDataBinder; +import org.springframework.web.bind.annotation.InitBinder; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.beans.PropertyEditorSupport; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @Author: fy + * @Date: 2024/03/22 + * @Description:web层通用数据处理 + */ +@Component +public class BaseController { + protected final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + JwtUtils jwtUtils; + + /** + * 将前台传递过来的日期格式的字符串,自动转化为Date类型 + */ + @InitBinder + public void initBinder(WebDataBinder binder) + { + // Date 类型转换 + binder.registerCustomEditor(Date.class, new PropertyEditorSupport() + { + @Override + public void setAsText(String text) + { + setValue(DateUtils.parseDate(text)); + } + }); + } + + /** + * 设置请求分页数据 + */ + protected void startPage() + { + //PageUtils.startPage(); + } + + /** + * 设置请求排序数据 + */ + protected void startOrderBy() + { + PageDomain pageDomain = TableSupport.buildPageRequest(); + if (StringUtils.isNotEmpty(pageDomain.getOrderBy())) + { + String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy()); + PageHelper.orderBy(orderBy); + } + } + + /** + * 清理分页的线程变量 + */ + protected void clearPage() + { + PageUtils.clearPage(); + } + + /** + * 获取request + */ + public HttpServletRequest getRequest() + { + return ServletUtils.getRequest(); + } + + /** + * 获取response + */ + public HttpServletResponse getResponse() + { + return ServletUtils.getResponse(); + } + + /** + * 获取session + */ + public HttpSession getSession() + { + return getRequest().getSession(); + } + + /** + * 响应请求分页数据 + */ + @SuppressWarnings({ "rawtypes", "unchecked" }) + protected TableDataInfo getDataTable(List list) + { +// TableDataInfo rspData = new TableDataInfo(); +// rspData.setCode(0); +// rspData.setRows(list); +// rspData.setTotal(new PageInfo(list).getTotal()); +// return rspData; + + // 优化成sql的limit + PageDomain pageDomain = TableSupport.buildPageRequest(); + Integer pageNum = pageDomain.getPageNum(); + Integer pageSize = pageDomain.getPageSize(); + + int num = list.size(); + list = list.stream().skip((pageNum - 1) * pageSize).limit(pageSize).collect(Collectors.toList()); + TableDataInfo rspData = new TableDataInfo(); + rspData.setCode(0); + rspData.setRows(list); + rspData.setTotal(num); + +// TableDataInfo rspData = new TableDataInfo(); +// rspData.setCode(0); +// rspData.setRows(list); +// rspData.setTotal(num); + return rspData; + } + + + /** + * 响应返回结果 + * + * @param rows 影响行数 + * @return 操作结果 + */ + protected Result toResult(int rows) + { + return rows > 0 ? success() : error(); + } + + /** + * 响应返回结果 + * + * @param result 结果 + * @return 操作结果 + */ + protected Result toResult(boolean result) + { + return result ? success() : error(); + } + + /** + * 返回成功 + */ + public Result success() + { + return Result.SUCCESS; + } + + /** + * 返回失败消息 + */ + public Result error() + { + return Result.FAILURE; + } + + /** + * 返回成功消息 + */ + public Result success(String message) + { + return new Result(ResultCode.success,message); + } + + /** + * 返回成功数据 + */ + public static Result success(Object data) + { + return new Result(ResultCode.success,data); + } + + /** + * 返回失败消息 + */ + public Result error(String message) + { + return new Result(ResultCode.operate_failure.getCode(),message); + } + + /** + * 返回错误码消息 + */ + public Result error(ResultCode code, String message) + { + return new Result(code, message); + } + + /** + * 页面跳转 + */ + public String redirect(String url) + { + return StringUtils.format("redirect:{}", url); + } + + /** + * 获取用户缓存信息 + */ + public UmsUser getUser() + { +// return ShiroUtils.getUser(); + return new UmsUser(); + } + + /** + * 设置用户缓存信息 + */ + public void setUser(UmsUser user) + { +// ShiroUtils.setUser(user); + } + + /** + * 获取登录用户id + */ + public Long getUserId() + { + return Long.parseLong(jwtUtils.parseToken(ServletUtils.getRequest().getHeader("Authorization")).get("uid")); + } + + /** + * 获取登录用户名 + */ + public String getLoginName() + { + return getUser().getLoginName(); + } +} diff --git a/common/src/main/java/com/yyy/common/core/domain/Result.java b/common/src/main/java/com/yyy/common/core/domain/Result.java new file mode 100644 index 0000000..4f43abb --- /dev/null +++ b/common/src/main/java/com/yyy/common/core/domain/Result.java @@ -0,0 +1,69 @@ +package com.yyy.common.core.domain; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +import java.io.Serializable; + +/** + * @Author: fy + * @Date: 2024/03/21 + * @Description:统一返回结果 + */ +@ApiModel("统一返回结果") +@ToString +public class Result implements Serializable { + + private static final long serialVersionUID = 1L; + public static final Result NOT_SUPPORT = new Result(ResultCode.not_support_operate); + public static final Result NOT_PRIVILEGED = new Result(ResultCode.not_privileged); + public static final Result INVALID_USER_PASS = new Result(ResultCode.invalidUserOrPassword); + public static final Result ILLEGAL_ARGUMENT = new Result(ResultCode.illegal_argument); + public static final Result FAILURE = new Result(ResultCode.operate_failure); + public static final Result ERROR = new Result(ResultCode.system_error); + public static final Result NOT_LOGIN = new Result(ResultCode.need_login); + public static final Result SUCCESS = new Result(ResultCode.success); + public static final Result INVALID_LICENSE = new Result(ResultCode.invalid_license); + + @Getter + @Setter + @ApiModelProperty("状态码") + private int code; + @Getter + @Setter + @ApiModelProperty("描述信息") + private String desc; + @Getter + @Setter + @ApiModelProperty("响应结果数据") + private T body; + + public Result(ResultCode resultCode) { + setCode(resultCode.getCode()); + setDesc(resultCode.getDesc()); + } + + public Result(int code, String msg) { + setCode(code); + setDesc(msg); + } + + /** + * 使用通用结果码生成对象 + */ + public Result(ResultCode resultCode, T body) { + setCode(resultCode.getCode()); + setDesc(resultCode.getDesc()); + setBody(body); + } + + /** + * 判断执行结果是否成功 + */ + public boolean isSuccess() { + return ResultCode.success.getCode() == code; + } +} \ No newline at end of file diff --git a/common/src/main/java/com/yyy/common/core/domain/ResultCode.java b/common/src/main/java/com/yyy/common/core/domain/ResultCode.java new file mode 100644 index 0000000..7bf0657 --- /dev/null +++ b/common/src/main/java/com/yyy/common/core/domain/ResultCode.java @@ -0,0 +1,32 @@ +package com.yyy.common.core.domain; + +import lombok.Getter; + +/** + * @Author: fy + * @Date: 2024/03/21 + * @Description:统一结果码定义 + */ +public enum ResultCode { + success(200, "成功"), + + invalidUserOrPassword(300, "用户名或者密码错误!"), + illegal_argument(400, "参数错误!"), + need_login(401, "未登录!"), + not_support_operate(404, "不支持的请求!"), + not_privileged(405, "无权限执行该操作!"), + invalid_license(406, "您的证书无效,请核查服务器是否取得授权或重新申请证书!"), + system_error(500, "系统异常!"), + operate_failure(503, "操作失败!"); + + @Getter + private final int code; + @Getter + private final String desc; + + ResultCode(int code, String desc) { + this.code = code; + this.desc = desc; + } + +} diff --git a/common/src/main/java/com/yyy/common/core/domain/dto/LoginDto.java b/common/src/main/java/com/yyy/common/core/domain/dto/LoginDto.java new file mode 100644 index 0000000..2ed106d --- /dev/null +++ b/common/src/main/java/com/yyy/common/core/domain/dto/LoginDto.java @@ -0,0 +1,34 @@ +package com.yyy.common.core.domain.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + +/** + * @Author: fy + * @Date: 2024/04/03 + * @Description: + */ +@ApiModel("登录") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class LoginDto implements Serializable { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(notes = "账号", required = true) + @NotBlank(message = "账号不能为空") + private String loginName; + + @ApiModelProperty(notes = "密码", required = true) + @NotBlank(message = "密码不能为空") + private String password; + + @ApiModelProperty(notes = "验证码") + private String code; +} diff --git a/common/src/main/java/com/yyy/common/core/domain/dto/UmsMenuDto.java b/common/src/main/java/com/yyy/common/core/domain/dto/UmsMenuDto.java new file mode 100644 index 0000000..a411f5a --- /dev/null +++ b/common/src/main/java/com/yyy/common/core/domain/dto/UmsMenuDto.java @@ -0,0 +1,54 @@ +package com.yyy.common.core.domain.dto; + +import java.util.Date; +import java.io.Serializable; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.Builder; + +import javax.validation.constraints.NotBlank; + +@ApiModel("菜单表(UmsMenuDto)传输数据类") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class UmsMenuDto implements Serializable { + private static final long serialVersionUID = -26115459430198770L; + + @ApiModelProperty(notes = "菜单ID") + private Long menuId; + + @ApiModelProperty(notes = "菜单名称", required = true) + @NotBlank(message = "菜单名称不能为空") + private String menuName; + + @ApiModelProperty(notes = "父主键ID") + private Long parentId; + + @ApiModelProperty(notes = "排序") + private Integer sort; + + @ApiModelProperty(notes = "请求路径") + private String url; + + @ApiModelProperty(notes = "菜单类型(M目录 C菜单 F按钮)") + private String menuType; + + @ApiModelProperty(notes = "菜单状态(1隐藏 0显示)") + private String visible; + + @ApiModelProperty(notes = "权限标识") + private String permission; + + @ApiModelProperty(notes = "菜单图标") + private String icon; + + @ApiModelProperty(notes = "备注") + private String remark; + +} diff --git a/common/src/main/java/com/yyy/common/core/domain/dto/UmsOrganizationDto.java b/common/src/main/java/com/yyy/common/core/domain/dto/UmsOrganizationDto.java new file mode 100644 index 0000000..77d0d39 --- /dev/null +++ b/common/src/main/java/com/yyy/common/core/domain/dto/UmsOrganizationDto.java @@ -0,0 +1,44 @@ +package com.yyy.common.core.domain.dto; + +import java.io.Serializable; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.Builder; + +import javax.validation.constraints.NotBlank; + +@ApiModel("组织信息表(UmsOrganizationDto)传输数据类") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class UmsOrganizationDto implements Serializable { + private static final long serialVersionUID = -22653557155840114L; + + @ApiModelProperty(notes = "组织ID") + private Long organizationId; + + @ApiModelProperty(notes = "组织名称", required = true) + @NotBlank(message = "组织名称不能为空") + private String organizationName; + + @ApiModelProperty(notes = "组织类型(0:公司/1:部门/2:岗位)") + private String organizationType; + + @ApiModelProperty(notes = "显示顺序") + private Integer orderNum; + + @ApiModelProperty(notes = "父组织id") + private Long parentId; + + @ApiModelProperty(notes = "深度") + private String depth; + + @ApiModelProperty(notes = "状态(0:正常/1:停用)") + private String status; + +} diff --git a/common/src/main/java/com/yyy/common/core/domain/dto/UmsRoleDto.java b/common/src/main/java/com/yyy/common/core/domain/dto/UmsRoleDto.java new file mode 100644 index 0000000..12b29ef --- /dev/null +++ b/common/src/main/java/com/yyy/common/core/domain/dto/UmsRoleDto.java @@ -0,0 +1,44 @@ +package com.yyy.common.core.domain.dto; + +import java.io.Serializable; +import java.util.List; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.Builder; + +import javax.validation.constraints.NotBlank; + +@ApiModel("角色表(UmsRoleDto)传输数据类") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class UmsRoleDto implements Serializable { + private static final long serialVersionUID = 154065236903833980L; + + @ApiModelProperty("角色ID") + private Long roleId; + + @ApiModelProperty(notes = "角色名称", required = true) + @NotBlank(message = "角色名称不能为空") + private String roleName; + + @ApiModelProperty(notes = "角色权限字符串") + private String roleKey; + + @ApiModelProperty(notes = "角色状态(0:正常/1:停用)") + private String status; + + @ApiModelProperty("显示顺序") + private Integer roleSort; + + @ApiModelProperty("备注") + private String remark; + + @ApiModelProperty("菜单权限idList") + private List menuIdList; +} diff --git a/common/src/main/java/com/yyy/common/core/domain/dto/UmsUserAddDto.java b/common/src/main/java/com/yyy/common/core/domain/dto/UmsUserAddDto.java new file mode 100644 index 0000000..90da20c --- /dev/null +++ b/common/src/main/java/com/yyy/common/core/domain/dto/UmsUserAddDto.java @@ -0,0 +1,60 @@ +package com.yyy.common.core.domain.dto; + +import java.io.Serializable; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Pattern; + + +@ApiModel("用户表(UmsUserDto)传输数据类") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class UmsUserAddDto implements Serializable { + private static final long serialVersionUID = -65838283669796140L; + + @ApiModelProperty(notes = "主键") + private Long userId; + + @ApiModelProperty(notes = "账号名", required = true) + @NotBlank(message = "账号名不能为空") + private String loginName; + + @ApiModelProperty(notes = "姓名", required = true) + @NotBlank(message = "姓名不能为空") + private String userName; + + @ApiModelProperty(notes = "用户邮箱") + private String email; + + @ApiModelProperty(notes = "联系电话", required = true) + @NotBlank(message = "手机号码不能为空") + @Length(min = 11, max = 11, message = "手机号只能为11位") + @Pattern(regexp = "^[1][3,4,5,6,7,8,9][0-9]{9}$", message = "手机号格式有误") + private String phone; + + @ApiModelProperty(notes = "状态(0-在职 1-离职)") + private String status; + + @ApiModelProperty(notes = "密码") + private String password; + + @ApiModelProperty(notes = "用户性别(0-男 1-女 2-未知)") + private String sex; + + @ApiModelProperty(notes = "头像路径") + private String avatar; + + @ApiModelProperty(notes = "岗位id") + private Long organizationId; + + @ApiModelProperty(notes = "角色id") + private Long roleId; +} diff --git a/common/src/main/java/com/yyy/common/core/domain/dto/UmsUserKV.java b/common/src/main/java/com/yyy/common/core/domain/dto/UmsUserKV.java new file mode 100644 index 0000000..3d4b3ec --- /dev/null +++ b/common/src/main/java/com/yyy/common/core/domain/dto/UmsUserKV.java @@ -0,0 +1,18 @@ +package com.yyy.common.core.domain.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class UmsUserKV implements Serializable { + private static final long serialVersionUID = 1L; + + private Long userId; + + private String userName; +} diff --git a/common/src/main/java/com/yyy/common/core/domain/dto/UmsUserPasswordDto.java b/common/src/main/java/com/yyy/common/core/domain/dto/UmsUserPasswordDto.java new file mode 100644 index 0000000..fa86a31 --- /dev/null +++ b/common/src/main/java/com/yyy/common/core/domain/dto/UmsUserPasswordDto.java @@ -0,0 +1,33 @@ +package com.yyy.common.core.domain.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Pattern; +import java.io.Serializable; + + +@ApiModel("个人密码修改") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class UmsUserPasswordDto implements Serializable { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(notes = "旧密码", required = true) + @NotBlank(message = "旧密码不能为空") + private String oldPassword; + + @ApiModelProperty(notes = "新密码", required = true) + @NotBlank(message = "新密码不能为空") + private String newPassword; + + @ApiModelProperty(notes = "确认密码", required = true) + @NotBlank(message = "确认密码不能为空") + private String checkPassword; +} diff --git a/common/src/main/java/com/yyy/common/core/domain/dto/UmsUserQueryDto.java b/common/src/main/java/com/yyy/common/core/domain/dto/UmsUserQueryDto.java new file mode 100644 index 0000000..f4c6272 --- /dev/null +++ b/common/src/main/java/com/yyy/common/core/domain/dto/UmsUserQueryDto.java @@ -0,0 +1,46 @@ +package com.yyy.common.core.domain.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * @Author: fy + * @Date: 2024/04/02 + * @Description: + */ +@ApiModel("用户查询") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class UmsUserQueryDto implements Serializable { + private static final long serialVersionUID = -65838283669796140L; + + @ApiModelProperty(notes = "账号名") + private String loginName; + + @ApiModelProperty(notes = "姓名") + private String userName; + + @ApiModelProperty(notes = "联系电话") + private String phone; + + @ApiModelProperty(notes = "状态(0-在职 1-离职)") + private String status; + + @ApiModelProperty(notes = "用户性别(0-男 1-女 2-未知)") + private String sex; + + @ApiModelProperty(notes = "公司/部门/岗位id") + private Long organizationId; + + @ApiModelProperty(notes = "角色id") + private Long roleId; + + @ApiModelProperty(notes = "查询公司/部门下所有的人员信息") + private boolean tree = false; +} diff --git a/common/src/main/java/com/yyy/common/core/domain/dto/UmsUserSelfDto.java b/common/src/main/java/com/yyy/common/core/domain/dto/UmsUserSelfDto.java new file mode 100644 index 0000000..ccfd611 --- /dev/null +++ b/common/src/main/java/com/yyy/common/core/domain/dto/UmsUserSelfDto.java @@ -0,0 +1,39 @@ +package com.yyy.common.core.domain.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Pattern; +import java.io.Serializable; + + +@ApiModel("个人基本信息修改") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class UmsUserSelfDto implements Serializable { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(notes = "姓名", required = true) + @NotBlank(message = "姓名不能为空") + private String userName; + + @ApiModelProperty(notes = "用户邮箱") + private String email; + + @ApiModelProperty(notes = "联系电话") + @Length(min = 11, max = 11, message = "手机号只能为11位") + @Pattern(regexp = "^[1][3,4,5,6,7,8,9][0-9]{9}$", message = "手机号格式有误") + private String phone; + + @ApiModelProperty(notes = "用户性别(0-男 1-女 2-未知)") + private String sex; + + @ApiModelProperty(notes = "头像路径") + private String avatar; +} diff --git a/common/src/main/java/com/yyy/common/core/domain/entity/SysDictData.java b/common/src/main/java/com/yyy/common/core/domain/entity/SysDictData.java new file mode 100644 index 0000000..cad466d --- /dev/null +++ b/common/src/main/java/com/yyy/common/core/domain/entity/SysDictData.java @@ -0,0 +1,233 @@ +package com.yyy.common.core.domain.entity; + + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.yyy.common.annotation.excel.Excel; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +import java.util.Date; + +/** + * 字典数据 sys_dict_data + */ +public class SysDictData +{ + private static final long serialVersionUID = 1L; + + /** 字典编码 */ + @Excel(name = "字典编码", cellType = Excel.ColumnType.NUMERIC) + private Long dictCode; + + /** 字典排序 */ + @Excel(name = "字典排序", cellType = Excel.ColumnType.NUMERIC) + private Long dictSort; + + /** 字典标签 */ + @Excel(name = "字典标签") + private String dictLabel; + + /** 字典键值 */ + @Excel(name = "字典键值") + private String dictValue; + + /** 字典类型 */ + @Excel(name = "字典类型") + private String dictType; + + /** 样式属性(其他样式扩展) */ + private String cssClass; + + /** 表格字典样式 */ + private String listClass; + + /** 是否默认(Y是 N否) */ + @Excel(name = "是否默认", readConverterExp = "Y=是,N=否") + private String isDefault; + + /** 状态(0正常 1停用) */ + @Excel(name = "状态", readConverterExp = "0=正常,1=停用") + private String status; + + /** 创建者 */ + private String createBy; + + /** 创建时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + + /** 更新者 */ + private String updateBy; + + /** 更新时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date updateTime; + + /** 备注 */ + private String remark; + + public Long getDictCode() + { + return dictCode; + } + + public void setDictCode(Long dictCode) + { + this.dictCode = dictCode; + } + + public Long getDictSort() + { + return dictSort; + } + + public void setDictSort(Long dictSort) + { + this.dictSort = dictSort; + } + + @NotBlank(message = "字典标签不能为空") + @Size(min = 0, max = 100, message = "字典标签长度不能超过100个字符") + public String getDictLabel() + { + return dictLabel; + } + + public void setDictLabel(String dictLabel) + { + this.dictLabel = dictLabel; + } + + @NotBlank(message = "字典键值不能为空") + @Size(min = 0, max = 100, message = "字典键值长度不能超过100个字符") + public String getDictValue() + { + return dictValue; + } + + public void setDictValue(String dictValue) + { + this.dictValue = dictValue; + } + + @NotBlank(message = "字典类型不能为空") + @Size(min = 0, max = 100, message = "字典类型长度不能超过100个字符") + public String getDictType() + { + return dictType; + } + + public void setDictType(String dictType) + { + this.dictType = dictType; + } + + @Size(min = 0, max = 100, message = "样式属性长度不能超过100个字符") + public String getCssClass() + { + return cssClass; + } + + public void setCssClass(String cssClass) + { + this.cssClass = cssClass; + } + + public String getListClass() + { + return listClass; + } + + public void setListClass(String listClass) + { + this.listClass = listClass; + } + +// public boolean getDefault() +// { +// return UserConstants.YES.equals(this.isDefault); +// } + + public String getIsDefault() + { + return isDefault; + } + + public void setIsDefault(String isDefault) + { + this.isDefault = isDefault; + } + + public String getStatus() + { + return status; + } + + public void setStatus(String status) + { + this.status = status; + } + + public String getCreateBy() { + return createBy; + } + + public void setCreateBy(String createBy) { + this.createBy = createBy; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public String getUpdateBy() { + return updateBy; + } + + public void setUpdateBy(String updateBy) { + this.updateBy = updateBy; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("dictCode", getDictCode()) + .append("dictSort", getDictSort()) + .append("dictLabel", getDictLabel()) + .append("dictValue", getDictValue()) + .append("dictType", getDictType()) + .append("cssClass", getCssClass()) + .append("listClass", getListClass()) + .append("isDefault", getIsDefault()) + .append("status", getStatus()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} \ No newline at end of file diff --git a/common/src/main/java/com/yyy/common/core/domain/entity/UmsMenu.java b/common/src/main/java/com/yyy/common/core/domain/entity/UmsMenu.java new file mode 100644 index 0000000..c79b464 --- /dev/null +++ b/common/src/main/java/com/yyy/common/core/domain/entity/UmsMenu.java @@ -0,0 +1,118 @@ +package com.yyy.common.core.domain.entity; + +import java.util.Date; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.*; +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 菜单表(UmsMenu)表实体类 + * + * @author Fangy + * @since 2024-03-25 15:50:12 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@TableName(value = "ums_menu") +public class UmsMenu { + private static final long serialVersionUID = -97647718306147532L; + + /** + * 菜单ID(主键) + */ + @JsonIgnore + @TableId(value = "menu_id", type = IdType.AUTO) + private Long menuId; + + /** + * 菜单名称 + */ + @TableField("menu_name") + private String menuName; + + /** + * 父主键ID + */ + @TableField("parent_id") + private Long parentId; + + /** + * 排序 + */ + @TableField("sort") + private Integer sort; + + /** + * 请求路径 + */ + @TableField("url") + private String url; + + /** + * 菜单类型(M目录 C菜单 F按钮) + */ + @TableField("menu_type") + private String menuType; + + /** + * 菜单状态(1隐藏 0显示) + */ + @TableField("visible") + private String visible; + + /** + * 权限标识 + */ + @TableField("permission") + private String permission; + + /** + * 菜单图标 + */ + @TableField("icon") + private String icon; + + /** + * 创建人 + */ + @TableField("create_user") + private Long createUser; + + /** + * 创建时间 + */ + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + /** + * 修改人 + */ + @TableField("update_user") + private Long updateUser; + + /** + * 修改时间 + */ + + @JsonIgnore + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime; + + /** + * 是否删除(0:正常/1:删除) + */ + @TableField("is_deleted") + private Object isDeleted; + + /** + * 备注 + */ + @TableField("remark") + private String remark; +} diff --git a/common/src/main/java/com/yyy/common/core/domain/entity/UmsOrganization.java b/common/src/main/java/com/yyy/common/core/domain/entity/UmsOrganization.java new file mode 100644 index 0000000..f0729ad --- /dev/null +++ b/common/src/main/java/com/yyy/common/core/domain/entity/UmsOrganization.java @@ -0,0 +1,100 @@ +package com.yyy.common.core.domain.entity; + +import java.util.Date; + +import lombok.*; +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; + +/** + * 组织信息表(UmsOrganization)表实体类 + * + * @author Fangy + * @since 2024-04-03 09:47:07 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@TableName(value = "ums_organization") +public class UmsOrganization { + private static final long serialVersionUID = -27479820178077875L; + + /** + * 组织ID(主键) + */ + @JsonIgnore + @TableId(value = "organization_id", type = IdType.AUTO) + private Long organizationId; + + /** + * 组织名称 + */ + @TableField("organization_name") + private String organizationName; + + /** + * 组织类型(0:公司/1:部门/2:岗位) + */ + @TableField("organization_type") + private String organizationType; + + /** + * 显示顺序 + */ + @TableField("order_num") + private Integer orderNum; + + /** + * 父组织id + */ + @TableField("parent_id") + private Long parentId; + + /** + * 深度 + */ + @TableField("depth") + private String depth; + + /** + * 状态(0:正常/1:停用) + */ + @TableField("status") + private String status; + + /** + * 是否删除有效(0:正常/1:删除有效) + */ + @TableField("is_deleted") + private String isDeleted; + + /** + * 创建人 + */ + @TableField("create_user") + private Long createUser; + + /** + * 创建时间 + */ + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + /** + * 修改人 + */ + @TableField("update_user") + private Long updateUser; + + /** + * 修改时间 + */ + + @JsonIgnore + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime; +} diff --git a/common/src/main/java/com/yyy/common/core/domain/entity/UmsRole.java b/common/src/main/java/com/yyy/common/core/domain/entity/UmsRole.java new file mode 100644 index 0000000..e2a2c08 --- /dev/null +++ b/common/src/main/java/com/yyy/common/core/domain/entity/UmsRole.java @@ -0,0 +1,104 @@ +package com.yyy.common.core.domain.entity; + +import java.util.Date; +import java.util.List; + +import lombok.*; +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; + +/** + * 角色表(UmsRole)表实体类 + * + * @author Fangy + * @since 2024-04-03 16:14:03 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@TableName(value = "ums_role") +public class UmsRole { + private static final long serialVersionUID = -51781180838006152L; + + /** + * 角色ID(主键) + */ + @JsonIgnore + @TableId(value = "role_id", type = IdType.AUTO) + private Long roleId; + + /** + * 角色名称 + */ + @TableField("role_name") + private String roleName; + + /** + * 角色权限字符串 + */ + @TableField("role_key") + private String roleKey; + + /** + * 显示顺序 + */ + @TableField("role_sort") + private Integer roleSort; + + /** + * 数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限) + */ + @TableField("data_scope") + private String dataScope; + + /** + * 角色状态(0:正常/1:停用) + */ + @TableField("status") + private String status; + + /** + * 是否删除(0:正常/1:删除) + */ + @TableField("is_deleted") + private String isDeleted; + + /** + * 创建人 + */ + @TableField("create_user") + private Long createUser; + + /** + * 创建时间 + */ + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + /** + * 修改人 + */ + @TableField("update_user") + private Long updateUser; + + /** + * 修改时间 + */ + + @JsonIgnore + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime; + + /** + * 备注 + */ + @TableField("remark") + private String remark; + + @TableField(exist = false) + private List _menus; +} diff --git a/common/src/main/java/com/yyy/common/core/domain/entity/UmsRoleMenu.java b/common/src/main/java/com/yyy/common/core/domain/entity/UmsRoleMenu.java new file mode 100644 index 0000000..4adc75c --- /dev/null +++ b/common/src/main/java/com/yyy/common/core/domain/entity/UmsRoleMenu.java @@ -0,0 +1,34 @@ +package com.yyy.common.core.domain.entity; + +import lombok.*; +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; + +/** + * 角色权限关联表(UmsRoleMenu)表实体类 + * + * @author Fangy + * @since 2024-04-12 20:42:25 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@TableName(value = "ums_role_menu") +public class UmsRoleMenu { + private static final long serialVersionUID = 686031140857580486L; + + + /** + * 角色ID(主键) + */ + @TableField("role_id") + private Long roleId; + + /** + * 菜单ID(主键) + */ + @TableField("menu_id") + private Long menuId; +} diff --git a/common/src/main/java/com/yyy/common/core/domain/entity/UmsUser.java b/common/src/main/java/com/yyy/common/core/domain/entity/UmsUser.java new file mode 100644 index 0000000..dde662f --- /dev/null +++ b/common/src/main/java/com/yyy/common/core/domain/entity/UmsUser.java @@ -0,0 +1,177 @@ +package com.yyy.common.core.domain.entity; + +import java.util.Date; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.yyy.common.annotation.excel.Excel; +import com.yyy.common.annotation.excel.Excels; +import lombok.*; +import com.baomidou.mybatisplus.annotation.*; + +/** + * 用户表(UmsUser)表实体类 + * + * @author Fangy + * @since 2024-03-22 17:47:19 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@TableName(value = "ums_user") +public class UmsUser { + private static final long serialVersionUID = -73936105573664937L; + + /** + * 用户ID(主键) + */ + @JsonIgnore + @TableId(value = "user_id", type = IdType.AUTO) + @Excel(name = "用户序号", cellType = Excel.ColumnType.NUMERIC, prompt = "用户编号") + private Long userId; + + /** + * 登录账号 + */ + @TableField("login_name") + @Excel(name = "登录账号") + private String loginName; + + /** + * 用户昵称 + */ + @TableField("user_name") + @Excel(name = "用户名称") + private String userName; + + /** + * 用户邮箱 + */ + @Excel(name = "用户邮箱") + @TableField("email") + private String email; + + /** + * 联系电话 + */ + @TableField("phone") + @Excel(name = "联系电话") + private String phone; + + /** + * 密码 + */ + @TableField("password") + private String password; + + /** + * 盐加密 + */ + @TableField("salt") + private String salt; + + /** + * 状态(0:正常/1:停用) + */ + @TableField("status") + @Excel(name = "帐号状态", readConverterExp = "0=正常,1=停用") + private String status; + + /** + * 是否删除(0:正常/1:删除) + */ + @TableField("is_deleted") + private Integer isDeleted; + + /** + * 最后登录IP + */ + @TableField("login_ip") + private String loginIp; + + /** + * 最后登录时间 + */ + @TableField("login_date") + private Date loginDate; + + /** + * 密码最后更新时间 + */ + @TableField("pwd_update_date") + private Date pwdUpdateDate; + + /** + * 创建人 + */ + @TableField("create_user") + private Long createUser; + + /** + * 创建时间 + */ + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + /** + * 修改人 + */ + @TableField("update_user") + private Long updateUser; + + /** + * 修改时间 + */ + + @JsonIgnore + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime; + + /** + * 备注 + */ + @Excel(name = "备注") + @TableField("remark") + private String remark; + + /** + * 用户性别(0-男 1-女 2-未知) + */ + @Excel(name = "用户性别", readConverterExp = "0=男,1=女,2=未知") + @TableField("sex") + private String sex; + + /** + * 头像路径 + */ + @TableField("avatar") + private String avatar; + + /** + * 部门对象 + */ + @Excels({ + @Excel(name = "部门id", targetAttr = "organizationId", type = Excel.Type.EXPORT), + @Excel(name = "部门名称", targetAttr = "organizationName", type = Excel.Type.EXPORT) + }) + @TableField(exist = false) + private UmsOrganization _umsOrganization; + + @Excels({ + @Excel(name = "角色id", targetAttr = "roleId", type = Excel.Type.EXPORT), + @Excel(name = "角色名称", targetAttr = "roleName", type = Excel.Type.EXPORT) + }) + @TableField(exist = false) + private UmsRole _umsRole; + + public boolean isAdmin() { + return isAdmin(this.userId); + } + + public static boolean isAdmin(Long userId) { + return userId != null && 1L == userId; + } +} diff --git a/common/src/main/java/com/yyy/common/core/domain/entity/UmsUserOrganization.java b/common/src/main/java/com/yyy/common/core/domain/entity/UmsUserOrganization.java new file mode 100644 index 0000000..6adb25b --- /dev/null +++ b/common/src/main/java/com/yyy/common/core/domain/entity/UmsUserOrganization.java @@ -0,0 +1,34 @@ +package com.yyy.common.core.domain.entity; + +import lombok.*; +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; + +/** + * 组织信息关联表(UmsUserOrganization)表实体类 + * + * @author Fangy + * @since 2024-04-03 14:51:55 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@TableName(value = "ums_user_organization") +public class UmsUserOrganization { + private static final long serialVersionUID = 453006522982935793L; + + + /** + * 组织ID(主键) + */ + @JsonIgnore + private Long organizationId; + + /** + * 员工ID(主键) + */ + @JsonIgnore + private Long userId; +} diff --git a/common/src/main/java/com/yyy/common/core/domain/entity/UmsUserRole.java b/common/src/main/java/com/yyy/common/core/domain/entity/UmsUserRole.java new file mode 100644 index 0000000..81371dc --- /dev/null +++ b/common/src/main/java/com/yyy/common/core/domain/entity/UmsUserRole.java @@ -0,0 +1,34 @@ +package com.yyy.common.core.domain.entity; + +import lombok.*; +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; + +/** + * 用户角色关联表(UmsUserRole)表实体类 + * + * @author Fangy + * @since 2024-04-03 15:06:35 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@TableName(value = "ums_user_role") +public class UmsUserRole { + private static final long serialVersionUID = 767125177028822730L; + + + /** + * 用户ID(主键) + */ + @JsonIgnore + private Long userId; + + /** + * 角色ID(主键) + */ + @JsonIgnore + private Long roleId; +} diff --git a/common/src/main/java/com/yyy/common/core/domain/vo/LoginVo.java b/common/src/main/java/com/yyy/common/core/domain/vo/LoginVo.java new file mode 100644 index 0000000..af6b947 --- /dev/null +++ b/common/src/main/java/com/yyy/common/core/domain/vo/LoginVo.java @@ -0,0 +1,47 @@ +package com.yyy.common.core.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Set; + +/** + * @Author: fy + * @Date: 2024/04/03 + * @Description: + */ +@ApiModel("登陆成功返回信息") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class LoginVo { + + @ApiModelProperty("登录账号") + private String loginName; + + @ApiModelProperty("用户名称") + private String userName; + + @ApiModelProperty("用户头像地址") + private String avatar; + + @ApiModelProperty("手机号") + private String phone; + + @ApiModelProperty("邮箱") + private String email; + + @ApiModelProperty("Token信息") + private String Authorization; + + @ApiModelProperty("角色keySet") + private Set roles; + + @ApiModelProperty("权限标识Set") + private Set permissions; +} diff --git a/common/src/main/java/com/yyy/common/core/domain/vo/UmsMenuVo.java b/common/src/main/java/com/yyy/common/core/domain/vo/UmsMenuVo.java new file mode 100644 index 0000000..4e58ee6 --- /dev/null +++ b/common/src/main/java/com/yyy/common/core/domain/vo/UmsMenuVo.java @@ -0,0 +1,68 @@ +package com.yyy.common.core.domain.vo; + +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +import com.yyy.common.core.domain.entity.UmsMenu; +import com.yyy.common.utils.bean.BeanUtils; +import lombok.Data; +import lombok.Builder; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * 菜单表(UmsMenu)视图数据类 + * + * @author Fangy + * @since 2024-04-03 17:18:31 + */ +@ApiModel("UmsMenuVo菜单表视图数据类") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class UmsMenuVo { + + @ApiModelProperty("菜单ID") + private Long menuId; + + @ApiModelProperty("菜单名称") + private String menuName; + + @ApiModelProperty("父主键ID") + private Long parentId; + + @ApiModelProperty("排序") + private Integer sort; + + @ApiModelProperty("请求路径") + private String url; + + @ApiModelProperty("菜单类型(M目录 C菜单 F按钮)") + private String menuType; + + @ApiModelProperty("菜单状态(1隐藏 0显示)") + private String visible; + + @ApiModelProperty("权限标识") + private String permission; + + @ApiModelProperty("菜单图标") + private String icon; + + @ApiModelProperty("备注") + private String remark; + + public static UmsMenuVo ToVo(UmsMenu umsMenu) { + UmsMenuVo umsMenuVo = new UmsMenuVo(); + BeanUtils.copyProperties(umsMenu, umsMenuVo); + return umsMenuVo; + } + + public static List ToVo(List umsMenus) { + return umsMenus.stream().map(UmsMenuVo::ToVo).collect(Collectors.toList()); + } +} diff --git a/common/src/main/java/com/yyy/common/core/domain/vo/UmsOrganizationVo.java b/common/src/main/java/com/yyy/common/core/domain/vo/UmsOrganizationVo.java new file mode 100644 index 0000000..064cfc6 --- /dev/null +++ b/common/src/main/java/com/yyy/common/core/domain/vo/UmsOrganizationVo.java @@ -0,0 +1,52 @@ +package com.yyy.common.core.domain.vo; + +import java.util.List; +import java.util.stream.Collectors; + +import com.yyy.common.core.domain.entity.UmsOrganization; +import com.yyy.common.utils.bean.BeanUtils; +import lombok.Data; +import lombok.Builder; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * 组织信息表(UmsOrganization)视图数据类 + * + * @author Fangy + * @since 2024-04-03 09:47:09 + */ +@ApiModel("UmsOrganizationVo组织信息表视图数据类") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class UmsOrganizationVo { + + @ApiModelProperty("组织ID") + private Long organizationId; + @ApiModelProperty("组织名称") + private String organizationName; + @ApiModelProperty("组织类型(0:公司/1:部门/2:岗位)") + private String organizationType; + @ApiModelProperty("显示顺序") + private Integer orderNum; + @ApiModelProperty("父组织id") + private Long parentId; + @ApiModelProperty("深度") + private String depth; + @ApiModelProperty("状态(0:正常/1:停用)") + private String status; + + public static UmsOrganizationVo ToVo(UmsOrganization umsOrganization) { + UmsOrganizationVo umsOrganizationVo = new UmsOrganizationVo(); + BeanUtils.copyProperties(umsOrganization, umsOrganizationVo); + return umsOrganizationVo; + } + + public static List ToVo(List umsOrganizations) { + return umsOrganizations.stream().map(UmsOrganizationVo::ToVo).collect(Collectors.toList()); + } +} diff --git a/common/src/main/java/com/yyy/common/core/domain/vo/UmsRoleVo.java b/common/src/main/java/com/yyy/common/core/domain/vo/UmsRoleVo.java new file mode 100644 index 0000000..7f2757e --- /dev/null +++ b/common/src/main/java/com/yyy/common/core/domain/vo/UmsRoleVo.java @@ -0,0 +1,60 @@ +package com.yyy.common.core.domain.vo; + +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +import com.yyy.common.core.domain.entity.UmsMenu; +import com.yyy.common.core.domain.entity.UmsRole; +import com.yyy.common.utils.bean.BeanUtils; +import lombok.Data; +import lombok.Builder; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * 角色表(UmsRole)视图数据类 + * + * @author Fangy + * @since 2024-04-03 16:33:28 + */ +@ApiModel("UmsRoleVo角色表视图数据类") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class UmsRoleVo { + + @ApiModelProperty("角色ID") + private Long roleId; + + @ApiModelProperty("角色名称") + private String roleName; + + @ApiModelProperty("角色权限字符串") + private String roleKey; + + @ApiModelProperty("显示顺序") + private Integer roleSort; + + @ApiModelProperty("角色状态(0:正常/1:停用)") + private String status; + + @ApiModelProperty("备注") + private String remark; + + @ApiModelProperty("菜单权限") + private List _menus; + + public static UmsRoleVo ToVo(UmsRole umsRole) { + UmsRoleVo umsRoleVo = new UmsRoleVo(); + BeanUtils.copyProperties(umsRole, umsRoleVo); + return umsRoleVo; + } + + public static List ToVo(List umsRoles) { + return umsRoles.stream().map(UmsRoleVo::ToVo).collect(Collectors.toList()); + } +} diff --git a/common/src/main/java/com/yyy/common/core/domain/vo/UmsUserVo.java b/common/src/main/java/com/yyy/common/core/domain/vo/UmsUserVo.java new file mode 100644 index 0000000..1973c4f --- /dev/null +++ b/common/src/main/java/com/yyy/common/core/domain/vo/UmsUserVo.java @@ -0,0 +1,69 @@ +package com.yyy.common.core.domain.vo; + +import com.yyy.common.core.domain.entity.UmsOrganization; +import com.yyy.common.core.domain.entity.UmsRole; +import com.yyy.common.core.domain.entity.UmsUser; +import com.yyy.common.utils.bean.BeanUtils; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Builder; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * 用户表(UmsUser)视图数据类 + * + * @author Fangy + * @since 2024-03-25 11:07:54 + */ +@ApiModel("用户表(UmsUser)视图数据类") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class UmsUserVo { + + @ApiModelProperty("用户ID(主键)") + private Long userId; + + @ApiModelProperty("用户昵称") + private String userName; + + @ApiModelProperty("登录账号") + private String loginName; + + @ApiModelProperty("用户邮箱") + private String email; + + @ApiModelProperty("联系电话") + private String phone; + + @ApiModelProperty("状态(0-在职 1-离职)") + private String status; + + @ApiModelProperty("用户性别(0-男 1-女 2-未知)") + private String sex; + + @ApiModelProperty("头像路径") + private String avatar; + + @ApiModelProperty("岗位信息") + private UmsOrganization _umsOrganization; + + @ApiModelProperty("角色信息") + private UmsRole _umsRole; + + public static UmsUserVo ToVo(UmsUser umsUser) { + UmsUserVo umsUserVo = new UmsUserVo(); + BeanUtils.copyProperties(umsUser,umsUserVo); + return umsUserVo; + } + + public static List ToVo(List umsUsers) { + return umsUsers.stream().map(UmsUserVo::ToVo).collect(Collectors.toList()); + } +} diff --git a/common/src/main/java/com/yyy/common/core/page/PageDomain.java b/common/src/main/java/com/yyy/common/core/page/PageDomain.java new file mode 100644 index 0000000..4bf8409 --- /dev/null +++ b/common/src/main/java/com/yyy/common/core/page/PageDomain.java @@ -0,0 +1,89 @@ +package com.yyy.common.core.page; + +import com.yyy.common.utils.common.StringUtils; + +/** + * @Author: fy + * @Date: 2024/03/22 + * @Description:分页数据 + */ +public class PageDomain +{ + /** 当前记录起始索引 */ + private Integer pageNum; + + /** 每页显示记录数 */ + private Integer pageSize; + + /** 排序列 */ + private String orderByColumn; + + /** 排序的方向desc或者asc */ + private String isAsc = "asc"; + + /** 分页参数合理化 */ + private Boolean reasonable = true; + + public String getOrderBy() + { + if (StringUtils.isEmpty(orderByColumn)) + { + return ""; + } + return StringUtils.toUnderScoreCase(orderByColumn) + " " + isAsc; + } + + public Integer getPageNum() + { + return pageNum; + } + + public void setPageNum(Integer pageNum) + { + this.pageNum = pageNum; + } + + public Integer getPageSize() + { + return pageSize; + } + + public void setPageSize(Integer pageSize) + { + this.pageSize = pageSize; + } + + public String getOrderByColumn() + { + return orderByColumn; + } + + public void setOrderByColumn(String orderByColumn) + { + this.orderByColumn = orderByColumn; + } + + public String getIsAsc() + { + return isAsc; + } + + public void setIsAsc(String isAsc) + { + this.isAsc = isAsc; + } + + public Boolean getReasonable() + { + if (StringUtils.isNull(reasonable)) + { + return Boolean.TRUE; + } + return reasonable; + } + + public void setReasonable(Boolean reasonable) + { + this.reasonable = reasonable; + } +} \ No newline at end of file diff --git a/common/src/main/java/com/yyy/common/core/page/TableDataInfo.java b/common/src/main/java/com/yyy/common/core/page/TableDataInfo.java new file mode 100644 index 0000000..7e525c1 --- /dev/null +++ b/common/src/main/java/com/yyy/common/core/page/TableDataInfo.java @@ -0,0 +1,85 @@ +package com.yyy.common.core.page; + +import java.io.Serializable; +import java.util.List; + +/** + * @Author: fy + * @Date: 2024/03/22 + * @Description:表格分页数据对象 + */ +public class TableDataInfo implements Serializable +{ + private static final long serialVersionUID = 1L; + + /** 总记录数 */ + private long total; + + /** 列表数据 */ + private List rows; + + /** 消息状态码 */ + private int code; + + /** 消息内容 */ + private String msg; + + /** + * 表格数据对象 + */ + public TableDataInfo() + { + } + + /** + * 分页 + * + * @param list 列表数据 + * @param total 总记录数 + */ + public TableDataInfo(List list, int total) + { + this.rows = list; + this.total = total; + } + + public long getTotal() + { + return total; + } + + public void setTotal(long total) + { + this.total = total; + } + + public List getRows() + { + return rows; + } + + public void setRows(List rows) + { + this.rows = rows; + } + + public int getCode() + { + return code; + } + + public void setCode(int code) + { + this.code = code; + } + + public String getMsg() + { + return msg; + } + + public void setMsg(String msg) + { + this.msg = msg; + } +} \ No newline at end of file diff --git a/common/src/main/java/com/yyy/common/core/page/TableSupport.java b/common/src/main/java/com/yyy/common/core/page/TableSupport.java new file mode 100644 index 0000000..fbe2e8f --- /dev/null +++ b/common/src/main/java/com/yyy/common/core/page/TableSupport.java @@ -0,0 +1,56 @@ +package com.yyy.common.core.page; + +import com.yyy.common.core.text.Convert; +import com.yyy.common.utils.common.ServletUtils; + +/** + * @Author: fy + * @Date: 2024/03/22 + * @Description:表格数据处理 + */ +public class TableSupport +{ + /** + * 当前记录起始索引 + */ + public static final String PAGE_NUM = "pageNum"; + + /** + * 每页显示记录数 + */ + public static final String PAGE_SIZE = "pageSize"; + + /** + * 排序列 + */ + public static final String ORDER_BY_COLUMN = "orderByColumn"; + + /** + * 排序的方向 "desc" 或者 "asc". + */ + public static final String IS_ASC = "isAsc"; + + /** + * 分页参数合理化 + */ + public static final String REASONABLE = "reasonable"; + + /** + * 封装分页对象 + */ + public static PageDomain getPageDomain() + { + PageDomain pageDomain = new PageDomain(); + pageDomain.setPageNum(Convert.toInt(ServletUtils.getParameter(PAGE_NUM), 1)); + pageDomain.setPageSize(Convert.toInt(ServletUtils.getParameter(PAGE_SIZE), 10)); + pageDomain.setOrderByColumn(ServletUtils.getParameter(ORDER_BY_COLUMN)); + pageDomain.setIsAsc(ServletUtils.getParameter(IS_ASC)); + pageDomain.setReasonable(ServletUtils.getParameterToBool(REASONABLE)); + return pageDomain; + } + + public static PageDomain buildPageRequest() + { + return getPageDomain(); + } +} diff --git a/common/src/main/java/com/yyy/common/core/qr/PdfCellUtill.java b/common/src/main/java/com/yyy/common/core/qr/PdfCellUtill.java new file mode 100644 index 0000000..5ab7feb --- /dev/null +++ b/common/src/main/java/com/yyy/common/core/qr/PdfCellUtill.java @@ -0,0 +1,118 @@ +package com.yyy.common.core.qr; + +import com.itextpdf.text.Font; +import com.itextpdf.text.Paragraph; +import com.itextpdf.text.Phrase; +import com.itextpdf.text.pdf.PdfPCell; +/** + * @Author: fy + * @Date: 2024/03/19 + * @Description:二维码生成工具 + */ +public class PdfCellUtill { + private static PdfPCell pdfCell; + /** + * 创建PdfCell + * @param content 内容文本(短语) + * @param font 字体 + * @return 返回PdfCell + */ + public static PdfPCell createCell(String content,Font font){ + pdfCell = new PdfPCell(new Phrase(content, font)); + pdfCell.setHorizontalAlignment(PdfPCell.ALIGN_CENTER); + pdfCell.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE); + pdfCell.setBorder(0); + return pdfCell; + } + /** + * + * 创建PdfCell + * @param content 内容文本(短语) + * @param font 字体 + * @param horizontalAlignment 水平位置对齐 + * @param verticalAlignment 垂直位置对齐 + * @return 返回PdfCell + */ + public static PdfPCell createCell(String content,Font font,int horizontalAlignment,int verticalAlignment){ + pdfCell = new PdfPCell(new Phrase(content, font)); + pdfCell.setHorizontalAlignment(horizontalAlignment); + pdfCell.setVerticalAlignment(verticalAlignment); + pdfCell.setBorder(0); + return pdfCell; + } + /** + * + * 创建PdfCell + * @param content 内容文本(短语) + * @param font 字体 + * @param horizontalAlignment 水平位置对齐 + * @param verticalAlignment 垂直位置对齐 + * @param colspan 合并列数 + * @param rowspan 合并行数 + * @return 返回PdfCell + */ + public static PdfPCell createCell(String content,Font font,int horizontalAlignment,int verticalAlignment ,int colspan,int rowspan){ + pdfCell = new PdfPCell(new Phrase(content, font)); + pdfCell.setHorizontalAlignment(horizontalAlignment); + pdfCell.setVerticalAlignment(verticalAlignment); + if(colspan>0){ + pdfCell.setColspan(colspan); + } + if(rowspan>0){ + pdfCell.setRowspan(rowspan); + } + pdfCell.setBorder(0); + return pdfCell; + } + /** + * + * @param content 内容文本(段落) + * @param font 字体 + * @return 返回PdfCell + */ + public static PdfPCell createCellParagraph(String content,Font font){ + pdfCell = new PdfPCell(new Paragraph(content, font)); + pdfCell.setHorizontalAlignment(PdfPCell.ALIGN_CENTER); + pdfCell.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE); + pdfCell.setBorder(0); + return pdfCell; + } + /** + * + * @param content 内容文本(段落) + * @param font 字体 + * @param horizontalAlignment 水平对齐 + * @param verticalAlignment 垂直位置对齐 + * @return 返回PdfCell + */ + public static PdfPCell createCellParagraph(String content,Font font,int horizontalAlignment,int verticalAlignment){ + pdfCell = new PdfPCell(new Paragraph(content, font)); + pdfCell.setHorizontalAlignment(horizontalAlignment); + pdfCell.setVerticalAlignment(verticalAlignment); + pdfCell.setBorder(0); + return pdfCell; + } + /** + * + * @param content 内容文本(段落) + * @param font 字体 + * @param horizontalAlignment 水平对齐 + * @param verticalAlignment 垂直位置对齐 + * @param colspan 合并列数 + * @param rowspan 合并行数 + * @return 返回PdfCell + */ + public static PdfPCell createCellParagraph(String content,Font font,int horizontalAlignment,int verticalAlignment,int colspan,int rowspan){ + pdfCell = new PdfPCell(new Paragraph(content, font)); + pdfCell.setHorizontalAlignment(horizontalAlignment); + pdfCell.setVerticalAlignment(verticalAlignment); + if(colspan>0){ + pdfCell.setColspan(colspan); + } + if(rowspan>0){ + pdfCell.setRowspan(rowspan); + } + pdfCell.setBorder(0); + return pdfCell; + } +} diff --git a/common/src/main/java/com/yyy/common/core/qr/QrCodeManageAction.java b/common/src/main/java/com/yyy/common/core/qr/QrCodeManageAction.java new file mode 100644 index 0000000..0485446 --- /dev/null +++ b/common/src/main/java/com/yyy/common/core/qr/QrCodeManageAction.java @@ -0,0 +1,196 @@ +package com.yyy.common.core.qr; + +import cn.hutool.extra.qrcode.QrCodeUtil; +import cn.hutool.extra.qrcode.QrConfig; +import com.itextpdf.text.*; +import com.itextpdf.text.pdf.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.OutputStream; +import java.net.MalformedURLException; + +/** + * @Author: fy + * @Date: 2024/03/19 + * @Description: + */ +@Component +public class QrCodeManageAction { + @Autowired + private QrConfig config; + + @Value("${app.profile}") + private String path; + + @Value("${qr.ttf}") + private String ttf; + + + /** + * 预览二维码信息,并可批量打印 + * + * @return + */ + public void printQr(String name, String code, String date, String organization, HttpServletResponse response) { + + response.setContentType("application/pdf"); + try { + response.setHeader("content-disposition", "filename=" + code + ".pdf"); + OutputStream out = response.getOutputStream(); + float[] rectSize = {4, 1, 4, 2}; + printQrInfo(out, rectSize, name, code, date, organization); + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * 预览、打印二维码pdf + */ + public void printQrInfo(OutputStream out, float[] rectSize, String name, String code, String date, String organization) throws IOException, DocumentException { + + // SIMHEI.TTF 文件字体文件,可下载至本地 ,此处更改为相应本地地址 + BaseFont bfChinese = BaseFont.createFont(path + ttf, BaseFont.IDENTITY_H, BaseFont.EMBEDDED); + Rectangle rect = new Rectangle(170F, 85.0F);// A4纸张 + rect.setBackgroundColor(BaseColor.WHITE); + //方正小标送简 常规 -标签标题 + BaseFont bfChinese1 = BaseFont.createFont(path + ttf, BaseFont.IDENTITY_H, BaseFont.EMBEDDED); + + Font song22 = new Font(bfChinese1, 8, Font.BOLD); + + BaseFont bfChinese2 = BaseFont.createFont(path + ttf, BaseFont.IDENTITY_H, BaseFont.EMBEDDED); + Font fang16 = new Font(bfChinese2, 6, Font.BOLD); + BaseFont bfChinese3 = BaseFont.createFont(path + ttf, BaseFont.IDENTITY_H, BaseFont.EMBEDDED); + Font kai16 = new Font(bfChinese3, 7, Font.BOLD); + //西文 16号 Times New Roman + BaseFont bfChinese4 = BaseFont.createFont(path + ttf, BaseFont.IDENTITY_H, BaseFont.EMBEDDED); + Font roman16 = new Font(bfChinese4, 7, Font.BOLD); + + //人名 方正行楷 FZXKJW.TTF + BaseFont bfChinese5 = BaseFont.createFont(path + ttf, BaseFont.IDENTITY_H, BaseFont.EMBEDDED); + Font fzxk16 = new Font(bfChinese5, 9); + + Document doc = new Document(rect, rectSize[0], rectSize[1], rectSize[2], rectSize[3]); + + PdfWriter writer = PdfWriter.getInstance(doc, out); + + writer.setPdfVersion(PdfWriter.PDF_VERSION_1_2); + //文档属性 + doc.addTitle("资产信息"); + doc.open(); + + //加入内容 + PdfPTable tab = new PdfPTable(1); + PdfPCell cell = new PdfPCell(); + +// for (int i = 0; i < infos.size(); i++) { +// createPrintQrInfo(doc, tab, cell, song22, fang16, kai16, roman16, fzxk16); +// } + createPrintQrInfo(doc, tab, cell, song22, fang16, kai16, roman16, fzxk16, name, code, date, organization); + doc.newPage(); + doc.close(); + } + + private void createPrintQrInfo(Document doc, PdfPTable tab, PdfPCell cell, Font titleFont1, Font valueFont, Font kai16, Font roman16, Font fzxk16, String name, String code, String date, String organization) throws DocumentException { + //这里打印的是 60mm * 30mm 大小的标签,故这里参数很重要 + int[] cellWidth = {35, 70, 65}; + tab = new PdfPTable(3); + tab.setLockedWidth(true); + tab.setTotalWidth(165); + tab.getDefaultCell().setMinimumHeight(15f); + tab.setHorizontalAlignment(Element.ALIGN_CENTER); + tab.setWidths(cellWidth); + + //cell = PdfCellUtill.createCell(ObjUtils.defaultIfNull("", titleFont1, PdfPCell.ALIGN_CENTER, PdfPCell.ALIGN_MIDDLE, 3, 0)); +// String content = (titleFont1 != null) ? titleFont1.toString() : ""; + String content = ""; + cell = PdfCellUtill.createCell(content, titleFont1); + cell.setFixedHeight(15f); + cell.setBorderWidthTop(0.5f); + cell.setBorderWidthLeft(0.5f); + cell.setBorderWidthRight(0.5f); + cell.setUseAscender(true); + cell.setVerticalAlignment(cell.ALIGN_MIDDLE); + cell.setHorizontalAlignment(Element.ALIGN_CENTER); //水平居中 + cell.setVerticalAlignment(Element.ALIGN_MIDDLE); //垂直居中 + tab.addCell(cell); + + cell = PdfCellUtill.createCell("资产名称", kai16, PdfPCell.ALIGN_CENTER, PdfPCell.ALIGN_MIDDLE, 1, 0); + cell.setFixedHeight(15f); + cell.setBorderWidthTop(0.5f); + cell.setBorderWidthLeft(0.5f); + tab.addCell(cell); + cell = PdfCellUtill.createCell(name, valueFont, PdfPCell.ALIGN_LEFT, PdfPCell.ALIGN_MIDDLE, 1, 0); + cell.setBorderWidthTop(0.5f); + cell.setBorderWidthLeft(0.5f); + cell.setBorderWidthRight(0.5f); + tab.addCell(cell); + + Image imageQjPhoto = null; + // 二维码图片路径 + try { + imageQjPhoto = Image.getInstance(QrCodeUtil.generate(code, config), null); + // 调整二维码图片大小 + imageQjPhoto.scaleAbsolute(30, 30); // 设置宽度和高度 + } catch (MalformedURLException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + cell = PdfCellUtill.createCell("", valueFont, PdfPCell.ALIGN_CENTER, PdfPCell.ALIGN_MIDDLE, 1, 4); + cell.setBorderWidthTop(0.5f); + cell.setBorderWidthLeft(0.5f); + cell.setBorderWidthRight(0.5f); + cell.setBorderWidthBottom(0.5f); + cell.addElement(imageQjPhoto); + tab.addCell(cell); + + cell = PdfCellUtill.createCell("资产编号", kai16, PdfPCell.ALIGN_CENTER, PdfPCell.ALIGN_MIDDLE, 1, 0); + cell.setFixedHeight(15f); + cell.setBorderWidthTop(0.5f); + cell.setBorderWidthLeft(0.5f); + tab.addCell(cell); + cell = PdfCellUtill.createCell(code, roman16, PdfPCell.ALIGN_LEFT, PdfPCell.ALIGN_MIDDLE, 1, 0); + cell.setBorderWidthTop(0.5f); + cell.setBorderWidthLeft(0.5f); + cell.setBorderWidthRight(0.5f); + tab.addCell(cell); + + cell = PdfCellUtill.createCell("购置日期", kai16, PdfPCell.ALIGN_CENTER, PdfPCell.ALIGN_MIDDLE, 1, 0); + cell.setFixedHeight(15f); + cell.setBorderWidthTop(0.5f); + cell.setBorderWidthLeft(0.5f); + tab.addCell(cell); + + cell = PdfCellUtill.createCell(date, roman16, PdfPCell.ALIGN_LEFT, PdfPCell.ALIGN_MIDDLE, 1, 0); + cell.setBorderWidthTop(0.5f); + cell.setBorderWidthLeft(0.5f); + cell.setBorderWidthRight(0.5f); + tab.addCell(cell); + + cell = PdfCellUtill.createCell("使用部门", kai16, PdfPCell.ALIGN_CENTER, PdfPCell.ALIGN_MIDDLE, 1, 0); + cell.setFixedHeight(15f); + cell.setBorderWidthTop(0.5f); + cell.setBorderWidthLeft(0.5f); + cell.setUseAscender(true); + cell.setVerticalAlignment(cell.ALIGN_MIDDLE); + cell.setHorizontalAlignment(Element.ALIGN_CENTER); //水平居中 + cell.setVerticalAlignment(Element.ALIGN_MIDDLE); //垂直居中 + cell.setBorderWidthBottom(0.5f); + tab.addCell(cell); + + cell = PdfCellUtill.createCell(organization, fzxk16, PdfPCell.ALIGN_LEFT, PdfPCell.ALIGN_MIDDLE, 1, 0); + cell.setBorderWidthTop(0.5f); + cell.setBorderWidthLeft(0.5f); + cell.setBorderWidthRight(0.5f); + cell.setBorderWidthBottom(0.5f); + tab.addCell(cell); + + doc.add(tab); + } + +} diff --git a/common/src/main/java/com/yyy/common/core/text/CharsetKit.java b/common/src/main/java/com/yyy/common/core/text/CharsetKit.java new file mode 100644 index 0000000..f8d2c01 --- /dev/null +++ b/common/src/main/java/com/yyy/common/core/text/CharsetKit.java @@ -0,0 +1,88 @@ +package com.yyy.common.core.text; + + +import com.yyy.common.utils.common.StringUtils; + +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; + +/** + * 字符集工具类 + * + * @author ruoyi + */ +public class CharsetKit +{ + /** ISO-8859-1 */ + public static final String ISO_8859_1 = "ISO-8859-1"; + /** UTF-8 */ + public static final String UTF_8 = "UTF-8"; + /** GBK */ + public static final String GBK = "GBK"; + + /** ISO-8859-1 */ + public static final Charset CHARSET_ISO_8859_1 = Charset.forName(ISO_8859_1); + /** UTF-8 */ + public static final Charset CHARSET_UTF_8 = Charset.forName(UTF_8); + /** GBK */ + public static final Charset CHARSET_GBK = Charset.forName(GBK); + + /** + * 转换为Charset对象 + * + * @param charset 字符集,为空则返回默认字符集 + * @return Charset + */ + public static Charset charset(String charset) + { + return StringUtils.isEmpty(charset) ? Charset.defaultCharset() : Charset.forName(charset); + } + + /** + * 转换字符串的字符集编码 + * + * @param source 字符串 + * @param srcCharset 源字符集,默认ISO-8859-1 + * @param destCharset 目标字符集,默认UTF-8 + * @return 转换后的字符集 + */ + public static String convert(String source, String srcCharset, String destCharset) + { + return convert(source, Charset.forName(srcCharset), Charset.forName(destCharset)); + } + + /** + * 转换字符串的字符集编码 + * + * @param source 字符串 + * @param srcCharset 源字符集,默认ISO-8859-1 + * @param destCharset 目标字符集,默认UTF-8 + * @return 转换后的字符集 + */ + public static String convert(String source, Charset srcCharset, Charset destCharset) + { + if (null == srcCharset) + { + srcCharset = StandardCharsets.ISO_8859_1; + } + + if (null == destCharset) + { + destCharset = StandardCharsets.UTF_8; + } + + if (StringUtils.isEmpty(source) || srcCharset.equals(destCharset)) + { + return source; + } + return new String(source.getBytes(srcCharset), destCharset); + } + + /** + * @return 系统字符集编码 + */ + public static String systemCharset() + { + return Charset.defaultCharset().name(); + } +} diff --git a/common/src/main/java/com/yyy/common/core/text/Convert.java b/common/src/main/java/com/yyy/common/core/text/Convert.java new file mode 100644 index 0000000..2d6a166 --- /dev/null +++ b/common/src/main/java/com/yyy/common/core/text/Convert.java @@ -0,0 +1,1007 @@ +package com.yyy.common.core.text; + +import com.yyy.common.utils.common.StringUtils; +import org.apache.commons.lang3.ArrayUtils; + +import java.math.BigDecimal; +import java.math.BigInteger; +import java.math.RoundingMode; +import java.nio.ByteBuffer; +import java.nio.charset.Charset; +import java.text.NumberFormat; +import java.util.Set; + +/** + * 类型转换器 + * + * @author ruoyi + */ +public class Convert +{ + /** + * 转换为字符串
+ * 如果给定的值为null,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static String toStr(Object value, String defaultValue) + { + if (null == value) + { + return defaultValue; + } + if (value instanceof String) + { + return (String) value; + } + return value.toString(); + } + + /** + * 转换为字符串
+ * 如果给定的值为null,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static String toStr(Object value) + { + return toStr(value, null); + } + + /** + * 转换为字符
+ * 如果给定的值为null,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Character toChar(Object value, Character defaultValue) + { + if (null == value) + { + return defaultValue; + } + if (value instanceof Character) + { + return (Character) value; + } + + final String valueStr = toStr(value, null); + return StringUtils.isEmpty(valueStr) ? defaultValue : valueStr.charAt(0); + } + + /** + * 转换为字符
+ * 如果给定的值为null,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Character toChar(Object value) + { + return toChar(value, null); + } + + /** + * 转换为byte
+ * 如果给定的值为null,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Byte toByte(Object value, Byte defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Byte) + { + return (Byte) value; + } + if (value instanceof Number) + { + return ((Number) value).byteValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return Byte.parseByte(valueStr); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为byte
+ * 如果给定的值为null,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Byte toByte(Object value) + { + return toByte(value, null); + } + + /** + * 转换为Short
+ * 如果给定的值为null,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Short toShort(Object value, Short defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Short) + { + return (Short) value; + } + if (value instanceof Number) + { + return ((Number) value).shortValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return Short.parseShort(valueStr.trim()); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为Short
+ * 如果给定的值为null,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Short toShort(Object value) + { + return toShort(value, null); + } + + /** + * 转换为Number
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Number toNumber(Object value, Number defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Number) + { + return (Number) value; + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return NumberFormat.getInstance().parse(valueStr); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为Number
+ * 如果给定的值为空,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Number toNumber(Object value) + { + return toNumber(value, null); + } + + /** + * 转换为int
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Integer toInt(Object value, Integer defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Integer) + { + return (Integer) value; + } + if (value instanceof Number) + { + return ((Number) value).intValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return Integer.parseInt(valueStr.trim()); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为int
+ * 如果给定的值为null,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Integer toInt(Object value) + { + return toInt(value, null); + } + + /** + * 转换为Integer数组
+ * + * @param str 被转换的值 + * @return 结果 + */ + public static Integer[] toIntArray(String str) + { + return toIntArray(",", str); + } + + /** + * 转换为Long数组
+ * + * @param str 被转换的值 + * @return 结果 + */ + public static Long[] toLongArray(String str) + { + return toLongArray(",", str); + } + + /** + * 转换为Integer数组
+ * + * @param split 分隔符 + * @param split 被转换的值 + * @return 结果 + */ + public static Integer[] toIntArray(String split, String str) + { + if (StringUtils.isEmpty(str)) + { + return new Integer[] {}; + } + String[] arr = str.split(split); + final Integer[] ints = new Integer[arr.length]; + for (int i = 0; i < arr.length; i++) + { + final Integer v = toInt(arr[i], 0); + ints[i] = v; + } + return ints; + } + + /** + * 转换为Long数组
+ * + * @param split 分隔符 + * @param str 被转换的值 + * @return 结果 + */ + public static Long[] toLongArray(String split, String str) + { + if (StringUtils.isEmpty(str)) + { + return new Long[] {}; + } + String[] arr = str.split(split); + final Long[] longs = new Long[arr.length]; + for (int i = 0; i < arr.length; i++) + { + final Long v = toLong(arr[i], null); + longs[i] = v; + } + return longs; + } + + /** + * 转换为String数组
+ * + * @param str 被转换的值 + * @return 结果 + */ + public static String[] toStrArray(String str) + { + return toStrArray(",", str); + } + + /** + * 转换为String数组
+ * + * @param split 分隔符 + * @param split 被转换的值 + * @return 结果 + */ + public static String[] toStrArray(String split, String str) + { + return str.split(split); + } + + /** + * 转换为long
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Long toLong(Object value, Long defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Long) + { + return (Long) value; + } + if (value instanceof Number) + { + return ((Number) value).longValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + // 支持科学计数法 + return new BigDecimal(valueStr.trim()).longValue(); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为long
+ * 如果给定的值为null,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Long toLong(Object value) + { + return toLong(value, null); + } + + /** + * 转换为double
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Double toDouble(Object value, Double defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Double) + { + return (Double) value; + } + if (value instanceof Number) + { + return ((Number) value).doubleValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + // 支持科学计数法 + return new BigDecimal(valueStr.trim()).doubleValue(); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为double
+ * 如果给定的值为空,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Double toDouble(Object value) + { + return toDouble(value, null); + } + + /** + * 转换为Float
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Float toFloat(Object value, Float defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Float) + { + return (Float) value; + } + if (value instanceof Number) + { + return ((Number) value).floatValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return Float.parseFloat(valueStr.trim()); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为Float
+ * 如果给定的值为空,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Float toFloat(Object value) + { + return toFloat(value, null); + } + + /** + * 转换为boolean
+ * String支持的值为:true、false、yes、ok、no,1,0 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Boolean toBool(Object value, Boolean defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Boolean) + { + return (Boolean) value; + } + String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + valueStr = valueStr.trim().toLowerCase(); + switch (valueStr) + { + case "true": + case "yes": + case "ok": + case "1": + return true; + case "false": + case "no": + case "0": + return false; + default: + return defaultValue; + } + } + + /** + * 转换为boolean
+ * 如果给定的值为空,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Boolean toBool(Object value) + { + return toBool(value, null); + } + + /** + * 转换为Enum对象
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * + * @param clazz Enum的Class + * @param value 值 + * @param defaultValue 默认值 + * @return Enum + */ + public static > E toEnum(Class clazz, Object value, E defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (clazz.isAssignableFrom(value.getClass())) + { + @SuppressWarnings("unchecked") + E myE = (E) value; + return myE; + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return Enum.valueOf(clazz, valueStr); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为Enum对象
+ * 如果给定的值为空,或者转换失败,返回默认值null
+ * + * @param clazz Enum的Class + * @param value 值 + * @return Enum + */ + public static > E toEnum(Class clazz, Object value) + { + return toEnum(clazz, value, null); + } + + /** + * 转换为BigInteger
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static BigInteger toBigInteger(Object value, BigInteger defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof BigInteger) + { + return (BigInteger) value; + } + if (value instanceof Long) + { + return BigInteger.valueOf((Long) value); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return new BigInteger(valueStr); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为BigInteger
+ * 如果给定的值为空,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static BigInteger toBigInteger(Object value) + { + return toBigInteger(value, null); + } + + /** + * 转换为BigDecimal
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static BigDecimal toBigDecimal(Object value, BigDecimal defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof BigDecimal) + { + return (BigDecimal) value; + } + if (value instanceof Long) + { + return new BigDecimal((Long) value); + } + if (value instanceof Double) + { + return BigDecimal.valueOf((Double) value); + } + if (value instanceof Integer) + { + return new BigDecimal((Integer) value); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return new BigDecimal(valueStr); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为BigDecimal
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static BigDecimal toBigDecimal(Object value) + { + return toBigDecimal(value, null); + } + + /** + * 将对象转为字符串
+ * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法 + * + * @param obj 对象 + * @return 字符串 + */ + public static String utf8Str(Object obj) + { + return str(obj, CharsetKit.CHARSET_UTF_8); + } + + /** + * 将对象转为字符串
+ * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法 + * + * @param obj 对象 + * @param charsetName 字符集 + * @return 字符串 + */ + public static String str(Object obj, String charsetName) + { + return str(obj, Charset.forName(charsetName)); + } + + /** + * 将对象转为字符串
+ * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法 + * + * @param obj 对象 + * @param charset 字符集 + * @return 字符串 + */ + public static String str(Object obj, Charset charset) + { + if (null == obj) + { + return null; + } + + if (obj instanceof String) + { + return (String) obj; + } + else if (obj instanceof byte[]) + { + return str((byte[]) obj, charset); + } + else if (obj instanceof Byte[]) + { + byte[] bytes = ArrayUtils.toPrimitive((Byte[]) obj); + return str(bytes, charset); + } + else if (obj instanceof ByteBuffer) + { + return str((ByteBuffer) obj, charset); + } + return obj.toString(); + } + + /** + * 将byte数组转为字符串 + * + * @param bytes byte数组 + * @param charset 字符集 + * @return 字符串 + */ + public static String str(byte[] bytes, String charset) + { + return str(bytes, StringUtils.isEmpty(charset) ? Charset.defaultCharset() : Charset.forName(charset)); + } + + /** + * 解码字节码 + * + * @param data 字符串 + * @param charset 字符集,如果此字段为空,则解码的结果取决于平台 + * @return 解码后的字符串 + */ + public static String str(byte[] data, Charset charset) + { + if (data == null) + { + return null; + } + + if (null == charset) + { + return new String(data); + } + return new String(data, charset); + } + + /** + * 将编码的byteBuffer数据转换为字符串 + * + * @param data 数据 + * @param charset 字符集,如果为空使用当前系统字符集 + * @return 字符串 + */ + public static String str(ByteBuffer data, String charset) + { + if (data == null) + { + return null; + } + + return str(data, Charset.forName(charset)); + } + + /** + * 将编码的byteBuffer数据转换为字符串 + * + * @param data 数据 + * @param charset 字符集,如果为空使用当前系统字符集 + * @return 字符串 + */ + public static String str(ByteBuffer data, Charset charset) + { + if (null == charset) + { + charset = Charset.defaultCharset(); + } + return charset.decode(data).toString(); + } + + // ----------------------------------------------------------------------- 全角半角转换 + /** + * 半角转全角 + * + * @param input String. + * @return 全角字符串. + */ + public static String toSBC(String input) + { + return toSBC(input, null); + } + + /** + * 半角转全角 + * + * @param input String + * @param notConvertSet 不替换的字符集合 + * @return 全角字符串. + */ + public static String toSBC(String input, Set notConvertSet) + { + char[] c = input.toCharArray(); + for (int i = 0; i < c.length; i++) + { + if (null != notConvertSet && notConvertSet.contains(c[i])) + { + // 跳过不替换的字符 + continue; + } + + if (c[i] == ' ') + { + c[i] = '\u3000'; + } + else if (c[i] < '\177') + { + c[i] = (char) (c[i] + 65248); + + } + } + return new String(c); + } + + /** + * 全角转半角 + * + * @param input String. + * @return 半角字符串 + */ + public static String toDBC(String input) + { + return toDBC(input, null); + } + + /** + * 替换全角为半角 + * + * @param text 文本 + * @param notConvertSet 不替换的字符集合 + * @return 替换后的字符 + */ + public static String toDBC(String text, Set notConvertSet) + { + char[] c = text.toCharArray(); + for (int i = 0; i < c.length; i++) + { + if (null != notConvertSet && notConvertSet.contains(c[i])) + { + // 跳过不替换的字符 + continue; + } + + if (c[i] == '\u3000') + { + c[i] = ' '; + } + else if (c[i] > '\uFF00' && c[i] < '\uFF5F') + { + c[i] = (char) (c[i] - 65248); + } + } + String returnString = new String(c); + + return returnString; + } + + /** + * 数字金额大写转换 先写个完整的然后将如零拾替换成零 + * + * @param n 数字 + * @return 中文大写数字 + */ + public static String digitUppercase(double n) + { + String[] fraction = { "角", "分" }; + String[] digit = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" }; + String[][] unit = { { "元", "万", "亿" }, { "", "拾", "佰", "仟" } }; + + String head = n < 0 ? "负" : ""; + n = Math.abs(n); + + String s = ""; + for (int i = 0; i < fraction.length; i++) + { + // 优化double计算精度丢失问题 + BigDecimal nNum = new BigDecimal(n); + BigDecimal decimal = new BigDecimal(10); + BigDecimal scale = nNum.multiply(decimal).setScale(2, RoundingMode.HALF_EVEN); + double d = scale.doubleValue(); + s += (digit[(int) (Math.floor(d * Math.pow(10, i)) % 10)] + fraction[i]).replaceAll("(零.)+", ""); + } + if (s.length() < 1) + { + s = "整"; + } + int integerPart = (int) Math.floor(n); + + for (int i = 0; i < unit[0].length && integerPart > 0; i++) + { + String p = ""; + for (int j = 0; j < unit[1].length && n > 0; j++) + { + p = digit[integerPart % 10] + unit[1][j] + p; + integerPart = integerPart / 10; + } + s = p.replaceAll("(零.)*零$", "").replaceAll("^$", "零") + unit[0][i] + s; + } + return head + s.replaceAll("(零.)*零元", "元").replaceFirst("(零.)+", "").replaceAll("(零.)+", "零").replaceAll("^整$", "零元整"); + } +} diff --git a/common/src/main/java/com/yyy/common/core/text/StrFormatter.java b/common/src/main/java/com/yyy/common/core/text/StrFormatter.java new file mode 100644 index 0000000..9a987e7 --- /dev/null +++ b/common/src/main/java/com/yyy/common/core/text/StrFormatter.java @@ -0,0 +1,93 @@ +package com.yyy.common.core.text; + + +import com.yyy.common.utils.common.StringUtils; + +/** + * 字符串格式化 + * + * @author ruoyi + */ +public class StrFormatter +{ + public static final String EMPTY_JSON = "{}"; + public static final char C_BACKSLASH = '\\'; + public static final char C_DELIM_START = '{'; + public static final char C_DELIM_END = '}'; + + /** + * 格式化字符串
+ * 此方法只是简单将占位符 {} 按照顺序替换为参数
+ * 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可
+ * 例:
+ * 通常使用:format("this is {} for {}", "a", "b") -> this is a for b
+ * 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a
+ * 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b
+ * + * @param strPattern 字符串模板 + * @param argArray 参数列表 + * @return 结果 + */ + public static String format(final String strPattern, final Object... argArray) + { + if (StringUtils.isEmpty(strPattern) || StringUtils.isEmpty(argArray)) + { + return strPattern; + } + final int strPatternLength = strPattern.length(); + + // 初始化定义好的长度以获得更好的性能 + StringBuilder sbuf = new StringBuilder(strPatternLength + 50); + + int handledPosition = 0; + int delimIndex;// 占位符所在位置 + for (int argIndex = 0; argIndex < argArray.length; argIndex++) + { + delimIndex = strPattern.indexOf(EMPTY_JSON, handledPosition); + if (delimIndex == -1) + { + if (handledPosition == 0) + { + return strPattern; + } + else + { // 字符串模板剩余部分不再包含占位符,加入剩余部分后返回结果 + sbuf.append(strPattern, handledPosition, strPatternLength); + return sbuf.toString(); + } + } + else + { + if (delimIndex > 0 && strPattern.charAt(delimIndex - 1) == C_BACKSLASH) + { + if (delimIndex > 1 && strPattern.charAt(delimIndex - 2) == C_BACKSLASH) + { + // 转义符之前还有一个转义符,占位符依旧有效 + sbuf.append(strPattern, handledPosition, delimIndex - 1); + sbuf.append(Convert.utf8Str(argArray[argIndex])); + handledPosition = delimIndex + 2; + } + else + { + // 占位符被转义 + argIndex--; + sbuf.append(strPattern, handledPosition, delimIndex - 1); + sbuf.append(C_DELIM_START); + handledPosition = delimIndex + 1; + } + } + else + { + // 正常占位符 + sbuf.append(strPattern, handledPosition, delimIndex); + sbuf.append(Convert.utf8Str(argArray[argIndex])); + handledPosition = delimIndex + 2; + } + } + } + // 加入最后一个占位符后所有的字符 + sbuf.append(strPattern, handledPosition, strPattern.length()); + + return sbuf.toString(); + } +} diff --git a/common/src/main/java/com/yyy/common/enums/AssetStatusEnum.java b/common/src/main/java/com/yyy/common/enums/AssetStatusEnum.java new file mode 100644 index 0000000..7cc8ffc --- /dev/null +++ b/common/src/main/java/com/yyy/common/enums/AssetStatusEnum.java @@ -0,0 +1,43 @@ +package com.yyy.common.enums; + +public enum AssetStatusEnum { + UN_USEd(0, "闲置"), + IN_USE(1, "在用"), + BORROW(2, "借用中"), + REPAIR(3,"维修中"), + ALLOCATE(4, "调拨中"), + TOBE_SCRAPPED(5, "待报废"), + DISPOSED(6,"已处置"), + INVENTORY(7, "库存"), + SCRAPPED(8, "已报废"), + TURN_ON(9,"开机"), + TURN_OFF(10,"关机") + ; + private final Integer code; + private final String info; + + AssetStatusEnum(Integer code, String info) + { + this.code = code; + this.info = info; + } + + public Integer getCode() + { + return code; + } + + public String getInfo() + { + return info; + } + + public static String getInfoByCode(int code) { + for (AssetStatusEnum status : AssetStatusEnum.values()) { + if (status.getCode() == code) { + return status.getInfo(); + } + } + return "Unknown"; + } +} diff --git a/common/src/main/java/com/yyy/common/enums/BusinessStatusEnum.java b/common/src/main/java/com/yyy/common/enums/BusinessStatusEnum.java new file mode 100644 index 0000000..b212cd8 --- /dev/null +++ b/common/src/main/java/com/yyy/common/enums/BusinessStatusEnum.java @@ -0,0 +1,29 @@ +package com.yyy.common.enums; + +public enum BusinessStatusEnum { + DRAFT(0, "草稿"), + COMPLETED(1, "已完成"), + REJECTED(2, "拒绝"), + APPROVED(3,"审批中"), + CANCELED(4, "取消"), + UNKNOWN(5, "未知"); + + private final Integer code; + private final String info; + + BusinessStatusEnum(Integer code, String info) + { + this.code = code; + this.info = info; + } + + public Integer getCode() + { + return code; + } + + public String getInfo() + { + return info; + } +} diff --git a/common/src/main/java/com/yyy/common/enums/ConfigEnum.java b/common/src/main/java/com/yyy/common/enums/ConfigEnum.java new file mode 100644 index 0000000..ded709d --- /dev/null +++ b/common/src/main/java/com/yyy/common/enums/ConfigEnum.java @@ -0,0 +1,23 @@ +package com.yyy.common.enums; + +public enum ConfigEnum { + DEFAULT_ROLE_ID(0, "3"); + private final Integer code; + private final String info; + + ConfigEnum(Integer code, String info) + { + this.code = code; + this.info = info; + } + + public Integer getCode() + { + return code; + } + + public String getInfo() + { + return info; + } +} diff --git a/common/src/main/java/com/yyy/common/enums/DetectTypeEnum.java b/common/src/main/java/com/yyy/common/enums/DetectTypeEnum.java new file mode 100644 index 0000000..ab5b4ea --- /dev/null +++ b/common/src/main/java/com/yyy/common/enums/DetectTypeEnum.java @@ -0,0 +1,71 @@ +package com.yyy.common.enums; + +import java.util.Arrays; +import java.util.List; + +public enum DetectTypeEnum { + ALLOCATE("allocate", "资产调拨"), + BORROW("borrow", "资产借用"), + COLLECTION("collection", "资产领用"), + OUTBOUND("outbound", "资产出库"), + REGISTRATION("registration", "资产登记"), + RETURN("return", "资产归还"), + RETURN_INVENTORY("return_inventory", "资产退库"), + STORAGE("storage", "资产入库"), + TRANSFER("transfer", "资产转移"), + REPAIR_FAULT("repair_fault", "故障登记"), +// REPAIR("repair", "设备报修"), + RETIREMENT("retirement", "资产报废"), + CLEAN("clean", "资产清理"), + + ON("on", "设备开机"), + OFF("off", "设备关机"), + + REPAIR("eam_device_repair", "设备报修维修"), + INSPECTION("eam_device_inspection", "设备巡检任务"), + MAINTENANCE("eam_device_maintenance", "设备保养任务"), + STOCKTAKING("eam_device_stocktaking", "设备盘点任务"), + UNKNOWN("null", "未知操作"); + + private final String code; + private final String info; + + DetectTypeEnum(String code, String info) { + this.code = code; + this.info = info; + } + + public String getCode() { + return code; + } + + public String getInfo() { + return info; + } + + public static DetectTypeEnum getByCode(String code) { + for (DetectTypeEnum type : DetectTypeEnum.values()) { + if (type.getCode().equals(code)) { + return type; + } + } + return UNKNOWN; + } + + public static DetectTypeEnum fromInfo(String info) { + for (DetectTypeEnum type : DetectTypeEnum.values()) { + if (type.getInfo().equals(info)) { + return type; + } + } + return UNKNOWN; + } + + public static List deviceInfos(){ + return Arrays.asList(REPAIR.info, INSPECTION.info, MAINTENANCE.info, STOCKTAKING.info); + } + + public static List deviceKeys(){ + return Arrays.asList(REPAIR.code, INSPECTION.code, MAINTENANCE.code, STOCKTAKING.code); + } +} diff --git a/common/src/main/java/com/yyy/common/enums/EncodingEum.java b/common/src/main/java/com/yyy/common/enums/EncodingEum.java new file mode 100644 index 0000000..963f78e --- /dev/null +++ b/common/src/main/java/com/yyy/common/enums/EncodingEum.java @@ -0,0 +1,46 @@ +package com.yyy.common.enums; + +import com.yyy.common.utils.uuid.SnowFlakeUtil; + +public enum EncodingEum { + ASSET("AS", "资产信息"), + ALLOCATE("AL", "资产调拨"), + BORROW("BR", "资产借用"), + COLLECTION("CO", "资产领用"), + OUTBOUND("OU", "资产出库"), + REGISTRATION("REG","资产登记"), + RETURN("RET", "资产归还"), + RETURN_INVENTORY("REI", "资产退库"), + STORAGE("ST", "资产入库"), + TRANSFER("TR", "资产转移"), + REPAIR_FAULT("REF", "故障登记"), + REPAIR("REP", "设备报修"), + RETIREMENT("REM", "资产报废"), + ON("ON", "设备开机"), + OFF("OFF", "设备关机"), + + UNKNOWN("null", "未知操作"); + + private final String code; + private final String info; + + EncodingEum(String code, String info) + { + this.code = code; + this.info = info; + } + + public String getCode() + { + return code; + } + + public String getInfo() + { + return info; + } + + public String getBusinessId(){ + return this.code + SnowFlakeUtil.getDefaultSnowFlakeId(); + } +} diff --git a/common/src/main/java/com/yyy/common/enums/FieldDataTypeEnum.java b/common/src/main/java/com/yyy/common/enums/FieldDataTypeEnum.java new file mode 100644 index 0000000..3cdde0e --- /dev/null +++ b/common/src/main/java/com/yyy/common/enums/FieldDataTypeEnum.java @@ -0,0 +1,44 @@ +package com.yyy.common.enums; + +public enum FieldDataTypeEnum { + // 定义枚举常量 + STRING("String", "文本数据类型"), + NUMBER("Number", "数字类型(默认四舍五入保留两位小数)"), + DATE("Date", "日期数据类型"), + RADIO("Radio", "单选框"), + LIST("List", "列表数据"); + + // 成员变量 + private final String key; + private final String name; + + // 构造方法 + FieldDataTypeEnum(String key, String name) { + this.key = key; + this.name = name; + } + + public String getKey() { + return key; + } + + public String getName() { + return name; + } + + @Override + public String toString() { + return key; + } + + // 根据名称查找枚举 + public static FieldDataTypeEnum fromTypeName(String typeName) { + for (FieldDataTypeEnum type : FieldDataTypeEnum.values()) { + if (type.getKey().equalsIgnoreCase(typeName)) { + return type; + } + } + throw new IllegalArgumentException("未找到匹配的字段数据类型: " + typeName); + } + +} \ No newline at end of file diff --git a/common/src/main/java/com/yyy/common/enums/FlowStatus.java b/common/src/main/java/com/yyy/common/enums/FlowStatus.java new file mode 100644 index 0000000..2bc9801 --- /dev/null +++ b/common/src/main/java/com/yyy/common/enums/FlowStatus.java @@ -0,0 +1,54 @@ +package com.yyy.common.enums; + +/** + * 流程状态类型 + */ +public enum FlowStatus { + + /** + * 说明 + */ + DRAFTING(1, "起草"), + APPROVAL(2, "审批中"), + COMPLETED(3, "已结束"), + REJECTED(4, "已驳回"), + DISCARDED(5, "已废弃"), + EXCEPTION(6, "流程异常"), + TO_BE_ASSIGNED(7,"待指派"), + SUSPENDED(8,"已挂起"), + // + DISPOSE(9,"待处置"), + ; + + /** + * 类型 + */ + private final Integer code; + + /** + * 说明 + */ + private final String info; + + FlowStatus(Integer code, String info) { + this.code = code; + this.info = info; + } + + public Integer getCode() { + return code; + } + + public String getInfo() { + return info; + } + + public static FlowStatus getByCode(Integer code) { + for (FlowStatus status : FlowStatus.values()) { + if (status.getCode().equals(code)) { + return status; + } + } + return EXCEPTION; + } +} diff --git a/common/src/main/java/com/yyy/common/enums/JobTypeEnum.java b/common/src/main/java/com/yyy/common/enums/JobTypeEnum.java new file mode 100644 index 0000000..c95b793 --- /dev/null +++ b/common/src/main/java/com/yyy/common/enums/JobTypeEnum.java @@ -0,0 +1,39 @@ +package com.yyy.common.enums; + +public enum JobTypeEnum { + INSPECTION(PlanTypeEnum.inspection, "SysTask.inspectionJob(${config}J)", "巡检计划"), + MAINTENANCE(PlanTypeEnum.maintenance, "SysTask.inspectionJob(${config}J)", "保养计划"), + STOCKTAKING(PlanTypeEnum.stocktaking, "SysTask.inspectionJob(${config}J)", "盘点计划"); + + private final PlanTypeEnum planType; + private final String invokeTarget; + private final String info; + + JobTypeEnum(PlanTypeEnum planType, String invokeTarget, String info) { + this.planType = planType; + this.invokeTarget = invokeTarget; + this.info = info; + } + + public PlanTypeEnum getPlanType() { + return planType; + } + + public String getInvokeTarget() { + return invokeTarget; + } + + + public String getInvokeTarget(PlanTypeEnum planType , String config) { + for (JobTypeEnum e : JobTypeEnum.values()) { + if (e.getPlanType() == planType){ + return e.getInvokeTarget().replace("${config}", config); + } + } + return "error"; + } + + public String getInfo() { + return info; + } +} diff --git a/common/src/main/java/com/yyy/common/enums/OrganizationTypeEnum.java b/common/src/main/java/com/yyy/common/enums/OrganizationTypeEnum.java new file mode 100644 index 0000000..cc8a379 --- /dev/null +++ b/common/src/main/java/com/yyy/common/enums/OrganizationTypeEnum.java @@ -0,0 +1,39 @@ +package com.yyy.common.enums; + +/** + * 用户状态 + */ +public enum OrganizationTypeEnum { + COMPANY("0", "公司"), + DEPARTMENT("1", "部门"), + POST("2", "岗位"); + + private final String code; + private final String info; + + OrganizationTypeEnum(String code, String info) { + this.code = code; + this.info = info; + } + + public String getCode() { + return code; + } + + public String getInfo() { + return info; + } + + public static String enable(String parentCode, String childrenCode) { + if (parentCode.equals(DEPARTMENT.code) && childrenCode.equals(COMPANY.code)){ + return "部门下不能创建公司!"; + }else if(parentCode.equals(POST.code)){ + if (childrenCode.equals(COMPANY.code)){ + return "岗位下不能创建公司!"; + }else if (childrenCode.equals(DEPARTMENT.code)){ + return "岗位下不能创建部门!"; + } + } + return null; + } +} diff --git a/common/src/main/java/com/yyy/common/enums/PlanCycleTypeEnum.java b/common/src/main/java/com/yyy/common/enums/PlanCycleTypeEnum.java new file mode 100644 index 0000000..53291e3 --- /dev/null +++ b/common/src/main/java/com/yyy/common/enums/PlanCycleTypeEnum.java @@ -0,0 +1,36 @@ +package com.yyy.common.enums; + +public enum PlanCycleTypeEnum { + day(0, "日循环计划"), + week(1, "周循环计划"), + month(2, "月循环计划"), + once(3,"单任务计划") + ; + private final Integer code; + private final String info; + + PlanCycleTypeEnum(Integer code, String info) + { + this.code = code; + this.info = info; + } + + public Integer getCode() + { + return code; + } + + public String getInfo() + { + return info; + } + + public static String getInfoByCode(int code) { + for (PlanCycleTypeEnum status : PlanCycleTypeEnum.values()) { + if (status.getCode() == code) { + return status.getInfo(); + } + } + return "Unknown"; + } +} diff --git a/common/src/main/java/com/yyy/common/enums/PlanTypeEnum.java b/common/src/main/java/com/yyy/common/enums/PlanTypeEnum.java new file mode 100644 index 0000000..eed81c5 --- /dev/null +++ b/common/src/main/java/com/yyy/common/enums/PlanTypeEnum.java @@ -0,0 +1,63 @@ +package com.yyy.common.enums; + +import com.yyy.common.utils.uuid.SnowFlakeUtil; + +public enum PlanTypeEnum { + repair("repair", "eam_device_repair", "报修维修"), + inspection("inspection", "eam_device_inspection", "设备巡检"), + maintenance("maintenance", "eam_device_maintenance", "设备保养"), + stocktaking("stocktaking", "eam_device_stocktaking", "设备盘点"); + + private final String jobGroup; + private final String code; + private final String info; + + PlanTypeEnum(String jobGroup, String code, String info) { + this.jobGroup = jobGroup; + this.code = code; + this.info = info; + } + + public String getJobGroup() { + return jobGroup; + } + + public String getCode() { + return code; + } + + public String getInfo() { + return info; + } + + public static PlanTypeEnum getByJobGroup(String jobGroup) { + for (PlanTypeEnum item : values()) { + if (item.getJobGroup().equals(jobGroup)) { + return item; + } + } + return null; + } + + public static PlanTypeEnum getByCode(String code) { + for (PlanTypeEnum item : values()) { + if (item.getCode().equals(code)) { + return item; + } + } + return null; + } + + public static String getInfo(String code) { + for (PlanTypeEnum item : values()) { + if (item.getCode().equals(code)) { + return item.getInfo(); + } + } + return null; + } + + public String getBusinessId(){ + return this.jobGroup + SnowFlakeUtil.getDefaultSnowFlakeId(); + } +} diff --git a/common/src/main/java/com/yyy/common/enums/ScrapTypeEnum.java b/common/src/main/java/com/yyy/common/enums/ScrapTypeEnum.java new file mode 100644 index 0000000..4e866a2 --- /dev/null +++ b/common/src/main/java/com/yyy/common/enums/ScrapTypeEnum.java @@ -0,0 +1,35 @@ +package com.yyy.common.enums; + +public enum ScrapTypeEnum { + DAMAGED(1, "损坏"), + EXPIRED(2, "过期"), + LOST(3,"丢失"); + + private final Integer code; + private final String info; + + ScrapTypeEnum(Integer code, String info) + { + this.code = code; + this.info = info; + } + + public Integer getCode() + { + return code; + } + + public String getInfo() + { + return info; + } + + public static String getInfoByCode(int code) { + for (ScrapTypeEnum status : ScrapTypeEnum.values()) { + if (status.getCode() == code) { + return status.getInfo(); + } + } + return "其他"; + } +} diff --git a/common/src/main/java/com/yyy/common/enums/SexEnum.java b/common/src/main/java/com/yyy/common/enums/SexEnum.java new file mode 100644 index 0000000..52276e7 --- /dev/null +++ b/common/src/main/java/com/yyy/common/enums/SexEnum.java @@ -0,0 +1,29 @@ +package com.yyy.common.enums; + +/** + * @Author: fy + * @Date: 2024/04/02 + * @Description: + */ +public enum SexEnum { + MAN("0", "男"), WOMAN("1", "女"), UNKNOWN("2", "未知"); + + private final String code; + private final String info; + + SexEnum(String code, String info) + { + this.code = code; + this.info = info; + } + + public String getCode() + { + return code; + } + + public String getInfo() + { + return info; + } +} diff --git a/common/src/main/java/com/yyy/common/enums/StockTackingDetailStatusEnum.java b/common/src/main/java/com/yyy/common/enums/StockTackingDetailStatusEnum.java new file mode 100644 index 0000000..084c93d --- /dev/null +++ b/common/src/main/java/com/yyy/common/enums/StockTackingDetailStatusEnum.java @@ -0,0 +1,28 @@ +package com.yyy.common.enums; + +public enum StockTackingDetailStatusEnum { + SURPLUS(0, "盘盈"), + SHORTAGE(1, "盘亏"), + COMPLETED(2, "已盘点"), + PENDING(3, "待盘点"), + EXCEPTION(4, "异常"); + + private final Integer code; + private final String info; + + StockTackingDetailStatusEnum(Integer code, String info) { + this.code = code; + this.info = info; + } + + public Integer getCode() { + return code; + } + + public String getInfo() { + return info; + } + + +} + diff --git a/common/src/main/java/com/yyy/common/enums/StocktakingStatusEnum.java b/common/src/main/java/com/yyy/common/enums/StocktakingStatusEnum.java new file mode 100644 index 0000000..e5a618f --- /dev/null +++ b/common/src/main/java/com/yyy/common/enums/StocktakingStatusEnum.java @@ -0,0 +1,24 @@ +package com.yyy.common.enums; + +public enum StocktakingStatusEnum { + NOT_STARTED(0, "未开始"), + IN_PROGRESS(1, "进行中"), + CANCELLED(2, "取消"), + COMPLETED(3, "已完成"); + + private final Integer code; + private final String info; + + StocktakingStatusEnum(Integer code, String info) { + this.code = code; + this.info = info; + } + + public Integer getCode() { + return code; + } + + public String getInfo() { + return info; + } +} diff --git a/common/src/main/java/com/yyy/common/enums/UserStatusEnum.java b/common/src/main/java/com/yyy/common/enums/UserStatusEnum.java new file mode 100644 index 0000000..3260f4b --- /dev/null +++ b/common/src/main/java/com/yyy/common/enums/UserStatusEnum.java @@ -0,0 +1,28 @@ +package com.yyy.common.enums; + +/** + * 用户状态 + */ +public enum UserStatusEnum +{ + OK("0", "正常"), DISABLE("1", "停用"), DELETED("2", "删除"); + + private final String code; + private final String info; + + UserStatusEnum(String code, String info) + { + this.code = code; + this.info = info; + } + + public String getCode() + { + return code; + } + + public String getInfo() + { + return info; + } +} diff --git a/common/src/main/java/com/yyy/common/enums/WordContentTypeEnum.java b/common/src/main/java/com/yyy/common/enums/WordContentTypeEnum.java new file mode 100644 index 0000000..d9b45bf --- /dev/null +++ b/common/src/main/java/com/yyy/common/enums/WordContentTypeEnum.java @@ -0,0 +1,76 @@ +package com.yyy.common.enums; + +import com.yyy.common.factory.word.AbstractImportStrategy; +import com.yyy.common.factory.word.strategy.labels.*; +import com.yyy.common.factory.word.strategy.labels.LoopColumnTableImportStrategy; +import com.yyy.common.factory.word.strategy.labels.LoopRowTableImportStrategy; + +/** + * @description:poi-tl标签类型,文档链接:https://deepoove.com/poi-tl/#_%E6%A0%87%E7%AD%BE + **/ +public enum WordContentTypeEnum { + /** + * 常规标签 + */ + TEXT("text", "文本{{var}}", new TextImportStrategy()), + + PICTURE("picture", "图片{{@var}}", new PictureImportStrategy()), + + TABLE("table", "表格{{#var}}", new TableImportStrategy()), + + NUMBERING("numbering", "列表{{*var}}", new NumberingImportStrategy()), + + SECTION("section", "区块对{{?sections}}{{/sections}}", new SectionImportStrategy()), + + INCLUDE("include", "嵌套{{+var}}", new IncludeImportStrategy()), + /** + * 引用标签 + */ + IMG("img", "图片{{img}}", new ImgReferenceImportStrategy()), + + MULTI_CHART("multi_chart", "多系列图表{{var}}", new ChartMultiSeriesReferenceImportStrategy()), + + SINGLE_CHART("single_chart", "单系列图表{{var}}", new ChartSingleSeriesReferenceImportStrategy()), + + CHARTS("charts", "组合图表{{var}}", new ChartsReferenceImportStrategy()), + + LoopRowTable("loop_row_table", "循环表格行", new LoopRowTableImportStrategy()), + + LoopColumnTable("loop_column_table", "循环表格列", new LoopColumnTableImportStrategy()), + + ExcelList("excel_list", "excel列表", null) + ; + + private String key; + + private String info; + + private AbstractImportStrategy strategy; + + WordContentTypeEnum(String key, String info, AbstractImportStrategy strategy) { + this.key = key; + this.info = info; + this.strategy = strategy; + } + + public String getKey() { + return key; + } + + public String getInfo() { + return info; + } + + public AbstractImportStrategy getStrategy() { + return strategy; + } + + public static WordContentTypeEnum getType(String type) { + for (WordContentTypeEnum value : values()) { + if (value.name().equals(type)) { + return value; + } + } + return null; + } +} diff --git a/common/src/main/java/com/yyy/common/enums/WordPluginsTypeEnum.java b/common/src/main/java/com/yyy/common/enums/WordPluginsTypeEnum.java new file mode 100644 index 0000000..15db6fe --- /dev/null +++ b/common/src/main/java/com/yyy/common/enums/WordPluginsTypeEnum.java @@ -0,0 +1,55 @@ +package com.yyy.common.enums; + +import com.deepoove.poi.plugin.bookmark.BookmarkRenderPolicy; +import com.deepoove.poi.plugin.comment.CommentRenderPolicy; +import com.deepoove.poi.plugin.table.LoopColumnTableRenderPolicy; +import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy; +import com.deepoove.poi.plugin.toc.TOCRenderPolicy; +import com.deepoove.poi.policy.AttachmentRenderPolicy; +import com.deepoove.poi.policy.DocumentRenderPolicy; +import com.deepoove.poi.policy.ParagraphRenderPolicy; +import com.deepoove.poi.policy.RenderPolicy; +import com.yyy.common.factory.word.strategy.plugins.MyLoopRowTableRenderPolicy; + +/** + * @description:poi-tl插件类型 + */ +public enum WordPluginsTypeEnum { + Default("default", "默认渲染", null), + Paragraph("paragraph", "渲染一个段落,可以包含不同样式文本,图片等", new ParagraphRenderPolicy()), + Document("document", "渲染整个word文档", new DocumentRenderPolicy()), + Comment("comment", "完整的批注功能", new CommentRenderPolicy()), + Attachment("attachment", "插入附件功能", new AttachmentRenderPolicy()), + LoopRowTable("loop_row_table", "循环表格行", new MyLoopRowTableRenderPolicy()), + LoopColumnTable("loop_column_table", "循环表格列", new LoopColumnTableRenderPolicy()), + //DynamicTable("dynamic_table", "动态表格插件,允许直接操作表格对象", new DynamicTableRenderPolicy()), + Bookmark("bookmark", "书签和锚点", new BookmarkRenderPolicy()), + //AbstractChartTemplate("abstract_chart_template", "引用图表插件,允许直接操作图表对象", new AbstractChartTemplateRenderPolicy()), + TOC("toc", "Beta实验功能:目录,打开文档时会提示更新域", new TOCRenderPolicy()); + //Highlight("highlight", "Word支持代码高亮(需要引入对应Maven依赖)", new HighlightRenderPolicy()), + //Markdown("markdown", "使用Markdown来渲染word(需要引入对应Maven依赖)", new MarkdownRenderPolicy()); + + private String key; + + private String info; + + private RenderPolicy policy; + + WordPluginsTypeEnum(String key, String info, RenderPolicy policy) { + this.key = key; + this.info = info; + this.policy = policy; + } + + public String getKey() { + return key; + } + + public String getInfo() { + return info; + } + + public RenderPolicy getPolicy() { + return policy; + } +} diff --git a/common/src/main/java/com/yyy/common/enums/WorkReportTypeEnum.java b/common/src/main/java/com/yyy/common/enums/WorkReportTypeEnum.java new file mode 100644 index 0000000..d65d9c0 --- /dev/null +++ b/common/src/main/java/com/yyy/common/enums/WorkReportTypeEnum.java @@ -0,0 +1,44 @@ +package com.yyy.common.enums; + +public enum WorkReportTypeEnum { + DAY(0, "日"), + WEEK(1, "月"), + MONTH(2, "周"), + YEAR(3,"年") + ; + private final Integer code; + private final String info; + + WorkReportTypeEnum(Integer code, String info) + { + this.code = code; + this.info = info; + } + + public Integer getCode() + { + return code; + } + + public String getInfo() + { + return info; + } + + public static WorkReportTypeEnum getByCode(Integer code) + { + for (WorkReportTypeEnum value : WorkReportTypeEnum.values()) + { + if (value.getCode().equals(code)) + { + return value; + } + } + return null; + } + + @Override + public String toString() { + return code.toString(); + } +} diff --git a/common/src/main/java/com/yyy/common/exception/CustomException.java b/common/src/main/java/com/yyy/common/exception/CustomException.java new file mode 100644 index 0000000..142affc --- /dev/null +++ b/common/src/main/java/com/yyy/common/exception/CustomException.java @@ -0,0 +1,41 @@ +package com.yyy.common.exception; + +/** + * 自定义异常 + */ +public class CustomException extends RuntimeException +{ + private static final long serialVersionUID = 1L; + + private Integer code; + + private String message; + + public CustomException(String message) + { + this.message = message; + } + + public CustomException(String message, Integer code) + { + this.message = message; + this.code = code; + } + + public CustomException(String message, Throwable e) + { + super(message, e); + this.message = message; + } + + @Override + public String getMessage() + { + return message; + } + + public Integer getCode() + { + return code; + } +} diff --git a/common/src/main/java/com/yyy/common/exception/DemoModeException.java b/common/src/main/java/com/yyy/common/exception/DemoModeException.java new file mode 100644 index 0000000..285aa29 --- /dev/null +++ b/common/src/main/java/com/yyy/common/exception/DemoModeException.java @@ -0,0 +1,13 @@ +package com.yyy.common.exception; + +/** + * 演示模式异常 + */ +public class DemoModeException extends RuntimeException +{ + private static final long serialVersionUID = 1L; + + public DemoModeException() + { + } +} diff --git a/common/src/main/java/com/yyy/common/exception/GlobalException.java b/common/src/main/java/com/yyy/common/exception/GlobalException.java new file mode 100644 index 0000000..e0063c0 --- /dev/null +++ b/common/src/main/java/com/yyy/common/exception/GlobalException.java @@ -0,0 +1,56 @@ +package com.yyy.common.exception; + +/** + * 全局异常 + */ +public class GlobalException extends RuntimeException +{ + private static final long serialVersionUID = 1L; + + /** + * 错误提示 + */ + private String message; + + /** + * 错误明细,内部调试错误 + * + * 和 {@link CommonResult#getDetailMessage()} 一致的设计 + */ + private String detailMessage; + + /** + * 空构造方法,避免反序列化问题 + */ + public GlobalException() + { + } + + public GlobalException(String message) + { + this.message = message; + } + + public String getDetailMessage() + { + return detailMessage; + } + + public GlobalException setDetailMessage(String detailMessage) + { + this.detailMessage = detailMessage; + return this; + } + + @Override + public String getMessage() + { + return message; + } + + public GlobalException setMessage(String message) + { + this.message = message; + return this; + } +} \ No newline at end of file diff --git a/common/src/main/java/com/yyy/common/exception/ServiceException.java b/common/src/main/java/com/yyy/common/exception/ServiceException.java new file mode 100644 index 0000000..94d7684 --- /dev/null +++ b/common/src/main/java/com/yyy/common/exception/ServiceException.java @@ -0,0 +1,56 @@ +package com.yyy.common.exception; + +/** + * 业务异常 + */ +public final class ServiceException extends RuntimeException +{ + private static final long serialVersionUID = 1L; + + /** + * 错误提示 + */ + private String message; + + /** + * 错误明细,内部调试错误 + * + * 和 {@link CommonResult#getDetailMessage()} 一致的设计 + */ + private String detailMessage; + + /** + * 空构造方法,避免反序列化问题 + */ + public ServiceException() + { + } + + public ServiceException(String message) + { + this.message = message; + } + + public String getDetailMessage() + { + return detailMessage; + } + + public ServiceException setDetailMessage(String detailMessage) + { + this.detailMessage = detailMessage; + return this; + } + + @Override + public String getMessage() + { + return message; + } + + public ServiceException setMessage(String message) + { + this.message = message; + return this; + } +} \ No newline at end of file diff --git a/common/src/main/java/com/yyy/common/exception/UtilException.java b/common/src/main/java/com/yyy/common/exception/UtilException.java new file mode 100644 index 0000000..2760923 --- /dev/null +++ b/common/src/main/java/com/yyy/common/exception/UtilException.java @@ -0,0 +1,24 @@ +package com.yyy.common.exception; + +/** + * 工具类异常 + */ +public class UtilException extends RuntimeException +{ + private static final long serialVersionUID = 8247610319171014183L; + + public UtilException(Throwable e) + { + super(e.getMessage(), e); + } + + public UtilException(String message) + { + super(message); + } + + public UtilException(String message, Throwable throwable) + { + super(message, throwable); + } +} diff --git a/common/src/main/java/com/yyy/common/exception/base/BaseException.java b/common/src/main/java/com/yyy/common/exception/base/BaseException.java new file mode 100644 index 0000000..34babc7 --- /dev/null +++ b/common/src/main/java/com/yyy/common/exception/base/BaseException.java @@ -0,0 +1,21 @@ +package com.yyy.common.exception.base; + +import com.yyy.common.core.domain.Result; +import lombok.Getter; + +/** + * @Author: fy + * @Date: 2024/03/21 + * @Description:通用异常 + */ +@Getter +public class BaseException extends RuntimeException { + + private static final long serialVersionUID = 1L; + + private final Result result; + + public BaseException(Result result) { + this.result = result; + } +} diff --git a/common/src/main/java/com/yyy/common/exception/file/FileException.java b/common/src/main/java/com/yyy/common/exception/file/FileException.java new file mode 100644 index 0000000..ea5ac16 --- /dev/null +++ b/common/src/main/java/com/yyy/common/exception/file/FileException.java @@ -0,0 +1,17 @@ +package com.yyy.common.exception.file; + + +import com.yyy.common.core.domain.Result; +import com.yyy.common.exception.base.BaseException; + +/** + * 文件信息异常类 + */ +public class FileException extends BaseException { + private static final long serialVersionUID = 1L; + + public FileException(String code, Object[] args) { + super(new Result(Integer.parseInt(code), "[FileException]:" + args.toString())); + } + +} diff --git a/common/src/main/java/com/yyy/common/exception/file/FileNameLengthLimitExceededException.java b/common/src/main/java/com/yyy/common/exception/file/FileNameLengthLimitExceededException.java new file mode 100644 index 0000000..e5d5c72 --- /dev/null +++ b/common/src/main/java/com/yyy/common/exception/file/FileNameLengthLimitExceededException.java @@ -0,0 +1,13 @@ +package com.yyy.common.exception.file; + +/** + * 文件名称超长限制异常类 + * + */ +public class FileNameLengthLimitExceededException extends FileException { + private static final long serialVersionUID = 1L; + + public FileNameLengthLimitExceededException(int defaultFileNameLength) { + super("upload.filename.exceed.length", new Object[]{defaultFileNameLength}); + } +} diff --git a/common/src/main/java/com/yyy/common/exception/file/FileSizeLimitExceededException.java b/common/src/main/java/com/yyy/common/exception/file/FileSizeLimitExceededException.java new file mode 100644 index 0000000..c76cf69 --- /dev/null +++ b/common/src/main/java/com/yyy/common/exception/file/FileSizeLimitExceededException.java @@ -0,0 +1,14 @@ +package com.yyy.common.exception.file; + +/** + * 文件名大小限制异常类 + */ +public class FileSizeLimitExceededException extends FileException +{ + private static final long serialVersionUID = 1L; + + public FileSizeLimitExceededException(long defaultMaxSize) + { + super("upload.exceed.maxSize", new Object[] { defaultMaxSize }); + } +} diff --git a/common/src/main/java/com/yyy/common/exception/file/FileUploadException.java b/common/src/main/java/com/yyy/common/exception/file/FileUploadException.java new file mode 100644 index 0000000..6d8b7c7 --- /dev/null +++ b/common/src/main/java/com/yyy/common/exception/file/FileUploadException.java @@ -0,0 +1,59 @@ +package com.yyy.common.exception.file; + +import java.io.PrintStream; +import java.io.PrintWriter; + +/** + * 文件上传异常类 + */ +public class FileUploadException extends Exception +{ + + private static final long serialVersionUID = 1L; + + private final Throwable cause; + + public FileUploadException() + { + this(null, null); + } + + public FileUploadException(final String msg) + { + this(msg, null); + } + + public FileUploadException(String msg, Throwable cause) + { + super(msg); + this.cause = cause; + } + + @Override + public void printStackTrace(PrintStream stream) + { + super.printStackTrace(stream); + if (cause != null) + { + stream.println("Caused by:"); + cause.printStackTrace(stream); + } + } + + @Override + public void printStackTrace(PrintWriter writer) + { + super.printStackTrace(writer); + if (cause != null) + { + writer.println("Caused by:"); + cause.printStackTrace(writer); + } + } + + @Override + public Throwable getCause() + { + return cause; + } +} diff --git a/common/src/main/java/com/yyy/common/exception/file/InvalidExtensionException.java b/common/src/main/java/com/yyy/common/exception/file/InvalidExtensionException.java new file mode 100644 index 0000000..274f112 --- /dev/null +++ b/common/src/main/java/com/yyy/common/exception/file/InvalidExtensionException.java @@ -0,0 +1,78 @@ +package com.yyy.common.exception.file; + +import java.util.Arrays; + +/** + * 文件上传 误异常类 + */ +public class InvalidExtensionException extends FileUploadException +{ + private static final long serialVersionUID = 1L; + + private String[] allowedExtension; + private String extension; + private String filename; + + public InvalidExtensionException(String[] allowedExtension, String extension, String filename) + { + super("文件[" + filename + "]后缀[" + extension + "]不正确,请上传" + Arrays.toString(allowedExtension) + "格式"); + this.allowedExtension = allowedExtension; + this.extension = extension; + this.filename = filename; + } + + public String[] getAllowedExtension() + { + return allowedExtension; + } + + public String getExtension() + { + return extension; + } + + public String getFilename() + { + return filename; + } + + public static class InvalidImageExtensionException extends InvalidExtensionException + { + private static final long serialVersionUID = 1L; + + public InvalidImageExtensionException(String[] allowedExtension, String extension, String filename) + { + super(allowedExtension, extension, filename); + } + } + + public static class InvalidFlashExtensionException extends InvalidExtensionException + { + private static final long serialVersionUID = 1L; + + public InvalidFlashExtensionException(String[] allowedExtension, String extension, String filename) + { + super(allowedExtension, extension, filename); + } + } + + public static class InvalidMediaExtensionException extends InvalidExtensionException + { + private static final long serialVersionUID = 1L; + + public InvalidMediaExtensionException(String[] allowedExtension, String extension, String filename) + { + super(allowedExtension, extension, filename); + } + } + + public static class InvalidVideoExtensionException extends InvalidExtensionException + { + private static final long serialVersionUID = 1L; + + public InvalidVideoExtensionException(String[] allowedExtension, String extension, String filename) + { + super(allowedExtension, extension, filename); + } + } +} diff --git a/common/src/main/java/com/yyy/common/exception/job/TaskException.java b/common/src/main/java/com/yyy/common/exception/job/TaskException.java new file mode 100644 index 0000000..bda250e --- /dev/null +++ b/common/src/main/java/com/yyy/common/exception/job/TaskException.java @@ -0,0 +1,32 @@ +package com.yyy.common.exception.job; + +/** + * 计划策略异常 + */ +public class TaskException extends Exception +{ + private static final long serialVersionUID = 1L; + + private Code code; + + public TaskException(String msg, Code code) + { + this(msg, code, null); + } + + public TaskException(String msg, Code code, Exception nestedEx) + { + super(msg, nestedEx); + this.code = code; + } + + public Code getCode() + { + return code; + } + + public enum Code + { + TASK_EXISTS, NO_TASK_EXISTS, TASK_ALREADY_STARTED, UNKNOWN, CONFIG_ERROR, TASK_NODE_NOT_AVAILABLE + } +} \ No newline at end of file diff --git a/common/src/main/java/com/yyy/common/exception/user/BlackListException.java b/common/src/main/java/com/yyy/common/exception/user/BlackListException.java new file mode 100644 index 0000000..bb2c0e6 --- /dev/null +++ b/common/src/main/java/com/yyy/common/exception/user/BlackListException.java @@ -0,0 +1,14 @@ +package com.yyy.common.exception.user; + +/** + * 黑名单IP异常类 + */ +public class BlackListException extends UserException +{ + private static final long serialVersionUID = 1L; + + public BlackListException() + { + super("login.blocked", null); + } +} diff --git a/common/src/main/java/com/yyy/common/exception/user/CaptchaException.java b/common/src/main/java/com/yyy/common/exception/user/CaptchaException.java new file mode 100644 index 0000000..86c3fb6 --- /dev/null +++ b/common/src/main/java/com/yyy/common/exception/user/CaptchaException.java @@ -0,0 +1,16 @@ +package com.yyy.common.exception.user; + +/** + * 验证码错误异常类 + * + * @author ruoyi + */ +public class CaptchaException extends UserException +{ + private static final long serialVersionUID = 1L; + + public CaptchaException() + { + super("user.jcaptcha.error", null); + } +} diff --git a/common/src/main/java/com/yyy/common/exception/user/RoleBlockedException.java b/common/src/main/java/com/yyy/common/exception/user/RoleBlockedException.java new file mode 100644 index 0000000..ed20b0a --- /dev/null +++ b/common/src/main/java/com/yyy/common/exception/user/RoleBlockedException.java @@ -0,0 +1,14 @@ +package com.yyy.common.exception.user; + +/** + * 角色锁定异常类 + */ +public class RoleBlockedException extends UserException +{ + private static final long serialVersionUID = 1L; + + public RoleBlockedException() + { + super("role.blocked", null); + } +} diff --git a/common/src/main/java/com/yyy/common/exception/user/UserBlockedException.java b/common/src/main/java/com/yyy/common/exception/user/UserBlockedException.java new file mode 100644 index 0000000..eafde86 --- /dev/null +++ b/common/src/main/java/com/yyy/common/exception/user/UserBlockedException.java @@ -0,0 +1,14 @@ +package com.yyy.common.exception.user; + +/** + * 用户锁定异常类 + */ +public class UserBlockedException extends UserException +{ + private static final long serialVersionUID = 1L; + + public UserBlockedException() + { + super("user.blocked", null); + } +} diff --git a/common/src/main/java/com/yyy/common/exception/user/UserDeleteException.java b/common/src/main/java/com/yyy/common/exception/user/UserDeleteException.java new file mode 100644 index 0000000..0911591 --- /dev/null +++ b/common/src/main/java/com/yyy/common/exception/user/UserDeleteException.java @@ -0,0 +1,14 @@ +package com.yyy.common.exception.user; + +/** + * 用户账号已被删除 + */ +public class UserDeleteException extends UserException +{ + private static final long serialVersionUID = 1L; + + public UserDeleteException() + { + super("user.password.delete", null); + } +} diff --git a/common/src/main/java/com/yyy/common/exception/user/UserException.java b/common/src/main/java/com/yyy/common/exception/user/UserException.java new file mode 100644 index 0000000..116c506 --- /dev/null +++ b/common/src/main/java/com/yyy/common/exception/user/UserException.java @@ -0,0 +1,16 @@ +package com.yyy.common.exception.user; + + +import com.yyy.common.core.domain.Result; +import com.yyy.common.exception.base.BaseException; + +/** + * 用户信息异常类 + */ +public class UserException extends BaseException { + private static final long serialVersionUID = 1L; + + public UserException(String code, Object[] args) { + super(new Result(Integer.parseInt(code), "[UserException]:" + args.toString())); + } +} diff --git a/common/src/main/java/com/yyy/common/exception/user/UserNotExistsException.java b/common/src/main/java/com/yyy/common/exception/user/UserNotExistsException.java new file mode 100644 index 0000000..c489293 --- /dev/null +++ b/common/src/main/java/com/yyy/common/exception/user/UserNotExistsException.java @@ -0,0 +1,14 @@ +package com.yyy.common.exception.user; + +/** + * 用户不存在异常类 + */ +public class UserNotExistsException extends UserException +{ + private static final long serialVersionUID = 1L; + + public UserNotExistsException() + { + super("user.not.exists", null); + } +} diff --git a/common/src/main/java/com/yyy/common/exception/user/UserPasswordNotMatchException.java b/common/src/main/java/com/yyy/common/exception/user/UserPasswordNotMatchException.java new file mode 100644 index 0000000..8e07c00 --- /dev/null +++ b/common/src/main/java/com/yyy/common/exception/user/UserPasswordNotMatchException.java @@ -0,0 +1,14 @@ +package com.yyy.common.exception.user; + +/** + * 用户密码不正确或不符合规范异常类 + */ +public class UserPasswordNotMatchException extends UserException +{ + private static final long serialVersionUID = 1L; + + public UserPasswordNotMatchException() + { + super("user.password.not.match", null); + } +} diff --git a/common/src/main/java/com/yyy/common/exception/user/UserPasswordRetryLimitCountException.java b/common/src/main/java/com/yyy/common/exception/user/UserPasswordRetryLimitCountException.java new file mode 100644 index 0000000..4c79090 --- /dev/null +++ b/common/src/main/java/com/yyy/common/exception/user/UserPasswordRetryLimitCountException.java @@ -0,0 +1,14 @@ +package com.yyy.common.exception.user; + +/** + * 用户错误记数异常类 + */ +public class UserPasswordRetryLimitCountException extends UserException +{ + private static final long serialVersionUID = 1L; + + public UserPasswordRetryLimitCountException(int retryLimitCount) + { + super("user.password.retry.limit.count", new Object[] { retryLimitCount }); + } +} diff --git a/common/src/main/java/com/yyy/common/exception/user/UserPasswordRetryLimitExceedException.java b/common/src/main/java/com/yyy/common/exception/user/UserPasswordRetryLimitExceedException.java new file mode 100644 index 0000000..dfaf2e9 --- /dev/null +++ b/common/src/main/java/com/yyy/common/exception/user/UserPasswordRetryLimitExceedException.java @@ -0,0 +1,14 @@ +package com.yyy.common.exception.user; + +/** + * 用户错误最大次数异常类 + */ +public class UserPasswordRetryLimitExceedException extends UserException +{ + private static final long serialVersionUID = 1L; + + public UserPasswordRetryLimitExceedException(int retryLimitCount) + { + super("user.password.retry.limit.exceed", new Object[] { retryLimitCount }); + } +} diff --git a/common/src/main/java/com/yyy/common/factory/word/AbstractImportStrategy.java b/common/src/main/java/com/yyy/common/factory/word/AbstractImportStrategy.java new file mode 100644 index 0000000..c490a7c --- /dev/null +++ b/common/src/main/java/com/yyy/common/factory/word/AbstractImportStrategy.java @@ -0,0 +1,15 @@ +package com.yyy.common.factory.word; + + +import com.yyy.common.utils.poi.FormMetaData; + +import java.util.Map; + +/** + * 标签策略抽象类 + * + * 工厂模式创建策略 + */ +public abstract class AbstractImportStrategy implements ImportStrategy{ + public abstract void importData(Map data, FormMetaData e); +} diff --git a/common/src/main/java/com/yyy/common/factory/word/ImportStrategy.java b/common/src/main/java/com/yyy/common/factory/word/ImportStrategy.java new file mode 100644 index 0000000..f396320 --- /dev/null +++ b/common/src/main/java/com/yyy/common/factory/word/ImportStrategy.java @@ -0,0 +1,14 @@ +package com.yyy.common.factory.word; + + +import com.yyy.common.utils.poi.FormMetaData; + +import java.util.Map; + +/** + * 工厂策略模式(Strategy Pattern) + * 导入word标签数据 + */ +public interface ImportStrategy { + void importData(Map data, FormMetaData e); +} diff --git a/common/src/main/java/com/yyy/common/factory/word/strategy/labels/ChartMultiSeriesReferenceImportStrategy.java b/common/src/main/java/com/yyy/common/factory/word/strategy/labels/ChartMultiSeriesReferenceImportStrategy.java new file mode 100644 index 0000000..efd9da7 --- /dev/null +++ b/common/src/main/java/com/yyy/common/factory/word/strategy/labels/ChartMultiSeriesReferenceImportStrategy.java @@ -0,0 +1,43 @@ +package com.yyy.common.factory.word.strategy.labels; + +import com.deepoove.poi.data.ChartMultiSeriesRenderData; +import com.yyy.common.factory.word.AbstractImportStrategy; +import com.yyy.common.utils.poi.FormMetaData; + +import java.util.Map; + +/** + * Word引用标签:多系列图标 + *

+ * json样例: + * { + * "chartTitle": "ChartTitle", + * "categories": [ + * "中文", "English" + * ], + * "seriesDatas": [ + * { + * "name": "countries", + * "values": [ + * 15, 6 + * ] + * }, + * { + * "name": "speakers", + * "values": [ + * 223, 119 + * ] + * } + * ] + * } + */ +public class ChartMultiSeriesReferenceImportStrategy extends AbstractImportStrategy { + @Override + public void importData(Map data, FormMetaData e) { + if (e.getValue() instanceof ChartMultiSeriesRenderData) { + data.put(e.getKey(), e.getValue()); + } else { + //System.out.println("数据格式错误"); + } + } +} diff --git a/common/src/main/java/com/yyy/common/factory/word/strategy/labels/ChartSingleSeriesReferenceImportStrategy.java b/common/src/main/java/com/yyy/common/factory/word/strategy/labels/ChartSingleSeriesReferenceImportStrategy.java new file mode 100644 index 0000000..038ada5 --- /dev/null +++ b/common/src/main/java/com/yyy/common/factory/word/strategy/labels/ChartSingleSeriesReferenceImportStrategy.java @@ -0,0 +1,37 @@ +package com.yyy.common.factory.word.strategy.labels; + +import com.deepoove.poi.data.ChartSingleSeriesRenderData; +import com.yyy.common.factory.word.AbstractImportStrategy; +import com.yyy.common.utils.poi.FormMetaData; + +import java.util.Map; + +/** + * Word引用标签:单系列图标 + *

+ * json样例: + * { + * "chartTitle": "ChartTitle", + * "categories": [ + * "美国", + * "中国" + * ], + * "seriesData": { + * "name": "countries", + * "values": [ + * 9826675, + * 9596961 + * ] + * } + * } + */ +public class ChartSingleSeriesReferenceImportStrategy extends AbstractImportStrategy { + @Override + public void importData(Map data, FormMetaData e) { + if (e.getValue() instanceof ChartSingleSeriesRenderData) { + data.put(e.getKey(), e.getValue()); + } else { + //System.out.println("数据格式错误"); + } + } +} diff --git a/common/src/main/java/com/yyy/common/factory/word/strategy/labels/ChartsReferenceImportStrategy.java b/common/src/main/java/com/yyy/common/factory/word/strategy/labels/ChartsReferenceImportStrategy.java new file mode 100644 index 0000000..5902d02 --- /dev/null +++ b/common/src/main/java/com/yyy/common/factory/word/strategy/labels/ChartsReferenceImportStrategy.java @@ -0,0 +1,43 @@ +package com.yyy.common.factory.word.strategy.labels; + +import com.deepoove.poi.data.ChartMultiSeriesRenderData; +import com.yyy.common.factory.word.AbstractImportStrategy; +import com.yyy.common.utils.poi.FormMetaData; + +import java.util.Map; + +/** + * Word引用标签:组合图表 + * + * json样例: + * { + * "chartTitle": "ChartTitle", + * "categories": [ + * "中文", "English" + * ], + * "seriesDatas": [ + * { + * "name": "countries", + * "values": [ + * 15, 6 + * ] + * }, + * { + * "name": "speakers", + * "values": [ + * 223, 119 + * ] + * } + * ] + * } + */ +public class ChartsReferenceImportStrategy extends AbstractImportStrategy { + @Override + public void importData(Map data, FormMetaData e) { + if (e.getValue() instanceof ChartMultiSeriesRenderData) { + data.put(e.getKey(), e.getValue()); + } else { + //System.out.println("数据格式错误"); + } + } +} diff --git a/common/src/main/java/com/yyy/common/factory/word/strategy/labels/ImgReferenceImportStrategy.java b/common/src/main/java/com/yyy/common/factory/word/strategy/labels/ImgReferenceImportStrategy.java new file mode 100644 index 0000000..815737a --- /dev/null +++ b/common/src/main/java/com/yyy/common/factory/word/strategy/labels/ImgReferenceImportStrategy.java @@ -0,0 +1,22 @@ +package com.yyy.common.factory.word.strategy.labels; + +import com.deepoove.poi.data.Pictures; +import com.yyy.common.factory.word.AbstractImportStrategy; +import com.yyy.common.utils.poi.FormMetaData; + +import java.util.Map; + +/** + * Word引用标签:图片 + * + */ +public class ImgReferenceImportStrategy extends AbstractImportStrategy { + @Override + public void importData(Map data, FormMetaData e) { + if (e.getValue() instanceof String) { + data.put(e.getKey(), Pictures.ofLocal((String) e.getValue()).create()); + } else { + //System.out.println("数据格式错误"); + } + } +} diff --git a/common/src/main/java/com/yyy/common/factory/word/strategy/labels/IncludeImportStrategy.java b/common/src/main/java/com/yyy/common/factory/word/strategy/labels/IncludeImportStrategy.java new file mode 100644 index 0000000..86a8a15 --- /dev/null +++ b/common/src/main/java/com/yyy/common/factory/word/strategy/labels/IncludeImportStrategy.java @@ -0,0 +1,23 @@ +package com.yyy.common.factory.word.strategy.labels; + +import com.deepoove.poi.data.DocxRenderData; +import com.yyy.common.factory.word.AbstractImportStrategy; +import com.yyy.common.utils.poi.FormMetaData; + +import java.util.Map; + +/** + * Word标签:嵌套 + *

+ * json样例: + */ +public class IncludeImportStrategy extends AbstractImportStrategy { + @Override + public void importData(Map data, FormMetaData e) { + if (e.getValue() instanceof DocxRenderData) { + data.put(e.getKey(), e.getValue()); + } else { + //System.out.println("数据格式错误"); + } + } +} diff --git a/common/src/main/java/com/yyy/common/factory/word/strategy/labels/LoopColumnTableImportStrategy.java b/common/src/main/java/com/yyy/common/factory/word/strategy/labels/LoopColumnTableImportStrategy.java new file mode 100644 index 0000000..69aafb6 --- /dev/null +++ b/common/src/main/java/com/yyy/common/factory/word/strategy/labels/LoopColumnTableImportStrategy.java @@ -0,0 +1,28 @@ +package com.yyy.common.factory.word.strategy.labels; + +import com.alibaba.fastjson.JSONObject; +import com.yyy.common.factory.word.AbstractImportStrategy; +import com.yyy.common.utils.poi.FormMetaData; + +import java.util.List; +import java.util.Map; + +/** + * Word插件标签:表格列循环 + * + * json样例: + + */ +public class LoopColumnTableImportStrategy extends AbstractImportStrategy { + @Override + public void importData(Map data, FormMetaData e) { + if (e.getValue() instanceof List) { + data.put(e.getKey(), e.getValue()); + } else { + JSONObject config = JSONObject.parseObject(JSONObject.toJSONString(e.getValue())); + if (config.containsKey("value")){ + data.put(e.getKey(), config.getJSONArray("value")); + } + } + } +} \ No newline at end of file diff --git a/common/src/main/java/com/yyy/common/factory/word/strategy/labels/LoopRowTableImportStrategy.java b/common/src/main/java/com/yyy/common/factory/word/strategy/labels/LoopRowTableImportStrategy.java new file mode 100644 index 0000000..3a9c44c --- /dev/null +++ b/common/src/main/java/com/yyy/common/factory/word/strategy/labels/LoopRowTableImportStrategy.java @@ -0,0 +1,52 @@ +package com.yyy.common.factory.word.strategy.labels; + +import com.alibaba.fastjson.JSONObject; +import com.yyy.common.factory.word.AbstractImportStrategy; +import com.yyy.common.utils.poi.FormMetaData; + +import java.util.List; +import java.util.Map; + +/** + * Word插件标签:表格行循环 + * + * json样例: + + */ +public class LoopRowTableImportStrategy extends AbstractImportStrategy { + @Override + public void importData(Map data, FormMetaData e) { + if (e.getValue() instanceof List) { + data.put(e.getKey(), e.getValue()); + } else { +// { +// "fields": [ +// "key1", +// "key2", +// "key3" +// ], +// "value": [ +// { +// "key1": "value1", +// "key2": "value2", +// "key3": "value3" +// }, +// { +// "key1": "value11", +// "key2": "value22", +// "key3": "value33" +// }, +// { +// "key1": "value111", +// "key2": "value222", +// "key3": "value333" +// } +// ] +// } + JSONObject config = JSONObject.parseObject(JSONObject.toJSONString(e.getValue())); + if (config.containsKey("value")){ + data.put(e.getKey(), config.getJSONArray("value")); + } + } + } +} \ No newline at end of file diff --git a/common/src/main/java/com/yyy/common/factory/word/strategy/labels/NumberingImportStrategy.java b/common/src/main/java/com/yyy/common/factory/word/strategy/labels/NumberingImportStrategy.java new file mode 100644 index 0000000..cba2161 --- /dev/null +++ b/common/src/main/java/com/yyy/common/factory/word/strategy/labels/NumberingImportStrategy.java @@ -0,0 +1,22 @@ +package com.yyy.common.factory.word.strategy.labels; + +import com.deepoove.poi.data.NumberingRenderData; +import com.yyy.common.factory.word.AbstractImportStrategy; +import com.yyy.common.utils.poi.FormMetaData; + +import java.util.Map; + +/** + * Word标签:列表 + * + */ +public class NumberingImportStrategy extends AbstractImportStrategy { + @Override + public void importData(Map data, FormMetaData e) { + if (e.getValue() instanceof NumberingRenderData) { + data.put(e.getKey(), e.getValue()); + } else { + //System.out.println("数据格式错误"); + } + } +} diff --git a/common/src/main/java/com/yyy/common/factory/word/strategy/labels/PictureImportStrategy.java b/common/src/main/java/com/yyy/common/factory/word/strategy/labels/PictureImportStrategy.java new file mode 100644 index 0000000..a85c45e --- /dev/null +++ b/common/src/main/java/com/yyy/common/factory/word/strategy/labels/PictureImportStrategy.java @@ -0,0 +1,32 @@ +package com.yyy.common.factory.word.strategy.labels; + +import com.deepoove.poi.data.PictureRenderData; +import com.yyy.common.factory.word.AbstractImportStrategy; +import com.yyy.common.utils.poi.FormMetaData; + +import java.util.Map; + +/** + * Word标签:图片 + * + * json样例: + * { + * "pictureType" : "PNG", + * "path": "logo.png", + * "pictureStyle": { + * "width": 100, + * "height": 100 + * }, + * "altMeta": "图片不存在" + * } + */ +public class PictureImportStrategy extends AbstractImportStrategy { + @Override + public void importData(Map data, FormMetaData e) { + if (e.getValue() instanceof String || e.getValue() instanceof PictureRenderData) { + data.put(e.getKey(), e.getValue()); + } else { + //System.out.println("数据格式错误"); + } + } +} diff --git a/common/src/main/java/com/yyy/common/factory/word/strategy/labels/SectionImportStrategy.java b/common/src/main/java/com/yyy/common/factory/word/strategy/labels/SectionImportStrategy.java new file mode 100644 index 0000000..65d3adf --- /dev/null +++ b/common/src/main/java/com/yyy/common/factory/word/strategy/labels/SectionImportStrategy.java @@ -0,0 +1,59 @@ +package com.yyy.common.factory.word.strategy.labels; + + +import com.alibaba.fastjson.JSONObject; +import com.yyy.common.factory.word.AbstractImportStrategy; +import com.yyy.common.utils.poi.FormMetaData; + +import java.util.HashMap; +import java.util.Map; + +/** + * Word标签:区块对 + * + * json样例: + * { + * "announce": false + * } + * + * + * template.docx + * Made it,Ma!{{?announce}}Top of the world!{{/announce}} + * + * Made it,Ma! + * + * {{?announce}} + * + * Top of the world! + * + * {{/announce}} + */ +public class SectionImportStrategy extends AbstractImportStrategy { + //当数据为false,null,集合大小为0时,区块对的内容不展示 + // map.put("section1",false); + // map.put("section2",null); + // map.put("section3",new ArrayList()); + // String name = "jack"; + // map.put("section5",name); + // HashMap stringObjectHashMap = new HashMap<>(); + // stringObjectHashMap.put("value",strings); + // map.put("section6",stringObjectHashMap); + @Override + public void importData(Map data, FormMetaData e) { +// "value": { +// "fields": [ +// "选项1", +// "选项2", +// "选项3" +// ], +// "value": "选项1" +// } + + JSONObject config = JSONObject.parseObject(JSONObject.toJSONString(e.getValue())); + if (config.containsKey("value")){ + Map value = new HashMap(); + value.put(config.getString("value"), "√"); + data.put(e.getKey(), value); + } + } +} diff --git a/common/src/main/java/com/yyy/common/factory/word/strategy/labels/TableImportStrategy.java b/common/src/main/java/com/yyy/common/factory/word/strategy/labels/TableImportStrategy.java new file mode 100644 index 0000000..c174b09 --- /dev/null +++ b/common/src/main/java/com/yyy/common/factory/word/strategy/labels/TableImportStrategy.java @@ -0,0 +1,62 @@ +package com.yyy.common.factory.word.strategy.labels; + +import com.deepoove.poi.data.TableRenderData; +import com.yyy.common.factory.word.AbstractImportStrategy; +import com.yyy.common.utils.poi.FormMetaData; + +import java.util.Map; + +/** + * Word标签:表格 + *

+ * json样例: + * { + * "rows": [ + * { + * "cells": [ + * { + * "paragraphs": [ + * { + * "contents": [ + * { + * [TextRenderData] + * }, + * { + * [PictureRenderData] + * } + * ], + * "paragraphStyle": null + * } + * ], + * "cellStyle": { + * "backgroundColor": "00000", + * "vertAlign": "CENTER" + * } + * } + * ], + * "rowStyle": { + * "height": 2.0f + * } + * } + * ], + * "tableStyle": { + * "width": 14.63f, + * "colWidths": null + * }, + * "mergeRule": { + * "mapping": { + * "0-0": "1-2" + * } + * } + * } + */ +public class TableImportStrategy extends AbstractImportStrategy { + @Override + public void importData(Map data, FormMetaData e) { + if (e.getValue() instanceof TableRenderData) { + data.put(e.getKey(), e.getValue()); + } else { + //System.out.println("数据格式错误"); + } + } +} diff --git a/common/src/main/java/com/yyy/common/factory/word/strategy/labels/TextImportStrategy.java b/common/src/main/java/com/yyy/common/factory/word/strategy/labels/TextImportStrategy.java new file mode 100644 index 0000000..5d65ace --- /dev/null +++ b/common/src/main/java/com/yyy/common/factory/word/strategy/labels/TextImportStrategy.java @@ -0,0 +1,38 @@ +package com.yyy.common.factory.word.strategy.labels; + +import com.deepoove.poi.data.TextRenderData; +import com.yyy.common.factory.word.AbstractImportStrategy; +import com.yyy.common.utils.poi.FormMetaData; + +import java.util.Map; + +/** + * Word标签:文本 + * + * json样例: + * { + * "text": "Sayi", + * "style": { + * "strike": false, + * "bold": true, + * "italic": false, + * "color": "00FF00", + * "underLine": false, + * "fontFamily": "微软雅黑", + * "fontSize": 12, + * "highlightColor": "green", + * "vertAlign": "superscript", + * "characterSpacing" : 20 + * } + * } + */ +public class TextImportStrategy extends AbstractImportStrategy { + @Override + public void importData(Map data, FormMetaData e) { + if (e.getValue() instanceof String || e.getValue() instanceof TextRenderData) { + data.put(e.getKey(), e.getValue()); + } else { + //System.out.println("数据格式错误"); + } + } +} \ No newline at end of file diff --git a/common/src/main/java/com/yyy/common/factory/word/strategy/plugins/MyLoopRowTableRenderPolicy.java b/common/src/main/java/com/yyy/common/factory/word/strategy/plugins/MyLoopRowTableRenderPolicy.java new file mode 100644 index 0000000..bbc4242 --- /dev/null +++ b/common/src/main/java/com/yyy/common/factory/word/strategy/plugins/MyLoopRowTableRenderPolicy.java @@ -0,0 +1,158 @@ +package com.yyy.common.factory.word.strategy.plugins; + +import com.deepoove.poi.XWPFTemplate; +import com.deepoove.poi.exception.RenderException; +import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy; +import com.deepoove.poi.policy.RenderPolicy; +import com.deepoove.poi.render.compute.EnvModel; +import com.deepoove.poi.render.compute.RenderDataCompute; +import com.deepoove.poi.render.processor.DocumentProcessor; +import com.deepoove.poi.render.processor.EnvIterator; +import com.deepoove.poi.resolver.TemplateResolver; +import com.deepoove.poi.template.ElementTemplate; +import com.deepoove.poi.template.MetaTemplate; +import com.deepoove.poi.template.run.RunTemplate; +import com.deepoove.poi.util.ReflectionUtils; +import com.deepoove.poi.util.TableTools; +import org.apache.poi.xwpf.usermodel.*; +import org.apache.xmlbeans.XmlCursor; +import org.apache.xmlbeans.XmlObject; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTRow; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTcPr; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTVMerge; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.STMerge; + +import java.util.Iterator; +import java.util.List; + +/** + * 完善对空白行的处理 + */ +public class MyLoopRowTableRenderPolicy implements RenderPolicy { + private String prefix; + private String suffix; + private boolean onSameLine; + + public MyLoopRowTableRenderPolicy() { + this(false); + } + + public MyLoopRowTableRenderPolicy(boolean onSameLine) { + this("[", "]", onSameLine); + } + + public MyLoopRowTableRenderPolicy(String prefix, String suffix) { + this(prefix, suffix, false); + } + + public MyLoopRowTableRenderPolicy(String prefix, String suffix, boolean onSameLine) { + this.prefix = prefix; + this.suffix = suffix; + this.onSameLine = onSameLine; + } + + public void render(ElementTemplate eleTemplate, Object data, XWPFTemplate template) { + RunTemplate runTemplate = (RunTemplate) eleTemplate; + XWPFRun run = runTemplate.getRun(); + try { + if (!TableTools.isInsideTable(run)) { + throw new IllegalStateException("The template tag " + runTemplate.getSource() + " must be inside a table"); + } else { + // 获取包含模板标签的单元格 + XWPFTableCell tagCell = (XWPFTableCell) ((XWPFParagraph) run.getParent()).getBody(); + XWPFTable table = tagCell.getTableRow().getTable(); + run.setText("", 0); // 清空运行对象的文本内容 + int templateRowIndex = this.getTemplateRowIndex(tagCell); // 获取模板行的索引 + if (data != null && data instanceof Iterable) { + Iterator iterator = ((Iterable) data).iterator(); + XWPFTableRow templateRow = table.getRow(templateRowIndex); + TemplateResolver resolver = new TemplateResolver(template.getConfig().copy(this.prefix, this.suffix)); + boolean firstFlag = true; + int index = 0; + boolean hasNext = iterator.hasNext(); + while (hasNext) { + Object root = iterator.next(); + hasNext = iterator.hasNext(); + int insertPosition = templateRowIndex++; + // 检查插入位置下方是否有空白行 + boolean hasEmptyRowBelow = false; + if (insertPosition < table.getNumberOfRows()) { + XWPFTableRow rowBelow = table.getRow(insertPosition); + if (isRowEmpty(rowBelow)) { + hasEmptyRowBelow = true; + } + } + // 仅当下方没有空白行时,才插入新行 + if (!hasEmptyRowBelow) { + // 新建一行 + table.insertNewTableRow(insertPosition); + this.setTableRow(table, templateRow, insertPosition); + // 获取新插入行的游标 + XmlCursor newCursor = templateRow.getCtRow().newCursor(); + newCursor.toPrevSibling(); + XmlObject object = newCursor.getObject(); + XWPFTableRow nextRow = new XWPFTableRow((CTRow) object, table); + if (!firstFlag) { + // 处理单元格的垂直合并属性 + for (XWPFTableCell cell : nextRow.getTableCells()) { + CTTcPr tcPr = TableTools.getTcPr(cell); + CTVMerge vMerge = tcPr.getVMerge(); + if (vMerge != null && STMerge.RESTART == vMerge.getVal()) { + vMerge.setVal(STMerge.CONTINUE); + } + } + } else { + firstFlag = false; + } + this.setTableRow(table, nextRow, insertPosition); + // 计算渲染数据 + RenderDataCompute dataCompute = template.getConfig() + .getRenderDataComputeFactory() + .newCompute(EnvModel.of(root, EnvIterator.makeEnv(index++, hasNext))); + // 渲染每个单元格 + List cells = nextRow.getTableCells(); + for (XWPFTableCell cell : cells) { + List templates = resolver.resolveBodyElements(cell.getBodyElements()); + new DocumentProcessor(template, resolver, dataCompute).process(templates); + } + } + } + } + // 移除模板行 + table.removeRow(templateRowIndex); + this.afterloop(table, data); + } + } catch (Exception e) { + throw new RenderException("HackLoopTable for " + eleTemplate + " error: " + e.getMessage(), e); + } + } + + private int getTemplateRowIndex(XWPFTableCell tagCell) { + XWPFTableRow tagRow = tagCell.getTableRow(); + return this.onSameLine ? this.getRowIndex(tagRow) : this.getRowIndex(tagRow) + 1; + } + + protected void afterloop(XWPFTable table, Object data) { + } + + private void setTableRow(XWPFTable table, XWPFTableRow templateRow, int pos) { + List rows = (List) ReflectionUtils.getValue("tableRows", table); + rows.set(pos, templateRow); + table.getCTTbl().setTrArray(pos, templateRow.getCtRow()); + } + + private int getRowIndex(XWPFTableRow row) { + List rows = row.getTable().getRows(); + return rows.indexOf(row); + } + + private boolean isRowEmpty(XWPFTableRow row) { + for (XWPFTableCell cell : row.getTableCells()) { + String text = cell.getText(); + if (text != null && !text.trim().isEmpty()) { + return false; + } + } + return true; + } +} diff --git a/common/src/main/java/com/yyy/common/form/FieldData.java b/common/src/main/java/com/yyy/common/form/FieldData.java new file mode 100644 index 0000000..ca6c54d --- /dev/null +++ b/common/src/main/java/com/yyy/common/form/FieldData.java @@ -0,0 +1,68 @@ +package com.yyy.common.form; + +import com.alibaba.fastjson.annotation.JSONField; +import com.alibaba.fastjson.serializer.SerializerFeature; +import com.yyy.common.annotation.excel.Excel; +import com.yyy.common.enums.FieldDataTypeEnum; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; + +import java.io.Serializable; + +/** + * 表单字段基本单元 + */ +@Data +@AllArgsConstructor +@Builder +@ApiModel("表单字段基本单元") +public class FieldData implements Serializable { + private static final long serialVersionUID = 1L; + /** + * 标识符 + */ + @ApiModelProperty(notes = "标识符") + @Excel(name = "标识符") + private String key; + + /** + * 名称 + */ + @ApiModelProperty(notes = "名称") + @Excel(name = "名称") + private String name; + + /** + * 数据 + */ + @ApiModelProperty(notes = "数据") + @Excel(name = "数据") + private Object value; + + /** + * 类型 + */ + @ApiModelProperty(notes = "类型 (String=文本,Number=数字,Date=日期,Radio=单选框,List=列表数据)") + @Excel(name = "类型", readConverterExp = "String=文本,Number=数字,Date=日期,Radio=单选框,List=列表数据", combo = "文本,数字,日期,单选框,列表数据") + private FieldDataTypeEnum type; + + /** + * 排序(从小到大) 默认为0 + */ + @ApiModelProperty(notes = "数据(默认值为0)") + private Integer sort; + + @ApiModelProperty(notes = "备注") + private String remark; + + public void setType(String type) { + this.type = FieldDataTypeEnum.fromTypeName(type); + } + + public FieldData() { + this.sort = 0; + } +} diff --git a/common/src/main/java/com/yyy/common/utils/bean/BeanUtils.java b/common/src/main/java/com/yyy/common/utils/bean/BeanUtils.java new file mode 100644 index 0000000..fb50e9c --- /dev/null +++ b/common/src/main/java/com/yyy/common/utils/bean/BeanUtils.java @@ -0,0 +1,104 @@ +package com.yyy.common.utils.bean; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * @Author: fy + * @Date: 2024/03/25 + * @Description: Bean 工具类 + */ +public class BeanUtils extends org.springframework.beans.BeanUtils { + /** + * Bean方法名中属性名开始的下标 + */ + private static final int BEAN_METHOD_PROP_INDEX = 3; + + /** + * 匹配getter方法的正则表达式 + */ + private static final Pattern GET_PATTERN = Pattern.compile("get(\\p{javaUpperCase}\\w*)"); + + /** + * 匹配setter方法的正则表达式 + */ + private static final Pattern SET_PATTERN = Pattern.compile("set(\\p{javaUpperCase}\\w*)"); + + /** + * Bean属性复制工具方法。 + * + * @param dest 目标对象 + * @param src 源对象 + */ + public static void copyBeanProp(Object dest, Object src) { + try { + copyProperties(src, dest); + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * 获取对象的setter方法。 + * + * @param obj 对象 + * @return 对象的setter方法列表 + */ + public static List getSetterMethods(Object obj) { + // setter方法列表 + List setterMethods = new ArrayList(); + + // 获取所有方法 + Method[] methods = obj.getClass().getMethods(); + + // 查找setter方法 + + for (Method method : methods) { + Matcher m = SET_PATTERN.matcher(method.getName()); + if (m.matches() && (method.getParameterTypes().length == 1)) { + setterMethods.add(method); + } + } + // 返回setter方法列表 + return setterMethods; + } + + /** + * 获取对象的getter方法。 + * + * @param obj 对象 + * @return 对象的getter方法列表 + */ + + public static List getGetterMethods(Object obj) { + // getter方法列表 + List getterMethods = new ArrayList(); + // 获取所有方法 + Method[] methods = obj.getClass().getMethods(); + // 查找getter方法 + for (Method method : methods) { + Matcher m = GET_PATTERN.matcher(method.getName()); + if (m.matches() && (method.getParameterTypes().length == 0)) { + getterMethods.add(method); + } + } + // 返回getter方法列表 + return getterMethods; + } + + /** + * 检查Bean方法名中的属性名是否相等。
+ * 如getName()和setName()属性名一样,getName()和setAge()属性名不一样。 + * + * @param m1 方法名1 + * @param m2 方法名2 + * @return 属性名一样返回true,否则返回false + */ + + public static boolean isMethodPropEquals(String m1, String m2) { + return m1.substring(BEAN_METHOD_PROP_INDEX).equals(m2.substring(BEAN_METHOD_PROP_INDEX)); + } +} \ No newline at end of file diff --git a/common/src/main/java/com/yyy/common/utils/chart/ChartValue.java b/common/src/main/java/com/yyy/common/utils/chart/ChartValue.java new file mode 100644 index 0000000..47ca6ef --- /dev/null +++ b/common/src/main/java/com/yyy/common/utils/chart/ChartValue.java @@ -0,0 +1,19 @@ +package com.yyy.common.utils.chart; + +import io.swagger.annotations.ApiModel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@ApiModel("柱状图、饼图类型数据") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class ChartValue implements Serializable { + private String name; + private Long value; +} diff --git a/common/src/main/java/com/yyy/common/utils/common/CMDUtils.java b/common/src/main/java/com/yyy/common/utils/common/CMDUtils.java new file mode 100644 index 0000000..35bae82 --- /dev/null +++ b/common/src/main/java/com/yyy/common/utils/common/CMDUtils.java @@ -0,0 +1,28 @@ +package com.yyy.common.utils.common; + +import lombok.extern.slf4j.Slf4j; + +import java.io.IOException; + +@Slf4j +public class CMDUtils { + /** + * 执行命令行 + * + * @param cmd 命令行 + * @return + */ + public static boolean executeLinuxCmd(String cmd) { + try { + Process process = Runtime.getRuntime().exec(cmd); + process.waitFor(); + } catch (InterruptedException e) { + log.error("executeLinuxCmd 执行Linux命令异常:", e); + Thread.currentThread().interrupt(); + return false; + } catch (IOException e) { + log.error("获取系统命令执行环境异常", e); + } + return true; + } +} diff --git a/common/src/main/java/com/yyy/common/utils/common/CacheUtils.java b/common/src/main/java/com/yyy/common/utils/common/CacheUtils.java new file mode 100644 index 0000000..8e74330 --- /dev/null +++ b/common/src/main/java/com/yyy/common/utils/common/CacheUtils.java @@ -0,0 +1,358 @@ +package com.yyy.common.utils.common; + + +import java.util.Iterator; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +import com.yyy.common.utils.spring.SpringUtils; +import org.apache.shiro.cache.Cache; +import org.apache.shiro.cache.CacheManager; +import org.apache.shiro.cache.ehcache.EhCacheManager; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Cache缓存工具类 + */ +public class CacheUtils { + private static Logger logger = LoggerFactory.getLogger(CacheUtils.class); + + private static final String SYS_CACHE = "sys-cache"; + + /** + * 全局缓存(本地),可切换成redis + */ + private static final Map> caches = new ConcurrentHashMap<>(); + + /** + * 获取SYS_CACHE缓存 + * + * @param key + * @return + */ + public static Object get(String key) { + return get(SYS_CACHE, key); + } + + /** + * 获取SYS_CACHE缓存 + * + * @param key + * @param defaultValue + * @return + */ + public static Object get(String key, Object defaultValue) { + Object value = get(SYS_CACHE, key); + return value != null ? value : defaultValue; + } + + /** + * 写入SYS_CACHE缓存 + * + * @param key + * @param value + */ + public static void put(String key, Object value) { + put(SYS_CACHE, key, value); + } + + /** + * 从SYS_CACHE缓存中移除 + * + * @param key + */ + public static void remove(String key) { + remove(SYS_CACHE, key); + } + + /** + * 获取缓存 + * + * @param cacheName + * @param key + * @return + */ + public static Object get(String cacheName, String key) { + return getCache(cacheName).get(getKey(key)); + } + + /** + * 获取缓存 + * + * @param cacheName + * @param key + * @param defaultValue + * @return + */ + public static Object get(String cacheName, String key, Object defaultValue) { + Object value = get(cacheName, key); + return value != null ? value : defaultValue; + } + + /** + * 写入缓存 + * + * @param cacheName + * @param key + * @param value + */ + public static void put(String cacheName, String key, Object value) { + getCache(cacheName).put(getKey(key), value); + } + + /** + * 从缓存中移除 + * + * @param cacheName + * @param key + */ + public static void remove(String cacheName, String key) { + getCache(cacheName).remove(getKey(key)); + } + + /** + * 从缓存中移除所有 + * + * @param cacheName + */ + public static void removeAll(String cacheName) { + Map cache = getCache(cacheName); + Set keys = cache.keySet(); + for (Iterator it = keys.iterator(); it.hasNext(); ) { + cache.remove(it.next()); + } + logger.info("清理缓存: {} => {}", cacheName, keys); + } + + /** + * 从缓存中移除指定key + * + * @param keys + */ + public static void removeByKeys(Set keys) { + removeByKeys(SYS_CACHE, keys); + } + + /** + * 从缓存中移除指定key + * + * @param cacheName + * @param keys + */ + public static void removeByKeys(String cacheName, Set keys) { + for (Iterator it = keys.iterator(); it.hasNext(); ) { + remove(cacheName, it.next()); + } + logger.info("清理缓存: {} => {}", cacheName, keys); + } + + /** + * 获取缓存键名 + * + * @param key + * @return + */ + private static String getKey(String key) { + return key; + } + + /** + * 获得一个Cache,没有则创建一个新的Cache。 + * + * @param cacheName + * @return + */ + public static Map getCache(String cacheName) { + return caches.computeIfAbsent(cacheName, k -> new ConcurrentHashMap<>()); + } + + /** + * 获取所有缓存名称 + * + * @return 缓存组 + */ + public static Set getCacheNames() { + return caches.keySet(); + } + +// private static Logger logger = LoggerFactory.getLogger(CacheUtils.class); +// +// private static CacheManager cacheManager = SpringUtils.getBean(CacheManager.class); +// +// private static final String SYS_CACHE = "sys-cache"; +// +// /** +// * 获取SYS_CACHE缓存 +// * +// * @param key +// * @return +// */ +// public static Object get(String key) +// { +// return get(SYS_CACHE, key); +// } +// +// /** +// * 获取SYS_CACHE缓存 +// * +// * @param key +// * @param defaultValue +// * @return +// */ +// public static Object get(String key, Object defaultValue) +// { +// Object value = get(key); +// return value != null ? value : defaultValue; +// } +// +// /** +// * 写入SYS_CACHE缓存 +// * +// * @param key +// * @return +// */ +// public static void put(String key, Object value) +// { +// put(SYS_CACHE, key, value); +// } +// +// /** +// * 从SYS_CACHE缓存中移除 +// * +// * @param key +// * @return +// */ +// public static void remove(String key) +// { +// remove(SYS_CACHE, key); +// } +// +// /** +// * 获取缓存 +// * +// * @param cacheName +// * @param key +// * @return +// */ +// public static Object get(String cacheName, String key) +// { +// return getCache(cacheName).get(getKey(key)); +// } +// +// /** +// * 获取缓存 +// * +// * @param cacheName +// * @param key +// * @param defaultValue +// * @return +// */ +// public static Object get(String cacheName, String key, Object defaultValue) +// { +// Object value = get(cacheName, getKey(key)); +// return value != null ? value : defaultValue; +// } +// +// /** +// * 写入缓存 +// * +// * @param cacheName +// * @param key +// * @param value +// */ +// public static void put(String cacheName, String key, Object value) +// { +// getCache(cacheName).put(getKey(key), value); +// } +// +// /** +// * 从缓存中移除 +// * +// * @param cacheName +// * @param key +// */ +// public static void remove(String cacheName, String key) +// { +// getCache(cacheName).remove(getKey(key)); +// } +// +// /** +// * 从缓存中移除所有 +// * +// * @param cacheName +// */ +// public static void removeAll(String cacheName) +// { +// Cache cache = getCache(cacheName); +// Set keys = cache.keys(); +// for (Iterator it = keys.iterator(); it.hasNext();) +// { +// cache.remove(it.next()); +// } +// logger.info("清理缓存: {} => {}", cacheName, keys); +// } +// +// /** +// * 从缓存中移除指定key +// * +// * @param keys +// */ +// public static void removeByKeys(Set keys) +// { +// removeByKeys(SYS_CACHE, keys); +// } +// +// /** +// * 从缓存中移除指定key +// * +// * @param cacheName +// * @param keys +// */ +// public static void removeByKeys(String cacheName, Set keys) +// { +// for (Iterator it = keys.iterator(); it.hasNext();) +// { +// remove(it.next()); +// } +// logger.info("清理缓存: {} => {}", cacheName, keys); +// } +// +// /** +// * 获取缓存键名 +// * +// * @param key +// * @return +// */ +// private static String getKey(String key) +// { +// return key; +// } +// +// /** +// * 获得一个Cache,没有则显示日志。 +// * +// * @param cacheName +// * @return +// */ +// public static Cache getCache(String cacheName) +// { +// Cache cache = cacheManager.getCache(cacheName); +// if (cache == null) +// { +// throw new RuntimeException("当前系统中没有定义“" + cacheName + "”这个缓存。"); +// } +// return cache; +// } +// +// /** +// * 获取所有缓存 +// * +// * @return 缓存组 +// */ +// public static String[] getCacheNames() +// { +// return ((EhCacheManager) cacheManager).getCacheManager().getCacheNames(); +// } +} diff --git a/common/src/main/java/com/yyy/common/utils/common/DateUtils.java b/common/src/main/java/com/yyy/common/utils/common/DateUtils.java new file mode 100644 index 0000000..425ad6b --- /dev/null +++ b/common/src/main/java/com/yyy/common/utils/common/DateUtils.java @@ -0,0 +1,250 @@ +package com.yyy.common.utils.common; + +import org.apache.commons.lang3.time.DateFormatUtils; + +import java.lang.management.ManagementFactory; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.*; +import java.util.Calendar; +import java.util.Date; +import java.util.TimeZone; + +/** + * @Author: fy + * @Date: 2024/03/22 + * @Description:时间工具类 + */ +public class DateUtils extends org.apache.commons.lang3.time.DateUtils +{ + public static String YYYY = "yyyy"; + + public static String YYYY_MM = "yyyy-MM"; + + public static String YYYY_MM_DD = "yyyy-MM-dd"; + + public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss"; + + public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss"; + + private static String[] parsePatterns = { + "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM", + "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM", + "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"}; + + /** + * 获取当前Date型日期 + * + * @return Date() 当前日期 + */ + public static Date getNowDate() + { + return new Date(); + } + + /** + * 获取当前日期, 默认格式为yyyy-MM-dd + * + * @return String + */ + public static String getDate() + { + return dateTimeNow(YYYY_MM_DD); + } + + public static final String getTime() + { + return dateTimeNow(YYYY_MM_DD_HH_MM_SS); + } + + public static final String dateTimeNow() + { + return dateTimeNow(YYYYMMDDHHMMSS); + } + + public static final String dateTimeNow(final String format) + { + return parseDateToStr(format, new Date()); + } + + public static final String dateTime(final Date date) + { + return parseDateToStr(YYYY_MM_DD, date); + } + + public static final String parseDateToStr(final String format, final Date date) + { + return new SimpleDateFormat(format).format(date); + } + + public static final Date dateTime(final String format, final String ts) + { + try + { + return new SimpleDateFormat(format).parse(ts); + } + catch (ParseException e) + { + throw new RuntimeException(e); + } + } + + /** + * 日期路径 即年/月/日 如2018/08/08 + */ + public static final String datePath() + { + Date now = new Date(); + return DateFormatUtils.format(now, "yyyy/MM/dd"); + } + + /** + * 日期路径 即年/月/日 如20180808 + */ + public static final String dateTime() + { + Date now = new Date(); + return DateFormatUtils.format(now, "yyyyMMdd"); + } + + /** + * 日期型字符串转化为日期 格式 + */ + public static Date parseDate(Object str) + { + if (str == null) + { + return null; + } + try + { + return parseDate(str.toString(), parsePatterns); + } + catch (ParseException e) + { + return null; + } + } + + public static Date parseDate(String dateString, String format) + { + SimpleDateFormat dateFormat = new SimpleDateFormat(format); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + try { + return dateFormat.parse(dateString); + } catch (ParseException e) { + return null; + } + } + + /** + * 日期型字符串转化为日期 格式 + */ + public static Date parseDate1(Date date) + { + + SimpleDateFormat sdf = new SimpleDateFormat(YYYY_MM_DD_HH_MM_SS); + String formattedDateStr = sdf.format(date); + try { + return sdf.parse(formattedDateStr); + } catch (ParseException e) { + return null; + } + } + + /** + * 获取服务器启动时间 + */ + public static Date getServerStartDate() + { + long time = ManagementFactory.getRuntimeMXBean().getStartTime(); + return new Date(time); + } + + /** + * 计算相差月数 + */ + public static int getMonthDiff(Date date1, Date date2) + { + Calendar c1 = Calendar.getInstance(); + Calendar c2 = Calendar.getInstance(); + c1.setTime(date1); + c2.setTime(date2); + int year1 = c1.get(Calendar.YEAR); + int year2 = c2.get(Calendar.YEAR); + int month1 = c1.get(Calendar.MONTH); + int month2 = c2.get(Calendar.MONTH); + // 获取年的差值 + int yearInterval = year1 - year2; + // 获取月数差值 + int monthInterval = month1 - month2; + int monthsDiff = yearInterval * 12 + monthInterval; + return monthsDiff; + } + + /** + * 计算相差天数 + */ + public static int differentDaysByMillisecond(Date date1, Date date2) + { + return Math.abs((int) ((date2.getTime() - date1.getTime()) / (1000 * 3600 * 24))); + } + + /** + * 计算相差小时 + */ + public static long getHourDiff(Date endDate, Date startDate) + { + long diffInMillis = endDate.getTime() - startDate.getTime(); + double diffInHours = (double) diffInMillis / (1000 * 60 * 60); + //四舍五入 + return Math.round(diffInHours); + } + + /** + * 计算时间差 + * + * @param endDate 最后时间 + * @param startTime 开始时间 + * @return 时间差(天/小时/分钟) + */ + public static String timeDistance(Date endDate, Date startTime) + { + long nd = 1000 * 24 * 60 * 60; + long nh = 1000 * 60 * 60; + long nm = 1000 * 60; + // long ns = 1000; + // 获得两个时间的毫秒时间差异 + long diff = endDate.getTime() - startTime.getTime(); + // 计算差多少天 + long day = diff / nd; + // 计算差多少小时 + long hour = diff % nd / nh; + // 计算差多少分钟 + long min = diff % nd % nh / nm; + // 计算差多少秒//输出结果 + // long sec = diff % nd % nh % nm / ns; + return day + "天" + hour + "小时" + min + "分钟"; + } + + /** + * 增加 LocalDateTime ==> Date + */ + public static Date toDate(LocalDateTime temporalAccessor) + { + ZonedDateTime zdt = temporalAccessor.atZone(ZoneId.systemDefault()); + return Date.from(zdt.toInstant()); + } + + /** + * 增加 LocalDate ==> Date + */ + public static Date toDate(LocalDate temporalAccessor) + { + LocalDateTime localDateTime = LocalDateTime.of(temporalAccessor, LocalTime.of(0, 0, 0)); + ZonedDateTime zdt = localDateTime.atZone(ZoneId.systemDefault()); + return Date.from(zdt.toInstant()); + } + +} diff --git a/common/src/main/java/com/yyy/common/utils/common/DictUtils.java b/common/src/main/java/com/yyy/common/utils/common/DictUtils.java new file mode 100644 index 0000000..7c0f4bd --- /dev/null +++ b/common/src/main/java/com/yyy/common/utils/common/DictUtils.java @@ -0,0 +1,246 @@ +package com.yyy.common.utils.common; + +import com.yyy.common.constant.Constants; +import com.yyy.common.core.domain.entity.SysDictData; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * 字典工具类 + * + */ +@Component +public class DictUtils +{ + /** + * 分隔符 + */ + public static final String SEPARATOR = ","; + + /** + * 设置字典缓存 + * + * @param key 参数键 + * @param dictDatas 字典数据列表 + */ + public static void setDictCache(String key, List dictDatas) + { + CacheUtils.put(getCacheName(), getCacheKey(key), dictDatas); + } + + /** + * 获取字典缓存 + * + * @param key 参数键 + * @return dictDatas 字典数据列表 + */ + public static List getDictCache(String key) + { + Object cacheObj = CacheUtils.get(getCacheName(), getCacheKey(key)); + if (StringUtils.isNotNull(cacheObj)) + { + return StringUtils.cast(cacheObj); + } + return null; + } + + /** + * 根据字典类型和字典值获取字典标签 + * + * @param dictType 字典类型 + * @param dictValue 字典值 + * @return 字典标签 + */ + public static String getDictLabel(String dictType, String dictValue) + { + if (StringUtils.isEmpty(dictValue)) + { + return StringUtils.EMPTY; + } + return getDictLabel(dictType, dictValue, SEPARATOR); + } + + /** + * 根据字典类型和字典标签获取字典值 + * + * @param dictType 字典类型 + * @param dictLabel 字典标签 + * @return 字典值 + */ + public static String getDictValue(String dictType, String dictLabel) + { + if (StringUtils.isEmpty(dictLabel)) + { + return StringUtils.EMPTY; + } + return getDictValue(dictType, dictLabel, SEPARATOR); + } + + /** + * 根据字典类型和字典值获取字典标签 + * + * @param dictType 字典类型 + * @param dictValue 字典值 + * @param separator 分隔符 + * @return 字典标签 + */ + public static String getDictLabel(String dictType, String dictValue, String separator) + { + StringBuilder propertyString = new StringBuilder(); + List datas = getDictCache(dictType); + if (StringUtils.isNull(datas)) + { + return StringUtils.EMPTY; + } + if (StringUtils.containsAny(dictValue, separator)) + { + for (SysDictData dict : datas) + { + for (String value : dictValue.split(separator)) + { + if (value.equals(dict.getDictValue())) + { + propertyString.append(dict.getDictLabel()).append(separator); + break; + } + } + } + } + else + { + for (SysDictData dict : datas) + { + if (dictValue.equals(dict.getDictValue())) + { + return dict.getDictLabel(); + } + } + } + return StringUtils.stripEnd(propertyString.toString(), separator); + } + + /** + * 根据字典类型和字典标签获取字典值 + * + * @param dictType 字典类型 + * @param dictLabel 字典标签 + * @param separator 分隔符 + * @return 字典值 + */ + public static String getDictValue(String dictType, String dictLabel, String separator) + { + StringBuilder propertyString = new StringBuilder(); + List datas = getDictCache(dictType); + if (StringUtils.isNull(datas)) + { + return StringUtils.EMPTY; + } + if (StringUtils.containsAny(dictLabel, separator)) + { + for (SysDictData dict : datas) + { + for (String label : dictLabel.split(separator)) + { + if (label.equals(dict.getDictLabel())) + { + propertyString.append(dict.getDictValue()).append(separator); + break; + } + } + } + } + else + { + for (SysDictData dict : datas) + { + if (dictLabel.equals(dict.getDictLabel())) + { + return dict.getDictValue(); + } + } + } + return StringUtils.stripEnd(propertyString.toString(), separator); + } + + /** + * 根据字典类型获取字典所有值 + * + * @param dictType 字典类型 + * @return 字典值 + */ + public static String getDictValues(String dictType) + { + StringBuilder propertyString = new StringBuilder(); + List datas = getDictCache(dictType); + if (StringUtils.isNull(datas)) + { + return StringUtils.EMPTY; + } + for (SysDictData dict : datas) + { + propertyString.append(dict.getDictValue()).append(SEPARATOR); + } + return StringUtils.stripEnd(propertyString.toString(), SEPARATOR); + } + + /** + * 根据字典类型获取字典所有标签 + * + * @param dictType 字典类型 + * @return 字典值 + */ + public static String getDictLabels(String dictType) + { + StringBuilder propertyString = new StringBuilder(); + List datas = getDictCache(dictType); + if (StringUtils.isNull(datas)) + { + return StringUtils.EMPTY; + } + for (SysDictData dict : datas) + { + propertyString.append(dict.getDictLabel()).append(SEPARATOR); + } + return StringUtils.stripEnd(propertyString.toString(), SEPARATOR); + } + + /** + * 删除指定字典缓存 + * + * @param key 字典键 + */ + public static void removeDictCache(String key) + { + CacheUtils.remove(getCacheName(), getCacheKey(key)); + } + + /** + * 清空字典缓存 + */ + public static void clearDictCache() + { + CacheUtils.removeAll(getCacheName()); + } + + /** + * 获取cache name + * + * @return 缓存名 + */ + public static String getCacheName() + { + return Constants.SYS_DICT_CACHE; + } + + /** + * 设置cache key + * + * @param configKey 参数键 + * @return 缓存键key + */ + public static String getCacheKey(String configKey) + { + return Constants.SYS_DICT_KEY + configKey; + } +} diff --git a/common/src/main/java/com/yyy/common/utils/common/ExceptionUtil.java b/common/src/main/java/com/yyy/common/utils/common/ExceptionUtil.java new file mode 100644 index 0000000..9255118 --- /dev/null +++ b/common/src/main/java/com/yyy/common/utils/common/ExceptionUtil.java @@ -0,0 +1,39 @@ +package com.yyy.common.utils.common; + + +import java.io.PrintWriter; +import java.io.StringWriter; +import org.apache.commons.lang3.exception.ExceptionUtils; + +/** + * 错误信息处理类。 + * + */ +public class ExceptionUtil +{ + /** + * 获取exception的详细错误信息。 + */ + public static String getExceptionMessage(Throwable e) + { + StringWriter sw = new StringWriter(); + e.printStackTrace(new PrintWriter(sw, true)); + return sw.toString(); + } + + public static String getRootErrorMessage(Exception e) + { + Throwable root = ExceptionUtils.getRootCause(e); + root = (root == null ? e : root); + if (root == null) + { + return ""; + } + String msg = root.getMessage(); + if (msg == null) + { + return "null"; + } + return StringUtils.defaultString(msg); + } +} \ No newline at end of file diff --git a/common/src/main/java/com/yyy/common/utils/common/MD5Utils.java b/common/src/main/java/com/yyy/common/utils/common/MD5Utils.java new file mode 100644 index 0000000..02a3a42 --- /dev/null +++ b/common/src/main/java/com/yyy/common/utils/common/MD5Utils.java @@ -0,0 +1,48 @@ +package com.yyy.common.utils.common; + +import org.springframework.stereotype.Component; +import org.springframework.util.DigestUtils; + +import java.security.SecureRandom; +import java.util.Base64; + +/** + * Created with IntelliJ IDEA. + * + * @Author: fy + * @Date: 2023/04/19/10:09 + * @Description:MD5密码加密 + */ +public class MD5Utils { + public static String md5(String src) { + return DigestUtils.md5DigestAsHex(src.getBytes()); + } + + //第一次加密 + public static String inputPassToFormPass(String inputPass, String salt) { + //md5加密密码前,先对密码进行处理,按以下salt的规则处理密码 + String str = "" + salt.charAt(0) + salt.charAt(2) + inputPass + salt.charAt(5) + salt.charAt(4); + return md5(str); + } + + //第二次加密 + public static String formPassToDBPass(String formPass, String salt) { + String str = "" + salt.charAt(0) + salt.charAt(2) + formPass + salt.charAt(5) + salt.charAt(4); + return md5(str); + } + + //实际调用的方法,将第一次加密和第二次加密合并,结果应该一致 + public static String inputPassToDBPass(String inputPass, String salt) { + String formPass = inputPassToFormPass(inputPass, salt); + String dbPass = formPassToDBPass(formPass, salt); + return dbPass; + } + + public static String randomSalt() { + int length = 16; + SecureRandom random = new SecureRandom(); + byte[] salt = new byte[length]; + random.nextBytes(salt); + return Base64.getEncoder().encodeToString(salt); + } +} diff --git a/common/src/main/java/com/yyy/common/utils/common/OSUtils.java b/common/src/main/java/com/yyy/common/utils/common/OSUtils.java new file mode 100644 index 0000000..e644f53 --- /dev/null +++ b/common/src/main/java/com/yyy/common/utils/common/OSUtils.java @@ -0,0 +1,7 @@ +package com.yyy.common.utils.common; + +public class OSUtils { + public static String getOsName() { + return System.getProperty("os.name").toLowerCase(); + } +} diff --git a/common/src/main/java/com/yyy/common/utils/common/PageUtils.java b/common/src/main/java/com/yyy/common/utils/common/PageUtils.java new file mode 100644 index 0000000..5114294 --- /dev/null +++ b/common/src/main/java/com/yyy/common/utils/common/PageUtils.java @@ -0,0 +1,29 @@ +package com.yyy.common.utils.common; + +import com.github.pagehelper.PageHelper; +import com.yyy.common.core.page.PageDomain; +import com.yyy.common.core.page.TableSupport; +import com.yyy.common.utils.sql.SqlUtil; + +public class PageUtils extends PageHelper { + /** + * 设置请求分页数据 + */ + public static void startPage() + { + PageDomain pageDomain = TableSupport.buildPageRequest(); + Integer pageNum = pageDomain.getPageNum(); + Integer pageSize = pageDomain.getPageSize(); + String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy()); + Boolean reasonable = pageDomain.getReasonable(); + PageHelper.startPage(pageNum, pageSize, orderBy).setReasonable(reasonable); + } + + /** + * 清理分页的线程变量 + */ + public static void clearPage() + { + PageHelper.clearPage(); + } +} diff --git a/common/src/main/java/com/yyy/common/utils/common/ServletUtils.java b/common/src/main/java/com/yyy/common/utils/common/ServletUtils.java new file mode 100644 index 0000000..214c133 --- /dev/null +++ b/common/src/main/java/com/yyy/common/utils/common/ServletUtils.java @@ -0,0 +1,230 @@ +package com.yyy.common.utils.common; + +import com.yyy.common.constant.Constants; +import com.yyy.common.core.text.Convert; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import java.net.URLEncoder; + +/** + * @Author: fy + * @Date: 2024/03/22 + * @Description:客户端工具类 + */ +public class ServletUtils +{ + /** + * 定义移动端请求的所有可能类型 + */ + private final static String[] agent = { "Android", "iPhone", "iPod", "iPad", "Windows Phone", "MQQBrowser" }; + + /** + * 获取String参数 + */ + public static String getParameter(String name) + { + return getRequest().getParameter(name); + } + + /** + * 获取String参数 + */ + public static String getParameter(String name, String defaultValue) + { + return Convert.toStr(getRequest().getParameter(name), defaultValue); + } + + /** + * 获取Integer参数 + */ + public static Integer getParameterToInt(String name) + { + return Convert.toInt(getRequest().getParameter(name)); + } + + /** + * 获取Integer参数 + */ + public static Integer getParameterToInt(String name, Integer defaultValue) + { + return Convert.toInt(getRequest().getParameter(name), defaultValue); + } + + /** + * 获取Boolean参数 + */ + public static Boolean getParameterToBool(String name) + { + return Convert.toBool(getRequest().getParameter(name)); + } + + /** + * 获取Boolean参数 + */ + public static Boolean getParameterToBool(String name, Boolean defaultValue) + { + return Convert.toBool(getRequest().getParameter(name), defaultValue); + } + + /** + * 获取request + */ + public static HttpServletRequest getRequest() + { + return getRequestAttributes().getRequest(); + } + + /** + * 获取response + */ + public static HttpServletResponse getResponse() + { + return getRequestAttributes().getResponse(); + } + + /** + * 获取session + */ + public static HttpSession getSession() + { + return getRequest().getSession(); + } + + public static ServletRequestAttributes getRequestAttributes() + { + RequestAttributes attributes = RequestContextHolder.getRequestAttributes(); + return (ServletRequestAttributes) attributes; + } + + /** + * 将字符串渲染到客户端 + * + * @param response 渲染对象 + * @param string 待渲染的字符串 + * @return null + */ + public static String renderString(HttpServletResponse response, String string) + { + try + { + response.setContentType("application/json"); + response.setCharacterEncoding("utf-8"); + response.getWriter().print(string); + } + catch (IOException e) + { + e.printStackTrace(); + } + return null; + } + + /** + * 是否是Ajax异步请求 + * + * @param request + */ + public static boolean isAjaxRequest(HttpServletRequest request) + { + String accept = request.getHeader("accept"); + if (accept != null && accept.contains("application/json")) + { + return true; + } + + String xRequestedWith = request.getHeader("X-Requested-With"); + if (xRequestedWith != null && xRequestedWith.contains("XMLHttpRequest")) + { + return true; + } + + String uri = request.getRequestURI(); + if (StringUtils.inStringIgnoreCase(uri, ".json", ".xml")) + { + return true; + } + + String ajax = request.getParameter("__ajax"); + return StringUtils.inStringIgnoreCase(ajax, "json", "xml"); + } + + /** + * 判断User-Agent 是不是来自于手机 + */ + public static boolean checkAgentIsMobile(String ua) + { + boolean flag = false; + if (!ua.contains("Windows NT") || (ua.contains("Windows NT") && ua.contains("compatible; MSIE 9.0;"))) + { + // 排除 苹果桌面系统 + if (!ua.contains("Windows NT") && !ua.contains("Macintosh")) + { + for (String item : agent) + { + if (ua.contains(item)) + { + flag = true; + break; + } + } + } + } + return flag; + } + + /** + * 内容编码 + * + * @param str 内容 + * @return 编码后的内容 + */ + public static String urlEncode(String str) + { + try + { + return URLEncoder.encode(str, Constants.UTF8); + } + catch (UnsupportedEncodingException e) + { + return StringUtils.EMPTY; + } + } + + /** + * 内容解码 + * + * @param str 内容 + * @return 解码后的内容 + */ + public static String urlDecode(String str) + { + try + { + return URLDecoder.decode(str, Constants.UTF8); + } + catch (UnsupportedEncodingException e) + { + return StringUtils.EMPTY; + } + } + + /** + * 判断当前是否通过 HTTP 请求调用 + * + * @return 如果是 HTTP 请求则返回 true,否则返回 false + */ + public static boolean isHttpRequest() { + RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); + if (requestAttributes == null || ! (requestAttributes instanceof ServletRequestAttributes)){ + return false; + } + return true; + } +} diff --git a/common/src/main/java/com/yyy/common/utils/common/StringUtils.java b/common/src/main/java/com/yyy/common/utils/common/StringUtils.java new file mode 100644 index 0000000..230bd4d --- /dev/null +++ b/common/src/main/java/com/yyy/common/utils/common/StringUtils.java @@ -0,0 +1,636 @@ +package com.yyy.common.utils.common; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import com.yyy.common.constant.Constants; +import com.yyy.common.core.text.StrFormatter; +import org.springframework.util.AntPathMatcher; +/** + * @Author: fy + * @Date: 2024/03/22 + * @Description: + */ + +/** + * 字符串工具类 + * + * @author ruoyi + */ +public class StringUtils extends org.apache.commons.lang3.StringUtils +{ + /** 空字符串 */ + private static final String NULLSTR = ""; + + /** 下划线 */ + private static final char SEPARATOR = '_'; + + /** + * 获取参数不为空值 + * + * @param value defaultValue 要判断的value + * @return value 返回值 + */ + public static T nvl(T value, T defaultValue) + { + return value != null ? value : defaultValue; + } + + /** + * * 判断一个Collection是否为空, 包含List,Set,Queue + * + * @param coll 要判断的Collection + * @return true:为空 false:非空 + */ + public static boolean isEmpty(Collection coll) + { + return isNull(coll) || coll.isEmpty(); + } + + /** + * * 判断一个Collection是否非空,包含List,Set,Queue + * + * @param coll 要判断的Collection + * @return true:非空 false:空 + */ + public static boolean isNotEmpty(Collection coll) + { + return !isEmpty(coll); + } + + /** + * * 判断一个对象数组是否为空 + * + * @param objects 要判断的对象数组 + ** @return true:为空 false:非空 + */ + public static boolean isEmpty(Object[] objects) + { + return isNull(objects) || (objects.length == 0); + } + + /** + * * 判断一个对象数组是否非空 + * + * @param objects 要判断的对象数组 + * @return true:非空 false:空 + */ + public static boolean isNotEmpty(Object[] objects) + { + return !isEmpty(objects); + } + + /** + * * 判断一个Map是否为空 + * + * @param map 要判断的Map + * @return true:为空 false:非空 + */ + public static boolean isEmpty(Map map) + { + return isNull(map) || map.isEmpty(); + } + + /** + * * 判断一个Map是否为空 + * + * @param map 要判断的Map + * @return true:非空 false:空 + */ + public static boolean isNotEmpty(Map map) + { + return !isEmpty(map); + } + + /** + * * 判断一个字符串是否为空串 + * + * @param str String + * @return true:为空 false:非空 + */ + public static boolean isEmpty(String str) + { + return isNull(str) || NULLSTR.equals(str.trim()); + } + + /** + * * 判断一个字符串是否为非空串 + * + * @param str String + * @return true:非空串 false:空串 + */ + public static boolean isNotEmpty(String str) + { + return !isEmpty(str); + } + + /** + * * 判断一个对象是否为空 + * + * @param object Object + * @return true:为空 false:非空 + */ + public static boolean isNull(Object object) + { + return object == null; + } + + /** + * * 判断一个对象是否非空 + * + * @param object Object + * @return true:非空 false:空 + */ + public static boolean isNotNull(Object object) + { + return !isNull(object); + } + + /** + * * 判断一个对象是否是数组类型(Java基本型别的数组) + * + * @param object 对象 + * @return true:是数组 false:不是数组 + */ + public static boolean isArray(Object object) + { + return isNotNull(object) && object.getClass().isArray(); + } + + /** + * 去空格 + */ + public static String trim(String str) + { + return (str == null ? "" : str.trim()); + } + + /** + * 截取字符串 + * + * @param str 字符串 + * @param start 开始 + * @return 结果 + */ + public static String substring(final String str, int start) + { + if (str == null) + { + return NULLSTR; + } + + if (start < 0) + { + start = str.length() + start; + } + + if (start < 0) + { + start = 0; + } + if (start > str.length()) + { + return NULLSTR; + } + + return str.substring(start); + } + + /** + * 截取字符串 + * + * @param str 字符串 + * @param start 开始 + * @param end 结束 + * @return 结果 + */ + public static String substring(final String str, int start, int end) + { + if (str == null) + { + return NULLSTR; + } + + if (end < 0) + { + end = str.length() + end; + } + if (start < 0) + { + start = str.length() + start; + } + + if (end > str.length()) + { + end = str.length(); + } + + if (start > end) + { + return NULLSTR; + } + + if (start < 0) + { + start = 0; + } + if (end < 0) + { + end = 0; + } + + return str.substring(start, end); + } + + /** + * 格式化文本, {} 表示占位符
+ * 此方法只是简单将占位符 {} 按照顺序替换为参数
+ * 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可
+ * 例:
+ * 通常使用:format("this is {} for {}", "a", "b") -> this is a for b
+ * 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a
+ * 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b
+ * + * @param template 文本模板,被替换的部分用 {} 表示 + * @param params 参数值 + * @return 格式化后的文本 + */ + public static String format(String template, Object... params) + { + if (isEmpty(params) || isEmpty(template)) + { + return template; + } + return StrFormatter.format(template, params); + } + + /** + * 是否为http(s)://开头 + * + * @param link 链接 + * @return 结果 + */ + public static boolean ishttp(String link) + { + return StringUtils.startsWithAny(link, Constants.HTTP, Constants.HTTPS); + } + + /** + * 字符串转set + * + * @param str 字符串 + * @param sep 分隔符 + * @return set集合 + */ + public static final Set str2Set(String str, String sep) + { + return new HashSet(str2List(str, sep, true, false)); + } + + /** + * 字符串转list + * + * @param str 字符串 + * @param sep 分隔符 + * @param filterBlank 过滤纯空白 + * @param trim 去掉首尾空白 + * @return list集合 + */ + public static final List str2List(String str, String sep, boolean filterBlank, boolean trim) + { + List list = new ArrayList(); + if (StringUtils.isEmpty(str)) + { + return list; + } + + // 过滤空白字符串 + if (filterBlank && StringUtils.isBlank(str)) + { + return list; + } + String[] split = str.split(sep); + for (String string : split) + { + if (filterBlank && StringUtils.isBlank(string)) + { + continue; + } + if (trim) + { + string = string.trim(); + } + list.add(string); + } + + return list; + } + + /** + * 判断给定的collection列表中是否包含数组array 判断给定的数组array中是否包含给定的元素value + * + * @param collection 给定的集合 + * @param array 给定的数组 + * @return boolean 结果 + */ + public static boolean containsAny(Collection collection, String... array) + { + if (isEmpty(collection) || isEmpty(array)) + { + return false; + } + else + { + for (String str : array) + { + if (collection.contains(str)) + { + return true; + } + } + return false; + } + } + + /** + * 查找指定字符串是否包含指定字符串列表中的任意一个字符串同时串忽略大小写 + * + * @param cs 指定字符串 + * @param searchCharSequences 需要检查的字符串数组 + * @return 是否包含任意一个字符串 + */ + public static boolean containsAnyIgnoreCase(CharSequence cs, CharSequence... searchCharSequences) + { + if (isEmpty(cs) || isEmpty(searchCharSequences)) + { + return false; + } + for (CharSequence testStr : searchCharSequences) + { + if (containsIgnoreCase(cs, testStr)) + { + return true; + } + } + return false; + } + + /** + * 驼峰转下划线命名 + */ + public static String toUnderScoreCase(String str) + { + if (str == null) + { + return null; + } + StringBuilder sb = new StringBuilder(); + // 前置字符是否大写 + boolean preCharIsUpperCase = true; + // 当前字符是否大写 + boolean curreCharIsUpperCase = true; + // 下一字符是否大写 + boolean nexteCharIsUpperCase = true; + for (int i = 0; i < str.length(); i++) + { + char c = str.charAt(i); + if (i > 0) + { + preCharIsUpperCase = Character.isUpperCase(str.charAt(i - 1)); + } + else + { + preCharIsUpperCase = false; + } + + curreCharIsUpperCase = Character.isUpperCase(c); + + if (i < (str.length() - 1)) + { + nexteCharIsUpperCase = Character.isUpperCase(str.charAt(i + 1)); + } + + if (preCharIsUpperCase && curreCharIsUpperCase && !nexteCharIsUpperCase) + { + sb.append(SEPARATOR); + } + else if ((i != 0 && !preCharIsUpperCase) && curreCharIsUpperCase) + { + sb.append(SEPARATOR); + } + sb.append(Character.toLowerCase(c)); + } + + return sb.toString(); + } + + /** + * 是否包含字符串 + * + * @param str 验证字符串 + * @param strs 字符串组 + * @return 包含返回true + */ + public static boolean inStringIgnoreCase(String str, String... strs) + { + if (str != null && strs != null) + { + for (String s : strs) + { + if (str.equalsIgnoreCase(trim(s))) + { + return true; + } + } + } + return false; + } + + /** + * 删除最后一个字符串 + * + * @param str 输入字符串 + * @param spit 以什么类型结尾的 + * @return 截取后的字符串 + */ + public static String lastStringDel(String str, String spit) + { + if (!StringUtils.isEmpty(str) && str.endsWith(spit)) + { + return str.subSequence(0, str.length() - 1).toString(); + } + return str; + } + + /** + * 将下划线大写方式命名的字符串转换为驼峰式。如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。 例如:HELLO_WORLD->HelloWorld + * + * @param name 转换前的下划线大写方式命名的字符串 + * @return 转换后的驼峰式命名的字符串 + */ + public static String convertToCamelCase(String name) + { + StringBuilder result = new StringBuilder(); + // 快速检查 + if (name == null || name.isEmpty()) + { + // 没必要转换 + return ""; + } + else if (!name.contains("_")) + { + // 不含下划线,仅将首字母大写 + return name.substring(0, 1).toUpperCase() + name.substring(1); + } + // 用下划线将原始字符串分割 + String[] camels = name.split("_"); + for (String camel : camels) + { + // 跳过原始字符串中开头、结尾的下换线或双重下划线 + if (camel.isEmpty()) + { + continue; + } + // 首字母大写 + result.append(camel.substring(0, 1).toUpperCase()); + result.append(camel.substring(1).toLowerCase()); + } + return result.toString(); + } + + /** + * 驼峰式命名法 + * 例如:user_name->userName + */ + public static String toCamelCase(String s) + { + if (s == null) + { + return null; + } + if (s.indexOf(SEPARATOR) == -1) + { + return s; + } + s = s.toLowerCase(); + StringBuilder sb = new StringBuilder(s.length()); + boolean upperCase = false; + for (int i = 0; i < s.length(); i++) + { + char c = s.charAt(i); + + if (c == SEPARATOR) + { + upperCase = true; + } + else if (upperCase) + { + sb.append(Character.toUpperCase(c)); + upperCase = false; + } + else + { + sb.append(c); + } + } + return sb.toString(); + } + + /** + * 查找指定字符串是否匹配指定字符串列表中的任意一个字符串 + * + * @param str 指定字符串 + * @param strs 需要检查的字符串数组 + * @return 是否匹配 + */ + public static boolean matches(String str, List strs) + { + if (isEmpty(str) || isEmpty(strs)) + { + return false; + } + for (String pattern : strs) + { + if (isMatch(pattern, str)) + { + return true; + } + } + return false; + } + + /** + * 判断url是否与规则配置: + * ? 表示单个字符; + * * 表示一层路径内的任意字符串,不可跨层级; + * ** 表示任意层路径; + * + * @param pattern 匹配规则 + * @param url 需要匹配的url + * @return + */ + public static boolean isMatch(String pattern, String url) + { + AntPathMatcher matcher = new AntPathMatcher(); + return matcher.match(pattern, url); + } + + @SuppressWarnings("unchecked") + public static T cast(Object obj) + { + return (T) obj; + } + + /** + * 数字左边补齐0,使之达到指定长度。注意,如果数字转换为字符串后,长度大于size,则只保留 最后size个字符。 + * + * @param num 数字对象 + * @param size 字符串指定长度 + * @return 返回数字的字符串格式,该字符串为指定长度。 + */ + public static final String padl(final Number num, final int size) + { + return padl(num.toString(), size, '0'); + } + + /** + * 字符串左补齐。如果原始字符串s长度大于size,则只保留最后size个字符。 + * + * @param s 原始字符串 + * @param size 字符串指定长度 + * @param c 用于补齐的字符 + * @return 返回指定长度的字符串,由原字符串左补齐或截取得到。 + */ + public static final String padl(final String s, final int size, final char c) + { + final StringBuilder sb = new StringBuilder(size); + if (s != null) + { + final int len = s.length(); + if (s.length() <= size) + { + for (int i = size - len; i > 0; i--) + { + sb.append(c); + } + sb.append(s); + } + else + { + return s.substring(len - size, len); + } + } + else + { + for (int i = size; i > 0; i--) + { + sb.append(c); + } + } + return sb.toString(); + } +} diff --git a/common/src/main/java/com/yyy/common/utils/common/Threads.java b/common/src/main/java/com/yyy/common/utils/common/Threads.java new file mode 100644 index 0000000..fbb7014 --- /dev/null +++ b/common/src/main/java/com/yyy/common/utils/common/Threads.java @@ -0,0 +1,94 @@ +package com.yyy.common.utils.common; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.concurrent.*; + +/** + * 线程相关工具类. + */ +public class Threads +{ + private static final Logger logger = LoggerFactory.getLogger(Threads.class); + + /** + * sleep等待,单位为毫秒 + */ + public static void sleep(long milliseconds) + { + try + { + Thread.sleep(milliseconds); + } + catch (InterruptedException e) + { + return; + } + } + + /** + * 停止线程池 + * 先使用shutdown, 停止接收新任务并尝试完成所有已存在任务. + * 如果超时, 则调用shutdownNow, 取消在workQueue中Pending的任务,并中断所有阻塞函数. + * 如果仍人超時,則強制退出. + * 另对在shutdown时线程本身被调用中断做了处理. + */ + public static void shutdownAndAwaitTermination(ExecutorService pool) + { + if (pool != null && !pool.isShutdown()) + { + pool.shutdown(); + try + { + if (!pool.awaitTermination(120, TimeUnit.SECONDS)) + { + pool.shutdownNow(); + if (!pool.awaitTermination(120, TimeUnit.SECONDS)) + { + logger.info("Pool did not terminate"); + } + } + } + catch (InterruptedException ie) + { + pool.shutdownNow(); + Thread.currentThread().interrupt(); + } + } + } + + /** + * 打印线程异常信息 + */ + public static void printException(Runnable r, Throwable t) + { + if (t == null && r instanceof Future) + { + try + { + Future future = (Future) r; + if (future.isDone()) + { + future.get(); + } + } + catch (CancellationException ce) + { + t = ce; + } + catch (ExecutionException ee) + { + t = ee.getCause(); + } + catch (InterruptedException ie) + { + Thread.currentThread().interrupt(); + } + } + if (t != null) + { + logger.error(t.getMessage(), t); + } + } +} diff --git a/common/src/main/java/com/yyy/common/utils/eam/DocumentsUtil.java b/common/src/main/java/com/yyy/common/utils/eam/DocumentsUtil.java new file mode 100644 index 0000000..70cdf9c --- /dev/null +++ b/common/src/main/java/com/yyy/common/utils/eam/DocumentsUtil.java @@ -0,0 +1,4 @@ +package com.yyy.common.utils.eam; + +public class DocumentsUtil { +} diff --git a/common/src/main/java/com/yyy/common/utils/eam/ResidualValueCalculator.java b/common/src/main/java/com/yyy/common/utils/eam/ResidualValueCalculator.java new file mode 100644 index 0000000..9cd433d --- /dev/null +++ b/common/src/main/java/com/yyy/common/utils/eam/ResidualValueCalculator.java @@ -0,0 +1,71 @@ +package com.yyy.common.utils.eam; + +import java.math.BigDecimal; + +public class ResidualValueCalculator { + // 年限平均法 + public static BigDecimal calculateResidualValueByAverageLife(BigDecimal originalValue, int usefulLife, int yearsDepreciated) { + BigDecimal depreciationPerYear = originalValue.divide(BigDecimal.valueOf(usefulLife), 2, BigDecimal.ROUND_HALF_UP); + BigDecimal accumulatedDepreciation = depreciationPerYear.multiply(BigDecimal.valueOf(yearsDepreciated)); + BigDecimal residualValue = originalValue.subtract(accumulatedDepreciation); + return residualValue; + } + + // 按月折旧的年限平均法 + public static BigDecimal calculateMonthlyDepreciationByAverageLife(BigDecimal originalValue, int usefulLifeInMonths, int monthsDepreciated) { + BigDecimal depreciationPerMonth = originalValue.divide(BigDecimal.valueOf(usefulLifeInMonths), 2, BigDecimal.ROUND_HALF_UP); + BigDecimal accumulatedDepreciation = depreciationPerMonth.multiply(BigDecimal.valueOf(monthsDepreciated)); + BigDecimal residualValue = originalValue.subtract(accumulatedDepreciation); + return residualValue; + } + + // 工作量法 + public static BigDecimal calculateResidualValueByUnitsOfWork(BigDecimal originalValue, BigDecimal totalUnitsOfWork, BigDecimal unitsOfWorkDone) { + BigDecimal depreciationPerUnit = originalValue.divide(totalUnitsOfWork, 2, BigDecimal.ROUND_HALF_UP); + BigDecimal accumulatedDepreciation = depreciationPerUnit.multiply(unitsOfWorkDone); + BigDecimal residualValue = originalValue.subtract(accumulatedDepreciation); + return residualValue; + } + + // 双倍余额递减法 + public static BigDecimal calculateResidualValueByDoubleDecliningBalance(BigDecimal originalValue, BigDecimal depreciationRate, int usefulLife, int yearsDepreciated) { + BigDecimal bookValue = originalValue; + for (int i = 1; i <= yearsDepreciated; i++) { + BigDecimal depreciationExpense = bookValue.multiply(depreciationRate).setScale(2, BigDecimal.ROUND_HALF_UP); + bookValue = bookValue.subtract(depreciationExpense); + } + return bookValue; + } + + // 年数总和法 + public static BigDecimal calculateResidualValueBySumOfTheYearsDigits(BigDecimal originalValue, int usefulLife, int yearsDepreciated) { + int sumOfYears = usefulLife * (usefulLife + 1) / 2; + BigDecimal depreciationPerYear = originalValue.divide(BigDecimal.valueOf(sumOfYears), 2, BigDecimal.ROUND_HALF_UP); + BigDecimal accumulatedDepreciation = BigDecimal.ZERO; + for (int i = 1; i <= yearsDepreciated; i++) { + accumulatedDepreciation = accumulatedDepreciation.add(depreciationPerYear.multiply(BigDecimal.valueOf(usefulLife - i + 1))); + } + BigDecimal residualValue = originalValue.subtract(accumulatedDepreciation); + return residualValue; + } + + public static void main(String[] args) { + BigDecimal originalValue = new BigDecimal("3000000.00"); // 资产原值 + int usefulLife = 5; // 使用年限 + int yearsDepreciated = 3; // 已折旧年限 + BigDecimal totalUnitsOfWork = new BigDecimal("1000"); // 总工作量 + BigDecimal unitsOfWorkDone = new BigDecimal("500"); // 完成的工作量 + BigDecimal depreciationRate = new BigDecimal("0.2"); // 折旧率 + + BigDecimal residualValueAverageLife = calculateResidualValueByAverageLife(originalValue, usefulLife, yearsDepreciated); + BigDecimal residualValueUnitsOfWork = calculateResidualValueByUnitsOfWork(new BigDecimal("60.00"), new BigDecimal("50.00"), new BigDecimal("0.40")); + BigDecimal residualValueDoubleDecliningBalance = calculateResidualValueByDoubleDecliningBalance(originalValue, depreciationRate, usefulLife, yearsDepreciated); + BigDecimal residualValueSumOfTheYearsDigits = calculateResidualValueBySumOfTheYearsDigits(originalValue, usefulLife, yearsDepreciated); + + System.out.println("资产残值 - 年限平均法: " + residualValueAverageLife); + System.out.println("年限平均法(按月): 资产残值 - " + calculateMonthlyDepreciationByAverageLife(originalValue,5*12,9)); + System.out.println("资产残值 - 工作量法: " + residualValueUnitsOfWork); + System.out.println("资产残值 - 双倍余额递减法: " + residualValueDoubleDecliningBalance); + System.out.println("资产残值 - 年数总和法: " + residualValueSumOfTheYearsDigits); + } +} diff --git a/common/src/main/java/com/yyy/common/utils/file/FileTypeUtils.java b/common/src/main/java/com/yyy/common/utils/file/FileTypeUtils.java new file mode 100644 index 0000000..0800a63 --- /dev/null +++ b/common/src/main/java/com/yyy/common/utils/file/FileTypeUtils.java @@ -0,0 +1,135 @@ +package com.yyy.common.utils.file; + +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + +/** + * @Author: fy + * @Date: 2024/03/22 + * @Description:文件类型工具类 + */ +@Slf4j +public class FileTypeUtils +{ + /** + * 获取文件类型 + *

+ * 例如: ruoyi.txt, 返回: txt + * + * @param file 文件名 + * @return 后缀(不含".") + */ + public static String getFileType(File file) + { + if (null == file) + { + return StringUtils.EMPTY; + } + return getFileType(file.getName()); + } + + /** + * 获取文件类型 + *

+ * 例如: ruoyi.txt, 返回: txt + * + * @param fileName 文件名 + * @return 后缀(不含".") + */ + public static String getFileType(String fileName) + { + int separatorIndex = fileName.lastIndexOf("."); + if (separatorIndex < 0) + { + return ""; + } + return fileName.substring(separatorIndex + 1).toLowerCase(); + } + + /** + * 获取文件类型 + * + * @param photoByte 文件字节码 + * @return 后缀(不含".") + */ + public static String getFileExtendName(byte[] photoByte) + { + String strFileExtendName = "JPG"; + if ((photoByte[0] == 71) && (photoByte[1] == 73) && (photoByte[2] == 70) && (photoByte[3] == 56) + && ((photoByte[4] == 55) || (photoByte[4] == 57)) && (photoByte[5] == 97)) + { + strFileExtendName = "GIF"; + } + else if ((photoByte[6] == 74) && (photoByte[7] == 70) && (photoByte[8] == 73) && (photoByte[9] == 70)) + { + strFileExtendName = "JPG"; + } + else if ((photoByte[0] == 66) && (photoByte[1] == 77)) + { + strFileExtendName = "BMP"; + } + else if ((photoByte[1] == 80) && (photoByte[2] == 78) && (photoByte[3] == 71)) + { + strFileExtendName = "PNG"; + } + return strFileExtendName; + } + + /** + * 获取导出表单文件类型 + * + * @param tempFileFile 模板文件 + * @return 后缀(不含"."),如 "docx", "doc", "xlsx", "xls" + */ + public static String getFormType(File tempFileFile) { + String fileName = tempFileFile.getName().toLowerCase(); + try (FileInputStream fis = new FileInputStream(tempFileFile)) { + if (fileName.endsWith(".docx") || fileName.endsWith(".xlsx")) { + byte[] header = new byte[4]; + if (fis.read(header) != 4) { + log.error("无法读取文件头前4个字节"); + return null; + } + // ZIP文件头的魔数:50 4B 03 04 + if (header[0] == 0x50 && header[1] == 0x4B && header[2] == 0x03 && header[3] == 0x04) { + return fileName.endsWith(".docx") ? "docx" : "xlsx"; + } else { + log.error("文件扩展名与文件头不匹配: {}", fileName); + return null; + } + } else if (fileName.endsWith(".doc") || fileName.endsWith(".xls")) { + byte[] header = new byte[8]; + if (fis.read(header) != 8) { + log.error("无法读取文件头前8个字节"); + return null; + } + // OLE Compound File 魔数:D0 CF 11 E0 A1 B1 1A E1 + byte[] oleHeader = {(byte)0xD0, (byte)0xCF, (byte)0x11, (byte)0xE0, + (byte)0xA1, (byte)0xB1, (byte)0x1A, (byte)0xE1}; + boolean isOLE = true; + for (int i = 0; i < oleHeader.length; i++) { + if (header[i] != oleHeader[i]) { + isOLE = false; + break; + } + } + if (isOLE) { + return fileName.endsWith(".doc") ? "doc" : "xls"; + } else { + log.error("文件扩展名与文件头不匹配: {}", fileName); + return null; + } + } else { + log.warn("不支持的文件类型: {}", fileName); + return null; + } + } catch (IOException e) { + log.error("判断文件类型报错:{}", e.getMessage(), e); + return null; + } + } +} diff --git a/common/src/main/java/com/yyy/common/utils/file/FileUploadUtils.java b/common/src/main/java/com/yyy/common/utils/file/FileUploadUtils.java new file mode 100644 index 0000000..c1620b3 --- /dev/null +++ b/common/src/main/java/com/yyy/common/utils/file/FileUploadUtils.java @@ -0,0 +1,271 @@ +package com.yyy.common.utils.file; + +import com.documents4j.api.DocumentType; +import com.documents4j.api.IConverter; +import com.documents4j.job.LocalConverter; +import com.yyy.common.config.AppConfig; +import com.yyy.common.constant.Constants; +import com.yyy.common.exception.file.FileNameLengthLimitExceededException; +import com.yyy.common.exception.file.FileSizeLimitExceededException; +import com.yyy.common.exception.file.InvalidExtensionException; +import com.yyy.common.utils.common.CMDUtils; +import com.yyy.common.utils.common.DateUtils; +import com.yyy.common.utils.common.OSUtils; +import com.yyy.common.utils.common.StringUtils; +import com.yyy.common.utils.uuid.Seq; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.io.FilenameUtils; +import org.springframework.web.multipart.MultipartFile; + + +import java.io.*; +import java.nio.file.Paths; +import java.util.Objects; + +/** + * 文件上传工具类 + */ +@Slf4j +public class FileUploadUtils { + /** + * 默认大小 50M + */ + public static final long DEFAULT_MAX_SIZE = 50 * 1024 * 1024; + + /** + * 默认的文件名最大长度 100 + */ + public static final int DEFAULT_FILE_NAME_LENGTH = 100; + + /** + * 默认上传的地址 + */ + private static String defaultBaseDir = AppConfig.getProfile(); + + public static void setDefaultBaseDir(String defaultBaseDir) { + FileUploadUtils.defaultBaseDir = defaultBaseDir; + } + + public static String getDefaultBaseDir() { + return defaultBaseDir; + } + + /** + * 以默认配置进行文件上传 + * + * @param file 上传的文件 + * @return 文件名称 + * @throws Exception + */ + public static final String upload(MultipartFile file) throws IOException { + try { + return upload(getDefaultBaseDir(), file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION); + } catch (Exception e) { + throw new IOException(e.getMessage(), e); + } + } + + /** + * 根据文件路径上传 + * + * @param baseDir 相对应用的基目录 + * @param file 上传的文件 + * @return 文件名称 + * @throws IOException + */ + public static final String upload(String baseDir, MultipartFile file) throws IOException { + try { + return upload(baseDir, file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION); + } catch (Exception e) { + throw new IOException(e.getMessage(), e); + } + } + + /** + * 文件上传 + * + * @param baseDir 相对应用的基目录 + * @param file 上传的文件 + * @param allowedExtension 上传文件类型 + * @return 返回上传成功的文件名 + * @throws FileSizeLimitExceededException 如果超出最大大小 + * @throws FileNameLengthLimitExceededException 文件名太长 + * @throws IOException 比如读写文件出错时 + * @throws InvalidExtensionException 文件校验异常 + */ + public static final String upload(String baseDir, MultipartFile file, String[] allowedExtension) + throws FileSizeLimitExceededException, IOException, FileNameLengthLimitExceededException, + InvalidExtensionException { + int fileNameLength = Objects.requireNonNull(file.getOriginalFilename()).length(); + if (fileNameLength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH) { + throw new FileNameLengthLimitExceededException(FileUploadUtils.DEFAULT_FILE_NAME_LENGTH); + } + + assertAllowed(file, allowedExtension); + + String fileName = extractFilename(file); + + String absPath = getAbsoluteFile(baseDir, fileName).getAbsolutePath(); + file.transferTo(Paths.get(absPath)); + return getPathFileName(baseDir, fileName); + } + + /** + * 编码文件名 + */ + public static final String extractFilename(MultipartFile file) { + return StringUtils.format("{}/{}_{}.{}", DateUtils.datePath(), + FilenameUtils.getBaseName(file.getOriginalFilename()), Seq.getId(Seq.uploadSeqType), getExtension(file)); + } + + public static final File getAbsoluteFile(String uploadDir, String fileName) throws IOException { + File desc = new File(uploadDir + File.separator + fileName); + + if (!desc.exists()) { + if (!desc.getParentFile().exists()) { + desc.getParentFile().mkdirs(); + } + } + return desc; + } + + public static final String getPathFileName(String uploadDir, String fileName) throws IOException { + int dirLastIndex = AppConfig.getProfile().length() + 1; + String currentDir = StringUtils.substring(uploadDir, dirLastIndex); + return Constants.RESOURCE_PREFIX + "/" + currentDir + "/" + fileName; + } + + /** + * 文件大小校验 + * + * @param file 上传的文件 + * @return + * @throws FileSizeLimitExceededException 如果超出最大大小 + * @throws InvalidExtensionException + */ + public static final void assertAllowed(MultipartFile file, String[] allowedExtension) + throws FileSizeLimitExceededException, InvalidExtensionException { + long size = file.getSize(); + if (size > DEFAULT_MAX_SIZE) { + throw new FileSizeLimitExceededException(DEFAULT_MAX_SIZE / 1024 / 1024); + } + + String fileName = file.getOriginalFilename(); + String extension = getExtension(file); + if (allowedExtension != null && !isAllowedExtension(extension, allowedExtension)) { + if (allowedExtension == MimeTypeUtils.IMAGE_EXTENSION) { + throw new InvalidExtensionException.InvalidImageExtensionException(allowedExtension, extension, + fileName); + } else if (allowedExtension == MimeTypeUtils.FLASH_EXTENSION) { + throw new InvalidExtensionException.InvalidFlashExtensionException(allowedExtension, extension, + fileName); + } else if (allowedExtension == MimeTypeUtils.MEDIA_EXTENSION) { + throw new InvalidExtensionException.InvalidMediaExtensionException(allowedExtension, extension, + fileName); + } else if (allowedExtension == MimeTypeUtils.VIDEO_EXTENSION) { + throw new InvalidExtensionException.InvalidVideoExtensionException(allowedExtension, extension, + fileName); + } else { + throw new InvalidExtensionException(allowedExtension, extension, fileName); + } + } + } + + /** + * 判断MIME类型是否是允许的MIME类型 + * + * @param extension + * @param allowedExtension + * @return + */ + public static final boolean isAllowedExtension(String extension, String[] allowedExtension) { + for (String str : allowedExtension) { + if (str.equalsIgnoreCase(extension)) { + return true; + } + } + return false; + } + + /** + * 获取文件名的后缀 + * + * @param file 表单文件 + * @return 后缀名 + */ + public static final String getExtension(MultipartFile file) { + String extension = FilenameUtils.getExtension(file.getOriginalFilename()); + if (StringUtils.isEmpty(extension)) { + extension = MimeTypeUtils.getExtension(Objects.requireNonNull(file.getContentType())); + } + return extension; + } + + /** + * 将 MultipartFile 转换为 File 并保存 + * + * @param multipartFile 上传的文件 + * @param destPath 保存的目标路径 + * @return 保存后的 File 对象 + * @throws IOException 如果在保存过程中发生错误 + */ + public static File convertMultipartFileToFile(MultipartFile multipartFile, String destPath) throws IOException { + File destFile = new File(destPath); + // 如果目标路径不存在,创建目录 + if (!destFile.getParentFile().exists()) { + destFile.getParentFile().mkdirs(); + } + multipartFile.transferTo(destFile); + return destFile; + } + + /** + * @param inputWord + * @param outputFile + * @return + */ + public static boolean doc2docx(File inputWord, File outputFile) { + boolean flag = false; + + String osName = OSUtils.getOsName(); + //根据不同操作系统类型选择不同的数据获取方法 + if (osName.startsWith("windows")) { + String fileType = FileTypeUtils.getFileType(inputWord); + try (InputStream docxInputStream = new FileInputStream(inputWord); + OutputStream outputStream = new FileOutputStream(outputFile)) { + IConverter converter = LocalConverter.builder().build(); + if ("docx".equals(fileType)) {// docx转doc + flag = converter.convert(docxInputStream).as(DocumentType.DOCX).to(outputStream).as(DocumentType.DOC).execute(); + } else if ("doc".equals(fileType)) { // + flag = converter.convert(docxInputStream).as(DocumentType.DOC).to(outputStream).as(DocumentType.DOCX).execute(); + } + if (flag) { + converter.shutDown(); + } + } catch (Exception e) { + log.error(e.getMessage(), e); + } + } else if (osName.startsWith("linux")) { + try { + // 兼容linux + // 构建LibreOffice的命令行工具命令 + // libreoffice --invisible --convert-to docx -outdir /data/eam/temp /data/eam/temp/test.doc + String command = "libreoffice --invisible --convert-to docx --outdir " + outputFile.getParent() + " " + inputWord.getAbsolutePath(); + log.info(command); + // 执行转换命令 + try { + CMDUtils.executeLinuxCmd(command); + } catch (Exception e) { + log.error("linuxDocToDocx linux环境Doc转换为Docx时出现异常:", e); + } + } catch (Exception e) { + log.error("DocToDocx转换失败: " + e.getMessage(), e); + } finally { + + } + } else {//其他服务器类型 + + } + return flag; + } +} \ No newline at end of file diff --git a/common/src/main/java/com/yyy/common/utils/file/FileUtils.java b/common/src/main/java/com/yyy/common/utils/file/FileUtils.java new file mode 100644 index 0000000..02d8b1e --- /dev/null +++ b/common/src/main/java/com/yyy/common/utils/file/FileUtils.java @@ -0,0 +1,245 @@ +package com.yyy.common.utils.file; + +import com.yyy.common.config.AppConfig; +import com.yyy.common.utils.common.DateUtils; +import com.yyy.common.utils.common.StringUtils; +import com.yyy.common.utils.uuid.IdUtils; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.io.FilenameUtils; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.ArrayUtils; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; + +/** + * @Author: fy + * @Date: 2024/03/22 + * @Description:文件处理工具类 + */ +@Slf4j +public class FileUtils { + public static String FILENAME_PATTERN = "[a-zA-Z0-9_\\-\\|\\.\\u4e00-\\u9fa5]+"; + + /** + * 输出指定文件的byte数组 + * + * @param filePath 文件路径 + * @param os 输出流 + * @return + */ + public static void writeBytes(String filePath, OutputStream os) throws IOException { + FileInputStream fis = null; + try { + File file = new File(filePath); + if (!file.exists()) { + throw new FileNotFoundException(filePath); + } + fis = new FileInputStream(file); + byte[] b = new byte[1024]; + int length; + while ((length = fis.read(b)) > 0) { + os.write(b, 0, length); + } + } catch (IOException e) { + throw e; + } finally { + IOUtils.close(os); + IOUtils.close(fis); + } + } + + /** + * 写数据到文件中 + * + * @param data 数据 + * @return 目标文件 + * @throws IOException IO异常 + */ + public static String writeImportBytes(byte[] data) throws IOException { + return writeBytes(data, AppConfig.getImportPath()); + } + + /** + * 写数据到文件中 + * + * @param data 数据 + * @param uploadDir 目标文件 + * @return 目标文件 + * @throws IOException IO异常 + */ + public static String writeBytes(byte[] data, String uploadDir) throws IOException { + FileOutputStream fos = null; + String pathName = ""; + try { + String extension = getFileExtendName(data); + pathName = DateUtils.datePath() + "/" + IdUtils.fastUUID() + "." + extension; + File file = FileUploadUtils.getAbsoluteFile(uploadDir, pathName); + fos = new FileOutputStream(file); + fos.write(data); + } finally { + IOUtils.close(fos); + } + return FileUploadUtils.getPathFileName(uploadDir, pathName); + } + + /** + * 删除文件 + * + * @param filePath 文件 + * @return + */ + public static boolean deleteFile(String filePath) { + boolean flag = false; + File file = new File(filePath); + // 路径为文件且不为空则进行删除 + if (file.isFile() && file.exists()) { + flag = file.delete(); + } + return flag; + } + + /** + * 文件名称验证 + * + * @param filename 文件名称 + * @return true 正常 false 非法 + */ + public static boolean isValidFilename(String filename) { + return filename.matches(FILENAME_PATTERN); + } + + /** + * 检查文件是否可下载 + * + * @param resource 需要下载的文件 + * @return true 正常 false 非法 + */ + public static boolean checkAllowDownload(String resource) { + // 禁止目录上跳级别 + if (StringUtils.contains(resource, "..")) { + return false; + } + + // 检查允许下载的文件规则 + if (ArrayUtils.contains(MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION, FileTypeUtils.getFileType(resource))) { + return true; + } + + // 不在允许下载的文件规则 + return false; + } + + /** + * 下载文件名重新编码 + * + * @param request 请求对象 + * @param fileName 文件名 + * @return 编码后的文件名 + */ + public static String setFileDownloadHeader(HttpServletRequest request, String fileName) throws UnsupportedEncodingException { + final String agent = request.getHeader("USER-AGENT"); + String filename = fileName; + if (agent.contains("MSIE")) { + // IE浏览器 + filename = URLEncoder.encode(filename, "utf-8"); + filename = filename.replace("+", " "); + } else if (agent.contains("Firefox")) { + // 火狐浏览器 + filename = new String(fileName.getBytes(), "ISO8859-1"); + } else if (agent.contains("Chrome")) { + // google浏览器 + filename = URLEncoder.encode(filename, "utf-8"); + } else { + // 其它浏览器 + filename = URLEncoder.encode(filename, "utf-8"); + } + return filename; + } + + /** + * 下载文件名重新编码 + * + * @param response 响应对象 + * @param realFileName 真实文件名 + * @return + */ + public static void setAttachmentResponseHeader(HttpServletResponse response, String realFileName) throws UnsupportedEncodingException { + String percentEncodedFileName = percentEncode(realFileName); + + StringBuilder contentDispositionValue = new StringBuilder(); + contentDispositionValue.append("attachment; filename=") + .append(percentEncodedFileName) + .append(";") + .append("filename*=") + .append("utf-8''") + .append(percentEncodedFileName); + + response.setHeader("Content-disposition", contentDispositionValue.toString()); + } + + /** + * 百分号编码工具方法 + * + * @param s 需要百分号编码的字符串 + * @return 百分号编码后的字符串 + */ + public static String percentEncode(String s) throws UnsupportedEncodingException { + String encode = URLEncoder.encode(s, StandardCharsets.UTF_8.toString()); + return encode.replaceAll("\\+", "%20"); + } + + /** + * 获取图像后缀 + * + * @param photoByte 图像数据 + * @return 后缀名 + */ + public static String getFileExtendName(byte[] photoByte) { + String strFileExtendName = "jpg"; + if ((photoByte[0] == 71) && (photoByte[1] == 73) && (photoByte[2] == 70) && (photoByte[3] == 56) + && ((photoByte[4] == 55) || (photoByte[4] == 57)) && (photoByte[5] == 97)) { + strFileExtendName = "gif"; + } else if ((photoByte[6] == 74) && (photoByte[7] == 70) && (photoByte[8] == 73) && (photoByte[9] == 70)) { + strFileExtendName = "jpg"; + } else if ((photoByte[0] == 66) && (photoByte[1] == 77)) { + strFileExtendName = "bmp"; + } else if ((photoByte[1] == 80) && (photoByte[2] == 78) && (photoByte[3] == 71)) { + strFileExtendName = "png"; + } + return strFileExtendName; + } + + /** + * 获取文件名称 /profile/upload/2022/04/16/ruoyi.png -- ruoyi.png + * + * @param fileName 路径名称 + * @return 没有文件路径的名称 + */ + public static String getName(String fileName) { + if (fileName == null) { + return null; + } + int lastUnixPos = fileName.lastIndexOf('/'); + int lastWindowsPos = fileName.lastIndexOf('\\'); + int index = Math.max(lastUnixPos, lastWindowsPos); + return fileName.substring(index + 1); + } + + /** + * 获取不带后缀文件名称 /profile/upload/2022/04/16/ruoyi.png -- ruoyi + * + * @param fileName 路径名称 + * @return 没有文件路径和后缀的名称 + */ + public static String getNameNotSuffix(String fileName) { + if (fileName == null) { + return null; + } + String baseName = FilenameUtils.getBaseName(fileName); + return baseName; + } +} \ No newline at end of file diff --git a/common/src/main/java/com/yyy/common/utils/file/ImageUtils.java b/common/src/main/java/com/yyy/common/utils/file/ImageUtils.java new file mode 100644 index 0000000..e0619e8 --- /dev/null +++ b/common/src/main/java/com/yyy/common/utils/file/ImageUtils.java @@ -0,0 +1,259 @@ +package com.yyy.common.utils.file; + + +import com.yyy.common.config.AppConfig; +import com.yyy.common.constant.Constants; +import com.yyy.common.utils.common.StringUtils; +import org.apache.commons.io.IOUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import sun.misc.BASE64Decoder; +import sun.misc.BASE64Encoder; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.*; +import java.net.URL; +import java.net.URLConnection; +import java.util.Arrays; +import java.util.Base64; + +/** + * 图片处理工具类 + */ +public class ImageUtils +{ + private static final Logger log = LoggerFactory.getLogger(ImageUtils.class); + + public static byte[] getImage(String imagePath) + { + InputStream is = getFile(imagePath); + try + { + return IOUtils.toByteArray(is); + } + catch (Exception e) + { + log.error("图片加载异常 {}", e); + return null; + } + finally + { + IOUtils.closeQuietly(is); + } + } + + public static InputStream getFile(String imagePath) + { + try + { + byte[] result = readFile(imagePath); + result = Arrays.copyOf(result, result.length); + return new ByteArrayInputStream(result); + } + catch (Exception e) + { + log.error("获取图片异常 {}", e); + } + return null; + } + + /** + * 读取文件为字节数据 + * + * @param url 地址 + * @return 字节数据 + */ + public static byte[] readFile(String url) + { + InputStream in = null; + try + { + if (url.startsWith("http")) + { + // 网络地址 + URL urlObj = new URL(url); + URLConnection urlConnection = urlObj.openConnection(); + urlConnection.setConnectTimeout(30 * 1000); + urlConnection.setReadTimeout(60 * 1000); + urlConnection.setDoInput(true); + in = urlConnection.getInputStream(); + } + else + { + // 本机地址 + String localPath = AppConfig.getProfile(); + String downloadPath = localPath + StringUtils.substringAfter(url, Constants.RESOURCE_PREFIX); + in = new FileInputStream(downloadPath); + } + return IOUtils.toByteArray(in); + } + catch (Exception e) + { + log.error("获取文件路径异常 {}", e); + return null; + } + finally + { + IOUtils.closeQuietly(in); + } + } + + /** + * 通过BufferedImage图片流调整图片大小 + */ + public static BufferedImage resizeImage(BufferedImage originalImage, int targetWidth, int targetHeight) throws IOException { + Image resultingImage = originalImage.getScaledInstance(targetWidth, targetHeight, Image.SCALE_AREA_AVERAGING); + BufferedImage outputImage = new BufferedImage(targetWidth, targetHeight, BufferedImage.TYPE_INT_RGB); + outputImage.getGraphics().drawImage(resultingImage, 0, 0, null); + return outputImage; + } + + /** + * 返回base64图片 + * @param data + * @return + */ + public static String imageToBase64(byte[] data) { + BASE64Encoder encoder = new BASE64Encoder(); + // 返回Base64编码过的字节数组字符串 + return encoder.encode(data); + } + + /** + * base64转换成byte数组 + * @param base64 + * @return + * @throws IOException + */ + public static byte[] base64ToByte(String base64) throws IOException { + BASE64Decoder decoder = new BASE64Decoder(); + // 返回Base64编码过的字节数组字符串 + return decoder.decodeBuffer(base64); + } + + /** + * BufferedImage图片流转byte[]数组 + */ + public static byte[] imageToBytes(BufferedImage bImage) { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + try { + ImageIO.write(bImage, "png", out); + } catch (IOException e) { + e.printStackTrace(); + } + return out.toByteArray(); + } + + /** + * byte[]数组转BufferedImage图片流 + */ + public static BufferedImage bytesToBufferedImage(byte[] ImageByte) { + ByteArrayInputStream in = new ByteArrayInputStream(ImageByte); + BufferedImage image = null; + try { + image = ImageIO.read(in); + } catch (IOException e) { + e.printStackTrace(); + } + return image; + } + + /** + * 在线图片资源转base + * @param imageUrl + * @return + * @throws IOException + */ + public static String convertToBase64(String imageUrl) throws IOException { + URL url = new URL(imageUrl); + String fileType = imageUrl.substring(imageUrl.length()-3); + String base64Str = "data:" + fileType + ";base64,"; + InputStream inputStream = url.openStream(); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + byte[] buffer = new byte[4096]; + int bytesRead; + while ((bytesRead = inputStream.read(buffer)) != -1) { + outputStream.write(buffer, 0, bytesRead); + } + byte[] imageBytes = outputStream.toByteArray(); + String base64String = base64Str + Base64.getEncoder().encodeToString(imageBytes); + return base64String; + } + + //图片转化成base64字符串 + public static String getImageStr(String imgPath) throws IOException { + File file = new File(imgPath); + String fileContentBase64 = null; + if(file.exists()){ + String fileType = imgPath.substring(imgPath.length()-3); + String base64Str = "data:" + fileType + ";base64,"; + String content = null; + //将图片文件转化为字节数组字符串,并对其进行Base64编码处理 + InputStream in = null; + byte[] data = null; + //读取图片字节数组 + try { + in = new FileInputStream(file); + data = new byte[in.available()]; + in.read(data); + in.close(); + //对字节数组Base64编码 + if (data == null || data.length == 0) { + return null; + } + //content = Base64.encodeBytes(data); + content = new BASE64Encoder().encode(data); + if (content == null || "".equals(content)) { + return null; + } + // 缩小图片 + if (StringUtils.isNotBlank(content)) { + BufferedImage bufferedImage = ImageUtils.bytesToBufferedImage(ImageUtils.base64ToByte(content)); + if (bufferedImage != null){ + int height = bufferedImage.getHeight(); + int width = bufferedImage.getWidth(); + // 如果图片宽度大于650,图片缩放 + if (width > 500) { + //高度等比缩放 + height = (int)(height*500.0/width); + BufferedImage imgZoom = ImageUtils.resizeImage(bufferedImage, 500, height); + content = ImageUtils.imageToBase64(ImageUtils.imageToBytes(imgZoom)); + } + } + } + fileContentBase64 = base64Str + content; + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (in != null) { + in.close(); + } + } + } + + return fileContentBase64; + } + + + /** + * 验证给定的字符串是否为有效的 Base64 编码。 + * + * @param base64Str 要验证的字符串 + * @return 如果是有效的 Base64 编码,则返回 true;否则,返回 false + */ + public static boolean isValidBase64(String base64Str) { + if (base64Str == null || base64Str.isEmpty()) { + return false; + } + try { + // 尝试解码 + Base64.getDecoder().decode(base64Str); + return true; + } catch (IllegalArgumentException e) { + // 捕获解码异常,说明不是有效的 Base64 字符串 + return false; + } + } +} diff --git a/common/src/main/java/com/yyy/common/utils/file/MimeTypeUtils.java b/common/src/main/java/com/yyy/common/utils/file/MimeTypeUtils.java new file mode 100644 index 0000000..77eb820 --- /dev/null +++ b/common/src/main/java/com/yyy/common/utils/file/MimeTypeUtils.java @@ -0,0 +1,59 @@ +package com.yyy.common.utils.file; + +/** + * @Author: fy + * @Date: 2024/03/22 + * @Description:媒体类型工具类 + */ +public class MimeTypeUtils +{ + public static final String IMAGE_PNG = "image/png"; + + public static final String IMAGE_JPG = "image/jpg"; + + public static final String IMAGE_JPEG = "image/jpeg"; + + public static final String IMAGE_BMP = "image/bmp"; + + public static final String IMAGE_GIF = "image/gif"; + + public static final String[] IMAGE_EXTENSION = { "bmp", "gif", "jpg", "jpeg", "png" }; + + public static final String[] FLASH_EXTENSION = { "swf", "flv" }; + + public static final String[] MEDIA_EXTENSION = { "swf", "flv", "mp3", "wav", "wma", "wmv", "mid", "avi", "mpg", + "asf", "rm", "rmvb" }; + + public static final String[] VIDEO_EXTENSION = { "mp4", "avi", "rmvb" }; + + public static final String[] DEFAULT_ALLOWED_EXTENSION = { + // 图片 + "bmp", "gif", "jpg", "jpeg", "png", + // word excel powerpoint + "doc", "docx", "xls", "xlsx", "ppt", "pptx", "html", "htm", "txt", + // 压缩文件 + "rar", "zip", "gz", "bz2", + // 视频格式 + "mp4", "avi", "rmvb", + // pdf + "pdf" }; + + public static String getExtension(String prefix) + { + switch (prefix) + { + case IMAGE_PNG: + return "png"; + case IMAGE_JPG: + return "jpg"; + case IMAGE_JPEG: + return "jpeg"; + case IMAGE_BMP: + return "bmp"; + case IMAGE_GIF: + return "gif"; + default: + return ""; + } + } +} \ No newline at end of file diff --git a/common/src/main/java/com/yyy/common/utils/poi/ExcelHandlerAdapter.java b/common/src/main/java/com/yyy/common/utils/poi/ExcelHandlerAdapter.java new file mode 100644 index 0000000..0e01bc7 --- /dev/null +++ b/common/src/main/java/com/yyy/common/utils/poi/ExcelHandlerAdapter.java @@ -0,0 +1,25 @@ +package com.yyy.common.utils.poi; + + +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.Workbook; + +/** + * @Author: fy + * @Date: 2024/04/08 + * @Description:Excel数据格式处理适配器 + */ +public interface ExcelHandlerAdapter +{ + /** + * 格式化 + * + * @param value 单元格数据值 + * @param args excel注解args参数组 + * @param cell 单元格对象 + * @param wb 工作簿对象 + * + * @return 处理后的值 + */ + Object format(Object value, String[] args, Cell cell, Workbook wb); +} \ No newline at end of file diff --git a/common/src/main/java/com/yyy/common/utils/poi/ExcelUtil.java b/common/src/main/java/com/yyy/common/utils/poi/ExcelUtil.java new file mode 100644 index 0000000..b9698c7 --- /dev/null +++ b/common/src/main/java/com/yyy/common/utils/poi/ExcelUtil.java @@ -0,0 +1,1718 @@ +package com.yyy.common.utils.poi; + +import com.yyy.common.annotation.excel.Excel; +import com.yyy.common.annotation.excel.Excel.ColumnType; +import com.yyy.common.annotation.excel.Excel.Type; +import com.yyy.common.annotation.excel.Excels; +import com.yyy.common.config.AppConfig; +import com.yyy.common.core.domain.Result; +import com.yyy.common.core.domain.ResultCode; +import com.yyy.common.core.text.Convert; +import com.yyy.common.exception.UtilException; +import com.yyy.common.utils.common.DateUtils; +import com.yyy.common.utils.common.DictUtils; +import com.yyy.common.utils.common.StringUtils; +import com.yyy.common.utils.file.FileTypeUtils; +import com.yyy.common.utils.file.FileUtils; +import com.yyy.common.utils.file.ImageUtils; +import com.yyy.common.utils.reflect.ReflectUtils; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.RegExUtils; +import org.apache.commons.lang3.reflect.FieldUtils; +import org.apache.poi.hssf.usermodel.*; +import org.apache.poi.ooxml.POIXMLDocumentPart; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.ss.util.CellRangeAddress; +import org.apache.poi.ss.util.CellRangeAddressList; +import org.apache.poi.xssf.streaming.SXSSFWorkbook; +import org.apache.poi.xssf.usermodel.*; +import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTMarker; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.ParameterizedType; +import java.math.BigDecimal; +import java.text.DecimalFormat; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.*; +import java.util.stream.Collectors; + +/** + * Excel相关处理 + * + */ +public class ExcelUtil { + private static final Logger log = LoggerFactory.getLogger(ExcelUtil.class); + + public static final String FORMULA_REGEX_STR = "=|-|\\+|@"; + + public static final String[] FORMULA_STR = { "=", "-", "+", "@" }; + + /** + * 用于dictType属性数据存储,避免重复查缓存 + */ + public Map sysDictMap = new HashMap(); + + /** + * Excel sheet最大行数,默认65536 + */ + public static final int sheetSize = 65536; + + /** + * 工作表名称 + */ + private String sheetName; + + /** + * 导出类型(EXPORT:导出数据;IMPORT:导入模板) + */ + private Excel.Type type; + + /** + * 工作薄对象 + */ + private Workbook wb; + + /** + * 工作表对象 + */ + private Sheet sheet; + + /** + * 样式列表 + */ + private Map styles; + + /** + * 导入导出数据列表 + */ + private List list; + + /** + * 注解列表 + */ + private List fields; + + /** + * 当前行号 + */ + private int rownum; + + /** + * 标题 + */ + private String title; + + /** + * 最大高度 + */ + private short maxHeight; + + /** + * 合并后最后行数 + */ + private int subMergedLastRowNum = 0; + + /** + * 合并后开始行数 + */ + private int subMergedFirstRowNum = 1; + + /** + * 对象的子列表方法 + */ + private Method subMethod; + + /** + * 对象的子列表属性 + */ + private List subFields; + + /** + * 统计列表 + */ + private Map statistics = new HashMap(); + + /** + * 数字格式 + */ + private static final DecimalFormat DOUBLE_FORMAT = new DecimalFormat("######0.00"); + + /** + * 实体对象 + */ + public Class clazz; + + /** + * 需要排除列属性 + */ + public String[] excludeFields; + + public ExcelUtil(Class clazz) + { + this.clazz = clazz; + } + + /** + * 隐藏Excel中列属性 + * + * @param fields 列属性名 示例[单个"name"/多个"id","name"] + * @throws Exception + */ + public void hideColumn(String... fields) + { + this.excludeFields = fields; + } + + public void init(List list, String sheetName, String title, Excel.Type type) + { + if (list == null) + { + list = new ArrayList(); + } + this.list = list; + this.sheetName = sheetName; + this.type = type; + this.title = title; + createExcelField(); + createWorkbook(); + createTitle(); + createSubHead(); + } + + /** + * 创建excel第一行标题 + */ + public void createTitle() + { + if (StringUtils.isNotEmpty(title)) + { + subMergedFirstRowNum++; + subMergedLastRowNum++; + int titleLastCol = this.fields.size() - 1; + if (isSubList()) + { + titleLastCol = titleLastCol + subFields.size() - 1; + } + Row titleRow = sheet.createRow(rownum == 0 ? rownum++ : 0); + titleRow.setHeightInPoints(30); + Cell titleCell = titleRow.createCell(0); + titleCell.setCellStyle(styles.get("title")); + titleCell.setCellValue(title); + sheet.addMergedRegion(new CellRangeAddress(titleRow.getRowNum(), titleRow.getRowNum(), titleRow.getRowNum(), titleLastCol)); + } + } + + /** + * 创建对象的子列表名称 + */ + public void createSubHead() + { + if (isSubList()) + { + subMergedFirstRowNum++; + subMergedLastRowNum++; + Row subRow = sheet.createRow(rownum); + int excelNum = 0; + for (Object[] objects : fields) + { + Excel attr = (Excel) objects[1]; + Cell headCell1 = subRow.createCell(excelNum); + headCell1.setCellValue(attr.name()); + headCell1.setCellStyle(styles.get(StringUtils.format("header_{}_{}", attr.headerColor(), attr.headerBackgroundColor()))); + excelNum++; + } + int headFirstRow = excelNum - 1; + int headLastRow = headFirstRow + subFields.size() - 1; + if (headLastRow > headFirstRow) + { + sheet.addMergedRegion(new CellRangeAddress(rownum, rownum, headFirstRow, headLastRow)); + } + rownum++; + } + } + + /** + * 对excel表单默认第一个索引名转换成list + * + * @param is 输入流 + * @return 转换后集合 + */ + public List importExcel(InputStream is) + { + List list = null; + try + { + list = importExcel(is, 0); + } + catch (Exception e) + { + log.error("导入Excel异常{}", e.getMessage()); + throw new UtilException(e.getMessage()); + } + finally + { + IOUtils.closeQuietly(is); + } + return list; + } + + /** + * 对excel表单默认第一个索引名转换成list + * + * @param is 输入流 + * @param titleNum 标题占用行数 + * @return 转换后集合 + */ + public List importExcel(InputStream is, int titleNum) throws Exception + { + return importExcel(StringUtils.EMPTY, is, titleNum); + } + + /** + * 对excel表单指定表格索引名转换成list + * + * @param sheetName 表格索引名 + * @param titleNum 标题占用行数 + * @param is 输入流 + * @return 转换后集合 + */ + public List importExcel(String sheetName, InputStream is, int titleNum) throws Exception + { + this.type = Excel.Type.IMPORT; + this.wb = WorkbookFactory.create(is); + List list = new ArrayList(); + // 如果指定sheet名,则取指定sheet中的内容 否则默认指向第1个sheet + Sheet sheet = StringUtils.isNotEmpty(sheetName) ? wb.getSheet(sheetName) : wb.getSheetAt(0); + if (sheet == null) + { + throw new IOException("文件sheet不存在"); + } + boolean isXSSFWorkbook = !(wb instanceof HSSFWorkbook); + Map pictures; + if (isXSSFWorkbook) + { + pictures = getSheetPictures07((XSSFSheet) sheet, (XSSFWorkbook) wb); + } + else + { + pictures = getSheetPictures03((HSSFSheet) sheet, (HSSFWorkbook) wb); + } + // 获取最后一个非空行的行下标,比如总行数为n,则返回的为n-1 + int rows = sheet.getLastRowNum(); + if (rows > 0) + { + // 定义一个map用于存放excel列的序号和field. + Map cellMap = new HashMap(); + // 获取表头 + Row heard = sheet.getRow(titleNum); + for (int i = 0; i < heard.getPhysicalNumberOfCells(); i++) + { + Cell cell = heard.getCell(i); + if (StringUtils.isNotNull(cell)) + { + String value = this.getCellValue(heard, i).toString(); + cellMap.put(value, i); + } + else + { + cellMap.put(null, i); + } + } + // 有数据时才处理 得到类的所有field. + List fields = this.getFields(); + Map fieldsMap = new HashMap(); + for (Object[] objects : fields) + { + Excel attr = (Excel) objects[1]; + Integer column = cellMap.get(attr.name()); + if (column != null) + { + fieldsMap.put(column, objects); + } + } + for (int i = titleNum + 1; i <= rows; i++) + { + // 从第2行开始取数据,默认第一行是表头. + Row row = sheet.getRow(i); + // 判断当前行是否是空行 + if (isRowEmpty(row)) + { + continue; + } + T entity = null; + for (Map.Entry entry : fieldsMap.entrySet()) + { + Object val = this.getCellValue(row, entry.getKey()); + + // 如果不存在实例则新建. + entity = (entity == null ? clazz.newInstance() : entity); + // 从map中得到对应列的field. + Field field = (Field) entry.getValue()[0]; + Excel attr = (Excel) entry.getValue()[1]; + // 取得类型,并根据对象类型设置值. + Class fieldType = field.getType(); + if (String.class == fieldType) + { + String s = Convert.toStr(val); + if (StringUtils.endsWith(s, ".0")) + { + val = StringUtils.substringBefore(s, ".0"); + } + else + { + String dateFormat = field.getAnnotation(Excel.class).dateFormat(); + if (StringUtils.isNotEmpty(dateFormat)) + { + val = parseDateToStr(dateFormat, val); + } + else + { + val = Convert.toStr(val); + } + } + } + else if ((Integer.TYPE == fieldType || Integer.class == fieldType) && StringUtils.isNumeric(Convert.toStr(val))) + { + val = Convert.toInt(val); + } + else if ((Long.TYPE == fieldType || Long.class == fieldType) && StringUtils.isNumeric(Convert.toStr(val))) + { + val = Convert.toLong(val); + } + else if (Double.TYPE == fieldType || Double.class == fieldType) + { + val = Convert.toDouble(val); + } + else if (Float.TYPE == fieldType || Float.class == fieldType) + { + val = Convert.toFloat(val); + } + else if (BigDecimal.class == fieldType) + { + val = Convert.toBigDecimal(val); + } + else if (Date.class == fieldType) + { + if (val instanceof String) + { + val = DateUtils.parseDate(val); + } + else if (val instanceof Double) + { + val = DateUtil.getJavaDate((Double) val); + } + } + else if (Boolean.TYPE == fieldType || Boolean.class == fieldType) + { + val = Convert.toBool(val, false); + } + if (StringUtils.isNotNull(fieldType)) + { + String propertyName = field.getName(); + if (StringUtils.isNotEmpty(attr.targetAttr())) + { + propertyName = field.getName() + "." + attr.targetAttr(); + } + if (StringUtils.isNotEmpty(attr.readConverterExp())) + { + val = reverseByExp(Convert.toStr(val), attr.readConverterExp(), attr.separator()); + } + else if (StringUtils.isNotEmpty(attr.dictType())) + { + val = reverseDictByExp(Convert.toStr(val), attr.dictType(), attr.separator()); + } + else if (!attr.handler().equals(ExcelHandlerAdapter.class)) + { + val = dataFormatHandlerAdapter(val, attr, null); + } + else if (Excel.ColumnType.IMAGE == attr.cellType() && StringUtils.isNotEmpty(pictures)) + { + PictureData image = pictures.get(row.getRowNum() + "_" + entry.getKey()); + if (image == null) + { + val = ""; + } + else + { + byte[] data = image.getData(); + val = FileUtils.writeImportBytes(data); + } + } + ReflectUtils.invokeSetter(entity, propertyName, val); + } + } + list.add(entity); + } + } + return list; + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param list 导出数据集合 + * @param sheetName 工作表的名称 + * @return 结果 + */ + public Result exportExcel(List list, String sheetName) + { + return exportExcel(list, sheetName, StringUtils.EMPTY); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param list 导出数据集合 + * @param sheetName 工作表的名称 + * @param title 标题 + * @return 结果 + */ + public Result exportExcel(List list, String sheetName, String title) + { + this.init(list, sheetName, title, Excel.Type.EXPORT); + return exportExcel(); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param response 返回数据 + * @param list 导出数据集合 + * @param sheetName 工作表的名称 + * @return 结果 + */ + public void exportExcel(HttpServletResponse response, List list, String sheetName) + { + exportExcel(response, list, sheetName, StringUtils.EMPTY); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param response 返回数据 + * @param list 导出数据集合 + * @param sheetName 工作表的名称 + * @param title 标题 + * @return 结果 + */ + public void exportExcel(HttpServletResponse response, List list, String sheetName, String title) + { + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setCharacterEncoding("utf-8"); + this.init(list, sheetName, title, Excel.Type.EXPORT); + exportExcel(response); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param sheetName 工作表的名称 + * @return 结果 + */ + public Result importTemplateExcel(String sheetName) + { + return importTemplateExcel(sheetName, StringUtils.EMPTY); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param sheetName 工作表的名称 + * @param title 标题 + * @return 结果 + */ + public Result importTemplateExcel(String sheetName, String title) + { + this.init(null, sheetName, title, Excel.Type.IMPORT); + return exportExcel(); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param sheetName 工作表的名称 + * @return 结果 + */ + public void importTemplateExcel(HttpServletResponse response, String sheetName) + { + importTemplateExcel(response, sheetName, StringUtils.EMPTY); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param sheetName 工作表的名称 + * @param title 标题 + * @return 结果 + */ + public void importTemplateExcel(HttpServletResponse response, String sheetName, String title) + { + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setCharacterEncoding("utf-8"); + String headerKey = "Content-Disposition"; + String headerValue = String.format("attachment; filename=\"%s\"", title); + response.setHeader(headerKey, headerValue); + + this.init(null, sheetName, title, Excel.Type.IMPORT); + exportExcel(response); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @return 结果 + */ + public void exportExcel(HttpServletResponse response) + { + try + { + writeSheet(); + wb.write(response.getOutputStream()); + } + catch (Exception e) + { + log.error("导出Excel异常{}", e.getMessage()); + } + finally + { + IOUtils.closeQuietly(wb); + } + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @return 结果 + */ + public Result exportExcel() + { + OutputStream out = null; + try + { + writeSheet(); + String filename = encodingFilename(sheetName); + out = new FileOutputStream(getAbsoluteFile(filename)); + wb.write(out); + return new Result(ResultCode.success,filename); + } + catch (Exception e) + { + log.error("导出Excel异常{}", e.getMessage()); + throw new UtilException("导出Excel失败,请联系网站管理员!"); + } + finally + { + IOUtils.closeQuietly(wb); + IOUtils.closeQuietly(out); + } + } + + /** + * 创建写入数据到Sheet + */ + public void writeSheet() + { + // 取出一共有多少个sheet. + int sheetNo = Math.max(1, (int) Math.ceil(list.size() * 1.0 / sheetSize)); + for (int index = 0; index < sheetNo; index++) + { + createSheet(sheetNo, index); + + // 产生一行 + Row row = sheet.createRow(rownum); + int column = 0; + // 写入各个字段的列头名称 + for (Object[] os : fields) + { + Field field = (Field) os[0]; + Excel excel = (Excel) os[1]; + if (Collection.class.isAssignableFrom(field.getType())) + { + for (Field subField : subFields) + { + Excel subExcel = subField.getAnnotation(Excel.class); + this.createHeadCell(subExcel, row, column++); + } + } + else + { + this.createHeadCell(excel, row, column++); + } + } + if (Excel.Type.EXPORT.equals(type)) + { + fillExcelData(index, row); + addStatisticsRow(); + } + } + } + + /** + * 填充excel数据 + * + * @param index 序号 + * @param row 单元格行 + */ + @SuppressWarnings("unchecked") + public void fillExcelData(int index, Row row) + { + int startNo = index * sheetSize; + int endNo = Math.min(startNo + sheetSize, list.size()); + int rowNo = (1 + rownum) - startNo; + for (int i = startNo; i < endNo; i++) + { + rowNo = isSubList() ? (i > 1 ? rowNo + 1 : rowNo + i) : i + 1 + rownum - startNo; + row = sheet.createRow(rowNo); + // 得到导出对象. + T vo = (T) list.get(i); + Collection subList = null; + if (isSubList()) + { + if (isSubListValue(vo)) + { + subList = getListCellValue(vo); + subMergedLastRowNum = subMergedLastRowNum + subList.size(); + } + else + { + subMergedFirstRowNum++; + subMergedLastRowNum++; + } + } + int column = 0; + for (Object[] os : fields) + { + Field field = (Field) os[0]; + Excel excel = (Excel) os[1]; + if (Collection.class.isAssignableFrom(field.getType()) && StringUtils.isNotNull(subList)) + { + boolean subFirst = false; + for (Object obj : subList) + { + if (subFirst) + { + rowNo++; + row = sheet.createRow(rowNo); + } + List subFields = FieldUtils.getFieldsListWithAnnotation(obj.getClass(), Excel.class); + int subIndex = 0; + for (Field subField : subFields) + { + if (subField.isAnnotationPresent(Excel.class)) + { + subField.setAccessible(true); + Excel attr = subField.getAnnotation(Excel.class); + this.addCell(attr, row, (T) obj, subField, column + subIndex); + } + subIndex++; + } + subFirst = true; + } + this.subMergedFirstRowNum = this.subMergedFirstRowNum + subList.size(); + } + else + { + this.addCell(excel, row, vo, field, column++); + } + } + } + } + + /** + * 创建表格样式 + * + * @param wb 工作薄对象 + * @return 样式列表 + */ + private Map createStyles(Workbook wb) + { + // 写入各条记录,每条记录对应excel表中的一行 + Map styles = new HashMap(); + CellStyle style = wb.createCellStyle(); + style.setAlignment(HorizontalAlignment.CENTER); + style.setVerticalAlignment(VerticalAlignment.CENTER); + Font titleFont = wb.createFont(); + titleFont.setFontName("Arial"); + titleFont.setFontHeightInPoints((short) 16); + titleFont.setBold(true); + style.setFont(titleFont); + styles.put("title", style); + + style = wb.createCellStyle(); + style.setAlignment(HorizontalAlignment.CENTER); + style.setVerticalAlignment(VerticalAlignment.CENTER); + style.setBorderRight(BorderStyle.THIN); + style.setRightBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setBorderLeft(BorderStyle.THIN); + style.setLeftBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setBorderTop(BorderStyle.THIN); + style.setTopBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setBorderBottom(BorderStyle.THIN); + style.setBottomBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + Font dataFont = wb.createFont(); + dataFont.setFontName("Arial"); + dataFont.setFontHeightInPoints((short) 10); + style.setFont(dataFont); + styles.put("data", style); + + style = wb.createCellStyle(); + style.setAlignment(HorizontalAlignment.CENTER); + style.setVerticalAlignment(VerticalAlignment.CENTER); + Font totalFont = wb.createFont(); + totalFont.setFontName("Arial"); + totalFont.setFontHeightInPoints((short) 10); + style.setFont(totalFont); + styles.put("total", style); + + styles.putAll(annotationHeaderStyles(wb, styles)); + + styles.putAll(annotationDataStyles(wb)); + + return styles; + } + + /** + * 根据Excel注解创建表格头样式 + * + * @param wb 工作薄对象 + * @return 自定义样式列表 + */ + private Map annotationHeaderStyles(Workbook wb, Map styles) + { + Map headerStyles = new HashMap(); + for (Object[] os : fields) + { + Excel excel = (Excel) os[1]; + String key = StringUtils.format("header_{}_{}", excel.headerColor(), excel.headerBackgroundColor()); + if (!headerStyles.containsKey(key)) + { + CellStyle style = wb.createCellStyle(); + style.cloneStyleFrom(styles.get("data")); + style.setAlignment(HorizontalAlignment.CENTER); + style.setVerticalAlignment(VerticalAlignment.CENTER); + style.setFillForegroundColor(excel.headerBackgroundColor().index); + style.setFillPattern(FillPatternType.SOLID_FOREGROUND); + Font headerFont = wb.createFont(); + headerFont.setFontName("Arial"); + headerFont.setFontHeightInPoints((short) 10); + headerFont.setBold(true); + headerFont.setColor(excel.headerColor().index); + style.setFont(headerFont); + headerStyles.put(key, style); + } + } + return headerStyles; + } + + /** + * 根据Excel注解创建表格列样式 + * + * @param wb 工作薄对象 + * @return 自定义样式列表 + */ + private Map annotationDataStyles(Workbook wb) + { + Map styles = new HashMap(); + for (Object[] os : fields) + { + Excel excel = (Excel) os[1]; + String key = StringUtils.format("data_{}_{}_{}", excel.align(), excel.color(), excel.backgroundColor()); + if (!styles.containsKey(key)) + { + CellStyle style = wb.createCellStyle(); + style.setAlignment(excel.align()); + style.setVerticalAlignment(VerticalAlignment.CENTER); + style.setBorderRight(BorderStyle.THIN); + style.setRightBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setBorderLeft(BorderStyle.THIN); + style.setLeftBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setBorderTop(BorderStyle.THIN); + style.setTopBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setBorderBottom(BorderStyle.THIN); + style.setBottomBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setFillPattern(FillPatternType.SOLID_FOREGROUND); + style.setFillForegroundColor(excel.backgroundColor().getIndex()); + Font dataFont = wb.createFont(); + dataFont.setFontName("Arial"); + dataFont.setFontHeightInPoints((short) 10); + dataFont.setColor(excel.color().index); + style.setFont(dataFont); + styles.put(key, style); + } + } + return styles; + } + + /** + * 创建单元格 + */ + public Cell createHeadCell(Excel attr, Row row, int column) + { + // 创建列 + Cell cell = row.createCell(column); + // 写入列信息 + cell.setCellValue(attr.name()); + setDataValidation(attr, row, column); + cell.setCellStyle(styles.get(StringUtils.format("header_{}_{}", attr.headerColor(), attr.headerBackgroundColor()))); + if (isSubList()) + { + // 填充默认样式,防止合并单元格样式失效 + sheet.setDefaultColumnStyle(column, styles.get(StringUtils.format("data_{}_{}_{}", attr.align(), attr.color(), attr.backgroundColor()))); + if (attr.needMerge()) + { + sheet.addMergedRegion(new CellRangeAddress(rownum - 1, rownum, column, column)); + } + } + return cell; + } + + /** + * 设置单元格信息 + * + * @param value 单元格值 + * @param attr 注解相关 + * @param cell 单元格信息 + */ + public void setCellVo(Object value, Excel attr, Cell cell) + { + if (Excel.ColumnType.STRING == attr.cellType()) + { + String cellValue = Convert.toStr(value); + // 对于任何以表达式触发字符 =-+@开头的单元格,直接使用tab字符作为前缀,防止CSV注入。 + if (StringUtils.startsWithAny(cellValue, FORMULA_STR)) + { + cellValue = RegExUtils.replaceFirst(cellValue, FORMULA_REGEX_STR, "\t$0"); + } + if (value instanceof Collection && StringUtils.equals("[]", cellValue)) + { + cellValue = StringUtils.EMPTY; + } + cell.setCellValue(StringUtils.isNull(cellValue) ? attr.defaultValue() : cellValue + attr.suffix()); + } + else if (Excel.ColumnType.NUMERIC == attr.cellType()) + { + if (StringUtils.isNotNull(value)) + { + cell.setCellValue(StringUtils.contains(Convert.toStr(value), ".") ? Convert.toDouble(value) : Convert.toInt(value)); + } + } + else if (ColumnType.IMAGE == attr.cellType()) + { + ClientAnchor anchor = new XSSFClientAnchor(0, 0, 0, 0, (short) cell.getColumnIndex(), cell.getRow().getRowNum(), (short) (cell.getColumnIndex() + 1), cell.getRow().getRowNum() + 1); + String imagePath = Convert.toStr(value); + if (StringUtils.isNotEmpty(imagePath)) + { + byte[] data = ImageUtils.getImage(imagePath); + getDrawingPatriarch(cell.getSheet()).createPicture(anchor, + cell.getSheet().getWorkbook().addPicture(data, getImageType(data))); + } + } + } + + /** + * 获取画布 + */ + public static Drawing getDrawingPatriarch(Sheet sheet) + { + if (sheet.getDrawingPatriarch() == null) + { + sheet.createDrawingPatriarch(); + } + return sheet.getDrawingPatriarch(); + } + + /** + * 获取图片类型,设置图片插入类型 + */ + public int getImageType(byte[] value) + { + String type = FileTypeUtils.getFileExtendName(value); + if ("JPG".equalsIgnoreCase(type)) + { + return Workbook.PICTURE_TYPE_JPEG; + } + else if ("PNG".equalsIgnoreCase(type)) + { + return Workbook.PICTURE_TYPE_PNG; + } + return Workbook.PICTURE_TYPE_JPEG; + } + + /** + * 创建表格样式 + */ + public void setDataValidation(Excel attr, Row row, int column) + { + if (attr.name().indexOf("注:") >= 0) + { + sheet.setColumnWidth(column, 6000); + } + else + { + // 设置列宽 + sheet.setColumnWidth(column, (int) ((attr.width() + 0.72) * 256)); + } + if (StringUtils.isNotEmpty(attr.prompt()) || attr.combo().length > 0) + { + if (attr.combo().length > 15 || StringUtils.join(attr.combo()).length() > 255) + { + // 如果下拉数大于15或字符串长度大于255,则使用一个新sheet存储,避免生成的模板下拉值获取不到 + setXSSFValidationWithHidden(sheet, attr.combo(), attr.prompt(), 1, 100, column, column); + } + else + { + // 提示信息或只能选择不能输入的列内容. + setPromptOrValidation(sheet, attr.combo(), attr.prompt(), 1, 100, column, column); + } + } + } + + /** + * 添加单元格 + */ + public Cell addCell(Excel attr, Row row, T vo, Field field, int column) + { + Cell cell = null; + try + { + // 设置行高 + row.setHeight(maxHeight); + // 根据Excel中设置情况决定是否导出,有些情况需要保持为空,希望用户填写这一列. + if (attr.isExport()) + { + // 创建cell + cell = row.createCell(column); + if (isSubListValue(vo) && getListCellValue(vo).size() > 1 && attr.needMerge()) + { + CellRangeAddress cellAddress = new CellRangeAddress(subMergedFirstRowNum, subMergedLastRowNum, column, column); + sheet.addMergedRegion(cellAddress); + } + cell.setCellStyle(styles.get(StringUtils.format("data_{}_{}_{}", attr.align(), attr.color(), attr.backgroundColor()))); + + // 用于读取对象中的属性 + Object value = getTargetValue(vo, field, attr); + String dateFormat = attr.dateFormat(); + String readConverterExp = attr.readConverterExp(); + String separator = attr.separator(); + String dictType = attr.dictType(); + if (StringUtils.isNotEmpty(dateFormat) && StringUtils.isNotNull(value)) + { + cell.setCellValue(parseDateToStr(dateFormat, value)); + } + else if (StringUtils.isNotEmpty(readConverterExp) && StringUtils.isNotNull(value)) + { + cell.setCellValue(convertByExp(Convert.toStr(value), readConverterExp, separator)); + } + else if (StringUtils.isNotEmpty(dictType) && StringUtils.isNotNull(value)) + { + if (!sysDictMap.containsKey(dictType + value)) + { + String lable = convertDictByExp(Convert.toStr(value), dictType, separator); + sysDictMap.put(dictType + value, lable); + } + cell.setCellValue(sysDictMap.get(dictType + value)); + } + else if (value instanceof BigDecimal && -1 != attr.scale()) + { + cell.setCellValue((((BigDecimal) value).setScale(attr.scale(), attr.roundingMode())).doubleValue()); + } + else if (!attr.handler().equals(ExcelHandlerAdapter.class)) + { + cell.setCellValue(dataFormatHandlerAdapter(value, attr, cell)); + } + else + { + // 设置列类型 + setCellVo(value, attr, cell); + } + addStatisticsData(column, Convert.toStr(value), attr); + } + } + catch (Exception e) + { + log.error("导出Excel失败{}", e); + } + return cell; + } + + /** + * 设置 POI XSSFSheet 单元格提示或选择框 + * + * @param sheet 表单 + * @param textlist 下拉框显示的内容 + * @param promptContent 提示内容 + * @param firstRow 开始行 + * @param endRow 结束行 + * @param firstCol 开始列 + * @param endCol 结束列 + */ + public void setPromptOrValidation(Sheet sheet, String[] textlist, String promptContent, int firstRow, int endRow, + int firstCol, int endCol) + { + DataValidationHelper helper = sheet.getDataValidationHelper(); + DataValidationConstraint constraint = textlist.length > 0 ? helper.createExplicitListConstraint(textlist) : helper.createCustomConstraint("DD1"); + CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol); + DataValidation dataValidation = helper.createValidation(constraint, regions); + if (StringUtils.isNotEmpty(promptContent)) + { + // 如果设置了提示信息则鼠标放上去提示 + dataValidation.createPromptBox("", promptContent); + dataValidation.setShowPromptBox(true); + } + // 处理Excel兼容性问题 + if (dataValidation instanceof XSSFDataValidation) + { + dataValidation.setSuppressDropDownArrow(true); + dataValidation.setShowErrorBox(true); + } + else + { + dataValidation.setSuppressDropDownArrow(false); + } + sheet.addValidationData(dataValidation); + } + + /** + * 设置某些列的值只能输入预制的数据,显示下拉框(兼容超出一定数量的下拉框). + * + * @param sheet 要设置的sheet. + * @param textlist 下拉框显示的内容 + * @param promptContent 提示内容 + * @param firstRow 开始行 + * @param endRow 结束行 + * @param firstCol 开始列 + * @param endCol 结束列 + */ + public void setXSSFValidationWithHidden(Sheet sheet, String[] textlist, String promptContent, int firstRow, int endRow, int firstCol, int endCol) + { + String hideSheetName = "combo_" + firstCol + "_" + endCol; + Sheet hideSheet = wb.createSheet(hideSheetName); // 用于存储 下拉菜单数据 + for (int i = 0; i < textlist.length; i++) + { + hideSheet.createRow(i).createCell(0).setCellValue(textlist[i]); + } + // 创建名称,可被其他单元格引用 + Name name = wb.createName(); + name.setNameName(hideSheetName + "_data"); + name.setRefersToFormula(hideSheetName + "!$A$1:$A$" + textlist.length); + DataValidationHelper helper = sheet.getDataValidationHelper(); + // 加载下拉列表内容 + DataValidationConstraint constraint = helper.createFormulaListConstraint(hideSheetName + "_data"); + // 设置数据有效性加载在哪个单元格上,四个参数分别是:起始行、终止行、起始列、终止列 + CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol); + // 数据有效性对象 + DataValidation dataValidation = helper.createValidation(constraint, regions); + if (StringUtils.isNotEmpty(promptContent)) + { + // 如果设置了提示信息则鼠标放上去提示 + dataValidation.createPromptBox("", promptContent); + dataValidation.setShowPromptBox(true); + } + // 处理Excel兼容性问题 + if (dataValidation instanceof XSSFDataValidation) + { + dataValidation.setSuppressDropDownArrow(true); + dataValidation.setShowErrorBox(true); + } + else + { + dataValidation.setSuppressDropDownArrow(false); + } + + sheet.addValidationData(dataValidation); + // 设置hiddenSheet隐藏 + wb.setSheetHidden(wb.getSheetIndex(hideSheet), true); + } + + /** + * 解析导出值 0=男,1=女,2=未知 + * + * @param propertyValue 参数值 + * @param converterExp 翻译注解 + * @param separator 分隔符 + * @return 解析后值 + */ + public static String convertByExp(String propertyValue, String converterExp, String separator) + { + StringBuilder propertyString = new StringBuilder(); + String[] convertSource = converterExp.split(","); + for (String item : convertSource) + { + String[] itemArray = item.split("="); + if (StringUtils.containsAny(propertyValue, separator)) + { + for (String value : propertyValue.split(separator)) + { + if (itemArray[0].equals(value)) + { + propertyString.append(itemArray[1] + separator); + break; + } + } + } + else + { + if (itemArray[0].equals(propertyValue)) + { + return itemArray[1]; + } + } + } + return StringUtils.stripEnd(propertyString.toString(), separator); + } + + /** + * 反向解析值 男=0,女=1,未知=2 + * + * @param propertyValue 参数值 + * @param converterExp 翻译注解 + * @param separator 分隔符 + * @return 解析后值 + */ + public static String reverseByExp(String propertyValue, String converterExp, String separator) + { + StringBuilder propertyString = new StringBuilder(); + String[] convertSource = converterExp.split(","); + for (String item : convertSource) + { + String[] itemArray = item.split("="); + if (StringUtils.containsAny(propertyValue, separator)) + { + for (String value : propertyValue.split(separator)) + { + if (itemArray[1].equals(value)) + { + propertyString.append(itemArray[0] + separator); + break; + } + } + } + else + { + if (itemArray[1].equals(propertyValue)) + { + return itemArray[0]; + } + } + } + return StringUtils.stripEnd(propertyString.toString(), separator); + } + + /** + * 解析字典值 + * + * @param dictValue 字典值 + * @param dictType 字典类型 + * @param separator 分隔符 + * @return 字典标签 + */ + public static String convertDictByExp(String dictValue, String dictType, String separator) + { + return DictUtils.getDictLabel(dictType, dictValue, separator); + } + + /** + * 反向解析值字典值 + * + * @param dictLabel 字典标签 + * @param dictType 字典类型 + * @param separator 分隔符 + * @return 字典值 + */ + public static String reverseDictByExp(String dictLabel, String dictType, String separator) + { + return DictUtils.getDictValue(dictType, dictLabel, separator); + } + + /** + * 数据处理器 + * + * @param value 数据值 + * @param excel 数据注解 + * @return + */ + public String dataFormatHandlerAdapter(Object value, Excel excel, Cell cell) + { + try + { + Object instance = excel.handler().newInstance(); + Method formatMethod = excel.handler().getMethod("format", new Class[] { Object.class, String[].class, Cell.class, Workbook.class }); + value = formatMethod.invoke(instance, value, excel.args(), cell, this.wb); + } + catch (Exception e) + { + log.error("不能格式化数据 " + excel.handler(), e.getMessage()); + } + return Convert.toStr(value); + } + + /** + * 合计统计信息 + */ + private void addStatisticsData(Integer index, String text, Excel entity) + { + if (entity != null && entity.isStatistics()) + { + Double temp = 0D; + if (!statistics.containsKey(index)) + { + statistics.put(index, temp); + } + try + { + temp = Double.valueOf(text); + } + catch (NumberFormatException e) + { + } + statistics.put(index, statistics.get(index) + temp); + } + } + + /** + * 创建统计行 + */ + public void addStatisticsRow() + { + if (statistics.size() > 0) + { + Row row = sheet.createRow(sheet.getLastRowNum() + 1); + Set keys = statistics.keySet(); + Cell cell = row.createCell(0); + cell.setCellStyle(styles.get("total")); + cell.setCellValue("合计"); + + for (Integer key : keys) + { + cell = row.createCell(key); + cell.setCellStyle(styles.get("total")); + cell.setCellValue(DOUBLE_FORMAT.format(statistics.get(key))); + } + statistics.clear(); + } + } + + /** + * 编码文件名 + */ + public String encodingFilename(String filename) + { + filename = UUID.randomUUID() + "_" + filename + ".xlsx"; + return filename; + } + + /** + * 获取下载路径 + * + * @param filename 文件名称 + */ + public String getAbsoluteFile(String filename) + { + String downloadPath = AppConfig.getDownloadPath() + filename; + File desc = new File(downloadPath); + if (!desc.getParentFile().exists()) + { + desc.getParentFile().mkdirs(); + } + return downloadPath; + } + + /** + * 获取bean中的属性值 + * + * @param vo 实体对象 + * @param field 字段 + * @param excel 注解 + * @return 最终的属性值 + * @throws Exception + */ + private Object getTargetValue(T vo, Field field, Excel excel) throws Exception + { + Object o = field.get(vo); + if (StringUtils.isNotEmpty(excel.targetAttr())) + { + String target = excel.targetAttr(); + if (target.contains(".")) + { + String[] targets = target.split("[.]"); + for (String name : targets) + { + o = getValue(o, name); + } + } + else + { + o = getValue(o, target); + } + } + return o; + } + + /** + * 以类的属性的get方法方法形式获取值 + * + * @param o + * @param name + * @return value + * @throws Exception + */ + private Object getValue(Object o, String name) throws Exception + { + if (StringUtils.isNotNull(o) && StringUtils.isNotEmpty(name)) + { + Class clazz = o.getClass(); + Field field = clazz.getDeclaredField(name); + field.setAccessible(true); + o = field.get(o); + } + return o; + } + + /** + * 得到所有定义字段 + */ + private void createExcelField() + { + this.fields = getFields(); + this.fields = this.fields.stream().sorted(Comparator.comparing(objects -> ((Excel) objects[1]).sort())).collect(Collectors.toList()); + this.maxHeight = getRowHeight(); + } + + /** + * 获取字段注解信息 + */ + public List getFields() + { + List fields = new ArrayList(); + List tempFields = new ArrayList<>(); + tempFields.addAll(Arrays.asList(clazz.getSuperclass().getDeclaredFields())); + tempFields.addAll(Arrays.asList(clazz.getDeclaredFields())); + for (Field field : tempFields) + { + if (!ArrayUtils.contains(this.excludeFields, field.getName())) + { + // 单注解 + if (field.isAnnotationPresent(Excel.class)) + { + Excel attr = field.getAnnotation(Excel.class); + if (attr != null && (attr.type() == Type.ALL || attr.type() == type)) + { + field.setAccessible(true); + fields.add(new Object[] { field, attr }); + } + if (Collection.class.isAssignableFrom(field.getType())) + { + subMethod = getSubMethod(field.getName(), clazz); + ParameterizedType pt = (ParameterizedType) field.getGenericType(); + Class subClass = (Class) pt.getActualTypeArguments()[0]; + this.subFields = FieldUtils.getFieldsListWithAnnotation(subClass, Excel.class); + } + } + + // 多注解 + if (field.isAnnotationPresent(Excels.class)) + { + Excels attrs = field.getAnnotation(Excels.class); + Excel[] excels = attrs.value(); + for (Excel attr : excels) + { + if (!ArrayUtils.contains(this.excludeFields, field.getName() + "." + attr.targetAttr()) + && (attr != null && (attr.type() == Type.ALL || attr.type() == type))) + { + field.setAccessible(true); + fields.add(new Object[] { field, attr }); + } + } + } + } + } + return fields; + } + + /** + * 根据注解获取最大行高 + */ + public short getRowHeight() + { + double maxHeight = 0; + for (Object[] os : this.fields) + { + Excel excel = (Excel) os[1]; + maxHeight = Math.max(maxHeight, excel.height()); + } + return (short) (maxHeight * 20); + } + + /** + * 创建一个工作簿 + */ + public void createWorkbook() + { + this.wb = new SXSSFWorkbook(500); + this.sheet = wb.createSheet(); + wb.setSheetName(0, sheetName); + this.styles = createStyles(wb); + } + + /** + * 创建工作表 + * + * @param sheetNo sheet数量 + * @param index 序号 + */ + public void createSheet(int sheetNo, int index) + { + // 设置工作表的名称. + if (sheetNo > 1 && index > 0) + { + this.sheet = wb.createSheet(); + this.createTitle(); + wb.setSheetName(index, sheetName + index); + } + } + + /** + * 获取单元格值 + * + * @param row 获取的行 + * @param column 获取单元格列号 + * @return 单元格值 + */ + public Object getCellValue(Row row, int column) + { + if (row == null) + { + return row; + } + Object val = ""; + try + { + Cell cell = row.getCell(column); + if (StringUtils.isNotNull(cell)) + { + if (cell.getCellType() == CellType.NUMERIC || cell.getCellType() == CellType.FORMULA) + { + val = cell.getNumericCellValue(); + if (DateUtil.isCellDateFormatted(cell)) + { + val = DateUtil.getJavaDate((Double) val); // POI Excel 日期格式转换 + } + else + { + if ((Double) val % 1 != 0) + { + val = new BigDecimal(val.toString()); + } + else + { + val = new DecimalFormat("0").format(val); + } + } + } + else if (cell.getCellType() == CellType.STRING) + { + val = cell.getStringCellValue(); + } + else if (cell.getCellType() == CellType.BOOLEAN) + { + val = cell.getBooleanCellValue(); + } + else if (cell.getCellType() == CellType.ERROR) + { + val = cell.getErrorCellValue(); + } + + } + } + catch (Exception e) + { + return val; + } + return val; + } + + /** + * 判断是否是空行 + * + * @param row 判断的行 + * @return + */ + private boolean isRowEmpty(Row row) + { + if (row == null) + { + return true; + } + for (int i = row.getFirstCellNum(); i < row.getLastCellNum(); i++) + { + Cell cell = row.getCell(i); + if (cell != null && cell.getCellType() != CellType.BLANK) + { + return false; + } + } + return true; + } + + /** + * 获取Excel2003图片 + * + * @param sheet 当前sheet对象 + * @param workbook 工作簿对象 + * @return Map key:图片单元格索引(1_1)String,value:图片流PictureData + */ + public static Map getSheetPictures03(HSSFSheet sheet, HSSFWorkbook workbook) + { + Map sheetIndexPicMap = new HashMap(); + List pictures = workbook.getAllPictures(); + if (!pictures.isEmpty()) + { + for (HSSFShape shape : sheet.getDrawingPatriarch().getChildren()) + { + HSSFClientAnchor anchor = (HSSFClientAnchor) shape.getAnchor(); + if (shape instanceof HSSFPicture) + { + HSSFPicture pic = (HSSFPicture) shape; + int pictureIndex = pic.getPictureIndex() - 1; + HSSFPictureData picData = pictures.get(pictureIndex); + String picIndex = anchor.getRow1() + "_" + anchor.getCol1(); + sheetIndexPicMap.put(picIndex, picData); + } + } + return sheetIndexPicMap; + } + else + { + return sheetIndexPicMap; + } + } + + /** + * 获取Excel2007图片 + * + * @param sheet 当前sheet对象 + * @param workbook 工作簿对象 + * @return Map key:图片单元格索引(1_1)String,value:图片流PictureData + */ + public static Map getSheetPictures07(XSSFSheet sheet, XSSFWorkbook workbook) + { + Map sheetIndexPicMap = new HashMap(); + for (POIXMLDocumentPart dr : sheet.getRelations()) + { + if (dr instanceof XSSFDrawing) + { + XSSFDrawing drawing = (XSSFDrawing) dr; + List shapes = drawing.getShapes(); + for (XSSFShape shape : shapes) + { + if (shape instanceof XSSFPicture) + { + XSSFPicture pic = (XSSFPicture) shape; + XSSFClientAnchor anchor = pic.getPreferredSize(); + CTMarker ctMarker = anchor.getFrom(); + String picIndex = ctMarker.getRow() + "_" + ctMarker.getCol(); + sheetIndexPicMap.put(picIndex, pic.getPictureData()); + } + } + } + } + return sheetIndexPicMap; + } + + /** + * 格式化不同类型的日期对象 + * + * @param dateFormat 日期格式 + * @param val 被格式化的日期对象 + * @return 格式化后的日期字符 + */ + public String parseDateToStr(String dateFormat, Object val) + { + if (val == null) + { + return ""; + } + String str; + if (val instanceof Date) + { + str = DateUtils.parseDateToStr(dateFormat, (Date) val); + } + else if (val instanceof LocalDateTime) + { + str = DateUtils.parseDateToStr(dateFormat, DateUtils.toDate((LocalDateTime) val)); + } + else if (val instanceof LocalDate) + { + str = DateUtils.parseDateToStr(dateFormat, DateUtils.toDate((LocalDate) val)); + } + else + { + str = val.toString(); + } + return str; + } + + /** + * 是否有对象的子列表 + */ + public boolean isSubList() + { + return StringUtils.isNotNull(subFields) && subFields.size() > 0; + } + + /** + * 是否有对象的子列表,集合不为空 + */ + public boolean isSubListValue(T vo) + { + return StringUtils.isNotNull(subFields) && subFields.size() > 0 && StringUtils.isNotNull(getListCellValue(vo)) && getListCellValue(vo).size() > 0; + } + + /** + * 获取集合的值 + */ + public Collection getListCellValue(Object obj) + { + Object value; + try + { + value = subMethod.invoke(obj, new Object[] {}); + } + catch (Exception e) + { + return new ArrayList(); + } + return (Collection) value; + } + + /** + * 获取对象的子列表方法 + * + * @param name 名称 + * @param pojoClass 类对象 + * @return 子列表方法 + */ + public Method getSubMethod(String name, Class pojoClass) + { + StringBuffer getMethodName = new StringBuffer("get"); + getMethodName.append(name.substring(0, 1).toUpperCase()); + getMethodName.append(name.substring(1)); + Method method = null; + try + { + method = pojoClass.getMethod(getMethodName.toString(), new Class[] {}); + } + catch (Exception e) + { + log.error("获取对象异常{}", e.getMessage()); + } + return method; + } +} diff --git a/common/src/main/java/com/yyy/common/utils/poi/FormData.java b/common/src/main/java/com/yyy/common/utils/poi/FormData.java new file mode 100644 index 0000000..ca43589 --- /dev/null +++ b/common/src/main/java/com/yyy/common/utils/poi/FormData.java @@ -0,0 +1,37 @@ +package com.yyy.common.utils.poi; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class FormData implements Serializable { + private static final long serialVersionUID = -1L; + + /** + * 模板路径 + */ + private String templatePath; + + /** + * 表单编号 + */ + private String formKey; + + /** + * 表单名称 + */ + private String formName; + + /** + * 表单数据 + */ + private List formValue; +} diff --git a/common/src/main/java/com/yyy/common/utils/poi/FormExportUtils.java b/common/src/main/java/com/yyy/common/utils/poi/FormExportUtils.java new file mode 100644 index 0000000..fcb8435 --- /dev/null +++ b/common/src/main/java/com/yyy/common/utils/poi/FormExportUtils.java @@ -0,0 +1,577 @@ +package com.yyy.common.utils.poi; + +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.enums.WriteDirectionEnum; +import com.alibaba.excel.write.metadata.WriteSheet; +import com.alibaba.excel.write.metadata.fill.FillConfig; +import com.alibaba.fastjson.JSONObject; +import com.deepoove.poi.XWPFTemplate; +import com.deepoove.poi.config.Configure; +import com.deepoove.poi.config.ConfigureBuilder; +import com.deepoove.poi.data.PictureType; +import com.deepoove.poi.data.Pictures; +import com.deepoove.poi.render.processor.LogProcessor; +import com.deepoove.poi.template.InlineIterableTemplate; +import com.deepoove.poi.template.MetaTemplate; +import com.deepoove.poi.template.run.RunTemplate; +import com.yyy.common.annotation.word.WordExport; +import com.yyy.common.config.AppConfig; +import com.yyy.common.config.WordConfig; +import com.yyy.common.enums.FieldDataTypeEnum; +import com.yyy.common.enums.WordContentTypeEnum; +import com.yyy.common.enums.WordPluginsTypeEnum; +import com.yyy.common.factory.word.AbstractImportStrategy; +import com.yyy.common.form.FieldData; +import com.yyy.common.utils.common.DateUtils; +import com.yyy.common.utils.common.OSUtils; +import com.yyy.common.utils.common.StringUtils; +import com.yyy.common.utils.file.FileTypeUtils; +import com.yyy.common.utils.file.FileUtils; +import com.yyy.common.utils.file.ImageUtils; +import org.apache.commons.io.FilenameUtils; +import org.apache.poi.xwpf.usermodel.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.servlet.http.HttpServletResponse; +import java.awt.image.BufferedImage; +import java.io.*; +import java.lang.reflect.Field; +import java.net.URLEncoder; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class FormExportUtils { + + private static final Logger log = LoggerFactory.getLogger(FormExportUtils.class); + + /** + * 参数配置 + */ + private Configure config; + + /** + * 标题 + */ + private String title; + + /** + * 数据列表 + */ + private List list = new ArrayList<>(); + + /** + * 实体对象 + */ + private Class clazz; + + /** + * 表单数据 + */ + private Map data; + + /** + * 表单数据 + */ + private List list_data = new ArrayList<>(); + + public FormExportUtils(Class clazz) { + this.clazz = clazz; + } + + private void init(List list, String title) { + this.list.clear(); + this.list.addAll(list); + this.title = title; + this.config = createConfig(); + this.data = new HashMap<>(); + createLabels(); + } + + private Configure createConfig() { + // 创建配置 + ConfigureBuilder configureBuilder = WordConfig.getConfigure(); + // 绑定插件 + list.forEach(e -> { + if (e.getPluginsType() != WordPluginsTypeEnum.Default) { + if (e.getPluginsType().getPolicy() != null) { + configureBuilder.bind(e.getKey(), e.getPluginsType().getPolicy()); + } + } + }); + return configureBuilder.build(); + } + + private void createLabels() { + list.forEach(e -> { + if (e.getContentType() != null) { + AbstractImportStrategy strategy = e.getContentType().getStrategy(); + if (strategy != null) { +// if (e.getContentType().equals(WordContentTypeEnum.ExcelList)) { +// list_data.add(new FillWrapper(e.getKey(), JSONObject.parseObject(JSONObject.toJSONString(e.getValue())).getJSONArray("value"))); +// } else { +// strategy.importData(data, e); +// } + strategy.importData(data, e); + } else { + throw new IllegalArgumentException("标签创建失败, 策略类型未知: " + e.getContentType().getInfo()); + } + } else { + throw new IllegalArgumentException("标签创建失败, 标签类型未知: " + e.getContentType().getInfo()); + } + }); + } + + /** + * 生成文件下载到本地 + * + * @param tempFileFile + */ + private void exportWord(File tempFileFile) { + FileOutputStream fos = null; + XWPFTemplate template = null; + try { + template = XWPFTemplate.compile(tempFileFile, config).render(data); + fos = new FileOutputStream(title); + template.write(fos); + fos.flush(); + } catch (Exception e) { + log.error("替换生成图表报错:{}", e.getMessage()); + e.printStackTrace(); + } finally { + try { + if (Objects.nonNull(fos)) { + fos.close(); + } + if (Objects.nonNull(template)) { + template.close(); + } + } catch (Exception e) { + log.error("关闭数据流报错:{}", e.getMessage()); + e.printStackTrace(); + } + } + } + + /** + * 导出文件到流 + * + * @param tempFileFile + * @param response + */ + private void exportWord(File tempFileFile, HttpServletResponse response) { + XWPFTemplate template = null; + try { + template = XWPFTemplate.compile(tempFileFile, config).render(data); + template.write(response.getOutputStream()); + + } catch (Exception e) { + log.error("替换生成图表报错:{}", e.getMessage()); + e.printStackTrace(); + } finally { + try { + if (Objects.nonNull(template)) { + template.close(); + } + } catch (Exception e) { + log.error("关闭数据流报错:{}", e.getMessage()); + e.printStackTrace(); + } + } + } + + private void exportWord(File tempFileFile, OutputStream outputStream) { + XWPFTemplate template = null; + try { + template = XWPFTemplate.compile(tempFileFile, config).render(data); + + template.write(outputStream); + + } catch (Exception e) { + log.error("替换生成图表报错:{}", e.getMessage()); + } finally { + try { + if (Objects.nonNull(template)) { + template.close(); + } + } catch (Exception e) { + log.error("关闭数据流报错:{}", e.getMessage()); + } + } + } + + /** + * 2003版本doc导出 + * + * @param tempFileFile + * @param response + */ + private void exportWord2003(File tempFileFile, HttpServletResponse response) { + + XWPFTemplate template = null; + try { + template = XWPFTemplate.compile(tempFileFile, config).render(data); + + template.write(response.getOutputStream()); + + } catch (Exception e) { + log.error("替换生成图表报错:{}", e.getMessage()); + e.printStackTrace(); + } finally { + try { + if (Objects.nonNull(template)) { + template.close(); + } + } catch (Exception e) { + log.error("关闭数据流报错:{}", e.getMessage()); + e.printStackTrace(); + } + } + } + + public void exportWord(HttpServletResponse response, File tempFileFile, List list, String title) throws UnsupportedEncodingException { + response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document"); + response.setCharacterEncoding("utf-8"); + String fileName = URLEncoder.encode(title, "UTF-8").replaceAll("\\+", "%20"); + response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".docx"); + this.init(list, title); + exportWord(tempFileFile, response); + } + + public void export(HttpServletResponse response, File tempFileFile, List list, String title) throws UnsupportedEncodingException { + String type = FileTypeUtils.getFileType(tempFileFile); + if (type == null) { + return; + } + response.setCharacterEncoding("utf-8"); + String fileName = URLEncoder.encode(title, "UTF-8").replaceAll("\\+", "%20"); + response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + "." + type); + this.init(list, title); + if ("docx".equals(type)) { + response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document"); + exportWord(tempFileFile, response); + } else if ("doc".equals(type)) { + log.info("不支持的doc模板"); + } else if ("xlsx".equals(type)) { + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + exportExcel(tempFileFile, response); + } else if ("xls".equals(type)) { + log.info("不支持的xls模板"); + } + } + + public void export(OutputStream out, File tempFileFile, List list, String title){ + String type = FileTypeUtils.getFileType(tempFileFile); + this.init(list, title); + + if ("docx".equals(type)) { + exportWord(tempFileFile, out); + } else if ("doc".equals(type)) { + log.info("不支持的doc模板"); + } else if ("xlsx".equals(type)) { + log.info("不支持的xlsx模板"); + } else if ("xls".equals(type)) { + log.info("不支持的xls模板"); + } + } + + public void exportPDF(HttpServletResponse response, File tempFileFile, List list, String title) throws Exception { + response.setCharacterEncoding("utf-8"); + String fileName = URLEncoder.encode(title, "UTF-8").replaceAll("\\+", "%20"); + this.init(list, title); + + //生成临时word文件 + File temp = File.createTempFile(AppConfig.getTempPath() + "/temp", ".docx"); + try (FileOutputStream fos = new FileOutputStream(temp)) { + exportWord(tempFileFile, fos); + } + + String osName = OSUtils.getOsName(); + // 根据系统选择执行方法 + boolean flag = false; + if (osName.contains("win")) { + flag = PDFUtils.winWordToPdf(new FileInputStream(temp), response.getOutputStream(), "docx"); + } else if (osName.contains("nux") || osName.contains("nix")) { + //在模板目录下生成临时pdf文件 + String wordPath = temp.getAbsolutePath(); + String pdfPath = temp.getParent(); + + String pdfAbsolutePath = pdfPath + "/" + FileUtils.getNameNotSuffix(wordPath) + ".pdf"; + + flag = PDFUtils.linuxWordToPdf(wordPath, pdfPath); + if (flag) { + // 确保 PDF 文件确实存在 + if (Files.exists(Paths.get(pdfAbsolutePath))) { + try { + Files.copy(Paths.get(pdfAbsolutePath), response.getOutputStream()); + } catch (IOException e) { + log.error("Failed to send PDF response: ", e); + } + } else { + log.error("PDF file does not exist: " + pdfAbsolutePath); + } + // 删除 PDF 文件 + Files.deleteIfExists(Paths.get(pdfAbsolutePath)); + } + } + + if (flag) { + response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".pdf"); + response.setContentType("application/pdf"); + } else { + //格式转换失败或者不支持的操作系统时直接下载docx + response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".docx"); + response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document"); + Files.copy(temp.toPath(), response.getOutputStream()); + } + Files.deleteIfExists(temp.toPath()); + } + + public void exportWord(File tempFileFile, List list, String title) { + this.init(list, title); + exportWord(tempFileFile); + } + + + + public void exportWord(File tempFileFile, T data, String fileGeneratePath) { + List list = new ArrayList<>(); + // 获取带有 @WordExport 注解的字段并生成元数据 + for (Field field : clazz.getDeclaredFields()) { + if (field.isAnnotationPresent(WordExport.class)) { + WordExport annotation = field.getAnnotation(WordExport.class); + try { + field.setAccessible(true); + Object value = field.get(data); + FormMetaData metaData = new FormMetaData(); + metaData.setKey(annotation.key()); + metaData.setName(annotation.name()); + if (StringUtils.isNotBlank(annotation.format())){ + metaData.setValue(DateUtils.parseDateToStr(annotation.format(), (Date) value)); + }else if (annotation.content_type().equals(WordContentTypeEnum.PICTURE)){ + metaData.setValue(Pictures.ofBase64((String) value, PictureType.PNG).size(annotation.width(), annotation.height()).create()); + }else { + metaData.setValue(value.toString()); + } + metaData.setContentType(annotation.content_type()); + metaData.setPluginsType(annotation.plugin_type()); + metaData.setSort(annotation.sort()); + list.add(metaData); + } catch (Exception e) { + log.error("表单注解字段转换错误:{}", e.getMessage(), e); + } + } + } + exportWord(tempFileFile, list, fileGeneratePath); + } + + public void exportWord(File tempFileFile, T data, HttpServletResponse response, String title) { + List list = new ArrayList<>(); + // 获取带有 @WordExport 注解的字段并生成元数据 + for (Field field : clazz.getDeclaredFields()) { + if (field.isAnnotationPresent(WordExport.class)) { + WordExport annotation = field.getAnnotation(WordExport.class); + try { + field.setAccessible(true); + Object value = field.get(data); + FormMetaData metaData = new FormMetaData(); + metaData.setKey(annotation.key()); + metaData.setName(annotation.name()); + if (StringUtils.isNotBlank(annotation.format())){ + metaData.setValue(DateUtils.parseDateToStr(annotation.format(), (Date) value)); + }if (annotation.content_type().equals(WordContentTypeEnum.PICTURE)){ + if (ImageUtils.isValidBase64((String) value)) { + metaData.setValue(Pictures.ofBase64((String) value, PictureType.PNG).size(annotation.width(), annotation.height()).create()); + }else { + metaData.setValue(null); + } + }else { + metaData.setValue(value); + } + metaData.setContentType(annotation.content_type()); + metaData.setPluginsType(annotation.plugin_type()); + metaData.setSort(annotation.sort()); + list.add(metaData); + } catch (IllegalAccessException e) { + log.error("表单注解字段转换错误:{}", e.getMessage(), e); + } + } + } + + try { + exportWord(response, tempFileFile, list, title); + } catch (UnsupportedEncodingException e) { + log.error("导出word失败:{}", e.getMessage(), e); + } + } + + private void exportExcel(File tempFileFile, HttpServletResponse response) { + try (ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).withTemplate(tempFileFile).build()) { + WriteSheet writeSheet = EasyExcel.writerSheet().build(); + FillConfig fillConfig = FillConfig.builder().direction(WriteDirectionEnum.HORIZONTAL).build(); + list_data.forEach(e -> { + excelWriter.fill(e, fillConfig, writeSheet); + }); + excelWriter.fill(data, writeSheet); + } catch (Exception e) { + log.error("导出excel失败:{}", e.getMessage()); + } + } + + public void exportExcel(HttpServletResponse response, File tempFileFile, List list, String title) throws IOException { + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setCharacterEncoding("utf-8"); + String fileName = URLEncoder.encode(title, "UTF-8").replaceAll("\\+", "%20"); + response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx"); + this.init(list, title); + exportExcel(tempFileFile, response); + } + + /** + * 通过word模板,获取占位符信息 + */ + public List getFieldData(File tempFile) { + this.config = createConfig(); + List templates = XWPFTemplate.compile(tempFile, config).getElementTemplates(); + List fields = new ArrayList<>(); + Map> listMap = getListMap(tempFile); + + for (MetaTemplate metaTemplate : templates) { + if (metaTemplate instanceof RunTemplate){ + RunTemplate runTemplate = (RunTemplate) metaTemplate; + //判断是否为List + if (listMap.containsKey(runTemplate.getTagName()) && listMap.get(runTemplate.getTagName()).size() > 0){ + JSONObject value = new JSONObject(); + value.put("value", new ArrayList<>()); + value.put("fields", listMap.get(runTemplate.getTagName())); + fields.add(FieldData.builder() + .key(runTemplate.getTagName()) + .name("") + .value(value) + .type(FieldDataTypeEnum.LIST) + .sort(0) + .remark("") + .build()); + }else { + fields.add(FieldData.builder() + .key(runTemplate.getTagName()) + .name("") + .value("") + .type(FieldDataTypeEnum.STRING) + .sort(0) + .remark("") + .build()); + } + }else if (metaTemplate instanceof InlineIterableTemplate){ + InlineIterableTemplate inlineIterableTemplate = (InlineIterableTemplate) metaTemplate; + JSONObject value = new JSONObject(); + value.put("value", ""); + List radioFields = new ArrayList<>(); + inlineIterableTemplate.getTemplates().forEach(e->{ + if (e instanceof RunTemplate){ + RunTemplate runTemplate = (RunTemplate) e; + radioFields.add(runTemplate.getTagName()); + } + }); + value.put("fields",radioFields); + fields.add(FieldData.builder() + .key(inlineIterableTemplate.getStartMark().getTagName()) + .name("") + .value(value) + .type(FieldDataTypeEnum.RADIO) + .sort(0) + .remark("") + .build()); + }else{ + log.warn("word模板占位符信息类型未知:{}",metaTemplate.variable()); + } + } + return fields; + } + + public Map> getListMap(File tempFile) { + // 定义正则表达式模式 + Pattern FIELD_PATTERN = Pattern.compile("\\{\\{(.+?)\\}\\}"); + Pattern LIST_ITEM_PATTERN = Pattern.compile("\\[(.+?)\\]"); + + Map> listMap = new HashMap<>(); + String currentField = null; + + try (FileInputStream fis = new FileInputStream(tempFile); + XWPFDocument doc = new XWPFDocument(fis)) { + + // 获取文档中所有的主体元素(段落和表格)按顺序排列 + List bodyElements = doc.getBodyElements(); + + for (IBodyElement element : bodyElements) { + if (element instanceof XWPFParagraph) { + XWPFParagraph paragraph = (XWPFParagraph) element; + String paragraphText = paragraph.getText(); + + // 处理段落中的文本 + Matcher fieldMatcher = FIELD_PATTERN.matcher(paragraphText); + if (fieldMatcher.find()) { + currentField = fieldMatcher.group(1).trim(); + listMap.putIfAbsent(currentField, new ArrayList<>()); + // 检查同一段落中是否有列表项 + Matcher listMatcher = LIST_ITEM_PATTERN.matcher(paragraphText); + while (listMatcher.find()) { + if (currentField != null) { + listMap.get(currentField).add(listMatcher.group(1).trim()); + } + } + } else { + // 如果当前有字段,则查找列表项 + if (currentField != null) { + Matcher listMatcher = LIST_ITEM_PATTERN.matcher(paragraphText); + while (listMatcher.find()) { + listMap.get(currentField).add(listMatcher.group(1).trim()); + } + } + } + + } else if (element instanceof XWPFTable) { + XWPFTable table = (XWPFTable) element; + // 遍历表格中的所有单元格 + for (XWPFTableRow row : table.getRows()) { + for (XWPFTableCell cell : row.getTableCells()) { + for (XWPFParagraph paragraph : cell.getParagraphs()) { + String paragraphText = paragraph.getText(); + + Matcher fieldMatcher = FIELD_PATTERN.matcher(paragraphText); + if (fieldMatcher.find()) { + currentField = fieldMatcher.group(1).trim(); + listMap.putIfAbsent(currentField, new ArrayList<>()); + // 检查同一段落中是否有列表项 + Matcher listMatcher = LIST_ITEM_PATTERN.matcher(paragraphText); + while (listMatcher.find()) { + if (currentField != null) { + listMap.get(currentField).add(listMatcher.group(1).trim()); + } + } + } else { + // 如果当前有字段,则查找列表项 + if (currentField != null) { + Matcher listMatcher = LIST_ITEM_PATTERN.matcher(paragraphText); + while (listMatcher.find()) { + listMap.get(currentField).add(listMatcher.group(1).trim()); + } + } + } + } + } + } + } + } + + } catch (Exception e) { + log.error(e.getMessage()); + } + + return listMap; + } +} diff --git a/common/src/main/java/com/yyy/common/utils/poi/FormMetaData.java b/common/src/main/java/com/yyy/common/utils/poi/FormMetaData.java new file mode 100644 index 0000000..87ae78a --- /dev/null +++ b/common/src/main/java/com/yyy/common/utils/poi/FormMetaData.java @@ -0,0 +1,50 @@ +package com.yyy.common.utils.poi; + +import com.yyy.common.enums.WordContentTypeEnum; +import com.yyy.common.enums.WordPluginsTypeEnum; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; + +/** + * 表单数据基本单元 + */ +@Data +@AllArgsConstructor +@Builder +public class FormMetaData { + + /** + * 标识符 + */ + private String key; + + /** + * 名称 + */ + private String name; + + /** + * 数据 + */ + private Object value; + + /** + * 内容类型 + */ + private WordContentTypeEnum contentType; + + /** + * 插件类型 + */ + private WordPluginsTypeEnum pluginsType; + + /** + * 排序(从小到大) 默认为0 + */ + private Integer sort; + + public FormMetaData() { + this.sort = 0; + } +} diff --git a/common/src/main/java/com/yyy/common/utils/poi/PDFUtils.java b/common/src/main/java/com/yyy/common/utils/poi/PDFUtils.java new file mode 100644 index 0000000..861b12d --- /dev/null +++ b/common/src/main/java/com/yyy/common/utils/poi/PDFUtils.java @@ -0,0 +1,165 @@ +package com.yyy.common.utils.poi; + +import com.documents4j.api.DocumentType; +import com.documents4j.api.IConverter; +import com.documents4j.job.LocalConverter; +import com.yyy.common.utils.common.CMDUtils; +import lombok.experimental.UtilityClass; +import lombok.extern.slf4j.Slf4j; + +import java.io.*; +import java.io.InputStream; +import java.io.OutputStream; + +/** + * PDF工具 + */ +@Slf4j +@UtilityClass +public class PDFUtils { + + /** + * doc转pdf + * + * @param path + */ + public static void winWordToPdf(String path) { + File inputWord = new File(path); + if (!inputWord.exists()) { + log.error("输入文件不存在: " + path); + return; + } + + String outputPath = path.substring(0, path.lastIndexOf(".")) + ".pdf"; + File outputFile = new File(outputPath); + + try { + InputStream docxInputStream = new FileInputStream(inputWord); + OutputStream outputStream = new FileOutputStream(outputFile); + IConverter converter = LocalConverter.builder().build(); + String fileType = path.substring(path.lastIndexOf("."), path.length()).toLowerCase(); + + switch (fileType) { + case ".docx": + converter.convert(docxInputStream).as(DocumentType.DOCX).to(outputStream).as(DocumentType.PDF).execute(); + break; + case ".doc": + converter.convert(docxInputStream).as(DocumentType.DOC).to(outputStream).as(DocumentType.PDF).execute(); + break; +// case ".xls": +// converter.convert(docxInputStream).as(DocumentType.XLS).to(outputStream).as(DocumentType.PDF).execute(); +// break; +// case ".xlsx": +// converter.convert(docxInputStream).as(DocumentType.XLSX).to(outputStream).as(DocumentType.PDF).execute(); +// break; + default: + log.error("不支持的文件类型: " + fileType); + return; + } + converter.shutDown(); + outputStream.close(); + docxInputStream.close(); + + log.info("PDF转换成功: " + outputPath); + } catch (Exception e) { + log.error("PDF转换失败: " + e.getMessage(), e); + } finally { + + } + } + + /** + * excel转pdf todo libOffice是否可以实现 + */ + public static void excelToPdf(String path) { + + } + + /** + * doc转pdf (win) + * + * @param in 输入流 + * @param out 输出流 + */ + public static boolean winWordToPdf(InputStream in, OutputStream out, String fileType) { + boolean flag = false; + try { + IConverter converter = LocalConverter.builder().build(); + switch (fileType) { + case "docx": + converter.convert(in).as(DocumentType.DOCX).to(out).as(DocumentType.PDF).execute(); + flag = true; + break; + case "doc": + converter.convert(in).as(DocumentType.DOC).to(out).as(DocumentType.PDF).execute(); + flag = true; + break; + default: + log.error("不支持的文件类型: " + fileType); + } + converter.shutDown(); + //in.close(); + } catch (Exception e) { + log.error("PDF转换失败: " + e.getMessage(), e); + } finally { + + } + return flag; + } + + /** + * doc转pdf (linux) + * + * @param wordPath word文件全路径 + * @param pdfPath pdf输出文件夹路径 + */ + public static boolean linuxWordToPdf(String wordPath, String pdfPath) { + boolean flag = false; + ProcessBuilder processBuilder = new ProcessBuilder(); + + try { + // 检查 LibreOffice 是否可用 + Process checkProcess = processBuilder.command("which", "libreoffice").start(); + if (checkProcess.waitFor() != 0) { + log.error("LibreOffice is not installed or not found in the PATH."); + return false; + } + + // 构建 LibreOffice 的命令行工具命令 + String command = "libreoffice --invisible --convert-to pdf --outdir " + pdfPath + " " + wordPath; + log.info("Executing command: " + command); + + // 执行转换命令 + Process process = processBuilder.command("bash", "-c", command).start(); + + // 获取输出和错误流 + StringBuilder output = new StringBuilder(); + StringBuilder error = new StringBuilder(); + + try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); + BufferedReader errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream()))) { + String line; + while ((line = reader.readLine()) != null) { + output.append(line).append("\n"); + } + while ((line = errorReader.readLine()) != null) { + error.append(line).append("\n"); + } + } + + // 等待命令执行完成 + flag = (process.waitFor() == 0); + + if (!flag) { + log.error("PDF conversion failed: " + error.toString()); + } else { + log.info("PDF conversion succeeded: " + output.toString()); + } + + } catch (Exception e) { + log.error("PDF conversion failed: " + e.getMessage(), e); + } + + return flag; + } +} diff --git a/common/src/main/java/com/yyy/common/utils/poi/RichTextUtils.java b/common/src/main/java/com/yyy/common/utils/poi/RichTextUtils.java new file mode 100644 index 0000000..850fbba --- /dev/null +++ b/common/src/main/java/com/yyy/common/utils/poi/RichTextUtils.java @@ -0,0 +1,101 @@ +package com.yyy.common.utils.poi; + +import lombok.extern.slf4j.Slf4j; +import org.apache.poi.poifs.filesystem.DirectoryEntry; +import org.apache.poi.poifs.filesystem.DocumentEntry; +import org.apache.poi.poifs.filesystem.POIFSFileSystem; +import org.springframework.stereotype.Component; + +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.*; + +/** + * @Description: 富文本工具 + */ +@Component +@Slf4j +public class RichTextUtils { + + /** + * 导出富文本内容到word + * @param request + * @param response + * @param content 输出内容 + * @param fileName 导出文件名称 + * @throws Exception + */ + public static void exportHtmlToWord(HttpServletRequest request, HttpServletResponse response, String content, String fileName) throws Exception { + //图片转为base64方法 + //String imagebase64 = getImageStr(imagePath); + // 拼接html格式内容 + StringBuffer sbf = new StringBuffer(); + // 这里拼接一下html标签,便于word文档能够识别 + sbf.append(""); + sbf.append("" + + "" + + ""); + sbf.append(""); + // 富文本内容 + sbf.append(content); + sbf.append(""); + + // 必须要设置编码,避免中文就会乱码 + byte[] b = sbf.toString().getBytes("GBK"); + // 将字节数组包装到流中 + ByteArrayInputStream bais = new ByteArrayInputStream(b); + POIFSFileSystem poifs = new POIFSFileSystem(); + DirectoryEntry directory = poifs.getRoot(); + // 这代码不能省略,否则导出乱码。 + DocumentEntry documentEntry = directory.createDocument("WordDocument", bais); + //输出文件 + request.setCharacterEncoding("utf-8"); + // 导出word格式 + response.setContentType("application/msword"); + response.addHeader("Content-Disposition", "attachment;filename=" + + new String(fileName.getBytes("GB2312"),"iso8859-1") + ".doc"); + ServletOutputStream ostream = response.getOutputStream(); + poifs.writeFilesystem(ostream); + bais.close(); + ostream.close(); + } + + /** + * 富文本内容到word---指定路径 + * @param content 输出内容 + * @param fileName 导出文件名称 + * @throws Exception + */ + public static void exportHtmlToWord(String filepath, String content, String fileName) throws Exception { + // 拼接html格式内容 + StringBuffer sbf = new StringBuffer(); + // 这里拼接一下html标签,便于word文档能够识别 + sbf.append(""); + sbf.append("" + + "" + + ""); + sbf.append(""); + // 富文本内容 + sbf.append(content); + sbf.append(""); + + // 必须要设置编码,避免中文就会乱码 + byte[] b = sbf.toString().getBytes("GBK"); + // 将字节数组包装到流中 + ByteArrayInputStream bais = new ByteArrayInputStream(b); + POIFSFileSystem poifs = new POIFSFileSystem(); + DirectoryEntry directory = poifs.getRoot(); + // 这代码不能省略,否则导出乱码。 + DocumentEntry documentEntry = directory.createDocument("WordDocument", bais); + + FileOutputStream out = new FileOutputStream(new File(filepath + fileName)); + poifs.writeFilesystem(out); + bais.close(); + out.close(); + } +} diff --git a/common/src/main/java/com/yyy/common/utils/reflect/ReflectUtils.java b/common/src/main/java/com/yyy/common/utils/reflect/ReflectUtils.java new file mode 100644 index 0000000..27c4a17 --- /dev/null +++ b/common/src/main/java/com/yyy/common/utils/reflect/ReflectUtils.java @@ -0,0 +1,405 @@ +package com.yyy.common.utils.reflect; + +import com.yyy.common.core.text.Convert; +import com.yyy.common.utils.common.DateUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.Validate; +import org.apache.poi.ss.usermodel.DateUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.lang.reflect.*; +import java.util.Date; + +/** + * 反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class, 被AOP过的真实类等工具函数. + * + */ +@SuppressWarnings("rawtypes") +public class ReflectUtils +{ + private static final String SETTER_PREFIX = "set"; + + private static final String GETTER_PREFIX = "get"; + + private static final String CGLIB_CLASS_SEPARATOR = "$$"; + + private static Logger logger = LoggerFactory.getLogger(ReflectUtils.class); + + /** + * 调用Getter方法. + * 支持多级,如:对象名.对象名.方法 + */ + @SuppressWarnings("unchecked") + public static E invokeGetter(Object obj, String propertyName) + { + Object object = obj; + for (String name : StringUtils.split(propertyName, ".")) + { + String getterMethodName = GETTER_PREFIX + StringUtils.capitalize(name); + object = invokeMethod(object, getterMethodName, new Class[] {}, new Object[] {}); + } + return (E) object; + } + + /** + * 调用Setter方法, 仅匹配方法名。 + * 支持多级,如:对象名.对象名.方法 + */ + public static void invokeSetter(Object obj, String propertyName, E value) + { + Object object = obj; + String[] names = StringUtils.split(propertyName, "."); + for (int i = 0; i < names.length; i++) + { + if (i < names.length - 1) + { + String getterMethodName = GETTER_PREFIX + StringUtils.capitalize(names[i]); + object = invokeMethod(object, getterMethodName, new Class[] {}, new Object[] {}); + } + else + { + String setterMethodName = SETTER_PREFIX + StringUtils.capitalize(names[i]); + invokeMethodByName(object, setterMethodName, new Object[] { value }); + } + } + } + + /** + * 直接读取对象属性值, 无视private/protected修饰符, 不经过getter函数. + */ + @SuppressWarnings("unchecked") + public static E getFieldValue(final Object obj, final String fieldName) + { + Field field = getAccessibleField(obj, fieldName); + if (field == null) + { + logger.debug("在 [" + obj.getClass() + "] 中,没有找到 [" + fieldName + "] 字段 "); + return null; + } + E result = null; + try + { + result = (E) field.get(obj); + } + catch (IllegalAccessException e) + { + logger.error("不可能抛出的异常{}", e.getMessage()); + } + return result; + } + + /** + * 直接设置对象属性值, 无视private/protected修饰符, 不经过setter函数. + */ + public static void setFieldValue(final Object obj, final String fieldName, final E value) + { + Field field = getAccessibleField(obj, fieldName); + if (field == null) + { + // throw new IllegalArgumentException("在 [" + obj.getClass() + "] 中,没有找到 [" + fieldName + "] 字段 "); + logger.debug("在 [" + obj.getClass() + "] 中,没有找到 [" + fieldName + "] 字段 "); + return; + } + try + { + field.set(obj, value); + } + catch (IllegalAccessException e) + { + logger.error("不可能抛出的异常: {}", e.getMessage()); + } + } + + /** + * 直接调用对象方法, 无视private/protected修饰符. + * 用于一次性调用的情况,否则应使用getAccessibleMethod()函数获得Method后反复调用. + * 同时匹配方法名+参数类型, + */ + @SuppressWarnings("unchecked") + public static E invokeMethod(final Object obj, final String methodName, final Class[] parameterTypes, + final Object[] args) + { + if (obj == null || methodName == null) + { + return null; + } + Method method = getAccessibleMethod(obj, methodName, parameterTypes); + if (method == null) + { + logger.debug("在 [" + obj.getClass() + "] 中,没有找到 [" + methodName + "] 方法 "); + return null; + } + try + { + return (E) method.invoke(obj, args); + } + catch (Exception e) + { + String msg = "method: " + method + ", obj: " + obj + ", args: " + args + ""; + throw convertReflectionExceptionToUnchecked(msg, e); + } + } + + /** + * 直接调用对象方法, 无视private/protected修饰符, + * 用于一次性调用的情况,否则应使用getAccessibleMethodByName()函数获得Method后反复调用. + * 只匹配函数名,如果有多个同名函数调用第一个。 + */ + @SuppressWarnings("unchecked") + public static E invokeMethodByName(final Object obj, final String methodName, final Object[] args) + { + Method method = getAccessibleMethodByName(obj, methodName, args.length); + if (method == null) + { + // 如果为空不报错,直接返回空。 + logger.debug("在 [" + obj.getClass() + "] 中,没有找到 [" + methodName + "] 方法 "); + return null; + } + try + { + // 类型转换(将参数数据类型转换为目标方法参数类型) + Class[] cs = method.getParameterTypes(); + for (int i = 0; i < cs.length; i++) + { + if (args[i] != null && !args[i].getClass().equals(cs[i])) + { + if (cs[i] == String.class) + { + args[i] = Convert.toStr(args[i]); + if (StringUtils.endsWith((String) args[i], ".0")) + { + args[i] = StringUtils.substringBefore((String) args[i], ".0"); + } + } + else if (cs[i] == Integer.class) + { + args[i] = Convert.toInt(args[i]); + } + else if (cs[i] == Long.class) + { + args[i] = Convert.toLong(args[i]); + } + else if (cs[i] == Double.class) + { + args[i] = Convert.toDouble(args[i]); + } + else if (cs[i] == Float.class) + { + args[i] = Convert.toFloat(args[i]); + } + else if (cs[i] == Date.class) + { + if (args[i] instanceof String) + { + args[i] = DateUtils.parseDate(args[i]); + } + else + { + args[i] = DateUtil.getJavaDate((Double) args[i]); + } + } + else if (cs[i] == boolean.class || cs[i] == Boolean.class) + { + args[i] = Convert.toBool(args[i]); + } + } + } + return (E) method.invoke(obj, args); + } + catch (Exception e) + { + String msg = "method: " + method + ", obj: " + obj + ", args: " + args + ""; + throw convertReflectionExceptionToUnchecked(msg, e); + } + } + + /** + * 循环向上转型, 获取对象的DeclaredField, 并强制设置为可访问. + * 如向上转型到Object仍无法找到, 返回null. + */ + public static Field getAccessibleField(final Object obj, final String fieldName) + { + // 为空不报错。直接返回 null + if (obj == null) + { + return null; + } + Validate.notBlank(fieldName, "fieldName can't be blank"); + for (Class superClass = obj.getClass(); superClass != Object.class; superClass = superClass.getSuperclass()) + { + try + { + Field field = superClass.getDeclaredField(fieldName); + makeAccessible(field); + return field; + } + catch (NoSuchFieldException e) + { + continue; + } + } + return null; + } + + /** + * 循环向上转型, 获取对象的DeclaredMethod,并强制设置为可访问. + * 如向上转型到Object仍无法找到, 返回null. + * 匹配函数名+参数类型。 + * 用于方法需要被多次调用的情况. 先使用本函数先取得Method,然后调用Method.invoke(Object obj, Object... args) + */ + public static Method getAccessibleMethod(final Object obj, final String methodName, + final Class... parameterTypes) + { + // 为空不报错。直接返回 null + if (obj == null) + { + return null; + } + Validate.notBlank(methodName, "methodName can't be blank"); + for (Class searchType = obj.getClass(); searchType != Object.class; searchType = searchType.getSuperclass()) + { + try + { + Method method = searchType.getDeclaredMethod(methodName, parameterTypes); + makeAccessible(method); + return method; + } + catch (NoSuchMethodException e) + { + continue; + } + } + return null; + } + + /** + * 循环向上转型, 获取对象的DeclaredMethod,并强制设置为可访问. + * 如向上转型到Object仍无法找到, 返回null. + * 只匹配函数名。 + * 用于方法需要被多次调用的情况. 先使用本函数先取得Method,然后调用Method.invoke(Object obj, Object... args) + */ + public static Method getAccessibleMethodByName(final Object obj, final String methodName, int argsNum) + { + // 为空不报错。直接返回 null + if (obj == null) + { + return null; + } + Validate.notBlank(methodName, "methodName can't be blank"); + for (Class searchType = obj.getClass(); searchType != Object.class; searchType = searchType.getSuperclass()) + { + Method[] methods = searchType.getDeclaredMethods(); + for (Method method : methods) + { + if (method.getName().equals(methodName) && method.getParameterTypes().length == argsNum) + { + makeAccessible(method); + return method; + } + } + } + return null; + } + + /** + * 改变private/protected的方法为public,尽量不调用实际改动的语句,避免JDK的SecurityManager抱怨。 + */ + public static void makeAccessible(Method method) + { + if ((!Modifier.isPublic(method.getModifiers()) || !Modifier.isPublic(method.getDeclaringClass().getModifiers())) + && !method.isAccessible()) + { + method.setAccessible(true); + } + } + + /** + * 改变private/protected的成员变量为public,尽量不调用实际改动的语句,避免JDK的SecurityManager抱怨。 + */ + public static void makeAccessible(Field field) + { + if ((!Modifier.isPublic(field.getModifiers()) || !Modifier.isPublic(field.getDeclaringClass().getModifiers()) + || Modifier.isFinal(field.getModifiers())) && !field.isAccessible()) + { + field.setAccessible(true); + } + } + + /** + * 通过反射, 获得Class定义中声明的泛型参数的类型, 注意泛型必须定义在父类处 + * 如无法找到, 返回Object.class. + */ + @SuppressWarnings("unchecked") + public static Class getClassGenricType(final Class clazz) + { + return getClassGenricType(clazz, 0); + } + + /** + * 通过反射, 获得Class定义中声明的父类的泛型参数的类型. + * 如无法找到, 返回Object.class. + */ + public static Class getClassGenricType(final Class clazz, final int index) + { + Type genType = clazz.getGenericSuperclass(); + + if (!(genType instanceof ParameterizedType)) + { + logger.debug(clazz.getSimpleName() + "'s superclass not ParameterizedType"); + return Object.class; + } + + Type[] params = ((ParameterizedType) genType).getActualTypeArguments(); + + if (index >= params.length || index < 0) + { + logger.debug("Index: " + index + ", Size of " + clazz.getSimpleName() + "'s Parameterized Type: " + + params.length); + return Object.class; + } + if (!(params[index] instanceof Class)) + { + logger.debug(clazz.getSimpleName() + " not set the actual class on superclass generic parameter"); + return Object.class; + } + + return (Class) params[index]; + } + + public static Class getUserClass(Object instance) + { + if (instance == null) + { + throw new RuntimeException("Instance must not be null"); + } + Class clazz = instance.getClass(); + if (clazz != null && clazz.getName().contains(CGLIB_CLASS_SEPARATOR)) + { + Class superClass = clazz.getSuperclass(); + if (superClass != null && !Object.class.equals(superClass)) + { + return superClass; + } + } + return clazz; + + } + + /** + * 将反射时的checked exception转换为unchecked exception. + */ + public static RuntimeException convertReflectionExceptionToUnchecked(String msg, Exception e) + { + if (e instanceof IllegalAccessException || e instanceof IllegalArgumentException + || e instanceof NoSuchMethodException) + { + return new IllegalArgumentException(msg, e); + } + else if (e instanceof InvocationTargetException) + { + return new RuntimeException(msg, ((InvocationTargetException) e).getTargetException()); + } + return new RuntimeException(msg, e); + } +} diff --git a/common/src/main/java/com/yyy/common/utils/security/JwtUtils.java b/common/src/main/java/com/yyy/common/utils/security/JwtUtils.java new file mode 100644 index 0000000..9593910 --- /dev/null +++ b/common/src/main/java/com/yyy/common/utils/security/JwtUtils.java @@ -0,0 +1,58 @@ +package com.yyy.common.utils.security; + +import com.auth0.jwt.JWT; +import com.auth0.jwt.algorithms.Algorithm; +import com.auth0.jwt.interfaces.Claim; +import com.auth0.jwt.interfaces.DecodedJWT; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; + +/** + * @Author: fy + * @Date: 2024/03/22 + * @Description:生成token + */ +@Component +public class JwtUtils { + + @Value("${jwt.config.secretKey}") + private String secretKey; + /** + * 加密token. + */ + public String getToken(Long uid,String sid, String clientVersion, String clientType) { + //这个是放到负载payLoad 里面,魔法值可以使用常量类进行封装. + String token = JWT + .create() + .withClaim("uid" ,uid) + .withClaim("sid",sid) + .withClaim("clientVersion", clientVersion) + .withClaim("clientType", clientType) + .withClaim("timeStamp", System.currentTimeMillis()) + .sign(Algorithm.HMAC256(secretKey)); + return token; + } + /** + * 解析token. + */ + public Map parseToken(String token) { + HashMap map = new HashMap(); + DecodedJWT decodedjwt = JWT.require(Algorithm.HMAC256(secretKey)) + .build().verify(token); + Claim uid = decodedjwt.getClaim("uid"); + Claim sid = decodedjwt.getClaim("sid"); + Claim clientVersion = decodedjwt.getClaim("clientVersion"); + Claim clientType = decodedjwt.getClaim("clientType"); + Claim timeStamp = decodedjwt.getClaim("timeStamp"); + + map.put("uid", uid.asLong().toString()); + map.put("sid", sid.asString()); + map.put("clientVersion", clientVersion.asString()); + map.put("clientType", clientType.asString()); + map.put("timeStamp", timeStamp.asLong().toString()); + return map; + } +} diff --git a/common/src/main/java/com/yyy/common/utils/security/SessionHolder.java b/common/src/main/java/com/yyy/common/utils/security/SessionHolder.java new file mode 100644 index 0000000..38bdac9 --- /dev/null +++ b/common/src/main/java/com/yyy/common/utils/security/SessionHolder.java @@ -0,0 +1,22 @@ +package com.yyy.common.utils.security; + +/** + * @Author: fy + * @Date: 2024/03/22 + * @Description: + */ +public class SessionHolder { + private static final ThreadLocal USER_SESSION = new ThreadLocal<>(); + + public static void setUserSession(String userSession) { + USER_SESSION.set(userSession); + } + + public static String getUserSession() { + return USER_SESSION.get(); + } + + public static void clearSession() { + USER_SESSION.remove(); + } +} diff --git a/common/src/main/java/com/yyy/common/utils/spring/SpringUtils.java b/common/src/main/java/com/yyy/common/utils/spring/SpringUtils.java new file mode 100644 index 0000000..3e2ec66 --- /dev/null +++ b/common/src/main/java/com/yyy/common/utils/spring/SpringUtils.java @@ -0,0 +1,157 @@ +package com.yyy.common.utils.spring; + +import com.yyy.common.utils.common.StringUtils; +import org.springframework.aop.framework.AopContext; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.NoSuchBeanDefinitionException; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.stereotype.Component; + +/** + * spring工具类 方便在非spring管理环境中获取bean + */ +@Component +public final class SpringUtils implements BeanFactoryPostProcessor, ApplicationContextAware +{ + /** Spring应用上下文环境 */ + private static ConfigurableListableBeanFactory beanFactory; + + private static ApplicationContext applicationContext; + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException + { + SpringUtils.beanFactory = beanFactory; + } + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException + { + SpringUtils.applicationContext = applicationContext; + } + + /** + * 获取对象 + * + * @param name + * @return Object 一个以所给名字注册的bean的实例 + * @throws BeansException + * + */ + @SuppressWarnings("unchecked") + public static T getBean(String name) throws BeansException + { + return (T) beanFactory.getBean(name); + } + + /** + * 获取类型为requiredType的对象 + * + * @param clz + * @return + * @throws BeansException + * + */ + public static T getBean(Class clz) throws BeansException + { + T result = (T) beanFactory.getBean(clz); + return result; + } + + /** + * 如果BeanFactory包含一个与所给名称匹配的bean定义,则返回true + * + * @param name + * @return boolean + */ + public static boolean containsBean(String name) + { + return beanFactory.containsBean(name); + } + + /** + * 判断以给定名字注册的bean定义是一个singleton还是一个prototype。 如果与给定名字相应的bean定义没有被找到,将会抛出一个异常(NoSuchBeanDefinitionException) + * + * @param name + * @return boolean + * @throws NoSuchBeanDefinitionException + * + */ + public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException + { + return beanFactory.isSingleton(name); + } + + /** + * @param name + * @return Class 注册对象的类型 + * @throws NoSuchBeanDefinitionException + * + */ + public static Class getType(String name) throws NoSuchBeanDefinitionException + { + return beanFactory.getType(name); + } + + /** + * 如果给定的bean名字在bean定义中有别名,则返回这些别名 + * + * @param name + * @return + * @throws NoSuchBeanDefinitionException + * + */ + public static String[] getAliases(String name) throws NoSuchBeanDefinitionException + { + return beanFactory.getAliases(name); + } + + /** + * 获取aop代理对象 + * + * @param invoker + * @return + */ + @SuppressWarnings("unchecked") + public static T getAopProxy(T invoker) + { + return (T) AopContext.currentProxy(); + } + + /** + * 获取当前的环境配置,无配置返回null + * + * @return 当前的环境配置 + */ + public static String[] getActiveProfiles() + { + return applicationContext.getEnvironment().getActiveProfiles(); + } + + /** + * 获取当前的环境配置,当有多个环境配置时,只获取第一个 + * + * @return 当前的环境配置 + */ + public static String getActiveProfile() + { + final String[] activeProfiles = getActiveProfiles(); + return StringUtils.isNotEmpty(activeProfiles) ? activeProfiles[0] : null; + } + + /** + * 获取配置文件中的值 + * + * @param key 配置文件的key + * @return 当前的配置文件的值 + * + */ + public static String getRequiredProperty(String key) + { + return applicationContext.getEnvironment().getRequiredProperty(key); + } + +} diff --git a/common/src/main/java/com/yyy/common/utils/sql/SqlUtil.java b/common/src/main/java/com/yyy/common/utils/sql/SqlUtil.java new file mode 100644 index 0000000..b2baa0b --- /dev/null +++ b/common/src/main/java/com/yyy/common/utils/sql/SqlUtil.java @@ -0,0 +1,76 @@ +package com.yyy.common.utils.sql; + +import com.yyy.common.core.domain.Result; +import com.yyy.common.exception.base.BaseException; +import com.yyy.common.utils.common.StringUtils; + +/** + * @Author: fy + * @Date: 2024/03/22 + * @Description:sql操作工具类 + */ +public class SqlUtil +{ + /** + * 定义常用的 sql关键字 + */ + public static String SQL_REGEX = "and |extractvalue|updatexml|exec |insert |select |delete |update |drop |count |chr |mid |master |truncate |char |declare |or |+|user()"; + + /** + * 仅支持字母、数字、下划线、空格、逗号、小数点(支持多个字段排序) + */ + public static String SQL_PATTERN = "[a-zA-Z0-9_\\ \\,\\.]+"; + + /** + * 限制orderBy最大长度 + */ + private static final int ORDER_BY_MAX_LENGTH = 500; + + /** + * 检查字符,防止注入绕过 + */ + public static String escapeOrderBySql(String value) + { + if (StringUtils.isNotEmpty(value) && !isValidOrderBySql(value)) + { + + throw new BaseException(Result.ILLEGAL_ARGUMENT); + } + if (StringUtils.length(value) > ORDER_BY_MAX_LENGTH) + { + Result result = Result.FAILURE; + result.setDesc("参数已超过最大限制,不能进行查询"); + throw new BaseException(result); + } + return value; + } + + /** + * 验证 order by 语法是否符合规范 + */ + public static boolean isValidOrderBySql(String value) + { + return value.matches(SQL_PATTERN); + } + + /** + * SQL关键字检查 + */ + public static void filterKeyword(String value) + { + if (StringUtils.isEmpty(value)) + { + return; + } + String[] sqlKeywords = StringUtils.split(SQL_REGEX, "\\|"); + for (String sqlKeyword : sqlKeywords) + { + if (StringUtils.indexOfIgnoreCase(value, sqlKeyword) > -1) + { + Result result = Result.FAILURE; + result.setDesc("参数存在SQL注入风险"); + throw new BaseException(result); + } + } + } +} \ No newline at end of file diff --git a/common/src/main/java/com/yyy/common/utils/tree/TreeBuilderUtil.java b/common/src/main/java/com/yyy/common/utils/tree/TreeBuilderUtil.java new file mode 100644 index 0000000..b062c02 --- /dev/null +++ b/common/src/main/java/com/yyy/common/utils/tree/TreeBuilderUtil.java @@ -0,0 +1,71 @@ +package com.yyy.common.utils.tree; + +import com.yyy.common.annotation.tree.TreeNodeId; +import com.yyy.common.annotation.tree.TreeNodeParentId; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @Description:树型结构数据构建工具 + * @Version: 1.0 + * @Author: yyy + */ +public class TreeBuilderUtil { + + public static List> buildTree(List nodes) throws IllegalAccessException { + Map> nodeMap = new HashMap<>(); + List> rootNodes = new ArrayList<>(); + + Field idField = null; + Field parentIdField = null; + + // 找到标注了注解的字段 + for (Field field : nodes.get(0).getClass().getDeclaredFields()) { + if (field.isAnnotationPresent(TreeNodeId.class)) { + idField = field; + idField.setAccessible(true); + } + if (field.isAnnotationPresent(TreeNodeParentId.class)) { + parentIdField = field; + parentIdField.setAccessible(true); + } + } + + if (idField == null || parentIdField == null) { + throw new IllegalArgumentException("Missing TreeNodeId or TreeNodeParentId annotation"); + } + + // 将节点存储到Map中 + for (T node : nodes) { + Object id = idField.get(node); + TreeNode treeNode = new TreeNode<>(node); + nodeMap.put(id, treeNode); + } + + // 构建树形结构 + for (T node : nodes) { + Object parentId = parentIdField.get(node); + TreeNode treeNode = nodeMap.get(idField.get(node)); + if (parentId == null) { + rootNodes.add(treeNode); + treeNode.setPath("/" + treeNode.getId() + "-" + treeNode.getName()); + } else { + TreeNode parentNode = nodeMap.get(parentId); + if (parentNode != null) { + parentNode.getChildren().add(treeNode); + treeNode.setParent(parentNode); + treeNode.setPath(parentNode.getPath() + "/" + treeNode.getId() + "-" + treeNode.getName()); + }else { + rootNodes.add(treeNode); + treeNode.setPath("/" + treeNode.getId() + "-" + treeNode.getName()); + } + } + } + + return rootNodes; + } +} \ No newline at end of file diff --git a/common/src/main/java/com/yyy/common/utils/tree/TreeNode.java b/common/src/main/java/com/yyy/common/utils/tree/TreeNode.java new file mode 100644 index 0000000..9c2fdf0 --- /dev/null +++ b/common/src/main/java/com/yyy/common/utils/tree/TreeNode.java @@ -0,0 +1,152 @@ +package com.yyy.common.utils.tree; + +import com.yyy.common.annotation.tree.TreeNodeId; +import com.yyy.common.annotation.tree.TreeNodeName; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @Description:树节点 + * @Version: 1.0 + * @Author: yyy + */ +public class TreeNode { + private T data; + private List> children = new ArrayList<>(); + private TreeNode parent; + private String path; + + public TreeNode(T data) { + this.data = data; + } + + public T getData() { + return data; + } + + public void setData(T data) { + this.data = data; + } + + public List> getChildren() { + return children; + } + + public void setChildren(List> children) { + this.children = children; + } + + public TreeNode getParent() { + return parent; + } + + public void setParent(TreeNode parent) { + this.parent = parent; + } + + public String getPath() { + return path; + } + + //path = /1-资产/2-办公用品/3-办公用品/4-办公用品/5-办公用品 + public String getRootId() { + return path.split("/")[1].split("-")[0]; + } + + public String getRootName() { + return path.split("/")[1].split("-")[1]; + } + + public String getIdPath() { + String[] segments = path.split("/"); + StringBuilder idPath = new StringBuilder(); + for (int i = 1; i < segments.length; i++) { + String[] parts = segments[i].split("-"); + if (parts.length > 1) { + idPath.append(parts[0]); + if (i < segments.length - 1) { + idPath.append("/"); + } + } + } + return idPath.toString(); + } + + public String getNamePath() { + String[] segments = path.split("/"); + StringBuilder namePath = new StringBuilder(); + for (int i = 1; i < segments.length; i++) { + String[] parts = segments[i].split("-"); + if (parts.length > 1) { + namePath.append(parts[1]); + if (i < segments.length - 1) { + namePath.append("/"); + } + } + } + return namePath.toString(); + } + + public void setPath(String path) { + this.path = path; + } + + public List getChildIds() { + return children.stream() + .map(TreeNode::getId) + .collect(Collectors.toList()); + } + + public List getChildNames() { + return children.stream() + .map(TreeNode::getName) + .collect(Collectors.toList()); + } + + public Object getParentId() { + return parent != null ? getId(parent.getData()) : null; + } + + public String getParentName() { + return parent != null ? getName(parent.getData()) : null; + } + + public Object getId() { + return getId(this.data); + } + + public String getName() { + return getName(this.data); + } + + private Object getId(T node) { + try { + for (Field field : node.getClass().getDeclaredFields()) { + if (field.isAnnotationPresent(TreeNodeId.class)) { + field.setAccessible(true); + return field.get(node); + } + } + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + return null; + } + + private String getName(T node) { + try { + for (Field field : node.getClass().getDeclaredFields()) { + if (field.isAnnotationPresent(TreeNodeName.class)) { + field.setAccessible(true); + return (String) field.get(node); + } + } + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + return null; + } +} \ No newline at end of file diff --git a/common/src/main/java/com/yyy/common/utils/uuid/IdUtils.java b/common/src/main/java/com/yyy/common/utils/uuid/IdUtils.java new file mode 100644 index 0000000..408aac4 --- /dev/null +++ b/common/src/main/java/com/yyy/common/utils/uuid/IdUtils.java @@ -0,0 +1,47 @@ +package com.yyy.common.utils.uuid; + +/** + * ID生成器工具类 + */ +public class IdUtils +{ + /** + * 获取随机UUID + * + * @return 随机UUID + */ + public static String randomUUID() + { + return UUID.randomUUID().toString(); + } + + /** + * 简化的UUID,去掉了横线 + * + * @return 简化的UUID,去掉了横线 + */ + public static String simpleUUID() + { + return UUID.randomUUID().toString(true); + } + + /** + * 获取随机UUID,使用性能更好的ThreadLocalRandom生成UUID + * + * @return 随机UUID + */ + public static String fastUUID() + { + return UUID.fastUUID().toString(); + } + + /** + * 简化的UUID,去掉了横线,使用性能更好的ThreadLocalRandom生成UUID + * + * @return 简化的UUID,去掉了横线 + */ + public static String fastSimpleUUID() + { + return UUID.fastUUID().toString(true); + } +} diff --git a/common/src/main/java/com/yyy/common/utils/uuid/Seq.java b/common/src/main/java/com/yyy/common/utils/uuid/Seq.java new file mode 100644 index 0000000..9da9561 --- /dev/null +++ b/common/src/main/java/com/yyy/common/utils/uuid/Seq.java @@ -0,0 +1,87 @@ +package com.yyy.common.utils.uuid; + +import com.yyy.common.utils.common.DateUtils; +import com.yyy.common.utils.common.StringUtils; + +import java.util.concurrent.atomic.AtomicInteger; + +/** + * 序列生成类 + */ +public class Seq +{ + // 通用序列类型 + public static final String commSeqType = "COMMON"; + + // 上传序列类型 + public static final String uploadSeqType = "UPLOAD"; + + // 通用接口序列数 + private static AtomicInteger commSeq = new AtomicInteger(1); + + // 上传接口序列数 + private static AtomicInteger uploadSeq = new AtomicInteger(1); + + // 机器标识 + private static final String machineCode = "A"; + + /** + * 获取通用序列号 + * + * @return 序列值 + */ + public static String getId() + { + return getId(commSeqType); + } + + /** + * 默认16位序列号 yyMMddHHmmss + 一位机器标识 + 3长度循环递增字符串 + * + * @return 序列值 + */ + public static String getId(String type) + { + AtomicInteger atomicInt = commSeq; + if (uploadSeqType.equals(type)) + { + atomicInt = uploadSeq; + } + return getId(atomicInt, 3); + } + + /** + * 通用接口序列号 yyMMddHHmmss + 一位机器标识 + length长度循环递增字符串 + * + * @param atomicInt 序列数 + * @param length 数值长度 + * @return 序列值 + */ + public static String getId(AtomicInteger atomicInt, int length) + { + String result = DateUtils.dateTimeNow(); + result += machineCode; + result += getSeq(atomicInt, length); + return result; + } + + /** + * 序列循环递增字符串[1, 10 的 (length)幂次方), 用0左补齐length位数 + * + * @return 序列值 + */ + private synchronized static String getSeq(AtomicInteger atomicInt, int length) + { + // 先取值再+1 + int value = atomicInt.getAndIncrement(); + + // 如果更新后值>=10 的 (length)幂次方则重置为1 + int maxSeq = (int) Math.pow(10, length); + if (atomicInt.get() >= maxSeq) + { + atomicInt.set(1); + } + // 转字符串,用0左补齐 + return StringUtils.padl(value, length); + } +} diff --git a/common/src/main/java/com/yyy/common/utils/uuid/SnowFlakeUtil.java b/common/src/main/java/com/yyy/common/utils/uuid/SnowFlakeUtil.java new file mode 100644 index 0000000..a9e1afc --- /dev/null +++ b/common/src/main/java/com/yyy/common/utils/uuid/SnowFlakeUtil.java @@ -0,0 +1,75 @@ +package com.yyy.common.utils.uuid; +import cn.hutool.core.lang.Singleton; + +/** + * Created with IntelliJ IDEA. + * + * @Author: fy + * @Date: 2023/05/09/15:41 + * @Description:雪花算法工具类 + */ +public class SnowFlakeUtil { + private static final long START_STMP = 1420041600000L; + private static final long SEQUENCE_BIT = 9L; + private static final long MACHINE_BIT = 2L; + private static final long DATACENTER_BIT = 2L; + private static final long MAX_SEQUENCE = 511L; + private static final long MAX_MACHINE_NUM = 3L; + private static final long MAX_DATACENTER_NUM = 3L; + private static final long MACHINE_LEFT = 9L; + private static final long DATACENTER_LEFT = 11L; + private static final long TIMESTMP_LEFT = 13L; + private long datacenterId; + private long machineId; + private long sequence = 0L; + private long lastStmp = -1L; + + public SnowFlakeUtil(long datacenterId, long machineId) { + if (datacenterId <= 3L && datacenterId >= 0L) { + if (machineId <= 3L && machineId >= 0L) { + this.datacenterId = datacenterId; + this.machineId = machineId; + } else { + throw new IllegalArgumentException("machineId can't be greater than MAX_MACHINE_NUM or less than 0"); + } + } else { + throw new IllegalArgumentException("datacenterId can't be greater than MAX_DATACENTER_NUM or less than 0"); + } + } + + public synchronized long nextId() { + long currStmp = this.getNewstmp(); + if (currStmp < this.lastStmp) { + throw new RuntimeException("Clock moved backwards. Refusing to generate id"); + } else { + if (currStmp == this.lastStmp) { + this.sequence = this.sequence + 1L & 511L; + if (this.sequence == 0L) { + currStmp = this.getNextMill(); + } + } else { + this.sequence = 0L; + } + + this.lastStmp = currStmp; + return currStmp - 1420041600000L << 13 | this.datacenterId << 11 | this.machineId << 9 | this.sequence; + } + } + + private long getNextMill() { + long mill; + for(mill = this.getNewstmp(); mill <= this.lastStmp; mill = this.getNewstmp()) { + } + + return mill; + } + + private long getNewstmp() { + return System.currentTimeMillis(); + } + + public static Long getDefaultSnowFlakeId() { + return ((SnowFlakeUtil)Singleton.get(SnowFlakeUtil.class, new Object[]{1L, 1L})).nextId(); + } + +} diff --git a/common/src/main/java/com/yyy/common/utils/uuid/UUID.java b/common/src/main/java/com/yyy/common/utils/uuid/UUID.java new file mode 100644 index 0000000..64eb7c3 --- /dev/null +++ b/common/src/main/java/com/yyy/common/utils/uuid/UUID.java @@ -0,0 +1,485 @@ +package com.yyy.common.utils.uuid; + + +import com.yyy.common.exception.UtilException; + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; +import java.util.Random; +import java.util.concurrent.ThreadLocalRandom; + +/** + * 提供通用唯一识别码(universally unique identifier)(UUID)实现 + */ +public final class UUID implements java.io.Serializable, Comparable +{ + private static final long serialVersionUID = -1185015143654744140L; + + /** + * SecureRandom 的单例 + * + */ + private static class Holder + { + static final SecureRandom numberGenerator = getSecureRandom(); + } + + /** 此UUID的最高64有效位 */ + private final long mostSigBits; + + /** 此UUID的最低64有效位 */ + private final long leastSigBits; + + /** + * 私有构造 + * + * @param data 数据 + */ + private UUID(byte[] data) + { + long msb = 0; + long lsb = 0; + assert data.length == 16 : "data must be 16 bytes in length"; + for (int i = 0; i < 8; i++) + { + msb = (msb << 8) | (data[i] & 0xff); + } + for (int i = 8; i < 16; i++) + { + lsb = (lsb << 8) | (data[i] & 0xff); + } + this.mostSigBits = msb; + this.leastSigBits = lsb; + } + + /** + * 使用指定的数据构造新的 UUID。 + * + * @param mostSigBits 用于 {@code UUID} 的最高有效 64 位 + * @param leastSigBits 用于 {@code UUID} 的最低有效 64 位 + */ + public UUID(long mostSigBits, long leastSigBits) + { + this.mostSigBits = mostSigBits; + this.leastSigBits = leastSigBits; + } + + /** + * 获取类型 4(伪随机生成的)UUID 的静态工厂。 + * + * @return 随机生成的 {@code UUID} + */ + public static UUID fastUUID() + { + return randomUUID(false); + } + + /** + * 获取类型 4(伪随机生成的)UUID 的静态工厂。 使用加密的强伪随机数生成器生成该 UUID。 + * + * @return 随机生成的 {@code UUID} + */ + public static UUID randomUUID() + { + return randomUUID(true); + } + + /** + * 获取类型 4(伪随机生成的)UUID 的静态工厂。 使用加密的强伪随机数生成器生成该 UUID。 + * + * @param isSecure 是否使用{@link SecureRandom}如果是可以获得更安全的随机码,否则可以得到更好的性能 + * @return 随机生成的 {@code UUID} + */ + public static UUID randomUUID(boolean isSecure) + { + final Random ng = isSecure ? Holder.numberGenerator : getRandom(); + + byte[] randomBytes = new byte[16]; + ng.nextBytes(randomBytes); + randomBytes[6] &= 0x0f; /* clear version */ + randomBytes[6] |= 0x40; /* set to version 4 */ + randomBytes[8] &= 0x3f; /* clear variant */ + randomBytes[8] |= 0x80; /* set to IETF variant */ + return new UUID(randomBytes); + } + + /** + * 根据指定的字节数组获取类型 3(基于名称的)UUID 的静态工厂。 + * + * @param name 用于构造 UUID 的字节数组。 + * + * @return 根据指定数组生成的 {@code UUID} + */ + public static UUID nameUUIDFromBytes(byte[] name) + { + MessageDigest md; + try + { + md = MessageDigest.getInstance("MD5"); + } + catch (NoSuchAlgorithmException nsae) + { + throw new InternalError("MD5 not supported"); + } + byte[] md5Bytes = md.digest(name); + md5Bytes[6] &= 0x0f; /* clear version */ + md5Bytes[6] |= 0x30; /* set to version 3 */ + md5Bytes[8] &= 0x3f; /* clear variant */ + md5Bytes[8] |= 0x80; /* set to IETF variant */ + return new UUID(md5Bytes); + } + + /** + * 根据 {@link #toString()} 方法中描述的字符串标准表示形式创建{@code UUID}。 + * + * @param name 指定 {@code UUID} 字符串 + * @return 具有指定值的 {@code UUID} + * @throws IllegalArgumentException 如果 name 与 {@link #toString} 中描述的字符串表示形式不符抛出此异常 + * + */ + public static UUID fromString(String name) + { + String[] components = name.split("-"); + if (components.length != 5) + { + throw new IllegalArgumentException("Invalid UUID string: " + name); + } + for (int i = 0; i < 5; i++) + { + components[i] = "0x" + components[i]; + } + + long mostSigBits = Long.decode(components[0]).longValue(); + mostSigBits <<= 16; + mostSigBits |= Long.decode(components[1]).longValue(); + mostSigBits <<= 16; + mostSigBits |= Long.decode(components[2]).longValue(); + + long leastSigBits = Long.decode(components[3]).longValue(); + leastSigBits <<= 48; + leastSigBits |= Long.decode(components[4]).longValue(); + + return new UUID(mostSigBits, leastSigBits); + } + + /** + * 返回此 UUID 的 128 位值中的最低有效 64 位。 + * + * @return 此 UUID 的 128 位值中的最低有效 64 位。 + */ + public long getLeastSignificantBits() + { + return leastSigBits; + } + + /** + * 返回此 UUID 的 128 位值中的最高有效 64 位。 + * + * @return 此 UUID 的 128 位值中最高有效 64 位。 + */ + public long getMostSignificantBits() + { + return mostSigBits; + } + + /** + * 与此 {@code UUID} 相关联的版本号. 版本号描述此 {@code UUID} 是如何生成的。 + *

+ * 版本号具有以下含意: + *

    + *
  • 1 基于时间的 UUID + *
  • 2 DCE 安全 UUID + *
  • 3 基于名称的 UUID + *
  • 4 随机生成的 UUID + *
+ * + * @return 此 {@code UUID} 的版本号 + */ + public int version() + { + // Version is bits masked by 0x000000000000F000 in MS long + return (int) ((mostSigBits >> 12) & 0x0f); + } + + /** + * 与此 {@code UUID} 相关联的变体号。变体号描述 {@code UUID} 的布局。 + *

+ * 变体号具有以下含意: + *

    + *
  • 0 为 NCS 向后兼容保留 + *
  • 2 IETF RFC 4122(Leach-Salz), 用于此类 + *
  • 6 保留,微软向后兼容 + *
  • 7 保留供以后定义使用 + *
+ * + * @return 此 {@code UUID} 相关联的变体号 + */ + public int variant() + { + // This field is composed of a varying number of bits. + // 0 - - Reserved for NCS backward compatibility + // 1 0 - The IETF aka Leach-Salz variant (used by this class) + // 1 1 0 Reserved, Microsoft backward compatibility + // 1 1 1 Reserved for future definition. + return (int) ((leastSigBits >>> (64 - (leastSigBits >>> 62))) & (leastSigBits >> 63)); + } + + /** + * 与此 UUID 相关联的时间戳值。 + * + *

+ * 60 位的时间戳值根据此 {@code UUID} 的 time_low、time_mid 和 time_hi 字段构造。
+ * 所得到的时间戳以 100 毫微秒为单位,从 UTC(通用协调时间) 1582 年 10 月 15 日零时开始。 + * + *

+ * 时间戳值仅在在基于时间的 UUID(其 version 类型为 1)中才有意义。
+ * 如果此 {@code UUID} 不是基于时间的 UUID,则此方法抛出 UnsupportedOperationException。 + * + * @throws UnsupportedOperationException 如果此 {@code UUID} 不是 version 为 1 的 UUID。 + */ + public long timestamp() throws UnsupportedOperationException + { + checkTimeBase(); + return (mostSigBits & 0x0FFFL) << 48// + | ((mostSigBits >> 16) & 0x0FFFFL) << 32// + | mostSigBits >>> 32; + } + + /** + * 与此 UUID 相关联的时钟序列值。 + * + *

+ * 14 位的时钟序列值根据此 UUID 的 clock_seq 字段构造。clock_seq 字段用于保证在基于时间的 UUID 中的时间唯一性。 + *

+ * {@code clockSequence} 值仅在基于时间的 UUID(其 version 类型为 1)中才有意义。 如果此 UUID 不是基于时间的 UUID,则此方法抛出 + * UnsupportedOperationException。 + * + * @return 此 {@code UUID} 的时钟序列 + * + * @throws UnsupportedOperationException 如果此 UUID 的 version 不为 1 + */ + public int clockSequence() throws UnsupportedOperationException + { + checkTimeBase(); + return (int) ((leastSigBits & 0x3FFF000000000000L) >>> 48); + } + + /** + * 与此 UUID 相关的节点值。 + * + *

+ * 48 位的节点值根据此 UUID 的 node 字段构造。此字段旨在用于保存机器的 IEEE 802 地址,该地址用于生成此 UUID 以保证空间唯一性。 + *

+ * 节点值仅在基于时间的 UUID(其 version 类型为 1)中才有意义。
+ * 如果此 UUID 不是基于时间的 UUID,则此方法抛出 UnsupportedOperationException。 + * + * @return 此 {@code UUID} 的节点值 + * + * @throws UnsupportedOperationException 如果此 UUID 的 version 不为 1 + */ + public long node() throws UnsupportedOperationException + { + checkTimeBase(); + return leastSigBits & 0x0000FFFFFFFFFFFFL; + } + + /** + * 返回此{@code UUID} 的字符串表现形式。 + * + *

+ * UUID 的字符串表示形式由此 BNF 描述: + * + *

+     * {@code
+     * UUID                   = ----
+     * time_low               = 4*
+     * time_mid               = 2*
+     * time_high_and_version  = 2*
+     * variant_and_sequence   = 2*
+     * node                   = 6*
+     * hexOctet               = 
+     * hexDigit               = [0-9a-fA-F]
+     * }
+     * 
+ * + * + * + * @return 此{@code UUID} 的字符串表现形式 + * @see #toString(boolean) + */ + @Override + public String toString() + { + return toString(false); + } + + /** + * 返回此{@code UUID} 的字符串表现形式。 + * + *

+ * UUID 的字符串表示形式由此 BNF 描述: + * + *

+     * {@code
+     * UUID                   = ----
+     * time_low               = 4*
+     * time_mid               = 2*
+     * time_high_and_version  = 2*
+     * variant_and_sequence   = 2*
+     * node                   = 6*
+     * hexOctet               = 
+     * hexDigit               = [0-9a-fA-F]
+     * }
+     * 
+ * + * + * + * @param isSimple 是否简单模式,简单模式为不带'-'的UUID字符串 + * @return 此{@code UUID} 的字符串表现形式 + */ + public String toString(boolean isSimple) + { + final StringBuilder builder = new StringBuilder(isSimple ? 32 : 36); + // time_low + builder.append(digits(mostSigBits >> 32, 8)); + if (false == isSimple) + { + builder.append('-'); + } + // time_mid + builder.append(digits(mostSigBits >> 16, 4)); + if (false == isSimple) + { + builder.append('-'); + } + // time_high_and_version + builder.append(digits(mostSigBits, 4)); + if (false == isSimple) + { + builder.append('-'); + } + // variant_and_sequence + builder.append(digits(leastSigBits >> 48, 4)); + if (false == isSimple) + { + builder.append('-'); + } + // node + builder.append(digits(leastSigBits, 12)); + + return builder.toString(); + } + + /** + * 返回此 UUID 的哈希码。 + * + * @return UUID 的哈希码值。 + */ + @Override + public int hashCode() + { + long hilo = mostSigBits ^ leastSigBits; + return ((int) (hilo >> 32)) ^ (int) hilo; + } + + /** + * 将此对象与指定对象比较。 + *

+ * 当且仅当参数不为 {@code null}、而是一个 UUID 对象、具有与此 UUID 相同的 varriant、包含相同的值(每一位均相同)时,结果才为 {@code true}。 + * + * @param obj 要与之比较的对象 + * + * @return 如果对象相同,则返回 {@code true};否则返回 {@code false} + */ + @Override + public boolean equals(Object obj) + { + if ((null == obj) || (obj.getClass() != UUID.class)) + { + return false; + } + UUID id = (UUID) obj; + return (mostSigBits == id.mostSigBits && leastSigBits == id.leastSigBits); + } + + // Comparison Operations + + /** + * 将此 UUID 与指定的 UUID 比较。 + * + *

+ * 如果两个 UUID 不同,且第一个 UUID 的最高有效字段大于第二个 UUID 的对应字段,则第一个 UUID 大于第二个 UUID。 + * + * @param val 与此 UUID 比较的 UUID + * + * @return 在此 UUID 小于、等于或大于 val 时,分别返回 -1、0 或 1。 + * + */ + @Override + public int compareTo(UUID val) + { + // The ordering is intentionally set up so that the UUIDs + // can simply be numerically compared as two numbers + return (this.mostSigBits < val.mostSigBits ? -1 : // + (this.mostSigBits > val.mostSigBits ? 1 : // + (this.leastSigBits < val.leastSigBits ? -1 : // + (this.leastSigBits > val.leastSigBits ? 1 : // + 0)))); + } + + // ------------------------------------------------------------------------------------------------------------------- + // Private method start + /** + * 返回指定数字对应的hex值 + * + * @param val 值 + * @param digits 位 + * @return 值 + */ + private static String digits(long val, int digits) + { + long hi = 1L << (digits * 4); + return Long.toHexString(hi | (val & (hi - 1))).substring(1); + } + + /** + * 检查是否为time-based版本UUID + */ + private void checkTimeBase() + { + if (version() != 1) + { + throw new UnsupportedOperationException("Not a time-based UUID"); + } + } + + /** + * 获取{@link SecureRandom},类提供加密的强随机数生成器 (RNG) + * + * @return {@link SecureRandom} + */ + public static SecureRandom getSecureRandom() + { + try + { + return SecureRandom.getInstance("SHA1PRNG"); + } + catch (NoSuchAlgorithmException e) + { + + throw new UtilException(e); + } + } + + /** + * 获取随机数生成器对象
+ * ThreadLocalRandom是JDK 7之后提供并发产生随机数,能够解决多个线程发生的竞争争夺。 + * + * @return {@link ThreadLocalRandom} + */ + public static ThreadLocalRandom getRandom() + { + return ThreadLocalRandom.current(); + } +} diff --git a/flowable/pom.xml b/flowable/pom.xml new file mode 100644 index 0000000..fa4a79e --- /dev/null +++ b/flowable/pom.xml @@ -0,0 +1,93 @@ + + + + yyy + com.yyy + 1.0-SNAPSHOT + + 4.0.0 + + flowable + + + + com.yyy + framework + 1.0-SNAPSHOT + + + + com.yyy + system + 1.0-SNAPSHOT + + + + com.yyy + common + 1.0-SNAPSHOT + + + + + org.apache.commons + commons-lang3 + + + + + com.alibaba + fastjson + + + + org.projectlombok + lombok + true + + + com.github.xiaoymin + knife4j-spring-boot-starter + + + org.flowable + flowable-spring-boot-starter + + + + org.flowable + flowable-spring-security + + + + + org.flowable + flowable-bpmn-layout + + + org.flowable + flowable-engine + + + + com.baomidou + mybatis-plus-boot-starter + + + + + + + + + + + com.googlecode.aviator + aviator + 5.3.3 + + + + \ No newline at end of file diff --git a/flowable/src/main/java/com/yyy/flowable/common/constant/ProcessConstants.java b/flowable/src/main/java/com/yyy/flowable/common/constant/ProcessConstants.java new file mode 100644 index 0000000..c140031 --- /dev/null +++ b/flowable/src/main/java/com/yyy/flowable/common/constant/ProcessConstants.java @@ -0,0 +1,79 @@ +package com.yyy.flowable.common.constant; + +/** + * 流程常量信息 + */ +public class ProcessConstants { + + /** + * 动态数据 + */ + public static final String DYNAMIC = "dynamic"; + + /** + * 固定任务接收 + */ + public static final String FIXED = "fixed"; + + /** + * 单个审批人 + */ + public static final String ASSIGNEE = "assignee"; + + + /** + * 候选人 + */ + public static final String CANDIDATE_USERS = "candidateUsers"; + + + /** + * 审批组 + */ + public static final String CANDIDATE_GROUPS = "candidateGroups"; + + /** + * 单个审批人 + */ + public static final String PROCESS_APPROVAL = "approval"; + + /** + * 会签人员 + */ + public static final String PROCESS_MULTI_INSTANCE_USER = "userList"; + + /** + * nameapace + */ + public static final String NAMASPASE = "http://flowable.org/bpmn"; + + /** + * 会签节点 + */ + public static final String PROCESS_MULTI_INSTANCE = "multiInstance"; + + /** + * 自定义属性 dataType + */ + public static final String PROCESS_CUSTOM_DATA_TYPE = "dataType"; + + /** + * 自定义属性 userType + */ + public static final String PROCESS_CUSTOM_USER_TYPE = "userType"; + + /** + * 初始化人员 + */ + public static final String PROCESS_INITIATOR = "INITIATOR"; + + public static final String DUE_DATE = "dueDate"; + + + /** + * 流程跳过 + */ + public static final String FLOWABLE_SKIP_EXPRESSION_ENABLED = "_FLOWABLE_SKIP_EXPRESSION_ENABLED"; + + +} diff --git a/flowable/src/main/java/com/yyy/flowable/common/enums/FlowComment.java b/flowable/src/main/java/com/yyy/flowable/common/enums/FlowComment.java new file mode 100644 index 0000000..bba1392 --- /dev/null +++ b/flowable/src/main/java/com/yyy/flowable/common/enums/FlowComment.java @@ -0,0 +1,40 @@ +package com.yyy.flowable.common.enums; + +/** + * 流程意见类型 + */ +public enum FlowComment { + + /** + * 说明 + */ + NORMAL("1", "正常意见"), + REBACK("2", "退回意见"), + REJECT("3", "驳回意见"), + DELEGATE("4", "委派意见"), + ASSIGN("5", "转办意见"), + STOP("6", "终止流程"); + + /** + * 类型 + */ + private final String type; + + /** + * 说明 + */ + private final String remark; + + FlowComment(String type, String remark) { + this.type = type; + this.remark = remark; + } + + public String getType() { + return type; + } + + public String getRemark() { + return remark; + } +} diff --git a/flowable/src/main/java/com/yyy/flowable/config/FlowableConfig.java b/flowable/src/main/java/com/yyy/flowable/config/FlowableConfig.java new file mode 100644 index 0000000..2f0c43e --- /dev/null +++ b/flowable/src/main/java/com/yyy/flowable/config/FlowableConfig.java @@ -0,0 +1,30 @@ +package com.yyy.flowable.config; + +import org.flowable.engine.impl.db.DbIdGenerator; +import org.flowable.spring.SpringProcessEngineConfiguration; +import org.flowable.spring.boot.EngineConfigurationConfigurer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.task.AsyncListenableTaskExecutor; +import org.springframework.core.task.SimpleAsyncTaskExecutor; + +/** + * Flowable配置信息 + */ +@Configuration +public class FlowableConfig implements EngineConfigurationConfigurer { + + @Bean + public AsyncListenableTaskExecutor applicationTaskExecutor() { + return new SimpleAsyncTaskExecutor(); + } + + @Override + public void configure(SpringProcessEngineConfiguration engineConfiguration) { + engineConfiguration.setActivityFontName("宋体"); + engineConfiguration.setLabelFontName("宋体"); + engineConfiguration.setAnnotationFontName("宋体"); + engineConfiguration.setIdGenerator(new DbIdGenerator()); + } + +} diff --git a/flowable/src/main/java/com/yyy/flowable/config/MyDefaultProcessDiagramCanvas.java b/flowable/src/main/java/com/yyy/flowable/config/MyDefaultProcessDiagramCanvas.java new file mode 100644 index 0000000..5973d87 --- /dev/null +++ b/flowable/src/main/java/com/yyy/flowable/config/MyDefaultProcessDiagramCanvas.java @@ -0,0 +1,95 @@ +package com.yyy.flowable.config;//package com.ruoyi.flowable.config; +// +//import com.sun.prism.paint.Color; +//import org.flowable.bpmn.model.AssociationDirection; +//import org.flowable.image.impl.DefaultProcessDiagramCanvas; +// +//import java.awt.*; +//import java.awt.geom.Line2D; +//import java.awt.geom.RoundRectangle2D; +// +///** +// * @author Tony +// * @date 2021-04-03 +// */ +//public class MyDefaultProcessDiagramCanvas extends DefaultProcessDiagramCanvas { +// //设置高亮线的颜色 这里我设置成绿色 +// protected static Color HIGHLIGHT_SEQUENCEFLOW_COLOR = Color.GREEN; +// +// public MyDefaultProcessDiagramCanvas(int width, int height, int minX, int minY, String imageType, String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader) { +// super(width, height, minX, minY, imageType, activityFontName, labelFontName, annotationFontName, customClassLoader); +// } +// +// public MyDefaultProcessDiagramCanvas(int width, int height, int minX, int minY, String imageType) { +// super(width, height, minX, minY, imageType); +// } +// +// +// /** +// * 画线颜色设置 +// */ +// @Override +// public void drawConnection(int[] xPoints, int[] yPoints, boolean conditional, boolean isDefault, String connectionType, +// AssociationDirection associationDirection, boolean highLighted, double scaleFactor) { +// +// Paint originalPaint = g.getPaint(); +// Stroke originalStroke = g.getStroke(); +// +// g.setPaint(CONNECTION_COLOR); +// if (connectionType.equals("association")) { +// g.setStroke(ASSOCIATION_STROKE); +// } else if (highLighted) { +// //设置线的颜色 +// g.setPaint(originalPaint); +// g.setStroke(HIGHLIGHT_FLOW_STROKE); +// } +// +// for (int i = 1; i < xPoints.length; i++) { +// Integer sourceX = xPoints[i - 1]; +// Integer sourceY = yPoints[i - 1]; +// Integer targetX = xPoints[i]; +// Integer targetY = yPoints[i]; +// Line2D.Double line = new Line2D.Double(sourceX, sourceY, targetX, targetY); +// g.draw(line); +// } +// +// if (isDefault) { +// Line2D.Double line = new Line2D.Double(xPoints[0], yPoints[0], xPoints[1], yPoints[1]); +// drawDefaultSequenceFlowIndicator(line, scaleFactor); +// } +// +// if (conditional) { +// Line2D.Double line = new Line2D.Double(xPoints[0], yPoints[0], xPoints[1], yPoints[1]); +// drawConditionalSequenceFlowIndicator(line, scaleFactor); +// } +// +// if (associationDirection == AssociationDirection.ONE || associationDirection == AssociationDirection.BOTH) { +// Line2D.Double line = new Line2D.Double(xPoints[xPoints.length - 2], yPoints[xPoints.length - 2], xPoints[xPoints.length - 1], yPoints[xPoints.length - 1]); +// drawArrowHead(line, scaleFactor); +// } +// if (associationDirection == AssociationDirection.BOTH) { +// Line2D.Double line = new Line2D.Double(xPoints[1], yPoints[1], xPoints[0], yPoints[0]); +// drawArrowHead(line, scaleFactor); +// } +// g.setPaint(originalPaint); +// g.setStroke(originalStroke); +// } +// +// /** +// * 高亮节点设置 +// */ +// @Override +// public void drawHighLight(int x, int y, int width, int height) { +// Paint originalPaint = g.getPaint(); +// Stroke originalStroke = g.getStroke(); +// //设置高亮节点的颜色 +// g.setPaint(HIGHLIGHT_COLOR); +// g.setStroke(THICK_TASK_BORDER_STROKE); +// +// RoundRectangle2D rect = new RoundRectangle2D.Double(x, y, width, height, 20, 20); +// g.draw(rect); +// +// g.setPaint(originalPaint); +// g.setStroke(originalStroke); +// } +//} diff --git a/flowable/src/main/java/com/yyy/flowable/controller/EamHomeController.java b/flowable/src/main/java/com/yyy/flowable/controller/EamHomeController.java new file mode 100644 index 0000000..9c24190 --- /dev/null +++ b/flowable/src/main/java/com/yyy/flowable/controller/EamHomeController.java @@ -0,0 +1,61 @@ +package com.yyy.flowable.controller; + + +import com.yyy.common.core.controller.BaseController; +import com.yyy.common.core.domain.Result; +import com.yyy.flowable.service.IFlowTaskService; +import com.yyy.system.entity.dto.SysConfigDto; +import com.yyy.system.entity.pojo.SysConfig; +import com.yyy.system.entity.vo.EamBigScreenVo; +import com.yyy.system.entity.vo.EamHomeVo; +import com.yyy.system.service.EamAssetService; +import com.yyy.system.service.FlFormItemService; +import com.yyy.system.service.SysConfigService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + + +@RestController +@Api(tags = "首页接口") +@RequestMapping("api/home") +public class EamHomeController extends BaseController { + + private static final Logger logger = LoggerFactory.getLogger(EamHomeController.class); + + @Autowired + private EamAssetService assetService; + + @Autowired + private IFlowTaskService flowTaskService; + + @Autowired + private SysConfigService configService; + + @Autowired + private FlFormItemService flFormItemService; + + @PostMapping("/data") + @ApiOperation(value = "查询首页数据", notes = "v2.0 完善了待我处理流程数量的数据") + public Result data() { + + EamHomeVo homeData = assetService.homeData(); + homeData.setTodo(flowTaskService.todoListCount()); + return success(homeData); + } + + @PostMapping("/bigScreen") + @ApiOperation(value = "大屏展示") + public Result bigScreen() { + EamBigScreenVo eamBigScreenVo = new EamBigScreenVo(); + SysConfig sysConfig = configService.query(SysConfigDto.builder().configKey("big_screen_slogan").build()).get(0); + eamBigScreenVo.setSlogan(sysConfig != null ? sysConfig.getConfigValue() : "欢迎领导莅临指导"); + assetService.bigScreenData(eamBigScreenVo); + flFormItemService.bigScreenData(eamBigScreenVo); + return success(eamBigScreenVo); + } +} + diff --git a/flowable/src/main/java/com/yyy/flowable/controller/FlDeviceController.java b/flowable/src/main/java/com/yyy/flowable/controller/FlDeviceController.java new file mode 100644 index 0000000..bb4960b --- /dev/null +++ b/flowable/src/main/java/com/yyy/flowable/controller/FlDeviceController.java @@ -0,0 +1,232 @@ +package com.yyy.flowable.controller; + +import com.alibaba.fastjson.JSONObject; +import com.yyy.common.core.controller.BaseController; +import com.yyy.common.core.domain.Result; +import com.yyy.common.core.page.TableDataInfo; +import com.yyy.common.enums.FieldDataTypeEnum; +import com.yyy.common.enums.PlanTypeEnum; +import com.yyy.common.form.FieldData; +import com.yyy.common.utils.common.DateUtils; +import com.yyy.common.utils.common.StringUtils; +import com.yyy.flowable.common.constant.ProcessConstants; +import com.yyy.flowable.service.IFlowDefinitionService; +import com.yyy.system.entity.bo.JobDefect; +import com.yyy.system.entity.dto.*; +import com.yyy.system.entity.pojo.FlForm; +import com.yyy.system.entity.pojo.FlFormItem; +import com.yyy.system.entity.pojo.SysFormTemp; +import com.yyy.system.entity.vo.DeviceJobVo; +import com.yyy.system.service.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.*; +import java.util.stream.Collectors; + +@RestController +@Api(tags = "维修、巡检、保养、盘点任务相关接口") +@RequestMapping("api/v2/flowable/device") +public class FlDeviceController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(FlDeviceController.class); + + @Resource + private FlFormItemService flFormItemService; + @Resource + private FlFormService flFormService; + @Autowired + private IFlowDefinitionService flowDefinitionService; + @Resource + private EamAssetService eamAssetService; + @Resource + private WordExportService wordExportService; + @Resource + private SysFormTempService sysFormTempService; + + private static final Long Default_Repair_FormTempId = 1L; + + /** + * 查询分页数据 + */ + @PostMapping("/list") + @ApiOperation(value = "查询分页数据") + public TableDataInfo list(@RequestBody DeviceJobQueryDto dto) { + startPage(); + List list = flFormItemService.query(FlFormItemDto.builder().formKey(dto.getJobType().getCode()).status(dto.getStatus() != null ? dto.getStatus().getCode() : null).name(dto.getName()).createType(dto.getCreateType()).build()); + return getDataTable(DeviceJobVo.ToVo(list)); + } + + @PostMapping("/all") + @ApiOperation(value = "查询所有") + public Result> all() { + List list = flFormItemService.query(FlFormItemDto.builder().build()); + return success(DeviceJobVo.ToVo(list)); + } + + @ApiOperation(value = "发起流程") + @PostMapping("/start") + public Result start(@RequestBody DeviceJobDto dto) { + FlForm flForm = flFormService.selectByKey(dto.getJobType().getCode()); + if (Objects.isNull(flForm)) { + return error("表单标识信息错误"); + } + FlowProcDefDto flowProcDefDto = flowDefinitionService.getByDeployId(flForm.getDeployId()); + if (Objects.isNull(flowProcDefDto)) { + return error(dto.getJobType().getInfo() + "流程未部署"); + } + if (StringUtils.isBlank(dto.getBusinessId())){ + dto.setBusinessId(dto.getJobType().getBusinessId()); + } + JSONObject variables = JSONObject.parseObject(flForm.getConfig()); + if (dto.getFormTempId() != null) { + SysFormTemp formTemp = sysFormTempService.getById(dto.getFormTempId()); + List _formValue = JSONObject.parseArray(formTemp.getFormValue(), FieldData.class); + List defects = JobDefect.toDefectList(eamAssetService.listByIds(dto.getAssetIdList().stream().map(EamWarehouseAssetDto::getAssetId).distinct().collect(Collectors.toList())), _formValue); + variables.put("defects", defects); + variables.put("formTempId", formTemp.getFormTempId()); + variables.put("formName", formTemp.getFormName()); + } + //超期限制 设置截止时间 + if (dto.getDuration() > 0 && dto.isLimit()) { + variables.put(ProcessConstants.DUE_DATE, DateUtils.addDays(new Date(), dto.getDuration())); + } else { + variables.put(ProcessConstants.DUE_DATE, null); + } + variables.put("createType", "手动创建"); + JSONObject.parseObject(JSONObject.toJSONString(dto)).forEach(variables::put); + return flowDefinitionService.startProcessInstanceById(flowProcDefDto.getId(), variables); + } + + @ApiOperation(value = "发起报修流程") + @PostMapping("/start/repair") + public Result startRepair(@RequestBody DeviceJobRepairDto dto) { + FlForm flForm = flFormService.selectByKey(PlanTypeEnum.repair.getCode()); + if (Objects.isNull(flForm)) { + return error("表单标识信息错误"); + } + FlowProcDefDto flowProcDefDto = flowDefinitionService.getByDeployId(flForm.getDeployId()); + if (Objects.isNull(flowProcDefDto)) { + return error(PlanTypeEnum.repair.getInfo() + "流程未部署"); + } + JSONObject variables = JSONObject.parseObject(flForm.getConfig()); + + // 默认维修表单 + SysFormTemp formTemp = sysFormTempService.getById(dto.getFormTempId() == null ? Default_Repair_FormTempId : dto.getFormTempId()); + List _formValue = JSONObject.parseArray(formTemp.getFormValue(), FieldData.class); + List defects = JobDefect.toDefectList(eamAssetService.listByIds(dto.getAssetIdList().stream().map(EamWarehouseAssetDto::getAssetId).distinct().collect(Collectors.toList())), _formValue); + variables.put("defects", defects); + variables.put("formTempId", formTemp.getFormTempId()); + variables.put("formName", formTemp.getFormName()); + + //超期限制 设置截止时间 + if (dto.getDuration() > 0 && dto.isLimit()) { + variables.put(ProcessConstants.DUE_DATE, DateUtils.addDays(new Date(), dto.getDuration())); + } else { + variables.put(ProcessConstants.DUE_DATE, null); + } + + variables.put("createType", "手动创建"); + JSONObject.parseObject(JSONObject.toJSONString(dto)).forEach(variables::put); + return flowDefinitionService.startProcessInstanceById(flowProcDefDto.getId(), variables); + } + + @ApiOperation(value = "更新修改流程内容", notes = "提交执行维修时就直接调用减库存接口 确保数据库一致性") + @PostMapping("/update/{id}") + public Result update(@ApiParam(value = "id") @PathVariable(value = "id") Long id, + @ApiParam(value = "变量集合,json对象") @RequestBody JSONObject variables) { + FlFormItem flFormItem = flFormItemService.getById(id); + if (flFormItem == null || variables == null || variables.isEmpty() || !variables.containsKey("variables")) { + logger.error(variables.toJSONString()); + return error("未找到对应的流程项"); + } + + JSONObject config = JSONObject.parseObject(flFormItem.getContents()); + // 将传入的变量集合合并到现有的 config 中 + JSONObject variablesJson = variables.getJSONObject("variables"); + config.putAll(variablesJson); + + flFormItem.setContents(config.toJSONString()); + return toResult(flFormItemService.updateById(flFormItem)); + } + + @PostMapping("/export/{jobId}") + @ApiOperation(value = "导出报表") + public void export(@ApiParam(value = "jobId") @PathVariable(value = "jobId") Long jobId, HttpServletResponse resp, HttpServletRequest req) { + + FlFormItem flFormItem = flFormItemService.getById(jobId); + if (flFormItem == null) { + logger.error("未找到对应的流程项,jobId:" + jobId); + return; + } + JSONObject contents = JSONObject.parseObject(flFormItem.getContents()); + if (!contents.containsKey("formTempId")) { + logger.error("表单模板信息缺失,jobId:" + jobId); + return; + } + if (!contents.containsKey("defects")) { + logger.error("未找到对应的检查项目信息,jobId:" + jobId); + return; + } + SysFormTemp formTemp = sysFormTempService.getById((contents.getString("formTempId"))); + List defects = JSONObject.parseArray(contents.getString("defects"), JobDefect.class); + if (defects == null || defects.size() == 0) { + return; + } else if (defects.size() == 1) { + // 维修审批意见导出到模板 + if (flFormItem.getFormKey().equals(PlanTypeEnum.repair.getCode())) { + if (StringUtils.isNotBlank(defects.get(0).getOpinion())) { + defects.get(0).get_formValue().add(new FieldData("userOpinion", "使用部门意见", defects.get(0).getOpinion(), FieldDataTypeEnum.STRING, 0, null)); + } + } + + wordExportService.generateCharts( + formTemp.getTemplatePath(), + contents.containsKey("name") ? contents.getString("name") : formTemp.getFormName(), + formTemp.getFormKey(), + formTemp.getFormName(), + defects.get(0).get_formValue(), + resp + ); + } else { + Map> map = new HashMap<>(); + defects.forEach(defect -> { + if (flFormItem.getFormKey().equals(PlanTypeEnum.repair.getCode())) { + if (StringUtils.isNotBlank(defect.getOpinion())) { + defect.get_formValue().add(new FieldData("userOpinion", "使用部门意见", defect.getOpinion(), FieldDataTypeEnum.STRING, 0, null)); + } + } + map.put(defect.getAssetCode(), defect.get_formValue()); + } + ); + wordExportService.generateChartMap( + formTemp.getTemplatePath(), + contents.containsKey("name") ? contents.getString("name") : formTemp.getFormName(), + formTemp.getFormKey(), + map, + resp + ); + } + } + + @PostMapping("/check/{formTempId}") + @ApiOperation(value = "检查项", notes = "表单模板id + defects中对应的_formValue中的内容") + public void check(@ApiParam(value = "jobId") @PathVariable(value = "formTempId") Long formTempId, @ApiParam(value = "变量集合,json对象") @RequestBody JSONObject _formValue, HttpServletResponse resp, HttpServletRequest req) { + SysFormTemp formTemp = sysFormTempService.getById(formTempId); + wordExportService.generateCharts( + formTemp.getTemplatePath(), + formTemp.getFormName(), + formTemp.getFormKey(), + formTemp.getFormName(), + JSONObject.parseArray(_formValue.toJSONString(), FieldData.class), + resp + ); + } +} diff --git a/flowable/src/main/java/com/yyy/flowable/controller/FlFormController.java b/flowable/src/main/java/com/yyy/flowable/controller/FlFormController.java new file mode 100644 index 0000000..2610303 --- /dev/null +++ b/flowable/src/main/java/com/yyy/flowable/controller/FlFormController.java @@ -0,0 +1,136 @@ +package com.yyy.flowable.controller; + + +import com.alibaba.fastjson.JSONObject; +import com.yyy.common.core.controller.BaseController; +import com.yyy.common.core.domain.Result; +import com.yyy.common.core.page.TableDataInfo; +import com.yyy.common.utils.bean.BeanUtils; +import com.yyy.common.utils.common.CacheUtils; +import com.yyy.system.entity.pojo.FlForm; +import com.yyy.system.entity.dto.FlFormDto; +import com.yyy.system.entity.vo.FlFormVo; +import com.yyy.system.service.FlFormService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 流程表单对象(fl_form)表控制层 + * + * @author Fangy + * @since 2024-04-24 10:55:58 + */ +@RestController +@Api(tags = "流程表单模板相关接口") +@RequestMapping("api/flForm") +public class FlFormController extends BaseController { + + private static final Logger logger = LoggerFactory.getLogger(FlFormController.class); + + /** + * 服务对象 + */ + @Resource + private FlFormService flFormService; + + /** + * 查询分页数据 + */ + @PostMapping("/list") + @ApiOperation(value = "查询分页数据") + public TableDataInfo list(@RequestBody FlFormDto flFormDto) { + startPage(); + List list = flFormService.query(flFormDto); + return getDataTable(FlFormVo.ToVo(list)); + } + + /** + * 查询所有 + */ + @PostMapping("/all") + @ApiOperation(value = "查询所有数据") + public Result all() { + return success(FlFormVo.ToVo(flFormService.query(new FlFormDto()))); + } + +// /** +// * 设置审批人 +// */ +// @PostMapping("/assignee") +// @ApiOperation(value = "设置审批人") +// public Result assignee(@RequestParam Long formId, @RequestParam Long userId) { +// FlForm flForm = flFormService.getById(formId); +// JSONObject config = JSONObject.parseObject(flForm.getConfig()); +// config.put("assignee",userId); +// flForm.setConfig(config.toJSONString()); +// flForm.setUpdateUser(getUserId()); +// return flFormService.updateById(flForm) ? success() : error(); +// } + + + /** + * 查询详情数据 + */ + @PostMapping("/query") + @ApiOperation(value = "查询详情数据") + public Result query(@RequestParam Long id) { + return success(FlFormVo.ToVo(flFormService.getById(id))); + } + +// /** +// * 新增数据 +// */ +// @PostMapping("/add") +// @ApiOperation(value = "新增数据(开发环境使用)") +// public Result add(@Validated @RequestBody FlFormDto flFormDto) { +// FlForm flForm = new FlForm(); +// BeanUtils.copyProperties(flFormDto, flForm); +// flForm.setCreateUser(getUserId()); +// +// JSONObject config = new JSONObject(); +//// config.put("assignee",1); +// config.put("checkRequire",flFormDto.isCheckRequire()); +// config.put("autoAssign",flFormDto.getAutoAssign()); +// config.put("nodes", flFormDto.getNodes()); +// return flFormService.save(flForm) ? success() : error(); +// } + + /** + * 修改数据 + */ + @PostMapping("/update") + @ApiOperation(value = "修改数据") + public Result update(@Validated @RequestBody FlFormDto flFormDto) { + FlForm flForm = new FlForm(); + BeanUtils.copyProperties(flFormDto, flForm); + flForm.setUpdateUser(getUserId()); + + JSONObject config = new JSONObject(); + config.put("checkRequire", flFormDto.isCheckRequire()); + config.put("autoAssign", flFormDto.getAutoAssign()); + config.put("nodes", flFormDto.getNodes()); + flForm.setConfig(config.toJSONString()); + //更新缓存 + CacheUtils.put("form_config", flFormDto.getFormKey(), flForm.getConfig()); + + return flFormService.updateById(flForm) ? success() : error(); + } + + +// /** +// * 删除数据 +// */ +// @PostMapping("/delete") +// @ApiOperation(value = "删除数据(开发环境使用)") +// public Result delete(@RequestBody List idList) { +// return flFormService.removeBatchByIds(idList) ? success() : error(); +// } +} + diff --git a/flowable/src/main/java/com/yyy/flowable/controller/FlFormItemController.java b/flowable/src/main/java/com/yyy/flowable/controller/FlFormItemController.java new file mode 100644 index 0000000..3922398 --- /dev/null +++ b/flowable/src/main/java/com/yyy/flowable/controller/FlFormItemController.java @@ -0,0 +1,155 @@ +package com.yyy.flowable.controller; + + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.yyy.common.core.controller.BaseController; +import com.yyy.common.core.domain.Result; +import com.yyy.common.core.page.TableDataInfo; +import com.yyy.common.utils.common.DateUtils; +import com.yyy.common.utils.file.ImageUtils; +import com.yyy.common.utils.poi.FormExportUtils; +import com.yyy.flowable.service.IFlowTaskService; +import com.yyy.system.entity.dto.*; +import com.yyy.system.entity.pojo.FlFormItem; +import com.yyy.system.entity.pojo.SysConfig; +import com.yyy.system.entity.vo.FlFormItemCalendarVo; +import com.yyy.system.entity.vo.FlFormItemVo; +import com.yyy.system.entity.vo.ProcessHomePageVo; +import com.yyy.system.entity.vo.WorkReportVo; +import com.yyy.system.service.FlFormItemService; +import com.yyy.system.service.SysConfigService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiOperation; +import org.flowable.task.api.Task; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.Assert; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.BufferedReader; +import java.io.File; +import java.io.IOException; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import java.text.ParseException; +import java.util.List; + +/** + * 流程实例对象(fl_form_item)表控制层 + * + * @author Fangy + * @since 2024-04-30 12:17:53 + */ +@RestController +@Api(tags = "流程实例对象相关接口") +@RequestMapping("api/flFormItem") +public class FlFormItemController extends BaseController { + + private static final Logger logger = LoggerFactory.getLogger(FlFormItemController.class); + /** + * 服务对象 + */ + @Resource + private FlFormItemService flFormItemService; + + @Autowired + private IFlowTaskService flowTaskService; + + @Resource + private SysConfigService sysConfigService; + + /** + * 查询分页数据 + */ + @PostMapping("/list") + @ApiOperation(value = "查询分页数据") + public TableDataInfo list(@RequestBody FlFormItemDto flFormItemDto) { + startPage(); + List list = flFormItemService.query(flFormItemDto); + return getDataTable(FlFormItemVo.ToVo(list)); + } + + /** + * 查询详情数据 + */ + @PostMapping("/query") + @ApiOperation(value = "查询详情数据") + public Result query(@RequestParam Long id) { + return success(FlFormItemVo.ToVo(flFormItemService.getById(id))); + } + + @PostMapping("/all") + @ApiOperation(value = "所有数据", notes = "没有创建方式的选项") + public Result all(@RequestBody FlFormItemDto flFormItemDto) { + return success(FlFormItemVo.ToVo(flFormItemService.query(flFormItemDto))); + } + + @PostMapping("/home") + @ApiOperation(value = "流程首页统计") + public Result> home() { + return flowTaskService.homePage(); + } + + + @PostMapping("/calendar") + @ApiOperation(value = "任务日历") + public Result> calendar(@RequestBody FlFormItemCalendarDto dto) throws ParseException { + return success(FlFormItemCalendarVo.ToVo(flFormItemService.calendar(dto))); + } + + @PostMapping("/workReport") + @ApiOperation(value = "工作报表 查询 (先选择报告类型,根据报告类型选择开始时间和截止时间)") + public Result workReport(@Validated @RequestBody WorkReportQueryDto dto) { + return success(flFormItemService.report(dto)); + } + + @PostMapping("/h52word") + @ApiOperation(value = "工作报表 上传html文件 下载word") + public void h52word(@RequestBody MultipartFile file, HttpServletRequest request, HttpServletResponse response) { + if (file.isEmpty()) { + throw new IllegalArgumentException(""); + } + String content; + try { + StringBuilder stringBuilder = new StringBuilder(); + try (BufferedReader reader = new BufferedReader( + new InputStreamReader(file.getInputStream(), StandardCharsets.UTF_8))) { + String line; + while ((line = reader.readLine()) != null) { + stringBuilder.append(line).append("\n"); + } + } + content = stringBuilder.toString(); + } catch (IOException e) { + throw new RuntimeException("读取文件内容失败", e); + } + if (content != null && !"".equals(content)) { + flFormItemService.h52word(content, "工作报表", request, response); + } + } + + @PostMapping("/h5str2word") + @ApiOperation(value = "工作报表 上传html字符串 下载word") + public void h52word(@RequestBody String content, HttpServletRequest request, HttpServletResponse response) { + flFormItemService.h52word(content, "工作报表", request, response); + } + + @PostMapping("/downloadWord") + @ApiOperation(value = "下载工作报表") + public void downloadWord(@RequestBody WorkReportGenerateDto dto, HttpServletResponse response) { + SysConfig config = sysConfigService.getOne(new QueryWrapper().eq("config_key", "work_report_template_path")); + Assert.notNull(config.getConfigValue(), "工作报表配置信息错误"); + File tempFile = new File(config.getConfigValue()); + Assert.isTrue(tempFile.exists(), "工作报表模板文件不存在"); + FormExportUtils formExportUtils = new FormExportUtils(WorkReportGenerateDto.class); + formExportUtils.exportWord(tempFile, dto,response, "工作报表"); + } +} + diff --git a/flowable/src/main/java/com/yyy/flowable/controller/FlowDefinitionController.java b/flowable/src/main/java/com/yyy/flowable/controller/FlowDefinitionController.java new file mode 100644 index 0000000..c0a1a95 --- /dev/null +++ b/flowable/src/main/java/com/yyy/flowable/controller/FlowDefinitionController.java @@ -0,0 +1,202 @@ +package com.yyy.flowable.controller; + +import com.yyy.common.core.controller.BaseController; +import com.yyy.common.core.domain.Result; +import com.yyy.flowable.domain.dto.FlowSaveXmlVo; +import com.yyy.flowable.service.IFlowDefinitionService; +import com.yyy.system.entity.dto.FlowProcDefDto; +import com.yyy.system.entity.pojo.FlForm; +import com.yyy.system.service.FlFormService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.imageio.ImageIO; +import javax.servlet.http.HttpServletResponse; +import java.awt.image.BufferedImage; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.charset.StandardCharsets; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + *

+ * 工作流程定义 + *

+ */ +@Slf4j +@Api(tags = "flowable-流程定义") +@RestController +@RequestMapping("/api/flowable/definition") +public class FlowDefinitionController extends BaseController { + + @Autowired + private IFlowDefinitionService flowDefinitionService; + + @Autowired + private FlFormService flFormService; + + @GetMapping(value = "/list") + @ApiOperation(value = "流程定义列表", response = FlowProcDefDto.class) + public Result> list(@ApiParam(value = "当前页码", required = true) @RequestParam Integer pageNum, + @ApiParam(value = "每页条数", required = true) @RequestParam Integer pageSize, + @ApiParam(value = "流程名称", required = false) @RequestParam(required = false) String name) { + return success(flowDefinitionService.list(name, pageNum, pageSize)); + } + + @ApiOperation(value = "导入流程文件", notes = "上传bpmn20的xml文件") + @PostMapping("/import") + public Result importFile(@RequestParam String form_key, MultipartFile file) { + InputStream in = null; + try { + in = file.getInputStream(); + FlForm flForm = flFormService.selectByKey(form_key); + if (Objects.isNull(flForm)){ + return error("表单标识信息错误"); + } + String deployId = flowDefinitionService.importFile(flForm.getName(), form_key, in); + flForm.setDeployId(deployId); + flFormService.updateById(flForm); + } catch (Exception e) { + log.error("导入失败:", e); + return error(e.getMessage()); + } finally { + try { + if (in != null) { + in.close(); + } + } catch (IOException e) { + log.error("关闭输入流出错", e); + } + } + + return success("导入成功"); + } + + @ApiOperation(value = "读取xml文件") + @GetMapping("/readXml/{form_key}") + public Result readXml(@ApiParam(value = "表单标识") @PathVariable(value = "form_key") String form_key) { + try { + FlForm flForm = flFormService.selectByKey(form_key); + if (Objects.isNull(flForm)){ + return error("表单标识信息错误"); + } + return flowDefinitionService.readXml(flForm.getDeployId()); + } catch (Exception e) { + return error("加载xml文件异常"); + } + + } + + @ApiOperation(value = "读取图片文件") + @GetMapping("/readImage/{form_key}") + public void readImage(@ApiParam(value = "表单标识") @PathVariable(value = "form_key") String form_key, HttpServletResponse response) { + OutputStream os = null; + BufferedImage image = null; + FlForm flForm = flFormService.selectByKey(form_key); + try { + if (Objects.isNull(flForm)){ + log.error("表单标识信息错误"); + os.close(); + return ; + } + image = ImageIO.read(flowDefinitionService.readImage(flFormService.selectByKey(form_key).getDeployId())); + response.setContentType("image/png"); + os = response.getOutputStream(); + if (image != null) { + ImageIO.write(image, "png", os); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (os != null) { + os.flush(); + os.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + + } + + + @ApiOperation(value = "保存流程设计器内的xml文件") + @PostMapping("/save") + public Result save(@RequestBody FlowSaveXmlVo vo) { + InputStream in = null; + try { +// in = new ByteArrayInputStream(vo.getXml().getBytes(StandardCharsets.UTF_8)); +// flowDefinitionService.importFile(vo.getName(), vo.getCategory(), in); + FlForm flForm = flFormService.selectByKey(vo.getCategory()); + if (Objects.isNull(flForm)){ + return error("流程分类信息错误"); + } + String deployId = flowDefinitionService.importFile(flForm.getName(), vo.getCategory(), in); + flForm.setDeployId(deployId); + flFormService.updateById(flForm); + } catch (Exception e) { + log.error("导入失败:", e); + return error(e.getMessage()); + } finally { + try { + if (in != null) { + in.close(); + } + } catch (IOException e) { + log.error("关闭输入流出错", e); + } + } + + return success("导入成功"); + } + + + @ApiOperation(value = "发起流程") + @PostMapping("/start/{form_key}") + public Result start(@ApiParam(value = "表单标识") @PathVariable(value = "form_key") String form_key, + @ApiParam(value = "变量集合,json对象") @RequestBody Map variables) { + FlForm flForm = flFormService.selectByKey(form_key); + if (Objects.isNull(flForm)){ + return error("表单标识信息错误"); + } + + FlowProcDefDto flowProcDefDto = flowDefinitionService.getByDeployId(flForm.getDeployId()); + if (Objects.isNull(flowProcDefDto)){ + return error(form_key+"流程未部署"); + } + + return flowDefinitionService.startProcessInstanceById(flowProcDefDto.getId(), variables); + + } + + @ApiOperation(value = "激活或挂起流程定义") + @PutMapping(value = "/updateState") + public Result updateState(@ApiParam(value = "1:激活,2:挂起", required = true) @RequestParam Integer state, + @ApiParam(value = "表单标识", required = true) @RequestParam String form_key) { + FlForm flForm = flFormService.selectByKey(form_key); + if (Objects.isNull(flForm)){ + return error("表单标识信息错误"); + } + flowDefinitionService.updateState(state, flForm.getDeployId()); + return success(); + } + + @ApiOperation(value = "删除流程") + @DeleteMapping(value = "/{deployIds}") + public Result delete(@PathVariable String[] deployIds) { + for (String deployId : deployIds) { + flowDefinitionService.delete(deployId); + } + return success(); + } +} diff --git a/flowable/src/main/java/com/yyy/flowable/controller/FlowInstanceController.java b/flowable/src/main/java/com/yyy/flowable/controller/FlowInstanceController.java new file mode 100644 index 0000000..061ef44 --- /dev/null +++ b/flowable/src/main/java/com/yyy/flowable/controller/FlowInstanceController.java @@ -0,0 +1,77 @@ +package com.yyy.flowable.controller; + + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.yyy.common.core.controller.BaseController; +import com.yyy.common.core.domain.Result; +import com.yyy.common.enums.FlowStatus; +import com.yyy.flowable.domain.vo.FlowTaskVo; +import com.yyy.flowable.service.IFlowInstanceService; +import com.yyy.system.entity.dto.FlFormItemDto; +import com.yyy.system.entity.pojo.FlFormItem; +import com.yyy.system.service.FlFormItemService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; + +/** + *

工作流流程实例管理

+ */ +@Slf4j +@Api(tags = "flowable-实例管理") +@RestController +@RequestMapping("/api/flowable/instance") +public class FlowInstanceController extends BaseController { + + @Autowired + private IFlowInstanceService flowInstanceService; + + @Autowired + private FlFormItemService flFormItemService; + + @ApiOperation(value = "根据流程定义id启动流程实例") + @PostMapping("/startBy/{procDefId}") + public Result startById(@ApiParam(value = "流程定义id") @PathVariable(value = "procDefId") String procDefId, + @ApiParam(value = "变量集合,json对象") @RequestBody Map variables) { + return flowInstanceService.startProcessInstanceById(procDefId, variables); + } + + + @ApiOperation(value = "激活或挂起流程实例") + @PostMapping(value = "/updateState") + public Result updateState(@ApiParam(value = "1:激活,2:挂起", required = true) @RequestParam Integer state, + @ApiParam(value = "流程实例ID", required = true) @RequestParam String instanceId) { + flowInstanceService.updateState(state, instanceId); + if (state == 2) { + flFormItemService.update(FlFormItemDto.builder().procInsId(instanceId).status(FlowStatus.SUSPENDED.getCode()).build()); + } else if (state == 1) { + flFormItemService.update(FlFormItemDto.builder().procInsId(instanceId).status(FlowStatus.APPROVAL.getCode()).build()); + } + return success(); + } + + @ApiOperation("结束流程实例") + @PostMapping(value = "/stopProcessInstance") + public Result stopProcessInstance(@RequestBody FlowTaskVo flowTaskVo) { + flowInstanceService.stopProcessInstance(flowTaskVo); + return success(); + } + + @ApiOperation(value = "删除流程实例", notes = "删除 {instanceId,deleteReason}") + @DeleteMapping(value = "/delete/{instanceIds}") + public Result delete(@ApiParam(value = "流程实例ID", required = true) @PathVariable String[] instanceIds, + @ApiParam(value = "删除原因") @RequestParam(required = false) String deleteReason) { + for (String instanceId : instanceIds) { + flowInstanceService.delete(instanceId, deleteReason); + } + if (instanceIds.length > 0){ + flFormItemService.remove(new QueryWrapper().in("proc_ins_id", instanceIds)); + } + return success(); + } +} \ No newline at end of file diff --git a/flowable/src/main/java/com/yyy/flowable/controller/FlowTaskController.java b/flowable/src/main/java/com/yyy/flowable/controller/FlowTaskController.java new file mode 100644 index 0000000..f088a98 --- /dev/null +++ b/flowable/src/main/java/com/yyy/flowable/controller/FlowTaskController.java @@ -0,0 +1,275 @@ +package com.yyy.flowable.controller; + +import com.yyy.common.core.controller.BaseController; +import com.yyy.common.core.domain.Result; +import com.yyy.common.enums.FlowStatus; +import com.yyy.flowable.domain.dto.FlowTaskDto; +import com.yyy.flowable.domain.dto.FlowTaskMessageDto; +import com.yyy.flowable.domain.vo.FlowQueryVo; +import com.yyy.flowable.domain.vo.FlowTaskVo; +import com.yyy.flowable.service.IFlowTaskService; +import com.yyy.system.entity.dto.FlFormItemDto; +import com.yyy.system.service.FlFormItemService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.imageio.ImageIO; +import javax.servlet.http.HttpServletResponse; +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.List; + +/** + *

工作流任务管理

+ */ +@Slf4j +@Api(tags = "flowable-任务管理") +@RestController +@RequestMapping("/api/flowable/task") +public class FlowTaskController extends BaseController { + + @Autowired + private IFlowTaskService flowTaskService; + + @Autowired + private FlFormItemService flFormItemService; + + @ApiOperation(value = "我发起的流程") + @PostMapping(value = "/myProcess") + public Result> myProcess(@RequestBody FlowQueryVo queryVo) { + return flowTaskService.myProcess(queryVo); + } + + @ApiOperation(value = "取消申请", response = FlowTaskDto.class) + @PostMapping(value = "/stopProcess") + public Result stopProcess(@RequestBody FlowTaskVo flowTaskVo) { + return flowTaskService.stopProcess(flowTaskVo); + } + + @ApiOperation(value = "发起人撤回流程", response = FlowTaskDto.class, notes = "撤回 {procInsId}") + @PostMapping(value = "/revokeProcess") + public Result revokeProcess(@RequestBody FlowTaskVo flowTaskVo) { + Result result = flowTaskService.revokeProcess(flowTaskVo); + return result; + } + + @ApiOperation(value = "获取待办列表") + @PostMapping(value = "/todoList") + public Result> todoList(@RequestBody FlowQueryVo queryVo) { + return flowTaskService.todoList(queryVo); + } + + @ApiOperation(value = "获取待办 - 流程消息") + @PostMapping(value = "/todoListMSG") + public Result> todoListMSG(@RequestBody FlowQueryVo queryVo) { + return flowTaskService.todoListMSG(queryVo); + } + + @ApiOperation(value = "获取待办列表数量(主页待我处理)") + @PostMapping(value = "/todoListCount") + public Result todoListCount() { + return success(flowTaskService.todoListCount()); + } + + @ApiOperation(value = "获取已办任务") + @PostMapping(value = "/finishedList") + public Result> finishedList(@RequestBody FlowQueryVo queryVo) { + return flowTaskService.finishedList(queryVo); + } + + + @ApiOperation(value = "流程历史流转记录", response = FlowTaskDto.class) + @GetMapping(value = "/flowRecord") + public Result flowRecord(String procInsId, String deployId) { + return flowTaskService.flowRecord(procInsId, deployId); + } + + + @ApiOperation(value = "流程初始化表单", response = FlowTaskDto.class) + @GetMapping(value = "/flowFormData") + public Result flowFormData(String deployId) { + return flowTaskService.flowFormData(deployId); + } + + @ApiOperation(value = "获取流程变量", response = FlowTaskDto.class) + @GetMapping(value = "/processVariables/{taskId}") + public Result processVariables(@ApiParam(value = "流程任务Id") @PathVariable(value = "taskId") String taskId) { + return flowTaskService.processVariables(taskId); + } + + @ApiOperation(value = "审批任务") + @PostMapping(value = "/complete") + public Result complete(@RequestBody FlowTaskVo flowTaskVo) { + return flowTaskService.complete(flowTaskVo); + } + + @ApiOperation(value = "驳回任务") + @PostMapping(value = "/reject") + public Result taskReject(@RequestBody FlowTaskVo flowTaskVo) { + flowTaskService.taskReject(flowTaskVo); + return success(); + } + + @ApiOperation(value = "退回任务") + @PostMapping(value = "/return") + public Result taskReturn(@RequestBody FlowTaskVo flowTaskVo) { + flowTaskService.taskReturn(flowTaskVo); + return success(); + } + + @ApiOperation(value = "获取所有可回退的节点") + @PostMapping(value = "/returnList") + public Result findReturnTaskList(@RequestBody FlowTaskVo flowTaskVo) { + return flowTaskService.findReturnTaskList(flowTaskVo); + } + + @ApiOperation(value = "删除任务") + @DeleteMapping(value = "/delete") + public Result delete(@RequestBody FlowTaskVo flowTaskVo) { + flowTaskService.deleteTask(flowTaskVo); + return success(); + } + + @ApiOperation(value = "认领/签收任务", notes = "受理 {instanceId,taskId,userId}") + @PostMapping(value = "/claim") + public Result claim(@RequestBody FlowTaskVo flowTaskVo) { + flowTaskService.claim(flowTaskVo); + // 设备流程指派/受理后变成待处理状态 简单实现,如果逻辑有变需要修改 + flFormItemService.update(FlFormItemDto.builder().procInsId(flowTaskVo.getInstanceId()).status(FlowStatus.DISPOSE.getCode()).build()); + return success(); + } + + @ApiOperation(value = "取消认领/签收任务") + @PostMapping(value = "/unClaim") + public Result unClaim(@RequestBody FlowTaskVo flowTaskVo) { + flowTaskService.unClaim(flowTaskVo); + return success(); + } + + @ApiOperation(value = "委派任务") + @PostMapping(value = "/delegateTask") + public Result delegate(@RequestBody FlowTaskVo flowTaskVo) { + flowTaskService.delegateTask(flowTaskVo); + return success(); + } + + @ApiOperation(value = "任务归还") + @PostMapping(value = "/resolveTask") + public Result resolveTask(@RequestBody FlowTaskVo flowTaskVo) { + flowTaskService.resolveTask(flowTaskVo); + return success(); + } + + @ApiOperation(value = "转办任务", notes = "指派 {instanceId,taskId,assignee}") + @PostMapping(value = "/assignTask") + public Result assign(@RequestBody FlowTaskVo flowTaskVo) { + flowTaskService.assignTask(flowTaskVo); + // 设备流程指派/受理后变成待处理状态 简单实现,如果逻辑有变需要修改 + flFormItemService.update(FlFormItemDto.builder().procInsId(flowTaskVo.getInstanceId()).status(FlowStatus.DISPOSE.getCode()).build()); + return success(); + } + + @PostMapping(value = "/addMultiInstanceExecution") + @ApiOperation(value = "多实例加签") + public Result addMultiInstanceExecution(@RequestBody FlowTaskVo flowTaskVo) { + flowTaskService.addMultiInstanceExecution(flowTaskVo); + return success("加签成功"); + } + + @PostMapping(value = "/deleteMultiInstanceExecution") + @ApiOperation(value = "多实例减签") + public Result deleteMultiInstanceExecution(@RequestBody FlowTaskVo flowTaskVo) { + flowTaskService.deleteMultiInstanceExecution(flowTaskVo); + return success("减签成功"); + } + + @ApiOperation(value = "获取下一节点") + @PostMapping(value = "/nextFlowNode") + public Result getNextFlowNode(@RequestBody FlowTaskVo flowTaskVo) { + return flowTaskService.getNextFlowNode(flowTaskVo); + } + + @ApiOperation(value = "流程发起时获取下一节点") + @PostMapping(value = "/nextFlowNodeByStart") + public Result getNextFlowNodeByStart(@RequestBody FlowTaskVo flowTaskVo) { + return flowTaskService.getNextFlowNodeByStart(flowTaskVo); + } + + /** + * 生成流程图 + * + * @param processId 任务ID + */ + @ApiOperation(value = "生成流程图") + @GetMapping("/diagram/{processId}") + public void genProcessDiagram(HttpServletResponse response, + @PathVariable("processId") String processId) { + InputStream inputStream = flowTaskService.diagram(processId); + OutputStream os = null; + BufferedImage image = null; + try { + image = ImageIO.read(inputStream); + response.setContentType("image/png"); + os = response.getOutputStream(); + if (image != null) { + ImageIO.write(image, "png", os); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (os != null) { + os.flush(); + os.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + /** + * 获取流程执行节点 + * + * @param procInsId 流程实例编号 + * @param procInsId 任务执行编号 + */ + @ApiOperation(value = "获取流程执行节点") + @GetMapping("/flowViewer/{procInsId}/{executionId}") + public Result getFlowViewer(@PathVariable("procInsId") String procInsId, + @PathVariable("executionId") String executionId) { + return flowTaskService.getFlowViewer(procInsId, executionId); + } + + /** + * 流程节点信息 + * + * @param procInsId 流程实例id + * @return + */ + @ApiOperation(value = "流程节点信息") + @GetMapping("/flowXmlAndNode") + public Result flowXmlAndNode(@RequestParam(value = "procInsId", required = false) String procInsId, + @RequestParam(value = "deployId", required = false) String deployId) { + return flowTaskService.flowXmlAndNode(procInsId, deployId); + } + + /** + * 流程节点表单 + * + * @param taskId 流程任务编号 + * @return + */ + @ApiOperation(value = "流程节点表单") + @GetMapping("/flowTaskForm") + public Result flowTaskForm(@RequestParam(value = "taskId", required = false) String taskId) throws Exception { + return flowTaskService.flowTaskForm(taskId); + } + +} diff --git a/flowable/src/main/java/com/yyy/flowable/domain/FlowableNodeParams.java b/flowable/src/main/java/com/yyy/flowable/domain/FlowableNodeParams.java new file mode 100644 index 0000000..3ade2cb --- /dev/null +++ b/flowable/src/main/java/com/yyy/flowable/domain/FlowableNodeParams.java @@ -0,0 +1,27 @@ +package com.yyy.flowable.domain; + +import io.swagger.annotations.ApiModel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@ApiModel("节点信息") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class FlowableNodeParams { + // 节点id + private String id; + // 节点名称 + private String name; + // 单个审批人 + private String assignee; + // 候选人 + private String candidateUsers; + // 审批组 + private String candidateGroups; + // 备注 + private String documentation; +} diff --git a/flowable/src/main/java/com/yyy/flowable/domain/dto/FlowCommentDto.java b/flowable/src/main/java/com/yyy/flowable/domain/dto/FlowCommentDto.java new file mode 100644 index 0000000..b1408f1 --- /dev/null +++ b/flowable/src/main/java/com/yyy/flowable/domain/dto/FlowCommentDto.java @@ -0,0 +1,21 @@ +package com.yyy.flowable.domain.dto; + +import lombok.Builder; +import lombok.Data; + +import java.io.Serializable; + +@Data +@Builder +public class FlowCommentDto implements Serializable { + + /** + * 意见类别 0 正常意见 1 退回意见 2 驳回意见 + */ + private String type; + + /** + * 意见内容 + */ + private String comment; +} diff --git a/flowable/src/main/java/com/yyy/flowable/domain/dto/FlowFromFieldDTO.java b/flowable/src/main/java/com/yyy/flowable/domain/dto/FlowFromFieldDTO.java new file mode 100644 index 0000000..457af8f --- /dev/null +++ b/flowable/src/main/java/com/yyy/flowable/domain/dto/FlowFromFieldDTO.java @@ -0,0 +1,11 @@ +package com.yyy.flowable.domain.dto; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class FlowFromFieldDTO implements Serializable { + + private Object fields; +} diff --git a/flowable/src/main/java/com/yyy/flowable/domain/dto/FlowNextDto.java b/flowable/src/main/java/com/yyy/flowable/domain/dto/FlowNextDto.java new file mode 100644 index 0000000..497d1b4 --- /dev/null +++ b/flowable/src/main/java/com/yyy/flowable/domain/dto/FlowNextDto.java @@ -0,0 +1,17 @@ +package com.yyy.flowable.domain.dto; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 动态人员、组 + */ +@Data +public class FlowNextDto implements Serializable { + + private String type; + private String dataType; + private String vars; + +} diff --git a/flowable/src/main/java/com/yyy/flowable/domain/dto/FlowSaveXmlVo.java b/flowable/src/main/java/com/yyy/flowable/domain/dto/FlowSaveXmlVo.java new file mode 100644 index 0000000..f99c6f5 --- /dev/null +++ b/flowable/src/main/java/com/yyy/flowable/domain/dto/FlowSaveXmlVo.java @@ -0,0 +1,24 @@ +package com.yyy.flowable.domain.dto; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class FlowSaveXmlVo implements Serializable { + + /** + * 流程名称 + */ + private String name; + + /** + * 流程分类 + */ + private String category; + + /** + * xml 文件 + */ + private String xml; +} diff --git a/flowable/src/main/java/com/yyy/flowable/domain/dto/FlowTaskDto.java b/flowable/src/main/java/com/yyy/flowable/domain/dto/FlowTaskDto.java new file mode 100644 index 0000000..0b1c4f6 --- /dev/null +++ b/flowable/src/main/java/com/yyy/flowable/domain/dto/FlowTaskDto.java @@ -0,0 +1,102 @@ +package com.yyy.flowable.domain.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import java.io.Serializable; +import java.util.Date; + +/** + *

工作流任务

+ */ +@Getter +@Setter +@ApiModel("工作流任务相关-返回参数") +public class FlowTaskDto implements Serializable { + + @ApiModelProperty("任务编号") + private String taskId; + + @ApiModelProperty("任务执行编号") + private String executionId; + + @ApiModelProperty("任务名称") + private String taskName; + + @ApiModelProperty("任务Key") + private String taskDefKey; + + @ApiModelProperty("任务执行人Id") + private Long assigneeId; + + @ApiModelProperty("部门名称") + private String deptName; + + @ApiModelProperty("流程发起人部门名称") + private String startDeptName; + + @ApiModelProperty("任务执行人名称") + private String assigneeName; + + @ApiModelProperty("任务执行人部门") + private String assigneeDeptName;; + + @ApiModelProperty("流程发起人Id") + private String startUserId; + + @ApiModelProperty("流程发起人名称") + private String startUserName; + + @ApiModelProperty("流程类型") + private String category; + + @ApiModelProperty("流程变量信息") + private Object procVars; + + @ApiModelProperty("局部变量信息") + private Object taskLocalVars; + + @ApiModelProperty("流程部署编号") + private String deployId; + + @ApiModelProperty("流程ID") + private String procDefId; + + @ApiModelProperty("流程key") + private String procDefKey; + + @ApiModelProperty("流程定义名称") + private String procDefName; + + @ApiModelProperty("流程定义内置使用版本") + private int procDefVersion; + + @ApiModelProperty("流程实例ID") + private String procInsId; + + @ApiModelProperty("历史流程实例ID") + private String hisProcInsId; + + @ApiModelProperty("任务耗时") + private String duration; + + @ApiModelProperty("任务意见") + private FlowCommentDto comment; + + @ApiModelProperty("候选执行人") + private String candidate; + + @ApiModelProperty("任务创建时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + + @ApiModelProperty("任务完成时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date finishTime; + + @ApiModelProperty("流程状态(1-起草中,2-审批中,3-已结束,4-已驳回,5-已废弃,6-流程异常)") + private Integer status; +} diff --git a/flowable/src/main/java/com/yyy/flowable/domain/dto/FlowTaskMessageDto.java b/flowable/src/main/java/com/yyy/flowable/domain/dto/FlowTaskMessageDto.java new file mode 100644 index 0000000..09455d2 --- /dev/null +++ b/flowable/src/main/java/com/yyy/flowable/domain/dto/FlowTaskMessageDto.java @@ -0,0 +1,36 @@ +package com.yyy.flowable.domain.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import java.io.Serializable; +import java.util.Date; + +@Getter +@Setter +@ApiModel("流程消息") +public class FlowTaskMessageDto implements Serializable { + + @ApiModelProperty("流程实例ID") + private String procInsId; + + @ApiModelProperty("任务编号") + private String taskId; + + @ApiModelProperty("任务创建时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + + //内容 + @ApiModelProperty("流程发起人名称") + private String content; + + @ApiModelProperty("流程状态") + private Integer status; + + @ApiModelProperty("类型") + private String type; +} diff --git a/flowable/src/main/java/com/yyy/flowable/domain/dto/FlowViewerDto.java b/flowable/src/main/java/com/yyy/flowable/domain/dto/FlowViewerDto.java new file mode 100644 index 0000000..8734ec7 --- /dev/null +++ b/flowable/src/main/java/com/yyy/flowable/domain/dto/FlowViewerDto.java @@ -0,0 +1,19 @@ +package com.yyy.flowable.domain.dto; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class FlowViewerDto implements Serializable { + + /** + * 流程key + */ + private String key; + + /** + * 是否完成(已经审批) + */ + private boolean completed; +} diff --git a/flowable/src/main/java/com/yyy/flowable/domain/vo/FlowQueryVo.java b/flowable/src/main/java/com/yyy/flowable/domain/vo/FlowQueryVo.java new file mode 100644 index 0000000..a802bb7 --- /dev/null +++ b/flowable/src/main/java/com/yyy/flowable/domain/vo/FlowQueryVo.java @@ -0,0 +1,31 @@ +package com.yyy.flowable.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + *

流程任务

+ */ +@Data +@ApiModel("工作流任务相关--查询参数") +public class FlowQueryVo { + + @ApiModelProperty("流程名称") + private String name; + + @ApiModelProperty("开始时间") + private String startTime; + + @ApiModelProperty("结束时间") + private String endTime; + + @ApiModelProperty("当前页码") + private Integer pageNum = 1; + + @ApiModelProperty("每页条数") + private Integer pageSize = 10; + + @ApiModelProperty("流程分类 asset-资产管理,device-设备任务") + private String type; +} diff --git a/flowable/src/main/java/com/yyy/flowable/domain/vo/FlowTaskVo.java b/flowable/src/main/java/com/yyy/flowable/domain/vo/FlowTaskVo.java new file mode 100644 index 0000000..b1a6ac7 --- /dev/null +++ b/flowable/src/main/java/com/yyy/flowable/domain/vo/FlowTaskVo.java @@ -0,0 +1,54 @@ +package com.yyy.flowable.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +/** + *

流程任务

+ */ +@Data +@ApiModel("工作流任务相关--请求参数") +public class FlowTaskVo { + + @ApiModelProperty(value = "任务Id", required = true) + private String taskId; + + @ApiModelProperty(value = "用户Id") + private String userId; + + @ApiModelProperty(value = "任务意见") + private String comment; + + @ApiModelProperty(value = "流程实例Id", required = true) + private String instanceId; + + @ApiModelProperty(value = "节点") + private String targetKey; + + private String deploymentId; + + @ApiModelProperty(value = "流程环节定义ID") + private String defId; + + @ApiModelProperty(value = "子执行流ID") + private String currentChildExecutionId; + + @ApiModelProperty(value = "子执行流是否已执行") + private Boolean flag; + + @ApiModelProperty(value = "流程变量信息") + private Map variables; + + @ApiModelProperty(value = "审批人") + private String assignee; + + @ApiModelProperty(value = "候选人") + private List candidateUsers; + + @ApiModelProperty(value = "审批组") + private List candidateGroups; +} diff --git a/flowable/src/main/java/com/yyy/flowable/domain/vo/ReturnTaskNodeVo.java b/flowable/src/main/java/com/yyy/flowable/domain/vo/ReturnTaskNodeVo.java new file mode 100644 index 0000000..6ab9845 --- /dev/null +++ b/flowable/src/main/java/com/yyy/flowable/domain/vo/ReturnTaskNodeVo.java @@ -0,0 +1,20 @@ +package com.yyy.flowable.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + *

可退回节点

+ */ +@Data +@ApiModel("可退回节点") +public class ReturnTaskNodeVo { + + @ApiModelProperty("任务Id") + private String id; + + @ApiModelProperty("用户Id") + private String name; + +} diff --git a/flowable/src/main/java/com/yyy/flowable/factory/FlowServiceFactory.java b/flowable/src/main/java/com/yyy/flowable/factory/FlowServiceFactory.java new file mode 100644 index 0000000..fb6bde7 --- /dev/null +++ b/flowable/src/main/java/com/yyy/flowable/factory/FlowServiceFactory.java @@ -0,0 +1,39 @@ +package com.yyy.flowable.factory; + +import lombok.Getter; +import org.flowable.engine.*; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * flowable 引擎注入封装 + */ +@Component +@Getter +public class FlowServiceFactory { + + @Resource + protected RepositoryService repositoryService; + + @Resource + protected RuntimeService runtimeService; + + @Resource + protected IdentityService identityService; + + @Resource + protected TaskService taskService; + + @Resource + protected HistoryService historyService; + + @Resource + protected ManagementService managementService; + + @Qualifier("processEngine") + @Resource + protected ProcessEngine processEngine; + +} diff --git a/flowable/src/main/java/com/yyy/flowable/flow/CustomInjectUserTaskInProcessInstanceCmd.java b/flowable/src/main/java/com/yyy/flowable/flow/CustomInjectUserTaskInProcessInstanceCmd.java new file mode 100644 index 0000000..ffbb0f4 --- /dev/null +++ b/flowable/src/main/java/com/yyy/flowable/flow/CustomInjectUserTaskInProcessInstanceCmd.java @@ -0,0 +1,297 @@ +package com.yyy.flowable.flow; + +import com.yyy.common.utils.uuid.SnowFlakeUtil; +import org.flowable.bpmn.BpmnAutoLayout; +import org.flowable.bpmn.model.*; +import org.flowable.bpmn.model.Process; +import org.flowable.common.engine.impl.interceptor.Command; +import org.flowable.common.engine.impl.interceptor.CommandContext; +import org.flowable.engine.impl.cmd.AbstractDynamicInjectionCmd; +import org.flowable.engine.impl.context.Context; +import org.flowable.engine.impl.dynamic.BaseDynamicSubProcessInjectUtil; +import org.flowable.engine.impl.dynamic.DynamicUserTaskBuilder; +import org.flowable.engine.impl.persistence.entity.DeploymentEntity; +import org.flowable.engine.impl.persistence.entity.ExecutionEntity; +import org.flowable.engine.impl.persistence.entity.ExecutionEntityManager; +import org.flowable.engine.impl.persistence.entity.ProcessDefinitionEntity; +import org.flowable.engine.impl.util.CommandContextUtil; +import org.flowable.engine.impl.util.ProcessDefinitionUtil; +import org.flowable.task.service.impl.persistence.entity.TaskEntity; +import org.springframework.beans.BeanUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 动态增加节点 + */ +public class CustomInjectUserTaskInProcessInstanceCmd extends AbstractDynamicInjectionCmd implements Command { + + protected String processInstanceId; + protected DynamicUserTaskBuilder dynamicUserTaskBuilder; + protected FlowElement currentFlowElemet; + + + public CustomInjectUserTaskInProcessInstanceCmd(String processInstanceId, DynamicUserTaskBuilder dynamicUserTaskBuilder, FlowElement currentFlowElemet) { + this.processInstanceId = processInstanceId; + this.dynamicUserTaskBuilder = dynamicUserTaskBuilder; + this.currentFlowElemet = currentFlowElemet; + } + + @Override + public Void execute(CommandContext commandContext) { + createDerivedProcessDefinitionForProcessInstance(commandContext, processInstanceId); + return null; + } + + @Override + protected void updateBpmnProcess(CommandContext commandContext, Process process, + BpmnModel bpmnModel, ProcessDefinitionEntity originalProcessDefinitionEntity, DeploymentEntity newDeploymentEntity) { + + List startEvents = process.findFlowElementsOfType(StartEvent.class); + StartEvent initialStartEvent = null; + for (StartEvent startEvent : startEvents) { + if (startEvent.getEventDefinitions().size() == 0) { + initialStartEvent = startEvent; + break; + + } else if (initialStartEvent == null) { + initialStartEvent = startEvent; + } + } + if (currentFlowElemet != null) { + + UserTask userTask = new UserTask(); + BeanUtils.copyProperties(currentFlowElemet, userTask); + if (dynamicUserTaskBuilder.getId() != null) { + userTask.setId(dynamicUserTaskBuilder.getId()); + } else { + userTask.setId(dynamicUserTaskBuilder.nextTaskId(process.getFlowElementMap())); + } + dynamicUserTaskBuilder.setDynamicTaskId(userTask.getId()); + + userTask.setName(dynamicUserTaskBuilder.getName()); + userTask.setAssignee(dynamicUserTaskBuilder.getAssignee()); + + UserTask currentFlowElemet = (UserTask) this.currentFlowElemet; + SequenceFlow sequenceFlow = null; + + + List outgoingFlows = new ArrayList<>(); + for (SequenceFlow sequenceFlow1 : currentFlowElemet.getOutgoingFlows()) { + sequenceFlow = new SequenceFlow(userTask.getId(), sequenceFlow1.getTargetRef()); + sequenceFlow.setSkipExpression(sequenceFlow1.getSkipExpression()); + sequenceFlow.setConditionExpression(sequenceFlow1.getConditionExpression()); + sequenceFlow.setExtensionElements(sequenceFlow1.getExtensionElements()); + sequenceFlow.setExecutionListeners(sequenceFlow1.getExecutionListeners()); + sequenceFlow.setName(sequenceFlow1.getName()); + + sequenceFlow.setId("seq_" + SnowFlakeUtil.getDefaultSnowFlakeId()); + outgoingFlows.add(sequenceFlow); + //删除原先节点的出线 + process.removeFlowElement(sequenceFlow1.getId()); + process.addFlowElement(sequenceFlow); + } + + List incomingFlows = new ArrayList<>(); + SequenceFlow incomingFlow = new SequenceFlow(currentFlowElemet.getId(), userTask.getId()); + // 可以设置唯一编号,这里通过雪花算法设置 + incomingFlow.setId("seq_" + SnowFlakeUtil.getDefaultSnowFlakeId()); + incomingFlows.add(incomingFlow); + + process.addFlowElement(incomingFlow); + userTask.setOutgoingFlows(outgoingFlows); + userTask.setIncomingFlows(incomingFlows); + process.addFlowElement(userTask); + + //新增坐标 点 + GraphicInfo elementGraphicInfo = bpmnModel.getGraphicInfo(currentFlowElemet.getId()); + if (elementGraphicInfo != null) { + double yDiff = 0; + double xDiff = 80; + if (elementGraphicInfo.getY() < 173) { + yDiff = 173 - elementGraphicInfo.getY(); + elementGraphicInfo.setY(173); + } + + Map locationMap = bpmnModel.getLocationMap(); + for (String locationId : locationMap.keySet()) { + if (initialStartEvent.getId().equals(locationId)) { + continue; + } + + GraphicInfo locationGraphicInfo = locationMap.get(locationId); + locationGraphicInfo.setX(locationGraphicInfo.getX() + xDiff); + locationGraphicInfo.setY(locationGraphicInfo.getY() + yDiff); + } + + Map> flowLocationMap = bpmnModel.getFlowLocationMap(); + for (String flowId : flowLocationMap.keySet()) { +// if (flowFromStart.getId().equals(flowId)) { +// continue; +// } + + List flowGraphicInfoList = flowLocationMap.get(flowId); + for (GraphicInfo flowGraphicInfo : flowGraphicInfoList) { + flowGraphicInfo.setX(flowGraphicInfo.getX() + xDiff); + flowGraphicInfo.setY(flowGraphicInfo.getY() + yDiff); + + } + } + + /* 以下代码 可以替换以下步骤,推荐使用这种 + 步骤一: 引入 自动排版jar + + org.flowable + flowable-bpmn-layout + 6.4.1 + + 步骤二 调用自动排版方法: + new BpmnAutoLayout(bpmnModel).execute(); + */ + new BpmnAutoLayout(bpmnModel).execute(); +// /* 手动绘制节点 */ +// GraphicInfo newTaskGraphicInfo = new GraphicInfo(elementGraphicInfo.getX() + 185, elementGraphicInfo.getY() - 163, 80, 100); +// bpmnModel.addGraphicInfo(userTask.getId(), newTaskGraphicInfo); +// +// bpmnModel.addFlowGraphicInfoList(userTask.getId(), createWayPoints(elementGraphicInfo.getX() + 95, elementGraphicInfo.getY() - 5, +// elementGraphicInfo.getX() + 95, elementGraphicInfo.getY() - 123, elementGraphicInfo.getX() + 185, elementGraphicInfo.getY() - 123)); +// +// List addFlows = new ArrayList<>(); +// addFlows.addAll(outgoingFlows); +// addFlows.addAll(incomingFlows); +// +// /* 绘制连线 */ +// for (SequenceFlow sequenceFlow1 : addFlows) { +// bpmnModel.addFlowGraphicInfoList(sequenceFlow1.getId(), createWayPoints(elementGraphicInfo.getX() + 30, elementGraphicInfo.getY() + 15, +// elementGraphicInfo.getX() + 75, elementGraphicInfo.getY() + 15)); +// } + } + + } else { + + + ParallelGateway parallelGateway = new ParallelGateway(); + parallelGateway.setId(dynamicUserTaskBuilder.nextForkGatewayId(process.getFlowElementMap())); + process.addFlowElement(parallelGateway); + + UserTask userTask = new UserTask(); + if (dynamicUserTaskBuilder.getId() != null) { + userTask.setId(dynamicUserTaskBuilder.getId()); + } else { + userTask.setId(dynamicUserTaskBuilder.nextTaskId(process.getFlowElementMap())); + } + dynamicUserTaskBuilder.setDynamicTaskId(userTask.getId()); + + userTask.setName(dynamicUserTaskBuilder.getName()); + userTask.setAssignee(dynamicUserTaskBuilder.getAssignee()); + process.addFlowElement(userTask); + + EndEvent endEvent = new EndEvent(); + endEvent.setId(dynamicUserTaskBuilder.nextEndEventId(process.getFlowElementMap())); + process.addFlowElement(endEvent); + + SequenceFlow flowToUserTask = new SequenceFlow(parallelGateway.getId(), userTask.getId()); + flowToUserTask.setId(dynamicUserTaskBuilder.nextFlowId(process.getFlowElementMap())); + process.addFlowElement(flowToUserTask); + + SequenceFlow flowFromUserTask = new SequenceFlow(userTask.getId(), endEvent.getId()); + flowFromUserTask.setId(dynamicUserTaskBuilder.nextFlowId(process.getFlowElementMap())); + process.addFlowElement(flowFromUserTask); + + SequenceFlow initialFlow = initialStartEvent.getOutgoingFlows().get(0); + initialFlow.setSourceRef(parallelGateway.getId()); + + SequenceFlow flowFromStart = new SequenceFlow(initialStartEvent.getId(), parallelGateway.getId()); + flowFromStart.setId(dynamicUserTaskBuilder.nextFlowId(process.getFlowElementMap())); + process.addFlowElement(flowFromStart); + //跳整节点的布局 + GraphicInfo elementGraphicInfo = bpmnModel.getGraphicInfo(initialStartEvent.getId()); + if (elementGraphicInfo != null) { + double yDiff = 0; + double xDiff = 80; + if (elementGraphicInfo.getY() < 173) { + yDiff = 173 - elementGraphicInfo.getY(); + elementGraphicInfo.setY(173); + } + + Map locationMap = bpmnModel.getLocationMap(); + for (String locationId : locationMap.keySet()) { + if (initialStartEvent.getId().equals(locationId)) { + continue; + } + + GraphicInfo locationGraphicInfo = locationMap.get(locationId); + locationGraphicInfo.setX(locationGraphicInfo.getX() + xDiff); + locationGraphicInfo.setY(locationGraphicInfo.getY() + yDiff); + } + + Map> flowLocationMap = bpmnModel.getFlowLocationMap(); + for (String flowId : flowLocationMap.keySet()) { + if (flowFromStart.getId().equals(flowId)) { + continue; + } + + List flowGraphicInfoList = flowLocationMap.get(flowId); + for (GraphicInfo flowGraphicInfo : flowGraphicInfoList) { + flowGraphicInfo.setX(flowGraphicInfo.getX() + xDiff); + flowGraphicInfo.setY(flowGraphicInfo.getY() + yDiff); + } + } + + GraphicInfo forkGraphicInfo = new GraphicInfo(elementGraphicInfo.getX() + 75, elementGraphicInfo.getY() - 5, 40, 40); + bpmnModel.addGraphicInfo(parallelGateway.getId(), forkGraphicInfo); + + bpmnModel.addFlowGraphicInfoList(flowFromStart.getId(), createWayPoints(elementGraphicInfo.getX() + 30, elementGraphicInfo.getY() + 15, + elementGraphicInfo.getX() + 75, elementGraphicInfo.getY() + 15)); + + GraphicInfo newTaskGraphicInfo = new GraphicInfo(elementGraphicInfo.getX() + 185, elementGraphicInfo.getY() - 163, 80, 100); + bpmnModel.addGraphicInfo(userTask.getId(), newTaskGraphicInfo); + + bpmnModel.addFlowGraphicInfoList(flowToUserTask.getId(), createWayPoints(elementGraphicInfo.getX() + 95, elementGraphicInfo.getY() - 5, + elementGraphicInfo.getX() + 95, elementGraphicInfo.getY() - 123, elementGraphicInfo.getX() + 185, elementGraphicInfo.getY() - 123)); + + GraphicInfo endGraphicInfo = new GraphicInfo(elementGraphicInfo.getX() + 335, elementGraphicInfo.getY() - 137, 28, 28); + bpmnModel.addGraphicInfo(endEvent.getId(), endGraphicInfo); + + bpmnModel.addFlowGraphicInfoList(flowFromUserTask.getId(), createWayPoints(elementGraphicInfo.getX() + 285, elementGraphicInfo.getY() - 123, + elementGraphicInfo.getX() + 335, elementGraphicInfo.getY() - 123)); + } + } + + BaseDynamicSubProcessInjectUtil.processFlowElements(commandContext, process, bpmnModel, originalProcessDefinitionEntity, newDeploymentEntity); + } + + @Override + protected void updateExecutions(CommandContext commandContext, ProcessDefinitionEntity processDefinitionEntity, + ExecutionEntity processInstance, List childExecutions) { + +// ExecutionEntityManager executionEntityManager = CommandContextUtil.getExecutionEntityManager(commandContext); +// List oldExecution = executionEntityManager.findChildExecutionsByProcessInstanceId(processInstance.getProcessInstanceId()); +// ExecutionEntity execution = executionEntityManager.createChildExecution(processInstance); +// BpmnModel bpmnModel = ProcessDefinitionUtil.getBpmnModel(processDefinitionEntity.getId()); +// +// org.flowable.task.service.TaskService taskService = CommandContextUtil.getTaskService(commandContext); +// List taskEntities = taskService.findTasksByProcessInstanceId(processInstanceId); +// // 删除当前活动任务 +// for (TaskEntity taskEntity : taskEntities) { +// taskEntity.getIdentityLinks().stream().forEach(identityLinkEntity -> { +// if (identityLinkEntity.isGroup()) { +// taskEntity.deleteGroupIdentityLink(identityLinkEntity.getGroupId(), "candidate"); +// } else { +// taskEntity.deleteUserIdentityLink(identityLinkEntity.getUserId(), "participant"); +// } +// }); +// if (taskEntity.getTaskDefinitionKey().equals(currentFlowElemet.getId())) { +// taskService.deleteTask(taskEntity, false); +// } +// } +// +// //设置活动后的节点 +// UserTask userTask = (UserTask) bpmnModel.getProcessById(processDefinitionEntity.getKey()).getFlowElement(dynamicUserTaskBuilder.getId()); +// // FlowElement userTask = bpmnModel.getProcessById(processDefinitionEntity.getKey()).getFlowElement("id_1"); +// execution.setCurrentFlowElement(userTask); +// Context.getAgenda().planContinueProcessOperation(execution); + } +} diff --git a/flowable/src/main/java/com/yyy/flowable/flow/CustomProcessDiagramCanvas.java b/flowable/src/main/java/com/yyy/flowable/flow/CustomProcessDiagramCanvas.java new file mode 100644 index 0000000..b0cfdc9 --- /dev/null +++ b/flowable/src/main/java/com/yyy/flowable/flow/CustomProcessDiagramCanvas.java @@ -0,0 +1,366 @@ +package com.yyy.flowable.flow; + +import org.flowable.bpmn.model.AssociationDirection; +import org.flowable.bpmn.model.GraphicInfo; +import org.flowable.image.impl.DefaultProcessDiagramCanvas; +import org.flowable.image.util.ReflectUtil; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.font.FontRenderContext; +import java.awt.font.LineBreakMeasurer; +import java.awt.font.TextAttribute; +import java.awt.font.TextLayout; +import java.awt.geom.Ellipse2D; +import java.awt.geom.Rectangle2D; +import java.awt.geom.RoundRectangle2D; +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.text.AttributedCharacterIterator; +import java.text.AttributedString; + +public class CustomProcessDiagramCanvas extends DefaultProcessDiagramCanvas { + //定义走过流程连线颜色为绿色 + protected static Color HIGHLIGHT_SequenceFlow_COLOR = Color.GREEN; + //设置未走过流程的连接线颜色 + protected static Color CONNECTION_COLOR = Color.BLACK; + //设置flows连接线字体颜色red + protected static Color LABEL_COLOR = new Color(0, 0, 0); + //高亮显示task框颜色 + protected static Color HIGHLIGHT_COLOR = Color.GREEN; + protected static Color HIGHLIGHT_COLOR1 = Color.RED; + + public CustomProcessDiagramCanvas(int width, int height, int minX, int minY, String imageType, String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader) { + super(width, height, minX, minY, imageType, activityFontName, labelFontName, annotationFontName, customClassLoader); + this.initialize(imageType); + } + + /** + * 重写绘制连线的方式,设置绘制颜色 + * @param xPoints + * @param yPoints + * @param conditional + * @param isDefault + * @param connectionType + * @param associationDirection + * @param highLighted + * @param scaleFactor + */ + @Override + public void drawConnection(int[] xPoints, int[] yPoints, boolean conditional, boolean isDefault, String connectionType, AssociationDirection associationDirection, boolean highLighted, double scaleFactor) { + Paint originalPaint = this.g.getPaint(); + Stroke originalStroke = this.g.getStroke(); + this.g.setPaint(CONNECTION_COLOR); + if (connectionType.equals("association")) { + this.g.setStroke(ASSOCIATION_STROKE); + } else if (highLighted) { + this.g.setPaint(HIGHLIGHT_SequenceFlow_COLOR); + this.g.setStroke(HIGHLIGHT_FLOW_STROKE); + } + + for (int i = 1; i < xPoints.length; ++i) { + Integer sourceX = xPoints[i - 1]; + Integer sourceY = yPoints[i - 1]; + Integer targetX = xPoints[i]; + Integer targetY = yPoints[i]; + java.awt.geom.Line2D.Double line = new java.awt.geom.Line2D.Double((double) sourceX, (double) sourceY, (double) targetX, (double) targetY); + this.g.draw(line); + } + + java.awt.geom.Line2D.Double line; + if (isDefault) { + line = new java.awt.geom.Line2D.Double((double) xPoints[0], (double) yPoints[0], (double) xPoints[1], (double) yPoints[1]); + this.drawDefaultSequenceFlowIndicator(line, scaleFactor); + } + + if (conditional) { + line = new java.awt.geom.Line2D.Double((double) xPoints[0], (double) yPoints[0], (double) xPoints[1], (double) yPoints[1]); + this.drawConditionalSequenceFlowIndicator(line, scaleFactor); + } + + if (associationDirection.equals(AssociationDirection.ONE) || associationDirection.equals(AssociationDirection.BOTH)) { + line = new java.awt.geom.Line2D.Double((double) xPoints[xPoints.length - 2], (double) yPoints[xPoints.length - 2], (double) xPoints[xPoints.length - 1], (double) yPoints[xPoints.length - 1]); + this.drawArrowHead(line, scaleFactor); + } + + if (associationDirection.equals(AssociationDirection.BOTH)) { + line = new java.awt.geom.Line2D.Double((double) xPoints[1], (double) yPoints[1], (double) xPoints[0], (double) yPoints[0]); + this.drawArrowHead(line, scaleFactor); + } + + this.g.setPaint(originalPaint); + this.g.setStroke(originalStroke); + } + + /** + * 设置字体大小图标颜色 + * @param imageType + */ + @Override + public void initialize(String imageType) { + if ("png".equalsIgnoreCase(imageType)) { + this.processDiagram = new BufferedImage(this.canvasWidth, this.canvasHeight, 2); + } else { + this.processDiagram = new BufferedImage(this.canvasWidth, this.canvasHeight, 1); + } + + this.g = this.processDiagram.createGraphics(); + if (!"png".equalsIgnoreCase(imageType)) { + this.g.setBackground(new Color(255, 255, 255, 0)); + this.g.clearRect(0, 0, this.canvasWidth, this.canvasHeight); + } + + this.g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + //修改图标颜色,修改图标字体大小 + this.g.setPaint(Color.black); + Font font = new Font(this.activityFontName, 10, 14); + this.g.setFont(font); + this.fontMetrics = this.g.getFontMetrics(); + //修改连接线字体大小 + LABEL_FONT = new Font(this.labelFontName, 10, 15); + ANNOTATION_FONT = new Font(this.annotationFontName, 0, 11); + + try { + USERTASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/userTask.png", this.customClassLoader)); + SCRIPTTASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/scriptTask.png", this.customClassLoader)); + SERVICETASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/serviceTask.png", this.customClassLoader)); + RECEIVETASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/receiveTask.png", this.customClassLoader)); + SENDTASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/sendTask.png", this.customClassLoader)); + MANUALTASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/manualTask.png", this.customClassLoader)); + BUSINESS_RULE_TASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/businessRuleTask.png", this.customClassLoader)); + SHELL_TASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/shellTask.png", this.customClassLoader)); + DMN_TASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/dmnTask.png", this.customClassLoader)); + CAMEL_TASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/camelTask.png", this.customClassLoader)); + MULE_TASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/muleTask.png", this.customClassLoader)); + HTTP_TASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/httpTask.png", this.customClassLoader)); + TIMER_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/timer.png", this.customClassLoader)); + COMPENSATE_THROW_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/compensate-throw.png", this.customClassLoader)); + COMPENSATE_CATCH_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/compensate.png", this.customClassLoader)); + ERROR_THROW_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/error-throw.png", this.customClassLoader)); + ERROR_CATCH_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/error.png", this.customClassLoader)); + MESSAGE_THROW_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/message-throw.png", this.customClassLoader)); + MESSAGE_CATCH_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/message.png", this.customClassLoader)); + SIGNAL_THROW_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/signal-throw.png", this.customClassLoader)); + SIGNAL_CATCH_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/signal.png", this.customClassLoader)); + } catch (IOException var4) { + LOGGER.warn("Could not load image for process diagram creation: {}", var4.getMessage()); + } + + } + + /** + * 设置连接线字体 + * @param text + * @param graphicInfo + * @param centered + */ + @Override + public void drawLabel(String text, GraphicInfo graphicInfo, boolean centered) { + float interline = 1.0f; + + // text + if (text != null && text.length() > 0) { + Paint originalPaint = g.getPaint(); + Font originalFont = g.getFont(); + + g.setPaint(LABEL_COLOR); + g.setFont(LABEL_FONT); + + int wrapWidth = 100; + int textY = (int) graphicInfo.getY(); + + // use drawMultilineText() + AttributedString as = new AttributedString(text); + as.addAttribute(TextAttribute.FOREGROUND, g.getPaint()); + as.addAttribute(TextAttribute.FONT, g.getFont()); + AttributedCharacterIterator aci = as.getIterator(); + FontRenderContext frc = new FontRenderContext(null, true, false); + LineBreakMeasurer lbm = new LineBreakMeasurer(aci, frc); + + while (lbm.getPosition() < text.length()) { + TextLayout tl = lbm.nextLayout(wrapWidth); + textY += tl.getAscent(); + + Rectangle2D bb = tl.getBounds(); + double tX = graphicInfo.getX(); + + if (centered) { + tX += (int) (graphicInfo.getWidth() / 2 - bb.getWidth() / 2); + } + tl.draw(g, (float) tX, textY); + textY += tl.getDescent() + tl.getLeading() + (interline - 1.0f) * tl.getAscent(); + } + + // restore originals + g.setFont(originalFont); + g.setPaint(originalPaint); + } + } + + /** + * 高亮显示task框完成的 + * @param x + * @param y + * @param width + * @param height + */ + @Override + public void drawHighLight(int x, int y, int width, int height) { + Paint originalPaint = g.getPaint(); + Stroke originalStroke = g.getStroke(); + + g.setPaint(HIGHLIGHT_COLOR); + g.setStroke(THICK_TASK_BORDER_STROKE); + + RoundRectangle2D rect = new RoundRectangle2D.Double(x, y, width, height, 20, 20); + g.draw(rect); + + g.setPaint(originalPaint); + g.setStroke(originalStroke); + } + + /** + * 自定义task框当前的位置 + * @param x + * @param y + * @param width + * @param height + */ + public void drawHighLightNow(int x, int y, int width, int height) { + Paint originalPaint = g.getPaint(); + Stroke originalStroke = g.getStroke(); + + g.setPaint(HIGHLIGHT_COLOR1); + g.setStroke(THICK_TASK_BORDER_STROKE); + + RoundRectangle2D rect = new RoundRectangle2D.Double(x, y, width, height, 20, 20); + g.draw(rect); + + g.setPaint(originalPaint); + g.setStroke(originalStroke); + } + + /** + * 自定义结束节点 + * @param x + * @param y + * @param width + * @param height + */ + public void drawHighLightEnd(int x, int y, int width, int height) { + Paint originalPaint = g.getPaint(); + Stroke originalStroke = g.getStroke(); + + g.setPaint(HIGHLIGHT_COLOR); + g.setStroke(THICK_TASK_BORDER_STROKE); + + RoundRectangle2D rect = new RoundRectangle2D.Double(x, y, width, height, 20, 20); + g.draw(rect); + + g.setPaint(originalPaint); + g.setStroke(originalStroke); + } + + /** + * task框自定义文字 + * @param name + * @param graphicInfo + * @param thickBorder + * @param scaleFactor + */ + @Override + protected void drawTask(String name, GraphicInfo graphicInfo, boolean thickBorder, double scaleFactor) { + + Paint originalPaint = g.getPaint(); + int x = (int) graphicInfo.getX(); + int y = (int) graphicInfo.getY(); + int width = (int) graphicInfo.getWidth(); + int height = (int) graphicInfo.getHeight(); + + // Create a new gradient paint for every task box, gradient depends on x and y and is not relative + g.setPaint(TASK_BOX_COLOR); + + int arcR = 6; + if (thickBorder) { + arcR = 3; + } + + // shape + RoundRectangle2D rect = new RoundRectangle2D.Double(x, y, width, height, arcR, arcR); + g.fill(rect); + g.setPaint(TASK_BORDER_COLOR); + + if (thickBorder) { + Stroke originalStroke = g.getStroke(); + g.setStroke(THICK_TASK_BORDER_STROKE); + g.draw(rect); + g.setStroke(originalStroke); + } else { + g.draw(rect); + } + + g.setPaint(originalPaint); + // text + if (scaleFactor == 1.0 && name != null && name.length() > 0) { + int boxWidth = width - (2 * TEXT_PADDING); + int boxHeight = height - 16 - ICON_PADDING - ICON_PADDING - MARKER_WIDTH - 2 - 2; + int boxX = x + width / 2 - boxWidth / 2; + int boxY = y + height / 2 - boxHeight / 2 + ICON_PADDING + ICON_PADDING - 2 - 2; + + drawMultilineCentredText(name, boxX, boxY, boxWidth, boxHeight); + } + } + + protected static Color EVENT_COLOR = new Color(255, 255, 255); + + /** + * 重写开始事件 + * @param graphicInfo + * @param image + * @param scaleFactor + */ + @Override + public void drawStartEvent(GraphicInfo graphicInfo, BufferedImage image, double scaleFactor) { + Paint originalPaint = g.getPaint(); + g.setPaint(EVENT_COLOR); + Ellipse2D circle = new Ellipse2D.Double(graphicInfo.getX(), graphicInfo.getY(), + graphicInfo.getWidth(), graphicInfo.getHeight()); + g.fill(circle); + g.setPaint(EVENT_BORDER_COLOR); + g.draw(circle); + g.setPaint(originalPaint); + if (image != null) { + // calculate coordinates to center image + int imageX = (int) Math.round(graphicInfo.getX() + (graphicInfo.getWidth() / 2) - (image.getWidth() / (2 * scaleFactor))); + int imageY = (int) Math.round(graphicInfo.getY() + (graphicInfo.getHeight() / 2) - (image.getHeight() / (2 * scaleFactor))); + g.drawImage(image, imageX, imageY, + (int) (image.getWidth() / scaleFactor), (int) (image.getHeight() / scaleFactor), null); + } + + } + + /** + * 重写结束事件 + * @param graphicInfo + * @param scaleFactor + */ + @Override + public void drawNoneEndEvent(GraphicInfo graphicInfo, double scaleFactor) { + Paint originalPaint = g.getPaint(); + Stroke originalStroke = g.getStroke(); + g.setPaint(EVENT_COLOR); + Ellipse2D circle = new Ellipse2D.Double(graphicInfo.getX(), graphicInfo.getY(), + graphicInfo.getWidth(), graphicInfo.getHeight()); + g.fill(circle); + g.setPaint(EVENT_BORDER_COLOR); +// g.setPaint(HIGHLIGHT_COLOR); + if (scaleFactor == 1.0) { + g.setStroke(END_EVENT_STROKE); + } else { + g.setStroke(new BasicStroke(2.0f)); + } + g.draw(circle); + g.setStroke(originalStroke); + g.setPaint(originalPaint); + } +} diff --git a/flowable/src/main/java/com/yyy/flowable/flow/CustomProcessDiagramGenerator.java b/flowable/src/main/java/com/yyy/flowable/flow/CustomProcessDiagramGenerator.java new file mode 100644 index 0000000..a320e17 --- /dev/null +++ b/flowable/src/main/java/com/yyy/flowable/flow/CustomProcessDiagramGenerator.java @@ -0,0 +1,400 @@ +package com.yyy.flowable.flow; + + +import org.flowable.bpmn.model.Process; +import org.flowable.bpmn.model.*; +import org.flowable.image.impl.DefaultProcessDiagramCanvas; +import org.flowable.image.impl.DefaultProcessDiagramGenerator; + +import java.util.Iterator; +import java.util.List; + +public class CustomProcessDiagramGenerator extends DefaultProcessDiagramGenerator { + @Override + protected DefaultProcessDiagramCanvas generateProcessDiagram(BpmnModel bpmnModel, String imageType, List highLightedActivities, List highLightedFlows, String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader, double scaleFactor, boolean drawSequenceFlowNameWithNoLabelDI) { + this.prepareBpmnModel(bpmnModel); + DefaultProcessDiagramCanvas processDiagramCanvas = initProcessDiagramCanvas(bpmnModel, imageType, activityFontName, labelFontName, annotationFontName, customClassLoader); + Iterator var13 = bpmnModel.getPools().iterator(); + + while (var13.hasNext()) { + Pool process = (Pool) var13.next(); + GraphicInfo subProcesses = bpmnModel.getGraphicInfo(process.getId()); + processDiagramCanvas.drawPoolOrLane(process.getName(), subProcesses, scaleFactor); + } + + var13 = bpmnModel.getProcesses().iterator(); + + Process process1; + Iterator subProcesses1; + while (var13.hasNext()) { + process1 = (Process) var13.next(); + subProcesses1 = process1.getLanes().iterator(); + + while (subProcesses1.hasNext()) { + Lane artifact = (Lane) subProcesses1.next(); + GraphicInfo subProcess = bpmnModel.getGraphicInfo(artifact.getId()); + processDiagramCanvas.drawPoolOrLane(artifact.getName(), subProcess, scaleFactor); + } + } + + var13 = bpmnModel.getProcesses().iterator(); + + while (var13.hasNext()) { + process1 = (Process) var13.next(); + subProcesses1 = process1.findFlowElementsOfType(FlowNode.class).iterator(); + + while (subProcesses1.hasNext()) { + FlowNode artifact1 = (FlowNode) subProcesses1.next(); + if (!this.isPartOfCollapsedSubProcess(artifact1, bpmnModel)) { + this.drawActivity(processDiagramCanvas, bpmnModel, artifact1, highLightedActivities, highLightedFlows, scaleFactor, Boolean.valueOf(drawSequenceFlowNameWithNoLabelDI)); + } + } + } + + var13 = bpmnModel.getProcesses().iterator(); + + label75: + while (true) { + List subProcesses2; + do { + if (!var13.hasNext()) { + return processDiagramCanvas; + } + + process1 = (Process) var13.next(); + subProcesses1 = process1.getArtifacts().iterator(); + + while (subProcesses1.hasNext()) { + Artifact artifact2 = (Artifact) subProcesses1.next(); + this.drawArtifact(processDiagramCanvas, bpmnModel, artifact2); + } + + subProcesses2 = process1.findFlowElementsOfType(SubProcess.class, true); + } while (subProcesses2 == null); + + Iterator artifact3 = subProcesses2.iterator(); + + while (true) { + GraphicInfo graphicInfo; + SubProcess subProcess1; + do { + do { + if (!artifact3.hasNext()) { + continue label75; + } + + subProcess1 = (SubProcess) artifact3.next(); + graphicInfo = bpmnModel.getGraphicInfo(subProcess1.getId()); + } while (graphicInfo != null && graphicInfo.getExpanded() != null && !graphicInfo.getExpanded().booleanValue()); + } while (this.isPartOfCollapsedSubProcess(subProcess1, bpmnModel)); + + Iterator var19 = subProcess1.getArtifacts().iterator(); + + while (var19.hasNext()) { + Artifact subProcessArtifact = (Artifact) var19.next(); + this.drawArtifact(processDiagramCanvas, bpmnModel, subProcessArtifact); + } + } + } + } + + protected static DefaultProcessDiagramCanvas initProcessDiagramCanvas(BpmnModel bpmnModel, String imageType, String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader) { + double minX = 1.7976931348623157E308D; + double maxX = 0.0D; + double minY = 1.7976931348623157E308D; + double maxY = 0.0D; + + GraphicInfo nrOfLanes; + for (Iterator flowNodes = bpmnModel.getPools().iterator(); flowNodes.hasNext(); maxY = nrOfLanes.getY() + nrOfLanes.getHeight()) { + Pool artifacts = (Pool) flowNodes.next(); + nrOfLanes = bpmnModel.getGraphicInfo(artifacts.getId()); + minX = nrOfLanes.getX(); + maxX = nrOfLanes.getX() + nrOfLanes.getWidth(); + minY = nrOfLanes.getY(); + } + + List var23 = gatherAllFlowNodes(bpmnModel); + Iterator var24 = var23.iterator(); + + label155: + while (var24.hasNext()) { + FlowNode var26 = (FlowNode) var24.next(); + GraphicInfo artifact = bpmnModel.getGraphicInfo(var26.getId()); + if (artifact.getX() + artifact.getWidth() > maxX) { + maxX = artifact.getX() + artifact.getWidth(); + } + + if (artifact.getX() < minX) { + minX = artifact.getX(); + } + + if (artifact.getY() + artifact.getHeight() > maxY) { + maxY = artifact.getY() + artifact.getHeight(); + } + + if (artifact.getY() < minY) { + minY = artifact.getY(); + } + + Iterator process = var26.getOutgoingFlows().iterator(); + + while (true) { + List l; + do { + if (!process.hasNext()) { + continue label155; + } + + SequenceFlow graphicInfoList = (SequenceFlow) process.next(); + l = bpmnModel.getFlowLocationGraphicInfo(graphicInfoList.getId()); + } while (l == null); + + Iterator graphicInfo = l.iterator(); + + while (graphicInfo.hasNext()) { + GraphicInfo graphicInfo1 = (GraphicInfo) graphicInfo.next(); + if (graphicInfo1.getX() > maxX) { + maxX = graphicInfo1.getX(); + } + + if (graphicInfo1.getX() < minX) { + minX = graphicInfo1.getX(); + } + + if (graphicInfo1.getY() > maxY) { + maxY = graphicInfo1.getY(); + } + + if (graphicInfo1.getY() < minY) { + minY = graphicInfo1.getY(); + } + } + } + } + + List var25 = gatherAllArtifacts(bpmnModel); + Iterator var27 = var25.iterator(); + + GraphicInfo var37; + while (var27.hasNext()) { + Artifact var29 = (Artifact) var27.next(); + GraphicInfo var31 = bpmnModel.getGraphicInfo(var29.getId()); + if (var31 != null) { + if (var31.getX() + var31.getWidth() > maxX) { + maxX = var31.getX() + var31.getWidth(); + } + + if (var31.getX() < minX) { + minX = var31.getX(); + } + + if (var31.getY() + var31.getHeight() > maxY) { + maxY = var31.getY() + var31.getHeight(); + } + + if (var31.getY() < minY) { + minY = var31.getY(); + } + } + + List var33 = bpmnModel.getFlowLocationGraphicInfo(var29.getId()); + if (var33 != null) { + Iterator var35 = var33.iterator(); + + while (var35.hasNext()) { + var37 = (GraphicInfo) var35.next(); + if (var37.getX() > maxX) { + maxX = var37.getX(); + } + + if (var37.getX() < minX) { + minX = var37.getX(); + } + + if (var37.getY() > maxY) { + maxY = var37.getY(); + } + + if (var37.getY() < minY) { + minY = var37.getY(); + } + } + } + } + + int var28 = 0; + Iterator var30 = bpmnModel.getProcesses().iterator(); + + while (var30.hasNext()) { + Process var32 = (Process) var30.next(); + Iterator var34 = var32.getLanes().iterator(); + + while (var34.hasNext()) { + Lane var36 = (Lane) var34.next(); + ++var28; + var37 = bpmnModel.getGraphicInfo(var36.getId()); + if (var37.getX() + var37.getWidth() > maxX) { + maxX = var37.getX() + var37.getWidth(); + } + + if (var37.getX() < minX) { + minX = var37.getX(); + } + + if (var37.getY() + var37.getHeight() > maxY) { + maxY = var37.getY() + var37.getHeight(); + } + + if (var37.getY() < minY) { + minY = var37.getY(); + } + } + } + + if (var23.isEmpty() && bpmnModel.getPools().isEmpty() && var28 == 0) { + minX = 0.0D; + minY = 0.0D; + } + + return new CustomProcessDiagramCanvas((int) maxX + 10, (int) maxY + 10, (int) minX, (int) minY, imageType, activityFontName, labelFontName, annotationFontName, customClassLoader); + } + + + private static void drawHighLight(DefaultProcessDiagramCanvas processDiagramCanvas, GraphicInfo graphicInfo) { + processDiagramCanvas.drawHighLight((int) graphicInfo.getX(), (int) graphicInfo.getY(), (int) graphicInfo.getWidth(), (int) graphicInfo.getHeight()); + + } + + private static void drawHighLightNow(CustomProcessDiagramCanvas processDiagramCanvas, GraphicInfo graphicInfo) { + processDiagramCanvas.drawHighLightNow((int) graphicInfo.getX(), (int) graphicInfo.getY(), (int) graphicInfo.getWidth(), (int) graphicInfo.getHeight()); + + } + + private static void drawHighLightEnd(CustomProcessDiagramCanvas processDiagramCanvas, GraphicInfo graphicInfo) { + processDiagramCanvas.drawHighLightEnd((int) graphicInfo.getX(), (int) graphicInfo.getY(), (int) graphicInfo.getWidth(), (int) graphicInfo.getHeight()); + + } + + @Override + protected void drawActivity(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, + FlowNode flowNode, List highLightedActivities, List highLightedFlows, double scaleFactor, Boolean drawSequenceFlowNameWithNoLabelDI) { + + ActivityDrawInstruction drawInstruction = activityDrawInstructions.get(flowNode.getClass()); + if (drawInstruction != null) { + + drawInstruction.draw(processDiagramCanvas, bpmnModel, flowNode); + + // Gather info on the multi instance marker + boolean multiInstanceSequential = false; + boolean multiInstanceParallel = false; + boolean collapsed = false; + if (flowNode instanceof Activity) { + Activity activity = (Activity) flowNode; + MultiInstanceLoopCharacteristics multiInstanceLoopCharacteristics = activity.getLoopCharacteristics(); + if (multiInstanceLoopCharacteristics != null) { + multiInstanceSequential = multiInstanceLoopCharacteristics.isSequential(); + multiInstanceParallel = !multiInstanceSequential; + } + } + + // Gather info on the collapsed marker + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); + if (flowNode instanceof SubProcess) { + collapsed = graphicInfo.getExpanded() != null && !graphicInfo.getExpanded(); + } else if (flowNode instanceof CallActivity) { + collapsed = true; + } + + if (scaleFactor == 1.0) { + // Actually draw the markers + processDiagramCanvas.drawActivityMarkers((int) graphicInfo.getX(), (int) graphicInfo.getY(), (int) graphicInfo.getWidth(), (int) graphicInfo.getHeight(), + multiInstanceSequential, multiInstanceParallel, collapsed); + } + + // Draw highlighted activities + if (highLightedActivities.contains(flowNode.getId())) { + + if (highLightedActivities.get(highLightedActivities.size() - 1).equals(flowNode.getId()) + && !"endenv".equals(flowNode.getId())) { + if ((flowNode.getId().contains("Event_"))) { + drawHighLightEnd((CustomProcessDiagramCanvas) processDiagramCanvas, bpmnModel.getGraphicInfo(flowNode.getId())); + } else { + drawHighLightNow((CustomProcessDiagramCanvas) processDiagramCanvas, bpmnModel.getGraphicInfo(flowNode.getId())); + } + } else { + drawHighLight(processDiagramCanvas, bpmnModel.getGraphicInfo(flowNode.getId())); + } + + + } + + } + + // Outgoing transitions of activity + for (SequenceFlow sequenceFlow : flowNode.getOutgoingFlows()) { + boolean highLighted = (highLightedFlows.contains(sequenceFlow.getId())); + String defaultFlow = null; + if (flowNode instanceof Activity) { + defaultFlow = ((Activity) flowNode).getDefaultFlow(); + } else if (flowNode instanceof Gateway) { + defaultFlow = ((Gateway) flowNode).getDefaultFlow(); + } + + boolean isDefault = false; + if (defaultFlow != null && defaultFlow.equalsIgnoreCase(sequenceFlow.getId())) { + isDefault = true; + } + boolean drawConditionalIndicator = sequenceFlow.getConditionExpression() != null && !(flowNode instanceof Gateway); + + String sourceRef = sequenceFlow.getSourceRef(); + String targetRef = sequenceFlow.getTargetRef(); + FlowElement sourceElement = bpmnModel.getFlowElement(sourceRef); + FlowElement targetElement = bpmnModel.getFlowElement(targetRef); + List graphicInfoList = bpmnModel.getFlowLocationGraphicInfo(sequenceFlow.getId()); + if (graphicInfoList != null && graphicInfoList.size() > 0) { + graphicInfoList = connectionPerfectionizer(processDiagramCanvas, bpmnModel, sourceElement, targetElement, graphicInfoList); + int xPoints[] = new int[graphicInfoList.size()]; + int yPoints[] = new int[graphicInfoList.size()]; + + for (int i = 1; i < graphicInfoList.size(); i++) { + GraphicInfo graphicInfo = graphicInfoList.get(i); + GraphicInfo previousGraphicInfo = graphicInfoList.get(i - 1); + + if (i == 1) { + xPoints[0] = (int) previousGraphicInfo.getX(); + yPoints[0] = (int) previousGraphicInfo.getY(); + } + xPoints[i] = (int) graphicInfo.getX(); + yPoints[i] = (int) graphicInfo.getY(); + + } + + processDiagramCanvas.drawSequenceflow(xPoints, yPoints, drawConditionalIndicator, isDefault, highLighted, scaleFactor); + + + // Draw sequenceflow label + GraphicInfo labelGraphicInfo = bpmnModel.getLabelGraphicInfo(sequenceFlow.getId()); + if (labelGraphicInfo != null) { + processDiagramCanvas.drawLabel(sequenceFlow.getName(), labelGraphicInfo, false); + } else { + if (drawSequenceFlowNameWithNoLabelDI) { + GraphicInfo lineCenter = getLineCenter(graphicInfoList); + processDiagramCanvas.drawLabel(sequenceFlow.getName(), lineCenter, false); + } + + } + } + } + + // Nested elements + if (flowNode instanceof FlowElementsContainer) { + for (FlowElement nestedFlowElement : ((FlowElementsContainer) flowNode).getFlowElements()) { + if (nestedFlowElement instanceof FlowNode && !isPartOfCollapsedSubProcess(nestedFlowElement, bpmnModel)) { + drawActivity(processDiagramCanvas, bpmnModel, (FlowNode) nestedFlowElement, + highLightedActivities, highLightedFlows, scaleFactor, drawSequenceFlowNameWithNoLabelDI); + } + } + } + } +} + diff --git a/flowable/src/main/java/com/yyy/flowable/flow/FindNextNodeUtil.java b/flowable/src/main/java/com/yyy/flowable/flow/FindNextNodeUtil.java new file mode 100644 index 0000000..49a94d2 --- /dev/null +++ b/flowable/src/main/java/com/yyy/flowable/flow/FindNextNodeUtil.java @@ -0,0 +1,253 @@ +package com.yyy.flowable.flow; + +import com.googlecode.aviator.AviatorEvaluator; +import com.googlecode.aviator.Expression; +import org.flowable.bpmn.model.Process; +import org.flowable.bpmn.model.*; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.repository.ProcessDefinition; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +public class FindNextNodeUtil { + + /** + * 获取下一步骤的用户任务 + * + * @param repositoryService + * @param map + * @return + */ + public static List getNextUserTasks(RepositoryService repositoryService, org.flowable.task.api.Task task, Map map) { + List data = new ArrayList<>(); + ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(task.getProcessDefinitionId()).singleResult(); + BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinition.getId()); + Process mainProcess = bpmnModel.getMainProcess(); + Collection flowElements = mainProcess.getFlowElements(); + String key = task.getTaskDefinitionKey(); + FlowElement flowElement = bpmnModel.getFlowElement(key); + next(flowElements, flowElement, map, data); + return data; + } + + /** + * 启动流程时获取下一步骤的用户任务 + * + * @param repositoryService + * @param map + * @return + */ + public static List getNextUserTasksByStart(RepositoryService repositoryService, ProcessDefinition processDefinition, Map map) { + List data = new ArrayList<>(); + BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinition.getId()); + Process mainProcess = bpmnModel.getMainProcess(); + Collection flowElements = mainProcess.getFlowElements(); + String key = null; + // 找到开始节点 并获取唯一key + for (FlowElement flowElement : flowElements) { + if (flowElement instanceof StartEvent) { + key = flowElement.getId(); + break; + } + } + FlowElement flowElement = bpmnModel.getFlowElement(key); + next(flowElements, flowElement, map, data); + return data; + } + + + + /** + * 查找下一节点 + * + * @param flowElements + * @param flowElement + * @param map + * @param nextUser + */ + public static void next(Collection flowElements, FlowElement flowElement, Map map, List nextUser) { + //如果是结束节点 + if (flowElement instanceof EndEvent) { + //如果是子任务的结束节点 + if (getSubProcess(flowElements, flowElement) != null) { + flowElement = getSubProcess(flowElements, flowElement); + } + } + //获取Task的出线信息--可以拥有多个 + List outGoingFlows = null; + if (flowElement instanceof Task) { + outGoingFlows = ((Task) flowElement).getOutgoingFlows(); + } else if (flowElement instanceof Gateway) { + outGoingFlows = ((Gateway) flowElement).getOutgoingFlows(); + } else if (flowElement instanceof StartEvent) { + outGoingFlows = ((StartEvent) flowElement).getOutgoingFlows(); + } else if (flowElement instanceof SubProcess) { + outGoingFlows = ((SubProcess) flowElement).getOutgoingFlows(); + } else if (flowElement instanceof CallActivity) { + outGoingFlows = ((CallActivity) flowElement).getOutgoingFlows(); + } + if (outGoingFlows != null && outGoingFlows.size() > 0) { + //遍历所有的出线--找到可以正确执行的那一条 + for (SequenceFlow sequenceFlow : outGoingFlows) { + //1.有表达式,且为true + //2.无表达式 + String expression = sequenceFlow.getConditionExpression(); + if (expression == null || + expressionResult(map, expression.substring(expression.lastIndexOf("{") + 1, expression.lastIndexOf("}")))) { + //出线的下一节点 + String nextFlowElementID = sequenceFlow.getTargetRef(); + if (checkSubProcess(nextFlowElementID, flowElements, nextUser)) { + continue; + } + + //查询下一节点的信息 + FlowElement nextFlowElement = getFlowElementById(nextFlowElementID, flowElements); + //调用流程 + if (nextFlowElement instanceof CallActivity) { + CallActivity ca = (CallActivity) nextFlowElement; + if (ca.getLoopCharacteristics() != null) { + UserTask userTask = new UserTask(); + userTask.setId(ca.getId()); + + userTask.setId(ca.getId()); + userTask.setLoopCharacteristics(ca.getLoopCharacteristics()); + userTask.setName(ca.getName()); + nextUser.add(userTask); + } + next(flowElements, nextFlowElement, map, nextUser); + } + //用户任务 + if (nextFlowElement instanceof UserTask) { + nextUser.add((UserTask) nextFlowElement); + } + //排他网关 + else if (nextFlowElement instanceof ExclusiveGateway) { + next(flowElements, nextFlowElement, map, nextUser); + } + //并行网关 + else if (nextFlowElement instanceof ParallelGateway) { + next(flowElements, nextFlowElement, map, nextUser); + } + //接收任务 + else if (nextFlowElement instanceof ReceiveTask) { + next(flowElements, nextFlowElement, map, nextUser); + } + //服务任务 + else if (nextFlowElement instanceof ServiceTask) { + next(flowElements, nextFlowElement, map, nextUser); + } + //子任务的起点 + else if (nextFlowElement instanceof StartEvent) { + next(flowElements, nextFlowElement, map, nextUser); + } + //结束节点 + else if (nextFlowElement instanceof EndEvent) { + next(flowElements, nextFlowElement, map, nextUser); + } + } + } + } + } + + /** + * 判断是否是多实例子流程并且需要设置集合类型变量 + */ + public static boolean checkSubProcess(String Id, Collection flowElements, List nextUser) { + for (FlowElement flowElement1 : flowElements) { + if (flowElement1 instanceof SubProcess && flowElement1.getId().equals(Id)) { + + SubProcess sp = (SubProcess) flowElement1; + if (sp.getLoopCharacteristics() != null) { + String inputDataItem = sp.getLoopCharacteristics().getInputDataItem(); + UserTask userTask = new UserTask(); + userTask.setId(sp.getId()); + userTask.setLoopCharacteristics(sp.getLoopCharacteristics()); + userTask.setName(sp.getName()); + nextUser.add(userTask); + return true; + } + } + } + + return false; + + } + + /** + * 查询一个节点的是否子任务中的节点,如果是,返回子任务 + * + * @param flowElements 全流程的节点集合 + * @param flowElement 当前节点 + * @return + */ + public static FlowElement getSubProcess(Collection flowElements, FlowElement flowElement) { + for (FlowElement flowElement1 : flowElements) { + if (flowElement1 instanceof SubProcess) { + for (FlowElement flowElement2 : ((SubProcess) flowElement1).getFlowElements()) { + if (flowElement.equals(flowElement2)) { + return flowElement1; + } + } + } + } + return null; + } + + + /** + * 根据ID查询流程节点对象, 如果是子任务,则返回子任务的开始节点 + * + * @param Id 节点ID + * @param flowElements 流程节点集合 + * @return + */ + public static FlowElement getFlowElementById(String Id, Collection flowElements) { + for (FlowElement flowElement : flowElements) { + if (flowElement.getId().equals(Id)) { + //如果是子任务,则查询出子任务的开始节点 + if (flowElement instanceof SubProcess) { + return getStartFlowElement(((SubProcess) flowElement).getFlowElements()); + } + return flowElement; + } + if (flowElement instanceof SubProcess) { + FlowElement flowElement1 = getFlowElementById(Id, ((SubProcess) flowElement).getFlowElements()); + if (flowElement1 != null) { + return flowElement1; + } + } + } + return null; + } + + /** + * 返回流程的开始节点 + * + * @param flowElements 节点集合 + * @description: + */ + public static FlowElement getStartFlowElement(Collection flowElements) { + for (FlowElement flowElement : flowElements) { + if (flowElement instanceof StartEvent) { + return flowElement; + } + } + return null; + } + + /** + * 校验el表达式 + * + * @param map + * @param expression + * @return + */ + public static boolean expressionResult(Map map, String expression) { + Expression exp = AviatorEvaluator.compile(expression); + final Object execute = exp.execute(map); + return Boolean.parseBoolean(String.valueOf(execute)); + } +} diff --git a/flowable/src/main/java/com/yyy/flowable/flow/FlowableUtils.java b/flowable/src/main/java/com/yyy/flowable/flow/FlowableUtils.java new file mode 100644 index 0000000..cb09ebc --- /dev/null +++ b/flowable/src/main/java/com/yyy/flowable/flow/FlowableUtils.java @@ -0,0 +1,585 @@ +package com.yyy.flowable.flow; + +import lombok.extern.slf4j.Slf4j; +import org.flowable.bpmn.model.*; +import org.flowable.engine.impl.bpmn.behavior.ParallelMultiInstanceBehavior; +import org.flowable.engine.impl.bpmn.behavior.SequentialMultiInstanceBehavior; +import org.flowable.task.api.history.HistoricTaskInstance; + +import java.util.*; + +@Slf4j +public class FlowableUtils { + + /** + * 根据节点,获取入口连线 + * @param source + * @return + */ + public static List getElementIncomingFlows(FlowElement source) { + List sequenceFlows = null; + if (source instanceof FlowNode) { + sequenceFlows = ((FlowNode) source).getIncomingFlows(); + } else if (source instanceof Gateway) { + sequenceFlows = ((Gateway) source).getIncomingFlows(); + } else if (source instanceof SubProcess) { + sequenceFlows = ((SubProcess) source).getIncomingFlows(); + } else if (source instanceof StartEvent) { + sequenceFlows = ((StartEvent) source).getIncomingFlows(); + } else if (source instanceof EndEvent) { + sequenceFlows = ((EndEvent) source).getIncomingFlows(); + } + return sequenceFlows; + } + + /** + * 根据节点,获取出口连线 + * @param source + * @return + */ + public static List getElementOutgoingFlows(FlowElement source) { + List sequenceFlows = null; + if (source instanceof FlowNode) { + sequenceFlows = ((FlowNode) source).getOutgoingFlows(); + } else if (source instanceof Gateway) { + sequenceFlows = ((Gateway) source).getOutgoingFlows(); + } else if (source instanceof SubProcess) { + sequenceFlows = ((SubProcess) source).getOutgoingFlows(); + } else if (source instanceof StartEvent) { + sequenceFlows = ((StartEvent) source).getOutgoingFlows(); + } else if (source instanceof EndEvent) { + sequenceFlows = ((EndEvent) source).getOutgoingFlows(); + } + return sequenceFlows; + } + + /** + * 获取全部节点列表,包含子流程节点 + * @param flowElements + * @param allElements + * @return + */ + public static Collection getAllElements(Collection flowElements, Collection allElements) { + allElements = allElements == null ? new ArrayList<>() : allElements; + + for (FlowElement flowElement : flowElements) { + allElements.add(flowElement); + if (flowElement instanceof SubProcess) { + // 继续深入子流程,进一步获取子流程 + allElements = FlowableUtils.getAllElements(((SubProcess) flowElement).getFlowElements(), allElements); + } + } + return allElements; + } + + /** + * 迭代获取父级任务节点列表,向前找 + * @param source 起始节点 + * @param hasSequenceFlow 已经经过的连线的 ID,用于判断线路是否重复 + * @param userTaskList 已找到的用户任务节点 + * @return + */ + public static List iteratorFindParentUserTasks(FlowElement source, Set hasSequenceFlow, List userTaskList) { + userTaskList = userTaskList == null ? new ArrayList<>() : userTaskList; + hasSequenceFlow = hasSequenceFlow == null ? new HashSet<>() : hasSequenceFlow; + + // 如果该节点为开始节点,且存在上级子节点,则顺着上级子节点继续迭代 + if (source instanceof StartEvent && source.getSubProcess() != null) { + userTaskList = iteratorFindParentUserTasks(source.getSubProcess(), hasSequenceFlow, userTaskList); + } + + // 根据类型,获取入口连线 + List sequenceFlows = getElementIncomingFlows(source); + + if (sequenceFlows != null) { + // 循环找到目标元素 + for (SequenceFlow sequenceFlow: sequenceFlows) { + // 如果发现连线重复,说明循环了,跳过这个循环 + if (hasSequenceFlow.contains(sequenceFlow.getId())) { + continue; + } + // 添加已经走过的连线 + hasSequenceFlow.add(sequenceFlow.getId()); + // 类型为用户节点,则新增父级节点 + if (sequenceFlow.getSourceFlowElement() instanceof UserTask) { + userTaskList.add((UserTask) sequenceFlow.getSourceFlowElement()); + continue; + } + // 类型为子流程,则添加子流程开始节点出口处相连的节点 + if (sequenceFlow.getSourceFlowElement() instanceof SubProcess) { + // 获取子流程用户任务节点 + List childUserTaskList = findChildProcessUserTasks((StartEvent) ((SubProcess) sequenceFlow.getSourceFlowElement()).getFlowElements().toArray()[0], null, null); + // 如果找到节点,则说明该线路找到节点,不继续向下找,反之继续 + if (childUserTaskList != null && childUserTaskList.size() > 0) { + userTaskList.addAll(childUserTaskList); + continue; + } + } + // 继续迭代 + userTaskList = iteratorFindParentUserTasks(sequenceFlow.getSourceFlowElement(), hasSequenceFlow, userTaskList); + } + } + return userTaskList; + } + + /** + * 根据正在运行的任务节点,迭代获取子级任务节点列表,向后找 + * @param source 起始节点(退回节点) + * @param runTaskKeyList 正在运行的任务 Key,用于校验任务节点是否是正在运行的节点 + * @param hasSequenceFlow 已经经过的连线的 ID,用于判断线路是否重复 + * @param userTaskList 需要撤回的用户任务列表 + * @return + */ + public static List iteratorFindChildUserTasks(FlowElement source, List runTaskKeyList, Set hasSequenceFlow, List userTaskList) { + hasSequenceFlow = hasSequenceFlow == null ? new HashSet<>() : hasSequenceFlow; + userTaskList = userTaskList == null ? new ArrayList<>() : userTaskList; + + // 如果该节点为开始节点,且存在上级子节点,则顺着上级子节点继续迭代 + if (source instanceof EndEvent && source.getSubProcess() != null) { + userTaskList = iteratorFindChildUserTasks(source.getSubProcess(), runTaskKeyList, hasSequenceFlow, userTaskList); + } + + // 根据类型,获取出口连线 + List sequenceFlows = getElementOutgoingFlows(source); + + if (sequenceFlows != null) { + // 循环找到目标元素 + for (SequenceFlow sequenceFlow: sequenceFlows) { + // 如果发现连线重复,说明循环了,跳过这个循环 + if (hasSequenceFlow.contains(sequenceFlow.getId())) { + continue; + } + // 添加已经走过的连线 + hasSequenceFlow.add(sequenceFlow.getId()); + // 如果为用户任务类型,且任务节点的 Key 正在运行的任务中存在,添加 + if (sequenceFlow.getTargetFlowElement() instanceof UserTask && runTaskKeyList.contains((sequenceFlow.getTargetFlowElement()).getId())) { + userTaskList.add((UserTask) sequenceFlow.getTargetFlowElement()); + continue; + } + // 如果节点为子流程节点情况,则从节点中的第一个节点开始获取 + if (sequenceFlow.getTargetFlowElement() instanceof SubProcess) { + List childUserTaskList = iteratorFindChildUserTasks((FlowElement) (((SubProcess) sequenceFlow.getTargetFlowElement()).getFlowElements().toArray()[0]), runTaskKeyList, hasSequenceFlow, null); + // 如果找到节点,则说明该线路找到节点,不继续向下找,反之继续 + if (childUserTaskList != null && childUserTaskList.size() > 0) { + userTaskList.addAll(childUserTaskList); + continue; + } + } + // 继续迭代 + userTaskList = iteratorFindChildUserTasks(sequenceFlow.getTargetFlowElement(), runTaskKeyList, hasSequenceFlow, userTaskList); + } + } + return userTaskList; + } + + /** + * 迭代获取子流程用户任务节点 + * @param source 起始节点 + * @param hasSequenceFlow 已经经过的连线的 ID,用于判断线路是否重复 + * @param userTaskList 需要撤回的用户任务列表 + * @return + */ + public static List findChildProcessUserTasks(FlowElement source, Set hasSequenceFlow, List userTaskList) { + hasSequenceFlow = hasSequenceFlow == null ? new HashSet<>() : hasSequenceFlow; + userTaskList = userTaskList == null ? new ArrayList<>() : userTaskList; + + // 根据类型,获取出口连线 + List sequenceFlows = getElementOutgoingFlows(source); + + if (sequenceFlows != null) { + // 循环找到目标元素 + for (SequenceFlow sequenceFlow: sequenceFlows) { + // 如果发现连线重复,说明循环了,跳过这个循环 + if (hasSequenceFlow.contains(sequenceFlow.getId())) { + continue; + } + // 添加已经走过的连线 + hasSequenceFlow.add(sequenceFlow.getId()); + // 如果为用户任务类型,且任务节点的 Key 正在运行的任务中存在,添加 + if (sequenceFlow.getTargetFlowElement() instanceof UserTask) { + userTaskList.add((UserTask) sequenceFlow.getTargetFlowElement()); + continue; + } + // 如果节点为子流程节点情况,则从节点中的第一个节点开始获取 + if (sequenceFlow.getTargetFlowElement() instanceof SubProcess) { + List childUserTaskList = findChildProcessUserTasks((FlowElement) (((SubProcess) sequenceFlow.getTargetFlowElement()).getFlowElements().toArray()[0]), hasSequenceFlow, null); + // 如果找到节点,则说明该线路找到节点,不继续向下找,反之继续 + if (childUserTaskList != null && childUserTaskList.size() > 0) { + userTaskList.addAll(childUserTaskList); + continue; + } + } + // 继续迭代 + userTaskList = findChildProcessUserTasks(sequenceFlow.getTargetFlowElement(), hasSequenceFlow, userTaskList); + } + } + return userTaskList; + } + + /** + * 从后向前寻路,获取所有脏线路上的点 + * @param source 起始节点 + * @param passRoads 已经经过的点集合 + * @param hasSequenceFlow 已经经过的连线的 ID,用于判断线路是否重复 + * @param targets 目标脏线路终点 + * @param dirtyRoads 确定为脏数据的点,因为不需要重复,因此使用 set 存储 + * @return + */ + public static Set iteratorFindDirtyRoads(FlowElement source, List passRoads, Set hasSequenceFlow, List targets, Set dirtyRoads) { + passRoads = passRoads == null ? new ArrayList<>() : passRoads; + dirtyRoads = dirtyRoads == null ? new HashSet<>() : dirtyRoads; + hasSequenceFlow = hasSequenceFlow == null ? new HashSet<>() : hasSequenceFlow; + + // 如果该节点为开始节点,且存在上级子节点,则顺着上级子节点继续迭代 + if (source instanceof StartEvent && source.getSubProcess() != null) { + dirtyRoads = iteratorFindDirtyRoads(source.getSubProcess(), passRoads, hasSequenceFlow, targets, dirtyRoads); + } + + // 根据类型,获取入口连线 + List sequenceFlows = getElementIncomingFlows(source); + + if (sequenceFlows != null) { + // 循环找到目标元素 + for (SequenceFlow sequenceFlow: sequenceFlows) { + // 如果发现连线重复,说明循环了,跳过这个循环 + if (hasSequenceFlow.contains(sequenceFlow.getId())) { + continue; + } + // 添加已经走过的连线 + hasSequenceFlow.add(sequenceFlow.getId()); + // 新增经过的路线 + passRoads.add(sequenceFlow.getSourceFlowElement().getId()); + // 如果此点为目标点,确定经过的路线为脏线路,添加点到脏线路中,然后找下个连线 + if (targets.contains(sequenceFlow.getSourceFlowElement().getId())) { + dirtyRoads.addAll(passRoads); + continue; + } + // 如果该节点为开始节点,且存在上级子节点,则顺着上级子节点继续迭代 + if (sequenceFlow.getSourceFlowElement() instanceof SubProcess) { + dirtyRoads = findChildProcessAllDirtyRoad((StartEvent) ((SubProcess) sequenceFlow.getSourceFlowElement()).getFlowElements().toArray()[0], null, dirtyRoads); + // 是否存在子流程上,true 是,false 否 + Boolean isInChildProcess = dirtyTargetInChildProcess((StartEvent) ((SubProcess) sequenceFlow.getSourceFlowElement()).getFlowElements().toArray()[0], null, targets, null); + if (isInChildProcess) { + // 已在子流程上找到,该路线结束 + continue; + } + } + // 继续迭代 + dirtyRoads = iteratorFindDirtyRoads(sequenceFlow.getSourceFlowElement(), passRoads, hasSequenceFlow, targets, dirtyRoads); + } + } + return dirtyRoads; + } + + /** + * 迭代获取子流程脏路线 + * 说明,假如回退的点就是子流程,那么也肯定会回退到子流程最初的用户任务节点,因此子流程中的节点全是脏路线 + * @param source 起始节点 + * @param hasSequenceFlow 已经经过的连线的 ID,用于判断线路是否重复 + * @param dirtyRoads 确定为脏数据的点,因为不需要重复,因此使用 set 存储 + * @return + */ + public static Set findChildProcessAllDirtyRoad(FlowElement source, Set hasSequenceFlow, Set dirtyRoads) { + hasSequenceFlow = hasSequenceFlow == null ? new HashSet<>() : hasSequenceFlow; + dirtyRoads = dirtyRoads == null ? new HashSet<>() : dirtyRoads; + + // 根据类型,获取出口连线 + List sequenceFlows = getElementOutgoingFlows(source); + + if (sequenceFlows != null) { + // 循环找到目标元素 + for (SequenceFlow sequenceFlow: sequenceFlows) { + // 如果发现连线重复,说明循环了,跳过这个循环 + if (hasSequenceFlow.contains(sequenceFlow.getId())) { + continue; + } + // 添加已经走过的连线 + hasSequenceFlow.add(sequenceFlow.getId()); + // 添加脏路线 + dirtyRoads.add(sequenceFlow.getTargetFlowElement().getId()); + // 如果节点为子流程节点情况,则从节点中的第一个节点开始获取 + if (sequenceFlow.getTargetFlowElement() instanceof SubProcess) { + dirtyRoads = findChildProcessAllDirtyRoad((FlowElement) (((SubProcess) sequenceFlow.getTargetFlowElement()).getFlowElements().toArray()[0]), hasSequenceFlow, dirtyRoads); + } + // 继续迭代 + dirtyRoads = findChildProcessAllDirtyRoad(sequenceFlow.getTargetFlowElement(), hasSequenceFlow, dirtyRoads); + } + } + return dirtyRoads; + } + + /** + * 判断脏路线结束节点是否在子流程上 + * @param source 起始节点 + * @param hasSequenceFlow 已经经过的连线的 ID,用于判断线路是否重复 + * @param targets 判断脏路线节点是否存在子流程上,只要存在一个,说明脏路线只到子流程为止 + * @param inChildProcess 是否存在子流程上,true 是,false 否 + * @return + */ + public static Boolean dirtyTargetInChildProcess(FlowElement source, Set hasSequenceFlow, List targets, Boolean inChildProcess) { + hasSequenceFlow = hasSequenceFlow == null ? new HashSet<>() : hasSequenceFlow; + inChildProcess = inChildProcess != null && inChildProcess; + + // 根据类型,获取出口连线 + List sequenceFlows = getElementOutgoingFlows(source); + + if (sequenceFlows != null && !inChildProcess) { + // 循环找到目标元素 + for (SequenceFlow sequenceFlow: sequenceFlows) { + // 如果发现连线重复,说明循环了,跳过这个循环 + if (hasSequenceFlow.contains(sequenceFlow.getId())) { + continue; + } + // 添加已经走过的连线 + hasSequenceFlow.add(sequenceFlow.getId()); + // 如果发现目标点在子流程上存在,说明只到子流程为止 + if (targets.contains(sequenceFlow.getTargetFlowElement().getId())) { + inChildProcess = true; + break; + } + // 如果节点为子流程节点情况,则从节点中的第一个节点开始获取 + if (sequenceFlow.getTargetFlowElement() instanceof SubProcess) { + inChildProcess = dirtyTargetInChildProcess((FlowElement) (((SubProcess) sequenceFlow.getTargetFlowElement()).getFlowElements().toArray()[0]), hasSequenceFlow, targets, inChildProcess); + } + // 继续迭代 + inChildProcess = dirtyTargetInChildProcess(sequenceFlow.getTargetFlowElement(), hasSequenceFlow, targets, inChildProcess); + } + } + return inChildProcess; + } + + /** + * 迭代从后向前扫描,判断目标节点相对于当前节点是否是串行 + * 不存在直接回退到子流程中的情况,但存在从子流程出去到父流程情况 + * @param source 起始节点 + * @param isSequential 是否串行 + * @param hasSequenceFlow 已经经过的连线的 ID,用于判断线路是否重复 + * @param targetKsy 目标节点 + * @return + */ + public static Boolean iteratorCheckSequentialReferTarget(FlowElement source, String targetKsy, Set hasSequenceFlow, Boolean isSequential) { + isSequential = isSequential == null || isSequential; + hasSequenceFlow = hasSequenceFlow == null ? new HashSet<>() : hasSequenceFlow; + + // 如果该节点为开始节点,且存在上级子节点,则顺着上级子节点继续迭代 + if (source instanceof StartEvent && source.getSubProcess() != null) { + isSequential = iteratorCheckSequentialReferTarget(source.getSubProcess(), targetKsy, hasSequenceFlow, isSequential); + } + + // 根据类型,获取入口连线 + List sequenceFlows = getElementIncomingFlows(source); + + if (sequenceFlows != null) { + // 循环找到目标元素 + for (SequenceFlow sequenceFlow: sequenceFlows) { + // 如果发现连线重复,说明循环了,跳过这个循环 + if (hasSequenceFlow.contains(sequenceFlow.getId())) { + continue; + } + // 添加已经走过的连线 + hasSequenceFlow.add(sequenceFlow.getId()); + // 如果目标节点已被判断为并行,后面都不需要执行,直接返回 + if (!isSequential) { + break; + } + // 这条线路存在目标节点,这条线路完成,进入下个线路 + if (targetKsy.equals(sequenceFlow.getSourceFlowElement().getId())) { + continue; + } + if (sequenceFlow.getSourceFlowElement() instanceof StartEvent) { + isSequential = false; + break; + } + // 否则就继续迭代 + isSequential = iteratorCheckSequentialReferTarget(sequenceFlow.getSourceFlowElement(), targetKsy, hasSequenceFlow, isSequential); + } + } + return isSequential; + } + + /** + * 从后向前寻路,获取到达节点的所有路线 + * 不存在直接回退到子流程,但是存在回退到父级流程的情况 + * @param source 起始节点 + * @param passRoads 已经经过的点集合 + * @param roads 路线 + * @return + */ + public static List> findRoad(FlowElement source, List passRoads, Set hasSequenceFlow, List> roads) { + passRoads = passRoads == null ? new ArrayList<>() : passRoads; + roads = roads == null ? new ArrayList<>() : roads; + hasSequenceFlow = hasSequenceFlow == null ? new HashSet<>() : hasSequenceFlow; + + // 如果该节点为开始节点,且存在上级子节点,则顺着上级子节点继续迭代 + if (source instanceof StartEvent && source.getSubProcess() != null) { + roads = findRoad(source.getSubProcess(), passRoads, hasSequenceFlow, roads); + } + + // 根据类型,获取入口连线 + List sequenceFlows = getElementIncomingFlows(source); + + if (sequenceFlows != null && sequenceFlows.size() != 0) { + for (SequenceFlow sequenceFlow: sequenceFlows) { + // 如果发现连线重复,说明循环了,跳过这个循环 + if (hasSequenceFlow.contains(sequenceFlow.getId())) { + continue; + } + // 添加已经走过的连线 + hasSequenceFlow.add(sequenceFlow.getId()); + // 添加经过路线 + if (sequenceFlow.getSourceFlowElement() instanceof UserTask) { + passRoads.add((UserTask) sequenceFlow.getSourceFlowElement()); + } + // 继续迭代 + roads = findRoad(sequenceFlow.getSourceFlowElement(), passRoads, hasSequenceFlow, roads); + } + } else { + // 添加路线 + roads.add(passRoads); + } + return roads; + } + + /** + * 历史节点数据清洗,清洗掉又回滚导致的脏数据 + * @param allElements 全部节点信息 + * @param historicTaskInstanceList 历史任务实例信息,数据采用开始时间升序 + * @return + */ + public static List historicTaskInstanceClean(Collection allElements, List historicTaskInstanceList) { + // 会签节点收集 + List multiTask = new ArrayList<>(); + allElements.forEach(flowElement -> { + if (flowElement instanceof UserTask) { + // 如果该节点的行为为会签行为,说明该节点为会签节点 + if (((UserTask) flowElement).getBehavior() instanceof ParallelMultiInstanceBehavior || ((UserTask) flowElement).getBehavior() instanceof SequentialMultiInstanceBehavior) { + multiTask.add(flowElement.getId()); + } + } + }); + // 循环放入栈,栈 LIFO:后进先出 + Stack stack = new Stack<>(); + historicTaskInstanceList.forEach(stack::push); + // 清洗后的历史任务实例 + List lastHistoricTaskInstanceList = new ArrayList<>(); + // 网关存在可能只走了部分分支情况,且还存在跳转废弃数据以及其他分支数据的干扰,因此需要对历史节点数据进行清洗 + // 临时用户任务 key + StringBuilder userTaskKey = null; + // 临时被删掉的任务 key,存在并行情况 + List deleteKeyList = new ArrayList<>(); + // 临时脏数据线路 + List> dirtyDataLineList = new ArrayList<>(); + // 由某个点跳到会签点,此时出现多个会签实例对应 1 个跳转情况,需要把这些连续脏数据都找到 + // 会签特殊处理下标 + int multiIndex = -1; + // 会签特殊处理 key + StringBuilder multiKey = null; + // 会签特殊处理操作标识 + boolean multiOpera = false; + while (!stack.empty()) { + // 从这里开始 userTaskKey 都还是上个栈的 key + // 是否是脏数据线路上的点 + final boolean[] isDirtyData = {false}; + for (Set oldDirtyDataLine : dirtyDataLineList) { + if (oldDirtyDataLine.contains(stack.peek().getTaskDefinitionKey())) { + isDirtyData[0] = true; + } + } + // 删除原因不为空,说明从这条数据开始回跳或者回退的 + // MI_END:会签完成后,其他未签到节点的删除原因,不在处理范围内 + if (stack.peek().getDeleteReason() != null && !"MI_END".equals(stack.peek().getDeleteReason())) { + // 可以理解为脏线路起点 + String dirtyPoint = ""; + if (stack.peek().getDeleteReason().contains("Change activity to ")) { + dirtyPoint = stack.peek().getDeleteReason().replace("Change activity to ", ""); + } + // 会签回退删除原因有点不同 + if (stack.peek().getDeleteReason().contains("Change parent activity to ")) { + dirtyPoint = stack.peek().getDeleteReason().replace("Change parent activity to ", ""); + } + FlowElement dirtyTask = null; + // 获取变更节点的对应的入口处连线 + // 如果是网关并行回退情况,会变成两条脏数据路线,效果一样 + for (FlowElement flowElement : allElements) { + if (flowElement.getId().equals(stack.peek().getTaskDefinitionKey())) { + dirtyTask = flowElement; + } + } + // 获取脏数据线路 + Set dirtyDataLine = FlowableUtils.iteratorFindDirtyRoads(dirtyTask, null, null, Arrays.asList(dirtyPoint.split(",")), null); + // 自己本身也是脏线路上的点,加进去 + dirtyDataLine.add(stack.peek().getTaskDefinitionKey()); + log.info(stack.peek().getTaskDefinitionKey() + "点脏路线集合:" + dirtyDataLine); + // 是全新的需要添加的脏线路 + boolean isNewDirtyData = true; + for (int i = 0; i < dirtyDataLineList.size(); i++) { + // 如果发现他的上个节点在脏线路内,说明这个点可能是并行的节点,或者连续驳回 + // 这时,都以之前的脏线路节点为标准,只需合并脏线路即可,也就是路线补全 + if (dirtyDataLineList.get(i).contains(userTaskKey.toString())) { + isNewDirtyData = false; + dirtyDataLineList.get(i).addAll(dirtyDataLine); + } + } + // 已确定时全新的脏线路 + if (isNewDirtyData) { + // deleteKey 单一路线驳回到并行,这种同时生成多个新实例记录情况,这时 deleteKey 其实是由多个值组成 + // 按照逻辑,回退后立刻生成的实例记录就是回退的记录 + // 至于驳回所生成的 Key,直接从删除原因中获取,因为存在驳回到并行的情况 + deleteKeyList.add(dirtyPoint + ","); + dirtyDataLineList.add(dirtyDataLine); + } + // 添加后,现在这个点变成脏线路上的点了 + isDirtyData[0] = true; + } + // 如果不是脏线路上的点,说明是有效数据,添加历史实例 Key + if (!isDirtyData[0]) { + lastHistoricTaskInstanceList.add(stack.peek().getTaskDefinitionKey()); + } + // 校验脏线路是否结束 + for (int i = 0; i < deleteKeyList.size(); i ++) { + // 如果发现脏数据属于会签,记录下下标与对应 Key,以备后续比对,会签脏数据范畴开始 + if (multiKey == null && multiTask.contains(stack.peek().getTaskDefinitionKey()) + && deleteKeyList.get(i).contains(stack.peek().getTaskDefinitionKey())) { + multiIndex = i; + multiKey = new StringBuilder(stack.peek().getTaskDefinitionKey()); + } + // 会签脏数据处理,节点退回会签清空 + // 如果在会签脏数据范畴中发现 Key改变,说明会签脏数据在上个节点就结束了,可以把会签脏数据删掉 + if (multiKey != null && !multiKey.toString().equals(stack.peek().getTaskDefinitionKey())) { + deleteKeyList.set(multiIndex , deleteKeyList.get(multiIndex).replace(stack.peek().getTaskDefinitionKey() + ",", "")); + multiKey = null; + // 结束进行下校验删除 + multiOpera = true; + } + // 其他脏数据处理 + // 发现该路线最后一条脏数据,说明这条脏数据线路处理完了,删除脏数据信息 + // 脏数据产生的新实例中是否包含这条数据 + if (multiKey == null && deleteKeyList.get(i).contains(stack.peek().getTaskDefinitionKey())) { + // 删除匹配到的部分 + deleteKeyList.set(i , deleteKeyList.get(i).replace(stack.peek().getTaskDefinitionKey() + ",", "")); + } + // 如果每组中的元素都以匹配过,说明脏数据结束 + if ("".equals(deleteKeyList.get(i))) { + // 同时删除脏数据 + deleteKeyList.remove(i); + dirtyDataLineList.remove(i); + break; + } + } + // 会签数据处理需要在循环外处理,否则可能导致溢出 + // 会签的数据肯定是之前放进去的所以理论上不会溢出,但还是校验下 + if (multiOpera && deleteKeyList.size() > multiIndex && "".equals(deleteKeyList.get(multiIndex))) { + // 同时删除脏数据 + deleteKeyList.remove(multiIndex); + dirtyDataLineList.remove(multiIndex); + multiIndex = -1; + multiOpera = false; + } + // pop() 方法与 peek() 方法不同,在返回值的同时,会把值从栈中移除 + // 保存新的 userTaskKey 在下个循环中使用 + userTaskKey = new StringBuilder(stack.pop().getTaskDefinitionKey()); + } + log.info("清洗后的历史节点数据:" + lastHistoricTaskInstanceList); + return lastHistoricTaskInstanceList; + } +} diff --git a/flowable/src/main/java/com/yyy/flowable/listener/FlowExecutionListener.java b/flowable/src/main/java/com/yyy/flowable/listener/FlowExecutionListener.java new file mode 100644 index 0000000..7b87239 --- /dev/null +++ b/flowable/src/main/java/com/yyy/flowable/listener/FlowExecutionListener.java @@ -0,0 +1,34 @@ +package com.yyy.flowable.listener; + +import lombok.extern.slf4j.Slf4j; +import org.flowable.common.engine.api.delegate.Expression; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.springframework.stereotype.Component; + +/** + * 执行监听器 + * + * 执行监听器允许在执行过程中执行Java代码。 + * 执行监听器可以捕获事件的类型: + * 流程实例启动,结束 + * 输出流捕获 + * 获取启动,结束 + * 路由开始,结束 + * 中间事件开始,结束 + * 触发开始事件,触发结束事件 + * + */ +@Slf4j +@Component +public class FlowExecutionListener implements ExecutionListener { + /** + * 流程设计器添加的参数 + */ + private Expression param; + + @Override + public void notify(DelegateExecution execution) { + log.info("执行监听器:{}", execution); + } +} diff --git a/flowable/src/main/java/com/yyy/flowable/listener/FlowTaskListener.java b/flowable/src/main/java/com/yyy/flowable/listener/FlowTaskListener.java new file mode 100644 index 0000000..17a1570 --- /dev/null +++ b/flowable/src/main/java/com/yyy/flowable/listener/FlowTaskListener.java @@ -0,0 +1,56 @@ +package com.yyy.flowable.listener; + +import com.alibaba.fastjson.JSONObject; +import com.yyy.common.utils.common.CacheUtils; +import com.yyy.system.entity.vo.FlowNode; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * 任务监听器 + *

+ * create(创建):在任务被创建且所有的任务属性设置完成后才触发 + * assignment(指派):在任务被分配给某个办理人之后触发 + * complete(完成):在配置了监听器的上一个任务完成时触发 + * delete(删除):在任务即将被删除前触发。请注意任务由completeTask正常完成时也会触发 + */ +@Slf4j +@Component +public class FlowTaskListener implements TaskListener { + + @Override + public void notify(DelegateTask delegateTask) { + String formKey = delegateTask.getFormKey(); + JSONObject config = JSONObject.parseObject((String) CacheUtils.getCache("form_config").getOrDefault(formKey, null)); + Integer autoAssign = config.getInteger("autoAssign"); +// boolean checkRequire = config.getBoolean("checkRequire"); + + List nodes = JSONObject.parseArray(config.getString("nodes"), FlowNode.class); + if (nodes == null || nodes.size() == 0) { + delegateTask.setAssignee("1"); + } else if (autoAssign == 0 && delegateTask.getTaskDefinitionKey().equals("id_1")) { + // 开启指派/受理 + FlowNode node = nodes.stream().filter(e -> e.getId().equals("id_1_0")).findFirst().orElse(null); + if (node != null){ + delegateTask.setDescription(node.getRemark()); + delegateTask.addCandidateUsers(node.getUserIds().stream().map(String::valueOf).collect(Collectors.toList())); + delegateTask.addCandidateGroups(node.getRoleIds().stream().map(String::valueOf).collect(Collectors.toList())); + } + } else { + + FlowNode node = nodes.stream().filter(e -> e.getId().equals(delegateTask.getTaskDefinitionKey())).findFirst().orElse(null); + //查询表单配置信息 + if (node != null){ + delegateTask.setDescription(node.getRemark()); + //delegateTask.setAssignee("1"); + delegateTask.addCandidateUsers(node.getUserIds().stream().map(String::valueOf).collect(Collectors.toList())); + delegateTask.addCandidateGroups(node.getRoleIds().stream().map(String::valueOf).collect(Collectors.toList())); + } + } + } +} diff --git a/flowable/src/main/java/com/yyy/flowable/service/FlowGlobalProcessService.java b/flowable/src/main/java/com/yyy/flowable/service/FlowGlobalProcessService.java new file mode 100644 index 0000000..bd88bb9 --- /dev/null +++ b/flowable/src/main/java/com/yyy/flowable/service/FlowGlobalProcessService.java @@ -0,0 +1,16 @@ +package com.yyy.flowable.service; + +import com.yyy.system.entity.pojo.FlFormItem; + +public interface FlowGlobalProcessService { + + /** + * 节点中处理 + */ + String process(FlFormItem formItem); + + /** + * 节点后置处理 + */ + void after(FlFormItem formItem); +} diff --git a/flowable/src/main/java/com/yyy/flowable/service/IFlowDefinitionService.java b/flowable/src/main/java/com/yyy/flowable/service/IFlowDefinitionService.java new file mode 100644 index 0000000..1a4c690 --- /dev/null +++ b/flowable/src/main/java/com/yyy/flowable/service/IFlowDefinitionService.java @@ -0,0 +1,87 @@ +package com.yyy.flowable.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yyy.common.core.domain.Result; +import com.yyy.system.entity.dto.FlowProcDefDto; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Map; + +public interface IFlowDefinitionService { + + boolean exist(String processDefinitionKey); + + + /** + * 流程定义列表 + * + * @param pageNum 当前页码 + * @param pageSize 每页条数 + * @return 流程定义分页列表数据 + */ + Page list(String name, Integer pageNum, Integer pageSize); + + /** + * 流程定义列表 + * + */ + FlowProcDefDto getByDeployId(String deployId); + + /** + * 导入流程文件 + * 当每个key的流程第一次部署时,指定版本为1。对其后所有使用相同key的流程定义, + * 部署时版本会在该key当前已部署的最高版本号基础上加1。key参数用于区分流程定义 + * @param name + * @param category + * @param in + */ + String importFile(String name, String category, InputStream in); + + /** + * 读取xml + * @param deployId + * @return + */ + Result readXml(String deployId) throws IOException; + + /** + * 根据流程定义ID启动流程实例 + * + * @param procDefId + * @param variables + * @return + */ + + Result startProcessInstanceById(String procDefId, Map variables); + + + /** + * 激活或挂起流程定义 + * + * @param state 状态 + * @param deployId 流程部署ID + */ + void updateState(Integer state, String deployId); + + + /** + * 删除流程定义 + * + * @param deployId 流程部署ID act_ge_bytearray 表中 deployment_id值 + */ + void delete(String deployId); + + + /** + * 读取图片文件 + * @param deployId + * @return + */ + InputStream readImage(String deployId); + + /** + * 设置动态节点 + */ + void setDynamicNode(String processDefinitionId, String processInstanceId, String parentNodeId, String nodeId, String nodeName, String assignee); +} diff --git a/flowable/src/main/java/com/yyy/flowable/service/IFlowInstanceService.java b/flowable/src/main/java/com/yyy/flowable/service/IFlowInstanceService.java new file mode 100644 index 0000000..efd9440 --- /dev/null +++ b/flowable/src/main/java/com/yyy/flowable/service/IFlowInstanceService.java @@ -0,0 +1,50 @@ +package com.yyy.flowable.service; + +import com.yyy.common.core.domain.Result; +import com.yyy.flowable.domain.vo.FlowTaskVo; +import org.flowable.engine.history.HistoricProcessInstance; + +import java.util.Map; + +public interface IFlowInstanceService { + + /** + * 结束流程实例 + * + * @param vo + */ + void stopProcessInstance(FlowTaskVo vo); + + /** + * 激活或挂起流程实例 + * + * @param state 状态 + * @param instanceId 流程实例ID + */ + void updateState(Integer state, String instanceId); + + /** + * 删除流程实例ID + * + * @param instanceId 流程实例ID + * @param deleteReason 删除原因 + */ + void delete(String instanceId, String deleteReason); + + /** + * 根据实例ID查询历史实例数据 + * + * @param processInstanceId + * @return + */ + HistoricProcessInstance getHistoricProcessInstanceById(String processInstanceId); + + /** + * 根据流程定义ID启动流程实例 + * + * @param procDefId 流程定义Id + * @param variables 流程变量 + * @return + */ + Result startProcessInstanceById(String procDefId, Map variables); +} diff --git a/flowable/src/main/java/com/yyy/flowable/service/IFlowTaskService.java b/flowable/src/main/java/com/yyy/flowable/service/IFlowTaskService.java new file mode 100644 index 0000000..37650c6 --- /dev/null +++ b/flowable/src/main/java/com/yyy/flowable/service/IFlowTaskService.java @@ -0,0 +1,221 @@ +package com.yyy.flowable.service; + +import com.yyy.common.core.domain.Result; +import com.yyy.flowable.domain.dto.FlowTaskMessageDto; +import com.yyy.flowable.domain.vo.FlowQueryVo; +import com.yyy.flowable.domain.vo.FlowTaskVo; +import com.yyy.system.entity.vo.ProcessHomePageVo; +import org.flowable.task.api.Task; + +import java.io.InputStream; +import java.util.List; + +/** + * @author Tony + * @date 2021-04-03 14:42 + */ +public interface IFlowTaskService { + + /** + * 审批任务 + * + * @param task 请求实体参数 + */ + Result complete(FlowTaskVo task); + + /** + * 驳回任务 + * + * @param flowTaskVo + */ + void taskReject(FlowTaskVo flowTaskVo); + + + /** + * 退回任务 + * + * @param flowTaskVo 请求实体参数 + */ + void taskReturn(FlowTaskVo flowTaskVo); + + /** + * 获取所有可回退的节点 + * + * @param flowTaskVo + * @return + */ + Result findReturnTaskList(FlowTaskVo flowTaskVo); + + /** + * 删除任务 + * + * @param flowTaskVo 请求实体参数 + */ + void deleteTask(FlowTaskVo flowTaskVo); + + /** + * 认领/签收任务 + * + * @param flowTaskVo 请求实体参数 + */ + void claim(FlowTaskVo flowTaskVo); + + /** + * 取消认领/签收任务 + * + * @param flowTaskVo 请求实体参数 + */ + void unClaim(FlowTaskVo flowTaskVo); + + /** + * 委派任务 + * + * @param flowTaskVo 请求实体参数 + */ + void delegateTask(FlowTaskVo flowTaskVo); + + /** + * 任务归还 + * + * @param flowTaskVo 请求实体参数 + */ + void resolveTask(FlowTaskVo flowTaskVo); + + + /** + * 转办任务 + * + * @param flowTaskVo 请求实体参数 + */ + void assignTask(FlowTaskVo flowTaskVo); + + + /** + * 多实例加签 + * @param flowTaskVo + */ + void addMultiInstanceExecution(FlowTaskVo flowTaskVo); + + /** + * 多实例减签 + * @param flowTaskVo + */ + void deleteMultiInstanceExecution(FlowTaskVo flowTaskVo); + + /** + * 我发起的流程 + * @param queryVo 请求参数 + * @return + */ + Result myProcess(FlowQueryVo queryVo); + + + /** + * 取消申请 + * 目前实现方式: 直接将当前流程变更为已完成 + * @param flowTaskVo + * @return + */ + Result stopProcess(FlowTaskVo flowTaskVo); + + /** + * 撤回流程 + * @param flowTaskVo + * @return + */ + Result revokeProcess(FlowTaskVo flowTaskVo); + + + /** + * 代办任务列表 + * + * @param queryVo 请求参数 + * @return + */ + Result todoList(FlowQueryVo queryVo); + + Result todoListMSG(FlowQueryVo queryVo); + + long todoListCount(); + + /** + * 已办任务列表 + * + * @param queryVo 请求参数 + * @return + */ + Result finishedList(FlowQueryVo queryVo); + + /** + * 流程历史流转记录 + * + * @param procInsId 流程实例Id + * @return + */ + Result flowRecord(String procInsId,String deployId); + + /** + * 根据任务ID查询挂载的表单信息 + * + * @param taskId 任务Id + * @return + */ + Task getTaskForm(String taskId); + + /** + * 获取流程过程图 + * @param processId + * @return + */ + InputStream diagram(String processId); + + /** + * 获取流程执行节点 + * @param procInsId + * @return + */ + Result getFlowViewer(String procInsId,String executionId); + + /** + * 获取流程变量 + * @param taskId + * @return + */ + Result processVariables(String taskId); + + /** + * 获取下一节点 + * @param flowTaskVo 任务 + * @return + */ + Result getNextFlowNode(FlowTaskVo flowTaskVo); + + Result getNextFlowNodeByStart(FlowTaskVo flowTaskVo); + + /** + * 流程初始化表单 + * @param deployId + * @return + */ + Result flowFormData(String deployId); + + /** + * 流程节点信息 + * @param procInsId + * @return + */ + Result flowXmlAndNode(String procInsId,String deployId); + + /** + * 流程节点表单 + * @param taskId 流程任务编号 + * @return + */ + Result flowTaskForm(String taskId) throws Exception; + + /** + * 首页数据 + * @return + */ + Result> homePage(); +} diff --git a/flowable/src/main/java/com/yyy/flowable/service/impl/FlowDefinitionServiceImpl.java b/flowable/src/main/java/com/yyy/flowable/service/impl/FlowDefinitionServiceImpl.java new file mode 100644 index 0000000..ec7baa9 --- /dev/null +++ b/flowable/src/main/java/com/yyy/flowable/service/impl/FlowDefinitionServiceImpl.java @@ -0,0 +1,284 @@ +package com.yyy.flowable.service.impl; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.yyy.common.core.domain.Result; +import com.yyy.common.core.domain.ResultCode; +import com.yyy.common.utils.common.CacheUtils; +import com.yyy.common.utils.common.ServletUtils; +import com.yyy.common.utils.common.StringUtils; +import com.yyy.common.utils.security.JwtUtils; +import com.yyy.flowable.common.enums.FlowComment; +import com.yyy.common.enums.FlowStatus; +import com.yyy.flowable.flow.CustomInjectUserTaskInProcessInstanceCmd; +import com.yyy.system.entity.dto.FlowProcDefDto; +import com.yyy.flowable.factory.FlowServiceFactory; +import com.yyy.flowable.service.IFlowDefinitionService; +import com.yyy.system.entity.pojo.FlForm; +import com.yyy.system.entity.pojo.FlFormItem; +import com.yyy.system.entity.vo.FlowNode; +import com.yyy.system.mapper.FlowDeployMapper; +import com.yyy.system.service.FlFormItemService; +import com.yyy.system.service.FlFormService; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.io.IOUtils; +import org.flowable.bpmn.model.BpmnModel; +import org.flowable.bpmn.model.Process; +import org.flowable.engine.impl.dynamic.DynamicUserTaskBuilder; +import org.flowable.engine.repository.Deployment; +import org.flowable.engine.repository.ProcessDefinition; +import org.flowable.engine.repository.ProcessDefinitionQuery; +import org.flowable.engine.runtime.ProcessInstance; +import org.flowable.image.impl.DefaultProcessDiagramGenerator; +import org.flowable.task.api.Task; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.util.*; + +/** + * 流程定义 + */ +@Service +@Slf4j +public class FlowDefinitionServiceImpl extends FlowServiceFactory implements IFlowDefinitionService { + + @Resource + private FlFormService flFormService; + + @Resource + private FlowDeployMapper flowDeployMapper; + + @Resource + private FlFormItemService flFormItemService; + + private static final String BPMN_FILE_SUFFIX = ".bpmn"; + + @Autowired + JwtUtils jwtUtils; + + @Override + public boolean exist(String processDefinitionKey) { + ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery().processDefinitionKey(processDefinitionKey); + long count = processDefinitionQuery.count(); + return count > 0 ? true : false; + } + + + /** + * 流程定义列表 + * + * @param pageNum 当前页码 + * @param pageSize 每页条数 + * @return 流程定义分页列表数据 + */ + @Override + public Page list(String name, Integer pageNum, Integer pageSize) { + Page page = new Page<>(); + PageHelper.startPage(pageNum, pageSize); + final List dataList = flowDeployMapper.selectDeployList(name); + + // 加载挂表单 + for (FlowProcDefDto procDef : dataList) { + FlForm sysForm = flFormService.selectByDeployId(procDef.getDeploymentId()); + if (Objects.nonNull(sysForm)) { + procDef.setFormName(sysForm.getName()); + procDef.setFormId(sysForm.getFormId()); + } + } + page.setTotal(new PageInfo(dataList).getTotal()); + page.setRecords(dataList); + return page; + } + + @Override + public FlowProcDefDto getByDeployId(String deployId) { + return flowDeployMapper.getByDeployId(deployId); + } + + /** + * 导入流程文件 + *

+ * 当每个key的流程第一次部署时,指定版本为1。对其后所有使用相同key的流程定义, + * 部署时版本会在该key当前已部署的最高版本号基础上加1。key参数用于区分流程定义 + * + * @param name + * @param category + * @param in + */ + @Override + public String importFile(String name, String category, InputStream in) { + Deployment deploy = repositoryService.createDeployment().addInputStream(name + BPMN_FILE_SUFFIX, in).name(name).category(category).deploy(); + ProcessDefinition definition = repositoryService.createProcessDefinitionQuery().deploymentId(deploy.getId()).singleResult(); + repositoryService.setProcessDefinitionCategory(definition.getId(), category); + return definition.getDeploymentId(); + } + + /** + * 读取xml + * + * @param deployId + * @return + */ + @Override + public Result readXml(String deployId) throws IOException { + ProcessDefinition definition = repositoryService.createProcessDefinitionQuery().deploymentId(deployId).singleResult(); + InputStream inputStream = repositoryService.getResourceAsStream(definition.getDeploymentId(), definition.getResourceName()); + String result = IOUtils.toString(inputStream, StandardCharsets.UTF_8.name()); + return new Result(ResultCode.success, result); + } + + /** + * 读取xml + * + * @param deployId + * @return + */ + @Override + public InputStream readImage(String deployId) { + ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deployId).singleResult(); + //获得图片流 + DefaultProcessDiagramGenerator diagramGenerator = new DefaultProcessDiagramGenerator(); + BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinition.getId()); + //输出为图片 + return diagramGenerator.generateDiagram( + bpmnModel, + "png", + Collections.emptyList(), + Collections.emptyList(), + "宋体", + "宋体", + "宋体", + null, + 1.0, + false); + } + + @Override + public void setDynamicNode(String processDefinitionId, String processInstanceId, String parentNodeId, String nodeId, String nodeName, String assignee) { + DynamicUserTaskBuilder dynamicUserTaskBuilder = new DynamicUserTaskBuilder(); + dynamicUserTaskBuilder.setId(nodeId); + dynamicUserTaskBuilder.setName(nodeName); + dynamicUserTaskBuilder.setAssignee(assignee); + BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId); + Process process = bpmnModel.getProcesses().get(0); + try { + managementService.executeCommand(new CustomInjectUserTaskInProcessInstanceCmd(processInstanceId, dynamicUserTaskBuilder, process.getFlowElement(parentNodeId))); + } catch (Exception e) { + log.error("动态节点设置失败:", e.getMessage(), e); + } + } + + /** + * 根据流程定义ID启动流程实例 + * + * @param procDefId 流程模板ID + * @param variables 流程变量 + * @return + */ + @Override + public Result startProcessInstanceById(String procDefId, Map variables) { + try { + ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(procDefId) + .latestVersion().singleResult(); + if (Objects.nonNull(processDefinition) && processDefinition.isSuspended()) { + return new Result(ResultCode.operate_failure.getCode(), "流程已被挂起,请先激活流程"); + } + // 设置流程发起人Id和审批人Id到流程中 + String uid = "1"; + if (ServletUtils.isHttpRequest()){ + uid = jwtUtils.parseToken(ServletUtils.getRequest().getHeader("Authorization")).get("uid"); + } + + identityService.setAuthenticatedUserId(uid); + JSONObject config = JSONObject.parseObject((String) CacheUtils.getCache("form_config").getOrDefault(processDefinition.getKey(), null)); + ProcessInstance processInstance = runtimeService.startProcessInstanceById(procDefId, variables); + + boolean isDispose = false; + //设置动态审批节点 /是否有待处置节点 + if (config.containsKey("nodes")) { + List nodes = JSONObject.parseArray(config.getString("nodes"), FlowNode.class); + FlowNode lastDefaultNode = null; + for (FlowNode currentNode : nodes) { + if (currentNode.getIsDefault() == 1) { + lastDefaultNode = currentNode; + } else { + if (lastDefaultNode != null && !currentNode.getUserIds().isEmpty()) { + setDynamicNode(processInstance.getProcessDefinitionId(), processInstance.getProcessInstanceId(), lastDefaultNode.getId(), currentNode.getId(), currentNode.getName(), currentNode.getUserIds().get(0).toString()); + } + lastDefaultNode = currentNode; + } + if (StringUtils.contains(currentNode.getName(), "处置")) { + isDispose = true; + } + } + } + + // 流程发起时 跳过发起人节点 + // 给第一步申请人节点设置任务执行人和意见 + Task task = taskService.createTaskQuery().processInstanceId(processInstance.getProcessInstanceId()).singleResult(); + if (Objects.nonNull(task)) { + taskService.addComment(task.getId(), processInstance.getProcessInstanceId(), FlowComment.NORMAL.getType(), "发起流程申请"); + + task.setAssignee(uid); + taskService.complete(task.getId(), variables); + } + + //保存节点信息 + //设置指派节点 + Task newTask = taskService.createTaskQuery().processInstanceId(processInstance.getProcessInstanceId()).singleResult(); + flFormItemService.save(FlFormItem.builder().name(variables.containsKey("name") ? (String) variables.get("name") : processDefinition.getName()) + .formKey(processDefinition.getKey()) + .procInsId(processInstance.getProcessInstanceId()) + .taskId(newTask.getId()) + .contents(JSON.toJSONString(variables)) + .status(config.getInteger("autoAssign") == 1 ? isDispose ? FlowStatus.DISPOSE.getCode() : FlowStatus.APPROVAL.getCode() : FlowStatus.TO_BE_ASSIGNED.getCode()) + .createType((String) variables.getOrDefault("createType", "unknown")) + .createUser(Long.parseLong(uid)).build()); + + return new Result(ResultCode.success, "流程启动成功"); + } catch (Exception e) { + log.error(e.getMessage(), e); + return new Result(ResultCode.operate_failure.getCode(), "流程启动错误"); + } + } + + + /** + * 激活或挂起流程定义 + * + * @param state 状态 + * @param deployId 流程部署ID + */ + @Override + public void updateState(Integer state, String deployId) { + ProcessDefinition procDef = repositoryService.createProcessDefinitionQuery().deploymentId(deployId).singleResult(); + // 激活 + if (state == 1) { + repositoryService.activateProcessDefinitionById(procDef.getId(), true, null); + } + // 挂起 + if (state == 2) { + repositoryService.suspendProcessDefinitionById(procDef.getId(), true, null); + } + } + + + /** + * 删除流程定义 + * + * @param deployId 流程部署ID act_ge_bytearray 表中 deployment_id值 + */ + @Override + public void delete(String deployId) { + // true 允许级联删除 ,不设置会导致数据库外键关联异常 + repositoryService.deleteDeployment(deployId, true); + } +} diff --git a/flowable/src/main/java/com/yyy/flowable/service/impl/FlowGlobalProcessServiceImpl.java b/flowable/src/main/java/com/yyy/flowable/service/impl/FlowGlobalProcessServiceImpl.java new file mode 100644 index 0000000..c4f8b27 --- /dev/null +++ b/flowable/src/main/java/com/yyy/flowable/service/impl/FlowGlobalProcessServiceImpl.java @@ -0,0 +1,302 @@ +package com.yyy.flowable.service.impl; + +import com.alibaba.fastjson.JSONObject; +import com.yyy.common.core.domain.Result; +import com.yyy.common.enums.DetectTypeEnum; +import com.yyy.common.enums.FlowStatus; +import com.yyy.common.enums.PlanTypeEnum; +import com.yyy.common.form.FieldData; +import com.yyy.common.utils.common.CacheUtils; +import com.yyy.common.utils.common.DateUtils; +import com.yyy.common.utils.common.StringUtils; +import com.yyy.flowable.service.FlowGlobalProcessService; +import com.yyy.flowable.service.IFlowDefinitionService; +import com.yyy.system.entity.bo.JobDefect; +import com.yyy.system.entity.bo.SpareParts; +import com.yyy.system.entity.dto.DeviceJobRepairDto; +import com.yyy.system.entity.dto.EamWarehouseAssetDto; +import com.yyy.system.entity.dto.FlowProcDefDto; +import com.yyy.system.entity.pojo.*; +import com.yyy.system.entity.vo.FlowNode; +import com.yyy.system.service.*; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +@Service +@Slf4j +public class FlowGlobalProcessServiceImpl implements FlowGlobalProcessService { + + @Autowired + EamRepairFaultService eamRepairFaultService; + + @Autowired + EamBusinessRetirementService eamBusinessRetirementService; + + @Autowired + EamRepairService eamRepairService; + + @Autowired + EamBusinessTransferService eamBusinessTransferService; + + @Autowired + EamBusinessCollectionService eamBusinessCollectionService; + + @Resource + private EamAssetLogService eamAssetLogService; + + @Resource + private EamWarehouseAssetService eamWarehouseAssetService; + + @Resource + private FlFormItemService flFormItemService; + + @Resource + private FlFormService flFormService; + + @Autowired + private IFlowDefinitionService flowDefinitionService; + @Resource + private SysFormTempService sysFormTempService; + + private static long Default_Repair_FormTempId = 1L; + + @Override + public String process(FlFormItem formItem) { + JSONObject variables = JSONObject.parseObject(formItem.getContents()); + List defectList = new ArrayList<>(); + if (variables.containsKey("defects")) { + defectList = JSONObject.parseArray(variables.getString("defects"), JobDefect.class); + } + JSONObject config = JSONObject.parseObject((String) CacheUtils.getCache("form_config").getOrDefault(formItem.getFormKey(), null)); + List nodes = JSONObject.parseArray(config.getString("nodes"), FlowNode.class); + + if (formItem.getFormKey().equals("eam_asset_employee_repair")) { + + } else if (formItem.getFormKey().equals("eam_asset_scrap")) { + + } else if (formItem.getFormKey().equals("eam_asset_equipment_repair")) { + + } else if (formItem.getFormKey().equals("eam_asset_employee_handover")) { + + } else if (formItem.getFormKey().equals("eam_asset_stock_goods_use")) { + + } else if (formItem.getFormKey().equals(DetectTypeEnum.REPAIR.getCode())) { + //维修登记记录 + if (formItem.getStatus().equals(FlowStatus.DISPOSE.getCode())) { + if (defectList != null && defectList.size() > 0) { + for (JobDefect defect : defectList) { + List spareParts = defect.getSparePartsList(); + if (spareParts != null && !spareParts.isEmpty()) { + List warehouseAssetList = new ArrayList<>(); + for (SpareParts sparePart : spareParts) { + if (sparePart.getWarehouseId()==null||sparePart.getAssetId()==null||sparePart.getCount()==null){ + return sparePart.getName() +": 请完善备件信息!"; + } + warehouseAssetList.add(EamWarehouseAssetDto.builder().warehouseId(sparePart.getWarehouseId()).assetId(sparePart.getAssetId()).count(sparePart.getCount()).build()); + } + if (eamWarehouseAssetService.reduceVerify(warehouseAssetList)){ + eamWarehouseAssetService.reduce(warehouseAssetList); + }else { + return "库存不足"; + } + } + defect.setDefectStatus(0); + } + } + } + } else if (formItem.getFormKey().equals(DetectTypeEnum.INSPECTION.getCode())) { + if (formItem.getStatus().equals(FlowStatus.DISPOSE.getCode())) { + if (defectList != null && defectList.size() > 0) { + for (JobDefect defect : defectList) { + if (defect.getAutoRepair()) { + String result = createRepairFlow(defect); + if (result != null){ + return result; + } + } + } + } + } + } else if (formItem.getFormKey().equals(DetectTypeEnum.MAINTENANCE.getCode())) { + /** + * 1 判断节点状态-处置节点 + * 2 判断是否自动报修,是否有异常 ->发起报修 + * 3 消耗备件 + */ + if (formItem.getStatus().equals(FlowStatus.DISPOSE.getCode())) { + if (defectList != null && defectList.size() > 0) { + for (JobDefect defect : defectList) { + if (defect.getAutoRepair()) { + String result = createRepairFlow(defect); + if (result != null){ + return result; + } + } + List spareParts = defect.getSparePartsList(); + if (spareParts != null && !spareParts.isEmpty()) { + List warehouseAssetList = new ArrayList<>(); + for (SpareParts sparePart : spareParts) { + if (sparePart.getWarehouseId()==null||sparePart.getAssetId()==null||sparePart.getCount()==null){ + return sparePart.getName() +": 请完善备件信息!"; + } + warehouseAssetList.add(EamWarehouseAssetDto.builder().warehouseId(sparePart.getWarehouseId()).assetId(sparePart.getAssetId()).count(sparePart.getCount()).build()); + } + if (eamWarehouseAssetService.reduceVerify(warehouseAssetList)){ + eamWarehouseAssetService.reduce(warehouseAssetList); + }else { + return "库存不足"; + } + } + } + } + } + } else if (formItem.getFormKey().equals(DetectTypeEnum.STOCKTAKING.getCode())) { + + } else { + //流程没有对应的业务表单 + } + variables.put("defects", JSONObject.toJSONString(defectList)); + formItem.setContents(variables.toJSONString()); + flFormItemService.updateById(formItem); + return null; + } + + @Override + public void after(FlFormItem formItem) { + JSONObject variables = JSONObject.parseObject(formItem.getContents()); + List logs = new ArrayList<>(); + List defectList = new ArrayList<>(); + if (variables.containsKey("defects")) { + defectList = JSONObject.parseArray(variables.getString("defects"), JobDefect.class); + } + + if (formItem.getFormKey().equals("eam_asset_employee_repair")) { + eamRepairFaultService.formLink(variables); + } else if (formItem.getFormKey().equals("eam_asset_scrap")) { + eamBusinessRetirementService.formLink(variables); + } else if (formItem.getFormKey().equals("eam_asset_equipment_repair")) { + eamRepairService.formLink(variables); + } else if (formItem.getFormKey().equals("eam_asset_employee_handover")) { + eamBusinessTransferService.formLink(variables); + } else if (formItem.getFormKey().equals("eam_asset_stock_goods_use")) { + eamBusinessCollectionService.formLink(variables); + } else if (formItem.getFormKey().equals(DetectTypeEnum.REPAIR.getCode())) { + //维修登记记录 + EamRepair eamRepair = EamRepair.builder() + .businessId(variables.getString("businessId")) + .name(variables.getString("name")) + .assetIdList(variables.getString("assetIdList")) + .notes(variables.getString("remark")) + .status(1) + .build(); + eamRepairService.save(eamRepair); + defectList.forEach(e -> { + JSONObject operationNotes = new JSONObject(); + operationNotes.put("procInsId", formItem.getProcInsId()); + operationNotes.put("remark", e.getCost() != null && e.getCost() > 0 ? "维护成本:" + e.getCost() + "元" : ""); + logs.add(EamAssetLog.builder() + .businessId(variables.getString("businessId")) + .operationType(DetectTypeEnum.getByCode(formItem.getFormKey()).getInfo()) + .operationNotes(operationNotes.toJSONString()) + .assetId(e.getAssetId()) + .build()); + }); + } else if (formItem.getFormKey().equals(DetectTypeEnum.INSPECTION.getCode())) { + defectList.forEach(e -> { + JSONObject operationNotes = new JSONObject(); + operationNotes.put("procInsId", formItem.getProcInsId()); + operationNotes.put("remark", e.getNotes() != null ? "巡检总结:" + e.getNotes() : ""); + logs.add(EamAssetLog.builder() + .businessId(variables.getString("businessId")) + .operationType(DetectTypeEnum.getByCode(formItem.getFormKey()).getInfo()) + .operationNotes(operationNotes.toJSONString()) + .assetId(e.getAssetId()) + .build()); + }); + } else if (formItem.getFormKey().equals(DetectTypeEnum.MAINTENANCE.getCode())) { + defectList.forEach(e -> { + JSONObject operationNotes = new JSONObject(); + operationNotes.put("procInsId", formItem.getProcInsId()); + StringBuilder remark = new StringBuilder(); + if (StringUtils.isNotBlank(e.getNotes())) { + remark.append("保养总结:" + e.getNotes()); + } + if (e.getCost() != null && e.getCost() > 0) { + remark.append("保养成本:" + e.getCost() + "元"); + } + operationNotes.put("remark", remark.toString()); + logs.add(EamAssetLog.builder() + .businessId(variables.getString("businessId")) + .operationType(DetectTypeEnum.getByCode(formItem.getFormKey()).getInfo()) + .operationNotes(operationNotes.toJSONString()) + .assetId(e.getAssetId()) + .build()); + }); + } else if (formItem.getFormKey().equals(DetectTypeEnum.STOCKTAKING.getCode())) { + defectList.forEach(e -> { + JSONObject operationNotes = new JSONObject(); + operationNotes.put("procInsId", formItem.getProcInsId()); + operationNotes.put("remark", e.getNotes() != null ? "盘点总结:" + e.getNotes() : ""); + logs.add(EamAssetLog.builder() + .businessId(variables.getString("businessId")) + .operationType(DetectTypeEnum.getByCode(formItem.getFormKey()).getInfo()) + .operationNotes(operationNotes.toJSONString()) + .assetId(e.getAssetId()) + .build()); + }); + } else { + //流程没有对应的业务表单 + } + if (logs.size() > 0) { + eamAssetLogService.saveBatch(logs); + } + } + + private String createRepairFlow(JobDefect defect) { + + FlForm flForm = flFormService.selectByKey(PlanTypeEnum.repair.getCode()); + if (Objects.isNull(flForm)) { + return "表单标识信息错误"; + } + FlowProcDefDto flowProcDefDto = flowDefinitionService.getByDeployId(flForm.getDeployId()); + if (Objects.isNull(flowProcDefDto)) { + return PlanTypeEnum.repair.getInfo() + "流程未部署"; + } + JSONObject variables = JSONObject.parseObject(flForm.getConfig()); + //使用默认维修表单 + SysFormTemp formTemp = sysFormTempService.getById(Default_Repair_FormTempId); + if (formTemp != null) { + List _formValue = JSONObject.parseArray(formTemp.getFormValue(), FieldData.class); + defect.set_formValue(_formValue); + defect.setDefectStatus(0); + defect.setAutoRepair(false); + + List defects = new ArrayList<>(); + defects.add(defect); + variables.put("defects", defects); + } + + variables.put("createType", "自动创建"); + DeviceJobRepairDto dto = DeviceJobRepairDto.builder() + .name("自动报修流程_" + DateUtils.getTime()) + .businessId(null) + .plannedDate(DateUtils.getTime()) + .remark("由自动报修流程发起") + .formTempId(Default_Repair_FormTempId) + .formName(flForm.getName()) + .build(); + JSONObject.parseObject(JSONObject.toJSONString(dto)).forEach(variables::put); + Result result = flowDefinitionService.startProcessInstanceById(flowProcDefDto.getId(), variables); + if (result.isSuccess()){ + return null; + }else { + return "自动报修流程发起失败!"; + } + } +} diff --git a/flowable/src/main/java/com/yyy/flowable/service/impl/FlowInstanceServiceImpl.java b/flowable/src/main/java/com/yyy/flowable/service/impl/FlowInstanceServiceImpl.java new file mode 100644 index 0000000..88363c8 --- /dev/null +++ b/flowable/src/main/java/com/yyy/flowable/service/impl/FlowInstanceServiceImpl.java @@ -0,0 +1,148 @@ +package com.yyy.flowable.service.impl; + + +import com.alibaba.fastjson.JSON; +import com.yyy.common.core.domain.Result; +import com.yyy.common.core.domain.ResultCode; +import com.yyy.common.enums.FlowStatus; +import com.yyy.common.utils.common.ServletUtils; +import com.yyy.common.utils.security.JwtUtils; +import com.yyy.flowable.domain.vo.FlowTaskVo; +import com.yyy.flowable.factory.FlowServiceFactory; +import com.yyy.flowable.service.IFlowInstanceService; +import com.yyy.system.entity.dto.FlFormItemDto; +import com.yyy.system.entity.pojo.FlFormItem; +import com.yyy.system.service.FlFormItemService; +import com.yyy.system.service.FlFormService; +import lombok.extern.slf4j.Slf4j; +import org.flowable.common.engine.api.FlowableObjectNotFoundException; +import org.flowable.engine.DynamicBpmnService; +import org.flowable.engine.history.HistoricProcessInstance; +import org.flowable.engine.runtime.ProcessInstance; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Map; +import java.util.Objects; + +/** + *

工作流流程实例管理

+ */ +@Service +@Slf4j +public class FlowInstanceServiceImpl extends FlowServiceFactory implements IFlowInstanceService { + + @Autowired + JwtUtils jwtUtils; + + @Autowired + FlFormItemService flFormItemService; + + @Autowired + FlFormService flFormService; + + @Autowired + DynamicBpmnService dynamicBpmnService; + + /** + * 结束流程实例 + * + * @param vo + */ + @Override + public void stopProcessInstance(FlowTaskVo vo) { + String taskId = vo.getTaskId(); + + } + + /** + * 激活或挂起流程实例 + * + * @param state 状态 + * @param instanceId 流程实例ID + */ + @Override + public void updateState(Integer state, String instanceId) { + + // 激活 + if (state == 1) { + runtimeService.activateProcessInstanceById(instanceId); + flFormItemService.update(FlFormItemDto.builder().procInsId(instanceId).status(FlowStatus.APPROVAL.getCode()).build()); + } + // 挂起 + if (state == 2) { + runtimeService.suspendProcessInstanceById(instanceId); + flFormItemService.update(FlFormItemDto.builder().procInsId(instanceId).status(FlowStatus.SUSPENDED.getCode()).build()); + } + + } + + /** + * 删除流程实例ID + * + * @param instanceId 流程实例ID + * @param deleteReason 删除原因 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void delete(String instanceId, String deleteReason) { + + // 查询历史数据 + HistoricProcessInstance historicProcessInstance = getHistoricProcessInstanceById(instanceId); + if (historicProcessInstance.getEndTime() != null) { + historyService.deleteHistoricProcessInstance(historicProcessInstance.getId()); + return; + } + // 删除流程实例 + runtimeService.deleteProcessInstance(instanceId, deleteReason); + // 删除历史流程实例 + historyService.deleteHistoricProcessInstance(instanceId); + } + + /** + * 根据实例ID查询历史实例数据 + * + * @param processInstanceId + * @return + */ + @Override + public HistoricProcessInstance getHistoricProcessInstanceById(String processInstanceId) { + HistoricProcessInstance historicProcessInstance = + historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); + if (Objects.isNull(historicProcessInstance)) { + throw new FlowableObjectNotFoundException("流程实例不存在: " + processInstanceId); + } + return historicProcessInstance; + } + + /** + * 根据流程定义ID启动流程实例 + * + * @param procDefId 流程定义Id + * @param variables 流程变量 + * @return + */ + @Override + public Result startProcessInstanceById(String procDefId, Map variables) { + + try { + // 设置流程发起人Id到流程中 + Long userId = Long.parseLong(jwtUtils.parseToken(ServletUtils.getRequest().getHeader("Authorization")).get("uid")); +// identityService.setAuthenticatedUserId(userId.toString()); + variables.put("initiator", userId); + variables.put("_FLOWABLE_SKIP_EXPRESSION_ENABLED", true); + ProcessInstance processInstance = runtimeService.startProcessInstanceById(procDefId, variables); + + flFormItemService.save(FlFormItem.builder().name(processInstance.getProcessDefinitionName()) + .formKey(processInstance.getProcessDefinitionKey()) + .procInsId(processInstance.getProcessInstanceId()) + .contents(JSON.toJSONString(variables)) + .createUser(userId).build()); + return new Result(ResultCode.success, "流程启动成功"); + } catch (Exception e) { + log.error(e.getMessage(), e); + return new Result(ResultCode.operate_failure.getCode(), "流程启动错误"); + } + } +} \ No newline at end of file diff --git a/flowable/src/main/java/com/yyy/flowable/service/impl/FlowTaskServiceImpl.java b/flowable/src/main/java/com/yyy/flowable/service/impl/FlowTaskServiceImpl.java new file mode 100644 index 0000000..830746f --- /dev/null +++ b/flowable/src/main/java/com/yyy/flowable/service/impl/FlowTaskServiceImpl.java @@ -0,0 +1,1606 @@ +package com.yyy.flowable.service.impl; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.TypeReference; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yyy.common.core.domain.Result; +import com.yyy.common.core.domain.ResultCode; +import com.yyy.common.core.domain.entity.UmsRole; +import com.yyy.common.core.domain.entity.UmsUser; +import com.yyy.common.enums.PlanTypeEnum; +import com.yyy.common.exception.CustomException; +import com.yyy.common.utils.common.CacheUtils; +import com.yyy.common.utils.common.DateUtils; +import com.yyy.common.utils.common.ServletUtils; +import com.yyy.common.utils.security.JwtUtils; +import com.yyy.flowable.common.constant.ProcessConstants; +import com.yyy.flowable.common.enums.FlowComment; +import com.yyy.common.enums.FlowStatus; +import com.yyy.flowable.domain.dto.*; +import com.yyy.flowable.domain.vo.FlowQueryVo; +import com.yyy.flowable.domain.vo.FlowTaskVo; +import com.yyy.flowable.factory.FlowServiceFactory; +import com.yyy.flowable.flow.CustomInjectUserTaskInProcessInstanceCmd; +import com.yyy.flowable.flow.CustomProcessDiagramGenerator; +import com.yyy.flowable.flow.FindNextNodeUtil; +import com.yyy.flowable.flow.FlowableUtils; +import com.yyy.flowable.service.FlowGlobalProcessService; +import com.yyy.flowable.service.IFlowTaskService; +import com.yyy.system.entity.dto.FlFormItemDto; +import com.yyy.system.entity.pojo.FlForm; +import com.yyy.system.entity.pojo.FlFormItem; +import com.yyy.system.entity.vo.ProcessHomePageVo; +import com.yyy.system.service.*; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; +import org.flowable.bpmn.model.Process; +import org.flowable.bpmn.model.*; +import org.flowable.common.engine.api.FlowableException; +import org.flowable.common.engine.api.FlowableObjectNotFoundException; +import org.flowable.engine.ProcessEngineConfiguration; +import org.flowable.engine.history.HistoricActivityInstance; +import org.flowable.engine.history.HistoricProcessInstance; +import org.flowable.engine.history.HistoricProcessInstanceQuery; +import org.flowable.engine.impl.cmd.AddMultiInstanceExecutionCmd; +import org.flowable.engine.impl.cmd.DeleteMultiInstanceExecutionCmd; +import org.flowable.engine.impl.dynamic.DynamicUserTaskBuilder; +import org.flowable.engine.repository.ProcessDefinition; +import org.flowable.engine.runtime.Execution; +import org.flowable.engine.runtime.ProcessInstance; +import org.flowable.engine.task.Comment; +import org.flowable.identitylink.api.history.HistoricIdentityLink; +import org.flowable.image.ProcessDiagramGenerator; +import org.flowable.task.api.DelegationState; +import org.flowable.task.api.Task; +import org.flowable.task.api.TaskQuery; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.api.history.HistoricTaskInstanceQuery; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.io.InputStream; +import java.lang.reflect.Field; +import java.nio.charset.StandardCharsets; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Function; +import java.util.function.Predicate; + +@Service +@Slf4j +public class FlowTaskServiceImpl extends FlowServiceFactory implements IFlowTaskService { + + @Resource + private UmsUserService userService; + @Resource + private UmsRoleService roleService; + @Resource + private FlFormService flFormService; + @Resource + private FlFormItemService flFormItemService; + + @Resource + private FlowGlobalProcessService flowGlobalProcessService; + + @Autowired + JwtUtils jwtUtils; + + + /** + * 完成任务 + * + * @param taskVo 请求实体参数 + */ + @Transactional(rollbackFor = Exception.class) + @Override + public Result complete(FlowTaskVo taskVo) { + Task task = taskService.createTaskQuery().taskId(taskVo.getTaskId()).singleResult(); + if (Objects.isNull(task)) { + return new Result(ResultCode.operate_failure, "任务不存在"); + } + String comment = "无"; + if (StringUtils.isNotBlank(taskVo.getComment())) { + comment = taskVo.getComment(); + } + //处置过后更新defect状态、自动发起报修 + List flFormItemList = flFormItemService.query(FlFormItemDto.builder().procInsId(taskVo.getInstanceId()).build()); + if (flFormItemList != null && flFormItemList.size() > 0) { + FlFormItem flFormItem = flFormItemList.get(0); + String result = flowGlobalProcessService.process(flFormItem); + if (result!=null){ + return new Result(ResultCode.operate_failure, result); + } + } + + if (DelegationState.PENDING.equals(task.getDelegationState())) { + taskService.addComment(taskVo.getTaskId(), taskVo.getInstanceId(), FlowComment.DELEGATE.getType(), comment); + taskService.resolveTask(taskVo.getTaskId(), taskVo.getVariables()); + } else { + taskService.addComment(taskVo.getTaskId(), taskVo.getInstanceId(), FlowComment.NORMAL.getType(), comment); + Long userId = Long.parseLong(jwtUtils.parseToken(ServletUtils.getRequest().getHeader("Authorization")).get("uid")); + taskService.setAssignee(taskVo.getTaskId(), userId.toString()); + taskService.complete(taskVo.getTaskId(), taskVo.getVariables()); + } + + /** + * + * 是否后续节点 + * 1.是:如果还有后续节点,更新taskId和status + * 2.否:如果已经没有后续节点,判断是否有动态节点,有则创建,没有则结束修改流程状态结束 + */ + + Task newTask = taskService.createTaskQuery().processInstanceId(taskVo.getInstanceId()).singleResult(); + if (newTask != null) { + JSONObject config = JSONObject.parseObject((String) CacheUtils.getCache("form_config").getOrDefault(newTask.getFormKey(), null)); + Integer statusCode = FlowStatus.APPROVAL.getCode(); + if (config.containsKey("autoAssign") && config.getInteger("autoAssign") == 1 && newTask.getTaskDefinitionKey().equals("id_1_0")) { + statusCode = FlowStatus.TO_BE_ASSIGNED.getCode(); + } + flFormItemService.update(FlFormItemDto.builder().procInsId(taskVo.getInstanceId()).taskId(newTask.getId()).status(statusCode).build()); + } else { + //flFormItemService.update(FlFormItemDto.builder().procInsId(taskVo.getInstanceId()).taskId("").status(FlowStatus.COMPLETED.getCode()).build()); + // 统一记录日志 可以改为全局处理 + FlFormItem flFormItem = flFormItemService.query(FlFormItemDto.builder().procInsId(taskVo.getInstanceId()).build()).get(0); + flowGlobalProcessService.after(flFormItem); + flFormItem.setTaskId(""); + flFormItem.setStatus(FlowStatus.COMPLETED.getCode()); + JSONObject contents = JSONObject.parseObject(flFormItem.getContents()); + contents.put("actualFinishTime",DateUtils.dateTimeNow()); + flFormItem.setContents(contents.toJSONString()); + flFormItemService.updateById(flFormItem); + } + + return Result.SUCCESS; + } + + /** + * 驳回任务 + * + * @param flowTaskVo + */ + @Override + public void taskReject(FlowTaskVo flowTaskVo) { + if (taskService.createTaskQuery().taskId(flowTaskVo.getTaskId()).singleResult().isSuspended()) { + throw new CustomException("任务处于挂起状态!"); + } + // 当前任务 task + Task task = taskService.createTaskQuery().taskId(flowTaskVo.getTaskId()).singleResult(); + // 获取流程定义信息 + ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(task.getProcessDefinitionId()).singleResult(); + // 获取所有节点信息 + Process process = repositoryService.getBpmnModel(processDefinition.getId()).getProcesses().get(0); + // 获取全部节点列表,包含子节点 + Collection allElements = FlowableUtils.getAllElements(process.getFlowElements(), null); + // 获取当前任务节点元素 + FlowElement source = null; + if (allElements != null) { + for (FlowElement flowElement : allElements) { + // 类型为用户节点 + if (flowElement.getId().equals(task.getTaskDefinitionKey())) { + // 获取节点信息 + source = flowElement; + } + } + } + + // 目的获取所有跳转到的节点 targetIds + // 获取当前节点的所有父级用户任务节点 + // 深度优先算法思想:延边迭代深入 + List parentUserTaskList = FlowableUtils.iteratorFindParentUserTasks(source, null, null); + if (parentUserTaskList == null || parentUserTaskList.size() == 0) { + throw new CustomException("当前节点为初始任务节点,不能驳回"); + } + // 获取活动 ID 即节点 Key + List parentUserTaskKeyList = new ArrayList<>(); + parentUserTaskList.forEach(item -> parentUserTaskKeyList.add(item.getId())); + // 获取全部历史节点活动实例,即已经走过的节点历史,数据采用开始时间升序 + List historicTaskInstanceList = historyService.createHistoricTaskInstanceQuery().processInstanceId(task.getProcessInstanceId()).orderByHistoricTaskInstanceStartTime().asc().list(); + // 数据清洗,将回滚导致的脏数据清洗掉 + List lastHistoricTaskInstanceList = FlowableUtils.historicTaskInstanceClean(allElements, historicTaskInstanceList); + // 此时历史任务实例为倒序,获取最后走的节点 + List targetIds = new ArrayList<>(); + // 循环结束标识,遇到当前目标节点的次数 + int number = 0; + StringBuilder parentHistoricTaskKey = new StringBuilder(); + for (String historicTaskInstanceKey : lastHistoricTaskInstanceList) { + // 当会签时候会出现特殊的,连续都是同一个节点历史数据的情况,这种时候跳过 + if (parentHistoricTaskKey.toString().equals(historicTaskInstanceKey)) { + continue; + } + parentHistoricTaskKey = new StringBuilder(historicTaskInstanceKey); + if (historicTaskInstanceKey.equals(task.getTaskDefinitionKey())) { + number++; + } + // 在数据清洗后,历史节点就是唯一一条从起始到当前节点的历史记录,理论上每个点只会出现一次 + // 在流程中如果出现循环,那么每次循环中间的点也只会出现一次,再出现就是下次循环 + // number == 1,第一次遇到当前节点 + // number == 2,第二次遇到,代表最后一次的循环范围 + if (number == 2) { + break; + } + // 如果当前历史节点,属于父级的节点,说明最后一次经过了这个点,需要退回这个点 + if (parentUserTaskKeyList.contains(historicTaskInstanceKey)) { + targetIds.add(historicTaskInstanceKey); + } + } + + + // 目的获取所有需要被跳转的节点 currentIds + // 取其中一个父级任务,因为后续要么存在公共网关,要么就是串行公共线路 + UserTask oneUserTask = parentUserTaskList.get(0); + // 获取所有正常进行的任务节点 Key,这些任务不能直接使用,需要找出其中需要撤回的任务 + List runTaskList = taskService.createTaskQuery().processInstanceId(task.getProcessInstanceId()).list(); + List runTaskKeyList = new ArrayList<>(); + runTaskList.forEach(item -> runTaskKeyList.add(item.getTaskDefinitionKey())); + // 需驳回任务列表 + List currentIds = new ArrayList<>(); + // 通过父级网关的出口连线,结合 runTaskList 比对,获取需要撤回的任务 + List currentUserTaskList = FlowableUtils.iteratorFindChildUserTasks(oneUserTask, runTaskKeyList, null, null); + currentUserTaskList.forEach(item -> currentIds.add(item.getId())); + + + // 规定:并行网关之前节点必须需存在唯一用户任务节点,如果出现多个任务节点,则并行网关节点默认为结束节点,原因为不考虑多对多情况 + if (targetIds.size() > 1 && currentIds.size() > 1) { + throw new CustomException("任务出现多对多情况,无法撤回"); + } + + // 循环获取那些需要被撤回的节点的ID,用来设置驳回原因 + List currentTaskIds = new ArrayList<>(); + currentIds.forEach(currentId -> runTaskList.forEach(runTask -> { + if (currentId.equals(runTask.getTaskDefinitionKey())) { + currentTaskIds.add(runTask.getId()); + } + })); + // 设置驳回意见 + currentTaskIds.forEach(item -> taskService.addComment(item, task.getProcessInstanceId(), FlowComment.REJECT.getType(), flowTaskVo.getComment() != null ? flowTaskVo.getComment() : "驳回")); + + try { + // 如果父级任务多于 1 个,说明当前节点不是并行节点,原因为不考虑多对多情况 + if (targetIds.size() > 1) { + // 1 对 多任务跳转,currentIds 当前节点(1),targetIds 跳转到的节点(多) + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(task.getProcessInstanceId()). + moveSingleActivityIdToActivityIds(currentIds.get(0), targetIds).changeState(); + } + // 如果父级任务只有一个,因此当前任务可能为网关中的任务 + if (targetIds.size() == 1) { + // 1 对 1 或 多 对 1 情况,currentIds 当前要跳转的节点列表(1或多),targetIds.get(0) 跳转到的节点(1) + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(task.getProcessInstanceId()) + .moveActivityIdsToSingleActivityId(currentIds, targetIds.get(0)).changeState(); + } + } catch (FlowableObjectNotFoundException e) { + throw new CustomException("未找到流程实例,流程可能已发生变化"); + } catch (FlowableException e) { + throw new CustomException("无法取消或开始活动"); + } + + flFormItemService.update(FlFormItemDto.builder().procInsId(flowTaskVo.getInstanceId()).status(FlowStatus.REJECTED.getCode()).build()); + } + + /** + * 退回任务 + * + * @param flowTaskVo 请求实体参数 + */ + @Transactional(rollbackFor = Exception.class) + @Override + public void taskReturn(FlowTaskVo flowTaskVo) { + if (taskService.createTaskQuery().taskId(flowTaskVo.getTaskId()).singleResult().isSuspended()) { + throw new CustomException("任务处于挂起状态"); + } + // 当前任务 task + Task task = taskService.createTaskQuery().taskId(flowTaskVo.getTaskId()).singleResult(); + // 获取流程定义信息 + ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(task.getProcessDefinitionId()).singleResult(); + // 获取所有节点信息 + Process process = repositoryService.getBpmnModel(processDefinition.getId()).getProcesses().get(0); + // 获取全部节点列表,包含子节点 + Collection allElements = FlowableUtils.getAllElements(process.getFlowElements(), null); + // 获取当前任务节点元素 + FlowElement source = null; + // 获取跳转的节点元素 + FlowElement target = null; + if (allElements != null) { + for (FlowElement flowElement : allElements) { + // 当前任务节点元素 + if (flowElement.getId().equals(task.getTaskDefinitionKey())) { + source = flowElement; + } + // 跳转的节点元素 + if (flowElement.getId().equals(flowTaskVo.getTargetKey())) { + target = flowElement; + } + } + } + + // 从当前节点向前扫描 + // 如果存在路线上不存在目标节点,说明目标节点是在网关上或非同一路线上,不可跳转 + // 否则目标节点相对于当前节点,属于串行 + Boolean isSequential = FlowableUtils.iteratorCheckSequentialReferTarget(source, flowTaskVo.getTargetKey(), null, null); + if (!isSequential) { + throw new CustomException("当前节点相对于目标节点,不属于串行关系,无法回退"); + } + + + // 获取所有正常进行的任务节点 Key,这些任务不能直接使用,需要找出其中需要撤回的任务 + List runTaskList = taskService.createTaskQuery().processInstanceId(task.getProcessInstanceId()).list(); + List runTaskKeyList = new ArrayList<>(); + runTaskList.forEach(item -> runTaskKeyList.add(item.getTaskDefinitionKey())); + // 需退回任务列表 + List currentIds = new ArrayList<>(); + // 通过父级网关的出口连线,结合 runTaskList 比对,获取需要撤回的任务 + List currentUserTaskList = FlowableUtils.iteratorFindChildUserTasks(target, runTaskKeyList, null, null); + currentUserTaskList.forEach(item -> currentIds.add(item.getId())); + + // 循环获取那些需要被撤回的节点的ID,用来设置驳回原因 + List currentTaskIds = new ArrayList<>(); + currentIds.forEach(currentId -> runTaskList.forEach(runTask -> { + if (currentId.equals(runTask.getTaskDefinitionKey())) { + currentTaskIds.add(runTask.getId()); + } + })); + // 设置回退意见 + currentTaskIds.forEach(currentTaskId -> taskService.addComment(currentTaskId, task.getProcessInstanceId(), FlowComment.REBACK.getType(), flowTaskVo.getComment())); + + try { + // 1 对 1 或 多 对 1 情况,currentIds 当前要跳转的节点列表(1或多),targetKey 跳转到的节点(1) + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(task.getProcessInstanceId()) + .moveActivityIdsToSingleActivityId(currentIds, flowTaskVo.getTargetKey()).changeState(); + } catch (FlowableObjectNotFoundException e) { + throw new CustomException("未找到流程实例,流程可能已发生变化"); + } catch (FlowableException e) { + throw new CustomException("无法取消或开始活动"); + } + } + + + /** + * 获取所有可回退的节点 + * + * @param flowTaskVo + * @return + */ + @Override + public Result findReturnTaskList(FlowTaskVo flowTaskVo) { +// // 当前任务 task +// Task task = taskService.createTaskQuery().taskId(flowTaskVo.getTaskId()).singleResult(); +// // 从流程历史任务中获取可退回节点 +//// List hisActIns = historyService.createHistoricActivityInstanceQuery() +//// .executionId(task.getExecutionId()) +//// .activityType("userTask") +//// .orderByHistoricActivityInstanceStartTime() +//// .finished() +//// .desc() +//// .list(); +//// +//// // 可回退的节点列表 +//// List returnTaskNodeList = new ArrayList<>(); +//// ReturnTaskNodeVo returnTaskNodeVo; +//// for (HistoricActivityInstance activityInstance : hisActIns) { +//// returnTaskNodeVo = new ReturnTaskNodeVo(); +//// returnTaskNodeVo.setId(activityInstance.getActivityId()); +//// // 根据流程节点处理时间校验改节点是否已完成 +//// returnTaskNodeVo.setName(activityInstance.getActivityName()); +//// returnTaskNodeList.add(returnTaskNodeVo); +//// } +// List userTaskList = new ArrayList<>(); +// // 获取流程定义信息 +// ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(task.getProcessDefinitionId()).singleResult(); +// // 获取所有节点信息,暂不考虑子流程情况 +// Process process = repositoryService.getBpmnModel(processDefinition.getId()).getProcesses().get(0); +// Collection flowElements = process.getFlowElements(); +// // 获取当前任务节点元素 +// UserTask source = null; +// if (flowElements != null) { +// for (FlowElement flowElement : flowElements) { +// // 类型为用户节点 +// if (flowElement.getId().equals(task.getTaskDefinitionKey())) { +// source = (UserTask) flowElement; +// } +// } +// } +// // 获取节点的所有路线 +// List> roads = FlowableUtils.findRoad(source, null, null, null); +// +// for (List road : roads) { +// if (userTaskList.size() == 0) { +// // 还没有可回退节点直接添加 +// userTaskList = road; +// } else { +// // 如果已有回退节点,则比对取交集部分 +// userTaskList.retainAll(road); +// } +// } +// return AjaxResult.success(userTaskList); + // 当前任务 task + Task task = taskService.createTaskQuery().taskId(flowTaskVo.getTaskId()).singleResult(); + // 获取流程定义信息 + ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(task.getProcessDefinitionId()).singleResult(); + // 获取所有节点信息,暂不考虑子流程情况 + Process process = repositoryService.getBpmnModel(processDefinition.getId()).getProcesses().get(0); + Collection flowElements = process.getFlowElements(); + // 获取当前任务节点元素 + UserTask source = null; + if (flowElements != null) { + for (FlowElement flowElement : flowElements) { + // 类型为用户节点 + if (flowElement.getId().equals(task.getTaskDefinitionKey())) { + source = (UserTask) flowElement; + } + } + } + // 获取节点的所有路线 + List> roads = FlowableUtils.findRoad(source, null, null, null); + // 可回退的节点列表 + List userTaskList = new ArrayList<>(); + for (List road : roads) { + if (userTaskList.size() == 0) { + // 还没有可回退节点直接添加 + userTaskList = road; + } else { + // 如果已有回退节点,则比对取交集部分 + userTaskList.retainAll(road); + } + } + return new Result(ResultCode.success, userTaskList); + } + + /** + * 删除任务 + * + * @param flowTaskVo 请求实体参数 + */ + @Override + public void deleteTask(FlowTaskVo flowTaskVo) { + + //待确认删除任务是物理删除任务 还是逻辑删除,让这个任务直接通过? + taskService.deleteTask(flowTaskVo.getTaskId(), flowTaskVo.getComment()); + } + + /** + * 认领/签收任务 + * 认领以后,这个用户就会成为任务的执行人,任务会从其他成员的任务列表中消失 + * + * @param flowTaskVo 请求实体参数 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void claim(FlowTaskVo flowTaskVo) { + taskService.claim(flowTaskVo.getTaskId(), flowTaskVo.getUserId()); + } + + /** + * 取消认领/签收任务 + * + * @param flowTaskVo 请求实体参数 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void unClaim(FlowTaskVo flowTaskVo) { + taskService.unclaim(flowTaskVo.getTaskId()); + } + + /** + * 委派任务 + * 任务委派只是委派人将当前的任务交给被委派人进行审批,处理任务后又重新回到委派人身上。 + * + * @param flowTaskVo 请求实体参数 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void delegateTask(FlowTaskVo flowTaskVo) { + taskService.delegateTask(flowTaskVo.getTaskId(), flowTaskVo.getAssignee()); + } + + /** + * 任务归还 + * 被委派人完成任务之后,将任务归还委派人 + * + * @param flowTaskVo 请求实体参数 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void resolveTask(FlowTaskVo flowTaskVo) { + taskService.resolveTask(flowTaskVo.getTaskId()); + } + + + /** + * 转办任务 + * 直接将办理人换成别人,这时任务的拥有者不再是转办人 + * + * @param flowTaskVo 请求实体参数 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void assignTask(FlowTaskVo flowTaskVo) { + // 直接转派就可以覆盖掉之前的 + taskService.setAssignee(flowTaskVo.getTaskId(), flowTaskVo.getAssignee()); +// // 删除指派人重新指派 +// taskService.deleteCandidateUser(flowTaskVo.getTaskId(),flowTaskVo.getAssignee()); +// taskService.addCandidateUser(flowTaskVo.getTaskId(),flowTaskVo.getAssignee()); +// // 如果要查询转给他人处理的任务,可以同时将OWNER进行设置: +// taskService.setOwner(flowTaskVo.getTaskId(), flowTaskVo.getAssignee()); + + } + + /** + * 多实例加签 + * act_ru_task、act_ru_identitylink各生成一条记录 + * + * @param flowTaskVo + */ + @Override + public void addMultiInstanceExecution(FlowTaskVo flowTaskVo) { + managementService.executeCommand(new AddMultiInstanceExecutionCmd(flowTaskVo.getDefId(), flowTaskVo.getInstanceId(), flowTaskVo.getVariables())); + } + + /** + * 多实例减签 + * act_ru_task减1、act_ru_identitylink不变 + * + * @param flowTaskVo + */ + @Override + public void deleteMultiInstanceExecution(FlowTaskVo flowTaskVo) { + managementService.executeCommand(new DeleteMultiInstanceExecutionCmd(flowTaskVo.getCurrentChildExecutionId(), flowTaskVo.getFlag())); + } + + /** + * 我发起的流程 + * + * @param queryVo 请求参数 + * @return + */ + @Override + public Result myProcess(FlowQueryVo queryVo) { + Page page = new Page<>(); + Long userId = Long.parseLong(jwtUtils.parseToken(ServletUtils.getRequest().getHeader("Authorization")).get("uid")); + //TODO name模糊查询 + HistoricProcessInstanceQuery historicProcessInstanceQuery = historyService.createHistoricProcessInstanceQuery() + .startedBy(userId.toString()) + .orderByProcessInstanceStartTime() + .desc(); + if (queryVo.getType() != null) { + List processDefinitionKeyList = (List) CacheUtils.get("pro_def_key_list", queryVo.getType(), null); + if (processDefinitionKeyList != null) { + historicProcessInstanceQuery.processDefinitionKeyIn(processDefinitionKeyList); + } + } + + List historicProcessInstances = historicProcessInstanceQuery.listPage(queryVo.getPageSize() * (queryVo.getPageNum() - 1), queryVo.getPageSize()); + page.setTotal(historicProcessInstanceQuery.count()); + List flowList = new ArrayList<>(); + for (HistoricProcessInstance hisIns : historicProcessInstances) { + FlowTaskDto flowTask = new FlowTaskDto(); + flowTask.setCreateTime(hisIns.getStartTime()); + flowTask.setFinishTime(hisIns.getEndTime()); + flowTask.setProcInsId(hisIns.getId()); + + //设置变量信息 + FlFormItem flFormItem = flFormItemService.query(FlFormItemDto.builder().procInsId(hisIns.getId()).build()).stream().findFirst().orElse(null); + flowTask.setProcVars(JSONObject.parseObject(flFormItem != null ? flFormItem.getContents() : "{}")); + flowTask.setStatus(flFormItem != null && flFormItem.getStatus() != null ? flFormItem.getStatus() : FlowStatus.EXCEPTION.getCode()); + + // 计算耗时 + if (Objects.nonNull(hisIns.getEndTime())) { + long time = hisIns.getEndTime().getTime() - hisIns.getStartTime().getTime(); + flowTask.setDuration(getDate(time)); + } else { + long time = System.currentTimeMillis() - hisIns.getStartTime().getTime(); + flowTask.setDuration(getDate(time)); + } + // 流程定义信息 + ProcessDefinition pd = repositoryService.createProcessDefinitionQuery() + .processDefinitionId(hisIns.getProcessDefinitionId()) + .singleResult(); + flowTask.setDeployId(pd.getDeploymentId()); + + flowTask.setProcDefKey(pd.getKey()); + flowTask.setProcDefName(pd.getName()); + flowTask.setProcDefVersion(pd.getVersion()); + flowTask.setCategory(pd.getCategory()); + flowTask.setProcDefVersion(pd.getVersion()); + + // 当前所处流程 + List taskList = taskService.createTaskQuery().processInstanceId(hisIns.getId()).list(); + if (CollectionUtils.isNotEmpty(taskList)) { + flowTask.setTaskId(taskList.get(0).getId()); + flowTask.setTaskName(taskList.get(0).getName()); + if (StringUtils.isNotBlank(taskList.get(0).getAssignee())) { + // 当前任务节点办理人信息 + UmsUser sysUser = null; + try { + Long assigneeId = Long.parseLong(taskList.get(0).getAssignee()); + if (assigneeId != null && assigneeId != 0) { + sysUser = userService.getById(assigneeId); + } + } catch (Exception e) { + log.error("Assignee ID is not a valid Long: " + taskList.get(0).getAssignee()); + } + if (Objects.nonNull(sysUser)) { + flowTask.setAssigneeId(sysUser.getUserId()); + flowTask.setAssigneeName(sysUser.getUserName()); + flowTask.setAssigneeDeptName(Objects.nonNull(sysUser.get_umsOrganization()) ? sysUser.get_umsOrganization().getOrganizationName() : ""); + } + } + } else { + List historicTaskInstance = historyService.createHistoricTaskInstanceQuery().processInstanceId(hisIns.getId()).orderByHistoricTaskInstanceEndTime().desc().list(); + flowTask.setTaskId(historicTaskInstance.get(0).getId()); + flowTask.setTaskName(historicTaskInstance.get(0).getName()); + if (StringUtils.isNotBlank(historicTaskInstance.get(0).getAssignee())) { + // 当前任务节点办理人信息 + UmsUser sysUser = userService.getById(Long.parseLong(historicTaskInstance.get(0).getAssignee())); + if (Objects.nonNull(sysUser)) { + flowTask.setAssigneeId(sysUser.getUserId()); + flowTask.setAssigneeName(sysUser.getUserName()); + flowTask.setAssigneeDeptName(Objects.nonNull(sysUser.get_umsOrganization()) ? sysUser.get_umsOrganization().getOrganizationName() : ""); + } + } + } + flowList.add(flowTask); + } + page.setRecords(flowList); + return new Result(ResultCode.success, page); + } + + /** + * 取消申请 + * 目前实现方式: 直接将当前流程变更为已完成 + * + * @param flowTaskVo + * @return + */ + @Override + public Result stopProcess(FlowTaskVo flowTaskVo) { + List task = taskService.createTaskQuery().processInstanceId(flowTaskVo.getInstanceId()).list(); + if (CollectionUtils.isEmpty(task)) { + throw new CustomException("流程未启动或已执行完成,操作失败"); + } + // 获取当前流程实例 + ProcessInstance processInstance = runtimeService.createProcessInstanceQuery() + .processInstanceId(flowTaskVo.getInstanceId()) + .singleResult(); + BpmnModel bpmnModel = repositoryService.getBpmnModel(processInstance.getProcessDefinitionId()); + if (Objects.nonNull(bpmnModel)) { + Process process = bpmnModel.getMainProcess(); + List endNodes = process.findFlowElementsOfType(EndEvent.class, false); + if (CollectionUtils.isNotEmpty(endNodes)) { + // 取消流程为什么要设置流程发起人? +// SysUser loginUser = SecurityUtils.getLoginUser().getUser(); +// Authentication.setAuthenticatedUserId(loginUser.getUserId().toString()); + +// taskService.addComment(task.getId(), processInstance.getProcessInstanceId(), FlowComment.STOP.getType(), +// StringUtils.isBlank(flowTaskVo.getComment()) ? "取消申请" : flowTaskVo.getComment()); + // 获取当前流程最后一个节点 + String endId = endNodes.get(0).getId(); + List executions = runtimeService.createExecutionQuery() + .parentId(processInstance.getProcessInstanceId()).list(); + List executionIds = new ArrayList<>(); + executions.forEach(execution -> executionIds.add(execution.getId())); + // 变更流程为已结束状态 + runtimeService.createChangeActivityStateBuilder().moveExecutionsToSingleActivityId(executionIds, endId).changeState(); + } + } + flFormItemService.update(FlFormItemDto.builder().procInsId(flowTaskVo.getInstanceId()).status(FlowStatus.DISCARDED.getCode()).build()); + return Result.SUCCESS; + } + + /** + * 撤回流程 目前存在错误 + * + * @param flowTaskVo + * @return + */ + @Override + public Result revokeProcess(FlowTaskVo flowTaskVo) { + Task task = taskService.createTaskQuery().processInstanceId(flowTaskVo.getInstanceId()).singleResult(); + if (task == null) { + throw new CustomException("流程未启动或已执行完成,无法撤回"); + } + + String userId = jwtUtils.parseToken(ServletUtils.getRequest().getHeader("Authorization")).get("uid"); + List htiList = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(task.getProcessInstanceId()) + .orderByTaskCreateTime() + .asc() + .list(); + String myTaskId = null; + HistoricTaskInstance myTask = null; + for (HistoricTaskInstance hti : htiList) { + + if (userId.equals(hti.getAssignee())) { + myTaskId = hti.getId(); + myTask = hti; + break; + } + } + if (null == myTaskId) { + throw new CustomException("该任务非当前用户提交,无法撤回"); + } + + String processDefinitionId = myTask.getProcessDefinitionId(); + BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId); + + //变量 +// Map variables = runtimeService.getVariableInstances(currentTask.getExecutionId()); + String myActivityId = null; + List haiList = historyService.createHistoricActivityInstanceQuery() + .executionId(myTask.getExecutionId()).finished().list(); + for (HistoricActivityInstance hai : haiList) { + if (myTaskId.equals(hai.getTaskId())) { + myActivityId = hai.getActivityId(); + break; + } + } + FlowNode myFlowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(myActivityId); + + Execution execution = runtimeService.createExecutionQuery().executionId(task.getExecutionId()).singleResult(); + String activityId = execution.getActivityId(); + FlowNode flowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(activityId); + + //记录原活动方向 + List oriSequenceFlows = new ArrayList<>(flowNode.getOutgoingFlows()); + + //退回到初始节点 + // 创建一条新的 SequenceFlow 指向 myFlowNode + SequenceFlow tempFlow = new SequenceFlow(); + tempFlow.setId("tempFlow_" + System.currentTimeMillis()); // 确保 ID 唯一 + tempFlow.setSourceFlowElement(flowNode); + tempFlow.setTargetFlowElement(myFlowNode); + tempFlow.setName("Temporary Flow"); // 可选,设置名称便于排查 + + // 清空当前节点的 outgoing flows,并添加临时的 SequenceFlow + flowNode.getOutgoingFlows().clear(); + flowNode.getOutgoingFlows().add(tempFlow); + + // 完成当前任务,使流程流转到 myFlowNode + taskService.complete(task.getId()); + // 查询新创建的任务(即撤回后的任务) + Task newTask = taskService.createTaskQuery() + .processInstanceId(task.getProcessInstanceId()) + .taskDefinitionKey(myFlowNode.getId()) // 使用 myFlowNode 的 ID 作为任务定义键 + .singleResult(); + + if (newTask != null) { + //更新节点状态 + flFormItemService.update(FlFormItemDto.builder().procInsId(flowTaskVo.getInstanceId()).taskId(newTask.getId()).status(FlowStatus.DRAFTING.getCode()).build()); + } + // 恢复原有的 outgoing flows,确保流程模型不被永久修改 + flowNode.getOutgoingFlows().clear(); + flowNode.getOutgoingFlows().addAll(oriSequenceFlows); + + return Result.SUCCESS; + } + + /** + * 待办任务列表 + * + * @param queryVo 请求参数 + * @return + */ + @Override + public Result todoList(FlowQueryVo queryVo) { + Page page = new Page<>(); + // 只查看自己的数据 + Long userId = Long.parseLong(jwtUtils.parseToken(ServletUtils.getRequest().getHeader("Authorization")).get("uid")); + UmsUser sysUser = userService.getById(userId); + // 通过角色查找 + List roles = new ArrayList<>(); + roles.add(sysUser.get_umsRole().getRoleId().toString()); + + TaskQuery taskQuery = taskService.createTaskQuery() + .active() + .includeProcessVariables() + .orderByTaskCreateTime().desc() + .taskCandidateGroupIn(roles) + .taskCandidateOrAssigned(sysUser.getUserId().toString()); + if (queryVo.getType() != null) { + List processDefinitionKeyList = (List) CacheUtils.get("pro_def_key_list", queryVo.getType(), null); + if (processDefinitionKeyList != null) { + taskQuery.processDefinitionKeyIn(processDefinitionKeyList); + } + } + +// 传入名称查询不到数据? +// if (StringUtils.isNotBlank(queryVo.getName())){ +// taskQuery.processDefinitionNameLike(queryVo.getName()); +// } + page.setTotal(taskQuery.count()); + List taskList = taskQuery.listPage(queryVo.getPageSize() * (queryVo.getPageNum() - 1), queryVo.getPageSize()); + List flowList = new ArrayList<>(); + for (Task task : taskList) { + FlowTaskDto flowTask = new FlowTaskDto(); + // 当前流程信息 + flowTask.setTaskId(task.getId()); + flowTask.setTaskDefKey(task.getTaskDefinitionKey()); + flowTask.setCreateTime(task.getCreateTime()); + flowTask.setProcDefId(task.getProcessDefinitionId()); + flowTask.setExecutionId(task.getExecutionId()); + flowTask.setTaskName(task.getName()); + + // 流程定义信息 + ProcessDefinition pd = repositoryService.createProcessDefinitionQuery() + .processDefinitionId(task.getProcessDefinitionId()) + .singleResult(); + flowTask.setDeployId(pd.getDeploymentId()); + + flowTask.setProcDefKey(pd.getKey()); + flowTask.setProcDefName(pd.getName()); + flowTask.setProcDefVersion(pd.getVersion()); + flowTask.setProcInsId(task.getProcessInstanceId()); + flowTask.setProcVars(task.getProcessVariables()); + flowTask.setTaskLocalVars(task.getTaskLocalVariables()); + + FlFormItem flFormItem = flFormItemService.query(FlFormItemDto.builder().procInsId(task.getProcessInstanceId()).build()).stream().findFirst().orElse(null); + flowTask.setStatus(flFormItem != null && flFormItem.getStatus() != null ? flFormItem.getStatus() : FlowStatus.EXCEPTION.getCode()); + + // 流程发起人信息 + HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() + .processInstanceId(task.getProcessInstanceId()) + .singleResult(); + UmsUser startUser = userService.getById(Long.parseLong(historicProcessInstance.getStartUserId())); + flowTask.setStartUserId(startUser.getUserId().toString()); + flowTask.setStartUserName(startUser.getUserName()); + flowTask.setStartDeptName(Objects.nonNull(startUser.get_umsOrganization()) ? startUser.get_umsOrganization().getOrganizationName() : ""); + flowList.add(flowTask); + } + + page.setRecords(flowList); + return new Result<>(ResultCode.success, page); + } + + /** + * 待办任务消息 + */ + @Override + public Result todoListMSG(FlowQueryVo queryVo) { + Page page = new Page<>(); + // 只查看自己的数据 + Long userId = Long.parseLong(jwtUtils.parseToken(ServletUtils.getRequest().getHeader("Authorization")).get("uid")); + UmsUser sysUser = userService.getById(userId); + // 通过角色查找 + List roles = new ArrayList<>(); + roles.add(sysUser.get_umsRole().getRoleId().toString()); + + TaskQuery taskQuery = taskService.createTaskQuery() + .active() + .includeProcessVariables() + .orderByTaskCreateTime().desc() + .taskCandidateGroupIn(roles) + .taskCandidateOrAssigned(sysUser.getUserId().toString()); + + page.setTotal(taskQuery.count()); + List taskList = taskQuery.listPage(queryVo.getPageSize() * (queryVo.getPageNum() - 1), queryVo.getPageSize()); + + List flowList = new ArrayList<>(); + for (Task task : taskList) { + FlowTaskMessageDto flowTask = new FlowTaskMessageDto(); + // 当前流程信息 + flowTask.setTaskId(task.getId()); + flowTask.setCreateTime(task.getCreateTime()); + + // 流程定义信息 + ProcessDefinition pd = repositoryService.createProcessDefinitionQuery() + .processDefinitionId(task.getProcessDefinitionId()) + .singleResult(); + flowTask.setProcInsId(task.getProcessInstanceId()); + + FlFormItem flFormItem = flFormItemService.query(FlFormItemDto.builder().procInsId(task.getProcessInstanceId()).build()).stream().findFirst().orElse(null); + Integer taskStatus = flFormItem != null && flFormItem.getStatus() != null ? flFormItem.getStatus() : FlowStatus.EXCEPTION.getCode(); + flowTask.setStatus(taskStatus); + + // 流程发起人信息 + HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() + .processInstanceId(task.getProcessInstanceId()) + .singleResult(); + UmsUser startUser = userService.getById(Long.parseLong(historicProcessInstance.getStartUserId())); + flowTask.setType(FlowStatus.getByCode(taskStatus).getInfo()); + flowTask.setContent(startUser.getUserName() + "提交" + pd.getName() + "流程"); + flowList.add(flowTask); + } + page.setRecords(flowList); + return new Result<>(ResultCode.success, page); + } + + + @Override + public long todoListCount() { + Long userId = Long.parseLong(jwtUtils.parseToken(ServletUtils.getRequest().getHeader("Authorization")).get("uid")); + UmsUser sysUser = userService.getById(userId); + List roles = new ArrayList<>(); + + roles.add(sysUser.get_umsRole().getRoleId().toString()); + TaskQuery taskQuery = taskService.createTaskQuery() + .active() + .includeProcessVariables() + .taskCandidateGroupIn(roles) + .taskCandidateOrAssigned(sysUser.getUserId().toString()) + .orderByTaskCreateTime().desc(); + return taskQuery.count(); + } + + + /** + * 已办任务列表 + * + * @param queryVo 请求参数 + * @return + */ + @Override + public Result finishedList(FlowQueryVo queryVo) { + Page page = new Page<>(); + Long userId = Long.parseLong(jwtUtils.parseToken(ServletUtils.getRequest().getHeader("Authorization")).get("uid")); + HistoricTaskInstanceQuery taskInstanceQuery = historyService.createHistoricTaskInstanceQuery() + .includeProcessVariables() + .finished() + .taskAssignee(userId.toString()) + .orderByHistoricTaskInstanceEndTime() + .desc(); + if (queryVo.getType() != null) { + List processDefinitionKeyList = (List) CacheUtils.get("pro_def_key_list", queryVo.getType(), null); + if (processDefinitionKeyList != null) { + taskInstanceQuery.processDefinitionKeyIn(processDefinitionKeyList); + } + } + List historicTaskInstanceList = taskInstanceQuery.listPage(queryVo.getPageSize() * (queryVo.getPageNum() - 1), queryVo.getPageSize()); + List hisTaskList = new ArrayList<>(); + for (HistoricTaskInstance histTask : historicTaskInstanceList) { + FlowTaskDto flowTask = new FlowTaskDto(); + + FlFormItem flFormItem = flFormItemService.query(FlFormItemDto.builder().procInsId(histTask.getProcessInstanceId()).build()).stream().findFirst().orElse(null); + flowTask.setStatus(flFormItem != null && flFormItem.getStatus() != null ? flFormItem.getStatus() : FlowStatus.EXCEPTION.getCode()); + // 当前流程信息 + flowTask.setTaskId(histTask.getId()); + // 审批人员信息 + flowTask.setCreateTime(histTask.getCreateTime()); + flowTask.setFinishTime(histTask.getEndTime()); + flowTask.setDuration(getDate(histTask.getDurationInMillis())); + flowTask.setProcDefId(histTask.getProcessDefinitionId()); + flowTask.setTaskDefKey(histTask.getTaskDefinitionKey()); + flowTask.setTaskName(histTask.getName()); + + // 流程定义信息 + ProcessDefinition pd = repositoryService.createProcessDefinitionQuery() + .processDefinitionId(histTask.getProcessDefinitionId()) + .singleResult(); + flowTask.setDeployId(pd.getDeploymentId()); + flowTask.setProcDefKey(pd.getKey()); + flowTask.setProcDefName(pd.getName()); + flowTask.setProcDefVersion(pd.getVersion()); + flowTask.setProcInsId(histTask.getProcessInstanceId()); + flowTask.setHisProcInsId(histTask.getProcessInstanceId()); + flowTask.setProcVars(histTask.getProcessVariables()); + flowTask.setTaskLocalVars(histTask.getTaskLocalVariables()); + + + // 流程发起人信息 + HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() + .processInstanceId(histTask.getProcessInstanceId()) + .singleResult(); + UmsUser startUser = userService.getById(Long.parseLong(historicProcessInstance.getStartUserId())); + flowTask.setStartUserId(startUser.getUserId().toString()); + flowTask.setStartUserName(startUser.getUserName()); + flowTask.setStartDeptName(startUser.get_umsOrganization().getOrganizationName()); + hisTaskList.add(flowTask); + + } + page.setTotal(taskInstanceQuery.count()); + page.setRecords(hisTaskList); + return new Result<>(ResultCode.success, page); + } + + private static Predicate distinctByKey(Function keyExtractor) { + Set seen = ConcurrentHashMap.newKeySet(); + return t -> seen.add(keyExtractor.apply(t)); + } + + /** + * 流程历史流转记录 + * + * @param procInsId 流程实例Id + * @return + */ + @Override + public Result flowRecord(String procInsId, String deployId) { + Map map = new HashMap(); + if (StringUtils.isNotBlank(procInsId)) { + List list = historyService + .createHistoricActivityInstanceQuery() + .processInstanceId(procInsId) + .orderByHistoricActivityInstanceStartTime() + .desc().list(); + List hisFlowList = new ArrayList<>(); + for (HistoricActivityInstance histIns : list) { + // 展示开始节点 +// if ("startEvent".equals(histIns.getActivityType())) { +// FlowTaskDto flowTask = new FlowTaskDto(); +// // 流程发起人信息 +// HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() +// .processInstanceId(histIns.getProcessInstanceId()) +// .singleResult(); +// SysUser startUser = userService.selectUserById(Long.parseLong(historicProcessInstance.getStartUserId())); +// flowTask.setTaskName(startUser.getNickName() + "(" + startUser.getDept().getDeptName() + ")发起申请"); +// flowTask.setFinishTime(histIns.getEndTime()); +// hisFlowList.add(flowTask); +// } else if ("endEvent".equals(histIns.getActivityType())) { +// FlowTaskDto flowTask = new FlowTaskDto(); +// flowTask.setTaskName(StringUtils.isNotBlank(histIns.getActivityName()) ? histIns.getActivityName() : "结束"); +// flowTask.setFinishTime(histIns.getEndTime()); +// hisFlowList.add(flowTask); +// } else + if (StringUtils.isNotBlank(histIns.getTaskId())) { + FlowTaskDto flowTask = new FlowTaskDto(); + flowTask.setTaskId(histIns.getTaskId()); + flowTask.setTaskName(histIns.getActivityName()); + flowTask.setCreateTime(histIns.getStartTime()); + flowTask.setFinishTime(histIns.getEndTime()); + if (StringUtils.isNotBlank(histIns.getAssignee())) { + UmsUser sysUser = userService.getById(Long.parseLong(histIns.getAssignee())); + flowTask.setAssigneeId(sysUser.getUserId()); + flowTask.setAssigneeName(sysUser.getUserName()); + flowTask.setDeptName(Objects.nonNull(sysUser.get_umsOrganization()) ? sysUser.get_umsOrganization().getOrganizationName() : ""); + } + // 展示审批人员 + List linksForTask = historyService.getHistoricIdentityLinksForTask(histIns.getTaskId()); + StringBuilder stringBuilder = new StringBuilder(); + for (HistoricIdentityLink identityLink : linksForTask) { + // 获选人,候选组/角色(多个) + if ("candidate".equals(identityLink.getType())) { + if (StringUtils.isNotBlank(identityLink.getUserId())) { + UmsUser sysUser = userService.getById(Long.parseLong(identityLink.getUserId())); + stringBuilder.append(sysUser.getUserName()).append(","); + } + if (StringUtils.isNotBlank(identityLink.getGroupId())) { + UmsRole sysRole = roleService.getById(Long.parseLong(identityLink.getGroupId())); + stringBuilder.append(sysRole.getRoleName()).append(","); + } + } + } + if (StringUtils.isNotBlank(stringBuilder)) { + flowTask.setCandidate(stringBuilder.substring(0, stringBuilder.length() - 1)); + } + + flowTask.setDuration(histIns.getDurationInMillis() == null || histIns.getDurationInMillis() == 0 ? null : getDate(histIns.getDurationInMillis())); + // 获取意见评论内容 + List commentList = taskService.getProcessInstanceComments(histIns.getProcessInstanceId()); + commentList.forEach(comment -> { + if (histIns.getTaskId().equals(comment.getTaskId())) { + flowTask.setComment(FlowCommentDto.builder().type(comment.getType()).comment(comment.getFullMessage()).build()); + } + }); + hisFlowList.add(flowTask); + } + } + map.put("flowList", hisFlowList); + } + // 第一次申请获取初始化表单 +// if (StringUtils.isNotBlank(deployId)) { +// FlForm sysForm = flFormService.selectByDeployId(deployId); +// if (Objects.isNull(sysForm)) { +// return new Result(ResultCode.operate_failure.getCode(), "请先配置流程表单"); +// } +// map.put("formData", JSONObject.parseObject(sysForm.getConfig())); +// } + return new Result(ResultCode.success, map); + } + + /** + * 根据任务ID查询挂载的表单信息 + * + * @param taskId 任务Id + * @return + */ + @Override + public Task getTaskForm(String taskId) { + Task task = taskService.createTaskQuery().taskId(taskId).singleResult(); + return task; + } + + /** + * 获取流程过程图 + * + * @param processId + * @return + */ + @Override + public InputStream diagram(String processId) { + String processDefinitionId; + // 获取当前的流程实例 + ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processId).singleResult(); + // 如果流程已经结束,则得到结束节点 + if (Objects.isNull(processInstance)) { + HistoricProcessInstance pi = historyService.createHistoricProcessInstanceQuery().processInstanceId(processId).singleResult(); + + processDefinitionId = pi.getProcessDefinitionId(); + } else {// 如果流程没有结束,则取当前活动节点 + // 根据流程实例ID获得当前处于活动状态的ActivityId合集 + ProcessInstance pi = runtimeService.createProcessInstanceQuery().processInstanceId(processId).singleResult(); + processDefinitionId = pi.getProcessDefinitionId(); + } + + // 获得活动的节点 + List highLightedFlowList = historyService.createHistoricActivityInstanceQuery().processInstanceId(processId).orderByHistoricActivityInstanceStartTime().asc().list(); + + List highLightedFlows = new ArrayList<>(); + List highLightedNodes = new ArrayList<>(); + //高亮线 + for (HistoricActivityInstance tempActivity : highLightedFlowList) { + if ("sequenceFlow".equals(tempActivity.getActivityType())) { + //高亮线 + highLightedFlows.add(tempActivity.getActivityId()); + } else { + //高亮节点 + highLightedNodes.add(tempActivity.getActivityId()); + } + } + + //获取流程图 + BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId); + ProcessEngineConfiguration configuration = processEngine.getProcessEngineConfiguration(); + //获取自定义图片生成器 + ProcessDiagramGenerator diagramGenerator = new CustomProcessDiagramGenerator(); + InputStream in = diagramGenerator.generateDiagram(bpmnModel, "png", highLightedNodes, highLightedFlows, configuration.getActivityFontName(), + configuration.getLabelFontName(), configuration.getAnnotationFontName(), configuration.getClassLoader(), 1.0, true); + return in; + + } + + /** + * 获取流程执行节点 + * + * @param procInsId 流程实例id + * @return + */ + @Override + public Result getFlowViewer(String procInsId, String executionId) { + List flowViewerList = new ArrayList<>(); + FlowViewerDto flowViewerDto; + // 获取任务开始节点(临时处理方式) + List startNodeList = historyService.createHistoricActivityInstanceQuery() + .processInstanceId(procInsId) + .orderByHistoricActivityInstanceStartTime() + .asc().listPage(0, 3); + for (HistoricActivityInstance startInstance : startNodeList) { + if (!"sequenceFlow".equals(startInstance.getActivityType())) { + flowViewerDto = new FlowViewerDto(); + if (!"sequenceFlow".equals(startInstance.getActivityType())) { + flowViewerDto.setKey(startInstance.getActivityId()); + // 根据流程节点处理时间校验改节点是否已完成 + flowViewerDto.setCompleted(!Objects.isNull(startInstance.getEndTime())); + flowViewerList.add(flowViewerDto); + } + } + } + // 历史节点 + List hisActIns = historyService.createHistoricActivityInstanceQuery() + .executionId(executionId) + .orderByHistoricActivityInstanceStartTime() + .asc().list(); + for (HistoricActivityInstance activityInstance : hisActIns) { + if (!"sequenceFlow".equals(activityInstance.getActivityType())) { + flowViewerDto = new FlowViewerDto(); + flowViewerDto.setKey(activityInstance.getActivityId()); + // 根据流程节点处理时间校验改节点是否已完成 + flowViewerDto.setCompleted(!Objects.isNull(activityInstance.getEndTime())); + flowViewerList.add(flowViewerDto); + } + } + return new Result(ResultCode.success, flowViewerList); + } + + /** + * 获取流程变量 + * + * @param taskId + * @return + */ + @Override + public Result processVariables(String taskId) { +// HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() +// .processInstanceId(task.getProcessInstanceId()) +// .singleResult(); +// SysUser startUser = userService.selectUserById(Long.parseLong(historicProcessInstance.getStartUserId())); + + // 流程变量 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery().includeProcessVariables().finished().taskId(taskId).singleResult(); + if (Objects.nonNull(historicTaskInstance)) { + return new Result(ResultCode.success, historicTaskInstance.getProcessVariables()); + } else { + Map variables = taskService.getVariables(taskId); + return new Result(ResultCode.success, variables); + } + } + + /** + * 获取下一节点 + * + * @param flowTaskVo 任务 + * @return + */ + @Override + public Result getNextFlowNode(FlowTaskVo flowTaskVo) { + // Step 1. 获取当前节点并找到下一步节点 + Task task = taskService.createTaskQuery().taskId(flowTaskVo.getTaskId()).singleResult(); + FlowNextDto flowNextDto = new FlowNextDto(); + if (Objects.nonNull(task)) { + // Step 2. 获取当前流程所有流程变量(网关节点时需要校验表达式) + Map variables = taskService.getVariables(task.getId()); + List nextUserTask = FindNextNodeUtil.getNextUserTasks(repositoryService, task, variables); + if (CollectionUtils.isNotEmpty(nextUserTask)) { + for (UserTask userTask : nextUserTask) { + MultiInstanceLoopCharacteristics multiInstance = userTask.getLoopCharacteristics(); + // 会签节点 + if (Objects.nonNull(multiInstance)) { + flowNextDto.setVars(multiInstance.getInputDataItem()); + flowNextDto.setType(ProcessConstants.PROCESS_MULTI_INSTANCE); + flowNextDto.setDataType(ProcessConstants.DYNAMIC); + } else { + // 读取自定义节点属性 判断是否是否需要动态指定任务接收人员、组 + String dataType = userTask.getAttributeValue(ProcessConstants.NAMASPASE, ProcessConstants.PROCESS_CUSTOM_DATA_TYPE); + String userType = userTask.getAttributeValue(ProcessConstants.NAMASPASE, ProcessConstants.PROCESS_CUSTOM_USER_TYPE); + flowNextDto.setVars(ProcessConstants.PROCESS_APPROVAL); + flowNextDto.setType(userType); + flowNextDto.setDataType(dataType); + } + } + } else { + return new Result(ResultCode.success, "流程已完结"); + } + } + return new Result(ResultCode.success, flowNextDto); + } + + /** + * 获取下一节点 + * + * @param flowTaskVo 任务 + * @return + */ + @Override + public Result getNextFlowNodeByStart(FlowTaskVo flowTaskVo) { + ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(flowTaskVo.getDeploymentId()).singleResult(); + // Step 1. 获取当前节点并找到下一步节点 + FlowNextDto flowNextDto = new FlowNextDto(); + // Step 2. 获取当前流程所有流程变量(网关节点时需要校验表达式) + List nextUserTask = FindNextNodeUtil.getNextUserTasksByStart(repositoryService, processDefinition, flowTaskVo.getVariables()); + if (CollectionUtils.isNotEmpty(nextUserTask)) { + for (UserTask userTask : nextUserTask) { + MultiInstanceLoopCharacteristics multiInstance = userTask.getLoopCharacteristics(); + // 会签节点 + if (Objects.nonNull(multiInstance)) { + flowNextDto.setVars(multiInstance.getInputDataItem()); + flowNextDto.setType(ProcessConstants.PROCESS_MULTI_INSTANCE); + flowNextDto.setDataType(ProcessConstants.DYNAMIC); + } else { + // 读取自定义节点属性 判断是否是否需要动态指定任务接收人员、组 + String dataType = userTask.getAttributeValue(ProcessConstants.NAMASPASE, ProcessConstants.PROCESS_CUSTOM_DATA_TYPE); + String userType = userTask.getAttributeValue(ProcessConstants.NAMASPASE, ProcessConstants.PROCESS_CUSTOM_USER_TYPE); + flowNextDto.setVars(ProcessConstants.PROCESS_APPROVAL); + flowNextDto.setType(userType); + flowNextDto.setDataType(dataType); + } + } + } + return new Result(ResultCode.success, flowNextDto); + } + + /** + * 流程初始化表单 + * + * @param deployId + * @return + */ + @Override + public Result flowFormData(String deployId) { + // 第一次申请获取初始化表单 + if (StringUtils.isNotBlank(deployId)) { + FlForm sysForm = flFormService.selectByDeployId(deployId); + if (Objects.isNull(sysForm)) { + return new Result(ResultCode.operate_failure.getCode(), "请先配置流程表单!"); + } + return new Result(ResultCode.success, JSONObject.parseObject(sysForm.getConfig())); + } else { + return new Result(ResultCode.operate_failure.getCode(), "参数错误"); + } + } + + /** + * 流程节点信息 + * + * @param procInsId + * @return + */ + @Override + public Result flowXmlAndNode(String procInsId, String deployId) { + try { + List flowViewerList = new ArrayList<>(); + // 获取已经完成的节点 + List listFinished = historyService.createHistoricActivityInstanceQuery() + .processInstanceId(procInsId) + .finished() + .list(); + + // 保存已经完成的流程节点编号 + listFinished.forEach(s -> { + FlowViewerDto flowViewerDto = new FlowViewerDto(); + flowViewerDto.setKey(s.getActivityId()); + flowViewerDto.setCompleted(true); + flowViewerList.add(flowViewerDto); + }); + + // 获取代办节点 + List listUnFinished = historyService.createHistoricActivityInstanceQuery() + .processInstanceId(procInsId) + .unfinished() + .list(); + + // 保存需要代办的节点编号 + listUnFinished.forEach(s -> { + FlowViewerDto flowViewerDto = new FlowViewerDto(); + flowViewerDto.setKey(s.getActivityId()); + flowViewerDto.setCompleted(false); + flowViewerList.add(flowViewerDto); + }); + Map result = new HashMap(); + // xmlData 数据 + ProcessDefinition definition = repositoryService.createProcessDefinitionQuery().deploymentId(deployId).singleResult(); + InputStream inputStream = repositoryService.getResourceAsStream(definition.getDeploymentId(), definition.getResourceName()); + String xmlData = IOUtils.toString(inputStream, StandardCharsets.UTF_8); + result.put("nodeData", flowViewerList); + result.put("xmlData", xmlData); + return new Result(ResultCode.success, result); + } catch (Exception e) { + return new Result(ResultCode.operate_failure.getCode(), "高亮历史任务失败"); + } + } + + /** + * 流程节点表单 + * + * @param taskId 流程任务编号 + * @return + */ + @Override + public Result flowTaskForm(String taskId) throws Exception { + JSONObject result = new JSONObject(); + result.put("formKeyExist", false); + Task task = taskService.createTaskQuery().taskId(taskId).singleResult(); + BpmnModel bpmnModel = repositoryService.getBpmnModel(task.getProcessDefinitionId()); + FlowElement flowElement = bpmnModel.getFlowElement(task.getTaskDefinitionKey()); + // 流程变量 + Map parameters = new HashMap<>(); + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery().includeProcessVariables().finished().taskId(taskId).singleResult(); + if (Objects.nonNull(historicTaskInstance)) { + parameters = historicTaskInstance.getProcessVariables(); + } else { + parameters = taskService.getVariables(taskId); + } + // 暂时只处理用户任务上的表单 + if (flowElement instanceof UserTask) { + String formKey = ((UserTask) flowElement).getFormKey(); + if (StringUtils.isNotBlank(formKey)) { + FlForm sysForm = flFormService.getById(Long.parseLong(formKey)); + + JSONObject oldVariables = JSONObject.parseObject(JSON.toJSONString(parameters.get("variables"))); + List oldFields = JSON.parseObject(JSON.toJSONString(oldVariables.get("fields")), new TypeReference>() { + }); + oldFields.forEach(obj -> obj.put("disabled", true)); + + JSONObject data = JSONObject.parseObject(sysForm.getConfig()); + List newFields = JSON.parseObject(JSON.toJSONString(data.get("fields")), new TypeReference>() { + }); + + oldFields.addAll(newFields); + oldVariables.put("fields", oldFields); + oldVariables.put("disabled", false); + oldVariables.put("formBtns", true); + result.put("formData", oldVariables); + result.put("formKeyExist", true); + return new Result<>(ResultCode.success, result); + } else { + result.put("formData", parameters.get("variables")); + return new Result<>(ResultCode.success, result); + } + } else { + result.put("formData", parameters.get("variables")); + return new Result<>(ResultCode.success, result); + } + } + + @Override + public Result> homePage() { + // 获取历史任务实例 + HistoricTaskInstanceQuery taskInstanceQuery = historyService.createHistoricTaskInstanceQuery() + .includeProcessVariables() + .orderByHistoricTaskInstanceEndTime() + .desc(); + List historicTaskInstanceList = taskInstanceQuery.list(); + List result = new ArrayList<>(); + + // 获取当前用户信息 + Long userId = Long.parseLong(jwtUtils.parseToken(ServletUtils.getRequest().getHeader("Authorization")).get("uid")); + UmsUser sysUser = userService.getById(userId); + List roles = new ArrayList<>(); + roles.add(sysUser.get_umsRole().getRoleId().toString()); + + // 获取当前活跃的任务 + TaskQuery taskQuery = taskService.createTaskQuery() + .active() + .includeProcessVariables() + .taskCandidateGroupIn(roles) + .taskCandidateOrAssigned(sysUser.getUserId().toString()) + .orderByTaskCreateTime().desc(); + List taskList = taskQuery.list(); + + // 定义用于统计的映射 + Map totalCountMap = new HashMap<>(); + Map increaseCountMap = new HashMap<>(); + Map todoCountMap = new HashMap<>(); + + // 获取今天的开始时间 + Date todayStart = DateUtils.parseDate(DateUtils.getDate()); + + // 统计历史任务的总数和当日新增 + List formItemList = flFormItemService.query(new FlFormItemDto()); + for (FlFormItem formItem : formItemList) { + // 动态节点导致新增两条数据 + String type = PlanTypeEnum.getInfo(formItem.getFormKey()); + if (type == null) { + type = "资管流程"; + } else { + type = "设备流程"; + } + // 总数统计 + totalCountMap.put(type, totalCountMap.getOrDefault(type, 0) + 1); + // 当日新增统计 + Date createTime = formItem.getCreateTime(); + if (createTime != null && createTime.after(todayStart)) { + increaseCountMap.put(type, increaseCountMap.getOrDefault(type, 0) + 1); + } + } +// for (HistoricTaskInstance histTask : historicTaskInstanceList) { +// // 动态节点导致新增两条数据 +// String type = PlanTypeEnum.getInfo(histTask.getFormKey()); +// if (type == null) { +// type = "资管流程"; +// } else { +// type = "设备流程"; +// } +// // 总数统计 +// totalCountMap.put(type, totalCountMap.getOrDefault(type, 0) + 1); +// // 当日新增统计 +// Date createTime = histTask.getCreateTime(); +// if (createTime != null && createTime.after(todayStart)) { +// increaseCountMap.put(type, increaseCountMap.getOrDefault(type, 0) + 1); +// } +// } + + // 统计代办任务 + for (Task task : taskList) { + + String type = PlanTypeEnum.getInfo(task.getFormKey()); + if (type == null) { + type = "资管流程"; + } else { + type = "设备流程"; + } + + // 代办统计 + todoCountMap.put(type, todoCountMap.getOrDefault(type, 0) + 1); + } + + // 获取所有类型的集合 + Set allTypes = new HashSet<>(); + allTypes.addAll(totalCountMap.keySet()); + allTypes.addAll(todoCountMap.keySet()); + + // 组装结果 + for (String type : allTypes) { + int count = totalCountMap.getOrDefault(type, 0); + int increase = increaseCountMap.getOrDefault(type, 0); + int todo = todoCountMap.getOrDefault(type, 0); + ProcessHomePageVo vo = new ProcessHomePageVo(type, count, increase, todo); + result.add(vo); + } + + return new Result<>(ResultCode.success, result); + } + + /** + * 将Object类型的数据转化成Map + * + * @param obj + * @return + * @throws Exception + */ + public Map obj2Map(Object obj) throws Exception { + Map map = new HashMap(); + Field[] fields = obj.getClass().getDeclaredFields(); + for (Field field : fields) { + field.setAccessible(true); + map.put(field.getName(), field.get(obj)); + } + return map; + } + + /** + * 流程完成时间处理 + * + * @param ms + * @return + */ + private String getDate(long ms) { + + long day = ms / (24 * 60 * 60 * 1000); + long hour = (ms / (60 * 60 * 1000) - day * 24); + long minute = ((ms / (60 * 1000)) - day * 24 * 60 - hour * 60); + long second = (ms / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - minute * 60); + + if (day > 0) { + return day + "天" + hour + "小时" + minute + "分钟"; + } + if (hour > 0) { + return hour + "小时" + minute + "分钟"; + } + if (minute > 0) { + return minute + "分钟"; + } + if (second > 0) { + return second + "秒"; + } else { + return 0 + "秒"; + } + } + + private boolean isDynamic(String processInstanceId, String taskId) { + // 通过 processInstanceId 查询 ProcessInstance + ProcessInstance processInstance = runtimeService.createProcessInstanceQuery() + .processInstanceId(processInstanceId) + .singleResult(); + + if (processInstance == null) { + log.error("未找到对应的流程实例,processInstanceId: {}", processInstanceId); + return false; + } + String processDefinitionId = processInstance.getProcessDefinitionId(); + return true; + //setDynamicNode(processDefinitionId, processInstanceId, taskId, "test", "admin", "userTask_1") + } + + /** + * 动态添加节点 + * + * @param processDefinitionId + * @param processInstanceId + * @param nodeId + * @param nodeName + * @param assignee + * @param flowElementId + */ + private void setDynamicNode(String processDefinitionId, String processInstanceId, String nodeId, String nodeName, String assignee, String flowElementId) { + ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(processDefinitionId).latestVersion().singleResult(); + if (Objects.nonNull(processDefinition) && processDefinition.isSuspended()) { + log.error("流程已被挂起,请先激活流程"); + } + + DynamicUserTaskBuilder dynamicUserTaskBuilder = new DynamicUserTaskBuilder(); + dynamicUserTaskBuilder.setId(nodeId); + dynamicUserTaskBuilder.setName(nodeName); + dynamicUserTaskBuilder.setAssignee(assignee); + BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinition.getId()); + Process process = bpmnModel.getProcesses().get(0); + try { + managementService.executeCommand(new CustomInjectUserTaskInProcessInstanceCmd(processInstanceId, dynamicUserTaskBuilder, process.getFlowElement(flowElementId))); + } catch (Exception e) { + log.error("动态节点设置失败:", e.getMessage(), e); + } + } +} diff --git a/flowable/src/main/java/com/yyy/flowable/task/SysTask.java b/flowable/src/main/java/com/yyy/flowable/task/SysTask.java new file mode 100644 index 0000000..cac4d4f --- /dev/null +++ b/flowable/src/main/java/com/yyy/flowable/task/SysTask.java @@ -0,0 +1,94 @@ +package com.yyy.flowable.task; + +import com.alibaba.fastjson.JSONObject; +import com.yyy.common.enums.PlanTypeEnum; +import com.yyy.common.form.FieldData; +import com.yyy.common.utils.common.DateUtils; +import com.yyy.flowable.common.constant.ProcessConstants; +import com.yyy.flowable.service.IFlowDefinitionService; +import com.yyy.system.entity.bo.JobDefect; +import com.yyy.system.entity.dto.EamWarehouseAssetDto; +import com.yyy.system.entity.dto.FlowProcDefDto; +import com.yyy.system.entity.pojo.FlForm; +import com.yyy.system.entity.pojo.SysFormTemp; +import com.yyy.system.service.EamAssetService; +import com.yyy.system.service.FlFormService; +import com.yyy.system.service.SysFormTempService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +@Slf4j +@Component("SysTask") +public class SysTask { + + @Resource + private FlFormService flFormService; + @Autowired + private IFlowDefinitionService flowDefinitionService; + @Resource + private EamAssetService eamAssetService; + @Resource + private SysFormTempService sysFormTempService; + + /** + * 设备巡检任务 + */ + public void inspectionJob(JSONObject config) { + createJob(config,PlanTypeEnum.inspection); + } + + /** + * 设备保养任务 + */ + public void maintenanceJob(JSONObject config) { + createJob(config,PlanTypeEnum.maintenance); + } + + /** + * 设备盘点任务 + */ + public void stocktakingJob(JSONObject config) { + createJob(config,PlanTypeEnum.stocktaking); + } + + private void createJob(JSONObject config, PlanTypeEnum planTye){ + FlForm flForm = flFormService.selectByKey(planTye.getCode()); + if (Objects.isNull(flForm)) { + log.error("表单标识信息错误"); + } + FlowProcDefDto flowProcDefDto = flowDefinitionService.getByDeployId(flForm.getDeployId()); + if (Objects.isNull(flowProcDefDto)) { + log.error(planTye.getInfo() + "流程未部署"); + } + JSONObject variables = JSONObject.parseObject(flForm.getConfig()); + + if (config.containsKey("formTempId")) { + List assetIdList = JSONObject.parseArray(config.getString("assetIdList"), EamWarehouseAssetDto.class); + SysFormTemp formTemp = sysFormTempService.getById(config.getLong("formTempId")); + List _formValue = JSONObject.parseArray(formTemp.getFormValue(), FieldData.class); + List defects = JobDefect.toDefectList(eamAssetService.listByIds(assetIdList.stream().map(EamWarehouseAssetDto::getAssetId).distinct().collect(Collectors.toList())), _formValue); + variables.put("defects", defects); + } + + //超期限制 设置截止时间 + if (config.containsKey("duration") && config.containsKey("limit") && config.getInteger("duration") > 0 && config.getBoolean("limit")) { + variables.put(ProcessConstants.DUE_DATE, DateUtils.addDays(new Date(), config.getInteger("duration"))); + } else { + variables.put(ProcessConstants.DUE_DATE, null); + } + variables.put("createType", config.getString("name") + "创建"); + config.forEach(variables::put); + if (flowDefinitionService.startProcessInstanceById(flowProcDefDto.getId(), variables).isSuccess()) { + //启动成功 + } else { + log.error(config.getString("name") + "启动失败:" + DateUtils.getTime()); + } + } +} diff --git a/framework/pom.xml b/framework/pom.xml new file mode 100644 index 0000000..b97994b --- /dev/null +++ b/framework/pom.xml @@ -0,0 +1,52 @@ + + + + yyy + com.yyy + 1.0-SNAPSHOT + + 4.0.0 + + framework + + + framework框架核心 + + + + + + com.yyy + system + 1.0-SNAPSHOT + + + + + org.springframework.boot + spring-boot-starter-web + + + + + org.springframework.boot + spring-boot-starter-aop + + + + + com.alibaba + druid-spring-boot-starter + + + + + org.apache.shiro + shiro-spring + + + + + \ No newline at end of file diff --git a/framework/src/main/java/com/yyy/framework/aspect/GlobalExceptionHandler.java b/framework/src/main/java/com/yyy/framework/aspect/GlobalExceptionHandler.java new file mode 100644 index 0000000..a7d5a94 --- /dev/null +++ b/framework/src/main/java/com/yyy/framework/aspect/GlobalExceptionHandler.java @@ -0,0 +1,78 @@ +package com.yyy.framework.aspect; + +/** + * @Author: fy + * @Date: 2024/03/21 + * @Description:全局异常处理 + */ + +import com.yyy.common.core.domain.Result; +import com.yyy.common.core.domain.ResultCode; +import com.yyy.common.exception.base.BaseException; +import lombok.extern.slf4j.Slf4j; +import org.apache.catalina.connector.ClientAbortException; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.*; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; +import org.springframework.web.multipart.MultipartException; + +import javax.servlet.http.HttpServletRequest; + +@Slf4j +@Controller +@ControllerAdvice +public class GlobalExceptionHandler { + + @ResponseBody + @ExceptionHandler(BaseException.class) + public Result errorHandler(BaseException e) { + return _innerHandler(e.getResult(), e, false); + } + + @ResponseBody + @ExceptionHandler({MissingServletRequestParameterException.class, MissingPathVariableException.class, MissingRequestCookieException.class, MissingRequestHeaderException.class, MissingServletRequestParameterException.class}) + public Result errorHandler(MissingServletRequestParameterException e) { + return _innerHandler(Result.ILLEGAL_ARGUMENT, e, false); + } + + /** + * 参数校验异常处理 + */ + @ResponseBody + @ExceptionHandler(MethodArgumentNotValidException.class) + public Result errorHandler(MethodArgumentNotValidException e) { + return _innerHandler(new Result(Result.ILLEGAL_ARGUMENT.getCode(),e.getFieldError().getDefaultMessage()), e, false); + } + + @ResponseBody + @ExceptionHandler({MultipartException.class}) + public Result errorHandler(MultipartException e) { + return _innerHandler(Result.NOT_SUPPORT, e, false); + } + + @ResponseBody + @ExceptionHandler + public Result errorHandler(Exception e) { + return _innerHandler(new Result(Result.ERROR.getCode(),e.getMessage()), e, true); + } + + private Result _innerHandler(Result result, Exception e, boolean needExceptionTrace) { + ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); + if (requestAttributes != null) { + if (requestAttributes.getResponse() != null) { + requestAttributes.getResponse().setStatus(result.getCode()); + } + HttpServletRequest request = requestAttributes.getRequest(); + if (!needExceptionTrace) { + log.error("[GlobalExceptionHandler:" + request.getServletPath() + "] exception:" + e.getMessage()); + } else { + log.error("[GlobalExceptionHandler:" + request.getServletPath() + "] exception:" + e.getMessage(), e); + } + } + return result; + } +} \ No newline at end of file diff --git a/framework/src/main/java/com/yyy/framework/aspect/GlobalRequestAspect.java b/framework/src/main/java/com/yyy/framework/aspect/GlobalRequestAspect.java new file mode 100644 index 0000000..898e8a8 --- /dev/null +++ b/framework/src/main/java/com/yyy/framework/aspect/GlobalRequestAspect.java @@ -0,0 +1,103 @@ +package com.yyy.framework.aspect; + +import com.alibaba.fastjson.JSON; +import com.yyy.common.constant.Constants; +import com.yyy.common.core.domain.Result; +import com.yyy.common.exception.base.BaseException; +import com.yyy.common.utils.security.JwtUtils; +import com.yyy.common.utils.security.SessionHolder; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import org.springframework.web.servlet.resource.ResourceHttpRequestHandler; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.Map; + +/** + * @Author: fy + * @Date: 2024/03/21 + * @Description:全局请求拦截 + */ +@Slf4j +@Configuration +@ControllerAdvice +public class GlobalRequestAspect implements HandlerInterceptor, WebMvcConfigurer { + + @Autowired + JwtUtils jwtUtils; + @Value("${jwt.config.refreshTime}") + private Long refreshTime; + @Value("${jwt.config.expiresTime}") + private Long expiresTime; + @Value("${app.profile}") + private String profile; + + /** + * 拦截器白名单 + */ + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(this).addPathPatterns("/api/**") + .excludePathPatterns("/api/oauth/**") + .excludePathPatterns("/api/v2/device/open/**") + .excludePathPatterns("/api/home/bigScreen") + ; + } + + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + registry.addResourceHandler(Constants.RESOURCE_PREFIX+"/**") + .addResourceLocations("file:"+profile+"/"); + } + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException { + if (handler instanceof ResourceHttpRequestHandler) { + response.setStatus(Result.NOT_SUPPORT.getCode()); + response.setCharacterEncoding("UTF-8"); + response.setContentType("text/json; charset=utf-8"); + response.getOutputStream().write(JSON.toJSONString(Result.NOT_SUPPORT).getBytes(StandardCharsets.UTF_8)); + return false; + } + + // 如果不是映射到方法直接通过,可以访问资源. + if (!(handler instanceof HandlerMethod)) { + return true; + } + + //为空就返回错误 + String token = request.getHeader("Authorization"); + if (null == token || "".equals(token.trim())) { + throw new BaseException(Result.NOT_LOGIN); + } + + Map map = jwtUtils.parseToken(token); + String uid = map.get("uid"); + String sid = map.get("sid"); + String clientVersion = map.get("clientVersion"); + String clientType = map.get("clientType"); + + long timeOfUse = System.currentTimeMillis() - Long.parseLong(map.get("timeStamp")); + + if (timeOfUse < refreshTime) { + SessionHolder.setUserSession(uid); + return true; + } else if (timeOfUse >= refreshTime && timeOfUse < expiresTime) { + response.setHeader("Authorization", jwtUtils.getToken(Long.parseLong(uid), sid, clientVersion, clientType)); + return true; + } else { + throw new BaseException(Result.NOT_LOGIN); + } + } +} diff --git a/framework/src/main/java/com/yyy/framework/aspect/GlobalResponseAspect.java b/framework/src/main/java/com/yyy/framework/aspect/GlobalResponseAspect.java new file mode 100644 index 0000000..644dd3f --- /dev/null +++ b/framework/src/main/java/com/yyy/framework/aspect/GlobalResponseAspect.java @@ -0,0 +1,64 @@ +package com.yyy.framework.aspect; + +import com.alibaba.fastjson.serializer.SerializerFeature; +import com.alibaba.fastjson.support.config.FastJsonConfig; +import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter; +import com.yyy.common.constant.Constants; +import com.yyy.common.core.controller.BaseController; +import com.yyy.common.core.domain.Result; +import com.yyy.common.core.domain.ResultCode; +import com.yyy.common.utils.security.SessionHolder; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.MethodParameter; +import org.springframework.http.MediaType; +import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.http.server.ServerHttpRequest; +import org.springframework.http.server.ServerHttpResponse; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice; + +import java.nio.charset.StandardCharsets; + +/** + * @Author: fy + * @Date: 2024/03/22 + * @Description: + */ + +@Slf4j +@Configuration +@ControllerAdvice(assignableTypes = BaseController.class) +public class GlobalResponseAspect implements ResponseBodyAdvice { + + @Override + public boolean supports(MethodParameter methodParameter, Class clazz) { + return true; + } + + @Bean + FastJsonHttpMessageConverter fastJsonHttpMessageConverters() { + FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter(); + FastJsonConfig jsonConfig = new FastJsonConfig(); + jsonConfig.setCharset(StandardCharsets.UTF_8); + jsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss"); + jsonConfig.setSerializerFeatures(SerializerFeature.BrowserCompatible); + jsonConfig.setSerializerFeatures(SerializerFeature.WriteEnumUsingToString); + jsonConfig.setSerializerFeatures(SerializerFeature.WriteMapNullValue);//输出为null的字段 + jsonConfig.setSerializerFeatures(SerializerFeature.DisableCircularReferenceDetect);//禁用循环引用检测 + converter.setFastJsonConfig(jsonConfig); + converter.setDefaultCharset(StandardCharsets.UTF_8); + converter.setSupportedMediaTypes(Constants.SUPPORTED_MEDIA_TYPES); + return converter; + } + + @Override + public Object beforeBodyWrite(Object result, MethodParameter methodParameter, MediaType mediaType, Class> clazz, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) { + SessionHolder.clearSession(); + if (result instanceof Result) { + return result; + } + return new Result(ResultCode.success, result); + } +} \ No newline at end of file diff --git a/framework/src/main/java/com/yyy/framework/aspect/SqlHandler.java b/framework/src/main/java/com/yyy/framework/aspect/SqlHandler.java new file mode 100644 index 0000000..7775bd7 --- /dev/null +++ b/framework/src/main/java/com/yyy/framework/aspect/SqlHandler.java @@ -0,0 +1,35 @@ +package com.yyy.framework.aspect; + +import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; +import org.apache.ibatis.reflection.MetaObject; +import org.springframework.stereotype.Component; + +import java.util.Date; + +/** + * @Author: fy + * @Date: 2024/03/22 + * @Description:自动生成创建和修改日期 + */ +@Component +public class SqlHandler implements MetaObjectHandler { + /** + * 使用mp做添加操作时候,这个方法执行 + * @param metaObject + */ + @Override + public void insertFill(MetaObject metaObject) { + //设置属性值 + this.setFieldValByName("createTime",new Date(),metaObject); + this.setFieldValByName("updateTime",new Date(),metaObject); + } + + /** + * 使用mp做修改操作时候,这个方法执行 + * @param metaObject + */ + @Override + public void updateFill(MetaObject metaObject) { + this.setFieldValByName("updateTime",new Date(),metaObject); + } +} \ No newline at end of file diff --git a/framework/src/main/java/com/yyy/framework/config/MyBatisPlusConfig.java b/framework/src/main/java/com/yyy/framework/config/MyBatisPlusConfig.java new file mode 100644 index 0000000..bfcbbba --- /dev/null +++ b/framework/src/main/java/com/yyy/framework/config/MyBatisPlusConfig.java @@ -0,0 +1,27 @@ +package com.yyy.framework.config; + +import com.baomidou.mybatisplus.annotation.DbType; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * @Author: fy + * @Date: 2024/03/22 + * @Description: + */ +@Configuration +@MapperScan({"com.yyy.system.mapper","com.yyy.quartz.mapper"}) +public class MyBatisPlusConfig { + /** + * 分页插件 + */ + @Bean + public MybatisPlusInterceptor mybatisPlusInterceptor() { + MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); + interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.H2)); + return interceptor; + } +} \ No newline at end of file diff --git a/framework/src/main/java/com/yyy/framework/shiro/service/SysPasswordService.java b/framework/src/main/java/com/yyy/framework/shiro/service/SysPasswordService.java new file mode 100644 index 0000000..85669fa --- /dev/null +++ b/framework/src/main/java/com/yyy/framework/shiro/service/SysPasswordService.java @@ -0,0 +1,79 @@ +package com.yyy.framework.shiro.service; + +import com.yyy.common.constant.Constants; +import com.yyy.common.constant.ShiroConstants; +import com.yyy.common.core.domain.entity.UmsUser; +import org.apache.shiro.cache.Cache; +import org.apache.shiro.cache.CacheManager; +import org.apache.shiro.crypto.hash.Md5Hash; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * 登录密码方法 + */ +@Component +public class SysPasswordService +{ +// @Autowired +// private CacheManager cacheManager; +// +// private Cache loginRecordCache; + +// @Value(value = "${user.password.maxRetryCount}") +// private String maxRetryCount; + +// @PostConstruct +// public void init() +// { +// loginRecordCache = cacheManager.getCache(ShiroConstants.LOGIN_RECORD_CACHE); +// } + +// public void validate(UmsUser user, String password) +// { +// String loginName = user.getLoginName(); +// +// AtomicInteger retryCount = loginRecordCache.get(loginName); +// +// if (retryCount == null) +// { +// retryCount = new AtomicInteger(0); +// loginRecordCache.put(loginName, retryCount); +// } +// if (retryCount.incrementAndGet() > Integer.valueOf(maxRetryCount).intValue()) +// { +// AsyncManager.me().execute(AsyncFactory.recordLogininfor(loginName, Constants.LOGIN_FAIL, MessageUtils.message("user.password.retry.limit.exceed", maxRetryCount))); +// throw new UserPasswordRetryLimitExceedException(Integer.valueOf(maxRetryCount).intValue()); +// } +// +// if (!matches(user, password)) +// { +// AsyncManager.me().execute(AsyncFactory.recordLogininfor(loginName, Constants.LOGIN_FAIL, MessageUtils.message("user.password.retry.limit.count", retryCount))); +// loginRecordCache.put(loginName, retryCount); +// throw new UserPasswordNotMatchException(); +// } +// else +// { +// clearLoginRecordCache(loginName); +// } +// } + + public boolean matches(UmsUser user, String newPassword) + { + return user.getPassword().equals(encryptPassword(user.getLoginName(), newPassword, user.getSalt())); + } + +// public void clearLoginRecordCache(String loginName) +// { +// loginRecordCache.remove(loginName); +// } + + public String encryptPassword(String loginName, String password, String salt) + { + return new Md5Hash(loginName + password + salt).toHex(); + } +} diff --git a/kernel/pom.xml b/kernel/pom.xml new file mode 100644 index 0000000..34008ca --- /dev/null +++ b/kernel/pom.xml @@ -0,0 +1,22 @@ + + + + yyy + com.yyy + 1.0-SNAPSHOT + + 4.0.0 + + kernel + + + + com.yyy + common + 1.0-SNAPSHOT + + + + \ No newline at end of file diff --git a/kernel/src/main/java/com/yyy/kernel/device/AbstractDevice.java b/kernel/src/main/java/com/yyy/kernel/device/AbstractDevice.java new file mode 100644 index 0000000..9add843 --- /dev/null +++ b/kernel/src/main/java/com/yyy/kernel/device/AbstractDevice.java @@ -0,0 +1,44 @@ +package com.yyy.kernel.device; + +import com.yyy.kernel.enums.DeviceStatus; +import com.yyy.kernel.enums.DeviceType; + +import java.util.concurrent.ConcurrentHashMap; + +/** + * Created with IntelliJ IDEA. + * + * @Author: fy + * @Date: 2023/07/03/19:15 + * @Description: + */ +public abstract class AbstractDevice implements IDevice{ + private static ConcurrentHashMap DEVICES = new ConcurrentHashMap<>(); + + protected String identity; + protected DeviceType deviceType; + protected DeviceStatus deviceStatus; + + public AbstractDevice(DeviceType deviceType, String identity) { + this.deviceType = deviceType; + this.identity = identity; + this.deviceStatus = DeviceStatus.OFF; + DEVICES.putIfAbsent(identity, this); + } + + public String identity() { + return identity; + } + + public DeviceType type() { + return this.deviceType; + } + + public DeviceStatus status() { + return deviceStatus; + } + + public static IDevice getByIdentity(String identity) { + return DEVICES.get(identity); + } +} diff --git a/kernel/src/main/java/com/yyy/kernel/device/IDevice.java b/kernel/src/main/java/com/yyy/kernel/device/IDevice.java new file mode 100644 index 0000000..45168b6 --- /dev/null +++ b/kernel/src/main/java/com/yyy/kernel/device/IDevice.java @@ -0,0 +1,40 @@ +package com.yyy.kernel.device; + +import com.yyy.kernel.enums.DeviceStatus; + +import java.util.Map; + +/** + * Created with IntelliJ IDEA. + * + * @Author: fy + * @Date: 2023/07/03/19:07 + * @Description: + */ +public interface IDevice { + + /** + * 配置设备 + */ + boolean config(Map input); + + /** + * 打开设备 + */ + boolean open(Map input); + + /** + * 关闭设备 + */ + boolean close(Map input); + + /** + * 查询状态 + */ + DeviceStatus status(); + + /** + * 设备标识 + */ + String identity(); +} diff --git a/kernel/src/main/java/com/yyy/kernel/device/model/MockDevice.java b/kernel/src/main/java/com/yyy/kernel/device/model/MockDevice.java new file mode 100644 index 0000000..ac2b35c --- /dev/null +++ b/kernel/src/main/java/com/yyy/kernel/device/model/MockDevice.java @@ -0,0 +1,31 @@ +package com.yyy.kernel.device.model; + +import com.yyy.kernel.device.AbstractDevice; +import com.yyy.kernel.enums.DeviceStatus; +import com.yyy.kernel.enums.DeviceType; + +import java.util.Map; + +public class MockDevice extends AbstractDevice { + + public MockDevice(String identity) { + super(DeviceType.mock, identity); + } + + @Override + public boolean config(Map input) { + return true; + } + + @Override + public boolean open(Map input) { + this.deviceStatus = DeviceStatus.ON; + return true; + } + + @Override + public boolean close(Map input) { + this.deviceStatus = DeviceStatus.OFF; + return true; + } +} diff --git a/kernel/src/main/java/com/yyy/kernel/enums/DeviceStatus.java b/kernel/src/main/java/com/yyy/kernel/enums/DeviceStatus.java new file mode 100644 index 0000000..db9ff46 --- /dev/null +++ b/kernel/src/main/java/com/yyy/kernel/enums/DeviceStatus.java @@ -0,0 +1,12 @@ +package com.yyy.kernel.enums; + +/** + * Created with IntelliJ IDEA. + * + * @Author: fy + * @Date: 2023/07/03/19:09 + * @Description: + */ +public enum DeviceStatus { + ON,OFF +} diff --git a/kernel/src/main/java/com/yyy/kernel/enums/DeviceType.java b/kernel/src/main/java/com/yyy/kernel/enums/DeviceType.java new file mode 100644 index 0000000..07612ba --- /dev/null +++ b/kernel/src/main/java/com/yyy/kernel/enums/DeviceType.java @@ -0,0 +1,12 @@ +package com.yyy.kernel.enums; + +/** + * Created with IntelliJ IDEA. + * + * @Author: fy + * @Date: 2023/07/03/19:12 + * @Description: + */ +public enum DeviceType { + mock +} diff --git a/kernel/src/main/java/com/yyy/kernel/service/DeviceService.java b/kernel/src/main/java/com/yyy/kernel/service/DeviceService.java new file mode 100644 index 0000000..bdbf5f1 --- /dev/null +++ b/kernel/src/main/java/com/yyy/kernel/service/DeviceService.java @@ -0,0 +1,119 @@ +package com.yyy.kernel.service; + +import com.yyy.kernel.device.AbstractDevice; +import com.yyy.kernel.device.IDevice; +import com.yyy.kernel.device.model.MockDevice; +import com.yyy.kernel.enums.DeviceStatus; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +@Service +@Slf4j +public class DeviceService { + /** + * 手动开启设备 + * + * @param snCode sn码 + * @return + */ + public boolean openDevice(String snCode) { + if (snCode == null) { + return false; + } + IDevice device = AbstractDevice.getByIdentity(snCode); + if (device == null) { + device = new MockDevice(snCode); + } + if (device.status() == DeviceStatus.ON) { + return false; + } + return device.open(null); + } + + /** + * 手动开启设备 + * + * @param snCodeList sn码列表 + * @return + */ + public boolean openDevice(List snCodeList) { + List errors = new ArrayList<>(); + snCodeList.forEach(snCode -> { + if (snCode == null) { + return; + } + IDevice device = AbstractDevice.getByIdentity(snCode); + if (device == null) { + device = new MockDevice(snCode); + } + if (device.status() == DeviceStatus.ON){ + errors.add("设备:" + snCode + "-已开启不能重复开启"); + } + if (!device.open(null)) { + errors.add("设备:" + snCode + "-开启失败"); + } + }); + if (!errors.isEmpty()) { + log.error("设备开启失败:{}", errors); + return false; + } + return true; + } + + /** + * 手动关闭设备 + * + * @param snCode sn码 + * @return + */ + public boolean closeDevice(String snCode) { + if (snCode == null) { + return false; + } + IDevice device = AbstractDevice.getByIdentity(snCode); + if (device == null) { + device = new MockDevice(snCode); + } + if (device.status() == DeviceStatus.OFF) { + return false; + } + return device.close(null); + } + + /** + * 手动关闭设备 + * + * @param snCodeList sn码列表 + * @return + */ + public boolean closeDevice(List snCodeList) { + List errors = new ArrayList<>(); + snCodeList.forEach(snCode -> { + if (snCode == null) { + return; + } + IDevice device = AbstractDevice.getByIdentity(snCode); + if (device == null) { + device = new MockDevice(snCode); + } + if (device.status() == DeviceStatus.OFF){ + errors.add("设备:" + snCode + "-已关闭不能重复关闭"); + } + if (!device.close(null)) { + errors.add("设备:" + snCode + "-关闭失败"); + } + }); + if (!errors.isEmpty()) { + log.error("设备关闭失败:{}", errors); + return false; + } + return true; + } +// // 接收设备心跳信号并更新状态 +// public boolean handleHeartbeat(String snCode, String heartbeatAddress) { +// +// } +} \ No newline at end of file diff --git a/modules/pom.xml b/modules/pom.xml new file mode 100644 index 0000000..99a2311 --- /dev/null +++ b/modules/pom.xml @@ -0,0 +1,28 @@ + + + + yyy + com.yyy + 1.0-SNAPSHOT + + 4.0.0 + + modules + + + + + org.springframework.boot + spring-boot-starter-web + + + + io.minio + minio + 7.0.2 + + + + \ No newline at end of file diff --git a/modules/src/main/java/com/yyy/minio/config/MinioConfig.java b/modules/src/main/java/com/yyy/minio/config/MinioConfig.java new file mode 100644 index 0000000..2eda591 --- /dev/null +++ b/modules/src/main/java/com/yyy/minio/config/MinioConfig.java @@ -0,0 +1,45 @@ +package com.yyy.minio.config; + +import io.minio.MinioClient; +import io.minio.errors.InvalidEndpointException; +import io.minio.errors.InvalidPortException; +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; + +/** + * @Author: fy + * @Date: 2024/03/22 + * @Description: + */ +@Data +@Component +@ConfigurationProperties(prefix = "minio") +public class MinioConfig { + + // endPoint是一个URL,域名,IPv4或者IPv6地址 + private String endpoint; + + // TCP/IP端口号 + private int port; + + private String accessKey; + + private String secretKey; + + // 如果是true,则用的是https而不是http,默认值是true + private Boolean secure; + + // 默认存储桶 + private String bucketName; + + private boolean enabled; + + @Bean + public MinioClient getMinioClient() throws InvalidEndpointException, InvalidPortException { + + MinioClient minioClient = new MinioClient(endpoint, port, accessKey, secretKey, secure); + return minioClient; + } +} \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..b2518e7 --- /dev/null +++ b/pom.xml @@ -0,0 +1,372 @@ + + + 4.0.0 + + com.yyy + yyy + 1.0-SNAPSHOT + + eam + http://127.0.0.1:80 + 系统基础模板 + + + UTF-8 + UTF-8 + 1.8 + 2.7.6 + 3.1.1 + 8.0.32 + 3.5.1 + 1.2.20 + 3.0.3 + 1.13.0 + 1.4.7 + 1.2.83 + + 2.16.1 + 3.9 + 4.6.10 + + 5.2.2 + 1.18.12 + 1.7.25 + 31.1-jre + 3.10.3 + 5.5.13.3 + 3.3.3 + 6.8.0 + 1.33 + 1.12.2 + 4.0.2 + 1.0.3 + 8.3.11 + + + + admin + common + system + modules + framework + flowable + license + quartz + kernel + + + pom + + + + + + + org.springframework.boot + spring-boot-dependencies + 2.7.6 + pom + import + + + + + mysql + mysql-connector-java + ${mysql.version} + + + com.alibaba + druid-spring-boot-starter + ${druid.version} + + + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + org.flowable + flowable-engine + ${flowable.version} + + + + + org.springframework.boot + spring-boot-starter-quartz + + + + + com.baomidou + mybatis-plus-boot-starter + ${mybatis-plus.version} + + + + + com.github.xiaoymin + knife4j-spring-boot-starter + ${knife4j.version} + + + + + org.apache.shiro + shiro-core + ${shiro.version} + + + + + org.apache.shiro + shiro-spring + ${shiro.version} + + + + + org.apache.shiro + shiro-ehcache + ${shiro.version} + + + + + com.alibaba + fastjson + ${fastjson.version} + + + + + org.projectlombok + lombok + ${lombok.version} + provided + + + + + org.slf4j + slf4j-api + ${slf4j.version} + + + + + com.github.pagehelper + pagehelper-spring-boot-starter + ${pagehelper.boot.version} + + + + + com.google.guava + guava + ${guava.version} + + + + + com.auth0 + java-jwt + ${jwt.version} + + + + + commons-io + commons-io + ${commons.io.version} + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + cn.hutool + hutool-all + ${hutool.version} + + + + + org.apache.poi + poi-ooxml + ${poi.version} + + + + org.apache.poi + poi-scratchpad + ${poi.version} + + + + + com.itextpdf + itextpdf + ${itextpdf.version} + + + com.google.zxing + core + ${zxing.version} + + + com.google.zxing + javase + ${zxing.version} + + + + de.schlichtherle.truelicense + truelicense-core + ${truelicense.version} + provided + + + de.schlichtherle.truelicense + truelicense-xml + ${truelicense.version} + + + de.schlichtherle.truelicense + truelicense-swing + ${truelicense.version} + + + de.schlichtherle.truelicense + truelicense + ${truelicense.version} + pom + + + + + com.deepoove + poi-tl + ${poi-tl.version} + + + + org.apache.poi + poi + ${poi.version} + + + io.github.draco1023 + poi-tl-ext + 0.4.15 + + + + com.alibaba + easyexcel + ${easyexcel.version} + + + + com.documents4j + documents4j-local + ${documents4j.version} + + + com.documents4j + documents4j-transformer-msoffice-word + ${documents4j.version} + + + + + + org.jsoup + jsoup + 1.12.1 + + + + + + + org.projectlombok + lombok + provided + + + + org.slf4j + slf4j-api + + + + com.alibaba + fastjson + + + + commons-io + commons-io + + + org.apache.commons + commons-lang3 + + + cn.hutool + hutool-all + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + ${java.version} + ${java.version} + ${project.build.sourceEncoding} + + + + + + + + public + aliyun nexus + https://maven.aliyun.com/repository/public + + true + + + + + + + public + aliyun nexus + https://maven.aliyun.com/repository/public + + true + + + false + + + + \ No newline at end of file diff --git a/quartz/pom.xml b/quartz/pom.xml new file mode 100644 index 0000000..95beff7 --- /dev/null +++ b/quartz/pom.xml @@ -0,0 +1,39 @@ + + + + yyy + com.yyy + 1.0-SNAPSHOT + + 4.0.0 + + quartz + + quartz定时任务调度模块 + + + + + + org.quartz-scheduler + quartz + + + com.mchange + c3p0 + + + + + + + com.yyy + common + 1.0-SNAPSHOT + + + + + \ No newline at end of file diff --git a/quartz/src/main/java/com/yyy/quartz/config/ScheduleConfig.java b/quartz/src/main/java/com/yyy/quartz/config/ScheduleConfig.java new file mode 100644 index 0000000..769313f --- /dev/null +++ b/quartz/src/main/java/com/yyy/quartz/config/ScheduleConfig.java @@ -0,0 +1,56 @@ +package com.yyy.quartz.config; +// +//import org.springframework.context.annotation.Bean; +//import org.springframework.context.annotation.Configuration; +//import org.springframework.scheduling.quartz.SchedulerFactoryBean; +//import javax.sql.DataSource; +//import java.util.Properties; +// +///** +// * 定时任务配置(单机部署建议默认走内存,如需集群需要创建qrtz数据库表/打开类注释) +// * +// */ +//@Configuration +//public class ScheduleConfig +//{ +// @Bean +// public SchedulerFactoryBean schedulerFactoryBean(DataSource dataSource) +// { +// SchedulerFactoryBean factory = new SchedulerFactoryBean(); +// factory.setDataSource(dataSource); +// +// // quartz参数 +// Properties prop = new Properties(); +// prop.put("org.quartz.scheduler.instanceName", "RuoyiScheduler"); +// prop.put("org.quartz.scheduler.instanceId", "AUTO"); +// // 线程池配置 +// prop.put("org.quartz.threadPool.class", "org.quartz.simpl.SimpleThreadPool"); +// prop.put("org.quartz.threadPool.threadCount", "20"); +// prop.put("org.quartz.threadPool.threadPriority", "5"); +// // JobStore配置 +// prop.put("org.quartz.jobStore.class", "org.springframework.scheduling.quartz.LocalDataSourceJobStore"); +// // 集群配置 +// prop.put("org.quartz.jobStore.isClustered", "true"); +// prop.put("org.quartz.jobStore.clusterCheckinInterval", "15000"); +// prop.put("org.quartz.jobStore.maxMisfiresToHandleAtATime", "10"); +// prop.put("org.quartz.jobStore.txIsolationLevelSerializable", "true"); +// +// // sqlserver 启用 +// // prop.put("org.quartz.jobStore.selectWithLockSQL", "SELECT * FROM {0}LOCKS UPDLOCK WHERE LOCK_NAME = ?"); +// prop.put("org.quartz.jobStore.misfireThreshold", "12000"); +// prop.put("org.quartz.jobStore.tablePrefix", "QRTZ_"); +// factory.setQuartzProperties(prop); +// +// factory.setSchedulerName("RuoyiScheduler"); +// // 延时启动 +// factory.setStartupDelay(1); +// factory.setApplicationContextSchedulerContextKey("applicationContextKey"); +// // 可选,QuartzScheduler +// // 启动时更新己存在的Job,这样就不用每次修改targetObject后删除qrtz_job_details表对应记录了 +// factory.setOverwriteExistingJobs(true); +// // 设置自动启动,默认为true +// factory.setAutoStartup(true); +// +// return factory; +// } +//} diff --git a/quartz/src/main/java/com/yyy/quartz/controller/SysJobController.java b/quartz/src/main/java/com/yyy/quartz/controller/SysJobController.java new file mode 100644 index 0000000..37ae219 --- /dev/null +++ b/quartz/src/main/java/com/yyy/quartz/controller/SysJobController.java @@ -0,0 +1,171 @@ +package com.yyy.quartz.controller; + +import com.yyy.common.constant.Constants; +import com.yyy.common.core.controller.BaseController; +import com.yyy.common.core.domain.Result; +import com.yyy.common.core.page.TableDataInfo; +import com.yyy.common.exception.job.TaskException; +import com.yyy.common.utils.common.StringUtils; +import com.yyy.common.utils.poi.ExcelUtil; +import com.yyy.quartz.domain.SysJob; +import com.yyy.quartz.service.ISysJobService; +import com.yyy.quartz.util.CronUtils; +import com.yyy.quartz.util.ScheduleUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.quartz.SchedulerException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Controller +@Api(tags = "调度任务信息操作处理") +@RequestMapping("api/monitor/job") +public class SysJobController extends BaseController +{ + @Autowired + private ISysJobService jobService; + + @PostMapping("/list") + @ResponseBody + @ApiOperation(value = "查询分页数据") + public TableDataInfo list(SysJob job) + { + startPage(); + List list = jobService.selectJobList(job); + return getDataTable(list); + } + + @PostMapping("/export") + @ResponseBody + @ApiOperation(value ="导出Excel数据") + public Result export(SysJob job) + { + List list = jobService.selectJobList(job); + ExcelUtil util = new ExcelUtil(SysJob.class); + return util.exportExcel(list, "定时任务"); + } + + @PostMapping("/remove") + @ResponseBody + @ApiOperation(value ="删除数据") + public Result remove(String ids) throws SchedulerException + { + jobService.deleteJobByIds(ids); + return success(); + } + + @PostMapping("/changeStatus") + @ResponseBody + @ApiOperation(value ="任务调度状态修改") + public Result changeStatus(SysJob job) throws SchedulerException + { + SysJob newJob = jobService.selectJobById(job.getJobId()); + newJob.setStatus(job.getStatus()); + return toResult(jobService.changeStatus(newJob)); + } + + @PostMapping("/run") + @ResponseBody + @ApiOperation(value ="任务调度立即执行一次") + public Result run(SysJob job) throws SchedulerException + { + boolean result = jobService.run(job); + return result ? success() : error("任务不存在或已过期!"); + } + + + + @PostMapping("/add") + @ResponseBody + @ApiOperation(value ="新增保存调度") + public Result addSave(@RequestBody @Validated SysJob job) throws SchedulerException, TaskException + { + if (!CronUtils.isValid(job.getCronExpression())) + { + return error("新增任务'" + job.getJobName() + "'失败,Cron表达式不正确"); + } + else if (StringUtils.containsIgnoreCase(job.getInvokeTarget(), Constants.LOOKUP_RMI)) + { + return error("新增任务'" + job.getJobName() + "'失败,目标字符串不允许'rmi'调用"); + } + else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), new String[] { Constants.LOOKUP_LDAP, Constants.LOOKUP_LDAPS })) + { + return error("新增任务'" + job.getJobName() + "'失败,目标字符串不允许'ldap(s)'调用"); + } + else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), new String[] { Constants.HTTP, Constants.HTTPS })) + { + return error("新增任务'" + job.getJobName() + "'失败,目标字符串不允许'http(s)'调用"); + } + else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), Constants.JOB_ERROR_STR)) + { + return error("新增任务'" + job.getJobName() + "'失败,目标字符串存在违规"); + } + else if (!ScheduleUtils.whiteList(job.getInvokeTarget())) + { + return error("新增任务'" + job.getJobName() + "'失败,目标字符串不在白名单内"); + } + job.setCreateUser(getUserId()); + return toResult(jobService.insertJob(job)); + } + + + @PostMapping("/edit") + @ResponseBody + @ApiOperation(value ="修改保存调度") + public Result editSave(@Validated SysJob job) throws SchedulerException, TaskException + { + if (!CronUtils.isValid(job.getCronExpression())) + { + return error("修改任务'" + job.getJobName() + "'失败,Cron表达式不正确"); + } + else if (StringUtils.containsIgnoreCase(job.getInvokeTarget(), Constants.LOOKUP_RMI)) + { + return error("修改任务'" + job.getJobName() + "'失败,目标字符串不允许'rmi'调用"); + } + else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), new String[] { Constants.LOOKUP_LDAP, Constants.LOOKUP_LDAPS })) + { + return error("修改任务'" + job.getJobName() + "'失败,目标字符串不允许'ldap'调用"); + } + else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), new String[] { Constants.HTTP, Constants.HTTPS })) + { + return error("修改任务'" + job.getJobName() + "'失败,目标字符串不允许'http(s)'调用"); + } + else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), Constants.JOB_ERROR_STR)) + { + return error("修改任务'" + job.getJobName() + "'失败,目标字符串存在违规"); + } + else if (!ScheduleUtils.whiteList(job.getInvokeTarget())) + { + return error("修改任务'" + job.getJobName() + "'失败,目标字符串不在白名单内"); + } + return toResult(jobService.updateJob(job)); + } + + @PostMapping("/checkCronExpressionIsValid") + @ResponseBody + @ApiOperation(value ="校验cron表达式是否有效") + public boolean checkCronExpressionIsValid(SysJob job) + { + return jobService.checkCronExpressionIsValid(job.getCronExpression()); + } + + @GetMapping("/queryCronExpression") + @ResponseBody + @ApiOperation(value ="查询cron表达式近5次的执行时间") + public Result queryCronExpression(@RequestParam(value = "cronExpression", required = false) String cronExpression) + { + if (jobService.checkCronExpressionIsValid(cronExpression)) + { + List dateList = CronUtils.getRecentTriggerTime(cronExpression); + return success(dateList); + } + else + { + return error("表达式无效"); + } + } +} diff --git a/quartz/src/main/java/com/yyy/quartz/controller/SysJobLogController.java b/quartz/src/main/java/com/yyy/quartz/controller/SysJobLogController.java new file mode 100644 index 0000000..8a9a927 --- /dev/null +++ b/quartz/src/main/java/com/yyy/quartz/controller/SysJobLogController.java @@ -0,0 +1,67 @@ +package com.yyy.quartz.controller; + + +import com.yyy.common.core.controller.BaseController; +import com.yyy.common.core.domain.Result; +import com.yyy.common.core.page.TableDataInfo; +import com.yyy.common.utils.poi.ExcelUtil; +import com.yyy.quartz.domain.SysJobLog; +import com.yyy.quartz.service.ISysJobLogService; +import com.yyy.quartz.service.ISysJobService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 调度日志操作处理 + */ +@Controller +@Api(tags = "调度任务日志信息操作处理") +@RequestMapping("api/monitor/jobLog") +public class SysJobLogController extends BaseController +{ + @Autowired + private ISysJobLogService jobLogService; + + @PostMapping("/list") + @ResponseBody + @ApiOperation(value = "查询分页数据") + public TableDataInfo list(SysJobLog jobLog) + { + startPage(); + List list = jobLogService.selectJobLogList(jobLog); + return getDataTable(list); + } + + @PostMapping("/export") + @ResponseBody + @ApiOperation(value ="导出Excel数据") + public Result export(SysJobLog jobLog) + { + List list = jobLogService.selectJobLogList(jobLog); + ExcelUtil util = new ExcelUtil(SysJobLog.class); + return util.exportExcel(list, "调度日志"); + } + + @PostMapping("/remove") + @ResponseBody + @ApiOperation(value ="删除数据") + public Result remove(String ids) + { + return toResult(jobLogService.deleteJobLogByIds(ids)); + } + + + @PostMapping("/clean") + @ResponseBody + @ApiOperation(value ="清空任务日志") + public Result clean() + { + jobLogService.cleanJobLog(); + return success(); + } +} diff --git a/quartz/src/main/java/com/yyy/quartz/domain/JobMessage.java b/quartz/src/main/java/com/yyy/quartz/domain/JobMessage.java new file mode 100644 index 0000000..fabab9f --- /dev/null +++ b/quartz/src/main/java/com/yyy/quartz/domain/JobMessage.java @@ -0,0 +1,15 @@ +package com.yyy.quartz.domain; + +import com.yyy.common.enums.FlowStatus; +import lombok.Data; + +@Data +public class JobMessage { + + private String message; + + //创建方式:0:自动创建,1:手动创建 + private Integer createType; + + private FlowStatus status; +} diff --git a/quartz/src/main/java/com/yyy/quartz/domain/SysJob.java b/quartz/src/main/java/com/yyy/quartz/domain/SysJob.java new file mode 100644 index 0000000..38981a1 --- /dev/null +++ b/quartz/src/main/java/com/yyy/quartz/domain/SysJob.java @@ -0,0 +1,275 @@ +package com.yyy.quartz.domain; + + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.yyy.common.annotation.excel.Excel; +import com.yyy.common.constant.ScheduleConstants; +import com.yyy.common.utils.common.StringUtils; +import com.yyy.quartz.util.CronUtils; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import java.io.Serializable; +import java.util.Date; + +/** + * 定时任务调度表 sys_job + * + */ +@ApiModel("定时任务调度表") +public class SysJob implements Serializable +{ + private static final long serialVersionUID = 1L; + + /** 任务ID */ + @Excel(name = "任务序号", cellType = Excel.ColumnType.NUMERIC) + @ApiModelProperty(notes = "任务序号") + private Long jobId; + + /** 任务名称 */ + @Excel(name = "任务名称") + @ApiModelProperty(notes = "任务名称") + private String jobName; + + /** 任务组名 */ + @Excel(name = "任务组名") + @ApiModelProperty(notes = "任务组名") + private String jobGroup; + + /** 调用目标字符串 */ + @Excel(name = "调用目标字符串") + @ApiModelProperty(notes = "调用目标字符串") + private String invokeTarget; + + /** cron执行表达式 */ + @Excel(name = "执行表达式 ") + @ApiModelProperty(notes = "cron执行表达式") + private String cronExpression; + + /** cron计划策略 */ + @Excel(name = "计划策略 ", readConverterExp = "0=默认,1=立即触发执行,2=触发一次执行,3=不触发立即执行") + @ApiModelProperty(notes = "计划策略: 0=默认,1=立即触发执行,2=触发一次执行,3=不触发立即执行") + private String misfirePolicy = ScheduleConstants.MISFIRE_DEFAULT; + + /** 是否并发执行(0允许 1禁止) */ + @Excel(name = "并发执行", readConverterExp = "0=允许,1=禁止") + @ApiModelProperty(notes = "是否并发执行(0允许 1禁止)") + private String concurrent; + + /** 任务状态(0正常 1暂停) */ + @Excel(name = "任务状态", readConverterExp = "0=正常,1=暂停") + @ApiModelProperty(notes = "任务状态(0正常 1暂停)") + private String status; + + /** + * 创建人 + */ + @TableField("create_user") + private Long createUser; + + /** + * 创建时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + /** + * 修改人 + */ + @TableField("update_user") + private Long updateUser; + + /** + * 修改时间 + */ + @JsonIgnore + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime; + + /** + * 备注 + */ + @Excel(name = "备注") + @TableField("remark") + @ApiModelProperty(notes = "备注") + private String remark; + + /** + * 配置信息 + */ + @Excel(name = "配置信息") + @TableField("config") + @ApiModelProperty(notes = "配置信息") + private String config; + + public Long getJobId() + { + return jobId; + } + + public void setJobId(Long jobId) + { + this.jobId = jobId; + } + + @NotBlank(message = "任务名称不能为空") + @Size(min = 0, max = 64, message = "任务名称不能超过64个字符") + public String getJobName() + { + return jobName; + } + + public void setJobName(String jobName) + { + this.jobName = jobName; + } + + public String getJobGroup() + { + return jobGroup; + } + + public void setJobGroup(String jobGroup) + { + this.jobGroup = jobGroup; + } + + @NotBlank(message = "调用目标字符串不能为空") + @Size(min = 0, max = 1000, message = "调用目标字符串长度不能超过500个字符") + public String getInvokeTarget() + { + return invokeTarget; + } + + public void setInvokeTarget(String invokeTarget) + { + this.invokeTarget = invokeTarget; + } + + @NotBlank(message = "Cron执行表达式不能为空") + @Size(min = 0, max = 255, message = "Cron执行表达式不能超过255个字符") + public String getCronExpression() + { + return cronExpression; + } + + public void setCronExpression(String cronExpression) + { + this.cronExpression = cronExpression; + } + + public Date getNextValidTime() + { + if (StringUtils.isNotEmpty(cronExpression)) + { + return CronUtils.getNextExecution(cronExpression); + } + return null; + } + + public String getMisfirePolicy() + { + return misfirePolicy; + } + + public void setMisfirePolicy(String misfirePolicy) + { + this.misfirePolicy = misfirePolicy; + } + + public String getConcurrent() + { + return concurrent; + } + + public void setConcurrent(String concurrent) + { + this.concurrent = concurrent; + } + + public String getStatus() + { + return status; + } + + public void setStatus(String status) + { + this.status = status; + } + + public Long getCreateUser() { + return createUser; + } + + public void setCreateUser(Long createUser) { + this.createUser = createUser; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Long getUpdateUser() { + return updateUser; + } + + public void setUpdateUser(Long updateUser) { + this.updateUser = updateUser; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getConfig() { + return config; + } + + public void setConfig(String config) { + this.config = config; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("jobId", getJobId()) + .append("jobName", getJobName()) + .append("jobGroup", getJobGroup()) + .append("cronExpression", getCronExpression()) + .append("nextValidTime", getNextValidTime()) + .append("misfirePolicy", getMisfirePolicy()) + .append("concurrent", getConcurrent()) + .append("status", getStatus()) + .append("createBy", getCreateUser()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateUser()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .append("config", getConfig()) + .toString(); + } +} \ No newline at end of file diff --git a/quartz/src/main/java/com/yyy/quartz/domain/SysJobLog.java b/quartz/src/main/java/com/yyy/quartz/domain/SysJobLog.java new file mode 100644 index 0000000..8c1991a --- /dev/null +++ b/quartz/src/main/java/com/yyy/quartz/domain/SysJobLog.java @@ -0,0 +1,175 @@ +package com.yyy.quartz.domain; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.yyy.common.annotation.excel.Excel; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import org.apache.ibatis.type.Alias; + +import java.io.Serializable; +import java.util.Date; + +/** + * 定时任务调度日志表 sys_job_log + */ +public class SysJobLog implements Serializable { + private static final long serialVersionUID = 1L; + + /** ID */ + @Excel(name = "日志序号") + private Long jobLogId; + + /** 任务名称 */ + @Excel(name = "任务名称") + private String jobName; + + /** 任务组名 */ + @Excel(name = "任务组名") + private String jobGroup; + + /** 调用目标字符串 */ + @Excel(name = "调用目标字符串") + private String invokeTarget; + + /** 日志信息 */ + @Excel(name = "日志信息") + private String jobMessage; + + /** 执行状态(0正常 1失败) */ + @Excel(name = "执行状态", readConverterExp = "0=正常,1=失败") + private String status; + + /** 异常信息 */ + @Excel(name = "异常信息") + private String exceptionInfo; + + /** 开始时间 */ + @TableField(exist = false) + private Date startTime; + + /** 结束时间 */ + @TableField(exist = false) + private Date endTime; + + /** + * 创建时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + public Long getJobLogId() + { + return jobLogId; + } + + public void setJobLogId(Long jobLogId) + { + this.jobLogId = jobLogId; + } + + public String getJobName() + { + return jobName; + } + + public void setJobName(String jobName) + { + this.jobName = jobName; + } + + public String getJobGroup() + { + return jobGroup; + } + + public void setJobGroup(String jobGroup) + { + this.jobGroup = jobGroup; + } + + public String getInvokeTarget() + { + return invokeTarget; + } + + public void setInvokeTarget(String invokeTarget) + { + this.invokeTarget = invokeTarget; + } + + public String getJobMessage() + { + return jobMessage; + } + + public void setJobMessage(String jobMessage) + { + this.jobMessage = jobMessage; + } + + public String getStatus() + { + return status; + } + + public void setStatus(String status) + { + this.status = status; + } + + public String getExceptionInfo() + { + return exceptionInfo; + } + + public void setExceptionInfo(String exceptionInfo) + { + this.exceptionInfo = exceptionInfo; + } + + public Date getStartTime() + { + return startTime; + } + + public void setStartTime(Date startTime) + { + this.startTime = startTime; + } + + public Date getEndTime() + { + return endTime; + } + + public void setEndTime(Date endTime) + { + this.endTime = endTime; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("jobLogId", getJobLogId()) + .append("jobName", getJobName()) + .append("jobGroup", getJobGroup()) + .append("jobMessage", getJobMessage()) + .append("status", getStatus()) + .append("exceptionInfo", getExceptionInfo()) + .append("startTime", getStartTime()) + .append("endTime", getEndTime()) + .append("createTime", getCreateTime()) + .toString(); + } +} diff --git a/quartz/src/main/java/com/yyy/quartz/mapper/SysJobLogMapper.java b/quartz/src/main/java/com/yyy/quartz/mapper/SysJobLogMapper.java new file mode 100644 index 0000000..d024d8c --- /dev/null +++ b/quartz/src/main/java/com/yyy/quartz/mapper/SysJobLogMapper.java @@ -0,0 +1,67 @@ +package com.yyy.quartz.mapper; + + +import com.yyy.quartz.domain.SysJobLog; +import org.apache.ibatis.annotations.Mapper; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * 调度任务日志信息 数据层 + */ +@Repository +public interface SysJobLogMapper +{ + /** + * 获取quartz调度器日志的计划任务 + * + * @param jobLog 调度日志信息 + * @return 调度任务日志集合 + */ + public List selectJobLogList(SysJobLog jobLog); + + /** + * 查询所有调度任务日志 + * + * @return 调度任务日志列表 + */ + public List selectJobLogAll(); + + /** + * 通过调度任务日志ID查询调度信息 + * + * @param jobLogId 调度任务日志ID + * @return 调度任务日志对象信息 + */ + public SysJobLog selectJobLogById(Long jobLogId); + + /** + * 新增任务日志 + * + * @param jobLog 调度日志信息 + * @return 结果 + */ + public int insertJobLog(SysJobLog jobLog); + + /** + * 批量删除调度日志信息 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteJobLogByIds(String[] ids); + + /** + * 删除任务日志 + * + * @param jobId 调度日志ID + * @return 结果 + */ + public int deleteJobLogById(Long jobId); + + /** + * 清空任务日志 + */ + public void cleanJobLog(); +} diff --git a/quartz/src/main/java/com/yyy/quartz/mapper/SysJobMapper.java b/quartz/src/main/java/com/yyy/quartz/mapper/SysJobMapper.java new file mode 100644 index 0000000..d0d27c6 --- /dev/null +++ b/quartz/src/main/java/com/yyy/quartz/mapper/SysJobMapper.java @@ -0,0 +1,78 @@ +package com.yyy.quartz.mapper; + + +import com.yyy.quartz.domain.SysJob; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * 调度任务信息 数据层 + * + */ +@Repository +public interface SysJobMapper +{ + /** + * 查询调度任务日志集合 + * + * @param job 调度信息 + * @return 操作日志集合 + */ + public List selectJobList(SysJob job); + + /** + * 查询所有调度任务 + * + * @return 调度任务列表 + */ + public List selectJobAll(); + + /** + * 通过调度ID查询调度任务信息 + * + * @param jobId 调度ID + * @return 角色对象信息 + */ + public SysJob selectJobById(Long jobId); + + /** + * 通过调度ID查询调度任务信息 + * + * @param list 调度ID List + * @return 角色对象信息 + */ + public List selectJobByIds(List list); + + /** + * 通过调度ID删除调度任务信息 + * + * @param jobId 调度ID + * @return 结果 + */ + public int deleteJobById(Long jobId); + + /** + * 批量删除调度任务信息 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteJobByIds(Long[] ids); + + /** + * 修改调度任务信息 + * + * @param job 调度任务信息 + * @return 结果 + */ + public int updateJob(SysJob job); + + /** + * 新增调度任务信息 + * + * @param job 调度任务信息 + * @return 结果 + */ + public int insertJob(SysJob job); +} diff --git a/quartz/src/main/java/com/yyy/quartz/service/ISysJobLogService.java b/quartz/src/main/java/com/yyy/quartz/service/ISysJobLogService.java new file mode 100644 index 0000000..b2bb83f --- /dev/null +++ b/quartz/src/main/java/com/yyy/quartz/service/ISysJobLogService.java @@ -0,0 +1,57 @@ +package com.yyy.quartz.service; + + +import com.yyy.quartz.domain.SysJobLog; + +import java.util.List; + +/** + * 定时任务调度日志信息信息 服务层 + * + */ +public interface ISysJobLogService +{ + /** + * 获取quartz调度器日志的计划任务 + * + * @param jobLog 调度日志信息 + * @return 调度任务日志集合 + */ + public List selectJobLogList(SysJobLog jobLog); + + /** + * 通过调度任务日志ID查询调度信息 + * + * @param jobLogId 调度任务日志ID + * @return 调度任务日志对象信息 + */ + public SysJobLog selectJobLogById(Long jobLogId); + + /** + * 新增任务日志 + * + * @param jobLog 调度日志信息 + */ + public void addJobLog(SysJobLog jobLog); + + /** + * 批量删除调度日志信息 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteJobLogByIds(String ids); + + /** + * 删除任务日志 + * + * @param jobId 调度日志ID + * @return 结果 + */ + public int deleteJobLogById(Long jobId); + + /** + * 清空任务日志 + */ + public void cleanJobLog(); +} diff --git a/quartz/src/main/java/com/yyy/quartz/service/ISysJobService.java b/quartz/src/main/java/com/yyy/quartz/service/ISysJobService.java new file mode 100644 index 0000000..b9f4d24 --- /dev/null +++ b/quartz/src/main/java/com/yyy/quartz/service/ISysJobService.java @@ -0,0 +1,110 @@ +package com.yyy.quartz.service; + +import com.yyy.common.exception.job.TaskException; +import com.yyy.quartz.domain.SysJob; +import org.quartz.SchedulerException; + +import java.util.List; + +/** + * 定时任务调度信息信息 服务层 + * + */ +public interface ISysJobService +{ + /** + * 获取quartz调度器的计划任务 + * + * @param job 调度信息 + * @return 调度任务集合 + */ + public List selectJobList(SysJob job); + + /** + * 通过调度任务ID查询调度信息 + * + * @param jobId 调度任务ID + * @return 调度任务对象信息 + */ + public SysJob selectJobById(Long jobId); + + /** + * 通过调度任务ID查询调度信息 + * + * @param list 调度任务ID List + * @return 调度任务对象信息 + */ + public List selectJobByIds(List list); + + /** + * 暂停任务 + * + * @param job 调度信息 + * @return 结果 + */ + public int pauseJob(SysJob job) throws SchedulerException; + + /** + * 恢复任务 + * + * @param job 调度信息 + * @return 结果 + */ + public int resumeJob(SysJob job) throws SchedulerException; + + /** + * 删除任务后,所对应的trigger也将被删除 + * + * @param job 调度信息 + * @return 结果 + */ + public int deleteJob(SysJob job) throws SchedulerException; + + /** + * 批量删除调度信息 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public void deleteJobByIds(String ids) throws SchedulerException; + + /** + * 任务调度状态修改 + * + * @param job 调度信息 + * @return 结果 + */ + public int changeStatus(SysJob job) throws SchedulerException; + + /** + * 立即运行任务 + * + * @param job 调度信息 + * @return 结果 + */ + public boolean run(SysJob job) throws SchedulerException; + + /** + * 新增任务 + * + * @param job 调度信息 + * @return 结果 + */ + public int insertJob(SysJob job) throws SchedulerException, TaskException; + + /** + * 更新任务 + * + * @param job 调度信息 + * @return 结果 + */ + public int updateJob(SysJob job) throws SchedulerException, TaskException; + + /** + * 校验cron表达式是否有效 + * + * @param cronExpression 表达式 + * @return 结果 + */ + public boolean checkCronExpressionIsValid(String cronExpression); +} \ No newline at end of file diff --git a/quartz/src/main/java/com/yyy/quartz/service/impl/SysJobLogServiceImpl.java b/quartz/src/main/java/com/yyy/quartz/service/impl/SysJobLogServiceImpl.java new file mode 100644 index 0000000..7eeca80 --- /dev/null +++ b/quartz/src/main/java/com/yyy/quartz/service/impl/SysJobLogServiceImpl.java @@ -0,0 +1,88 @@ +package com.yyy.quartz.service.impl; + + +import com.yyy.common.core.text.Convert; +import com.yyy.quartz.domain.SysJobLog; +import com.yyy.quartz.mapper.SysJobLogMapper; +import com.yyy.quartz.service.ISysJobLogService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 定时任务调度日志信息 服务层 + */ +@Service +public class SysJobLogServiceImpl implements ISysJobLogService +{ + @Resource + private SysJobLogMapper jobLogMapper; + + /** + * 获取quartz调度器日志的计划任务 + * + * @param jobLog 调度日志信息 + * @return 调度任务日志集合 + */ + @Override + public List selectJobLogList(SysJobLog jobLog) + { + return jobLogMapper.selectJobLogList(jobLog); + } + + /** + * 通过调度任务日志ID查询调度信息 + * + * @param jobLogId 调度任务日志ID + * @return 调度任务日志对象信息 + */ + @Override + public SysJobLog selectJobLogById(Long jobLogId) + { + return jobLogMapper.selectJobLogById(jobLogId); + } + + /** + * 新增任务日志 + * + * @param jobLog 调度日志信息 + */ + @Override + public void addJobLog(SysJobLog jobLog) + { + jobLogMapper.insertJobLog(jobLog); + } + + /** + * 批量删除调度日志信息 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + @Override + public int deleteJobLogByIds(String ids) + { + return jobLogMapper.deleteJobLogByIds(Convert.toStrArray(ids)); + } + + /** + * 删除任务日志 + * + * @param jobId 调度日志ID + */ + @Override + public int deleteJobLogById(Long jobId) + { + return jobLogMapper.deleteJobLogById(jobId); + } + + /** + * 清空任务日志 + */ + @Override + public void cleanJobLog() + { + jobLogMapper.cleanJobLog(); + } +} diff --git a/quartz/src/main/java/com/yyy/quartz/service/impl/SysJobServiceImpl.java b/quartz/src/main/java/com/yyy/quartz/service/impl/SysJobServiceImpl.java new file mode 100644 index 0000000..1b71734 --- /dev/null +++ b/quartz/src/main/java/com/yyy/quartz/service/impl/SysJobServiceImpl.java @@ -0,0 +1,270 @@ +package com.yyy.quartz.service.impl; + + +import com.yyy.common.constant.ScheduleConstants; +import com.yyy.common.core.text.Convert; +import com.yyy.common.exception.job.TaskException; +import com.yyy.quartz.domain.SysJob; +import com.yyy.quartz.mapper.SysJobMapper; +import com.yyy.quartz.service.ISysJobService; +import com.yyy.quartz.util.CronUtils; +import com.yyy.quartz.util.ScheduleUtils; +import org.quartz.JobDataMap; +import org.quartz.JobKey; +import org.quartz.Scheduler; +import org.quartz.SchedulerException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; +import java.util.List; + +/** + * 定时任务调度信息 服务层 + * + */ +@Service +public class SysJobServiceImpl implements ISysJobService +{ + @Autowired + private Scheduler scheduler; + + @Resource + private SysJobMapper jobMapper; + + /** + * 项目启动时,初始化定时器 + * 主要是防止手动修改数据库导致未同步到定时任务处理(注:不能手动修改数据库ID和任务组名,否则会导致脏数据) + */ + @PostConstruct + public void init() throws SchedulerException, TaskException + { + scheduler.clear(); + List jobList = jobMapper.selectJobAll(); + for (SysJob job : jobList) + { + ScheduleUtils.createScheduleJob(scheduler, job); + } + } + + /** + * 获取quartz调度器的计划任务列表 + * + * @param job 调度信息 + * @return + */ + @Override + public List selectJobList(SysJob job) + { + return jobMapper.selectJobList(job); + } + + /** + * 通过调度任务ID查询调度信息 + * + * @param jobId 调度任务ID + * @return 调度任务对象信息 + */ + @Override + public SysJob selectJobById(Long jobId) + { + return jobMapper.selectJobById(jobId); + } + + @Override + public List selectJobByIds(List list) { + return jobMapper.selectJobByIds(list); + } + + /** + * 暂停任务 + * + * @param job 调度信息 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int pauseJob(SysJob job) throws SchedulerException + { + Long jobId = job.getJobId(); + String jobGroup = job.getJobGroup(); + job.setStatus(ScheduleConstants.Status.PAUSE.getValue()); + int rows = jobMapper.updateJob(job); + if (rows > 0) + { + scheduler.pauseJob(ScheduleUtils.getJobKey(jobId, jobGroup)); + } + return rows; + } + + /** + * 恢复任务 + * + * @param job 调度信息 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int resumeJob(SysJob job) throws SchedulerException + { + Long jobId = job.getJobId(); + String jobGroup = job.getJobGroup(); + job.setStatus(ScheduleConstants.Status.NORMAL.getValue()); + int rows = jobMapper.updateJob(job); + if (rows > 0) + { + scheduler.resumeJob(ScheduleUtils.getJobKey(jobId, jobGroup)); + } + return rows; + } + + /** + * 删除任务后,所对应的trigger也将被删除 + * + * @param job 调度信息 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int deleteJob(SysJob job) throws SchedulerException + { + Long jobId = job.getJobId(); + String jobGroup = job.getJobGroup(); + int rows = jobMapper.deleteJobById(jobId); + if (rows > 0) + { + scheduler.deleteJob(ScheduleUtils.getJobKey(jobId, jobGroup)); + } + return rows; + } + + /** + * 批量删除调度信息 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteJobByIds(String ids) throws SchedulerException + { + Long[] jobIds = Convert.toLongArray(ids); + for (Long jobId : jobIds) + { + SysJob job = jobMapper.selectJobById(jobId); + deleteJob(job); + } + } + + /** + * 任务调度状态修改 + * + * @param job 调度信息 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int changeStatus(SysJob job) throws SchedulerException + { + int rows = 0; + String status = job.getStatus(); + if (ScheduleConstants.Status.NORMAL.getValue().equals(status)) + { + rows = resumeJob(job); + } + else if (ScheduleConstants.Status.PAUSE.getValue().equals(status)) + { + rows = pauseJob(job); + } + return rows; + } + + /** + * 立即运行任务 + * + * @param job 调度信息 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public boolean run(SysJob job) throws SchedulerException + { + boolean result = false; + Long jobId = job.getJobId(); + SysJob tmpObj = selectJobById(job.getJobId()); + // 参数 + JobDataMap dataMap = new JobDataMap(); + dataMap.put(ScheduleConstants.TASK_PROPERTIES, tmpObj); + JobKey jobKey = ScheduleUtils.getJobKey(jobId, tmpObj.getJobGroup()); + if (scheduler.checkExists(jobKey)) + { + result = true; + scheduler.triggerJob(jobKey, dataMap); + } + return result; + } + + /** + * 新增任务 + * + * @param job 调度信息 调度信息 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int insertJob(SysJob job) throws SchedulerException, TaskException + { + //job.setStatus(ScheduleConstants.Status.PAUSE.getValue()); + int rows = jobMapper.insertJob(job); + if (rows > 0) + { + ScheduleUtils.createScheduleJob(scheduler, job); + } + return rows; + } + + /** + * 更新任务的时间表达式 + * + * @param job 调度信息 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int updateJob(SysJob job) throws SchedulerException, TaskException + { + SysJob properties = selectJobById(job.getJobId()); + int rows = jobMapper.updateJob(job); + if (rows > 0) + { + updateSchedulerJob(job, properties.getJobGroup()); + } + return rows; + } + + /** + * 更新任务 + * + * @param job 任务对象 + * @param jobGroup 任务组名 + */ + public void updateSchedulerJob(SysJob job, String jobGroup) throws SchedulerException, TaskException + { + Long jobId = job.getJobId(); + // 判断是否存在 + JobKey jobKey = ScheduleUtils.getJobKey(jobId, jobGroup); + if (scheduler.checkExists(jobKey)) + { + // 防止创建时存在数据问题 先移除,然后在执行创建操作 + scheduler.deleteJob(jobKey); + } + ScheduleUtils.createScheduleJob(scheduler, job); + } + + /** + * 校验cron表达式是否有效 + * + * @param cronExpression 表达式 + * @return 结果 + */ + @Override + public boolean checkCronExpressionIsValid(String cronExpression) + { + return CronUtils.isValid(cronExpression); + } +} \ No newline at end of file diff --git a/quartz/src/main/java/com/yyy/quartz/task/RyTask.java b/quartz/src/main/java/com/yyy/quartz/task/RyTask.java new file mode 100644 index 0000000..b6ab0a3 --- /dev/null +++ b/quartz/src/main/java/com/yyy/quartz/task/RyTask.java @@ -0,0 +1,27 @@ +package com.yyy.quartz.task; + +import com.yyy.common.utils.common.StringUtils; +import org.springframework.stereotype.Component; + +/** + * 定时任务调度测试 + * + */ +@Component("ryTask") +public class RyTask +{ + public void ryMultipleParams(String s, Boolean b, Long l, Double d, Integer i) + { + System.out.println(StringUtils.format("执行多参方法: 字符串类型{},布尔类型{},长整型{},浮点型{},整形{}", s, b, l, d, i)); + } + + public void ryParams(String params) + { + System.out.println("执行有参方法:" + params); + } + + public void ryNoParams() + { + System.out.println("执行无参方法"); + } +} diff --git a/quartz/src/main/java/com/yyy/quartz/util/AbstractQuartzJob.java b/quartz/src/main/java/com/yyy/quartz/util/AbstractQuartzJob.java new file mode 100644 index 0000000..96a3749 --- /dev/null +++ b/quartz/src/main/java/com/yyy/quartz/util/AbstractQuartzJob.java @@ -0,0 +1,117 @@ +package com.yyy.quartz.util; + +import com.alibaba.fastjson.JSONObject; +import com.yyy.common.constant.Constants; +import com.yyy.common.constant.ScheduleConstants; +import com.yyy.common.enums.FlowStatus; +import com.yyy.common.utils.bean.BeanUtils; +import com.yyy.common.utils.common.ExceptionUtil; +import com.yyy.common.utils.common.StringUtils; +import com.yyy.common.utils.spring.SpringUtils; +import com.yyy.quartz.domain.JobMessage; +import com.yyy.quartz.domain.SysJob; +import com.yyy.quartz.domain.SysJobLog; +import com.yyy.quartz.service.ISysJobLogService; +import org.quartz.Job; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Date; + +/** + * 抽象quartz调用 + */ +public abstract class AbstractQuartzJob implements Job { + private static final Logger log = LoggerFactory.getLogger(AbstractQuartzJob.class); + + /** + * 线程本地变量 + */ + private static ThreadLocal threadLocal = new ThreadLocal<>(); + + @Override + public void execute(JobExecutionContext context) throws JobExecutionException { + SysJob sysJob = new SysJob(); + BeanUtils.copyBeanProp(sysJob, context.getMergedJobDataMap().get(ScheduleConstants.TASK_PROPERTIES)); + + // 计划开始和计划结束的时间段内生效 + JSONObject config = JSONObject.parseObject(sysJob.getConfig()); + if (config != null && config.containsKey("expectedStartTime") && config.containsKey("expectedFinishTime")){ + Date now = new Date(); + //不在计划时间段内 + if (now.getTime() < config.getDate("expectedStartTime").getTime() || now.getTime() > config.getDate("expectedFinishTime").getTime()){ + return; + } + } + + try { + before(context, sysJob); + if (sysJob != null) { + doExecute(context, sysJob); + } + after(context, sysJob, null); + } catch (Exception e) { + log.error("任务执行异常 - :", e); + after(context, sysJob, e); + } + } + + /** + * 执行前 + * + * @param context 工作执行上下文对象 + * @param sysJob 系统计划任务 + */ + protected void before(JobExecutionContext context, SysJob sysJob) { + threadLocal.set(new Date()); + } + + /** + * 执行后 + * + * @param context 工作执行上下文对象 + * @param sysJob 系统计划任务 + */ + protected void after(JobExecutionContext context, SysJob sysJob, Exception e) { + Date startTime = threadLocal.get(); + threadLocal.remove(); + + final SysJobLog sysJobLog = new SysJobLog(); + sysJobLog.setJobName(sysJob.getJobName()); + sysJobLog.setJobGroup(sysJob.getJobGroup()); + sysJobLog.setInvokeTarget(sysJob.getInvokeTarget()); + sysJobLog.setStartTime(startTime); + sysJobLog.setEndTime(new Date()); + long runMs = sysJobLog.getEndTime().getTime() - sysJobLog.getStartTime().getTime(); + +// // 任务信息封装 +// JobMessage jobMessage = new JobMessage(); +// jobMessage.setMessage(sysJobLog.getJobName() + " 总共耗时:" + runMs + "毫秒"); +// jobMessage.setCreateType(0); +// jobMessage.setStatus(FlowStatus.APPROVAL); +// sysJobLog.setJobMessage(JSONObject.toJSONString(jobMessage)); + + sysJobLog.setJobMessage(sysJobLog.getJobName() + " 总共耗时:" + runMs + "毫秒"); + if (e != null) { + sysJobLog.setStatus(Constants.FAIL); + String errorMsg = StringUtils.substring(ExceptionUtil.getExceptionMessage(e), 0, 2000); + sysJobLog.setExceptionInfo(errorMsg); + } else { + sysJobLog.setStatus(Constants.SUCCESS); + } + + // 写入数据库当中 + SpringUtils.getBean(ISysJobLogService.class).addJobLog(sysJobLog); + } + + /** + * 执行方法,由子类重载 + * + * @param context 工作执行上下文对象 + * @param sysJob 系统计划任务 + * @throws Exception 执行过程中的异常 + */ + protected abstract void doExecute(JobExecutionContext context, SysJob sysJob) throws Exception; +} diff --git a/quartz/src/main/java/com/yyy/quartz/util/CronUtils.java b/quartz/src/main/java/com/yyy/quartz/util/CronUtils.java new file mode 100644 index 0000000..add136c --- /dev/null +++ b/quartz/src/main/java/com/yyy/quartz/util/CronUtils.java @@ -0,0 +1,93 @@ +package com.yyy.quartz.util; + +import com.yyy.common.utils.common.DateUtils; +import org.quartz.CronExpression; +import org.quartz.TriggerUtils; +import org.quartz.impl.triggers.CronTriggerImpl; + +import java.text.ParseException; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * cron表达式工具类 + * + */ +public class CronUtils +{ + /** + * 返回一个布尔值代表一个给定的Cron表达式的有效性 + * + * @param cronExpression Cron表达式 + * @return boolean 表达式是否有效 + */ + public static boolean isValid(String cronExpression) + { + return CronExpression.isValidExpression(cronExpression); + } + + /** + * 返回一个字符串值,表示该消息无效Cron表达式给出有效性 + * + * @param cronExpression Cron表达式 + * @return String 无效时返回表达式错误描述,如果有效返回null + */ + public static String getInvalidMessage(String cronExpression) + { + try + { + new CronExpression(cronExpression); + return null; + } + catch (ParseException pe) + { + return pe.getMessage(); + } + } + + /** + * 返回下一个执行时间根据给定的Cron表达式 + * + * @param cronExpression Cron表达式 + * @return Date 下次Cron表达式执行时间 + */ + public static Date getNextExecution(String cronExpression) + { + try + { + CronExpression cron = new CronExpression(cronExpression); + return cron.getNextValidTimeAfter(new Date(System.currentTimeMillis())); + } + catch (ParseException e) + { + throw new IllegalArgumentException(e.getMessage()); + } + } + + /** + * 通过表达式获取近10次的执行时间 + * + * @param cron 表达式 + * @return 时间列表 + */ + public static List getRecentTriggerTime(String cron) + { + List list = new ArrayList(); + try + { + CronTriggerImpl cronTriggerImpl = new CronTriggerImpl(); + cronTriggerImpl.setCronExpression(cron); + List dates = TriggerUtils.computeFireTimes(cronTriggerImpl, null, 10); + for (Date date : dates) + { + list.add(DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, date)); + } + } + catch (ParseException e) + { + return null; + } + return list; + } +} diff --git a/quartz/src/main/java/com/yyy/quartz/util/JobInvokeUtil.java b/quartz/src/main/java/com/yyy/quartz/util/JobInvokeUtil.java new file mode 100644 index 0000000..a9853ff --- /dev/null +++ b/quartz/src/main/java/com/yyy/quartz/util/JobInvokeUtil.java @@ -0,0 +1,191 @@ +package com.yyy.quartz.util; + +import com.alibaba.fastjson.JSONObject; +import com.yyy.common.utils.common.StringUtils; +import com.yyy.common.utils.spring.SpringUtils; +import com.yyy.quartz.domain.SysJob; +import lombok.extern.slf4j.Slf4j; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.LinkedList; +import java.util.List; + +/** + * 任务执行工具 + */ +public class JobInvokeUtil +{ + /** + * 执行方法 + * + * @param sysJob 系统任务 + */ + public static void invokeMethod(SysJob sysJob) throws Exception + { + String invokeTarget = sysJob.getInvokeTarget(); + String beanName = getBeanName(invokeTarget); + String methodName = getMethodName(invokeTarget); + List methodParams = getMethodParams(invokeTarget); + + if (!isValidClassName(beanName)) + { + Object bean = SpringUtils.getBean(beanName); + invokeMethod(bean, methodName, methodParams); + } + else + { + Object bean = Class.forName(beanName).getDeclaredConstructor().newInstance(); + invokeMethod(bean, methodName, methodParams); + } + } + + /** + * 调用任务方法 + * + * @param bean 目标对象 + * @param methodName 方法名称 + * @param methodParams 方法参数 + */ + private static void invokeMethod(Object bean, String methodName, List methodParams) + throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, + InvocationTargetException + { + if (StringUtils.isNotNull(methodParams) && methodParams.size() > 0) + { + Method method = bean.getClass().getMethod(methodName, getMethodParamsType(methodParams)); + method.invoke(bean, getMethodParamsValue(methodParams)); + } + else + { + Method method = bean.getClass().getMethod(methodName); + method.invoke(bean); + } + } + + /** + * 校验是否为为class包名 + * + * @param invokeTarget 名称 + * @return true是 false否 + */ + public static boolean isValidClassName(String invokeTarget) + { + return StringUtils.countMatches(invokeTarget, ".") > 1; + } + + /** + * 获取bean名称 + * + * @param invokeTarget 目标字符串 + * @return bean名称 + */ + public static String getBeanName(String invokeTarget) + { + String beanName = StringUtils.substringBefore(invokeTarget, "("); + return StringUtils.substringBeforeLast(beanName, "."); + } + + /** + * 获取bean方法 + * + * @param invokeTarget 目标字符串 + * @return method方法 + */ + public static String getMethodName(String invokeTarget) + { + String methodName = StringUtils.substringBefore(invokeTarget, "("); + return StringUtils.substringAfterLast(methodName, "."); + } + + /** + * 获取method方法参数相关列表 + * + * @param invokeTarget 目标字符串 + * @return method方法相关参数列表 + */ + public static List getMethodParams(String invokeTarget) + { + String methodStr = StringUtils.substringBetween(invokeTarget, "(", ")"); + if (StringUtils.isEmpty(methodStr)) + { + return null; + } + List classs = new LinkedList<>(); + + //如果methodStr以J结尾转换成JsonObject对象 + if (StringUtils.endsWith(methodStr, "J")){ + classs.add(new Object[]{JSONObject.parseObject(StringUtils.substring(methodStr, 0, methodStr.length() - 1)), JSONObject.class}); + return classs; + } + String[] methodParams = methodStr.split(",(?=([^\"']*[\"'][^\"']*[\"'])*[^\"']*$)"); + + for (int i = 0; i < methodParams.length; i++) + { + String str = StringUtils.trimToEmpty(methodParams[i]); + // String字符串类型,以'或"开头 + if (StringUtils.startsWithAny(str, "'", "\"")) + { + classs.add(new Object[] { StringUtils.substring(str, 1, str.length() - 1), String.class }); + } + // boolean布尔类型,等于true或者false + else if ("true".equalsIgnoreCase(str) || "false".equalsIgnoreCase(str)) + { + classs.add(new Object[] { Boolean.valueOf(str), Boolean.class }); + } + // long长整形,以L结尾 + else if (StringUtils.endsWith(str, "L")) + { + classs.add(new Object[] { Long.valueOf(StringUtils.substring(str, 0, str.length() - 1)), Long.class }); + } + // double浮点类型,以D结尾 + else if (StringUtils.endsWith(str, "D")) + { + classs.add(new Object[] { Double.valueOf(StringUtils.substring(str, 0, str.length() - 1)), Double.class }); + } + + // 其他类型归类为整形 + else + { + classs.add(new Object[] { Integer.valueOf(str), Integer.class }); + } + } + return classs; + } + + /** + * 获取参数类型 + * + * @param methodParams 参数相关列表 + * @return 参数类型列表 + */ + public static Class[] getMethodParamsType(List methodParams) + { + Class[] classs = new Class[methodParams.size()]; + int index = 0; + for (Object[] os : methodParams) + { + classs[index] = (Class) os[1]; + index++; + } + return classs; + } + + /** + * 获取参数值 + * + * @param methodParams 参数相关列表 + * @return 参数值列表 + */ + public static Object[] getMethodParamsValue(List methodParams) + { + Object[] classs = new Object[methodParams.size()]; + int index = 0; + for (Object[] os : methodParams) + { + classs[index] = (Object) os[0]; + index++; + } + return classs; + } +} diff --git a/quartz/src/main/java/com/yyy/quartz/util/QuartzDisallowConcurrentExecution.java b/quartz/src/main/java/com/yyy/quartz/util/QuartzDisallowConcurrentExecution.java new file mode 100644 index 0000000..69b5495 --- /dev/null +++ b/quartz/src/main/java/com/yyy/quartz/util/QuartzDisallowConcurrentExecution.java @@ -0,0 +1,18 @@ +package com.yyy.quartz.util; + +import com.yyy.quartz.domain.SysJob; +import org.quartz.DisallowConcurrentExecution; +import org.quartz.JobExecutionContext; + +/** + * 定时任务处理(禁止并发执行) + */ +@DisallowConcurrentExecution +public class QuartzDisallowConcurrentExecution extends AbstractQuartzJob +{ + @Override + protected void doExecute(JobExecutionContext context, SysJob sysJob) throws Exception + { + JobInvokeUtil.invokeMethod(sysJob); + } +} diff --git a/quartz/src/main/java/com/yyy/quartz/util/QuartzJobExecution.java b/quartz/src/main/java/com/yyy/quartz/util/QuartzJobExecution.java new file mode 100644 index 0000000..bb112f3 --- /dev/null +++ b/quartz/src/main/java/com/yyy/quartz/util/QuartzJobExecution.java @@ -0,0 +1,17 @@ +package com.yyy.quartz.util; + +import com.yyy.quartz.domain.SysJob; +import org.quartz.JobExecutionContext; + +/** + * 定时任务处理(允许并发执行) + * + */ +public class QuartzJobExecution extends AbstractQuartzJob +{ + @Override + protected void doExecute(JobExecutionContext context, SysJob sysJob) throws Exception + { + JobInvokeUtil.invokeMethod(sysJob); + } +} diff --git a/quartz/src/main/java/com/yyy/quartz/util/ScheduleUtils.java b/quartz/src/main/java/com/yyy/quartz/util/ScheduleUtils.java new file mode 100644 index 0000000..49c5774 --- /dev/null +++ b/quartz/src/main/java/com/yyy/quartz/util/ScheduleUtils.java @@ -0,0 +1,130 @@ +package com.yyy.quartz.util; + + +import com.yyy.common.constant.Constants; +import com.yyy.common.constant.ScheduleConstants; +import com.yyy.common.exception.job.TaskException; +import com.yyy.common.utils.common.StringUtils; +import com.yyy.common.utils.spring.SpringUtils; +import com.yyy.quartz.domain.SysJob; +import org.quartz.*; + +/** + * 定时任务工具类 + * + */ +public class ScheduleUtils +{ + /** + * 得到quartz任务类 + * + * @param sysJob 执行计划 + * @return 具体执行任务类 + */ + private static Class getQuartzJobClass(SysJob sysJob) + { + boolean isConcurrent = "0".equals(sysJob.getConcurrent()); + return isConcurrent ? QuartzJobExecution.class : QuartzDisallowConcurrentExecution.class; + } + + /** + * 构建任务触发对象 + */ + public static TriggerKey getTriggerKey(Long jobId, String jobGroup) + { + return TriggerKey.triggerKey(ScheduleConstants.TASK_CLASS_NAME + jobId, jobGroup); + } + + /** + * 构建任务键对象 + */ + public static JobKey getJobKey(Long jobId, String jobGroup) + { + return JobKey.jobKey(ScheduleConstants.TASK_CLASS_NAME + jobId, jobGroup); + } + + /** + * 创建定时任务 + */ + public static void createScheduleJob(Scheduler scheduler, SysJob job) throws SchedulerException, TaskException + { + Class jobClass = getQuartzJobClass(job); + // 构建job信息 + Long jobId = job.getJobId(); + String jobGroup = job.getJobGroup(); + JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(getJobKey(jobId, jobGroup)).build(); + + // 表达式调度构建器 + CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCronExpression()); + cronScheduleBuilder = handleCronScheduleMisfirePolicy(job, cronScheduleBuilder); + + // 按新的cronExpression表达式构建一个新的trigger + CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(getTriggerKey(jobId, jobGroup)) + .withSchedule(cronScheduleBuilder).build(); + + // 放入参数,运行时的方法可以获取 + jobDetail.getJobDataMap().put(ScheduleConstants.TASK_PROPERTIES, job); + + // 判断是否存在 + if (scheduler.checkExists(getJobKey(jobId, jobGroup))) + { + // 防止创建时存在数据问题 先移除,然后在执行创建操作 + scheduler.deleteJob(getJobKey(jobId, jobGroup)); + } + + // 判断任务是否过期 + if (StringUtils.isNotNull(CronUtils.getNextExecution(job.getCronExpression()))) + { + // 执行调度任务 + scheduler.scheduleJob(jobDetail, trigger); + } + + // 暂停任务 + if (job.getStatus().equals(ScheduleConstants.Status.PAUSE.getValue())) + { + scheduler.pauseJob(ScheduleUtils.getJobKey(jobId, jobGroup)); + } + } + + /** + * 设置定时任务策略 + */ + public static CronScheduleBuilder handleCronScheduleMisfirePolicy(SysJob job, CronScheduleBuilder cb) + throws TaskException + { + switch (job.getMisfirePolicy()) + { + case ScheduleConstants.MISFIRE_DEFAULT: + return cb; + case ScheduleConstants.MISFIRE_IGNORE_MISFIRES: + return cb.withMisfireHandlingInstructionIgnoreMisfires(); + case ScheduleConstants.MISFIRE_FIRE_AND_PROCEED: + return cb.withMisfireHandlingInstructionFireAndProceed(); + case ScheduleConstants.MISFIRE_DO_NOTHING: + return cb.withMisfireHandlingInstructionDoNothing(); + default: + throw new TaskException("The task misfire policy '" + job.getMisfirePolicy() + + "' cannot be used in cron schedule tasks", TaskException.Code.CONFIG_ERROR); + } + } + + /** + * 检查包名是否为白名单配置 + * + * @param invokeTarget 目标字符串 + * @return 结果 + */ + public static boolean whiteList(String invokeTarget) + { + String packageName = StringUtils.substringBefore(invokeTarget, "("); + int count = StringUtils.countMatches(packageName, "."); + if (count > 1) + { + return StringUtils.containsAnyIgnoreCase(invokeTarget, Constants.JOB_WHITELIST_STR); + } + Object obj = SpringUtils.getBean(StringUtils.split(invokeTarget, ".")[0]); + String beanPackageName = obj.getClass().getPackage().getName(); + return StringUtils.containsAnyIgnoreCase(beanPackageName, Constants.JOB_WHITELIST_STR) + && !StringUtils.containsAnyIgnoreCase(beanPackageName, Constants.JOB_ERROR_STR); + } +} \ No newline at end of file diff --git a/quartz/src/main/resources/mapper/quartz/SysJobLogMapper.xml b/quartz/src/main/resources/mapper/quartz/SysJobLogMapper.xml new file mode 100644 index 0000000..80024fe --- /dev/null +++ b/quartz/src/main/resources/mapper/quartz/SysJobLogMapper.xml @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + select job_log_id, job_name, job_group, invoke_target, job_message, status, exception_info, create_time + from sys_job_log + + + + + + + + + + delete from sys_job_log where job_log_id = #{jobLogId} + + + + delete from sys_job_log where job_log_id in + + #{jobLogId} + + + + + truncate table sys_job_log + + + + insert into sys_job_log( + job_log_id, + job_name, + job_group, + invoke_target, + job_message, + status, + exception_info, + create_time + )values( + #{jobLogId}, + #{jobName}, + #{jobGroup}, + #{invokeTarget}, + #{jobMessage}, + #{status}, + #{exceptionInfo}, + sysdate() + ) + + + \ No newline at end of file diff --git a/quartz/src/main/resources/mapper/quartz/SysJobMapper.xml b/quartz/src/main/resources/mapper/quartz/SysJobMapper.xml new file mode 100644 index 0000000..853b387 --- /dev/null +++ b/quartz/src/main/resources/mapper/quartz/SysJobMapper.xml @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + select job_id, job_name, job_group, invoke_target, cron_expression, misfire_policy, concurrent, status, create_user, create_time, remark, config + from sys_job + + + + + + + + + + + + delete from sys_job where job_id = #{jobId} + + + + delete from sys_job where job_id in + + #{jobId} + + + + + update sys_job + + job_name = #{jobName}, + job_group = #{jobGroup}, + invoke_target = #{invokeTarget}, + cron_expression = #{cronExpression}, + misfire_policy = #{misfirePolicy}, + concurrent = #{concurrent}, + status = #{status}, + remark = #{remark}, + config = #{config}, + update_user = #{updateUser}, + update_time = sysdate() + + where job_id = #{jobId} + + + + insert into sys_job( + job_id, + job_name, + job_group, + invoke_target, + cron_expression, + misfire_policy, + concurrent, + status, + remark, + config, + create_user, + create_time + )values( + #{jobId}, + #{jobName}, + #{jobGroup}, + #{invokeTarget}, + #{cronExpression}, + #{misfirePolicy}, + #{concurrent}, + #{status}, + #{remark}, + #{config}, + #{createUser}, + sysdate() + ) + + + \ No newline at end of file diff --git a/sql/eam2.sql b/sql/eam2.sql new file mode 100644 index 0000000..eae3170 --- /dev/null +++ b/sql/eam2.sql @@ -0,0 +1,3810 @@ +/* + Navicat Premium Data Transfer + + Source Server : localhost + Source Server Type : MySQL + Source Server Version : 80033 + Source Host : localhost:3306 + Source Schema : eam2 + + Target Server Type : MySQL + Target Server Version : 80033 + File Encoding : 65001 + + Date: 10/10/2024 16:26:59 +*/ + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for act_app_appdef +-- ---------------------------- +DROP TABLE IF EXISTS `act_app_appdef`; +CREATE TABLE `act_app_appdef` ( + `ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `REV_` int NOT NULL, + `NAME_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `KEY_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `VERSION_` int NOT NULL, + `CATEGORY_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `DEPLOYMENT_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `RESOURCE_NAME_` varchar(4000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `DESCRIPTION_` varchar(4000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '', + PRIMARY KEY (`ID_`) USING BTREE, + UNIQUE INDEX `ACT_IDX_APP_DEF_UNIQ`(`KEY_` ASC, `VERSION_` ASC, `TENANT_ID_` ASC) USING BTREE, + INDEX `ACT_IDX_APP_DEF_DPLY`(`DEPLOYMENT_ID_` ASC) USING BTREE, + CONSTRAINT `ACT_FK_APP_DEF_DPLY` FOREIGN KEY (`DEPLOYMENT_ID_`) REFERENCES `act_app_deployment` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_app_appdef +-- ---------------------------- + +-- ---------------------------- +-- Table structure for act_app_databasechangelog +-- ---------------------------- +DROP TABLE IF EXISTS `act_app_databasechangelog`; +CREATE TABLE `act_app_databasechangelog` ( + `ID` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `AUTHOR` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `FILENAME` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `DATEEXECUTED` datetime NOT NULL, + `ORDEREXECUTED` int NOT NULL, + `EXECTYPE` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `MD5SUM` varchar(35) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `DESCRIPTION` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `COMMENTS` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `TAG` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `LIQUIBASE` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `CONTEXTS` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `LABELS` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `DEPLOYMENT_ID` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_app_databasechangelog +-- ---------------------------- +INSERT INTO `act_app_databasechangelog` VALUES ('1', 'flowable', 'org/flowable/app/db/liquibase/flowable-app-db-changelog.xml', '2024-04-23 14:58:24', 1, 'EXECUTED', '8:496fc778bdf2ab13f2e1926d0e63e0a2', 'createTable tableName=ACT_APP_DEPLOYMENT; createTable tableName=ACT_APP_DEPLOYMENT_RESOURCE; addForeignKeyConstraint baseTableName=ACT_APP_DEPLOYMENT_RESOURCE, constraintName=ACT_FK_APP_RSRC_DPL, referencedTableName=ACT_APP_DEPLOYMENT; createIndex...', '', NULL, '4.9.1', NULL, NULL, '3855504186'); +INSERT INTO `act_app_databasechangelog` VALUES ('2', 'flowable', 'org/flowable/app/db/liquibase/flowable-app-db-changelog.xml', '2024-04-23 14:58:24', 2, 'EXECUTED', '8:ccea9ebfb6c1f8367ca4dd473fcbb7db', 'modifyDataType columnName=DEPLOY_TIME_, tableName=ACT_APP_DEPLOYMENT', '', NULL, '4.9.1', NULL, NULL, '3855504186'); +INSERT INTO `act_app_databasechangelog` VALUES ('3', 'flowable', 'org/flowable/app/db/liquibase/flowable-app-db-changelog.xml', '2024-04-23 14:58:24', 3, 'EXECUTED', '8:f1f8aff320aade831944ebad24355f3d', 'createIndex indexName=ACT_IDX_APP_DEF_UNIQ, tableName=ACT_APP_APPDEF', '', NULL, '4.9.1', NULL, NULL, '3855504186'); + +-- ---------------------------- +-- Table structure for act_app_databasechangeloglock +-- ---------------------------- +DROP TABLE IF EXISTS `act_app_databasechangeloglock`; +CREATE TABLE `act_app_databasechangeloglock` ( + `ID` int NOT NULL, + `LOCKED` bit(1) NOT NULL, + `LOCKGRANTED` datetime NULL DEFAULT NULL, + `LOCKEDBY` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + PRIMARY KEY (`ID`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_app_databasechangeloglock +-- ---------------------------- +INSERT INTO `act_app_databasechangeloglock` VALUES (1, b'0', NULL, NULL); + +-- ---------------------------- +-- Table structure for act_app_deployment +-- ---------------------------- +DROP TABLE IF EXISTS `act_app_deployment`; +CREATE TABLE `act_app_deployment` ( + `ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `NAME_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `CATEGORY_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `KEY_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `DEPLOY_TIME_` datetime(3) NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '', + PRIMARY KEY (`ID_`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_app_deployment +-- ---------------------------- + +-- ---------------------------- +-- Table structure for act_app_deployment_resource +-- ---------------------------- +DROP TABLE IF EXISTS `act_app_deployment_resource`; +CREATE TABLE `act_app_deployment_resource` ( + `ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `NAME_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `DEPLOYMENT_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `RESOURCE_BYTES_` longblob NULL, + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_IDX_APP_RSRC_DPL`(`DEPLOYMENT_ID_` ASC) USING BTREE, + CONSTRAINT `ACT_FK_APP_RSRC_DPL` FOREIGN KEY (`DEPLOYMENT_ID_`) REFERENCES `act_app_deployment` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_app_deployment_resource +-- ---------------------------- + +-- ---------------------------- +-- Table structure for act_cmmn_casedef +-- ---------------------------- +DROP TABLE IF EXISTS `act_cmmn_casedef`; +CREATE TABLE `act_cmmn_casedef` ( + `ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `REV_` int NOT NULL, + `NAME_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `KEY_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `VERSION_` int NOT NULL, + `CATEGORY_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `DEPLOYMENT_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `RESOURCE_NAME_` varchar(4000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `DESCRIPTION_` varchar(4000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `HAS_GRAPHICAL_NOTATION_` bit(1) NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '', + `DGRM_RESOURCE_NAME_` varchar(4000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `HAS_START_FORM_KEY_` bit(1) NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE, + UNIQUE INDEX `ACT_IDX_CASE_DEF_UNIQ`(`KEY_` ASC, `VERSION_` ASC, `TENANT_ID_` ASC) USING BTREE, + INDEX `ACT_IDX_CASE_DEF_DPLY`(`DEPLOYMENT_ID_` ASC) USING BTREE, + CONSTRAINT `ACT_FK_CASE_DEF_DPLY` FOREIGN KEY (`DEPLOYMENT_ID_`) REFERENCES `act_cmmn_deployment` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_cmmn_casedef +-- ---------------------------- + +-- ---------------------------- +-- Table structure for act_cmmn_databasechangelog +-- ---------------------------- +DROP TABLE IF EXISTS `act_cmmn_databasechangelog`; +CREATE TABLE `act_cmmn_databasechangelog` ( + `ID` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `AUTHOR` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `FILENAME` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `DATEEXECUTED` datetime NOT NULL, + `ORDEREXECUTED` int NOT NULL, + `EXECTYPE` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `MD5SUM` varchar(35) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `DESCRIPTION` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `COMMENTS` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `TAG` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `LIQUIBASE` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `CONTEXTS` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `LABELS` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `DEPLOYMENT_ID` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_cmmn_databasechangelog +-- ---------------------------- +INSERT INTO `act_cmmn_databasechangelog` VALUES ('1', 'flowable', 'org/flowable/cmmn/db/liquibase/flowable-cmmn-db-changelog.xml', '2024-04-23 14:58:23', 1, 'EXECUTED', '8:8b4b922d90b05ff27483abefc9597aa6', 'createTable tableName=ACT_CMMN_DEPLOYMENT; createTable tableName=ACT_CMMN_DEPLOYMENT_RESOURCE; addForeignKeyConstraint baseTableName=ACT_CMMN_DEPLOYMENT_RESOURCE, constraintName=ACT_FK_CMMN_RSRC_DPL, referencedTableName=ACT_CMMN_DEPLOYMENT; create...', '', NULL, '4.9.1', NULL, NULL, '3855502390'); +INSERT INTO `act_cmmn_databasechangelog` VALUES ('2', 'flowable', 'org/flowable/cmmn/db/liquibase/flowable-cmmn-db-changelog.xml', '2024-04-23 14:58:23', 2, 'EXECUTED', '8:65e39b3d385706bb261cbeffe7533cbe', 'addColumn tableName=ACT_CMMN_CASEDEF; addColumn tableName=ACT_CMMN_DEPLOYMENT_RESOURCE; addColumn tableName=ACT_CMMN_RU_CASE_INST; addColumn tableName=ACT_CMMN_RU_PLAN_ITEM_INST', '', NULL, '4.9.1', NULL, NULL, '3855502390'); +INSERT INTO `act_cmmn_databasechangelog` VALUES ('3', 'flowable', 'org/flowable/cmmn/db/liquibase/flowable-cmmn-db-changelog.xml', '2024-04-23 14:58:23', 3, 'EXECUTED', '8:c01f6e802b49436b4489040da3012359', 'addColumn tableName=ACT_CMMN_RU_PLAN_ITEM_INST; addColumn tableName=ACT_CMMN_RU_CASE_INST; createIndex indexName=ACT_IDX_PLAN_ITEM_STAGE_INST, tableName=ACT_CMMN_RU_PLAN_ITEM_INST; addColumn tableName=ACT_CMMN_RU_PLAN_ITEM_INST; addColumn tableNam...', '', NULL, '4.9.1', NULL, NULL, '3855502390'); +INSERT INTO `act_cmmn_databasechangelog` VALUES ('4', 'flowable', 'org/flowable/cmmn/db/liquibase/flowable-cmmn-db-changelog.xml', '2024-04-23 14:58:23', 4, 'EXECUTED', '8:e40d29cb79345b7fb5afd38a7f0ba8fc', 'createTable tableName=ACT_CMMN_HI_PLAN_ITEM_INST; addColumn tableName=ACT_CMMN_RU_MIL_INST; addColumn tableName=ACT_CMMN_HI_MIL_INST', '', NULL, '4.9.1', NULL, NULL, '3855502390'); +INSERT INTO `act_cmmn_databasechangelog` VALUES ('5', 'flowable', 'org/flowable/cmmn/db/liquibase/flowable-cmmn-db-changelog.xml', '2024-04-23 14:58:23', 5, 'EXECUTED', '8:70349de472f87368dcdec971a10311a0', 'modifyDataType columnName=DEPLOY_TIME_, tableName=ACT_CMMN_DEPLOYMENT; modifyDataType columnName=START_TIME_, tableName=ACT_CMMN_RU_CASE_INST; modifyDataType columnName=START_TIME_, tableName=ACT_CMMN_RU_PLAN_ITEM_INST; modifyDataType columnName=T...', '', NULL, '4.9.1', NULL, NULL, '3855502390'); +INSERT INTO `act_cmmn_databasechangelog` VALUES ('6', 'flowable', 'org/flowable/cmmn/db/liquibase/flowable-cmmn-db-changelog.xml', '2024-04-23 14:58:23', 6, 'EXECUTED', '8:10e82e26a7fee94c32a92099c059c18c', 'createIndex indexName=ACT_IDX_CASE_DEF_UNIQ, tableName=ACT_CMMN_CASEDEF', '', NULL, '4.9.1', NULL, NULL, '3855502390'); +INSERT INTO `act_cmmn_databasechangelog` VALUES ('7', 'flowable', 'org/flowable/cmmn/db/liquibase/flowable-cmmn-db-changelog.xml', '2024-04-23 14:58:23', 7, 'EXECUTED', '8:530bc81a1e30618ccf4a2da1f7c6c043', 'renameColumn newColumnName=CREATE_TIME_, oldColumnName=START_TIME_, tableName=ACT_CMMN_RU_PLAN_ITEM_INST; renameColumn newColumnName=CREATE_TIME_, oldColumnName=CREATED_TIME_, tableName=ACT_CMMN_HI_PLAN_ITEM_INST; addColumn tableName=ACT_CMMN_RU_P...', '', NULL, '4.9.1', NULL, NULL, '3855502390'); +INSERT INTO `act_cmmn_databasechangelog` VALUES ('8', 'flowable', 'org/flowable/cmmn/db/liquibase/flowable-cmmn-db-changelog.xml', '2024-04-23 14:58:23', 8, 'EXECUTED', '8:e8c2eb1ce28bc301efe07e0e29757781', 'addColumn tableName=ACT_CMMN_HI_PLAN_ITEM_INST', '', NULL, '4.9.1', NULL, NULL, '3855502390'); +INSERT INTO `act_cmmn_databasechangelog` VALUES ('9', 'flowable', 'org/flowable/cmmn/db/liquibase/flowable-cmmn-db-changelog.xml', '2024-04-23 14:58:23', 9, 'EXECUTED', '8:4cb4782b9bdec5ced2a64c525aa7b3a0', 'addColumn tableName=ACT_CMMN_RU_PLAN_ITEM_INST; addColumn tableName=ACT_CMMN_HI_PLAN_ITEM_INST', '', NULL, '4.9.1', NULL, NULL, '3855502390'); +INSERT INTO `act_cmmn_databasechangelog` VALUES ('10', 'flowable', 'org/flowable/cmmn/db/liquibase/flowable-cmmn-db-changelog.xml', '2024-04-23 14:58:23', 10, 'EXECUTED', '8:341c16be247f5d17badc9809da8691f9', 'addColumn tableName=ACT_CMMN_RU_CASE_INST; addColumn tableName=ACT_CMMN_RU_CASE_INST; createIndex indexName=ACT_IDX_CASE_INST_REF_ID_, tableName=ACT_CMMN_RU_CASE_INST; addColumn tableName=ACT_CMMN_HI_CASE_INST; addColumn tableName=ACT_CMMN_HI_CASE...', '', NULL, '4.9.1', NULL, NULL, '3855502390'); +INSERT INTO `act_cmmn_databasechangelog` VALUES ('11', 'flowable', 'org/flowable/cmmn/db/liquibase/flowable-cmmn-db-changelog.xml', '2024-04-23 14:58:23', 11, 'EXECUTED', '8:d7c4da9276bcfffbfb0ebfb25e3f7b05', 'addColumn tableName=ACT_CMMN_RU_PLAN_ITEM_INST; addColumn tableName=ACT_CMMN_HI_PLAN_ITEM_INST', '', NULL, '4.9.1', NULL, NULL, '3855502390'); +INSERT INTO `act_cmmn_databasechangelog` VALUES ('12', 'flowable', 'org/flowable/cmmn/db/liquibase/flowable-cmmn-db-changelog.xml', '2024-04-23 14:58:23', 12, 'EXECUTED', '8:adf4ecc45f2aa9a44a5626b02e1d6f98', 'addColumn tableName=ACT_CMMN_RU_CASE_INST', '', NULL, '4.9.1', NULL, NULL, '3855502390'); +INSERT INTO `act_cmmn_databasechangelog` VALUES ('13', 'flowable', 'org/flowable/cmmn/db/liquibase/flowable-cmmn-db-changelog.xml', '2024-04-23 14:58:23', 13, 'EXECUTED', '8:7550626f964ab5518464709408333ec1', 'addColumn tableName=ACT_CMMN_RU_PLAN_ITEM_INST; addColumn tableName=ACT_CMMN_HI_PLAN_ITEM_INST', '', NULL, '4.9.1', NULL, NULL, '3855502390'); +INSERT INTO `act_cmmn_databasechangelog` VALUES ('14', 'flowable', 'org/flowable/cmmn/db/liquibase/flowable-cmmn-db-changelog.xml', '2024-04-23 14:58:23', 14, 'EXECUTED', '8:086b40b3a05596dcc8a8d7479922d494', 'addColumn tableName=ACT_CMMN_RU_CASE_INST; addColumn tableName=ACT_CMMN_HI_CASE_INST', '', NULL, '4.9.1', NULL, NULL, '3855502390'); +INSERT INTO `act_cmmn_databasechangelog` VALUES ('16', 'flowable', 'org/flowable/cmmn/db/liquibase/flowable-cmmn-db-changelog.xml', '2024-04-23 14:58:23', 15, 'EXECUTED', '8:a697a222ddd99dd15b36516a252f1c63', 'addColumn tableName=ACT_CMMN_RU_CASE_INST; addColumn tableName=ACT_CMMN_HI_CASE_INST', '', NULL, '4.9.1', NULL, NULL, '3855502390'); +INSERT INTO `act_cmmn_databasechangelog` VALUES ('17', 'flowable', 'org/flowable/cmmn/db/liquibase/flowable-cmmn-db-changelog.xml', '2024-04-23 14:58:23', 16, 'EXECUTED', '8:d3706c5813a9b97fd2a59d12a9523946', 'createIndex indexName=ACT_IDX_HI_CASE_INST_END, tableName=ACT_CMMN_HI_CASE_INST', '', NULL, '4.9.1', NULL, NULL, '3855502390'); + +-- ---------------------------- +-- Table structure for act_cmmn_databasechangeloglock +-- ---------------------------- +DROP TABLE IF EXISTS `act_cmmn_databasechangeloglock`; +CREATE TABLE `act_cmmn_databasechangeloglock` ( + `ID` int NOT NULL, + `LOCKED` bit(1) NOT NULL, + `LOCKGRANTED` datetime NULL DEFAULT NULL, + `LOCKEDBY` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + PRIMARY KEY (`ID`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_cmmn_databasechangeloglock +-- ---------------------------- +INSERT INTO `act_cmmn_databasechangeloglock` VALUES (1, b'0', NULL, NULL); + +-- ---------------------------- +-- Table structure for act_cmmn_deployment +-- ---------------------------- +DROP TABLE IF EXISTS `act_cmmn_deployment`; +CREATE TABLE `act_cmmn_deployment` ( + `ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `NAME_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `CATEGORY_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `KEY_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `DEPLOY_TIME_` datetime(3) NULL DEFAULT NULL, + `PARENT_DEPLOYMENT_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '', + PRIMARY KEY (`ID_`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_cmmn_deployment +-- ---------------------------- + +-- ---------------------------- +-- Table structure for act_cmmn_deployment_resource +-- ---------------------------- +DROP TABLE IF EXISTS `act_cmmn_deployment_resource`; +CREATE TABLE `act_cmmn_deployment_resource` ( + `ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `NAME_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `DEPLOYMENT_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `RESOURCE_BYTES_` longblob NULL, + `GENERATED_` bit(1) NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_IDX_CMMN_RSRC_DPL`(`DEPLOYMENT_ID_` ASC) USING BTREE, + CONSTRAINT `ACT_FK_CMMN_RSRC_DPL` FOREIGN KEY (`DEPLOYMENT_ID_`) REFERENCES `act_cmmn_deployment` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_cmmn_deployment_resource +-- ---------------------------- + +-- ---------------------------- +-- Table structure for act_cmmn_hi_case_inst +-- ---------------------------- +DROP TABLE IF EXISTS `act_cmmn_hi_case_inst`; +CREATE TABLE `act_cmmn_hi_case_inst` ( + `ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `REV_` int NOT NULL, + `BUSINESS_KEY_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `NAME_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `PARENT_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `CASE_DEF_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `STATE_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `START_TIME_` datetime(3) NULL DEFAULT NULL, + `END_TIME_` datetime(3) NULL DEFAULT NULL, + `START_USER_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `CALLBACK_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `CALLBACK_TYPE_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '', + `REFERENCE_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `REFERENCE_TYPE_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `LAST_REACTIVATION_TIME_` datetime(3) NULL DEFAULT NULL, + `LAST_REACTIVATION_USER_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `BUSINESS_STATUS_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_IDX_HI_CASE_INST_END`(`END_TIME_` ASC) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_cmmn_hi_case_inst +-- ---------------------------- + +-- ---------------------------- +-- Table structure for act_cmmn_hi_mil_inst +-- ---------------------------- +DROP TABLE IF EXISTS `act_cmmn_hi_mil_inst`; +CREATE TABLE `act_cmmn_hi_mil_inst` ( + `ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `REV_` int NOT NULL, + `NAME_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `TIME_STAMP_` datetime(3) NULL DEFAULT NULL, + `CASE_INST_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `CASE_DEF_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `ELEMENT_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '', + PRIMARY KEY (`ID_`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_cmmn_hi_mil_inst +-- ---------------------------- + +-- ---------------------------- +-- Table structure for act_cmmn_hi_plan_item_inst +-- ---------------------------- +DROP TABLE IF EXISTS `act_cmmn_hi_plan_item_inst`; +CREATE TABLE `act_cmmn_hi_plan_item_inst` ( + `ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `REV_` int NOT NULL, + `NAME_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `STATE_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `CASE_DEF_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `CASE_INST_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `STAGE_INST_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `IS_STAGE_` bit(1) NULL DEFAULT NULL, + `ELEMENT_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `ITEM_DEFINITION_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `ITEM_DEFINITION_TYPE_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `CREATE_TIME_` datetime(3) NULL DEFAULT NULL, + `LAST_AVAILABLE_TIME_` datetime(3) NULL DEFAULT NULL, + `LAST_ENABLED_TIME_` datetime(3) NULL DEFAULT NULL, + `LAST_DISABLED_TIME_` datetime(3) NULL DEFAULT NULL, + `LAST_STARTED_TIME_` datetime(3) NULL DEFAULT NULL, + `LAST_SUSPENDED_TIME_` datetime(3) NULL DEFAULT NULL, + `COMPLETED_TIME_` datetime(3) NULL DEFAULT NULL, + `OCCURRED_TIME_` datetime(3) NULL DEFAULT NULL, + `TERMINATED_TIME_` datetime(3) NULL DEFAULT NULL, + `EXIT_TIME_` datetime(3) NULL DEFAULT NULL, + `ENDED_TIME_` datetime(3) NULL DEFAULT NULL, + `LAST_UPDATED_TIME_` datetime(3) NULL DEFAULT NULL, + `START_USER_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `REFERENCE_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `REFERENCE_TYPE_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '', + `ENTRY_CRITERION_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `EXIT_CRITERION_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `SHOW_IN_OVERVIEW_` bit(1) NULL DEFAULT NULL, + `EXTRA_VALUE_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `DERIVED_CASE_DEF_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `LAST_UNAVAILABLE_TIME_` datetime(3) NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_cmmn_hi_plan_item_inst +-- ---------------------------- + +-- ---------------------------- +-- Table structure for act_cmmn_ru_case_inst +-- ---------------------------- +DROP TABLE IF EXISTS `act_cmmn_ru_case_inst`; +CREATE TABLE `act_cmmn_ru_case_inst` ( + `ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `REV_` int NOT NULL, + `BUSINESS_KEY_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `NAME_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `PARENT_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `CASE_DEF_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `STATE_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `START_TIME_` datetime(3) NULL DEFAULT NULL, + `START_USER_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `CALLBACK_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `CALLBACK_TYPE_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '', + `LOCK_TIME_` datetime(3) NULL DEFAULT NULL, + `IS_COMPLETEABLE_` bit(1) NULL DEFAULT NULL, + `REFERENCE_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `REFERENCE_TYPE_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `LOCK_OWNER_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `LAST_REACTIVATION_TIME_` datetime(3) NULL DEFAULT NULL, + `LAST_REACTIVATION_USER_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `BUSINESS_STATUS_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_IDX_CASE_INST_CASE_DEF`(`CASE_DEF_ID_` ASC) USING BTREE, + INDEX `ACT_IDX_CASE_INST_PARENT`(`PARENT_ID_` ASC) USING BTREE, + INDEX `ACT_IDX_CASE_INST_REF_ID_`(`REFERENCE_ID_` ASC) USING BTREE, + CONSTRAINT `ACT_FK_CASE_INST_CASE_DEF` FOREIGN KEY (`CASE_DEF_ID_`) REFERENCES `act_cmmn_casedef` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_cmmn_ru_case_inst +-- ---------------------------- + +-- ---------------------------- +-- Table structure for act_cmmn_ru_mil_inst +-- ---------------------------- +DROP TABLE IF EXISTS `act_cmmn_ru_mil_inst`; +CREATE TABLE `act_cmmn_ru_mil_inst` ( + `ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `NAME_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `TIME_STAMP_` datetime(3) NULL DEFAULT NULL, + `CASE_INST_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `CASE_DEF_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `ELEMENT_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '', + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_IDX_MIL_CASE_DEF`(`CASE_DEF_ID_` ASC) USING BTREE, + INDEX `ACT_IDX_MIL_CASE_INST`(`CASE_INST_ID_` ASC) USING BTREE, + CONSTRAINT `ACT_FK_MIL_CASE_DEF` FOREIGN KEY (`CASE_DEF_ID_`) REFERENCES `act_cmmn_casedef` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_MIL_CASE_INST` FOREIGN KEY (`CASE_INST_ID_`) REFERENCES `act_cmmn_ru_case_inst` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_cmmn_ru_mil_inst +-- ---------------------------- + +-- ---------------------------- +-- Table structure for act_cmmn_ru_plan_item_inst +-- ---------------------------- +DROP TABLE IF EXISTS `act_cmmn_ru_plan_item_inst`; +CREATE TABLE `act_cmmn_ru_plan_item_inst` ( + `ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `REV_` int NOT NULL, + `CASE_DEF_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `CASE_INST_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `STAGE_INST_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `IS_STAGE_` bit(1) NULL DEFAULT NULL, + `ELEMENT_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `NAME_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `STATE_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `CREATE_TIME_` datetime(3) NULL DEFAULT NULL, + `START_USER_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `REFERENCE_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `REFERENCE_TYPE_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '', + `ITEM_DEFINITION_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `ITEM_DEFINITION_TYPE_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `IS_COMPLETEABLE_` bit(1) NULL DEFAULT NULL, + `IS_COUNT_ENABLED_` bit(1) NULL DEFAULT NULL, + `VAR_COUNT_` int NULL DEFAULT NULL, + `SENTRY_PART_INST_COUNT_` int NULL DEFAULT NULL, + `LAST_AVAILABLE_TIME_` datetime(3) NULL DEFAULT NULL, + `LAST_ENABLED_TIME_` datetime(3) NULL DEFAULT NULL, + `LAST_DISABLED_TIME_` datetime(3) NULL DEFAULT NULL, + `LAST_STARTED_TIME_` datetime(3) NULL DEFAULT NULL, + `LAST_SUSPENDED_TIME_` datetime(3) NULL DEFAULT NULL, + `COMPLETED_TIME_` datetime(3) NULL DEFAULT NULL, + `OCCURRED_TIME_` datetime(3) NULL DEFAULT NULL, + `TERMINATED_TIME_` datetime(3) NULL DEFAULT NULL, + `EXIT_TIME_` datetime(3) NULL DEFAULT NULL, + `ENDED_TIME_` datetime(3) NULL DEFAULT NULL, + `ENTRY_CRITERION_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `EXIT_CRITERION_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `EXTRA_VALUE_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `DERIVED_CASE_DEF_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `LAST_UNAVAILABLE_TIME_` datetime(3) NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_IDX_PLAN_ITEM_CASE_DEF`(`CASE_DEF_ID_` ASC) USING BTREE, + INDEX `ACT_IDX_PLAN_ITEM_CASE_INST`(`CASE_INST_ID_` ASC) USING BTREE, + INDEX `ACT_IDX_PLAN_ITEM_STAGE_INST`(`STAGE_INST_ID_` ASC) USING BTREE, + CONSTRAINT `ACT_FK_PLAN_ITEM_CASE_DEF` FOREIGN KEY (`CASE_DEF_ID_`) REFERENCES `act_cmmn_casedef` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_PLAN_ITEM_CASE_INST` FOREIGN KEY (`CASE_INST_ID_`) REFERENCES `act_cmmn_ru_case_inst` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_cmmn_ru_plan_item_inst +-- ---------------------------- + +-- ---------------------------- +-- Table structure for act_cmmn_ru_sentry_part_inst +-- ---------------------------- +DROP TABLE IF EXISTS `act_cmmn_ru_sentry_part_inst`; +CREATE TABLE `act_cmmn_ru_sentry_part_inst` ( + `ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `REV_` int NOT NULL, + `CASE_DEF_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `CASE_INST_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `PLAN_ITEM_INST_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `ON_PART_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `IF_PART_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `TIME_STAMP_` datetime(3) NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_IDX_SENTRY_CASE_DEF`(`CASE_DEF_ID_` ASC) USING BTREE, + INDEX `ACT_IDX_SENTRY_CASE_INST`(`CASE_INST_ID_` ASC) USING BTREE, + INDEX `ACT_IDX_SENTRY_PLAN_ITEM`(`PLAN_ITEM_INST_ID_` ASC) USING BTREE, + CONSTRAINT `ACT_FK_SENTRY_CASE_DEF` FOREIGN KEY (`CASE_DEF_ID_`) REFERENCES `act_cmmn_casedef` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_SENTRY_CASE_INST` FOREIGN KEY (`CASE_INST_ID_`) REFERENCES `act_cmmn_ru_case_inst` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_SENTRY_PLAN_ITEM` FOREIGN KEY (`PLAN_ITEM_INST_ID_`) REFERENCES `act_cmmn_ru_plan_item_inst` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_cmmn_ru_sentry_part_inst +-- ---------------------------- + +-- ---------------------------- +-- Table structure for act_co_content_item +-- ---------------------------- +DROP TABLE IF EXISTS `act_co_content_item`; +CREATE TABLE `act_co_content_item` ( + `ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `NAME_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `MIME_TYPE_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `TASK_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `PROC_INST_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `CONTENT_STORE_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `CONTENT_STORE_NAME_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `FIELD_` varchar(400) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `CONTENT_AVAILABLE_` bit(1) NULL DEFAULT b'0', + `CREATED_` timestamp(6) NULL DEFAULT NULL, + `CREATED_BY_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `LAST_MODIFIED_` timestamp(6) NULL DEFAULT NULL, + `LAST_MODIFIED_BY_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `CONTENT_SIZE_` bigint NULL DEFAULT 0, + `TENANT_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `SCOPE_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `SCOPE_TYPE_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `idx_contitem_taskid`(`TASK_ID_` ASC) USING BTREE, + INDEX `idx_contitem_procid`(`PROC_INST_ID_` ASC) USING BTREE, + INDEX `idx_contitem_scope`(`SCOPE_ID_` ASC, `SCOPE_TYPE_` ASC) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_co_content_item +-- ---------------------------- + +-- ---------------------------- +-- Table structure for act_co_databasechangelog +-- ---------------------------- +DROP TABLE IF EXISTS `act_co_databasechangelog`; +CREATE TABLE `act_co_databasechangelog` ( + `ID` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `AUTHOR` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `FILENAME` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `DATEEXECUTED` datetime NOT NULL, + `ORDEREXECUTED` int NOT NULL, + `EXECTYPE` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `MD5SUM` varchar(35) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `DESCRIPTION` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `COMMENTS` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `TAG` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `LIQUIBASE` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `CONTEXTS` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `LABELS` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `DEPLOYMENT_ID` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_co_databasechangelog +-- ---------------------------- +INSERT INTO `act_co_databasechangelog` VALUES ('1', 'activiti', 'org/flowable/content/db/liquibase/flowable-content-db-changelog.xml', '2024-04-23 14:58:22', 1, 'EXECUTED', '8:7644d7165cfe799200a2abdd3419e8b6', 'createTable tableName=ACT_CO_CONTENT_ITEM; createIndex indexName=idx_contitem_taskid, tableName=ACT_CO_CONTENT_ITEM; createIndex indexName=idx_contitem_procid, tableName=ACT_CO_CONTENT_ITEM', '', NULL, '4.9.1', NULL, NULL, '3855502037'); +INSERT INTO `act_co_databasechangelog` VALUES ('2', 'flowable', 'org/flowable/content/db/liquibase/flowable-content-db-changelog.xml', '2024-04-23 14:58:22', 2, 'EXECUTED', '8:fe7b11ac7dbbf9c43006b23bbab60bab', 'addColumn tableName=ACT_CO_CONTENT_ITEM; createIndex indexName=idx_contitem_scope, tableName=ACT_CO_CONTENT_ITEM', '', NULL, '4.9.1', NULL, NULL, '3855502037'); + +-- ---------------------------- +-- Table structure for act_co_databasechangeloglock +-- ---------------------------- +DROP TABLE IF EXISTS `act_co_databasechangeloglock`; +CREATE TABLE `act_co_databasechangeloglock` ( + `ID` int NOT NULL, + `LOCKED` bit(1) NOT NULL, + `LOCKGRANTED` datetime NULL DEFAULT NULL, + `LOCKEDBY` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + PRIMARY KEY (`ID`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_co_databasechangeloglock +-- ---------------------------- +INSERT INTO `act_co_databasechangeloglock` VALUES (1, b'0', NULL, NULL); + +-- ---------------------------- +-- Table structure for act_dmn_databasechangelog +-- ---------------------------- +DROP TABLE IF EXISTS `act_dmn_databasechangelog`; +CREATE TABLE `act_dmn_databasechangelog` ( + `ID` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `AUTHOR` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `FILENAME` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `DATEEXECUTED` datetime NOT NULL, + `ORDEREXECUTED` int NOT NULL, + `EXECTYPE` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `MD5SUM` varchar(35) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `DESCRIPTION` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `COMMENTS` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `TAG` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `LIQUIBASE` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `CONTEXTS` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `LABELS` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `DEPLOYMENT_ID` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_dmn_databasechangelog +-- ---------------------------- +INSERT INTO `act_dmn_databasechangelog` VALUES ('1', 'activiti', 'org/flowable/dmn/db/liquibase/flowable-dmn-db-changelog.xml', '2024-04-23 14:58:21', 1, 'EXECUTED', '8:c8701f1c71018b55029f450b2e9a10a1', 'createTable tableName=ACT_DMN_DEPLOYMENT; createTable tableName=ACT_DMN_DEPLOYMENT_RESOURCE; createTable tableName=ACT_DMN_DECISION_TABLE', '', NULL, '4.9.1', NULL, NULL, '3855501077'); +INSERT INTO `act_dmn_databasechangelog` VALUES ('2', 'flowable', 'org/flowable/dmn/db/liquibase/flowable-dmn-db-changelog.xml', '2024-04-23 14:58:21', 2, 'EXECUTED', '8:47f94b27feb7df8a30d4e338c7bd5fb8', 'createTable tableName=ACT_DMN_HI_DECISION_EXECUTION', '', NULL, '4.9.1', NULL, NULL, '3855501077'); +INSERT INTO `act_dmn_databasechangelog` VALUES ('3', 'flowable', 'org/flowable/dmn/db/liquibase/flowable-dmn-db-changelog.xml', '2024-04-23 14:58:21', 3, 'EXECUTED', '8:ac17eae89fbdccb6e08daf3c7797b579', 'addColumn tableName=ACT_DMN_HI_DECISION_EXECUTION', '', NULL, '4.9.1', NULL, NULL, '3855501077'); +INSERT INTO `act_dmn_databasechangelog` VALUES ('4', 'flowable', 'org/flowable/dmn/db/liquibase/flowable-dmn-db-changelog.xml', '2024-04-23 14:58:21', 4, 'EXECUTED', '8:f73aabc4529e7292c2942073d1cff6f9', 'dropColumn columnName=PARENT_DEPLOYMENT_ID_, tableName=ACT_DMN_DECISION_TABLE', '', NULL, '4.9.1', NULL, NULL, '3855501077'); +INSERT INTO `act_dmn_databasechangelog` VALUES ('5', 'flowable', 'org/flowable/dmn/db/liquibase/flowable-dmn-db-changelog.xml', '2024-04-23 14:58:21', 5, 'EXECUTED', '8:3e03528582dd4eeb4eb41f9b9539140d', 'modifyDataType columnName=DEPLOY_TIME_, tableName=ACT_DMN_DEPLOYMENT; modifyDataType columnName=START_TIME_, tableName=ACT_DMN_HI_DECISION_EXECUTION; modifyDataType columnName=END_TIME_, tableName=ACT_DMN_HI_DECISION_EXECUTION', '', NULL, '4.9.1', NULL, NULL, '3855501077'); +INSERT INTO `act_dmn_databasechangelog` VALUES ('6', 'flowable', 'org/flowable/dmn/db/liquibase/flowable-dmn-db-changelog.xml', '2024-04-23 14:58:21', 6, 'EXECUTED', '8:646c6a061e0b6e8a62e69844ff96abb0', 'createIndex indexName=ACT_IDX_DEC_TBL_UNIQ, tableName=ACT_DMN_DECISION_TABLE', '', NULL, '4.9.1', NULL, NULL, '3855501077'); +INSERT INTO `act_dmn_databasechangelog` VALUES ('7', 'flowable', 'org/flowable/dmn/db/liquibase/flowable-dmn-db-changelog.xml', '2024-04-23 14:58:21', 7, 'EXECUTED', '8:215a499ff7ae77685b55355245b8b708', 'dropIndex indexName=ACT_IDX_DEC_TBL_UNIQ, tableName=ACT_DMN_DECISION_TABLE; renameTable newTableName=ACT_DMN_DECISION, oldTableName=ACT_DMN_DECISION_TABLE; createIndex indexName=ACT_IDX_DMN_DEC_UNIQ, tableName=ACT_DMN_DECISION', '', NULL, '4.9.1', NULL, NULL, '3855501077'); +INSERT INTO `act_dmn_databasechangelog` VALUES ('8', 'flowable', 'org/flowable/dmn/db/liquibase/flowable-dmn-db-changelog.xml', '2024-04-23 14:58:21', 8, 'EXECUTED', '8:5355bee389318afed91a11702f2df032', 'addColumn tableName=ACT_DMN_DECISION', '', NULL, '4.9.1', NULL, NULL, '3855501077'); +INSERT INTO `act_dmn_databasechangelog` VALUES ('9', 'flowable', 'org/flowable/dmn/db/liquibase/flowable-dmn-db-changelog.xml', '2024-04-23 14:58:21', 9, 'EXECUTED', '8:0fe82086431b1953d293f0199f805876', 'createIndex indexName=ACT_IDX_DMN_INSTANCE_ID, tableName=ACT_DMN_HI_DECISION_EXECUTION', '', NULL, '4.9.1', NULL, NULL, '3855501077'); + +-- ---------------------------- +-- Table structure for act_dmn_databasechangeloglock +-- ---------------------------- +DROP TABLE IF EXISTS `act_dmn_databasechangeloglock`; +CREATE TABLE `act_dmn_databasechangeloglock` ( + `ID` int NOT NULL, + `LOCKED` bit(1) NOT NULL, + `LOCKGRANTED` datetime NULL DEFAULT NULL, + `LOCKEDBY` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + PRIMARY KEY (`ID`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_dmn_databasechangeloglock +-- ---------------------------- +INSERT INTO `act_dmn_databasechangeloglock` VALUES (1, b'0', NULL, NULL); + +-- ---------------------------- +-- Table structure for act_dmn_decision +-- ---------------------------- +DROP TABLE IF EXISTS `act_dmn_decision`; +CREATE TABLE `act_dmn_decision` ( + `ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `NAME_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `VERSION_` int NULL DEFAULT NULL, + `KEY_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `CATEGORY_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `DEPLOYMENT_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `RESOURCE_NAME_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `DESCRIPTION_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `DECISION_TYPE_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE, + UNIQUE INDEX `ACT_IDX_DMN_DEC_UNIQ`(`KEY_` ASC, `VERSION_` ASC, `TENANT_ID_` ASC) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_dmn_decision +-- ---------------------------- + +-- ---------------------------- +-- Table structure for act_dmn_deployment +-- ---------------------------- +DROP TABLE IF EXISTS `act_dmn_deployment`; +CREATE TABLE `act_dmn_deployment` ( + `ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `NAME_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `CATEGORY_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `DEPLOY_TIME_` datetime(3) NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `PARENT_DEPLOYMENT_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_dmn_deployment +-- ---------------------------- + +-- ---------------------------- +-- Table structure for act_dmn_deployment_resource +-- ---------------------------- +DROP TABLE IF EXISTS `act_dmn_deployment_resource`; +CREATE TABLE `act_dmn_deployment_resource` ( + `ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `NAME_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `DEPLOYMENT_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `RESOURCE_BYTES_` longblob NULL, + PRIMARY KEY (`ID_`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_dmn_deployment_resource +-- ---------------------------- + +-- ---------------------------- +-- Table structure for act_dmn_hi_decision_execution +-- ---------------------------- +DROP TABLE IF EXISTS `act_dmn_hi_decision_execution`; +CREATE TABLE `act_dmn_hi_decision_execution` ( + `ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `DECISION_DEFINITION_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `DEPLOYMENT_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `START_TIME_` datetime(3) NULL DEFAULT NULL, + `END_TIME_` datetime(3) NULL DEFAULT NULL, + `INSTANCE_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `EXECUTION_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `ACTIVITY_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `FAILED_` bit(1) NULL DEFAULT b'0', + `TENANT_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `EXECUTION_JSON_` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL, + `SCOPE_TYPE_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_IDX_DMN_INSTANCE_ID`(`INSTANCE_ID_` ASC) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_dmn_hi_decision_execution +-- ---------------------------- + +-- ---------------------------- +-- Table structure for act_evt_log +-- ---------------------------- +DROP TABLE IF EXISTS `act_evt_log`; +CREATE TABLE `act_evt_log` ( + `LOG_NR_` bigint NOT NULL AUTO_INCREMENT, + `TYPE_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `PROC_INST_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `EXECUTION_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `TASK_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `TIME_STAMP_` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `USER_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `DATA_` longblob NULL, + `LOCK_OWNER_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `LOCK_TIME_` timestamp(3) NULL DEFAULT NULL, + `IS_PROCESSED_` tinyint NULL DEFAULT 0, + PRIMARY KEY (`LOG_NR_`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_bin ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_evt_log +-- ---------------------------- + +-- ---------------------------- +-- Table structure for act_fo_databasechangelog +-- ---------------------------- +DROP TABLE IF EXISTS `act_fo_databasechangelog`; +CREATE TABLE `act_fo_databasechangelog` ( + `ID` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `AUTHOR` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `FILENAME` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `DATEEXECUTED` datetime NOT NULL, + `ORDEREXECUTED` int NOT NULL, + `EXECTYPE` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `MD5SUM` varchar(35) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `DESCRIPTION` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `COMMENTS` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `TAG` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `LIQUIBASE` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `CONTEXTS` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `LABELS` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `DEPLOYMENT_ID` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_fo_databasechangelog +-- ---------------------------- +INSERT INTO `act_fo_databasechangelog` VALUES ('1', 'activiti', 'org/flowable/form/db/liquibase/flowable-form-db-changelog.xml', '2024-04-23 14:58:21', 1, 'EXECUTED', '8:033ebf9380889aed7c453927ecc3250d', 'createTable tableName=ACT_FO_FORM_DEPLOYMENT; createTable tableName=ACT_FO_FORM_RESOURCE; createTable tableName=ACT_FO_FORM_DEFINITION; createTable tableName=ACT_FO_FORM_INSTANCE', '', NULL, '4.9.1', NULL, NULL, '3855501522'); +INSERT INTO `act_fo_databasechangelog` VALUES ('2', 'flowable', 'org/flowable/form/db/liquibase/flowable-form-db-changelog.xml', '2024-04-23 14:58:21', 2, 'EXECUTED', '8:986365ceb40445ce3b27a8e6b40f159b', 'addColumn tableName=ACT_FO_FORM_INSTANCE', '', NULL, '4.9.1', NULL, NULL, '3855501522'); +INSERT INTO `act_fo_databasechangelog` VALUES ('3', 'flowable', 'org/flowable/form/db/liquibase/flowable-form-db-changelog.xml', '2024-04-23 14:58:21', 3, 'EXECUTED', '8:abf482518ceb09830ef674e52c06bf15', 'dropColumn columnName=PARENT_DEPLOYMENT_ID_, tableName=ACT_FO_FORM_DEFINITION', '', NULL, '4.9.1', NULL, NULL, '3855501522'); +INSERT INTO `act_fo_databasechangelog` VALUES ('4', 'flowable', 'org/flowable/form/db/liquibase/flowable-form-db-changelog.xml', '2024-04-23 14:58:21', 4, 'EXECUTED', '8:2087829f22a4b2298dbf530681c74854', 'modifyDataType columnName=DEPLOY_TIME_, tableName=ACT_FO_FORM_DEPLOYMENT; modifyDataType columnName=SUBMITTED_DATE_, tableName=ACT_FO_FORM_INSTANCE', '', NULL, '4.9.1', NULL, NULL, '3855501522'); +INSERT INTO `act_fo_databasechangelog` VALUES ('5', 'flowable', 'org/flowable/form/db/liquibase/flowable-form-db-changelog.xml', '2024-04-23 14:58:21', 5, 'EXECUTED', '8:b4be732b89e5ca028bdd520c6ad4d446', 'createIndex indexName=ACT_IDX_FORM_DEF_UNIQ, tableName=ACT_FO_FORM_DEFINITION', '', NULL, '4.9.1', NULL, NULL, '3855501522'); +INSERT INTO `act_fo_databasechangelog` VALUES ('6', 'flowable', 'org/flowable/form/db/liquibase/flowable-form-db-changelog.xml', '2024-04-23 14:58:21', 6, 'EXECUTED', '8:384bbd364a649b67c3ca1bcb72fe537f', 'createIndex indexName=ACT_IDX_FORM_TASK, tableName=ACT_FO_FORM_INSTANCE; createIndex indexName=ACT_IDX_FORM_PROC, tableName=ACT_FO_FORM_INSTANCE; createIndex indexName=ACT_IDX_FORM_SCOPE, tableName=ACT_FO_FORM_INSTANCE', '', NULL, '4.9.1', NULL, NULL, '3855501522'); + +-- ---------------------------- +-- Table structure for act_fo_databasechangeloglock +-- ---------------------------- +DROP TABLE IF EXISTS `act_fo_databasechangeloglock`; +CREATE TABLE `act_fo_databasechangeloglock` ( + `ID` int NOT NULL, + `LOCKED` bit(1) NOT NULL, + `LOCKGRANTED` datetime NULL DEFAULT NULL, + `LOCKEDBY` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + PRIMARY KEY (`ID`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_fo_databasechangeloglock +-- ---------------------------- +INSERT INTO `act_fo_databasechangeloglock` VALUES (1, b'0', NULL, NULL); + +-- ---------------------------- +-- Table structure for act_fo_form_definition +-- ---------------------------- +DROP TABLE IF EXISTS `act_fo_form_definition`; +CREATE TABLE `act_fo_form_definition` ( + `ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `NAME_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `VERSION_` int NULL DEFAULT NULL, + `KEY_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `CATEGORY_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `DEPLOYMENT_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `RESOURCE_NAME_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `DESCRIPTION_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE, + UNIQUE INDEX `ACT_IDX_FORM_DEF_UNIQ`(`KEY_` ASC, `VERSION_` ASC, `TENANT_ID_` ASC) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_fo_form_definition +-- ---------------------------- + +-- ---------------------------- +-- Table structure for act_fo_form_deployment +-- ---------------------------- +DROP TABLE IF EXISTS `act_fo_form_deployment`; +CREATE TABLE `act_fo_form_deployment` ( + `ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `NAME_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `CATEGORY_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `DEPLOY_TIME_` datetime(3) NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `PARENT_DEPLOYMENT_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_fo_form_deployment +-- ---------------------------- + +-- ---------------------------- +-- Table structure for act_fo_form_instance +-- ---------------------------- +DROP TABLE IF EXISTS `act_fo_form_instance`; +CREATE TABLE `act_fo_form_instance` ( + `ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `FORM_DEFINITION_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `TASK_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `PROC_INST_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `PROC_DEF_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `SUBMITTED_DATE_` datetime(3) NULL DEFAULT NULL, + `SUBMITTED_BY_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `FORM_VALUES_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `SCOPE_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `SCOPE_TYPE_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `SCOPE_DEFINITION_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_IDX_FORM_TASK`(`TASK_ID_` ASC) USING BTREE, + INDEX `ACT_IDX_FORM_PROC`(`PROC_INST_ID_` ASC) USING BTREE, + INDEX `ACT_IDX_FORM_SCOPE`(`SCOPE_ID_` ASC, `SCOPE_TYPE_` ASC) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_fo_form_instance +-- ---------------------------- + +-- ---------------------------- +-- Table structure for act_fo_form_resource +-- ---------------------------- +DROP TABLE IF EXISTS `act_fo_form_resource`; +CREATE TABLE `act_fo_form_resource` ( + `ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `NAME_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `DEPLOYMENT_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `RESOURCE_BYTES_` longblob NULL, + PRIMARY KEY (`ID_`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_fo_form_resource +-- ---------------------------- + +-- ---------------------------- +-- Table structure for act_ge_bytearray +-- ---------------------------- +DROP TABLE IF EXISTS `act_ge_bytearray`; +CREATE TABLE `act_ge_bytearray` ( + `ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `REV_` int NULL DEFAULT NULL, + `NAME_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `DEPLOYMENT_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `BYTES_` longblob NULL, + `GENERATED_` tinyint NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_FK_BYTEARR_DEPL`(`DEPLOYMENT_ID_` ASC) USING BTREE, + CONSTRAINT `ACT_FK_BYTEARR_DEPL` FOREIGN KEY (`DEPLOYMENT_ID_`) REFERENCES `act_re_deployment` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_bin ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_ge_bytearray +-- ---------------------------- +INSERT INTO `act_ge_bytearray` VALUES ('250002', 1, '员工资产申请.bpmn', '250001', 0x3C3F786D6C2076657273696F6E3D22312E302220656E636F64696E673D225554462D38223F3E0D0A3C646566696E6974696F6E7320786D6C6E733D22687474703A2F2F7777772E6F6D672E6F72672F737065632F42504D4E2F32303130303532342F4D4F44454C2220786D6C6E733A7873693D22687474703A2F2F7777772E77332E6F72672F323030312F584D4C536368656D612D696E7374616E63652220786D6C6E733A7873643D22687474703A2F2F7777772E77332E6F72672F323030312F584D4C536368656D612220786D6C6E733A61637469766974693D22687474703A2F2F61637469766974692E6F72672F62706D6E2220786D6C6E733A62706D6E64693D22687474703A2F2F7777772E6F6D672E6F72672F737065632F42504D4E2F32303130303532342F44492220786D6C6E733A6F6D6764633D22687474703A2F2F7777772E6F6D672E6F72672F737065632F44442F32303130303532342F44432220786D6C6E733A6F6D6764693D22687474703A2F2F7777772E6F6D672E6F72672F737065632F44442F32303130303532342F44492220747970654C616E67756167653D22687474703A2F2F7777772E77332E6F72672F323030312F584D4C536368656D61222065787072657373696F6E4C616E67756167653D22687474703A2F2F7777772E77332E6F72672F313939392F585061746822207461726765744E616D6573706163653D22687474703A2F2F7777772E61637469766974692E6F72672F70726F63657373646566223E0D0A20203C70726F636573732069643D2265616D5F61737365745F656D706C6F7965655F6170706C7922206E616D653D22E59198E5B7A5E8B584E4BAA7E794B3E8AFB72220697345786563757461626C653D2274727565223E0D0A202020203C73746172744576656E742069643D227369642D33386161356139372D323537332D343164652D616639342D38386237356464653866346322206E616D653D22E5BC80E5A78B222F3E0D0A202020203C757365725461736B20786D6C6E733A666C6F7761626C653D22687474703A2F2F666C6F7761626C652E6F72672F62706D6E222069643D2269645F3122206E616D653D22E7AEA1E79086E59198E5AEA1E689B92220666C6F7761626C653A666F726D4B65793D2265616D5F61737365745F656D706C6F7965655F6170706C79223E0D0A2020202020203C657874656E73696F6E456C656D656E74733E0D0A20202020202020203C666C6F7761626C653A7461736B4C697374656E6572206576656E743D226372656174652220636C6173733D22636F6D2E7979792E666C6F7761626C652E6C697374656E65722E466C6F775461736B4C697374656E6572222F3E0D0A2020202020203C2F657874656E73696F6E456C656D656E74733E0D0A202020203C2F757365725461736B3E0D0A202020203C656E644576656E742069643D227369642D33663532643231622D313637392D346436382D383161332D64383261303431643766333422206E616D653D22E7BB93E69D9F222F3E0D0A202020203C73657175656E6365466C6F772069643D227369642D63646461393630302D636530662D343536332D616230312D3536393163363535336166382220736F757263655265663D227369642D33386161356139372D323537332D343164652D616639342D38386237356464653866346322207461726765745265663D2269645F30222F3E0D0A202020203C73657175656E6365466C6F772069643D227369642D38346336393936662D616266622D346635312D393737642D6233653939373431313038342220736F757263655265663D2269645F3122207461726765745265663D227369642D33663532643231622D313637392D346436382D383161332D643832613034316437663334222F3E0D0A202020203C757365725461736B20786D6C6E733A666C6F7761626C653D22687474703A2F2F666C6F7761626C652E6F72672F62706D6E222069643D2269645F3022206E616D653D22E58F91E8B5B7E4BABA2220666C6F7761626C653A666F726D4B65793D2265616D5F61737365745F656D706C6F7965655F6170706C79223E0D0A2020202020203C657874656E73696F6E456C656D656E74733E0D0A20202020202020203C666C6F7761626C653A7461736B4C697374656E6572206576656E743D226372656174652220636C6173733D22636F6D2E7979792E666C6F7761626C652E6C697374656E65722E466C6F775461736B4C697374656E6572222F3E0D0A2020202020203C2F657874656E73696F6E456C656D656E74733E0D0A202020203C2F757365725461736B3E0D0A202020203C73657175656E6365466C6F772069643D227369642D35306434346164612D666338372D346364612D393438392D6138663166653738643566612220736F757263655265663D2269645F3022207461726765745265663D2269645F31222F3E0D0A20203C2F70726F636573733E0D0A20203C62706D6E64693A42504D4E4469616772616D2069643D2242504D4E4469616772616D5F74657374223E0D0A202020203C62706D6E64693A42504D4E506C616E652062706D6E456C656D656E743D2274657374222069643D2242504D4E506C616E655F74657374223E0D0A2020202020203C62706D6E64693A42504D4E53686170652069643D2273686170652D64643531363464352D386330362D343537302D393466622D346565346233333633656538222062706D6E456C656D656E743D227369642D33386161356139372D323537332D343164652D616639342D383862373564646538663463223E0D0A20202020202020203C6F6D6764633A426F756E647320783D223636302E302220793D222D3231352E30222077696474683D2233302E3022206865696768743D2233302E30222F3E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E53686170652069643D2273686170652D39376136303639362D393930392D343536312D626163612D306539346262353933326435222062706D6E456C656D656E743D2269645F31223E0D0A20202020202020203C6F6D6764633A426F756E647320783D223632352E302220793D2231302E343335393336222077696474683D223130302E3022206865696768743D2238302E30222F3E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E53686170652069643D2273686170652D39616566633864642D396566352D343830312D626161302D666339323337373762666334222062706D6E456C656D656E743D227369642D33663532643231622D313637392D346436382D383161332D643832613034316437663334223E0D0A20202020202020203C6F6D6764633A426F756E647320783D223636302E302220793D223135302E30222077696474683D2233302E3022206865696768743D2233302E30222F3E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E456467652069643D22656467652D62666436376533332D383836342D346531392D626262392D363162643562636331363530222062706D6E456C656D656E743D227369642D63646461393630302D636530662D343536332D616230312D353639316336353533616638223E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223637352E302220793D222D3138352E30222F3E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223637342E393939392220793D222D3133352E30222F3E0D0A2020202020203C2F62706D6E64693A42504D4E456467653E0D0A2020202020203C62706D6E64693A42504D4E456467652069643D22656467652D62313564303134392D326137382D346564352D393562642D613863326261396338376265222062706D6E456C656D656E743D227369642D38346336393936662D616266622D346635312D393737642D623365393937343131303834223E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223637352E302220793D2239302E3433353934222F3E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223637352E302220793D223135302E30222F3E0D0A2020202020203C2F62706D6E64693A42504D4E456467653E0D0A2020202020203C62706D6E64693A42504D4E53686170652069643D2273686170652D38356466613065622D306631322D343562322D386138632D373635376565626665366137222062706D6E456C656D656E743D2269645F30223E0D0A20202020202020203C6F6D6764633A426F756E647320783D223632342E39393939342220793D222D3133352E30222077696474683D223130302E3022206865696768743D2238302E30222F3E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E456467652069643D22656467652D33363765346630642D373063362D343133332D623833342D373139663166336666616130222062706D6E456C656D656E743D227369642D35306434346164612D666338372D346364612D393438392D613866316665373864356661223E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223637342E39393939342220793D222D35352E30222F3E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223637352E302220793D2231302E343335393336222F3E0D0A2020202020203C2F62706D6E64693A42504D4E456467653E0D0A202020203C2F62706D6E64693A42504D4E506C616E653E0D0A20203C2F62706D6E64693A42504D4E4469616772616D3E0D0A3C2F646566696E6974696F6E733E0D0A, 0); +INSERT INTO `act_ge_bytearray` VALUES ('250003', 1, '员工资产申请.eam_asset_employee_apply.png', '250001', 0x89504E470D0A1A0A0000000D49484452000002DF00000195080600000026219D530000177E4944415478DAEDDD7F6895F7BDC07161966D3028FDA394D25B7ACB2DBD657F8C4BB1B0315A42617483822BAB4B4E0C2E64CEB8DEB6739D856E6B51EAC6B5FBC15A5A701DA59DCE3B57449CCBB55A93F8B35669ACB3A9CECEAC5A8931364EAC388D56DBE73E9F079F70F2D3A8273FCC79BDE0438ECF3949E4F1FCF1F6CBF73CCFA449000030C29224F95C6B6B6BFDE2C58B372D5CB8F0C4A38F3E7AAEB6B636A9AAAA4A6A6A6A3EFDFEF7BF7FF6A73FFDE9FE679E7966693AFFE98C0100C06544F78A152B962C58B0E0DC9C397392175F7C31D9BE7D7BD2D1D1917477772721BE767575256FBFFD7692C679F2831FFCE0D31FFEF0871FCC9A356BA633080000C3904676DDCF7EF6B3338F3FFE7816D6E7CF9F4F866BD7AE5DC9134F3C71BEBEBE7EEFB469D36E733601006000693B4F5EB56AD5FAD9B367270D0D0D9714DD7DAD5DBB36A9ABAB3B6D151C00000608EF8D1B37BEF5C8238F24FBF6ED4B4AE1830F3E48D2903F3D73E6CCFF76860100E08258F18EF08E3DDCA5143F6FD6AC59270B85428DB30C0040D98B3DDEB1D5A4542BDE03AD80CF9831E3781AE07738DB000094ADB8AAC9D34F3F7D36F6788FA4D5AB579F9E3E7DFA36671C0080B2B572E5CAFF8DAB9A7CFCF1C7C9487BE8A1878ED87E020040598A55EFB88E775C4E7034BCF3CE3B67AD7E03005096E2CE95F121CB2BB9A4E0A5AAABAB3B525555F5EFCE3E000065256E19FFD24B2F25A3E937BFF9CDAE34BEE73AFB00009495850B179E885BC68FA637DF7CF38334BE1B9C7D0000CACAA38F3E7AAEB3B37354E3FBC891235D697CB73BFB00009495DADADAA4BBBB7B54E33B7E5F1ADFDDCE3E000065258DE0642CC4EF75F60100282BDFF9CE773E1DED95EFD3A74F1FB1F20D0040D979E49147CE8EF69EEFC3870FFFDD9E6F0000CACE534F3DD536DA573B79FDF5D75F73B5130000CACE2F7FF9CB9746FB3ADFF3E6CD5BED3ADF0000949D279F7CF23F1E7EF8E14F46F10E97DDD5D5D5EFBBC325000065E9B1C71EFBC7DB6FBF3D5A5B4E96A6E1BDC5590700A02C7DF7BBDF9DF6A31FFDE8DC28AC7E1FAFAEAEDE5928146A9C750000CA567D7D7D6B4343C3889677EC2F8F55EF8A8A8AC9CE380000652BF660D7D5D59DDEB76FDF8884776B6BEBAAF47774160A853B9C6D0000CA5E4D4DCDF4FAFAFA535D5D5D250DEF43870EBD515D5D7DD07613000028327DFAF4BA59B3669D2CD50A78AC7847785756563EE1EC0200401F692857D5D4D49CF8F39FFFFCAF2BF810E6F15FFFFAD7AFC45693746A9D5500001844EC01AFAEAE6EAEAFAF3FB273E7CED397721DEF75EBD62D4BE3BD253E5C698F3700000C3FC21F8C08AFADADED5AB870E19E37DE78E3604747476777777756DAA74F9F3E72F8F0E1BF373535FDDFFCF9F3D74C9F3E7D7F4477AC76BBAA0900005C8634AAFFAD5028CC49A37A793A07D2E94E27B9F0B53D9D86B865BC3B570200C00888F876160000407C030080F8060000C4370000886F000010DF000080F8060000F10D0000886F000010DF000020BE010000F10D0000E21B000010DF000020BE0100407C030000E21B0000C437000020BE0100407C030080F8060000C4370000886F0000407C030080F8060000F10D0000886F000010DF000080F8060000F10D0000E21B000010DF000020BE010000F10D0000E21B0000C437000020BE0100407C030000E21B0000C636B41B22B62F322DCE1400005C797C4F49E7DC50F15D595979BF33050000A509F03543C4F7B68A8A8AC9CE1200009426BEA70C16DF8542E19BCE1000009436C007DAFBDD62D51B00004A1FDFFDF67EDBEB0D000023248DED9556BD01006074E2FBCB457BBDBFEE8C0000C008CAF77E5BF5060080918FEF29EE700900C0B89624C9E4FDFBF72FDFBE7DFB27CDCDCD496363A319E5696A6A4A366FDEFCCF746ABC23010026B008EF2D5BB6245D5D5DC9D9B367CD18CDD1A347934D9B369D4843FC41EF4A0080092A56BC85F7B809F0B38D8D8D7BBD2B010026A8D86A227CC7CFA4F17DCEBB120060828A3DC7A2775CC5B70F8D0200947B7CFFEBA3CE647FCB2BC99EA6A7B389C7714C308B6F00004A18DF278F7724BB5F7F2A7967F5E3BD268EC573A2597C030050A2F86EDFF3977EE19DCFA13D0DA2597C030050AAF8DEBBE19941E33B9E13CDE21B008012C5F7EEC6F983C6773C279AC5370000E25B7C03007075C5775CDD64B0F88EE744B3F80600A044F1DDB6F58541E33B9E13CDE21B008012C5F7B18ED664F7BA79FDB79CA4C7E239D12CBE010028517CC71CD8B1A45F7CC731C12CBE010028657C9F3993B4BDB9A8FF9693F4583C279AC53700002588EFB883E5BEADCF0FBAE73B9E73974BF10D00C095C4F799334967DBFAE4DDB53F1934BCF389D7C46BAD828B6F00002E31BE2FB6DA6D155C7C030050A2F81ECE6AF750ABE0225A7C030030CCF8BEDCF0CE47448B6F00008619DF467C030020BEC5370000E2DB886F0000C4B7F80600407C1BF10D0020BE8DF80600407C8B6F0000C4B711DF0000886FF10D0080F836E21B00407C1BF10D0080F816DF0000886F23BE010010DFE21B0000F16DC4370080F836E21B0000F12DBE010010DF467C030020BEC5370000E2DB886F0000F13D16D3DCDC9C9C38712259B3664D0468D2DDDD9D343434249B366D1AF47BAEB9E69A64E6CC9997FCBBE2E75757578B6F0000CA2FBE23B4238877EEDC99DC76DB6DC95D77DDD52B94EFBBEFBE5EAF8FD7AD5AB52AF9CC673E93FCFCE73FCF5E73E0C081E41BDFF84676FC6B5FFB5A327BF6EC21E3FBDE7BEF15DF0000945F7C3FFBECB35910AF5CB932FB1AF11C113D63C68CECEB92254BB2E3ADADAD3DB19E47746D6D6DAF888FAFB17A7EEDB5D70E19DFD75F7FBDF80600A0FCE2FBBDF7DEEB15C6AFBEFAEAA0AF3D76EC5872CF3DF7F45AF9BEE9A69B92152B5624DFFEF6B7B3E337DE78633275EAD42157D93FFBD9CF8A6F0000CA2FBEF33975EA5416C6B1ED245FF58EED21757575BD5E77F2E4C9ECEB97BEF4A5E4CE3BEFCC1E1F3E7C38FBDEE3C78F67315F1CF4C5B36DDBB6EC75D75D775DCF4AB9F80600A0ECE23B56BC5F7EF9E56CDB48F14AF89C39737ABD2E3E88197BC3972F5F9EDC72CB2DD9C49694786D1EE6F1E1CDA1F67B6FD8B0217B2CBE010028CBF89E74615FF78E1D3BB238BE10A3FD56A86FBDF5D66C7F786C33C957C5F395EFF6F6F6ECCFB16A3ED8969308FCFCF72D5CB8507C0300505EF17DF3CD37F7DAA73D6FDEBC5E31DD37D223C063E53B8FEC58E98EE3B10AFEDBDFFE367BFCDC73CFF5FBBED8CE92FF79D7AE5DD9B1F840A7F80600A02CE27BF7EEDD3D2BDC3111D05FFCE2177BAE72F2D0430FF55AFD8E63F9F7C4C435C2F3ED267D57BA8BBFE781071EE8F79AA54B9766CF555454647BCEC53700001336BEE3039277DF7D77D2D6D6966CDDBA358BEEE2D5EEA3478F260B162CC80279F5EAD5D9969483070FF65ABDFEC52F7E916D4189EB7CDF7EFBED3D511E5746899F75C30D3764DB5406FB3BE437F619EBF321BE0100C4B711DF0000886FF10D0080F836E21B0000F12DBE010010DFE25B7C0300886F23BE010010DFE21B0000F16DC4370000E25B7C030020BEC5B7F8060010DF467C030020BEC5370000E2DB886F0000C4B7F80600407C8B6FF10D0020BE8DF80600407C8B6F0000C4B711DF0000886FF10D0080F816DFDE950000E2DB886F0000C4B7F80600407C1BF10D0080F816DF0000886FF10D0080F836E21B00802BD0DCDC2C7AC7CF74A7F17DCEBB12006082DABC797367575797F01D07D3D1D1F1A734BEF77A5702004C50EBD7AF9FBA71E3C68F3EFCF0C3D30278EC56BC23BC9B9A9A0EA6F3A0772500C0049606DFFD8D8D8D2DB1E521F61C5FAD53555575B5FEDDE3BCEF15DE00005C3522BE9D05000010DF000020BE010000F10D0000E21B0000C437000020BE0100407C030000E21B0000C4370000886F0000407C030080F8060000C4370000886F000010DF000080F8060000F10D0000886F000010DF000020BE010000F10D0000E21B000010DF000020BE0100407C030000E21B0000C437000020BE0100407C030080F8060000C4370000886F0000407C030080F8060000F10D0000886F000010DF000080F8060000F10D0000E21B000010DF000020BE010000F10D0000E21B0000C437000020BE0100407C030000E21B0000C4370000886F0000407C030080F8060000C43700008C616837446C5F645A9C290000B8F2F89E92CEB9A1E2BBB2B2F27E670A00004A13E06B8688EF6D151515939D250000284D7C4F192CBE0B85C2379D210000286D800FB4F7BBC5AA370000943EBEFBEDFDB6D71B000046481ADB2BAD7A0300C0E8C4F7978BF67A7FDD190100801194EFFDB6EA0D0000231FDF53DCE1120080712F4992C9FBF7EF5FBE7DFBF64F9A9B9B93C6C6C6AB7222BEAFD6BF7B535353B279F3E67FA653E31D0900308145786FD9B225E9EAEA4ACE9E3D6BC6688E1E3D9A6CDAB4E9441AE20F7A5702004C50B1E22DBCC74D809F6D6C6CDCEB5D09003041C55613E13B7E268DEF73DE9500001354EC3916BDE32ABE7D701400A0DCE3FB5F1F7526FB5B5E49F6343D9D4D3C8E6382597C030050C2F83E79BC23D9FDFA53C93BAB1FEF35712C9E13CDE21B008012C577FB9EBFF40BEF7C0EED6910CDE21B008052C5F7DE0DCF0C1ADFF19C6816DF00009428BE7737CE1F34BEE339D12CBE010010DFE21B0080AB2BBEE3EA2683C5773C279AC5370000258AEFB6AD2F0C1ADFF19C6816DF00009428BE8F75B426BBD7CDEBBFE5243D16CF8966F10D004089E23BE6C08E25FDE23B8E0966F10D004029E3FBCC99A4EDCD45FDB79CA4C7E239D12CBE010028417CC71D2CF76D7D7ED03DDFF19CBB5C8A6F0000AE24BECF9C493ADBD627EFAEFDC9A0E19D4FBC265E6B155C7C03007089F17DB1D56EABE0E21B008012C5F77056BB875A0517D1E21B008061C6F7E586773E225A7C030030CCF836E21B0000F12DBE010010DF467C030020BEC5370000E2DB886F0000F16DC4370000E25B7C030020BE8DF80600407C8B6F0000C4B711DF0000E2DB886F0000C4B7F80600407C1BF10D0080F816DF0000886F23BE0100C4B711DF0000886FF10D0080F836E21B0000F12DBE010010DF467C030088EF52CC4B2FBD94AC5EBDBAD7B1F457262B57AE2C69ACAE5AB52A9931634636F1387EC7860D1B86FCBE78CDAF7EF5AB8BBE66EEDCB9D9E3575F7D35E9EEEEEE39BE74E952F10D00C0F889EF88D4DB6FBF3D0BE29B6EBA2979EBADB7B263DFFAD6B77A22F9D4A953C9912347927BEFBD373B1651FB95AF7C25A9AAAAEA89EAF8BA64C992E4F39FFFFC80BF63F9F2E5170DFC4D9B36F5FA7937DE786372F7DD77678F6356AC5891DC7AEBADFD7E4EFC07227F1C7F87FC71C4B8F80600605CC47784EAEEDDBB93975F7E39696B6BCB56A2F3602D0ED97C22C2E378BE521E8FE37BE36B047344F9CD37DF3C607C7FF5AB5FEDB7F2BD75EBD67EAF2B0EE6F8F382050B7AFE7CCD35D7243FFEF18FB3C7070E1CE8F939F7DC734FF6778DC7EFBDF75ECFF7B6B6B6665F9F7BEE39F10D00C0D8C677AC2447C0C6EA72447484EDF5D75F9F1DBBE38E3B923FFEF18F59BC1E3A74A85710C7F3F9E388F7F81AAF3D7CF870F6B8BDBDBDE7F5CDCDCDD9B1BABABA5EF11DBF277E47F1DFE7E4C993D9EBF395EEFCFBE2F1030F3C907DEF40615FBCF27DC30D3724EBD6ADCB1EC72A79ACA65BF90600604CE33BB691E4F1FCFBDFFFBEDF9EEC5B6EB925F9DBDFFE96BD2656C54F9C38D113C411BBCF3FFF7CCF76924943AC7CE7CFC5E3F7DF7F3FFB9917DB8E921F2B0EFD356BD624D75E7BED80F11D2BDF3B76ECC81E6FDBB6ADE778FC1D6D3B010060CCE33B26823A0FD5BBEEBAAB27BC63453C8E452CF75D998EE3B1B29C7F5FBEDA1D2BDFF17C847ADF38AEADADEDD9E6521CD083C5776C51E9BBF21DFBBFA74E9DDAF3BAD852121FB48CD7FCEE77BF1B30DCEDF9060060DCC4F760111C570C890F5E0EF6DA7C353A223C8FE458F5BEEFBEFBFA6D0D9954B4F21D8F1F7BECB192C477ACDCC77F0E26F5D906531CDFF99EEFE26D33E21B0080318FEF7CE53B5FFD8E0F37EEDAB5ABDF6BAFBBEEBAE4CE3BEFCCF65217AF9CC7CAF7603F3B56D28F1D3B963D6E6868C8F67B1F3C7870C0C08FED2503857E7C90B278CBCA607BBE23B8F32D28F1A1CC88F1FCF283E21B00807119DF93FA5C8D245F658ECB12C65693B8EC607EE9C1491756B7F3C711DBC53F3F423B8E3FFBECB3D99FE30399353535035EF164B055F6BE135B5CF26D30B1673D7F7D4CC4767C9D376F5EF635BF428AF80600605CC477AC48F73DD6378C23768BB7A60CF533E3F9B87249AC3CC78737F355F2BEBF63CE9C399715DFF9D55A26F5F99065FED81D2E01001897F16DC4370000E25B7C030020BEC5370000E2DB886F0000C4B7F80600407C1BF10D0080F816DF0000886FF10D0080F836E21B0000F12DBE010010DF467C030020BEC5370000E25B7C030020BE8DF80600407C8B6F0000C4B711DF0000886FF10D0080F816DF0000886F23BE010010DFE21B0000F16DC4370000E25B7C030020BEC5370000E2DB886F0000C4B7F80600407C1BF10D00C0A449CDCDCDA277FC4C771ADFE7BC2B010026A8CD9B377776757509DF71301D1D1D7F4AE37BAF772500C004B57EFDFAA91B376EFCE8C30F3F3C2D80C76EC53BC2BBA9A9E9603A0F7A5702004C6069F0DDDFD8D8D8125B1E62CFF1D538555555C9D5FA77BF70DEF70A6F0000AE0A11DFCE020000886F000010DF000080F8060000F10D0000E21B000010DF000020BE010000F10D0000E21B0000C437000020BE0100407C030000E21B0000C4370000886F0000407C030080F8060000C4370000886F000010DF000080F8060000F10D0000886F000010DF000020BE010000F10D0000E21B000010DF000020BE0100407C030000E21B0000C437000020BE0100407C030080F8060000C4370000886F0000407C030080F8060000F10D0000886F000010DF000080F8060000F10D0000E21B000010DF000020BE010000F10D00006319DA0D11DB179916670A0000AE3CBEA7A4736EA8F8AEACACBCDF99020080D204F89A21E27B5B4545C564670900004A13DF53068BEF42A1F04D670800004A1BE003EDFD6EB1EA0D0000A58FEF7E7BBFEDF50600801192C6F64AABDE0000303AF1FDE5A2BDDE5F774600006004E57BBFAD7A03004089555757FF571ADBF30B85C2B2F4EBBBE99CBAB0FADD7DE1CFCBD35910ABE2CE1600005CA2DADADACFA531FD701ADCFF18C6DD2D8B3F80F9D7F4EBEC69D3A67DC1590400808B88BDDCE97C7029D13DC0B4A753E16C0200C00062B53B0DE657D2F03E5F1CD2E9F1E485175E48B66EDD9A74747424A74E9D4A42777777D2D5D595ECDAB52B59B46851525757375084FF217EAEB30B000017C48727D3507EA3389C67CF9E9DAC5DBB36F9F8E38F93E1387FFE7CD2D8D8987D5F9F005F6E1B0A00004CEA59F1EE15DE8B172FEE59E1BE54B122BE6CD9B27E01EEEA28000094BDD86A521CCA0D0D0D4929C42AF8F4E9D37B6D4171B60100285B173E5C79BED4E15D1CE07D56C02B9C750000CA4E6C3729BEAA496C3519097DB6A0B4DBFF0D0040D989EB78177FB8F272F7780F670F789F0F61CE75F60100282BC537D089AB9A8CA43EDB4F0EF8F025000065E3C22DE37BAEE33DDCCB095EAEB80CE1F7BEF7BDE23B61BA153D0000E5210DE0F97908C70D7446C38B2FBE58BCFABDC0BF02000065A150282CCB4378FBF6EDA312DF7127CCE2EB7EFB570000A02CA4F1FB6E1EC29D9D9DA312DF712BFAA2F8DEEB5F0100807289EFEE3C8447EA2A27035DF5A428BEBBFD2B0000502EF1DD13C2A3A9F8F7FA570000A05CE2FBA4956F000018059595957FB5E71B00004681AB9D0000C02849E3F749D7F906008051301677B89C3973E6A7EE70090040594A23B8258FE1B56BD78E687C37363616AF7A1FA8A8A898EC5F000080B251281466E6413C7BF6EC11BBEA495CE5A4BEBEFE93A2F89EEBEC030050566A6B6B3F17ABD079142F5EBC7844E27BD9B265C5ABDEEDD3A64DFB82B30F0040D94963B8229D73791CBFF6DA6B250DEFF5EBD7F7BAB14EFC3E671D0080720EF0578A03B954011EE13D63C68CF3453FFB0FCE360000652D3EFC18615C1CE0B10525F66A5FEE1EEF3E5B4DB2EB7AC73617671B0000019E0678F18D77F20F61C65550E23281C3BD9C60AC76F7F9706516DEF6790300409F00BFB005E55C713CC775C0172D5A94B4B4B464B7A2CFAF8A122BDC71CBF8D6D6D6EC063A69747FDA27BAB3AD2656BC01006010173E8479608090BE9469F7E14A0000188658ADAEACAC7C380DE8B64B8CEE88F6B9B6990000C06548637A4A3A4FC69EF034C8FF9A3EEEBE10DAF1756FECE94E9FFB9FB865BC3B570200000000000000000000000000000000000000000000B9FF07B913B8ED3A1ED4310000000049454E44AE426082, 1); +INSERT INTO `act_ge_bytearray` VALUES ('250006', 1, '员工资产报失.bpmn', '250005', 0x3C3F786D6C2076657273696F6E3D22312E302220656E636F64696E673D225554462D38223F3E0D0A3C646566696E6974696F6E7320786D6C6E733D22687474703A2F2F7777772E6F6D672E6F72672F737065632F42504D4E2F32303130303532342F4D4F44454C2220786D6C6E733A7873693D22687474703A2F2F7777772E77332E6F72672F323030312F584D4C536368656D612D696E7374616E63652220786D6C6E733A7873643D22687474703A2F2F7777772E77332E6F72672F323030312F584D4C536368656D612220786D6C6E733A61637469766974693D22687474703A2F2F61637469766974692E6F72672F62706D6E2220786D6C6E733A62706D6E64693D22687474703A2F2F7777772E6F6D672E6F72672F737065632F42504D4E2F32303130303532342F44492220786D6C6E733A6F6D6764633D22687474703A2F2F7777772E6F6D672E6F72672F737065632F44442F32303130303532342F44432220786D6C6E733A6F6D6764693D22687474703A2F2F7777772E6F6D672E6F72672F737065632F44442F32303130303532342F44492220747970654C616E67756167653D22687474703A2F2F7777772E77332E6F72672F323030312F584D4C536368656D61222065787072657373696F6E4C616E67756167653D22687474703A2F2F7777772E77332E6F72672F313939392F585061746822207461726765744E616D6573706163653D22687474703A2F2F7777772E61637469766974692E6F72672F70726F63657373646566223E0D0A20203C70726F636573732069643D2265616D5F61737365745F656D706C6F7965655F6C6F737322206E616D653D22E59198E5B7A5E8B584E4BAA7E68AA5E5A4B12220697345786563757461626C653D2274727565223E0D0A202020203C73746172744576656E742069643D227369642D33386161356139372D323537332D343164652D616639342D38386237356464653866346322206E616D653D22E5BC80E5A78B222F3E0D0A202020203C757365725461736B20786D6C6E733A666C6F7761626C653D22687474703A2F2F666C6F7761626C652E6F72672F62706D6E222069643D2269645F3122206E616D653D22E7AEA1E79086E59198E5AEA1E689B92220666C6F7761626C653A666F726D4B65793D2265616D5F61737365745F656D706C6F7965655F6C6F7373223E0D0A2020202020203C657874656E73696F6E456C656D656E74733E0D0A20202020202020203C666C6F7761626C653A7461736B4C697374656E6572206576656E743D226372656174652220636C6173733D22636F6D2E7979792E666C6F7761626C652E6C697374656E65722E466C6F775461736B4C697374656E6572222F3E0D0A2020202020203C2F657874656E73696F6E456C656D656E74733E0D0A202020203C2F757365725461736B3E0D0A202020203C656E644576656E742069643D227369642D33663532643231622D313637392D346436382D383161332D64383261303431643766333422206E616D653D22E7BB93E69D9F222F3E0D0A202020203C73657175656E6365466C6F772069643D227369642D63646461393630302D636530662D343536332D616230312D3536393163363535336166382220736F757263655265663D227369642D33386161356139372D323537332D343164652D616639342D38386237356464653866346322207461726765745265663D2269645F30222F3E0D0A202020203C73657175656E6365466C6F772069643D227369642D38346336393936662D616266622D346635312D393737642D6233653939373431313038342220736F757263655265663D2269645F3122207461726765745265663D227369642D33663532643231622D313637392D346436382D383161332D643832613034316437663334222F3E0D0A202020203C757365725461736B20786D6C6E733A666C6F7761626C653D22687474703A2F2F666C6F7761626C652E6F72672F62706D6E222069643D2269645F3022206E616D653D22E58F91E8B5B7E4BABA2220666C6F7761626C653A666F726D4B65793D2265616D5F61737365745F656D706C6F7965655F6C6F7373223E0D0A2020202020203C657874656E73696F6E456C656D656E74733E0D0A20202020202020203C666C6F7761626C653A7461736B4C697374656E6572206576656E743D226372656174652220636C6173733D22636F6D2E7979792E666C6F7761626C652E6C697374656E65722E466C6F775461736B4C697374656E6572222F3E0D0A2020202020203C2F657874656E73696F6E456C656D656E74733E0D0A202020203C2F757365725461736B3E0D0A202020203C73657175656E6365466C6F772069643D227369642D35306434346164612D666338372D346364612D393438392D6138663166653738643566612220736F757263655265663D2269645F3022207461726765745265663D2269645F31222F3E0D0A20203C2F70726F636573733E0D0A20203C62706D6E64693A42504D4E4469616772616D2069643D2242504D4E4469616772616D5F74657374223E0D0A202020203C62706D6E64693A42504D4E506C616E652062706D6E456C656D656E743D2274657374222069643D2242504D4E506C616E655F74657374223E0D0A2020202020203C62706D6E64693A42504D4E53686170652069643D2273686170652D64643531363464352D386330362D343537302D393466622D346565346233333633656538222062706D6E456C656D656E743D227369642D33386161356139372D323537332D343164652D616639342D383862373564646538663463223E0D0A20202020202020203C6F6D6764633A426F756E647320783D223636302E302220793D222D3231352E30222077696474683D2233302E3022206865696768743D2233302E30222F3E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E53686170652069643D2273686170652D39376136303639362D393930392D343536312D626163612D306539346262353933326435222062706D6E456C656D656E743D2269645F31223E0D0A20202020202020203C6F6D6764633A426F756E647320783D223632352E302220793D2231302E343335393336222077696474683D223130302E3022206865696768743D2238302E30222F3E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E53686170652069643D2273686170652D39616566633864642D396566352D343830312D626161302D666339323337373762666334222062706D6E456C656D656E743D227369642D33663532643231622D313637392D346436382D383161332D643832613034316437663334223E0D0A20202020202020203C6F6D6764633A426F756E647320783D223636302E302220793D223135302E30222077696474683D2233302E3022206865696768743D2233302E30222F3E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E456467652069643D22656467652D62666436376533332D383836342D346531392D626262392D363162643562636331363530222062706D6E456C656D656E743D227369642D63646461393630302D636530662D343536332D616230312D353639316336353533616638223E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223637352E302220793D222D3138352E30222F3E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223637342E393939392220793D222D3133352E30222F3E0D0A2020202020203C2F62706D6E64693A42504D4E456467653E0D0A2020202020203C62706D6E64693A42504D4E456467652069643D22656467652D62313564303134392D326137382D346564352D393562642D613863326261396338376265222062706D6E456C656D656E743D227369642D38346336393936662D616266622D346635312D393737642D623365393937343131303834223E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223637352E302220793D2239302E3433353934222F3E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223637352E302220793D223135302E30222F3E0D0A2020202020203C2F62706D6E64693A42504D4E456467653E0D0A2020202020203C62706D6E64693A42504D4E53686170652069643D2273686170652D38356466613065622D306631322D343562322D386138632D373635376565626665366137222062706D6E456C656D656E743D2269645F30223E0D0A20202020202020203C6F6D6764633A426F756E647320783D223632342E39393939342220793D222D3133352E30222077696474683D223130302E3022206865696768743D2238302E30222F3E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E456467652069643D22656467652D33363765346630642D373063362D343133332D623833342D373139663166336666616130222062706D6E456C656D656E743D227369642D35306434346164612D666338372D346364612D393438392D613866316665373864356661223E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223637342E39393939342220793D222D35352E30222F3E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223637352E302220793D2231312E39313739222F3E0D0A2020202020203C2F62706D6E64693A42504D4E456467653E0D0A202020203C2F62706D6E64693A42504D4E506C616E653E0D0A20203C2F62706D6E64693A42504D4E4469616772616D3E0D0A3C2F646566696E6974696F6E733E0D0A, 0); +INSERT INTO `act_ge_bytearray` VALUES ('250007', 1, '员工资产报失.eam_asset_employee_loss.png', '250005', 0x89504E470D0A1A0A0000000D49484452000002DF00000195080600000026219D530000177E4944415478DAEDDD7F6895F7BDC07161966D3028FDA394D25B7ACB2DBD657F8C4BB1B0315A42617483822BAB4B4E0C2E64CEB8DEB6739D856E6B51EAC6B5FBC15A5A701DA59DCE3B57449CCBB55A93F8B35669ACB3A9CECEAC5A8931364EAC388D56DBE73E9F079F70F2D3A8273FCC79BDE0438ECF3949E4F1FCF1F6CBF73CCFA449000030C29224F95C6B6B6BFDE2C58B372D5CB8F0C4A38F3E7AAEB6B636A9AAAA4A6A6A6A3EFDFEF7BF7FF6A73FFDE9FE679E7966693AFFE98C0100C06544F78A152B962C58B0E0DC9C397392175F7C31D9BE7D7BD2D1D1917477772721BE767575256FBFFD7692C679F2831FFCE0D31FFEF0871FCC9A356BA633080000C3904676DDCF7EF6B3338F3FFE7816D6E7CF9F4F866BD7AE5DC9134F3C71BEBEBE7EEFB469D36E733601006000693B4F5EB56AD5FAD9B367270D0D0D9714DD7DAD5DBB36A9ABAB3B6D151C00000608EF8D1B37BEF5C8238F24FBF6ED4B4AE1830F3E48D2903F3D73E6CCFF76860100E08258F18EF08E3DDCA5143F6FD6AC59270B85428DB30C0040D98B3DDEB1D5A4542BDE03AD80CF9831E3781AE07738DB000094ADB8AAC9D34F3F7D36F6788FA4D5AB579F9E3E7DFA36671C0080B2B572E5CAFF8DAB9A7CFCF1C7C9487BE8A1878ED87E020040598A55EFB88E775C4E7034BCF3CE3B67AD7E03005096E2CE95F121CB2BB9A4E0A5AAABAB3B525555F5EFCE3E000065256E19FFD24B2F25A3E937BFF9CDAE34BEE73AFB00009495850B179E885BC68FA637DF7CF38334BE1B9C7D0000CACAA38F3E7AAEB3B37354E3FBC891235D697CB73BFB00009495DADADAA4BBBB7B54E33B7E5F1ADFDDCE3E000065258DE0642CC4EF75F60100282BDFF9CE773E1DED95EFD3A74F1FB1F20D0040D979E49147CE8EF69EEFC3870FFFDD9E6F0000CACE534F3DD536DA573B79FDF5D75F73B5130000CACE2F7FF9CB9746FB3ADFF3E6CD5BED3ADF0000949D279F7CF23F1E7EF8E14F46F10E97DDD5D5D5EFBBC325000065E9B1C71EFBC7DB6FBF3D5A5B4E96A6E1BDC5590700A02C7DF7BBDF9DF6A31FFDE8DC28AC7E1FAFAEAEDE5928146A9C750000CA567D7D7D6B4343C3889677EC2F8F55EF8A8A8AC9CE380000652BF660D7D5D59DDEB76FDF8884776B6BEBAAF47774160A853B9C6D0000CA5E4D4DCDF4FAFAFA535D5D5D250DEF43870EBD515D5D7DD07613000028327DFAF4BA59B3669D2CD50A78AC7847785756563EE1EC0200401F692857D5D4D49CF8F39FFFFCAF2BF810E6F15FFFFAD7AFC45693746A9D5500001844EC01AFAEAE6EAEAFAF3FB273E7CED397721DEF75EBD62D4BE3BD253E5C698F3700000C3FC21F8C08AFADADED5AB870E19E37DE78E3604747476777777756DAA74F9F3E72F8F0E1BF373535FDDFFCF9F3D74C9F3E7D7F4477AC76BBAA0900005C8634AAFFAD5028CC49A37A793A07D2E94E27B9F0B53D9D86B865BC3B570200C00888F876160000407C030080F8060000C4370000886F000010DF000080F8060000F10D0000886F000010DF000020BE010000F10D0000E21B000010DF000020BE0100407C030000E21B0000C437000020BE0100407C030080F8060000C4370000886F0000407C030080F8060000F10D0000886F000010DF000080F8060000F10D0000E21B000010DF000020BE010000F10D0000E21B0000C437000020BE0100407C030000E21B0000C636B41B22B62F322DCE1400005C797C4F49E7DC50F15D595979BF33050000A509F03543C4F7B68A8A8AC9CE1200009426BEA70C16DF8542E19BCE1000009436C007DAFBDD62D51B00004A1FDFFDF67EDBEB0D000023248DED9556BD01006074E2FBCB457BBDBFEE8C0000C008CAF77E5BF5060080918FEF29EE700900C0B89624C9E4FDFBF72FDFBE7DFB27CDCDCD496363A319E5696A6A4A366FDEFCCF746ABC23010026B008EF2D5BB6245D5D5DC9D9B367CD18CDD1A347934D9B369D4843FC41EF4A0080092A56BC85F7B809F0B38D8D8D7BBD2B010026A8D86A227CC7CFA4F17DCEBB120060828A3DC7A2775CC5B70F8D0200947B7CFFEBA3CE647FCB2BC99EA6A7B389C7714C308B6F00004A18DF278F7724BB5F7F2A7967F5E3BD268EC573A2597C030050A2F86EDFF3977EE19DCFA13D0DA2597C030050AAF8DEBBE19941E33B9E13CDE21B008012C5F7EEC6F983C6773C279AC5370000E25B7C03007075C5775CDD64B0F88EE744B3F80600A044F1DDB6F58541E33B9E13CDE21B008012C5F7B18ED664F7BA79FDB79CA4C7E239D12CBE010028517CC71CD8B1A45F7CC731C12CBE010028657C9F3993B4BDB9A8FF9693F4583C279AC53700002588EFB883E5BEADCF0FBAE73B9E73974BF10D00C095C4F799334967DBFAE4DDB53F1934BCF389D7C46BAD828B6F00002E31BE2FB6DA6D155C7C030050A2F81ECE6AF750ABE0225A7C030030CCF8BEDCF0CE47448B6F00008619DF467C030020BEC5370000E2DB886F0000C4B7F80600407C1BF10D0020BE8DF80600407C8B6F0000C4B711DF0000886FF10D0080F836E21B00407C1BF10D0080F816DF0000886F23BE010010DFE21B0000F16DC4370080F836E21B0000F12DBE010010DF467C030020BEC5370000E2DB886F0000F13D16D3DCDC9C9C38712259B3664D0468D2DDDD9D343434249B366D1AF47BAEB9E69A64E6CC9997FCBBE2E75757578B6F0000CA2FBE23B4238877EEDC99DC76DB6DC95D77DDD52B94EFBBEFBE5EAF8FD7AD5AB52AF9CC673E93FCFCE73FCF5E73E0C081E41BDFF84676FC6B5FFB5A327BF6EC21E3FBDE7BEF15DF0000945F7C3FFBECB35910AF5CB932FB1AF11C113D63C68CECEB92254BB2E3ADADAD3DB19E47746D6D6DAF888FAFB17A7EEDB5D70E19DFD75F7FBDF80600A0FCE2FBBDF7DEEB15C6AFBEFAEAA0AF3D76EC5872CF3DF7F45AF9BEE9A69B92152B5624DFFEF6B7B3E337DE78633275EAD42157D93FFBD9CF8A6F0000CA2FBEF33975EA5416C6B1ED245FF58EED21757575BD5E77F2E4C9ECEB97BEF4A5E4CE3BEFCC1E1F3E7C38FBDEE3C78F67315F1CF4C5B36DDBB6EC75D75D775DCF4AB9F80600A0ECE23B56BC5F7EF9E56CDB48F14AF89C39737ABD2E3E88197BC3972F5F9EDC72CB2DD9C49694786D1EE6F1E1CDA1F67B6FD8B0217B2CBE010028CBF89E74615FF78E1D3BB238BE10A3FD56A86FBDF5D66C7F786C33C957C5F395EFF6F6F6ECCFB16A3ED8969308FCFCF72D5CB8507C0300505EF17DF3CD37F7DAA73D6FDEBC5E31DD37D223C063E53B8FEC58E98EE3B10AFEDBDFFE367BFCDC73CFF5FBBED8CE92FF79D7AE5DD9B1F840A7F80600A02CE27BF7EEDD3D2BDC3111D05FFCE2177BAE72F2D0430FF55AFD8E63F9F7C4C435C2F3ED267D57BA8BBFE781071EE8F79AA54B9766CF555454647BCEC53700001336BEE3039277DF7D77D2D6D6966CDDBA358BEEE2D5EEA3478F260B162CC80279F5EAD5D9969483070FF65ABDFEC52F7E916D4189EB7CDF7EFBED3D511E5746899F75C30D3764DB5406FB3BE437F619EBF321BE0100C4B711DF0000886FF10D0080F836E21B0000F12DBE010010DFE25B7C0300886F23BE010010DFE21B0000F16DC4370000E25B7C030020BEC5B7F8060010DF467C030020BEC5370000E2DB886F0000C4B7F80600407C8B6FF10D0020BE8DF80600407C8B6F0000C4B711DF0000886FF10D0080F816DFDE950000E2DB886F0000C4B7F80600407C1BF10D0080F816DF0000886FF10D0080F836E21B00802BD0DCDC2C7AC7CF74A7F17DCEBB12006082DABC797367575797F01D07D3D1D1F1A734BEF77A5702004C50EBD7AF9FBA71E3C68F3EFCF0C3D30278EC56BC23BC9B9A9A0EA6F3A0772500C0049606DFFD8D8D8D2DB1E521F61C5FAD53555575B5FEDDE3BCEF15DE00005C3522BE9D05000010DF000020BE010000F10D0000E21B0000C437000020BE0100407C030000E21B0000C4370000886F0000407C030080F8060000C4370000886F000010DF000080F8060000F10D0000886F000010DF000020BE010000F10D0000E21B000010DF000020BE0100407C030000E21B0000C437000020BE0100407C030080F8060000C4370000886F0000407C030080F8060000F10D0000886F000010DF000080F8060000F10D0000E21B000010DF000020BE010000F10D0000E21B0000C437000020BE0100407C030000E21B0000C4370000886F0000407C030080F8060000C43700008C616837446C5F645A9C290000B8F2F89E92CEB9A1E2BBB2B2F27E670A00004A13E06B8688EF6D151515939D250000284D7C4F192CBE0B85C2379D210000286D800FB4F7BBC5AA370000943EBEFBEDFDB6D71B000046481ADB2BAD7A0300C0E8C4F7978BF67A7FDD190100801194EFFDB6EA0D0000231FDF53DCE1120080712F4992C9FBF7EF5FBE7DFBF64F9A9B9B93C6C6C6AB7222BEAFD6BF7B535353B279F3E67FA653E31D0900308145786FD9B225E9EAEA4ACE9E3D6BC6688E1E3D9A6CDAB4E9441AE20F7A5702004C50B1E22DBCC74D809F6D6C6CDCEB5D09003041C55613E13B7E268DEF73DE9500001354EC3916BDE32ABE7D701400A0DCE3FB5F1F7526FB5B5E49F6343D9D4D3C8E6382597C030050C2F83E79BC23D9FDFA53C93BAB1FEF35712C9E13CDE21B008012C577FB9EBFF40BEF7C0EED6910CDE21B008052C5F7DE0DCF0C1ADFF19C6816DF00009428BE7737CE1F34BEE339D12CBE010010DFE21B0080AB2BBEE3EA2683C5773C279AC5370000258AEFB6AD2F0C1ADFF19C6816DF00009428BE8F75B426BBD7CDEBBFE5243D16CF8966F10D004089E23BE6C08E25FDE23B8E0966F10D004029E3FBCC99A4EDCD45FDB79CA4C7E239D12CBE010028417CC71D2CF76D7D7ED03DDFF19CBB5C8A6F0000AE24BECF9C493ADBD627EFAEFDC9A0E19D4FBC265E6B155C7C03007089F17DB1D56EABE0E21B008012C5F77056BB875A0517D1E21B008061C6F7E586773E225A7C030030CCF836E21B0000F12DBE010010DF467C030020BEC5370000E2DB886F0000F16DC4370000E25B7C030020BE8DF80600407C8B6F0000C4B711DF0000E2DB886F0000C4B7F80600407C1BF10D0080F816DF0000886F23BE0100C4B711DF0000886FF10D0080F836E21B0000F12DBE010010DF467C030088EF52CC4B2FBD94AC5EBDBAD7B1F457262B57AE2C69ACAE5AB52A9931634636F1387EC7860D1B86FCBE78CDAF7EF5AB8BBE66EEDCB9D9E3575F7D35E9EEEEEE39BE74E952F10D00C0F889EF88D4DB6FBF3D0BE29B6EBA2979EBADB7B263DFFAD6B77A22F9D4A953C9912347927BEFBD373B1651FB95AF7C25A9AAAAEA89EAF8BA64C992E4F39FFFFC80BF63F9F2E5170DFC4D9B36F5FA7937DE786372F7DD77678F6356AC5891DC7AEBADFD7E4EFC07227F1C7F87FC71C4B8F80600605CC47784EAEEDDBB93975F7E39696B6BCB56A2F3602D0ED97C22C2E378BE521E8FE37BE36B047344F9CD37DF3C607C7FF5AB5FEDB7F2BD75EBD67EAF2B0EE6F8F382050B7AFE7CCD35D7243FFEF18FB3C7070E1CE8F939F7DC734FF6778DC7EFBDF75ECFF7B6B6B6665F9F7BEE39F10D00C0D8C677AC2447C0C6EA72447484EDF5D75F9F1DBBE38E3B923FFEF18F59BC1E3A74A85710C7F3F9E388F7F81AAF3D7CF870F6B8BDBDBDE7F5CDCDCDD9B1BABABA5EF11DBF277E47F1DFE7E4C993D9EBF395EEFCFBE2F1030F3C907DEF40615FBCF27DC30D3724EBD6ADCB1EC72A79ACA65BF90600604CE33BB691E4F1FCFBDFFFBEDF9EEC5B6EB925F9DBDFFE96BD2656C54F9C38D113C411BBCF3FFF7CCF76924943AC7CE7CFC5E3F7DF7F3FFB9917DB8E921F2B0EFD356BD624D75E7BED80F11D2BDF3B76ECC81E6FDBB6ADE778FC1D6D3B010060CCE33B26823A0FD5BBEEBAAB27BC63453C8E452CF75D998EE3B1B29C7F5FBEDA1D2BDFF17C847ADF38AEADADEDD9E6521CD083C5776C51E9BBF21DFBBFA74E9DDAF3BAD852121FB48CD7FCEE77BF1B30DCEDF9060060DCC4F760111C570C890F5E0EF6DA7C353A223C8FE458F5BEEFBEFBFA6D0D9954B4F21D8F1F7BECB192C477ACDCC77F0E26F5D906531CDFF99EEFE26D33E21B0080318FEF7CE53B5FFD8E0F37EEDAB5ABDF6BAFBBEEBAE4CE3BEFCCF65217AF9CC7CAF7603F3B56D28F1D3B963D6E6868C8F67B1F3C7870C0C08FED2503857E7C90B278CBCA607BBE23B8F32D28F1A1CC88F1FCF283E21B00807119DF93FA5C8D245F658ECB12C65693B8EC607EE9C1491756B7F3C711DBC53F3F423B8E3FFBECB3D99FE30399353535035EF164B055F6BE135B5CF26D30B1673D7F7D4CC4767C9D376F5EF635BF428AF80600605CC477AC48F73DD6378C23768BB7A60CF533E3F9B87249AC3CC78737F355F2BEBF63CE9C399715DFF9D55A26F5F99065FED81D2E01001897F16DC4370000E25B7C030020BEC5370000E2DB886F0000C4B7F80600407C1BF10D0080F816DF0000886FF10D0080F836E21B0000F12DBE010010DF467C030020BEC5370000E25B7C030020BE8DF80600407C8B6F0000C4B711DF0000886FF10D0080F816DF0000886F23BE010010DFE21B0000F16DC4370000E25B7C030020BEC5370000E2DB886F0000C4B7F80600407C1BF10D00C0A449CDCDCDA277FC4C771ADFE7BC2B010026A8CD9B377776757509DF71301D1D1D7F4AE37BAF772500C004B57EFDFAA91B376EFCE8C30F3F3C2D80C76EC53BC2BBA9A9E9603A0F7A5702004C6069F0DDDFD8D8D8125B1E62CFF1D538555555C9D5FA77BF70DEF70A6F0000AE0A11DFCE020000886F000010DF000080F8060000F10D0000E21B000010DF000020BE010000F10D0000E21B0000C437000020BE0100407C030000E21B0000C4370000886F0000407C030080F8060000C4370000886F000010DF000080F8060000F10D0000886F000010DF000020BE010000F10D0000E21B000010DF000020BE0100407C030000E21B0000C437000020BE0100407C030080F8060000C4370000886F0000407C030080F8060000F10D0000886F000010DF000080F8060000F10D0000E21B000010DF000020BE010000F10D00006319DA0D11DB179916670A0000AE3CBEA7A4736EA8F8AEACACBCDF99020080D204F89A21E27B5B4545C564670900004A13DF53068BEF42A1F04D670800004A1BE003EDFD6EB1EA0D0000A58FEF7E7BBFEDF50600801192C6F64AABDE0000303AF1FDE5A2BDDE5F774600006004E57BBFAD7A03004089555757FF571ADBF30B85C2B2F4EBBBE99CBAB0FADD7DE1CFCBD35910ABE2CE1600005CA2DADADACFA531FD701ADCFF18C6DD2D8B3F80F9D7F4EBEC69D3A67DC1590400808B88BDDCE97C7029D13DC0B4A753E16C0200C00062B53B0DE657D2F03E5F1CD2E9F1E485175E48B66EDD9A74747424A74E9D4A42777777D2D5D595ECDAB52B59B46851525757375084FF217EAEB30B000017C48727D3507EA3389C67CF9E9DAC5DBB36F9F8E38F93E1387FFE7CD2D8D8987D5F9F005F6E1B0A00004CEA59F1EE15DE8B172FEE59E1BE54B122BE6CD9B27E01EEEA28000094BDD86A521CCA0D0D0D4929C42AF8F4E9D37B6D4171B60100285B173E5C79BED4E15D1CE07D56C02B9C750000CA4E6C3729BEAA496C3519097DB6A0B4DBFF0D0040D989EB78177FB8F272F7780F670F789F0F61CE75F60100282BC537D089AB9A8CA43EDB4F0EF8F025000065E3C22DE37BAEE33DDCCB095EAEB80CE1F7BEF7BDE23B61BA153D0000E5210DE0F97908C70D7446C38B2FBE58BCFABDC0BF02000065A150282CCB4378FBF6EDA312DF7127CCE2EB7EFB570000A02CA4F1FB6E1EC29D9D9DA312DF712BFAA2F8DEEB5F0100807289EFEE3C8447EA2A27035DF5A428BEBBFD2B0000502EF1DD13C2A3A9F8F7FA570000A05CE2FBA4956F000018059595957FB5E71B00004681AB9D0000C02849E3F749D7F906008051301677B89C3973E6A7EE70090040594A23B8258FE1B56BD78E687C37363616AF7A1FA8A8A898EC5F000080B251281466E6413C7BF6EC11BBEA495CE5A4BEBEFE93A2F89EEBEC030050566A6B6B3F17ABD079142F5EBC7844E27BD9B265C5ABDEEDD3A64DFB82B30F0040D94963B8229D73791CBFF6DA6B250DEFF5EBD7F7BAB14EFC3E671D0080720EF0578A03B954011EE13D63C68CF3453FFB0FCE360000652D3EFC18615C1CE0B10525F66A5FEE1EEF3E5B4DB2EB7AC73617671B0000019E0678F18D77F20F61C65550E23281C3BD9C60AC76F7F9706516DEF6790300409F00BFB005E55C713CC775C0172D5A94B4B4B464B7A2CFAF8A122BDC71CBF8D6D6D6EC063A69747FDA27BAB3AD2656BC01006010173E8479608090BE9469F7E14A0000188658ADAEACAC7C380DE8B64B8CEE88F6B9B6990000C06548637A4A3A4FC69EF034C8FF9A3EEEBE10DAF1756FECE94E9FFB9FB865BC3B570200000000000000000000000000000000000000000000B9FF07B913B8ED3A1ED4310000000049454E44AE426082, 1); +INSERT INTO `act_ge_bytearray` VALUES ('250010', 1, '员工资产报修.bpmn', '250009', 0x3C3F786D6C2076657273696F6E3D22312E302220656E636F64696E673D225554462D38223F3E0D0A3C646566696E6974696F6E7320786D6C6E733D22687474703A2F2F7777772E6F6D672E6F72672F737065632F42504D4E2F32303130303532342F4D4F44454C2220786D6C6E733A7873693D22687474703A2F2F7777772E77332E6F72672F323030312F584D4C536368656D612D696E7374616E63652220786D6C6E733A7873643D22687474703A2F2F7777772E77332E6F72672F323030312F584D4C536368656D612220786D6C6E733A61637469766974693D22687474703A2F2F61637469766974692E6F72672F62706D6E2220786D6C6E733A62706D6E64693D22687474703A2F2F7777772E6F6D672E6F72672F737065632F42504D4E2F32303130303532342F44492220786D6C6E733A6F6D6764633D22687474703A2F2F7777772E6F6D672E6F72672F737065632F44442F32303130303532342F44432220786D6C6E733A6F6D6764693D22687474703A2F2F7777772E6F6D672E6F72672F737065632F44442F32303130303532342F44492220747970654C616E67756167653D22687474703A2F2F7777772E77332E6F72672F323030312F584D4C536368656D61222065787072657373696F6E4C616E67756167653D22687474703A2F2F7777772E77332E6F72672F313939392F585061746822207461726765744E616D6573706163653D22687474703A2F2F7777772E61637469766974692E6F72672F70726F63657373646566223E0D0A20203C70726F636573732069643D2265616D5F61737365745F656D706C6F7965655F72657061697222206E616D653D22E59198E5B7A5E8B584E4BAA7E68AA5E4BFAE2220697345786563757461626C653D2274727565223E0D0A202020203C73746172744576656E742069643D227369642D33386161356139372D323537332D343164652D616639342D38386237356464653866346322206E616D653D22E5BC80E5A78B222F3E0D0A202020203C757365725461736B20786D6C6E733A666C6F7761626C653D22687474703A2F2F666C6F7761626C652E6F72672F62706D6E222069643D2269645F3122206E616D653D22E7AEA1E79086E59198E5AEA1E689B92220666C6F7761626C653A666F726D4B65793D2265616D5F61737365745F656D706C6F7965655F726570616972223E0D0A2020202020203C657874656E73696F6E456C656D656E74733E0D0A20202020202020203C666C6F7761626C653A7461736B4C697374656E6572206576656E743D226372656174652220636C6173733D22636F6D2E7979792E666C6F7761626C652E6C697374656E65722E466C6F775461736B4C697374656E6572222F3E0D0A2020202020203C2F657874656E73696F6E456C656D656E74733E0D0A202020203C2F757365725461736B3E0D0A202020203C656E644576656E742069643D227369642D33663532643231622D313637392D346436382D383161332D64383261303431643766333422206E616D653D22E7BB93E69D9F222F3E0D0A202020203C73657175656E6365466C6F772069643D227369642D63646461393630302D636530662D343536332D616230312D3536393163363535336166382220736F757263655265663D227369642D33386161356139372D323537332D343164652D616639342D38386237356464653866346322207461726765745265663D2269645F30222F3E0D0A202020203C73657175656E6365466C6F772069643D227369642D38346336393936662D616266622D346635312D393737642D6233653939373431313038342220736F757263655265663D2269645F3122207461726765745265663D227369642D33663532643231622D313637392D346436382D383161332D643832613034316437663334222F3E0D0A202020203C757365725461736B20786D6C6E733A666C6F7761626C653D22687474703A2F2F666C6F7761626C652E6F72672F62706D6E222069643D2269645F3022206E616D653D22E58F91E8B5B7E4BABA2220666C6F7761626C653A666F726D4B65793D2265616D5F61737365745F656D706C6F7965655F726570616972223E0D0A2020202020203C657874656E73696F6E456C656D656E74733E0D0A20202020202020203C666C6F7761626C653A7461736B4C697374656E6572206576656E743D226372656174652220636C6173733D22636F6D2E7979792E666C6F7761626C652E6C697374656E65722E466C6F775461736B4C697374656E6572222F3E0D0A2020202020203C2F657874656E73696F6E456C656D656E74733E0D0A202020203C2F757365725461736B3E0D0A202020203C73657175656E6365466C6F772069643D227369642D35306434346164612D666338372D346364612D393438392D6138663166653738643566612220736F757263655265663D2269645F3022207461726765745265663D2269645F31222F3E0D0A20203C2F70726F636573733E0D0A20203C62706D6E64693A42504D4E4469616772616D2069643D2242504D4E4469616772616D5F74657374223E0D0A202020203C62706D6E64693A42504D4E506C616E652062706D6E456C656D656E743D2274657374222069643D2242504D4E506C616E655F74657374223E0D0A2020202020203C62706D6E64693A42504D4E53686170652069643D2273686170652D64643531363464352D386330362D343537302D393466622D346565346233333633656538222062706D6E456C656D656E743D227369642D33386161356139372D323537332D343164652D616639342D383862373564646538663463223E0D0A20202020202020203C6F6D6764633A426F756E647320783D223636302E302220793D222D3231352E30222077696474683D2233302E3022206865696768743D2233302E30222F3E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E53686170652069643D2273686170652D39376136303639362D393930392D343536312D626163612D306539346262353933326435222062706D6E456C656D656E743D2269645F31223E0D0A20202020202020203C6F6D6764633A426F756E647320783D223632352E302220793D2231302E343335393336222077696474683D223130302E3022206865696768743D2238302E30222F3E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E53686170652069643D2273686170652D39616566633864642D396566352D343830312D626161302D666339323337373762666334222062706D6E456C656D656E743D227369642D33663532643231622D313637392D346436382D383161332D643832613034316437663334223E0D0A20202020202020203C6F6D6764633A426F756E647320783D223636302E302220793D223135302E30222077696474683D2233302E3022206865696768743D2233302E30222F3E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E456467652069643D22656467652D62666436376533332D383836342D346531392D626262392D363162643562636331363530222062706D6E456C656D656E743D227369642D63646461393630302D636530662D343536332D616230312D353639316336353533616638223E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223637352E302220793D222D3138352E30222F3E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223637342E393939392220793D222D3133352E30222F3E0D0A2020202020203C2F62706D6E64693A42504D4E456467653E0D0A2020202020203C62706D6E64693A42504D4E456467652069643D22656467652D62313564303134392D326137382D346564352D393562642D613863326261396338376265222062706D6E456C656D656E743D227369642D38346336393936662D616266622D346635312D393737642D623365393937343131303834223E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223637352E302220793D2239302E3433353934222F3E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223637352E302220793D223135302E30222F3E0D0A2020202020203C2F62706D6E64693A42504D4E456467653E0D0A2020202020203C62706D6E64693A42504D4E53686170652069643D2273686170652D38356466613065622D306631322D343562322D386138632D373635376565626665366137222062706D6E456C656D656E743D2269645F30223E0D0A20202020202020203C6F6D6764633A426F756E647320783D223632342E39393939342220793D222D3133352E30222077696474683D223130302E3022206865696768743D2238302E30222F3E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E456467652069643D22656467652D33363765346630642D373063362D343133332D623833342D373139663166336666616130222062706D6E456C656D656E743D227369642D35306434346164612D666338372D346364612D393438392D613866316665373864356661223E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223637342E39393939342220793D222D35352E30222F3E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223637352E302220793D2231302E343335393336222F3E0D0A2020202020203C2F62706D6E64693A42504D4E456467653E0D0A202020203C2F62706D6E64693A42504D4E506C616E653E0D0A20203C2F62706D6E64693A42504D4E4469616772616D3E0D0A3C2F646566696E6974696F6E733E0D0A, 0); +INSERT INTO `act_ge_bytearray` VALUES ('250011', 1, '员工资产报修.eam_asset_employee_repair.png', '250009', 0x89504E470D0A1A0A0000000D49484452000002DF00000195080600000026219D530000177E4944415478DAEDDD7F6895F7BDC07161966D3028FDA394D25B7ACB2DBD657F8C4BB1B0315A42617483822BAB4B4E0C2E64CEB8DEB6739D856E6B51EAC6B5FBC15A5A701DA59DCE3B57449CCBB55A93F8B35669ACB3A9CECEAC5A8931364EAC388D56DBE73E9F079F70F2D3A8273FCC79BDE0438ECF3949E4F1FCF1F6CBF73CCFA449000030C29224F95C6B6B6BFDE2C58B372D5CB8F0C4A38F3E7AAEB6B636A9AAAA4A6A6A6A3EFDFEF7BF7FF6A73FFDE9FE679E7966693AFFE98C0100C06544F78A152B962C58B0E0DC9C397392175F7C31D9BE7D7BD2D1D1917477772721BE767575256FBFFD7692C679F2831FFCE0D31FFEF0871FCC9A356BA633080000C3904676DDCF7EF6B3338F3FFE7816D6E7CF9F4F866BD7AE5DC9134F3C71BEBEBE7EEFB469D36E733601006000693B4F5EB56AD5FAD9B367270D0D0D9714DD7DAD5DBB36A9ABAB3B6D151C00000608EF8D1B37BEF5C8238F24FBF6ED4B4AE1830F3E48D2903F3D73E6CCFF76860100E08258F18EF08E3DDCA5143F6FD6AC59270B85428DB30C0040D98B3DDEB1D5A4542BDE03AD80CF9831E3781AE07738DB000094ADB8AAC9D34F3F7D36F6788FA4D5AB579F9E3E7DFA36671C0080B2B572E5CAFF8DAB9A7CFCF1C7C9487BE8A1878ED87E020040598A55EFB88E775C4E7034BCF3CE3B67AD7E03005096E2CE95F121CB2BB9A4E0A5AAABAB3B525555F5EFCE3E000065256E19FFD24B2F25A3E937BFF9CDAE34BEE73AFB00009495850B179E885BC68FA637DF7CF38334BE1B9C7D0000CACAA38F3E7AAEB3B37354E3FBC891235D697CB73BFB00009495DADADAA4BBBB7B54E33B7E5F1ADFDDCE3E000065258DE0642CC4EF75F60100282BDFF9CE773E1DED95EFD3A74F1FB1F20D0040D979E49147CE8EF69EEFC3870FFFDD9E6F0000CACE534F3DD536DA573B79FDF5D75F73B5130000CACE2F7FF9CB9746FB3ADFF3E6CD5BED3ADF0000949D279F7CF23F1E7EF8E14F46F10E97DDD5D5D5EFBBC325000065E9B1C71EFBC7DB6FBF3D5A5B4E96A6E1BDC5590700A02C7DF7BBDF9DF6A31FFDE8DC28AC7E1FAFAEAEDE5928146A9C750000CA567D7D7D6B4343C3889677EC2F8F55EF8A8A8AC9CE380000652BF660D7D5D59DDEB76FDF8884776B6BEBAAF47774160A853B9C6D0000CA5E4D4DCDF4FAFAFA535D5D5D250DEF43870EBD515D5D7DD07613000028327DFAF4BA59B3669D2CD50A78AC7847785756563EE1EC0200401F692857D5D4D49CF8F39FFFFCAF2BF810E6F15FFFFAD7AFC45693746A9D5500001844EC01AFAEAE6EAEAFAF3FB273E7CED397721DEF75EBD62D4BE3BD253E5C698F3700000C3FC21F8C08AFADADED5AB870E19E37DE78E3604747476777777756DAA74F9F3E72F8F0E1BF373535FDDFFCF9F3D74C9F3E7D7F4477AC76BBAA0900005C8634AAFFAD5028CC49A37A793A07D2E94E27B9F0B53D9D86B865BC3B570200C00888F876160000407C030080F8060000C4370000886F000010DF000080F8060000F10D0000886F000010DF000020BE010000F10D0000E21B000010DF000020BE0100407C030000E21B0000C437000020BE0100407C030080F8060000C4370000886F0000407C030080F8060000F10D0000886F000010DF000080F8060000F10D0000E21B000010DF000020BE010000F10D0000E21B0000C437000020BE0100407C030000E21B0000C636B41B22B62F322DCE1400005C797C4F49E7DC50F15D595979BF33050000A509F03543C4F7B68A8A8AC9CE1200009426BEA70C16DF8542E19BCE1000009436C007DAFBDD62D51B00004A1FDFFDF67EDBEB0D000023248DED9556BD01006074E2FBCB457BBDBFEE8C0000C008CAF77E5BF5060080918FEF29EE700900C0B89624C9E4FDFBF72FDFBE7DFB27CDCDCD496363A319E5696A6A4A366FDEFCCF746ABC23010026B008EF2D5BB6245D5D5DC9D9B367CD18CDD1A347934D9B369D4843FC41EF4A0080092A56BC85F7B809F0B38D8D8D7BBD2B010026A8D86A227CC7CFA4F17DCEBB120060828A3DC7A2775CC5B70F8D0200947B7CFFEBA3CE647FCB2BC99EA6A7B389C7714C308B6F00004A18DF278F7724BB5F7F2A7967F5E3BD268EC573A2597C030050A2F86EDFF3977EE19DCFA13D0DA2597C030050AAF8DEBBE19941E33B9E13CDE21B008012C5F7EEC6F983C6773C279AC5370000E25B7C03007075C5775CDD64B0F88EE744B3F80600A044F1DDB6F58541E33B9E13CDE21B008012C5F7B18ED664F7BA79FDB79CA4C7E239D12CBE010028517CC71CD8B1A45F7CC731C12CBE010028657C9F3993B4BDB9A8FF9693F4583C279AC53700002588EFB883E5BEADCF0FBAE73B9E73974BF10D00C095C4F799334967DBFAE4DDB53F1934BCF389D7C46BAD828B6F00002E31BE2FB6DA6D155C7C030050A2F81ECE6AF750ABE0225A7C030030CCF8BEDCF0CE47448B6F00008619DF467C030020BEC5370000E2DB886F0000C4B7F80600407C1BF10D0020BE8DF80600407C8B6F0000C4B711DF0000886FF10D0080F836E21B00407C1BF10D0080F816DF0000886F23BE010010DFE21B0000F16DC4370080F836E21B0000F12DBE010010DF467C030020BEC5370000E2DB886F0000F13D16D3DCDC9C9C38712259B3664D0468D2DDDD9D343434249B366D1AF47BAEB9E69A64E6CC9997FCBBE2E75757578B6F0000CA2FBE23B4238877EEDC99DC76DB6DC95D77DDD52B94EFBBEFBE5EAF8FD7AD5AB52AF9CC673E93FCFCE73FCF5E73E0C081E41BDFF84676FC6B5FFB5A327BF6EC21E3FBDE7BEF15DF0000945F7C3FFBECB35910AF5CB932FB1AF11C113D63C68CECEB92254BB2E3ADADAD3DB19E47746D6D6DAF888FAFB17A7EEDB5D70E19DFD75F7FBDF80600A0FCE2FBBDF7DEEB15C6AFBEFAEAA0AF3D76EC5872CF3DF7F45AF9BEE9A69B92152B5624DFFEF6B7B3E337DE78633275EAD42157D93FFBD9CF8A6F0000CA2FBEF33975EA5416C6B1ED245FF58EED21757575BD5E77F2E4C9ECEB97BEF4A5E4CE3BEFCC1E1F3E7C38FBDEE3C78F67315F1CF4C5B36DDBB6EC75D75D775DCF4AB9F80600A0ECE23B56BC5F7EF9E56CDB48F14AF89C39737ABD2E3E88197BC3972F5F9EDC72CB2DD9C49694786D1EE6F1E1CDA1F67B6FD8B0217B2CBE010028CBF89E74615FF78E1D3BB238BE10A3FD56A86FBDF5D66C7F786C33C957C5F395EFF6F6F6ECCFB16A3ED8969308FCFCF72D5CB8507C0300505EF17DF3CD37F7DAA73D6FDEBC5E31DD37D223C063E53B8FEC58E98EE3B10AFEDBDFFE367BFCDC73CFF5FBBED8CE92FF79D7AE5DD9B1F840A7F80600A02CE27BF7EEDD3D2BDC3111D05FFCE2177BAE72F2D0430FF55AFD8E63F9F7C4C435C2F3ED267D57BA8BBFE781071EE8F79AA54B9766CF555454647BCEC53700001336BEE3039277DF7D77D2D6D6966CDDBA358BEEE2D5EEA3478F260B162CC80279F5EAD5D9969483070FF65ABDFEC52F7E916D4189EB7CDF7EFBED3D511E5746899F75C30D3764DB5406FB3BE437F619EBF321BE0100C4B711DF0000886FF10D0080F836E21B0000F12DBE010010DFE25B7C0300886F23BE010010DFE21B0000F16DC4370000E25B7C030020BEC5B7F8060010DF467C030020BEC5370000E2DB886F0000C4B7F80600407C8B6FF10D0020BE8DF80600407C8B6F0000C4B711DF0000886FF10D0080F816DFDE950000E2DB886F0000C4B7F80600407C1BF10D0080F816DF0000886FF10D0080F836E21B00802BD0DCDC2C7AC7CF74A7F17DCEBB12006082DABC797367575797F01D07D3D1D1F1A734BEF77A5702004C50EBD7AF9FBA71E3C68F3EFCF0C3D30278EC56BC23BC9B9A9A0EA6F3A0772500C0049606DFFD8D8D8D2DB1E521F61C5FAD53555575B5FEDDE3BCEF15DE00005C3522BE9D05000010DF000020BE010000F10D0000E21B0000C437000020BE0100407C030000E21B0000C4370000886F0000407C030080F8060000C4370000886F000010DF000080F8060000F10D0000886F000010DF000020BE010000F10D0000E21B000010DF000020BE0100407C030000E21B0000C437000020BE0100407C030080F8060000C4370000886F0000407C030080F8060000F10D0000886F000010DF000080F8060000F10D0000E21B000010DF000020BE010000F10D0000E21B0000C437000020BE0100407C030000E21B0000C4370000886F0000407C030080F8060000C43700008C616837446C5F645A9C290000B8F2F89E92CEB9A1E2BBB2B2F27E670A00004A13E06B8688EF6D151515939D250000284D7C4F192CBE0B85C2379D210000286D800FB4F7BBC5AA370000943EBEFBEDFDB6D71B000046481ADB2BAD7A0300C0E8C4F7978BF67A7FDD190100801194EFFDB6EA0D0000231FDF53DCE1120080712F4992C9FBF7EF5FBE7DFBF64F9A9B9B93C6C6C6AB7222BEAFD6BF7B535353B279F3E67FA653E31D0900308145786FD9B225E9EAEA4ACE9E3D6BC6688E1E3D9A6CDAB4E9441AE20F7A5702004C50B1E22DBCC74D809F6D6C6CDCEB5D09003041C55613E13B7E268DEF73DE9500001354EC3916BDE32ABE7D701400A0DCE3FB5F1F7526FB5B5E49F6343D9D4D3C8E6382597C030050C2F83E79BC23D9FDFA53C93BAB1FEF35712C9E13CDE21B008012C577FB9EBFF40BEF7C0EED6910CDE21B008052C5F7DE0DCF0C1ADFF19C6816DF00009428BE7737CE1F34BEE339D12CBE010010DFE21B0080AB2BBEE3EA2683C5773C279AC5370000258AEFB6AD2F0C1ADFF19C6816DF00009428BE8F75B426BBD7CDEBBFE5243D16CF8966F10D004089E23BE6C08E25FDE23B8E0966F10D004029E3FBCC99A4EDCD45FDB79CA4C7E239D12CBE010028417CC71D2CF76D7D7ED03DDFF19CBB5C8A6F0000AE24BECF9C493ADBD627EFAEFDC9A0E19D4FBC265E6B155C7C03007089F17DB1D56EABE0E21B008012C5F77056BB875A0517D1E21B008061C6F7E586773E225A7C030030CCF836E21B0000F12DBE010010DF467C030020BEC5370000E2DB886F0000F16DC4370000E25B7C030020BE8DF80600407C8B6F0000C4B711DF0000E2DB886F0000C4B7F80600407C1BF10D0080F816DF0000886F23BE0100C4B711DF0000886FF10D0080F836E21B0000F12DBE010010DF467C030088EF52CC4B2FBD94AC5EBDBAD7B1F457262B57AE2C69ACAE5AB52A9931634636F1387EC7860D1B86FCBE78CDAF7EF5AB8BBE66EEDCB9D9E3575F7D35E9EEEEEE39BE74E952F10D00C0F889EF88D4DB6FBF3D0BE29B6EBA2979EBADB7B263DFFAD6B77A22F9D4A953C9912347927BEFBD373B1651FB95AF7C25A9AAAAEA89EAF8BA64C992E4F39FFFFC80BF63F9F2E5170DFC4D9B36F5FA7937DE786372F7DD77678F6356AC5891DC7AEBADFD7E4EFC07227F1C7F87FC71C4B8F80600605CC47784EAEEDDBB93975F7E39696B6BCB56A2F3602D0ED97C22C2E378BE521E8FE37BE36B047344F9CD37DF3C607C7FF5AB5FEDB7F2BD75EBD67EAF2B0EE6F8F382050B7AFE7CCD35D7243FFEF18FB3C7070E1CE8F939F7DC734FF6778DC7EFBDF75ECFF7B6B6B6665F9F7BEE39F10D00C0D8C677AC2447C0C6EA72447484EDF5D75F9F1DBBE38E3B923FFEF18F59BC1E3A74A85710C7F3F9E388F7F81AAF3D7CF870F6B8BDBDBDE7F5CDCDCDD9B1BABABA5EF11DBF277E47F1DFE7E4C993D9EBF395EEFCFBE2F1030F3C907DEF40615FBCF27DC30D3724EBD6ADCB1EC72A79ACA65BF90600604CE33BB691E4F1FCFBDFFFBEDF9EEC5B6EB925F9DBDFFE96BD2656C54F9C38D113C411BBCF3FFF7CCF76924943AC7CE7CFC5E3F7DF7F3FFB9917DB8E921F2B0EFD356BD624D75E7BED80F11D2BDF3B76ECC81E6FDBB6ADE778FC1D6D3B010060CCE33B26823A0FD5BBEEBAAB27BC63453C8E452CF75D998EE3B1B29C7F5FBEDA1D2BDFF17C847ADF38AEADADEDD9E6521CD083C5776C51E9BBF21DFBBFA74E9DDAF3BAD852121FB48CD7FCEE77BF1B30DCEDF9060060DCC4F760111C570C890F5E0EF6DA7C353A223C8FE458F5BEEFBEFBFA6D0D9954B4F21D8F1F7BECB192C477ACDCC77F0E26F5D906531CDFF99EEFE26D33E21B0080318FEF7CE53B5FFD8E0F37EEDAB5ABDF6BAFBBEEBAE4CE3BEFCCF65217AF9CC7CAF7603F3B56D28F1D3B963D6E6868C8F67B1F3C7870C0C08FED2503857E7C90B278CBCA607BBE23B8F32D28F1A1CC88F1FCF283E21B00807119DF93FA5C8D245F658ECB12C65693B8EC607EE9C1491756B7F3C711DBC53F3F423B8E3FFBECB3D99FE30399353535035EF164B055F6BE135B5CF26D30B1673D7F7D4CC4767C9D376F5EF635BF428AF80600605CC477AC48F73DD6378C23768BB7A60CF533E3F9B87249AC3CC78737F355F2BEBF63CE9C399715DFF9D55A26F5F99065FED81D2E01001897F16DC4370000E25B7C030020BEC5370000E2DB886F0000C4B7F80600407C1BF10D0080F816DF0000886FF10D0080F836E21B0000F12DBE010010DF467C030020BEC5370000E25B7C030020BE8DF80600407C8B6F0000C4B711DF0000886FF10D0080F816DF0000886F23BE010010DFE21B0000F16DC4370000E25B7C030020BEC5370000E2DB886F0000C4B7F80600407C1BF10D00C0A449CDCDCDA277FC4C771ADFE7BC2B010026A8CD9B377776757509DF71301D1D1D7F4AE37BAF772500C004B57EFDFAA91B376EFCE8C30F3F3C2D80C76EC53BC2BBA9A9E9603A0F7A5702004C6069F0DDDFD8D8D8125B1E62CFF1D538555555C9D5FA77BF70DEF70A6F0000AE0A11DFCE020000886F000010DF000080F8060000F10D0000E21B000010DF000020BE010000F10D0000E21B0000C437000020BE0100407C030000E21B0000C4370000886F0000407C030080F8060000C4370000886F000010DF000080F8060000F10D0000886F000010DF000020BE010000F10D0000E21B000010DF000020BE0100407C030000E21B0000C437000020BE0100407C030080F8060000C4370000886F0000407C030080F8060000F10D0000886F000010DF000080F8060000F10D0000E21B000010DF000020BE010000F10D00006319DA0D11DB179916670A0000AE3CBEA7A4736EA8F8AEACACBCDF99020080D204F89A21E27B5B4545C564670900004A13DF53068BEF42A1F04D670800004A1BE003EDFD6EB1EA0D0000A58FEF7E7BBFEDF50600801192C6F64AABDE0000303AF1FDE5A2BDDE5F774600006004E57BBFAD7A03004089555757FF571ADBF30B85C2B2F4EBBBE99CBAB0FADD7DE1CFCBD35910ABE2CE1600005CA2DADADACFA531FD701ADCFF18C6DD2D8B3F80F9D7F4EBEC69D3A67DC1590400808B88BDDCE97C7029D13DC0B4A753E16C0200C00062B53B0DE657D2F03E5F1CD2E9F1E485175E48B66EDD9A74747424A74E9D4A42777777D2D5D595ECDAB52B59B46851525757375084FF217EAEB30B000017C48727D3507EA3389C67CF9E9DAC5DBB36F9F8E38F93E1387FFE7CD2D8D8987D5F9F005F6E1B0A00004CEA59F1EE15DE8B172FEE59E1BE54B122BE6CD9B27E01EEEA28000094BDD86A521CCA0D0D0D4929C42AF8F4E9D37B6D4171B60100285B173E5C79BED4E15D1CE07D56C02B9C750000CA4E6C3729BEAA496C3519097DB6A0B4DBFF0D0040D989EB78177FB8F272F7780F670F789F0F61CE75F60100282BC537D089AB9A8CA43EDB4F0EF8F025000065E3C22DE37BAEE33DDCCB095EAEB80CE1F7BEF7BDE23B61BA153D0000E5210DE0F97908C70D7446C38B2FBE58BCFABDC0BF02000065A150282CCB4378FBF6EDA312DF7127CCE2EB7EFB570000A02CA4F1FB6E1EC29D9D9DA312DF712BFAA2F8DEEB5F0100807289EFEE3C8447EA2A27035DF5A428BEBBFD2B0000502EF1DD13C2A3A9F8F7FA570000A05CE2FBA4956F000018059595957FB5E71B00004681AB9D0000C02849E3F749D7F906008051301677B89C3973E6A7EE70090040594A23B8258FE1B56BD78E687C37363616AF7A1FA8A8A898EC5F000080B251281466E6413C7BF6EC11BBEA495CE5A4BEBEFE93A2F89EEBEC030050566A6B6B3F17ABD079142F5EBC7844E27BD9B265C5ABDEEDD3A64DFB82B30F0040D94963B8229D73791CBFF6DA6B250DEFF5EBD7F7BAB14EFC3E671D0080720EF0578A03B954011EE13D63C68CF3453FFB0FCE360000652D3EFC18615C1CE0B10525F66A5FEE1EEF3E5B4DB2EB7AC73617671B0000019E0678F18D77F20F61C65550E23281C3BD9C60AC76F7F9706516DEF6790300409F00BFB005E55C713CC775C0172D5A94B4B4B464B7A2CFAF8A122BDC71CBF8D6D6D6EC063A69747FDA27BAB3AD2656BC01006010173E8479608090BE9469F7E14A0000188658ADAEACAC7C380DE8B64B8CEE88F6B9B6990000C06548637A4A3A4FC69EF034C8FF9A3EEEBE10DAF1756FECE94E9FFB9FB865BC3B570200000000000000000000000000000000000000000000B9FF07B913B8ED3A1ED4310000000049454E44AE426082, 1); +INSERT INTO `act_ge_bytearray` VALUES ('250014', 1, '资产设备报废.bpmn', '250013', 0x3C3F786D6C2076657273696F6E3D22312E302220656E636F64696E673D225554462D38223F3E0D0A3C646566696E6974696F6E7320786D6C6E733D22687474703A2F2F7777772E6F6D672E6F72672F737065632F42504D4E2F32303130303532342F4D4F44454C2220786D6C6E733A7873693D22687474703A2F2F7777772E77332E6F72672F323030312F584D4C536368656D612D696E7374616E63652220786D6C6E733A7873643D22687474703A2F2F7777772E77332E6F72672F323030312F584D4C536368656D612220786D6C6E733A61637469766974693D22687474703A2F2F61637469766974692E6F72672F62706D6E2220786D6C6E733A62706D6E64693D22687474703A2F2F7777772E6F6D672E6F72672F737065632F42504D4E2F32303130303532342F44492220786D6C6E733A6F6D6764633D22687474703A2F2F7777772E6F6D672E6F72672F737065632F44442F32303130303532342F44432220786D6C6E733A6F6D6764693D22687474703A2F2F7777772E6F6D672E6F72672F737065632F44442F32303130303532342F44492220747970654C616E67756167653D22687474703A2F2F7777772E77332E6F72672F323030312F584D4C536368656D61222065787072657373696F6E4C616E67756167653D22687474703A2F2F7777772E77332E6F72672F313939392F585061746822207461726765744E616D6573706163653D22687474703A2F2F7777772E61637469766974692E6F72672F70726F63657373646566223E0D0A20203C70726F636573732069643D2265616D5F61737365745F736372617022206E616D653D22E8B584E4BAA7E8AEBEE5A487E68AA5E5BA9F2220697345786563757461626C653D2274727565223E0D0A202020203C73746172744576656E742069643D227369642D33386161356139372D323537332D343164652D616639342D38386237356464653866346322206E616D653D22E5BC80E5A78B222F3E0D0A202020203C757365725461736B20786D6C6E733A666C6F7761626C653D22687474703A2F2F666C6F7761626C652E6F72672F62706D6E222069643D2269645F3122206E616D653D22E7AEA1E79086E59198E5AEA1E689B92220666C6F7761626C653A666F726D4B65793D2265616D5F61737365745F7363726170223E0D0A2020202020203C657874656E73696F6E456C656D656E74733E0D0A20202020202020203C666C6F7761626C653A7461736B4C697374656E6572206576656E743D226372656174652220636C6173733D22636F6D2E7979792E666C6F7761626C652E6C697374656E65722E466C6F775461736B4C697374656E6572222F3E0D0A2020202020203C2F657874656E73696F6E456C656D656E74733E0D0A202020203C2F757365725461736B3E0D0A202020203C656E644576656E742069643D227369642D33663532643231622D313637392D346436382D383161332D64383261303431643766333422206E616D653D22E7BB93E69D9F222F3E0D0A202020203C73657175656E6365466C6F772069643D227369642D63646461393630302D636530662D343536332D616230312D3536393163363535336166382220736F757263655265663D227369642D33386161356139372D323537332D343164652D616639342D38386237356464653866346322207461726765745265663D2269645F30222F3E0D0A202020203C73657175656E6365466C6F772069643D227369642D38346336393936662D616266622D346635312D393737642D6233653939373431313038342220736F757263655265663D2269645F3122207461726765745265663D227369642D33663532643231622D313637392D346436382D383161332D643832613034316437663334222F3E0D0A202020203C757365725461736B20786D6C6E733A666C6F7761626C653D22687474703A2F2F666C6F7761626C652E6F72672F62706D6E222069643D2269645F3022206E616D653D22E58F91E8B5B7E4BABA2220666C6F7761626C653A666F726D4B65793D2265616D5F61737365745F7363726170223E0D0A2020202020203C657874656E73696F6E456C656D656E74733E0D0A20202020202020203C666C6F7761626C653A7461736B4C697374656E6572206576656E743D226372656174652220636C6173733D22636F6D2E7979792E666C6F7761626C652E6C697374656E65722E466C6F775461736B4C697374656E6572222F3E0D0A2020202020203C2F657874656E73696F6E456C656D656E74733E0D0A202020203C2F757365725461736B3E0D0A202020203C73657175656E6365466C6F772069643D227369642D35306434346164612D666338372D346364612D393438392D6138663166653738643566612220736F757263655265663D2269645F3022207461726765745265663D2269645F31222F3E0D0A20203C2F70726F636573733E0D0A20203C62706D6E64693A42504D4E4469616772616D2069643D2242504D4E4469616772616D5F74657374223E0D0A202020203C62706D6E64693A42504D4E506C616E652062706D6E456C656D656E743D2274657374222069643D2242504D4E506C616E655F74657374223E0D0A2020202020203C62706D6E64693A42504D4E53686170652069643D2273686170652D64643531363464352D386330362D343537302D393466622D346565346233333633656538222062706D6E456C656D656E743D227369642D33386161356139372D323537332D343164652D616639342D383862373564646538663463223E0D0A20202020202020203C6F6D6764633A426F756E647320783D223636302E302220793D222D3231352E30222077696474683D2233302E3022206865696768743D2233302E30222F3E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E53686170652069643D2273686170652D39376136303639362D393930392D343536312D626163612D306539346262353933326435222062706D6E456C656D656E743D2269645F31223E0D0A20202020202020203C6F6D6764633A426F756E647320783D223632352E302220793D2231302E343335393336222077696474683D223130302E3022206865696768743D2238302E30222F3E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E53686170652069643D2273686170652D39616566633864642D396566352D343830312D626161302D666339323337373762666334222062706D6E456C656D656E743D227369642D33663532643231622D313637392D346436382D383161332D643832613034316437663334223E0D0A20202020202020203C6F6D6764633A426F756E647320783D223636302E302220793D223135302E30222077696474683D2233302E3022206865696768743D2233302E30222F3E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E456467652069643D22656467652D62666436376533332D383836342D346531392D626262392D363162643562636331363530222062706D6E456C656D656E743D227369642D63646461393630302D636530662D343536332D616230312D353639316336353533616638223E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223637352E302220793D222D3138352E30222F3E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223637342E393939392220793D222D3133352E30222F3E0D0A2020202020203C2F62706D6E64693A42504D4E456467653E0D0A2020202020203C62706D6E64693A42504D4E456467652069643D22656467652D62313564303134392D326137382D346564352D393562642D613863326261396338376265222062706D6E456C656D656E743D227369642D38346336393936662D616266622D346635312D393737642D623365393937343131303834223E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223637352E302220793D2239302E3433353934222F3E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223637352E302220793D223135302E30222F3E0D0A2020202020203C2F62706D6E64693A42504D4E456467653E0D0A2020202020203C62706D6E64693A42504D4E53686170652069643D2273686170652D38356466613065622D306631322D343562322D386138632D373635376565626665366137222062706D6E456C656D656E743D2269645F30223E0D0A20202020202020203C6F6D6764633A426F756E647320783D223632342E39393939342220793D222D3133352E30222077696474683D223130302E3022206865696768743D2238302E30222F3E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E456467652069643D22656467652D33363765346630642D373063362D343133332D623833342D373139663166336666616130222062706D6E456C656D656E743D227369642D35306434346164612D666338372D346364612D393438392D613866316665373864356661223E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223637342E39393939342220793D222D35352E30222F3E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223637352E302220793D2231302E343335393336222F3E0D0A2020202020203C2F62706D6E64693A42504D4E456467653E0D0A202020203C2F62706D6E64693A42504D4E506C616E653E0D0A20203C2F62706D6E64693A42504D4E4469616772616D3E0D0A3C2F646566696E6974696F6E733E0D0A, 0); +INSERT INTO `act_ge_bytearray` VALUES ('250015', 1, '资产设备报废.eam_asset_scrap.png', '250013', 0x89504E470D0A1A0A0000000D49484452000002DF00000195080600000026219D530000177E4944415478DAEDDD7F6895F7BDC07161966D3028FDA394D25B7ACB2DBD657F8C4BB1B0315A42617483822BAB4B4E0C2E64CEB8DEB6739D856E6B51EAC6B5FBC15A5A701DA59DCE3B57449CCBB55A93F8B35669ACB3A9CECEAC5A8931364EAC388D56DBE73E9F079F70F2D3A8273FCC79BDE0438ECF3949E4F1FCF1F6CBF73CCFA449000030C29224F95C6B6B6BFDE2C58B372D5CB8F0C4A38F3E7AAEB6B636A9AAAA4A6A6A6A3EFDFEF7BF7FF6A73FFDE9FE679E7966693AFFE98C0100C06544F78A152B962C58B0E0DC9C397392175F7C31D9BE7D7BD2D1D1917477772721BE767575256FBFFD7692C679F2831FFCE0D31FFEF0871FCC9A356BA633080000C3904676DDCF7EF6B3338F3FFE7816D6E7CF9F4F866BD7AE5DC9134F3C71BEBEBE7EEFB469D36E733601006000693B4F5EB56AD5FAD9B367270D0D0D9714DD7DAD5DBB36A9ABAB3B6D151C00000608EF8D1B37BEF5C8238F24FBF6ED4B4AE1830F3E48D2903F3D73E6CCFF76860100E08258F18EF08E3DDCA5143F6FD6AC59270B85428DB30C0040D98B3DDEB1D5A4542BDE03AD80CF9831E3781AE07738DB000094ADB8AAC9D34F3F7D36F6788FA4D5AB579F9E3E7DFA36671C0080B2B572E5CAFF8DAB9A7CFCF1C7C9487BE8A1878ED87E020040598A55EFB88E775C4E7034BCF3CE3B67AD7E03005096E2CE95F121CB2BB9A4E0A5AAABAB3B525555F5EFCE3E000065256E19FFD24B2F25A3E937BFF9CDAE34BEE73AFB00009495850B179E885BC68FA637DF7CF38334BE1B9C7D0000CACAA38F3E7AAEB3B37354E3FBC891235D697CB73BFB00009495DADADAA4BBBB7B54E33B7E5F1ADFDDCE3E000065258DE0642CC4EF75F60100282BDFF9CE773E1DED95EFD3A74F1FB1F20D0040D979E49147CE8EF69EEFC3870FFFDD9E6F0000CACE534F3DD536DA573B79FDF5D75F73B5130000CACE2F7FF9CB9746FB3ADFF3E6CD5BED3ADF0000949D279F7CF23F1E7EF8E14F46F10E97DDD5D5D5EFBBC325000065E9B1C71EFBC7DB6FBF3D5A5B4E96A6E1BDC5590700A02C7DF7BBDF9DF6A31FFDE8DC28AC7E1FAFAEAEDE5928146A9C750000CA567D7D7D6B4343C3889677EC2F8F55EF8A8A8AC9CE380000652BF660D7D5D59DDEB76FDF8884776B6BEBAAF47774160A853B9C6D0000CA5E4D4DCDF4FAFAFA535D5D5D250DEF43870EBD515D5D7DD07613000028327DFAF4BA59B3669D2CD50A78AC7847785756563EE1EC0200401F692857D5D4D49CF8F39FFFFCAF2BF810E6F15FFFFAD7AFC45693746A9D5500001844EC01AFAEAE6EAEAFAF3FB273E7CED397721DEF75EBD62D4BE3BD253E5C698F3700000C3FC21F8C08AFADADED5AB870E19E37DE78E3604747476777777756DAA74F9F3E72F8F0E1BF373535FDDFFCF9F3D74C9F3E7D7F4477AC76BBAA0900005C8634AAFFAD5028CC49A37A793A07D2E94E27B9F0B53D9D86B865BC3B570200C00888F876160000407C030080F8060000C4370000886F000010DF000080F8060000F10D0000886F000010DF000020BE010000F10D0000E21B000010DF000020BE0100407C030000E21B0000C437000020BE0100407C030080F8060000C4370000886F0000407C030080F8060000F10D0000886F000010DF000080F8060000F10D0000E21B000010DF000020BE010000F10D0000E21B0000C437000020BE0100407C030000E21B0000C636B41B22B62F322DCE1400005C797C4F49E7DC50F15D595979BF33050000A509F03543C4F7B68A8A8AC9CE1200009426BEA70C16DF8542E19BCE1000009436C007DAFBDD62D51B00004A1FDFFDF67EDBEB0D000023248DED9556BD01006074E2FBCB457BBDBFEE8C0000C008CAF77E5BF5060080918FEF29EE700900C0B89624C9E4FDFBF72FDFBE7DFB27CDCDCD496363A319E5696A6A4A366FDEFCCF746ABC23010026B008EF2D5BB6245D5D5DC9D9B367CD18CDD1A347934D9B369D4843FC41EF4A0080092A56BC85F7B809F0B38D8D8D7BBD2B010026A8D86A227CC7CFA4F17DCEBB120060828A3DC7A2775CC5B70F8D0200947B7CFFEBA3CE647FCB2BC99EA6A7B389C7714C308B6F00004A18DF278F7724BB5F7F2A7967F5E3BD268EC573A2597C030050A2F86EDFF3977EE19DCFA13D0DA2597C030050AAF8DEBBE19941E33B9E13CDE21B008012C5F7EEC6F983C6773C279AC5370000E25B7C03007075C5775CDD64B0F88EE744B3F80600A044F1DDB6F58541E33B9E13CDE21B008012C5F7B18ED664F7BA79FDB79CA4C7E239D12CBE010028517CC71CD8B1A45F7CC731C12CBE010028657C9F3993B4BDB9A8FF9693F4583C279AC53700002588EFB883E5BEADCF0FBAE73B9E73974BF10D00C095C4F799334967DBFAE4DDB53F1934BCF389D7C46BAD828B6F00002E31BE2FB6DA6D155C7C030050A2F81ECE6AF750ABE0225A7C030030CCF8BEDCF0CE47448B6F00008619DF467C030020BEC5370000E2DB886F0000C4B7F80600407C1BF10D0020BE8DF80600407C8B6F0000C4B711DF0000886FF10D0080F836E21B00407C1BF10D0080F816DF0000886F23BE010010DFE21B0000F16DC4370080F836E21B0000F12DBE010010DF467C030020BEC5370000E2DB886F0000F13D16D3DCDC9C9C38712259B3664D0468D2DDDD9D343434249B366D1AF47BAEB9E69A64E6CC9997FCBBE2E75757578B6F0000CA2FBE23B4238877EEDC99DC76DB6DC95D77DDD52B94EFBBEFBE5EAF8FD7AD5AB52AF9CC673E93FCFCE73FCF5E73E0C081E41BDFF84676FC6B5FFB5A327BF6EC21E3FBDE7BEF15DF0000945F7C3FFBECB35910AF5CB932FB1AF11C113D63C68CECEB92254BB2E3ADADAD3DB19E47746D6D6DAF888FAFB17A7EEDB5D70E19DFD75F7FBDF80600A0FCE2FBBDF7DEEB15C6AFBEFAEAA0AF3D76EC5872CF3DF7F45AF9BEE9A69B92152B5624DFFEF6B7B3E337DE78633275EAD42157D93FFBD9CF8A6F0000CA2FBEF33975EA5416C6B1ED245FF58EED21757575BD5E77F2E4C9ECEB97BEF4A5E4CE3BEFCC1E1F3E7C38FBDEE3C78F67315F1CF4C5B36DDBB6EC75D75D775DCF4AB9F80600A0ECE23B56BC5F7EF9E56CDB48F14AF89C39737ABD2E3E88197BC3972F5F9EDC72CB2DD9C49694786D1EE6F1E1CDA1F67B6FD8B0217B2CBE010028CBF89E74615FF78E1D3BB238BE10A3FD56A86FBDF5D66C7F786C33C957C5F395EFF6F6F6ECCFB16A3ED8969308FCFCF72D5CB8507C0300505EF17DF3CD37F7DAA73D6FDEBC5E31DD37D223C063E53B8FEC58E98EE3B10AFEDBDFFE367BFCDC73CFF5FBBED8CE92FF79D7AE5DD9B1F840A7F80600A02CE27BF7EEDD3D2BDC3111D05FFCE2177BAE72F2D0430FF55AFD8E63F9F7C4C435C2F3ED267D57BA8BBFE781071EE8F79AA54B9766CF555454647BCEC53700001336BEE3039277DF7D77D2D6D6966CDDBA358BEEE2D5EEA3478F260B162CC80279F5EAD5D9969483070FF65ABDFEC52F7E916D4189EB7CDF7EFBED3D511E5746899F75C30D3764DB5406FB3BE437F619EBF321BE0100C4B711DF0000886FF10D0080F836E21B0000F12DBE010010DFE25B7C0300886F23BE010010DFE21B0000F16DC4370000E25B7C030020BEC5B7F8060010DF467C030020BEC5370000E2DB886F0000C4B7F80600407C8B6FF10D0020BE8DF80600407C8B6F0000C4B711DF0000886FF10D0080F816DFDE950000E2DB886F0000C4B7F80600407C1BF10D0080F816DF0000886FF10D0080F836E21B00802BD0DCDC2C7AC7CF74A7F17DCEBB12006082DABC797367575797F01D07D3D1D1F1A734BEF77A5702004C50EBD7AF9FBA71E3C68F3EFCF0C3D30278EC56BC23BC9B9A9A0EA6F3A0772500C0049606DFFD8D8D8D2DB1E521F61C5FAD53555575B5FEDDE3BCEF15DE00005C3522BE9D05000010DF000020BE010000F10D0000E21B0000C437000020BE0100407C030000E21B0000C4370000886F0000407C030080F8060000C4370000886F000010DF000080F8060000F10D0000886F000010DF000020BE010000F10D0000E21B000010DF000020BE0100407C030000E21B0000C437000020BE0100407C030080F8060000C4370000886F0000407C030080F8060000F10D0000886F000010DF000080F8060000F10D0000E21B000010DF000020BE010000F10D0000E21B0000C437000020BE0100407C030000E21B0000C4370000886F0000407C030080F8060000C43700008C616837446C5F645A9C290000B8F2F89E92CEB9A1E2BBB2B2F27E670A00004A13E06B8688EF6D151515939D250000284D7C4F192CBE0B85C2379D210000286D800FB4F7BBC5AA370000943EBEFBEDFDB6D71B000046481ADB2BAD7A0300C0E8C4F7978BF67A7FDD190100801194EFFDB6EA0D0000231FDF53DCE1120080712F4992C9FBF7EF5FBE7DFBF64F9A9B9B93C6C6C6AB7222BEAFD6BF7B535353B279F3E67FA653E31D0900308145786FD9B225E9EAEA4ACE9E3D6BC6688E1E3D9A6CDAB4E9441AE20F7A5702004C50B1E22DBCC74D809F6D6C6CDCEB5D09003041C55613E13B7E268DEF73DE9500001354EC3916BDE32ABE7D701400A0DCE3FB5F1F7526FB5B5E49F6343D9D4D3C8E6382597C030050C2F83E79BC23D9FDFA53C93BAB1FEF35712C9E13CDE21B008012C577FB9EBFF40BEF7C0EED6910CDE21B008052C5F7DE0DCF0C1ADFF19C6816DF00009428BE7737CE1F34BEE339D12CBE010010DFE21B0080AB2BBEE3EA2683C5773C279AC5370000258AEFB6AD2F0C1ADFF19C6816DF00009428BE8F75B426BBD7CDEBBFE5243D16CF8966F10D004089E23BE6C08E25FDE23B8E0966F10D004029E3FBCC99A4EDCD45FDB79CA4C7E239D12CBE010028417CC71D2CF76D7D7ED03DDFF19CBB5C8A6F0000AE24BECF9C493ADBD627EFAEFDC9A0E19D4FBC265E6B155C7C03007089F17DB1D56EABE0E21B008012C5F77056BB875A0517D1E21B008061C6F7E586773E225A7C030030CCF836E21B0000F12DBE010010DF467C030020BEC5370000E2DB886F0000F16DC4370000E25B7C030020BE8DF80600407C8B6F0000C4B711DF0000E2DB886F0000C4B7F80600407C1BF10D0080F816DF0000886F23BE0100C4B711DF0000886FF10D0080F836E21B0000F12DBE010010DF467C030088EF52CC4B2FBD94AC5EBDBAD7B1F457262B57AE2C69ACAE5AB52A9931634636F1387EC7860D1B86FCBE78CDAF7EF5AB8BBE66EEDCB9D9E3575F7D35E9EEEEEE39BE74E952F10D00C0F889EF88D4DB6FBF3D0BE29B6EBA2979EBADB7B263DFFAD6B77A22F9D4A953C9912347927BEFBD373B1651FB95AF7C25A9AAAAEA89EAF8BA64C992E4F39FFFFC80BF63F9F2E5170DFC4D9B36F5FA7937DE786372F7DD77678F6356AC5891DC7AEBADFD7E4EFC07227F1C7F87FC71C4B8F80600605CC47784EAEEDDBB93975F7E39696B6BCB56A2F3602D0ED97C22C2E378BE521E8FE37BE36B047344F9CD37DF3C607C7FF5AB5FEDB7F2BD75EBD67EAF2B0EE6F8F382050B7AFE7CCD35D7243FFEF18FB3C7070E1CE8F939F7DC734FF6778DC7EFBDF75ECFF7B6B6B6665F9F7BEE39F10D00C0D8C677AC2447C0C6EA72447484EDF5D75F9F1DBBE38E3B923FFEF18F59BC1E3A74A85710C7F3F9E388F7F81AAF3D7CF870F6B8BDBDBDE7F5CDCDCDD9B1BABABA5EF11DBF277E47F1DFE7E4C993D9EBF395EEFCFBE2F1030F3C907DEF40615FBCF27DC30D3724EBD6ADCB1EC72A79ACA65BF90600604CE33BB691E4F1FCFBDFFFBEDF9EEC5B6EB925F9DBDFFE96BD2656C54F9C38D113C411BBCF3FFF7CCF76924943AC7CE7CFC5E3F7DF7F3FFB9917DB8E921F2B0EFD356BD624D75E7BED80F11D2BDF3B76ECC81E6FDBB6ADE778FC1D6D3B010060CCE33B26823A0FD5BBEEBAAB27BC63453C8E452CF75D998EE3B1B29C7F5FBEDA1D2BDFF17C847ADF38AEADADEDD9E6521CD083C5776C51E9BBF21DFBBFA74E9DDAF3BAD852121FB48CD7FCEE77BF1B30DCEDF9060060DCC4F760111C570C890F5E0EF6DA7C353A223C8FE458F5BEEFBEFBFA6D0D9954B4F21D8F1F7BECB192C477ACDCC77F0E26F5D906531CDFF99EEFE26D33E21B0080318FEF7CE53B5FFD8E0F37EEDAB5ABDF6BAFBBEEBAE4CE3BEFCCF65217AF9CC7CAF7603F3B56D28F1D3B963D6E6868C8F67B1F3C7870C0C08FED2503857E7C90B278CBCA607BBE23B8F32D28F1A1CC88F1FCF283E21B00807119DF93FA5C8D245F658ECB12C65693B8EC607EE9C1491756B7F3C711DBC53F3F423B8E3FFBECB3D99FE30399353535035EF164B055F6BE135B5CF26D30B1673D7F7D4CC4767C9D376F5EF635BF428AF80600605CC477AC48F73DD6378C23768BB7A60CF533E3F9B87249AC3CC78737F355F2BEBF63CE9C399715DFF9D55A26F5F99065FED81D2E01001897F16DC4370000E25B7C030020BEC5370000E2DB886F0000C4B7F80600407C1BF10D0080F816DF0000886FF10D0080F836E21B0000F12DBE010010DF467C030020BEC5370000E25B7C030020BE8DF80600407C8B6F0000C4B711DF0000886FF10D0080F816DF0000886F23BE010010DFE21B0000F16DC4370000E25B7C030020BEC5370000E2DB886F0000C4B7F80600407C1BF10D00C0A449CDCDCDA277FC4C771ADFE7BC2B010026A8CD9B377776757509DF71301D1D1D7F4AE37BAF772500C004B57EFDFAA91B376EFCE8C30F3F3C2D80C76EC53BC2BBA9A9E9603A0F7A5702004C6069F0DDDFD8D8D8125B1E62CFF1D538555555C9D5FA77BF70DEF70A6F0000AE0A11DFCE020000886F000010DF000080F8060000F10D0000E21B000010DF000020BE010000F10D0000E21B0000C437000020BE0100407C030000E21B0000C4370000886F0000407C030080F8060000C4370000886F000010DF000080F8060000F10D0000886F000010DF000020BE010000F10D0000E21B000010DF000020BE0100407C030000E21B0000C437000020BE0100407C030080F8060000C4370000886F0000407C030080F8060000F10D0000886F000010DF000080F8060000F10D0000E21B000010DF000020BE010000F10D00006319DA0D11DB179916670A0000AE3CBEA7A4736EA8F8AEACACBCDF99020080D204F89A21E27B5B4545C564670900004A13DF53068BEF42A1F04D670800004A1BE003EDFD6EB1EA0D0000A58FEF7E7BBFEDF50600801192C6F64AABDE0000303AF1FDE5A2BDDE5F774600006004E57BBFAD7A03004089555757FF571ADBF30B85C2B2F4EBBBE99CBAB0FADD7DE1CFCBD35910ABE2CE1600005CA2DADADACFA531FD701ADCFF18C6DD2D8B3F80F9D7F4EBEC69D3A67DC1590400808B88BDDCE97C7029D13DC0B4A753E16C0200C00062B53B0DE657D2F03E5F1CD2E9F1E485175E48B66EDD9A74747424A74E9D4A42777777D2D5D595ECDAB52B59B46851525757375084FF217EAEB30B000017C48727D3507EA3389C67CF9E9DAC5DBB36F9F8E38F93E1387FFE7CD2D8D8987D5F9F005F6E1B0A00004CEA59F1EE15DE8B172FEE59E1BE54B122BE6CD9B27E01EEEA28000094BDD86A521CCA0D0D0D4929C42AF8F4E9D37B6D4171B60100285B173E5C79BED4E15D1CE07D56C02B9C750000CA4E6C3729BEAA496C3519097DB6A0B4DBFF0D0040D989EB78177FB8F272F7780F670F789F0F61CE75F60100282BC537D089AB9A8CA43EDB4F0EF8F025000065E3C22DE37BAEE33DDCCB095EAEB80CE1F7BEF7BDE23B61BA153D0000E5210DE0F97908C70D7446C38B2FBE58BCFABDC0BF02000065A150282CCB4378FBF6EDA312DF7127CCE2EB7EFB570000A02CA4F1FB6E1EC29D9D9DA312DF712BFAA2F8DEEB5F0100807289EFEE3C8447EA2A27035DF5A428BEBBFD2B0000502EF1DD13C2A3A9F8F7FA570000A05CE2FBA4956F000018059595957FB5E71B00004681AB9D0000C02849E3F749D7F906008051301677B89C3973E6A7EE70090040594A23B8258FE1B56BD78E687C37363616AF7A1FA8A8A898EC5F000080B251281466E6413C7BF6EC11BBEA495CE5A4BEBEFE93A2F89EEBEC030050566A6B6B3F17ABD079142F5EBC7844E27BD9B265C5ABDEEDD3A64DFB82B30F0040D94963B8229D73791CBFF6DA6B250DEFF5EBD7F7BAB14EFC3E671D0080720EF0578A03B954011EE13D63C68CF3453FFB0FCE360000652D3EFC18615C1CE0B10525F66A5FEE1EEF3E5B4DB2EB7AC73617671B0000019E0678F18D77F20F61C65550E23281C3BD9C60AC76F7F9706516DEF6790300409F00BFB005E55C713CC775C0172D5A94B4B4B464B7A2CFAF8A122BDC71CBF8D6D6D6EC063A69747FDA27BAB3AD2656BC01006010173E8479608090BE9469F7E14A0000188658ADAEACAC7C380DE8B64B8CEE88F6B9B6990000C06548637A4A3A4FC69EF034C8FF9A3EEEBE10DAF1756FECE94E9FFB9FB865BC3B570200000000000000000000000000000000000000000000B9FF07B913B8ED3A1ED4310000000049454E44AE426082, 1); +INSERT INTO `act_ge_bytearray` VALUES ('250018', 1, '资产采购申请.bpmn', '250017', 0x3C3F786D6C2076657273696F6E3D22312E302220656E636F64696E673D225554462D38223F3E0D0A3C646566696E6974696F6E7320786D6C6E733D22687474703A2F2F7777772E6F6D672E6F72672F737065632F42504D4E2F32303130303532342F4D4F44454C2220786D6C6E733A7873693D22687474703A2F2F7777772E77332E6F72672F323030312F584D4C536368656D612D696E7374616E63652220786D6C6E733A7873643D22687474703A2F2F7777772E77332E6F72672F323030312F584D4C536368656D612220786D6C6E733A61637469766974693D22687474703A2F2F61637469766974692E6F72672F62706D6E2220786D6C6E733A62706D6E64693D22687474703A2F2F7777772E6F6D672E6F72672F737065632F42504D4E2F32303130303532342F44492220786D6C6E733A6F6D6764633D22687474703A2F2F7777772E6F6D672E6F72672F737065632F44442F32303130303532342F44432220786D6C6E733A6F6D6764693D22687474703A2F2F7777772E6F6D672E6F72672F737065632F44442F32303130303532342F44492220747970654C616E67756167653D22687474703A2F2F7777772E77332E6F72672F323030312F584D4C536368656D61222065787072657373696F6E4C616E67756167653D22687474703A2F2F7777772E77332E6F72672F313939392F585061746822207461726765744E616D6573706163653D22687474703A2F2F7777772E61637469766974692E6F72672F70726F63657373646566223E0D0A20203C70726F636573732069643D2265616D5F61737365745F70757263686173655F6170706C7922206E616D653D22E8B584E4BAA7E98787E8B4ADE794B3E8AFB72220697345786563757461626C653D2274727565223E0D0A202020203C73746172744576656E742069643D227369642D33386161356139372D323537332D343164652D616639342D38386237356464653866346322206E616D653D22E5BC80E5A78B222F3E0D0A202020203C757365725461736B20786D6C6E733A666C6F7761626C653D22687474703A2F2F666C6F7761626C652E6F72672F62706D6E222069643D2269645F3122206E616D653D22E7AEA1E79086E59198E5AEA1E689B92220666C6F7761626C653A666F726D4B65793D2265616D5F61737365745F70757263686173655F6170706C79223E0D0A2020202020203C657874656E73696F6E456C656D656E74733E0D0A20202020202020203C666C6F7761626C653A7461736B4C697374656E6572206576656E743D226372656174652220636C6173733D22636F6D2E7979792E666C6F7761626C652E6C697374656E65722E466C6F775461736B4C697374656E6572222F3E0D0A2020202020203C2F657874656E73696F6E456C656D656E74733E0D0A202020203C2F757365725461736B3E0D0A202020203C656E644576656E742069643D227369642D33663532643231622D313637392D346436382D383161332D64383261303431643766333422206E616D653D22E7BB93E69D9F222F3E0D0A202020203C73657175656E6365466C6F772069643D227369642D63646461393630302D636530662D343536332D616230312D3536393163363535336166382220736F757263655265663D227369642D33386161356139372D323537332D343164652D616639342D38386237356464653866346322207461726765745265663D2269645F30222F3E0D0A202020203C73657175656E6365466C6F772069643D227369642D38346336393936662D616266622D346635312D393737642D6233653939373431313038342220736F757263655265663D2269645F3122207461726765745265663D227369642D33663532643231622D313637392D346436382D383161332D643832613034316437663334222F3E0D0A202020203C757365725461736B20786D6C6E733A666C6F7761626C653D22687474703A2F2F666C6F7761626C652E6F72672F62706D6E222069643D2269645F3022206E616D653D22E58F91E8B5B7E4BABA2220666C6F7761626C653A666F726D4B65793D2265616D5F61737365745F70757263686173655F6170706C79223E0D0A2020202020203C657874656E73696F6E456C656D656E74733E0D0A20202020202020203C666C6F7761626C653A7461736B4C697374656E6572206576656E743D226372656174652220636C6173733D22636F6D2E7979792E666C6F7761626C652E6C697374656E65722E466C6F775461736B4C697374656E6572222F3E0D0A2020202020203C2F657874656E73696F6E456C656D656E74733E0D0A202020203C2F757365725461736B3E0D0A202020203C73657175656E6365466C6F772069643D227369642D35306434346164612D666338372D346364612D393438392D6138663166653738643566612220736F757263655265663D2269645F3022207461726765745265663D2269645F31222F3E0D0A20203C2F70726F636573733E0D0A20203C62706D6E64693A42504D4E4469616772616D2069643D2242504D4E4469616772616D5F74657374223E0D0A202020203C62706D6E64693A42504D4E506C616E652062706D6E456C656D656E743D2274657374222069643D2242504D4E506C616E655F74657374223E0D0A2020202020203C62706D6E64693A42504D4E53686170652069643D2273686170652D64643531363464352D386330362D343537302D393466622D346565346233333633656538222062706D6E456C656D656E743D227369642D33386161356139372D323537332D343164652D616639342D383862373564646538663463223E0D0A20202020202020203C6F6D6764633A426F756E647320783D223636302E302220793D222D3231352E30222077696474683D2233302E3022206865696768743D2233302E30222F3E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E53686170652069643D2273686170652D39376136303639362D393930392D343536312D626163612D306539346262353933326435222062706D6E456C656D656E743D2269645F31223E0D0A20202020202020203C6F6D6764633A426F756E647320783D223632352E302220793D2231302E343335393336222077696474683D223130302E3022206865696768743D2238302E30222F3E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E53686170652069643D2273686170652D39616566633864642D396566352D343830312D626161302D666339323337373762666334222062706D6E456C656D656E743D227369642D33663532643231622D313637392D346436382D383161332D643832613034316437663334223E0D0A20202020202020203C6F6D6764633A426F756E647320783D223636302E302220793D223135302E30222077696474683D2233302E3022206865696768743D2233302E30222F3E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E456467652069643D22656467652D62666436376533332D383836342D346531392D626262392D363162643562636331363530222062706D6E456C656D656E743D227369642D63646461393630302D636530662D343536332D616230312D353639316336353533616638223E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223637352E302220793D222D3138352E30222F3E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223637342E393939392220793D222D3133352E30222F3E0D0A2020202020203C2F62706D6E64693A42504D4E456467653E0D0A2020202020203C62706D6E64693A42504D4E456467652069643D22656467652D62313564303134392D326137382D346564352D393562642D613863326261396338376265222062706D6E456C656D656E743D227369642D38346336393936662D616266622D346635312D393737642D623365393937343131303834223E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223637352E302220793D2239302E3433353934222F3E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223637352E302220793D223135302E30222F3E0D0A2020202020203C2F62706D6E64693A42504D4E456467653E0D0A2020202020203C62706D6E64693A42504D4E53686170652069643D2273686170652D38356466613065622D306631322D343562322D386138632D373635376565626665366137222062706D6E456C656D656E743D2269645F30223E0D0A20202020202020203C6F6D6764633A426F756E647320783D223632342E39393939342220793D222D3133352E30222077696474683D223130302E3022206865696768743D2238302E30222F3E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E456467652069643D22656467652D33363765346630642D373063362D343133332D623833342D373139663166336666616130222062706D6E456C656D656E743D227369642D35306434346164612D666338372D346364612D393438392D613866316665373864356661223E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223637342E39393939342220793D222D35352E30222F3E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223637352E302220793D2231302E343335393336222F3E0D0A2020202020203C2F62706D6E64693A42504D4E456467653E0D0A202020203C2F62706D6E64693A42504D4E506C616E653E0D0A20203C2F62706D6E64693A42504D4E4469616772616D3E0D0A3C2F646566696E6974696F6E733E0D0A, 0); +INSERT INTO `act_ge_bytearray` VALUES ('250019', 1, '资产采购申请.eam_asset_purchase_apply.png', '250017', 0x89504E470D0A1A0A0000000D49484452000002DF00000195080600000026219D530000177E4944415478DAEDDD7F6895F7BDC07161966D3028FDA394D25B7ACB2DBD657F8C4BB1B0315A42617483822BAB4B4E0C2E64CEB8DEB6739D856E6B51EAC6B5FBC15A5A701DA59DCE3B57449CCBB55A93F8B35669ACB3A9CECEAC5A8931364EAC388D56DBE73E9F079F70F2D3A8273FCC79BDE0438ECF3949E4F1FCF1F6CBF73CCFA449000030C29224F95C6B6B6BFDE2C58B372D5CB8F0C4A38F3E7AAEB6B636A9AAAA4A6A6A6A3EFDFEF7BF7FF6A73FFDE9FE679E7966693AFFE98C0100C06544F78A152B962C58B0E0DC9C397392175F7C31D9BE7D7BD2D1D1917477772721BE767575256FBFFD7692C679F2831FFCE0D31FFEF0871FCC9A356BA633080000C3904676DDCF7EF6B3338F3FFE7816D6E7CF9F4F866BD7AE5DC9134F3C71BEBEBE7EEFB469D36E733601006000693B4F5EB56AD5FAD9B367270D0D0D9714DD7DAD5DBB36A9ABAB3B6D151C00000608EF8D1B37BEF5C8238F24FBF6ED4B4AE1830F3E48D2903F3D73E6CCFF76860100E08258F18EF08E3DDCA5143F6FD6AC59270B85428DB30C0040D98B3DDEB1D5A4542BDE03AD80CF9831E3781AE07738DB000094ADB8AAC9D34F3F7D36F6788FA4D5AB579F9E3E7DFA36671C0080B2B572E5CAFF8DAB9A7CFCF1C7C9487BE8A1878ED87E020040598A55EFB88E775C4E7034BCF3CE3B67AD7E03005096E2CE95F121CB2BB9A4E0A5AAABAB3B525555F5EFCE3E000065256E19FFD24B2F25A3E937BFF9CDAE34BEE73AFB00009495850B179E885BC68FA637DF7CF38334BE1B9C7D0000CACAA38F3E7AAEB3B37354E3FBC891235D697CB73BFB00009495DADADAA4BBBB7B54E33B7E5F1ADFDDCE3E000065258DE0642CC4EF75F60100282BDFF9CE773E1DED95EFD3A74F1FB1F20D0040D979E49147CE8EF69EEFC3870FFFDD9E6F0000CACE534F3DD536DA573B79FDF5D75F73B5130000CACE2F7FF9CB9746FB3ADFF3E6CD5BED3ADF0000949D279F7CF23F1E7EF8E14F46F10E97DDD5D5D5EFBBC325000065E9B1C71EFBC7DB6FBF3D5A5B4E96A6E1BDC5590700A02C7DF7BBDF9DF6A31FFDE8DC28AC7E1FAFAEAEDE5928146A9C750000CA567D7D7D6B4343C3889677EC2F8F55EF8A8A8AC9CE380000652BF660D7D5D59DDEB76FDF8884776B6BEBAAF47774160A853B9C6D0000CA5E4D4DCDF4FAFAFA535D5D5D250DEF43870EBD515D5D7DD07613000028327DFAF4BA59B3669D2CD50A78AC7847785756563EE1EC0200401F692857D5D4D49CF8F39FFFFCAF2BF810E6F15FFFFAD7AFC45693746A9D5500001844EC01AFAEAE6EAEAFAF3FB273E7CED397721DEF75EBD62D4BE3BD253E5C698F3700000C3FC21F8C08AFADADED5AB870E19E37DE78E3604747476777777756DAA74F9F3E72F8F0E1BF373535FDDFFCF9F3D74C9F3E7D7F4477AC76BBAA0900005C8634AAFFAD5028CC49A37A793A07D2E94E27B9F0B53D9D86B865BC3B570200C00888F876160000407C030080F8060000C4370000886F000010DF000080F8060000F10D0000886F000010DF000020BE010000F10D0000E21B000010DF000020BE0100407C030000E21B0000C437000020BE0100407C030080F8060000C4370000886F0000407C030080F8060000F10D0000886F000010DF000080F8060000F10D0000E21B000010DF000020BE010000F10D0000E21B0000C437000020BE0100407C030000E21B0000C636B41B22B62F322DCE1400005C797C4F49E7DC50F15D595979BF33050000A509F03543C4F7B68A8A8AC9CE1200009426BEA70C16DF8542E19BCE1000009436C007DAFBDD62D51B00004A1FDFFDF67EDBEB0D000023248DED9556BD01006074E2FBCB457BBDBFEE8C0000C008CAF77E5BF5060080918FEF29EE700900C0B89624C9E4FDFBF72FDFBE7DFB27CDCDCD496363A319E5696A6A4A366FDEFCCF746ABC23010026B008EF2D5BB6245D5D5DC9D9B367CD18CDD1A347934D9B369D4843FC41EF4A0080092A56BC85F7B809F0B38D8D8D7BBD2B010026A8D86A227CC7CFA4F17DCEBB120060828A3DC7A2775CC5B70F8D0200947B7CFFEBA3CE647FCB2BC99EA6A7B389C7714C308B6F00004A18DF278F7724BB5F7F2A7967F5E3BD268EC573A2597C030050A2F86EDFF3977EE19DCFA13D0DA2597C030050AAF8DEBBE19941E33B9E13CDE21B008012C5F7EEC6F983C6773C279AC5370000E25B7C03007075C5775CDD64B0F88EE744B3F80600A044F1DDB6F58541E33B9E13CDE21B008012C5F7B18ED664F7BA79FDB79CA4C7E239D12CBE010028517CC71CD8B1A45F7CC731C12CBE010028657C9F3993B4BDB9A8FF9693F4583C279AC53700002588EFB883E5BEADCF0FBAE73B9E73974BF10D00C095C4F799334967DBFAE4DDB53F1934BCF389D7C46BAD828B6F00002E31BE2FB6DA6D155C7C030050A2F81ECE6AF750ABE0225A7C030030CCF8BEDCF0CE47448B6F00008619DF467C030020BEC5370000E2DB886F0000C4B7F80600407C1BF10D0020BE8DF80600407C8B6F0000C4B711DF0000886FF10D0080F836E21B00407C1BF10D0080F816DF0000886F23BE010010DFE21B0000F16DC4370080F836E21B0000F12DBE010010DF467C030020BEC5370000E2DB886F0000F13D16D3DCDC9C9C38712259B3664D0468D2DDDD9D343434249B366D1AF47BAEB9E69A64E6CC9997FCBBE2E75757578B6F0000CA2FBE23B4238877EEDC99DC76DB6DC95D77DDD52B94EFBBEFBE5EAF8FD7AD5AB52AF9CC673E93FCFCE73FCF5E73E0C081E41BDFF84676FC6B5FFB5A327BF6EC21E3FBDE7BEF15DF0000945F7C3FFBECB35910AF5CB932FB1AF11C113D63C68CECEB92254BB2E3ADADAD3DB19E47746D6D6DAF888FAFB17A7EEDB5D70E19DFD75F7FBDF80600A0FCE2FBBDF7DEEB15C6AFBEFAEAA0AF3D76EC5872CF3DF7F45AF9BEE9A69B92152B5624DFFEF6B7B3E337DE78633275EAD42157D93FFBD9CF8A6F0000CA2FBEF33975EA5416C6B1ED245FF58EED21757575BD5E77F2E4C9ECEB97BEF4A5E4CE3BEFCC1E1F3E7C38FBDEE3C78F67315F1CF4C5B36DDBB6EC75D75D775DCF4AB9F80600A0ECE23B56BC5F7EF9E56CDB48F14AF89C39737ABD2E3E88197BC3972F5F9EDC72CB2DD9C49694786D1EE6F1E1CDA1F67B6FD8B0217B2CBE010028CBF89E74615FF78E1D3BB238BE10A3FD56A86FBDF5D66C7F786C33C957C5F395EFF6F6F6ECCFB16A3ED8969308FCFCF72D5CB8507C0300505EF17DF3CD37F7DAA73D6FDEBC5E31DD37D223C063E53B8FEC58E98EE3B10AFEDBDFFE367BFCDC73CFF5FBBED8CE92FF79D7AE5DD9B1F840A7F80600A02CE27BF7EEDD3D2BDC3111D05FFCE2177BAE72F2D0430FF55AFD8E63F9F7C4C435C2F3ED267D57BA8BBFE781071EE8F79AA54B9766CF555454647BCEC53700001336BEE3039277DF7D77D2D6D6966CDDBA358BEEE2D5EEA3478F260B162CC80279F5EAD5D9969483070FF65ABDFEC52F7E916D4189EB7CDF7EFBED3D511E5746899F75C30D3764DB5406FB3BE437F619EBF321BE0100C4B711DF0000886FF10D0080F836E21B0000F12DBE010010DFE25B7C0300886F23BE010010DFE21B0000F16DC4370000E25B7C030020BEC5B7F8060010DF467C030020BEC5370000E2DB886F0000C4B7F80600407C8B6FF10D0020BE8DF80600407C8B6F0000C4B711DF0000886FF10D0080F816DFDE950000E2DB886F0000C4B7F80600407C1BF10D0080F816DF0000886FF10D0080F836E21B00802BD0DCDC2C7AC7CF74A7F17DCEBB12006082DABC797367575797F01D07D3D1D1F1A734BEF77A5702004C50EBD7AF9FBA71E3C68F3EFCF0C3D30278EC56BC23BC9B9A9A0EA6F3A0772500C0049606DFFD8D8D8D2DB1E521F61C5FAD53555575B5FEDDE3BCEF15DE00005C3522BE9D05000010DF000020BE010000F10D0000E21B0000C437000020BE0100407C030000E21B0000C4370000886F0000407C030080F8060000C4370000886F000010DF000080F8060000F10D0000886F000010DF000020BE010000F10D0000E21B000010DF000020BE0100407C030000E21B0000C437000020BE0100407C030080F8060000C4370000886F0000407C030080F8060000F10D0000886F000010DF000080F8060000F10D0000E21B000010DF000020BE010000F10D0000E21B0000C437000020BE0100407C030000E21B0000C4370000886F0000407C030080F8060000C43700008C616837446C5F645A9C290000B8F2F89E92CEB9A1E2BBB2B2F27E670A00004A13E06B8688EF6D151515939D250000284D7C4F192CBE0B85C2379D210000286D800FB4F7BBC5AA370000943EBEFBEDFDB6D71B000046481ADB2BAD7A0300C0E8C4F7978BF67A7FDD190100801194EFFDB6EA0D0000231FDF53DCE1120080712F4992C9FBF7EF5FBE7DFBF64F9A9B9B93C6C6C6AB7222BEAFD6BF7B535353B279F3E67FA653E31D0900308145786FD9B225E9EAEA4ACE9E3D6BC6688E1E3D9A6CDAB4E9441AE20F7A5702004C50B1E22DBCC74D809F6D6C6CDCEB5D09003041C55613E13B7E268DEF73DE9500001354EC3916BDE32ABE7D701400A0DCE3FB5F1F7526FB5B5E49F6343D9D4D3C8E6382597C030050C2F83E79BC23D9FDFA53C93BAB1FEF35712C9E13CDE21B008012C577FB9EBFF40BEF7C0EED6910CDE21B008052C5F7DE0DCF0C1ADFF19C6816DF00009428BE7737CE1F34BEE339D12CBE010010DFE21B0080AB2BBEE3EA2683C5773C279AC5370000258AEFB6AD2F0C1ADFF19C6816DF00009428BE8F75B426BBD7CDEBBFE5243D16CF8966F10D004089E23BE6C08E25FDE23B8E0966F10D004029E3FBCC99A4EDCD45FDB79CA4C7E239D12CBE010028417CC71D2CF76D7D7ED03DDFF19CBB5C8A6F0000AE24BECF9C493ADBD627EFAEFDC9A0E19D4FBC265E6B155C7C03007089F17DB1D56EABE0E21B008012C5F77056BB875A0517D1E21B008061C6F7E586773E225A7C030030CCF836E21B0000F12DBE010010DF467C030020BEC5370000E2DB886F0000F16DC4370000E25B7C030020BE8DF80600407C8B6F0000C4B711DF0000E2DB886F0000C4B7F80600407C1BF10D0080F816DF0000886F23BE0100C4B711DF0000886FF10D0080F836E21B0000F12DBE010010DF467C030088EF52CC4B2FBD94AC5EBDBAD7B1F457262B57AE2C69ACAE5AB52A9931634636F1387EC7860D1B86FCBE78CDAF7EF5AB8BBE66EEDCB9D9E3575F7D35E9EEEEEE39BE74E952F10D00C0F889EF88D4DB6FBF3D0BE29B6EBA2979EBADB7B263DFFAD6B77A22F9D4A953C9912347927BEFBD373B1651FB95AF7C25A9AAAAEA89EAF8BA64C992E4F39FFFFC80BF63F9F2E5170DFC4D9B36F5FA7937DE786372F7DD77678F6356AC5891DC7AEBADFD7E4EFC07227F1C7F87FC71C4B8F80600605CC47784EAEEDDBB93975F7E39696B6BCB56A2F3602D0ED97C22C2E378BE521E8FE37BE36B047344F9CD37DF3C607C7FF5AB5FEDB7F2BD75EBD67EAF2B0EE6F8F382050B7AFE7CCD35D7243FFEF18FB3C7070E1CE8F939F7DC734FF6778DC7EFBDF75ECFF7B6B6B6665F9F7BEE39F10D00C0D8C677AC2447C0C6EA72447484EDF5D75F9F1DBBE38E3B923FFEF18F59BC1E3A74A85710C7F3F9E388F7F81AAF3D7CF870F6B8BDBDBDE7F5CDCDCDD9B1BABABA5EF11DBF277E47F1DFE7E4C993D9EBF395EEFCFBE2F1030F3C907DEF40615FBCF27DC30D3724EBD6ADCB1EC72A79ACA65BF90600604CE33BB691E4F1FCFBDFFFBEDF9EEC5B6EB925F9DBDFFE96BD2656C54F9C38D113C411BBCF3FFF7CCF76924943AC7CE7CFC5E3F7DF7F3FFB9917DB8E921F2B0EFD356BD624D75E7BED80F11D2BDF3B76ECC81E6FDBB6ADE778FC1D6D3B010060CCE33B26823A0FD5BBEEBAAB27BC63453C8E452CF75D998EE3B1B29C7F5FBEDA1D2BDFF17C847ADF38AEADADEDD9E6521CD083C5776C51E9BBF21DFBBFA74E9DDAF3BAD852121FB48CD7FCEE77BF1B30DCEDF9060060DCC4F760111C570C890F5E0EF6DA7C353A223C8FE458F5BEEFBEFBFA6D0D9954B4F21D8F1F7BECB192C477ACDCC77F0E26F5D906531CDFF99EEFE26D33E21B0080318FEF7CE53B5FFD8E0F37EEDAB5ABDF6BAFBBEEBAE4CE3BEFCCF65217AF9CC7CAF7603F3B56D28F1D3B963D6E6868C8F67B1F3C7870C0C08FED2503857E7C90B278CBCA607BBE23B8F32D28F1A1CC88F1FCF283E21B00807119DF93FA5C8D245F658ECB12C65693B8EC607EE9C1491756B7F3C711DBC53F3F423B8E3FFBECB3D99FE30399353535035EF164B055F6BE135B5CF26D30B1673D7F7D4CC4767C9D376F5EF635BF428AF80600605CC477AC48F73DD6378C23768BB7A60CF533E3F9B87249AC3CC78737F355F2BEBF63CE9C399715DFF9D55A26F5F99065FED81D2E01001897F16DC4370000E25B7C030020BEC5370000E2DB886F0000C4B7F80600407C1BF10D0080F816DF0000886FF10D0080F836E21B0000F12DBE010010DF467C030020BEC5370000E25B7C030020BE8DF80600407C8B6F0000C4B711DF0000886FF10D0080F816DF0000886F23BE010010DFE21B0000F16DC4370000E25B7C030020BEC5370000E2DB886F0000C4B7F80600407C1BF10D00C0A449CDCDCDA277FC4C771ADFE7BC2B010026A8CD9B377776757509DF71301D1D1D7F4AE37BAF772500C004B57EFDFAA91B376EFCE8C30F3F3C2D80C76EC53BC2BBA9A9E9603A0F7A5702004C6069F0DDDFD8D8D8125B1E62CFF1D538555555C9D5FA77BF70DEF70A6F0000AE0A11DFCE020000886F000010DF000080F8060000F10D0000E21B000010DF000020BE010000F10D0000E21B0000C437000020BE0100407C030000E21B0000C4370000886F0000407C030080F8060000C4370000886F000010DF000080F8060000F10D0000886F000010DF000020BE010000F10D0000E21B000010DF000020BE0100407C030000E21B0000C437000020BE0100407C030080F8060000C4370000886F0000407C030080F8060000F10D0000886F000010DF000080F8060000F10D0000E21B000010DF000020BE010000F10D00006319DA0D11DB179916670A0000AE3CBEA7A4736EA8F8AEACACBCDF99020080D204F89A21E27B5B4545C564670900004A13DF53068BEF42A1F04D670800004A1BE003EDFD6EB1EA0D0000A58FEF7E7BBFEDF50600801192C6F64AABDE0000303AF1FDE5A2BDDE5F774600006004E57BBFAD7A03004089555757FF571ADBF30B85C2B2F4EBBBE99CBAB0FADD7DE1CFCBD35910ABE2CE1600005CA2DADADACFA531FD701ADCFF18C6DD2D8B3F80F9D7F4EBEC69D3A67DC1590400808B88BDDCE97C7029D13DC0B4A753E16C0200C00062B53B0DE657D2F03E5F1CD2E9F1E485175E48B66EDD9A74747424A74E9D4A42777777D2D5D595ECDAB52B59B46851525757375084FF217EAEB30B000017C48727D3507EA3389C67CF9E9DAC5DBB36F9F8E38F93E1387FFE7CD2D8D8987D5F9F005F6E1B0A00004CEA59F1EE15DE8B172FEE59E1BE54B122BE6CD9B27E01EEEA28000094BDD86A521CCA0D0D0D4929C42AF8F4E9D37B6D4171B60100285B173E5C79BED4E15D1CE07D56C02B9C750000CA4E6C3729BEAA496C3519097DB6A0B4DBFF0D0040D989EB78177FB8F272F7780F670F789F0F61CE75F60100282BC537D089AB9A8CA43EDB4F0EF8F025000065E3C22DE37BAEE33DDCCB095EAEB80CE1F7BEF7BDE23B61BA153D0000E5210DE0F97908C70D7446C38B2FBE58BCFABDC0BF02000065A150282CCB4378FBF6EDA312DF7127CCE2EB7EFB570000A02CA4F1FB6E1EC29D9D9DA312DF712BFAA2F8DEEB5F0100807289EFEE3C8447EA2A27035DF5A428BEBBFD2B0000502EF1DD13C2A3A9F8F7FA570000A05CE2FBA4956F000018059595957FB5E71B00004681AB9D0000C02849E3F749D7F906008051301677B89C3973E6A7EE70090040594A23B8258FE1B56BD78E687C37363616AF7A1FA8A8A898EC5F000080B251281466E6413C7BF6EC11BBEA495CE5A4BEBEFE93A2F89EEBEC030050566A6B6B3F17ABD079142F5EBC7844E27BD9B265C5ABDEEDD3A64DFB82B30F0040D94963B8229D73791CBFF6DA6B250DEFF5EBD7F7BAB14EFC3E671D0080720EF0578A03B954011EE13D63C68CF3453FFB0FCE360000652D3EFC18615C1CE0B10525F66A5FEE1EEF3E5B4DB2EB7AC73617671B0000019E0678F18D77F20F61C65550E23281C3BD9C60AC76F7F9706516DEF6790300409F00BFB005E55C713CC775C0172D5A94B4B4B464B7A2CFAF8A122BDC71CBF8D6D6D6EC063A69747FDA27BAB3AD2656BC01006010173E8479608090BE9469F7E14A0000188658ADAEACAC7C380DE8B64B8CEE88F6B9B6990000C06548637A4A3A4FC69EF034C8FF9A3EEEBE10DAF1756FECE94E9FFB9FB865BC3B570200000000000000000000000000000000000000000000B9FF07B913B8ED3A1ED4310000000049454E44AE426082, 1); +INSERT INTO `act_ge_bytearray` VALUES ('250022', 1, '员工资产交接.bpmn', '250021', 0x3C3F786D6C2076657273696F6E3D22312E302220656E636F64696E673D225554462D38223F3E0D0A3C646566696E6974696F6E7320786D6C6E733D22687474703A2F2F7777772E6F6D672E6F72672F737065632F42504D4E2F32303130303532342F4D4F44454C2220786D6C6E733A7873693D22687474703A2F2F7777772E77332E6F72672F323030312F584D4C536368656D612D696E7374616E63652220786D6C6E733A7873643D22687474703A2F2F7777772E77332E6F72672F323030312F584D4C536368656D612220786D6C6E733A61637469766974693D22687474703A2F2F61637469766974692E6F72672F62706D6E2220786D6C6E733A62706D6E64693D22687474703A2F2F7777772E6F6D672E6F72672F737065632F42504D4E2F32303130303532342F44492220786D6C6E733A6F6D6764633D22687474703A2F2F7777772E6F6D672E6F72672F737065632F44442F32303130303532342F44432220786D6C6E733A6F6D6764693D22687474703A2F2F7777772E6F6D672E6F72672F737065632F44442F32303130303532342F44492220747970654C616E67756167653D22687474703A2F2F7777772E77332E6F72672F323030312F584D4C536368656D61222065787072657373696F6E4C616E67756167653D22687474703A2F2F7777772E77332E6F72672F313939392F585061746822207461726765744E616D6573706163653D22687474703A2F2F7777772E61637469766974692E6F72672F70726F63657373646566223E0D0A20203C70726F636573732069643D2265616D5F61737365745F656D706C6F7965655F68616E646F76657222206E616D653D22E59198E5B7A5E8B584E4BAA7E4BAA4E68EA52220697345786563757461626C653D2274727565223E0D0A202020203C73746172744576656E742069643D227369642D33386161356139372D323537332D343164652D616639342D38386237356464653866346322206E616D653D22E5BC80E5A78B222F3E0D0A202020203C757365725461736B20786D6C6E733A666C6F7761626C653D22687474703A2F2F666C6F7761626C652E6F72672F62706D6E222069643D2269645F3122206E616D653D22E7AEA1E79086E59198E5AEA1E689B92220666C6F7761626C653A666F726D4B65793D2265616D5F61737365745F656D706C6F7965655F68616E646F766572223E0D0A2020202020203C657874656E73696F6E456C656D656E74733E0D0A20202020202020203C666C6F7761626C653A7461736B4C697374656E6572206576656E743D226372656174652220636C6173733D22636F6D2E7979792E666C6F7761626C652E6C697374656E65722E466C6F775461736B4C697374656E6572222F3E0D0A2020202020203C2F657874656E73696F6E456C656D656E74733E0D0A202020203C2F757365725461736B3E0D0A202020203C656E644576656E742069643D227369642D33663532643231622D313637392D346436382D383161332D64383261303431643766333422206E616D653D22E7BB93E69D9F222F3E0D0A202020203C73657175656E6365466C6F772069643D227369642D63646461393630302D636530662D343536332D616230312D3536393163363535336166382220736F757263655265663D227369642D33386161356139372D323537332D343164652D616639342D38386237356464653866346322207461726765745265663D2269645F30222F3E0D0A202020203C73657175656E6365466C6F772069643D227369642D38346336393936662D616266622D346635312D393737642D6233653939373431313038342220736F757263655265663D2269645F3122207461726765745265663D227369642D33663532643231622D313637392D346436382D383161332D643832613034316437663334222F3E0D0A202020203C757365725461736B20786D6C6E733A666C6F7761626C653D22687474703A2F2F666C6F7761626C652E6F72672F62706D6E222069643D2269645F3022206E616D653D22E58F91E8B5B7E4BABA2220666C6F7761626C653A666F726D4B65793D2265616D5F61737365745F656D706C6F7965655F68616E646F766572223E0D0A2020202020203C657874656E73696F6E456C656D656E74733E0D0A20202020202020203C666C6F7761626C653A7461736B4C697374656E6572206576656E743D226372656174652220636C6173733D22636F6D2E7979792E666C6F7761626C652E6C697374656E65722E466C6F775461736B4C697374656E6572222F3E0D0A2020202020203C2F657874656E73696F6E456C656D656E74733E0D0A202020203C2F757365725461736B3E0D0A202020203C73657175656E6365466C6F772069643D227369642D35306434346164612D666338372D346364612D393438392D6138663166653738643566612220736F757263655265663D2269645F3022207461726765745265663D2269645F31222F3E0D0A20203C2F70726F636573733E0D0A20203C62706D6E64693A42504D4E4469616772616D2069643D2242504D4E4469616772616D5F74657374223E0D0A202020203C62706D6E64693A42504D4E506C616E652062706D6E456C656D656E743D2274657374222069643D2242504D4E506C616E655F74657374223E0D0A2020202020203C62706D6E64693A42504D4E53686170652069643D2273686170652D64643531363464352D386330362D343537302D393466622D346565346233333633656538222062706D6E456C656D656E743D227369642D33386161356139372D323537332D343164652D616639342D383862373564646538663463223E0D0A20202020202020203C6F6D6764633A426F756E647320783D223636302E302220793D222D3231352E30222077696474683D2233302E3022206865696768743D2233302E30222F3E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E53686170652069643D2273686170652D39376136303639362D393930392D343536312D626163612D306539346262353933326435222062706D6E456C656D656E743D2269645F31223E0D0A20202020202020203C6F6D6764633A426F756E647320783D223632352E302220793D2231302E343335393336222077696474683D223130302E3022206865696768743D2238302E30222F3E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E53686170652069643D2273686170652D39616566633864642D396566352D343830312D626161302D666339323337373762666334222062706D6E456C656D656E743D227369642D33663532643231622D313637392D346436382D383161332D643832613034316437663334223E0D0A20202020202020203C6F6D6764633A426F756E647320783D223636302E302220793D223135302E30222077696474683D2233302E3022206865696768743D2233302E30222F3E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E456467652069643D22656467652D62666436376533332D383836342D346531392D626262392D363162643562636331363530222062706D6E456C656D656E743D227369642D63646461393630302D636530662D343536332D616230312D353639316336353533616638223E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223637352E302220793D222D3138352E30222F3E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223637342E393939392220793D222D3133352E30222F3E0D0A2020202020203C2F62706D6E64693A42504D4E456467653E0D0A2020202020203C62706D6E64693A42504D4E456467652069643D22656467652D62313564303134392D326137382D346564352D393562642D613863326261396338376265222062706D6E456C656D656E743D227369642D38346336393936662D616266622D346635312D393737642D623365393937343131303834223E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223637352E302220793D2239302E3433353934222F3E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223637352E302220793D223135302E30222F3E0D0A2020202020203C2F62706D6E64693A42504D4E456467653E0D0A2020202020203C62706D6E64693A42504D4E53686170652069643D2273686170652D38356466613065622D306631322D343562322D386138632D373635376565626665366137222062706D6E456C656D656E743D2269645F30223E0D0A20202020202020203C6F6D6764633A426F756E647320783D223632342E39393939342220793D222D3133352E30222077696474683D223130302E3022206865696768743D2238302E30222F3E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E456467652069643D22656467652D33363765346630642D373063362D343133332D623833342D373139663166336666616130222062706D6E456C656D656E743D227369642D35306434346164612D666338372D346364612D393438392D613866316665373864356661223E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223637342E39393939342220793D222D35352E30222F3E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223637352E302220793D2231302E343335393336222F3E0D0A2020202020203C2F62706D6E64693A42504D4E456467653E0D0A202020203C2F62706D6E64693A42504D4E506C616E653E0D0A20203C2F62706D6E64693A42504D4E4469616772616D3E0D0A3C2F646566696E6974696F6E733E0D0A, 0); +INSERT INTO `act_ge_bytearray` VALUES ('250023', 1, '员工资产交接.eam_asset_employee_handover.png', '250021', 0x89504E470D0A1A0A0000000D49484452000002DF00000195080600000026219D530000177E4944415478DAEDDD7F6895F7BDC07161966D3028FDA394D25B7ACB2DBD657F8C4BB1B0315A42617483822BAB4B4E0C2E64CEB8DEB6739D856E6B51EAC6B5FBC15A5A701DA59DCE3B57449CCBB55A93F8B35669ACB3A9CECEAC5A8931364EAC388D56DBE73E9F079F70F2D3A8273FCC79BDE0438ECF3949E4F1FCF1F6CBF73CCFA449000030C29224F95C6B6B6BFDE2C58B372D5CB8F0C4A38F3E7AAEB6B636A9AAAA4A6A6A6A3EFDFEF7BF7FF6A73FFDE9FE679E7966693AFFE98C0100C06544F78A152B962C58B0E0DC9C397392175F7C31D9BE7D7BD2D1D1917477772721BE767575256FBFFD7692C679F2831FFCE0D31FFEF0871FCC9A356BA633080000C3904676DDCF7EF6B3338F3FFE7816D6E7CF9F4F866BD7AE5DC9134F3C71BEBEBE7EEFB469D36E733601006000693B4F5EB56AD5FAD9B367270D0D0D9714DD7DAD5DBB36A9ABAB3B6D151C00000608EF8D1B37BEF5C8238F24FBF6ED4B4AE1830F3E48D2903F3D73E6CCFF76860100E08258F18EF08E3DDCA5143F6FD6AC59270B85428DB30C0040D98B3DDEB1D5A4542BDE03AD80CF9831E3781AE07738DB000094ADB8AAC9D34F3F7D36F6788FA4D5AB579F9E3E7DFA36671C0080B2B572E5CAFF8DAB9A7CFCF1C7C9487BE8A1878ED87E020040598A55EFB88E775C4E7034BCF3CE3B67AD7E03005096E2CE95F121CB2BB9A4E0A5AAABAB3B525555F5EFCE3E000065256E19FFD24B2F25A3E937BFF9CDAE34BEE73AFB00009495850B179E885BC68FA637DF7CF38334BE1B9C7D0000CACAA38F3E7AAEB3B37354E3FBC891235D697CB73BFB00009495DADADAA4BBBB7B54E33B7E5F1ADFDDCE3E000065258DE0642CC4EF75F60100282BDFF9CE773E1DED95EFD3A74F1FB1F20D0040D979E49147CE8EF69EEFC3870FFFDD9E6F0000CACE534F3DD536DA573B79FDF5D75F73B5130000CACE2F7FF9CB9746FB3ADFF3E6CD5BED3ADF0000949D279F7CF23F1E7EF8E14F46F10E97DDD5D5D5EFBBC325000065E9B1C71EFBC7DB6FBF3D5A5B4E96A6E1BDC5590700A02C7DF7BBDF9DF6A31FFDE8DC28AC7E1FAFAEAEDE5928146A9C750000CA567D7D7D6B4343C3889677EC2F8F55EF8A8A8AC9CE380000652BF660D7D5D59DDEB76FDF8884776B6BEBAAF47774160A853B9C6D0000CA5E4D4DCDF4FAFAFA535D5D5D250DEF43870EBD515D5D7DD07613000028327DFAF4BA59B3669D2CD50A78AC7847785756563EE1EC0200401F692857D5D4D49CF8F39FFFFCAF2BF810E6F15FFFFAD7AFC45693746A9D5500001844EC01AFAEAE6EAEAFAF3FB273E7CED397721DEF75EBD62D4BE3BD253E5C698F3700000C3FC21F8C08AFADADED5AB870E19E37DE78E3604747476777777756DAA74F9F3E72F8F0E1BF373535FDDFFCF9F3D74C9F3E7D7F4477AC76BBAA0900005C8634AAFFAD5028CC49A37A793A07D2E94E27B9F0B53D9D86B865BC3B570200C00888F876160000407C030080F8060000C4370000886F000010DF000080F8060000F10D0000886F000010DF000020BE010000F10D0000E21B000010DF000020BE0100407C030000E21B0000C437000020BE0100407C030080F8060000C4370000886F0000407C030080F8060000F10D0000886F000010DF000080F8060000F10D0000E21B000010DF000020BE010000F10D0000E21B0000C437000020BE0100407C030000E21B0000C636B41B22B62F322DCE1400005C797C4F49E7DC50F15D595979BF33050000A509F03543C4F7B68A8A8AC9CE1200009426BEA70C16DF8542E19BCE1000009436C007DAFBDD62D51B00004A1FDFFDF67EDBEB0D000023248DED9556BD01006074E2FBCB457BBDBFEE8C0000C008CAF77E5BF5060080918FEF29EE700900C0B89624C9E4FDFBF72FDFBE7DFB27CDCDCD496363A319E5696A6A4A366FDEFCCF746ABC23010026B008EF2D5BB6245D5D5DC9D9B367CD18CDD1A347934D9B369D4843FC41EF4A0080092A56BC85F7B809F0B38D8D8D7BBD2B010026A8D86A227CC7CFA4F17DCEBB120060828A3DC7A2775CC5B70F8D0200947B7CFFEBA3CE647FCB2BC99EA6A7B389C7714C308B6F00004A18DF278F7724BB5F7F2A7967F5E3BD268EC573A2597C030050A2F86EDFF3977EE19DCFA13D0DA2597C030050AAF8DEBBE19941E33B9E13CDE21B008012C5F7EEC6F983C6773C279AC5370000E25B7C03007075C5775CDD64B0F88EE744B3F80600A044F1DDB6F58541E33B9E13CDE21B008012C5F7B18ED664F7BA79FDB79CA4C7E239D12CBE010028517CC71CD8B1A45F7CC731C12CBE010028657C9F3993B4BDB9A8FF9693F4583C279AC53700002588EFB883E5BEADCF0FBAE73B9E73974BF10D00C095C4F799334967DBFAE4DDB53F1934BCF389D7C46BAD828B6F00002E31BE2FB6DA6D155C7C030050A2F81ECE6AF750ABE0225A7C030030CCF8BEDCF0CE47448B6F00008619DF467C030020BEC5370000E2DB886F0000C4B7F80600407C1BF10D0020BE8DF80600407C8B6F0000C4B711DF0000886FF10D0080F836E21B00407C1BF10D0080F816DF0000886F23BE010010DFE21B0000F16DC4370080F836E21B0000F12DBE010010DF467C030020BEC5370000E2DB886F0000F13D16D3DCDC9C9C38712259B3664D0468D2DDDD9D343434249B366D1AF47BAEB9E69A64E6CC9997FCBBE2E75757578B6F0000CA2FBE23B4238877EEDC99DC76DB6DC95D77DDD52B94EFBBEFBE5EAF8FD7AD5AB52AF9CC673E93FCFCE73FCF5E73E0C081E41BDFF84676FC6B5FFB5A327BF6EC21E3FBDE7BEF15DF0000945F7C3FFBECB35910AF5CB932FB1AF11C113D63C68CECEB92254BB2E3ADADAD3DB19E47746D6D6DAF888FAFB17A7EEDB5D70E19DFD75F7FBDF80600A0FCE2FBBDF7DEEB15C6AFBEFAEAA0AF3D76EC5872CF3DF7F45AF9BEE9A69B92152B5624DFFEF6B7B3E337DE78633275EAD42157D93FFBD9CF8A6F0000CA2FBEF33975EA5416C6B1ED245FF58EED21757575BD5E77F2E4C9ECEB97BEF4A5E4CE3BEFCC1E1F3E7C38FBDEE3C78F67315F1CF4C5B36DDBB6EC75D75D775DCF4AB9F80600A0ECE23B56BC5F7EF9E56CDB48F14AF89C39737ABD2E3E88197BC3972F5F9EDC72CB2DD9C49694786D1EE6F1E1CDA1F67B6FD8B0217B2CBE010028CBF89E74615FF78E1D3BB238BE10A3FD56A86FBDF5D66C7F786C33C957C5F395EFF6F6F6ECCFB16A3ED8969308FCFCF72D5CB8507C0300505EF17DF3CD37F7DAA73D6FDEBC5E31DD37D223C063E53B8FEC58E98EE3B10AFEDBDFFE367BFCDC73CFF5FBBED8CE92FF79D7AE5DD9B1F840A7F80600A02CE27BF7EEDD3D2BDC3111D05FFCE2177BAE72F2D0430FF55AFD8E63F9F7C4C435C2F3ED267D57BA8BBFE781071EE8F79AA54B9766CF555454647BCEC53700001336BEE3039277DF7D77D2D6D6966CDDBA358BEEE2D5EEA3478F260B162CC80279F5EAD5D9969483070FF65ABDFEC52F7E916D4189EB7CDF7EFBED3D511E5746899F75C30D3764DB5406FB3BE437F619EBF321BE0100C4B711DF0000886FF10D0080F836E21B0000F12DBE010010DFE25B7C0300886F23BE010010DFE21B0000F16DC4370000E25B7C030020BEC5B7F8060010DF467C030020BEC5370000E2DB886F0000C4B7F80600407C8B6FF10D0020BE8DF80600407C8B6F0000C4B711DF0000886FF10D0080F816DFDE950000E2DB886F0000C4B7F80600407C1BF10D0080F816DF0000886FF10D0080F836E21B00802BD0DCDC2C7AC7CF74A7F17DCEBB12006082DABC797367575797F01D07D3D1D1F1A734BEF77A5702004C50EBD7AF9FBA71E3C68F3EFCF0C3D30278EC56BC23BC9B9A9A0EA6F3A0772500C0049606DFFD8D8D8D2DB1E521F61C5FAD53555575B5FEDDE3BCEF15DE00005C3522BE9D05000010DF000020BE010000F10D0000E21B0000C437000020BE0100407C030000E21B0000C4370000886F0000407C030080F8060000C4370000886F000010DF000080F8060000F10D0000886F000010DF000020BE010000F10D0000E21B000010DF000020BE0100407C030000E21B0000C437000020BE0100407C030080F8060000C4370000886F0000407C030080F8060000F10D0000886F000010DF000080F8060000F10D0000E21B000010DF000020BE010000F10D0000E21B0000C437000020BE0100407C030000E21B0000C4370000886F0000407C030080F8060000C43700008C616837446C5F645A9C290000B8F2F89E92CEB9A1E2BBB2B2F27E670A00004A13E06B8688EF6D151515939D250000284D7C4F192CBE0B85C2379D210000286D800FB4F7BBC5AA370000943EBEFBEDFDB6D71B000046481ADB2BAD7A0300C0E8C4F7978BF67A7FDD190100801194EFFDB6EA0D0000231FDF53DCE1120080712F4992C9FBF7EF5FBE7DFBF64F9A9B9B93C6C6C6AB7222BEAFD6BF7B535353B279F3E67FA653E31D0900308145786FD9B225E9EAEA4ACE9E3D6BC6688E1E3D9A6CDAB4E9441AE20F7A5702004C50B1E22DBCC74D809F6D6C6CDCEB5D09003041C55613E13B7E268DEF73DE9500001354EC3916BDE32ABE7D701400A0DCE3FB5F1F7526FB5B5E49F6343D9D4D3C8E6382597C030050C2F83E79BC23D9FDFA53C93BAB1FEF35712C9E13CDE21B008012C577FB9EBFF40BEF7C0EED6910CDE21B008052C5F7DE0DCF0C1ADFF19C6816DF00009428BE7737CE1F34BEE339D12CBE010010DFE21B0080AB2BBEE3EA2683C5773C279AC5370000258AEFB6AD2F0C1ADFF19C6816DF00009428BE8F75B426BBD7CDEBBFE5243D16CF8966F10D004089E23BE6C08E25FDE23B8E0966F10D004029E3FBCC99A4EDCD45FDB79CA4C7E239D12CBE010028417CC71D2CF76D7D7ED03DDFF19CBB5C8A6F0000AE24BECF9C493ADBD627EFAEFDC9A0E19D4FBC265E6B155C7C03007089F17DB1D56EABE0E21B008012C5F77056BB875A0517D1E21B008061C6F7E586773E225A7C030030CCF836E21B0000F12DBE010010DF467C030020BEC5370000E2DB886F0000F16DC4370000E25B7C030020BE8DF80600407C8B6F0000C4B711DF0000E2DB886F0000C4B7F80600407C1BF10D0080F816DF0000886F23BE0100C4B711DF0000886FF10D0080F836E21B0000F12DBE010010DF467C030088EF52CC4B2FBD94AC5EBDBAD7B1F457262B57AE2C69ACAE5AB52A9931634636F1387EC7860D1B86FCBE78CDAF7EF5AB8BBE66EEDCB9D9E3575F7D35E9EEEEEE39BE74E952F10D00C0F889EF88D4DB6FBF3D0BE29B6EBA2979EBADB7B263DFFAD6B77A22F9D4A953C9912347927BEFBD373B1651FB95AF7C25A9AAAAEA89EAF8BA64C992E4F39FFFFC80BF63F9F2E5170DFC4D9B36F5FA7937DE786372F7DD77678F6356AC5891DC7AEBADFD7E4EFC07227F1C7F87FC71C4B8F80600605CC47784EAEEDDBB93975F7E39696B6BCB56A2F3602D0ED97C22C2E378BE521E8FE37BE36B047344F9CD37DF3C607C7FF5AB5FEDB7F2BD75EBD67EAF2B0EE6F8F382050B7AFE7CCD35D7243FFEF18FB3C7070E1CE8F939F7DC734FF6778DC7EFBDF75ECFF7B6B6B6665F9F7BEE39F10D00C0D8C677AC2447C0C6EA72447484EDF5D75F9F1DBBE38E3B923FFEF18F59BC1E3A74A85710C7F3F9E388F7F81AAF3D7CF870F6B8BDBDBDE7F5CDCDCDD9B1BABABA5EF11DBF277E47F1DFE7E4C993D9EBF395EEFCFBE2F1030F3C907DEF40615FBCF27DC30D3724EBD6ADCB1EC72A79ACA65BF90600604CE33BB691E4F1FCFBDFFFBEDF9EEC5B6EB925F9DBDFFE96BD2656C54F9C38D113C411BBCF3FFF7CCF76924943AC7CE7CFC5E3F7DF7F3FFB9917DB8E921F2B0EFD356BD624D75E7BED80F11D2BDF3B76ECC81E6FDBB6ADE778FC1D6D3B010060CCE33B26823A0FD5BBEEBAAB27BC63453C8E452CF75D998EE3B1B29C7F5FBEDA1D2BDFF17C847ADF38AEADADEDD9E6521CD083C5776C51E9BBF21DFBBFA74E9DDAF3BAD852121FB48CD7FCEE77BF1B30DCEDF9060060DCC4F760111C570C890F5E0EF6DA7C353A223C8FE458F5BEEFBEFBFA6D0D9954B4F21D8F1F7BECB192C477ACDCC77F0E26F5D906531CDFF99EEFE26D33E21B0080318FEF7CE53B5FFD8E0F37EEDAB5ABDF6BAFBBEEBAE4CE3BEFCCF65217AF9CC7CAF7603F3B56D28F1D3B963D6E6868C8F67B1F3C7870C0C08FED2503857E7C90B278CBCA607BBE23B8F32D28F1A1CC88F1FCF283E21B00807119DF93FA5C8D245F658ECB12C65693B8EC607EE9C1491756B7F3C711DBC53F3F423B8E3FFBECB3D99FE30399353535035EF164B055F6BE135B5CF26D30B1673D7F7D4CC4767C9D376F5EF635BF428AF80600605CC477AC48F73DD6378C23768BB7A60CF533E3F9B87249AC3CC78737F355F2BEBF63CE9C399715DFF9D55A26F5F99065FED81D2E01001897F16DC4370000E25B7C030020BEC5370000E2DB886F0000C4B7F80600407C1BF10D0080F816DF0000886FF10D0080F836E21B0000F12DBE010010DF467C030020BEC5370000E25B7C030020BE8DF80600407C8B6F0000C4B711DF0000886FF10D0080F816DF0000886F23BE010010DFE21B0000F16DC4370000E25B7C030020BEC5370000E2DB886F0000C4B7F80600407C1BF10D00C0A449CDCDCDA277FC4C771ADFE7BC2B010026A8CD9B377776757509DF71301D1D1D7F4AE37BAF772500C004B57EFDFAA91B376EFCE8C30F3F3C2D80C76EC53BC2BBA9A9E9603A0F7A5702004C6069F0DDDFD8D8D8125B1E62CFF1D538555555C9D5FA77BF70DEF70A6F0000AE0A11DFCE020000886F000010DF000080F8060000F10D0000E21B000010DF000020BE010000F10D0000E21B0000C437000020BE0100407C030000E21B0000C4370000886F0000407C030080F8060000C4370000886F000010DF000080F8060000F10D0000886F000010DF000020BE010000F10D0000E21B000010DF000020BE0100407C030000E21B0000C437000020BE0100407C030080F8060000C4370000886F0000407C030080F8060000F10D0000886F000010DF000080F8060000F10D0000E21B000010DF000020BE010000F10D00006319DA0D11DB179916670A0000AE3CBEA7A4736EA8F8AEACACBCDF99020080D204F89A21E27B5B4545C564670900004A13DF53068BEF42A1F04D670800004A1BE003EDFD6EB1EA0D0000A58FEF7E7BBFEDF50600801192C6F64AABDE0000303AF1FDE5A2BDDE5F774600006004E57BBFAD7A03004089555757FF571ADBF30B85C2B2F4EBBBE99CBAB0FADD7DE1CFCBD35910ABE2CE1600005CA2DADADACFA531FD701ADCFF18C6DD2D8B3F80F9D7F4EBEC69D3A67DC1590400808B88BDDCE97C7029D13DC0B4A753E16C0200C00062B53B0DE657D2F03E5F1CD2E9F1E485175E48B66EDD9A74747424A74E9D4A42777777D2D5D595ECDAB52B59B46851525757375084FF217EAEB30B000017C48727D3507EA3389C67CF9E9DAC5DBB36F9F8E38F93E1387FFE7CD2D8D8987D5F9F005F6E1B0A00004CEA59F1EE15DE8B172FEE59E1BE54B122BE6CD9B27E01EEEA28000094BDD86A521CCA0D0D0D4929C42AF8F4E9D37B6D4171B60100285B173E5C79BED4E15D1CE07D56C02B9C750000CA4E6C3729BEAA496C3519097DB6A0B4DBFF0D0040D989EB78177FB8F272F7780F670F789F0F61CE75F60100282BC537D089AB9A8CA43EDB4F0EF8F025000065E3C22DE37BAEE33DDCCB095EAEB80CE1F7BEF7BDE23B61BA153D0000E5210DE0F97908C70D7446C38B2FBE58BCFABDC0BF02000065A150282CCB4378FBF6EDA312DF7127CCE2EB7EFB570000A02CA4F1FB6E1EC29D9D9DA312DF712BFAA2F8DEEB5F0100807289EFEE3C8447EA2A27035DF5A428BEBBFD2B0000502EF1DD13C2A3A9F8F7FA570000A05CE2FBA4956F000018059595957FB5E71B00004681AB9D0000C02849E3F749D7F906008051301677B89C3973E6A7EE70090040594A23B8258FE1B56BD78E687C37363616AF7A1FA8A8A898EC5F000080B251281466E6413C7BF6EC11BBEA495CE5A4BEBEFE93A2F89EEBEC030050566A6B6B3F17ABD079142F5EBC7844E27BD9B265C5ABDEEDD3A64DFB82B30F0040D94963B8229D73791CBFF6DA6B250DEFF5EBD7F7BAB14EFC3E671D0080720EF0578A03B954011EE13D63C68CF3453FFB0FCE360000652D3EFC18615C1CE0B10525F66A5FEE1EEF3E5B4DB2EB7AC73617671B0000019E0678F18D77F20F61C65550E23281C3BD9C60AC76F7F9706516DEF6790300409F00BFB005E55C713CC775C0172D5A94B4B4B464B7A2CFAF8A122BDC71CBF8D6D6D6EC063A69747FDA27BAB3AD2656BC01006010173E8479608090BE9469F7E14A0000188658ADAEACAC7C380DE8B64B8CEE88F6B9B6990000C06548637A4A3A4FC69EF034C8FF9A3EEEBE10DAF1756FECE94E9FFB9FB865BC3B570200000000000000000000000000000000000000000000B9FF07B913B8ED3A1ED4310000000049454E44AE426082, 1); +INSERT INTO `act_ge_bytearray` VALUES ('250026', 1, '物品领用申请.bpmn', '250025', 0x3C3F786D6C2076657273696F6E3D22312E302220656E636F64696E673D225554462D38223F3E0D0A3C646566696E6974696F6E7320786D6C6E733D22687474703A2F2F7777772E6F6D672E6F72672F737065632F42504D4E2F32303130303532342F4D4F44454C2220786D6C6E733A7873693D22687474703A2F2F7777772E77332E6F72672F323030312F584D4C536368656D612D696E7374616E63652220786D6C6E733A7873643D22687474703A2F2F7777772E77332E6F72672F323030312F584D4C536368656D612220786D6C6E733A61637469766974693D22687474703A2F2F61637469766974692E6F72672F62706D6E2220786D6C6E733A62706D6E64693D22687474703A2F2F7777772E6F6D672E6F72672F737065632F42504D4E2F32303130303532342F44492220786D6C6E733A6F6D6764633D22687474703A2F2F7777772E6F6D672E6F72672F737065632F44442F32303130303532342F44432220786D6C6E733A6F6D6764693D22687474703A2F2F7777772E6F6D672E6F72672F737065632F44442F32303130303532342F44492220747970654C616E67756167653D22687474703A2F2F7777772E77332E6F72672F323030312F584D4C536368656D61222065787072657373696F6E4C616E67756167653D22687474703A2F2F7777772E77332E6F72672F313939392F585061746822207461726765744E616D6573706163653D22687474703A2F2F7777772E61637469766974692E6F72672F70726F63657373646566223E0D0A20203C70726F636573732069643D2265616D5F61737365745F73746F636B5F676F6F64735F75736522206E616D653D22E789A9E59381E9A286E794A8E794B3E8AFB72220697345786563757461626C653D2274727565223E0D0A202020203C73746172744576656E742069643D227369642D33386161356139372D323537332D343164652D616639342D38386237356464653866346322206E616D653D22E5BC80E5A78B222F3E0D0A202020203C757365725461736B20786D6C6E733A666C6F7761626C653D22687474703A2F2F666C6F7761626C652E6F72672F62706D6E222069643D2269645F3122206E616D653D22E7AEA1E79086E59198E5AEA1E689B92220666C6F7761626C653A666F726D4B65793D2265616D5F61737365745F73746F636B5F676F6F64735F757365223E0D0A2020202020203C657874656E73696F6E456C656D656E74733E0D0A20202020202020203C666C6F7761626C653A7461736B4C697374656E6572206576656E743D226372656174652220636C6173733D22636F6D2E7979792E666C6F7761626C652E6C697374656E65722E466C6F775461736B4C697374656E6572222F3E0D0A2020202020203C2F657874656E73696F6E456C656D656E74733E0D0A202020203C2F757365725461736B3E0D0A202020203C656E644576656E742069643D227369642D33663532643231622D313637392D346436382D383161332D64383261303431643766333422206E616D653D22E7BB93E69D9F222F3E0D0A202020203C73657175656E6365466C6F772069643D227369642D63646461393630302D636530662D343536332D616230312D3536393163363535336166382220736F757263655265663D227369642D33386161356139372D323537332D343164652D616639342D38386237356464653866346322207461726765745265663D2269645F30222F3E0D0A202020203C73657175656E6365466C6F772069643D227369642D38346336393936662D616266622D346635312D393737642D6233653939373431313038342220736F757263655265663D2269645F3122207461726765745265663D227369642D33663532643231622D313637392D346436382D383161332D643832613034316437663334222F3E0D0A202020203C757365725461736B20786D6C6E733A666C6F7761626C653D22687474703A2F2F666C6F7761626C652E6F72672F62706D6E222069643D2269645F3022206E616D653D22E58F91E8B5B7E4BABA2220666C6F7761626C653A666F726D4B65793D2265616D5F61737365745F73746F636B5F676F6F64735F757365223E0D0A2020202020203C657874656E73696F6E456C656D656E74733E0D0A20202020202020203C666C6F7761626C653A7461736B4C697374656E6572206576656E743D226372656174652220636C6173733D22636F6D2E7979792E666C6F7761626C652E6C697374656E65722E466C6F775461736B4C697374656E6572222F3E0D0A2020202020203C2F657874656E73696F6E456C656D656E74733E0D0A202020203C2F757365725461736B3E0D0A202020203C73657175656E6365466C6F772069643D227369642D35306434346164612D666338372D346364612D393438392D6138663166653738643566612220736F757263655265663D2269645F3022207461726765745265663D2269645F31222F3E0D0A20203C2F70726F636573733E0D0A20203C62706D6E64693A42504D4E4469616772616D2069643D2242504D4E4469616772616D5F74657374223E0D0A202020203C62706D6E64693A42504D4E506C616E652062706D6E456C656D656E743D2274657374222069643D2242504D4E506C616E655F74657374223E0D0A2020202020203C62706D6E64693A42504D4E53686170652069643D2273686170652D64643531363464352D386330362D343537302D393466622D346565346233333633656538222062706D6E456C656D656E743D227369642D33386161356139372D323537332D343164652D616639342D383862373564646538663463223E0D0A20202020202020203C6F6D6764633A426F756E647320783D223636302E302220793D222D3231352E30222077696474683D2233302E3022206865696768743D2233302E30222F3E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E53686170652069643D2273686170652D39376136303639362D393930392D343536312D626163612D306539346262353933326435222062706D6E456C656D656E743D2269645F31223E0D0A20202020202020203C6F6D6764633A426F756E647320783D223632352E302220793D2231302E343335393336222077696474683D223130302E3022206865696768743D2238302E30222F3E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E53686170652069643D2273686170652D39616566633864642D396566352D343830312D626161302D666339323337373762666334222062706D6E456C656D656E743D227369642D33663532643231622D313637392D346436382D383161332D643832613034316437663334223E0D0A20202020202020203C6F6D6764633A426F756E647320783D223636302E302220793D223135302E30222077696474683D2233302E3022206865696768743D2233302E30222F3E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E456467652069643D22656467652D62666436376533332D383836342D346531392D626262392D363162643562636331363530222062706D6E456C656D656E743D227369642D63646461393630302D636530662D343536332D616230312D353639316336353533616638223E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223637352E302220793D222D3138352E30222F3E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223637342E393939392220793D222D3133352E30222F3E0D0A2020202020203C2F62706D6E64693A42504D4E456467653E0D0A2020202020203C62706D6E64693A42504D4E456467652069643D22656467652D62313564303134392D326137382D346564352D393562642D613863326261396338376265222062706D6E456C656D656E743D227369642D38346336393936662D616266622D346635312D393737642D623365393937343131303834223E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223637352E302220793D2239302E3433353934222F3E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223637352E302220793D223135302E30222F3E0D0A2020202020203C2F62706D6E64693A42504D4E456467653E0D0A2020202020203C62706D6E64693A42504D4E53686170652069643D2273686170652D38356466613065622D306631322D343562322D386138632D373635376565626665366137222062706D6E456C656D656E743D2269645F30223E0D0A20202020202020203C6F6D6764633A426F756E647320783D223632342E39393939342220793D222D3133352E30222077696474683D223130302E3022206865696768743D2238302E30222F3E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E456467652069643D22656467652D33363765346630642D373063362D343133332D623833342D373139663166336666616130222062706D6E456C656D656E743D227369642D35306434346164612D666338372D346364612D393438392D613866316665373864356661223E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223637342E39393939342220793D222D35352E30222F3E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223637352E302220793D2231302E343335393336222F3E0D0A2020202020203C2F62706D6E64693A42504D4E456467653E0D0A202020203C2F62706D6E64693A42504D4E506C616E653E0D0A20203C2F62706D6E64693A42504D4E4469616772616D3E0D0A3C2F646566696E6974696F6E733E0D0A, 0); +INSERT INTO `act_ge_bytearray` VALUES ('250027', 1, '物品领用申请.eam_asset_stock_goods_use.png', '250025', 0x89504E470D0A1A0A0000000D49484452000002DF00000195080600000026219D530000177E4944415478DAEDDD7F6895F7BDC07161966D3028FDA394D25B7ACB2DBD657F8C4BB1B0315A42617483822BAB4B4E0C2E64CEB8DEB6739D856E6B51EAC6B5FBC15A5A701DA59DCE3B57449CCBB55A93F8B35669ACB3A9CECEAC5A8931364EAC388D56DBE73E9F079F70F2D3A8273FCC79BDE0438ECF3949E4F1FCF1F6CBF73CCFA449000030C29224F95C6B6B6BFDE2C58B372D5CB8F0C4A38F3E7AAEB6B636A9AAAA4A6A6A6A3EFDFEF7BF7FF6A73FFDE9FE679E7966693AFFE98C0100C06544F78A152B962C58B0E0DC9C397392175F7C31D9BE7D7BD2D1D1917477772721BE767575256FBFFD7692C679F2831FFCE0D31FFEF0871FCC9A356BA633080000C3904676DDCF7EF6B3338F3FFE7816D6E7CF9F4F866BD7AE5DC9134F3C71BEBEBE7EEFB469D36E733601006000693B4F5EB56AD5FAD9B367270D0D0D9714DD7DAD5DBB36A9ABAB3B6D151C00000608EF8D1B37BEF5C8238F24FBF6ED4B4AE1830F3E48D2903F3D73E6CCFF76860100E08258F18EF08E3DDCA5143F6FD6AC59270B85428DB30C0040D98B3DDEB1D5A4542BDE03AD80CF9831E3781AE07738DB000094ADB8AAC9D34F3F7D36F6788FA4D5AB579F9E3E7DFA36671C0080B2B572E5CAFF8DAB9A7CFCF1C7C9487BE8A1878ED87E020040598A55EFB88E775C4E7034BCF3CE3B67AD7E03005096E2CE95F121CB2BB9A4E0A5AAABAB3B525555F5EFCE3E000065256E19FFD24B2F25A3E937BFF9CDAE34BEE73AFB00009495850B179E885BC68FA637DF7CF38334BE1B9C7D0000CACAA38F3E7AAEB3B37354E3FBC891235D697CB73BFB00009495DADADAA4BBBB7B54E33B7E5F1ADFDDCE3E000065258DE0642CC4EF75F60100282BDFF9CE773E1DED95EFD3A74F1FB1F20D0040D979E49147CE8EF69EEFC3870FFFDD9E6F0000CACE534F3DD536DA573B79FDF5D75F73B5130000CACE2F7FF9CB9746FB3ADFF3E6CD5BED3ADF0000949D279F7CF23F1E7EF8E14F46F10E97DDD5D5D5EFBBC325000065E9B1C71EFBC7DB6FBF3D5A5B4E96A6E1BDC5590700A02C7DF7BBDF9DF6A31FFDE8DC28AC7E1FAFAEAEDE5928146A9C750000CA567D7D7D6B4343C3889677EC2F8F55EF8A8A8AC9CE380000652BF660D7D5D59DDEB76FDF8884776B6BEBAAF47774160A853B9C6D0000CA5E4D4DCDF4FAFAFA535D5D5D250DEF43870EBD515D5D7DD07613000028327DFAF4BA59B3669D2CD50A78AC7847785756563EE1EC0200401F692857D5D4D49CF8F39FFFFCAF2BF810E6F15FFFFAD7AFC45693746A9D5500001844EC01AFAEAE6EAEAFAF3FB273E7CED397721DEF75EBD62D4BE3BD253E5C698F3700000C3FC21F8C08AFADADED5AB870E19E37DE78E3604747476777777756DAA74F9F3E72F8F0E1BF373535FDDFFCF9F3D74C9F3E7D7F4477AC76BBAA0900005C8634AAFFAD5028CC49A37A793A07D2E94E27B9F0B53D9D86B865BC3B570200C00888F876160000407C030080F8060000C4370000886F000010DF000080F8060000F10D0000886F000010DF000020BE010000F10D0000E21B000010DF000020BE0100407C030000E21B0000C437000020BE0100407C030080F8060000C4370000886F0000407C030080F8060000F10D0000886F000010DF000080F8060000F10D0000E21B000010DF000020BE010000F10D0000E21B0000C437000020BE0100407C030000E21B0000C636B41B22B62F322DCE1400005C797C4F49E7DC50F15D595979BF33050000A509F03543C4F7B68A8A8AC9CE1200009426BEA70C16DF8542E19BCE1000009436C007DAFBDD62D51B00004A1FDFFDF67EDBEB0D000023248DED9556BD01006074E2FBCB457BBDBFEE8C0000C008CAF77E5BF5060080918FEF29EE700900C0B89624C9E4FDFBF72FDFBE7DFB27CDCDCD496363A319E5696A6A4A366FDEFCCF746ABC23010026B008EF2D5BB6245D5D5DC9D9B367CD18CDD1A347934D9B369D4843FC41EF4A0080092A56BC85F7B809F0B38D8D8D7BBD2B010026A8D86A227CC7CFA4F17DCEBB120060828A3DC7A2775CC5B70F8D0200947B7CFFEBA3CE647FCB2BC99EA6A7B389C7714C308B6F00004A18DF278F7724BB5F7F2A7967F5E3BD268EC573A2597C030050A2F86EDFF3977EE19DCFA13D0DA2597C030050AAF8DEBBE19941E33B9E13CDE21B008012C5F7EEC6F983C6773C279AC5370000E25B7C03007075C5775CDD64B0F88EE744B3F80600A044F1DDB6F58541E33B9E13CDE21B008012C5F7B18ED664F7BA79FDB79CA4C7E239D12CBE010028517CC71CD8B1A45F7CC731C12CBE010028657C9F3993B4BDB9A8FF9693F4583C279AC53700002588EFB883E5BEADCF0FBAE73B9E73974BF10D00C095C4F799334967DBFAE4DDB53F1934BCF389D7C46BAD828B6F00002E31BE2FB6DA6D155C7C030050A2F81ECE6AF750ABE0225A7C030030CCF8BEDCF0CE47448B6F00008619DF467C030020BEC5370000E2DB886F0000C4B7F80600407C1BF10D0020BE8DF80600407C8B6F0000C4B711DF0000886FF10D0080F836E21B00407C1BF10D0080F816DF0000886F23BE010010DFE21B0000F16DC4370080F836E21B0000F12DBE010010DF467C030020BEC5370000E2DB886F0000F13D16D3DCDC9C9C38712259B3664D0468D2DDDD9D343434249B366D1AF47BAEB9E69A64E6CC9997FCBBE2E75757578B6F0000CA2FBE23B4238877EEDC99DC76DB6DC95D77DDD52B94EFBBEFBE5EAF8FD7AD5AB52AF9CC673E93FCFCE73FCF5E73E0C081E41BDFF84676FC6B5FFB5A327BF6EC21E3FBDE7BEF15DF0000945F7C3FFBECB35910AF5CB932FB1AF11C113D63C68CECEB92254BB2E3ADADAD3DB19E47746D6D6DAF888FAFB17A7EEDB5D70E19DFD75F7FBDF80600A0FCE2FBBDF7DEEB15C6AFBEFAEAA0AF3D76EC5872CF3DF7F45AF9BEE9A69B92152B5624DFFEF6B7B3E337DE78633275EAD42157D93FFBD9CF8A6F0000CA2FBEF33975EA5416C6B1ED245FF58EED21757575BD5E77F2E4C9ECEB97BEF4A5E4CE3BEFCC1E1F3E7C38FBDEE3C78F67315F1CF4C5B36DDBB6EC75D75D775DCF4AB9F80600A0ECE23B56BC5F7EF9E56CDB48F14AF89C39737ABD2E3E88197BC3972F5F9EDC72CB2DD9C49694786D1EE6F1E1CDA1F67B6FD8B0217B2CBE010028CBF89E74615FF78E1D3BB238BE10A3FD56A86FBDF5D66C7F786C33C957C5F395EFF6F6F6ECCFB16A3ED8969308FCFCF72D5CB8507C0300505EF17DF3CD37F7DAA73D6FDEBC5E31DD37D223C063E53B8FEC58E98EE3B10AFEDBDFFE367BFCDC73CFF5FBBED8CE92FF79D7AE5DD9B1F840A7F80600A02CE27BF7EEDD3D2BDC3111D05FFCE2177BAE72F2D0430FF55AFD8E63F9F7C4C435C2F3ED267D57BA8BBFE781071EE8F79AA54B9766CF555454647BCEC53700001336BEE3039277DF7D77D2D6D6966CDDBA358BEEE2D5EEA3478F260B162CC80279F5EAD5D9969483070FF65ABDFEC52F7E916D4189EB7CDF7EFBED3D511E5746899F75C30D3764DB5406FB3BE437F619EBF321BE0100C4B711DF0000886FF10D0080F836E21B0000F12DBE010010DFE25B7C0300886F23BE010010DFE21B0000F16DC4370000E25B7C030020BEC5B7F8060010DF467C030020BEC5370000E2DB886F0000C4B7F80600407C8B6FF10D0020BE8DF80600407C8B6F0000C4B711DF0000886FF10D0080F816DFDE950000E2DB886F0000C4B7F80600407C1BF10D0080F816DF0000886FF10D0080F836E21B00802BD0DCDC2C7AC7CF74A7F17DCEBB12006082DABC797367575797F01D07D3D1D1F1A734BEF77A5702004C50EBD7AF9FBA71E3C68F3EFCF0C3D30278EC56BC23BC9B9A9A0EA6F3A0772500C0049606DFFD8D8D8D2DB1E521F61C5FAD53555575B5FEDDE3BCEF15DE00005C3522BE9D05000010DF000020BE010000F10D0000E21B0000C437000020BE0100407C030000E21B0000C4370000886F0000407C030080F8060000C4370000886F000010DF000080F8060000F10D0000886F000010DF000020BE010000F10D0000E21B000010DF000020BE0100407C030000E21B0000C437000020BE0100407C030080F8060000C4370000886F0000407C030080F8060000F10D0000886F000010DF000080F8060000F10D0000E21B000010DF000020BE010000F10D0000E21B0000C437000020BE0100407C030000E21B0000C4370000886F0000407C030080F8060000C43700008C616837446C5F645A9C290000B8F2F89E92CEB9A1E2BBB2B2F27E670A00004A13E06B8688EF6D151515939D250000284D7C4F192CBE0B85C2379D210000286D800FB4F7BBC5AA370000943EBEFBEDFDB6D71B000046481ADB2BAD7A0300C0E8C4F7978BF67A7FDD190100801194EFFDB6EA0D0000231FDF53DCE1120080712F4992C9FBF7EF5FBE7DFBF64F9A9B9B93C6C6C6AB7222BEAFD6BF7B535353B279F3E67FA653E31D0900308145786FD9B225E9EAEA4ACE9E3D6BC6688E1E3D9A6CDAB4E9441AE20F7A5702004C50B1E22DBCC74D809F6D6C6CDCEB5D09003041C55613E13B7E268DEF73DE9500001354EC3916BDE32ABE7D701400A0DCE3FB5F1F7526FB5B5E49F6343D9D4D3C8E6382597C030050C2F83E79BC23D9FDFA53C93BAB1FEF35712C9E13CDE21B008012C577FB9EBFF40BEF7C0EED6910CDE21B008052C5F7DE0DCF0C1ADFF19C6816DF00009428BE7737CE1F34BEE339D12CBE010010DFE21B0080AB2BBEE3EA2683C5773C279AC5370000258AEFB6AD2F0C1ADFF19C6816DF00009428BE8F75B426BBD7CDEBBFE5243D16CF8966F10D004089E23BE6C08E25FDE23B8E0966F10D004029E3FBCC99A4EDCD45FDB79CA4C7E239D12CBE010028417CC71D2CF76D7D7ED03DDFF19CBB5C8A6F0000AE24BECF9C493ADBD627EFAEFDC9A0E19D4FBC265E6B155C7C03007089F17DB1D56EABE0E21B008012C5F77056BB875A0517D1E21B008061C6F7E586773E225A7C030030CCF836E21B0000F12DBE010010DF467C030020BEC5370000E2DB886F0000F16DC4370000E25B7C030020BE8DF80600407C8B6F0000C4B711DF0000E2DB886F0000C4B7F80600407C1BF10D0080F816DF0000886F23BE0100C4B711DF0000886FF10D0080F836E21B0000F12DBE010010DF467C030088EF52CC4B2FBD94AC5EBDBAD7B1F457262B57AE2C69ACAE5AB52A9931634636F1387EC7860D1B86FCBE78CDAF7EF5AB8BBE66EEDCB9D9E3575F7D35E9EEEEEE39BE74E952F10D00C0F889EF88D4DB6FBF3D0BE29B6EBA2979EBADB7B263DFFAD6B77A22F9D4A953C9912347927BEFBD373B1651FB95AF7C25A9AAAAEA89EAF8BA64C992E4F39FFFFC80BF63F9F2E5170DFC4D9B36F5FA7937DE786372F7DD77678F6356AC5891DC7AEBADFD7E4EFC07227F1C7F87FC71C4B8F80600605CC47784EAEEDDBB93975F7E39696B6BCB56A2F3602D0ED97C22C2E378BE521E8FE37BE36B047344F9CD37DF3C607C7FF5AB5FEDB7F2BD75EBD67EAF2B0EE6F8F382050B7AFE7CCD35D7243FFEF18FB3C7070E1CE8F939F7DC734FF6778DC7EFBDF75ECFF7B6B6B6665F9F7BEE39F10D00C0D8C677AC2447C0C6EA72447484EDF5D75F9F1DBBE38E3B923FFEF18F59BC1E3A74A85710C7F3F9E388F7F81AAF3D7CF870F6B8BDBDBDE7F5CDCDCDD9B1BABABA5EF11DBF277E47F1DFE7E4C993D9EBF395EEFCFBE2F1030F3C907DEF40615FBCF27DC30D3724EBD6ADCB1EC72A79ACA65BF90600604CE33BB691E4F1FCFBDFFFBEDF9EEC5B6EB925F9DBDFFE96BD2656C54F9C38D113C411BBCF3FFF7CCF76924943AC7CE7CFC5E3F7DF7F3FFB9917DB8E921F2B0EFD356BD624D75E7BED80F11D2BDF3B76ECC81E6FDBB6ADE778FC1D6D3B010060CCE33B26823A0FD5BBEEBAAB27BC63453C8E452CF75D998EE3B1B29C7F5FBEDA1D2BDFF17C847ADF38AEADADEDD9E6521CD083C5776C51E9BBF21DFBBFA74E9DDAF3BAD852121FB48CD7FCEE77BF1B30DCEDF9060060DCC4F760111C570C890F5E0EF6DA7C353A223C8FE458F5BEEFBEFBFA6D0D9954B4F21D8F1F7BECB192C477ACDCC77F0E26F5D906531CDFF99EEFE26D33E21B0080318FEF7CE53B5FFD8E0F37EEDAB5ABDF6BAFBBEEBAE4CE3BEFCCF65217AF9CC7CAF7603F3B56D28F1D3B963D6E6868C8F67B1F3C7870C0C08FED2503857E7C90B278CBCA607BBE23B8F32D28F1A1CC88F1FCF283E21B00807119DF93FA5C8D245F658ECB12C65693B8EC607EE9C1491756B7F3C711DBC53F3F423B8E3FFBECB3D99FE30399353535035EF164B055F6BE135B5CF26D30B1673D7F7D4CC4767C9D376F5EF635BF428AF80600605CC477AC48F73DD6378C23768BB7A60CF533E3F9B87249AC3CC78737F355F2BEBF63CE9C399715DFF9D55A26F5F99065FED81D2E01001897F16DC4370000E25B7C030020BEC5370000E2DB886F0000C4B7F80600407C1BF10D0080F816DF0000886FF10D0080F836E21B0000F12DBE010010DF467C030020BEC5370000E25B7C030020BE8DF80600407C8B6F0000C4B711DF0000886FF10D0080F816DF0000886F23BE010010DFE21B0000F16DC4370000E25B7C030020BEC5370000E2DB886F0000C4B7F80600407C1BF10D00C0A449CDCDCDA277FC4C771ADFE7BC2B010026A8CD9B377776757509DF71301D1D1D7F4AE37BAF772500C004B57EFDFAA91B376EFCE8C30F3F3C2D80C76EC53BC2BBA9A9E9603A0F7A5702004C6069F0DDDFD8D8D8125B1E62CFF1D538555555C9D5FA77BF70DEF70A6F0000AE0A11DFCE020000886F000010DF000080F8060000F10D0000E21B000010DF000020BE010000F10D0000E21B0000C437000020BE0100407C030000E21B0000C4370000886F0000407C030080F8060000C4370000886F000010DF000080F8060000F10D0000886F000010DF000020BE010000F10D0000E21B000010DF000020BE0100407C030000E21B0000C437000020BE0100407C030080F8060000C4370000886F0000407C030080F8060000F10D0000886F000010DF000080F8060000F10D0000E21B000010DF000020BE010000F10D00006319DA0D11DB179916670A0000AE3CBEA7A4736EA8F8AEACACBCDF99020080D204F89A21E27B5B4545C564670900004A13DF53068BEF42A1F04D670800004A1BE003EDFD6EB1EA0D0000A58FEF7E7BBFEDF50600801192C6F64AABDE0000303AF1FDE5A2BDDE5F774600006004E57BBFAD7A03004089555757FF571ADBF30B85C2B2F4EBBBE99CBAB0FADD7DE1CFCBD35910ABE2CE1600005CA2DADADACFA531FD701ADCFF18C6DD2D8B3F80F9D7F4EBEC69D3A67DC1590400808B88BDDCE97C7029D13DC0B4A753E16C0200C00062B53B0DE657D2F03E5F1CD2E9F1E485175E48B66EDD9A74747424A74E9D4A42777777D2D5D595ECDAB52B59B46851525757375084FF217EAEB30B000017C48727D3507EA3389C67CF9E9DAC5DBB36F9F8E38F93E1387FFE7CD2D8D8987D5F9F005F6E1B0A00004CEA59F1EE15DE8B172FEE59E1BE54B122BE6CD9B27E01EEEA28000094BDD86A521CCA0D0D0D4929C42AF8F4E9D37B6D4171B60100285B173E5C79BED4E15D1CE07D56C02B9C750000CA4E6C3729BEAA496C3519097DB6A0B4DBFF0D0040D989EB78177FB8F272F7780F670F789F0F61CE75F60100282BC537D089AB9A8CA43EDB4F0EF8F025000065E3C22DE37BAEE33DDCCB095EAEB80CE1F7BEF7BDE23B61BA153D0000E5210DE0F97908C70D7446C38B2FBE58BCFABDC0BF02000065A150282CCB4378FBF6EDA312DF7127CCE2EB7EFB570000A02CA4F1FB6E1EC29D9D9DA312DF712BFAA2F8DEEB5F0100807289EFEE3C8447EA2A27035DF5A428BEBBFD2B0000502EF1DD13C2A3A9F8F7FA570000A05CE2FBA4956F000018059595957FB5E71B00004681AB9D0000C02849E3F749D7F906008051301677B89C3973E6A7EE70090040594A23B8258FE1B56BD78E687C37363616AF7A1FA8A8A898EC5F000080B251281466E6413C7BF6EC11BBEA495CE5A4BEBEFE93A2F89EEBEC030050566A6B6B3F17ABD079142F5EBC7844E27BD9B265C5ABDEEDD3A64DFB82B30F0040D94963B8229D73791CBFF6DA6B250DEFF5EBD7F7BAB14EFC3E671D0080720EF0578A03B954011EE13D63C68CF3453FFB0FCE360000652D3EFC18615C1CE0B10525F66A5FEE1EEF3E5B4DB2EB7AC73617671B0000019E0678F18D77F20F61C65550E23281C3BD9C60AC76F7F9706516DEF6790300409F00BFB005E55C713CC775C0172D5A94B4B4B464B7A2CFAF8A122BDC71CBF8D6D6D6EC063A69747FDA27BAB3AD2656BC01006010173E8479608090BE9469F7E14A0000188658ADAEACAC7C380DE8B64B8CEE88F6B9B6990000C06548637A4A3A4FC69EF034C8FF9A3EEEBE10DAF1756FECE94E9FFB9FB865BC3B570200000000000000000000000000000000000000000000B9FF07B913B8ED3A1ED4310000000049454E44AE426082, 1); +INSERT INTO `act_ge_bytearray` VALUES ('250030', 1, '设备报修维修.bpmn', '250029', 0x3C3F786D6C2076657273696F6E3D22312E302220656E636F64696E673D225554462D38223F3E0D0A3C62706D6E3A646566696E6974696F6E7320786D6C6E733A7873693D22687474703A2F2F7777772E77332E6F72672F323030312F584D4C536368656D612D696E7374616E63652220786D6C6E733A62706D6E3D22687474703A2F2F7777772E6F6D672E6F72672F737065632F42504D4E2F32303130303532342F4D4F44454C2220786D6C6E733A62706D6E64693D22687474703A2F2F7777772E6F6D672E6F72672F737065632F42504D4E2F32303130303532342F44492220786D6C6E733A64633D22687474703A2F2F7777772E6F6D672E6F72672F737065632F44442F32303130303532342F44432220786D6C6E733A64693D22687474703A2F2F7777772E6F6D672E6F72672F737065632F44442F32303130303532342F44492220786D6C6E733A666C6F7761626C653D22687474703A2F2F666C6F7761626C652E6F72672F62706D6E222069643D22446566696E6974696F6E735F3031616371666B22207461726765744E616D6573706163653D22687474703A2F2F62706D6E2E696F2F736368656D612F62706D6E223E0D0A20203C62706D6E3A70726F636573732069643D2265616D5F6465766963655F72657061697222206E616D653D22E8AEBEE5A487E68AA5E4BFAEE7BBB4E4BFAE2220697345786563757461626C653D2274727565223E0D0A202020203C62706D6E3A73746172744576656E742069643D224576656E745F306A78373275352220666C6F7761626C653A696E69746961746F723D22696E69746961746F72223E0D0A2020202020203C62706D6E3A6F7574676F696E673E466C6F775F3135716C786C613C2F62706D6E3A6F7574676F696E673E0D0A202020203C2F62706D6E3A73746172744576656E743E0D0A202020203C62706D6E3A757365725461736B2069643D2269645F3022206E616D653D22E58F91E8B5B72220666C6F7761626C653A666F726D4B65793D2265616D5F6465766963655F726570616972223E0D0A2020202020203C62706D6E3A657874656E73696F6E456C656D656E74733E0D0A20202020202020203C666C6F7761626C653A61737369676E6565547970653E7374617469633C2F666C6F7761626C653A61737369676E6565547970653E0D0A20202020202020203C666C6F7761626C653A73746174696341737369676E65655661726961626C65733E5B5D3C2F666C6F7761626C653A73746174696341737369676E65655661726961626C65733E0D0A20202020202020203C666C6F7761626C653A7461736B4C697374656E657220636C6173733D22636F6D2E7979792E666C6F7761626C652E6C697374656E65722E466C6F775461736B4C697374656E657222206576656E743D2263726561746522202F3E0D0A2020202020203C2F62706D6E3A657874656E73696F6E456C656D656E74733E0D0A2020202020203C62706D6E3A696E636F6D696E673E466C6F775F3135716C786C613C2F62706D6E3A696E636F6D696E673E0D0A2020202020203C62706D6E3A6F7574676F696E673E466C6F775F31366F36376F773C2F62706D6E3A6F7574676F696E673E0D0A202020203C2F62706D6E3A757365725461736B3E0D0A202020203C62706D6E3A73657175656E6365466C6F772069643D22466C6F775F3135716C786C612220736F757263655265663D224576656E745F306A783732753522207461726765745265663D2269645F3022202F3E0D0A202020203C62706D6E3A757365725461736B2069643D2269645F3122206E616D653D22E5A484E7BDAE2220666C6F7761626C653A647565446174653D22247B647565446174657D2220666C6F7761626C653A666F726D4B65793D2265616D5F6465766963655F726570616972223E0D0A2020202020203C62706D6E3A657874656E73696F6E456C656D656E74733E0D0A20202020202020203C666C6F7761626C653A61737369676E6565547970653E7374617469633C2F666C6F7761626C653A61737369676E6565547970653E0D0A20202020202020203C666C6F7761626C653A73746174696341737369676E65655661726961626C65733E5B5D3C2F666C6F7761626C653A73746174696341737369676E65655661726961626C65733E0D0A20202020202020203C666C6F7761626C653A7461736B4C697374656E657220636C6173733D22636F6D2E7979792E666C6F7761626C652E6C697374656E65722E466C6F775461736B4C697374656E657222206576656E743D2263726561746522202F3E0D0A2020202020203C2F62706D6E3A657874656E73696F6E456C656D656E74733E0D0A2020202020203C62706D6E3A696E636F6D696E673E466C6F775F31366F36376F773C2F62706D6E3A696E636F6D696E673E0D0A2020202020203C62706D6E3A6F7574676F696E673E466C6F775F306F6B6A6671643C2F62706D6E3A6F7574676F696E673E0D0A202020203C2F62706D6E3A757365725461736B3E0D0A202020203C62706D6E3A73657175656E6365466C6F772069643D22466C6F775F31366F36376F772220736F757263655265663D2269645F3022207461726765745265663D2269645F3122202F3E0D0A202020203C62706D6E3A757365725461736B2069643D2269645F3222206E616D653D22E9AA8CE694B62220666C6F7761626C653A647565446174653D22247B647565446174657D2220666C6F7761626C653A666F726D4B65793D2265616D5F6465766963655F726570616972223E0D0A2020202020203C62706D6E3A657874656E73696F6E456C656D656E74733E0D0A20202020202020203C666C6F7761626C653A61737369676E6565547970653E7374617469633C2F666C6F7761626C653A61737369676E6565547970653E0D0A20202020202020203C666C6F7761626C653A73746174696341737369676E65655661726961626C65733E5B5D3C2F666C6F7761626C653A73746174696341737369676E65655661726961626C65733E0D0A20202020202020203C666C6F7761626C653A7461736B4C697374656E657220636C6173733D22636F6D2E7979792E666C6F7761626C652E6C697374656E65722E466C6F775461736B4C697374656E657222206576656E743D2263726561746522202F3E0D0A20202020202020203C666C6F7761626C653A61737369676E6565547970653E7374617469633C2F666C6F7761626C653A61737369676E6565547970653E0D0A2020202020203C2F62706D6E3A657874656E73696F6E456C656D656E74733E0D0A2020202020203C62706D6E3A696E636F6D696E673E466C6F775F306F6B6A6671643C2F62706D6E3A696E636F6D696E673E0D0A2020202020203C62706D6E3A6F7574676F696E673E466C6F775F31366B3834667A3C2F62706D6E3A6F7574676F696E673E0D0A202020203C2F62706D6E3A757365725461736B3E0D0A202020203C62706D6E3A73657175656E6365466C6F772069643D22466C6F775F306F6B6A6671642220736F757263655265663D2269645F3122207461726765745265663D2269645F3222202F3E0D0A202020203C62706D6E3A656E644576656E742069643D224576656E745F306E6172317574223E0D0A2020202020203C62706D6E3A696E636F6D696E673E466C6F775F31366B3834667A3C2F62706D6E3A696E636F6D696E673E0D0A202020203C2F62706D6E3A656E644576656E743E0D0A202020203C62706D6E3A73657175656E6365466C6F772069643D22466C6F775F31366B3834667A2220736F757263655265663D2269645F3222207461726765745265663D224576656E745F306E617231757422202F3E0D0A20203C2F62706D6E3A70726F636573733E0D0A20203C62706D6E64693A42504D4E4469616772616D2069643D2242504D4E4469616772616D5F31223E0D0A202020203C62706D6E64693A42504D4E506C616E652069643D2242504D4E506C616E655F31222062706D6E456C656D656E743D2274657374223E0D0A2020202020203C62706D6E64693A42504D4E53686170652069643D224576656E745F306A78373275355F6469222062706D6E456C656D656E743D224576656E745F306A7837327535223E0D0A20202020202020203C64633A426F756E647320783D222D3335382220793D222D333038222077696474683D22333622206865696768743D22333622202F3E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E53686170652069643D2241637469766974795F313036316736755F6469222062706D6E456C656D656E743D2269645F30223E0D0A20202020202020203C64633A426F756E647320783D222D3237302220793D222D333330222077696474683D2231303022206865696768743D22383022202F3E0D0A20202020202020203C62706D6E64693A42504D4E4C6162656C202F3E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E53686170652069643D2241637469766974795F3065747062726B5F6469222062706D6E456C656D656E743D2269645F31223E0D0A20202020202020203C64633A426F756E647320783D222D3131302220793D222D333330222077696474683D2231303022206865696768743D22383022202F3E0D0A20202020202020203C62706D6E64693A42504D4E4C6162656C202F3E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E53686170652069643D2242504D4E53686170655F31756F72763274222062706D6E456C656D656E743D2269645F32223E0D0A20202020202020203C64633A426F756E647320783D2232302220793D222D333330222077696474683D2231303022206865696768743D22383022202F3E0D0A20202020202020203C62706D6E64693A42504D4E4C6162656C202F3E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E53686170652069643D224576656E745F306E61723175745F6469222062706D6E456C656D656E743D224576656E745F306E6172317574223E0D0A20202020202020203C64633A426F756E647320783D223135322220793D222D333038222077696474683D22333622206865696768743D22333622202F3E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E456467652069643D22466C6F775F3135716C786C615F6469222062706D6E456C656D656E743D22466C6F775F3135716C786C61223E0D0A20202020202020203C64693A776179706F696E7420783D222D3332322220793D222D32393022202F3E0D0A20202020202020203C64693A776179706F696E7420783D222D3237302220793D222D32393022202F3E0D0A2020202020203C2F62706D6E64693A42504D4E456467653E0D0A2020202020203C62706D6E64693A42504D4E456467652069643D22466C6F775F31366F36376F775F6469222062706D6E456C656D656E743D22466C6F775F31366F36376F77223E0D0A20202020202020203C64693A776179706F696E7420783D222D3137302220793D222D32393022202F3E0D0A20202020202020203C64693A776179706F696E7420783D222D3131302220793D222D32393022202F3E0D0A2020202020203C2F62706D6E64693A42504D4E456467653E0D0A2020202020203C62706D6E64693A42504D4E456467652069643D22466C6F775F306F6B6A6671645F6469222062706D6E456C656D656E743D22466C6F775F306F6B6A667164223E0D0A20202020202020203C64693A776179706F696E7420783D222D31302220793D222D32393022202F3E0D0A20202020202020203C64693A776179706F696E7420783D2232302220793D222D32393022202F3E0D0A2020202020203C2F62706D6E64693A42504D4E456467653E0D0A2020202020203C62706D6E64693A42504D4E456467652069643D22466C6F775F31366B3834667A5F6469222062706D6E456C656D656E743D22466C6F775F31366B3834667A223E0D0A20202020202020203C64693A776179706F696E7420783D223132302220793D222D32393022202F3E0D0A20202020202020203C64693A776179706F696E7420783D223135322220793D222D32393022202F3E0D0A2020202020203C2F62706D6E64693A42504D4E456467653E0D0A202020203C2F62706D6E64693A42504D4E506C616E653E0D0A20203C2F62706D6E64693A42504D4E4469616772616D3E0D0A3C2F62706D6E3A646566696E6974696F6E733E0D0A, 0); +INSERT INTO `act_ge_bytearray` VALUES ('250031', 1, '设备报修维修.eam_device_repair.png', '250029', 0x89504E470D0A1A0A0000000D494844520000022C0000005A08060000009B930D1C000010EB4944415478DAED9D7D6C54551AC64DD4648D26FAC71AD7A851136288D9A8316BDC3F5663CC1A35D1E01FD6C20022AD2822A915178808B25411612B208528DA08CB12B1E9CAC736845DA0D096E054218485F291EDF225944281055A2A528A77CF7333677267E87466DA99B9339DDF93BC99E99D7EDCE93CF7799FFB9EF79C73CD3520AD701CE7BA83070F563736365EA9ADAD75366CD8406438366EDCE83434349C363102FEC1877CE41F3C800700C4854462CB962D4E5B5B9B73E9D225C2A73875EA94535F5F7FDE88C68BF08FC837FEC1037800405CE88E0691C81AB1B864EE74F6C13F22DFF8070FE0010071A1F22B1769F684118ACBF08FC837FEC1037800405C68EC920B34AB84C2817F44BEF10F1EC0030052261417CEB53A07B72D71F66C2C7343CF758C8B1BA1807FF00F1EC00300B242283ACEB6384DFF9AE6FC7BEDC488D031BDC6058E50C03FF8070FE00100BE0BC5D13DFFB84A246C1CDB53C3058E50C03FF8070FE00100FE0BC5BECDB3630A855EE3024728E01FFC8307F00000DF85A269C39F630A855EE3024728E01FFC8307F000008402A1807FF00FC3020FD021806189475E75E3C7120ABDC6058E50C03FF8070FE00100BE0B45F3D685318542AF71812314F00FFEC103780080EF4271A66597D3B47EFAD56558734CAF71812314F00FFEC103780080EF42A138B47DD95542A1635CDC0805FC837FF0001E00901D42F1F3CF4EF3779F5D5D8635C7F41A17384201FFE01F3C800700F82A145A41F23F5B2B628E1DEB3556994428E01FFC8307F000007F84C2DCB1B4366F7276FF734A4C91B0A1EFD1F772978350C03FF8070FE0010019138A787733DCE52014F00FFEC103780080EF4291C8DD4C6F77395CF00805FC837FF0001E009076A1E8AB48D8E0824728E01FFC8307F00080CC8C1D130805FC837FF0001EE4005E79E5955B860E1DFAA2890A134113AD261C4FE8EB606161E197C3860D1B61E2D75971E2C78E1D7B70D5AA55F3172D5AD43475EAD48EF1E3C75F193E7C78F8C4C78C19D3F5CE3BEF9C99316346437979F958F3467F8561E1024528E01F816121724B878C0179CEE4F51A6340BAA30C4ADC303FB3C1C40B4F3CF1C475193D69C771AE0B068393162C58D06A0C89336BD62C67E5CA95CECE9D3B9D969616A7BBBBDBB13873E68CB36BD72E67F5EAD5CEC2850B1D6358BA274E9CF85D5151D183181602A1807FF00F1EC083ECD62163387E67CC4663B22625466C33BFEB998C9C787D7D7DD1BC79F33AC68D1BE75457573BADADAD4E32387BF6ACFBE1BCF9E69B974B4A4AB69A93BF8784412014F00FFEC10378905D5035C4988B593D5554264F9EEC7A80AD5BB73A3FFEF8A373F1E24537C7777575B95F373636BA858C69D3A6C5322E15691B715155A5AAAA6A77515191B362C58AF0C9F515AAC2A8EA3272E4C8CBC5C5C5934918044201FFE01F3C8007D981E1C387DF195D5531F9DA59B26449D2858AC3870F3B9595951A6189362DBBF577527AE2E6E4EEA9A8A8682B2D2D75FF702AA1DFF7F6DB6F5F1C3366CCF27CE86F4128100AF8476058886CD621635406070281E35E73A1D68FB6B6B67EE57BB588949595459B96A3291B699159D11090CA3A1ACE490754AD99397366677171F1BA8C37E4201408058685C0B010E850B8B2E2352BAAAAD4D5D545F4A6F6175BB66C717F6F4A4D8B868154599159E9EF10502243441F7EF861BB791395240C02C302FFE01F3C8007BEF4AC84878134E377FFFEFD69C9F9EA71891A22DA5D505070539F4F5E3D2B1A066A6F6F77320199A292929276F34F9A44C220302CF00FFEC1037890D1A1A059DECA4ABACC8AD7B478974151236E9F4EBCA1A1618C1A6C53DDB392484F8B7903178DD31A44C220302CF00FFEC10378907E84A62E87670369182813D0F050D47A2DC94D79D650D0279F7C7241B381FCC0CA952BCF19D3B29284416058E01FFC8307F02023D595466F836D2A7B56E221AA11775B52BDAC5A144EEBACA4BB6FA5B77E96A2A2A2938140E02112068161817FF00F1EC083F421B4826D7828A8BFB381FA327BC8DBCFA21571133EF9B973E7B66A41183F515353A3AEE1BF9130080C0BFC837FF0001EA47538A8C69A05ADB3E207962F5F1EB18C7F4227AEBD81B4DC7EB20BC3A41A9A421D0804FE37D0D6664128100AF8476058886CD1216D64E8ED5DF12BF7ABAAE36DC04D68C3446D643867CE1C271BF0EEBBEF6E53A92A1712416863A73F20140805FC23FCE21F3C8007C9F221B4EB7278B97D3FE15DC65FBB3CC77D830B162CD8A3F5FFB3014B972EDDDDE7694E992FA9854B59C664FD1EA1C0B0C03F22D3FC8307F020593E28C7DAEFF3BB1544DEC39E8B39DF2FE3BEC1A953A77668D7E56CC08E1D3B9ACD890773296178625D4FCE16A1C0B0C03F22DD86051EA04389F24139D6BEAE8D0CFD84D665F19C6BFCDC3F7EFCF82B7EF7AF589C3E7DFA8239E9D61C4D186167EB2508428161817F44060D0B3CC0B0F4CA07E5587B5CBB2CFB89969616EF79C6CFFD6A7AC9E4FCEB78D089E772C2F03A5B95E4100A0C0BFC23326D58E0018625161FBC5F777575F99AEFF5F7BDE793D01BCC2624F00FCFA94028B22B061ABFE01FFC8307F0A0AF916D393FD72A2C1D03A0C2E2CE74B22BF7E58250D4D6D63AE7CF9F77D6AD5BA7FFBDBB80604D4D8D535F5F1FF367AEBFFE7AE7D5575FE5CE06FEA524C4BB65CB96C5E597B879D75D77394F3EF9A4B366CD1A375E7EF96537F43CFAF7E4718525277820DD79ECB1C7DCCFEED9679F755E7FFDF5084EE873ED8D33959595E1E79AF14285253E1FBCC7FD5A2CB6CF159637DE78E352B6F4B09C3C79B229877B5822042257C68E45585DEC3B76EC70060D1AE43CF2C8231182F0F4D34F477CBFBE4FE272EDB5D73A3367CE74BFE7D0A143AED8E8F8534F3DE58C1D3B16C302FF128EBD7BF7BA3CF29EABBED64A98B112D5AE5DBBDCC72FBEF8C2E9E8E8709F6BE3367B2C8F0D4BCEF1409A220E3CFAE8A3EE7BD0B1E3C78FBB9FE5F3CF3FDFAB61110F3A3B3BDDE75A880CC3129F0FDE1E964CEF1DD8EF1E964993269DC8965942C160B02E07670905B5AC70ACBD10B23D61CC9F3FDFBDD857AD5AE53ECA70D8BB563DEA6ED50A8335383D25147B5C559A9B6FBE19C302FF120E190C5554C4373DCA78C83CBFF4D24B310DF6A2458BC209EDDB6FBF0D5756F4A8DF938786256779A0CF6CFBF6EDEEE3FAF5EBC3C79497B4519EB810FDFD7ACDEA52555595FBBCB4B4345C75D3D73FFCF0433E1B96987CC8E95942656565EBB3651D96B973E7D6E4D03A2C3DDEC9E45AC25072F00A812EFE58DFABFD1F1E7FFCF1880ACB1D77DCE1260C25171DBFFDF6DB9D2143866058E05F5209CBDE1DEBF9E6CD9B9DCF3FFFDCF9F4D34F23CAFE0A9BD834746013D3DD77DF1D91A864C2F3C8B0E43C0FF499353535851F070F1EACBDE5C2AF4F9F3EDDB9F1C61BDD4A4C7485CDFEDC881123220CADD617C9D30A4B5C3E78D76191DEE7D43A2CB367CF1E5D5E5EFE4B361816234235B9B2D26DA2C8951E025B56D59090ADAEA84FC02B1C0A95DFF5F8C0030F380F3FFC7044F956DB2BC800794D108605FEF516963B32BD36D9D8BB6755F04E9D3A1531CC239E3637373B5F7FFD75D8A02859D9E7BDF55DB1347FF60E49DB8A99CE5377FDF60648955FDD14BDF7DE7B11D55D6B58264C98E09A16DD28E9B56030E81E176FE0414CC392BB2BDD6AEF1E9394BA74F7ECF31A2CEA5F39C55E42FE849CF6575F7DE50EE978EF7C5466F57E9F9A7155A2D51D8CEE6C15563CAC9951231D4201FF12BDBB3E70E0809B98C42D3B9CE81D729411F6FE8C3531B6DAE7ADAE68088144955B3C500F9C970F4A5EFACCAD8EE875E5A79E7A982A2A2AC2C7ACF9FDF8E38F69FEEF3DE7DF62FEC797AD51D0F5E7D75E428140E097A4F612128CCBDA2CB1F01386787F65B7667F13874440257795E4431754F8AEC6C6BDF7DEEB2617DD01D9EA8B158AA3478FBA5FE7530F01FCEB7BD866593D9697974754487A6BBA55F2B286257A86108625F7782003AA1BA6B56BD7863F77CD5CD4739916DB5BE7ADC87CF0C107E1C902F62649C3883A76ECD8310C4BFC2A4B78B7E6C58B17E7CE6ECD82493C0FBEF6DA6BDD7E4D71EAEEEE3E6A4EF8BFC66D3D44C2C87C689AA8B7EF4463C65E03126D6C645A5461B1C6C48A8AAA2D5634D47F8050C0BF4463E9D2A5110948CFC5C3DE0C4BF47BCBE7DE855CE58186FAF4B9A91FCE1A583B24A8066C19503DD730A0FD19DB4C6B8712BD9FBF82E515E243AD17D62C8C1C39D2AD766412BA86478D1AE5ADAEBC90D41B78EBADB7EAFD6ABEFDE8A38F969A93AE2661643E6CD39ACCAA42A6E3FEFBEF0FCFB818376E5C4495C5DBE8A6D09D901D0A8A1E9B4628E05F22A1EAEE0D37DC104E4EEA8FD2D0E48913275C6E29BC7CA2C2327078A0CF52433EBA39926955D82A8AB44515DF5B6FBDB5D7AAB0E5839E6B585BCFF5080FE25659C2B385CACACA32BA1E9BFE9E77EA75BCA6F1AB505050F09BD1A3475FCAF4BCECBD7BF7D69B13EE307F7F100923B3A171622DDAA4BB1735BAC9A878AB2A2AD5DAD2ABCAB5128F23478E845FD79DD09C3973DCE121ADC372DF7DF7858D8C77CC19A1807F3D850C896684A871D27B5C4392E2959A69C5A5DB6EBBCDADE2A9995BC6C44E63D5D041B461B1959A6C5D9303C3D2736826D835A1B57464446D7F92CC8AFD6CBDFD75D6B0A8DA621B6EA36792D9FE1678D0338C6EFFD1BB664B5D5D5D4672BE6E2AA2F6397AA64F6F20100894949696FE94A9A1A1CECECE3DE66FEE3127FD2712068161817FF166B2656BE50EC392DACF191DCA5895E52FD63868D57B998974AFBB626E447EF11896FE2D63525C5CBC6CC68C1969372DDDDDDD878B8A8A369913FE8C84416058E01FFC8307F020B3082DD51FF49A96742D2627B3326AD4A82B1EB3B2BBA0A0E0A67EBF016324D6BCFFFEFBEDE9322DAAAC1863B4597D2B036D1A33428150C03F02C342E48A0E199372A7C9C5CD5ED3A2E1A154F6B4A872135559396AE29E94B9AE4020B0B8A4A4A43DD53D2DEA59090D037D36D0CD0A428150C03F02C34264BB0EC93C784D8B6DC4EDEFEC21F5324635D8A6D6AC7851585838DEB8AD0B55555567B5AB627FA72E876603750CE49E158402A1807F048685C8351D0A555A825E73A129CF4B962C7192DD205946478DEFDEA9CB7618282D66C542B387860D1BF677F387CF5557571F308EE972B22BD86A5138F33BF66B08C83C0E2661100805FC837FF0001E641734BA52585838AF875D9F9D2953A6B833F4D4E3A291175BC4D0A3765D568FCAEAD5ABDDE5F6BD2BD87A1B6CFBDDB39244B5E5B7DA9CC89C48FB84091376565656EEFCFEFBEF0F1C3F7EBCD3E34F3A6450B4EBB23632D4DE405A6EDF989415037151388402A1807F04868518683A149AF21CECC9B8F421B6F579EA727FA1BE93D09BD1742835CE1EF2EE4B60A235F4462BB49A5E3EF4A920140805FC23302CC440D3A1D08AB83551393EA1D072FB5AC136E945E1000983C0B0101816021DEA63A1E216635E86AA10112A48B4461914B750A15118EDBAAC5612B23F0983C0B0C03FF8070FE0010008054201FF080C0B810E010C0B8150C03FF8070FE00186059030088402FEC13F78000F004028100AF84760580874089030088402FEC13F78000F004028100A0C0B816121D02100100A8402FE111816021D02240C02A1807FF00F1EC00300100A8402FE111816021D02181602A1807FF00F1EC003004818044201FFE01F3C80070020140805FC23302C043A044818044201FFE01F3C80070020140805FC23302C043A0400428150C03F02C342A0438084412014F00FFEC1037800406A515B5BCB059A3D71D108C565F847E41BFFE0013C00202E1A1A1A5ADBDADAB848B3205A5A5ABE3142B10FFE11F9C63F78000F00888B4D9B360DA9ABAB3B77F2E4C99FB858FDBBA391486CDCB8F1888917E11F916FFC8307F000808460C8F99C71D4DB5406D4D82591F1D0FF7D5FBE8A04FC837FF0001E0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000069C7FF019605ECCABE3E43410000000049454E44AE426082, 1); +INSERT INTO `act_ge_bytearray` VALUES ('250034', 1, '设备巡检任务.bpmn', '250033', 0x3C3F786D6C2076657273696F6E3D22312E302220656E636F64696E673D225554462D38223F3E0D0A3C62706D6E3A646566696E6974696F6E7320786D6C6E733A7873693D22687474703A2F2F7777772E77332E6F72672F323030312F584D4C536368656D612D696E7374616E63652220786D6C6E733A62706D6E3D22687474703A2F2F7777772E6F6D672E6F72672F737065632F42504D4E2F32303130303532342F4D4F44454C2220786D6C6E733A62706D6E64693D22687474703A2F2F7777772E6F6D672E6F72672F737065632F42504D4E2F32303130303532342F44492220786D6C6E733A64633D22687474703A2F2F7777772E6F6D672E6F72672F737065632F44442F32303130303532342F44432220786D6C6E733A64693D22687474703A2F2F7777772E6F6D672E6F72672F737065632F44442F32303130303532342F44492220786D6C6E733A666C6F7761626C653D22687474703A2F2F666C6F7761626C652E6F72672F62706D6E222069643D22446566696E6974696F6E735F3031616371666B22207461726765744E616D6573706163653D22687474703A2F2F62706D6E2E696F2F736368656D612F62706D6E223E0D0A20203C62706D6E3A70726F636573732069643D2265616D5F6465766963655F696E7370656374696F6E22206E616D653D22E8AEBEE5A487E5B7A1E6A380E4BBBBE58AA12220697345786563757461626C653D2274727565223E0D0A202020203C62706D6E3A73746172744576656E742069643D224576656E745F306A78373275352220666C6F7761626C653A696E69746961746F723D22696E69746961746F72223E0D0A2020202020203C62706D6E3A6F7574676F696E673E466C6F775F3135716C786C613C2F62706D6E3A6F7574676F696E673E0D0A202020203C2F62706D6E3A73746172744576656E743E0D0A202020203C62706D6E3A757365725461736B2069643D2269645F3022206E616D653D22E58F91E8B5B72220666C6F7761626C653A666F726D4B65793D2265616D5F6465766963655F696E7370656374696F6E223E0D0A2020202020203C62706D6E3A657874656E73696F6E456C656D656E74733E0D0A20202020202020203C666C6F7761626C653A61737369676E6565547970653E7374617469633C2F666C6F7761626C653A61737369676E6565547970653E0D0A20202020202020203C666C6F7761626C653A73746174696341737369676E65655661726961626C65733E5B5D3C2F666C6F7761626C653A73746174696341737369676E65655661726961626C65733E0D0A20202020202020203C666C6F7761626C653A7461736B4C697374656E657220636C6173733D22636F6D2E7979792E666C6F7761626C652E6C697374656E65722E466C6F775461736B4C697374656E657222206576656E743D2263726561746522202F3E0D0A2020202020203C2F62706D6E3A657874656E73696F6E456C656D656E74733E0D0A2020202020203C62706D6E3A696E636F6D696E673E466C6F775F3135716C786C613C2F62706D6E3A696E636F6D696E673E0D0A2020202020203C62706D6E3A6F7574676F696E673E466C6F775F31366F36376F773C2F62706D6E3A6F7574676F696E673E0D0A202020203C2F62706D6E3A757365725461736B3E0D0A202020203C62706D6E3A73657175656E6365466C6F772069643D22466C6F775F3135716C786C612220736F757263655265663D224576656E745F306A783732753522207461726765745265663D2269645F3022202F3E0D0A202020203C62706D6E3A757365725461736B2069643D2269645F3122206E616D653D22E5A484E7BDAE2220666C6F7761626C653A647565446174653D22247B647565446174657D2220666C6F7761626C653A666F726D4B65793D2265616D5F6465766963655F696E7370656374696F6E223E0D0A2020202020203C62706D6E3A657874656E73696F6E456C656D656E74733E0D0A20202020202020203C666C6F7761626C653A61737369676E6565547970653E7374617469633C2F666C6F7761626C653A61737369676E6565547970653E0D0A20202020202020203C666C6F7761626C653A73746174696341737369676E65655661726961626C65733E5B5D3C2F666C6F7761626C653A73746174696341737369676E65655661726961626C65733E0D0A20202020202020203C666C6F7761626C653A7461736B4C697374656E657220636C6173733D22636F6D2E7979792E666C6F7761626C652E6C697374656E65722E466C6F775461736B4C697374656E657222206576656E743D2263726561746522202F3E0D0A2020202020203C2F62706D6E3A657874656E73696F6E456C656D656E74733E0D0A2020202020203C62706D6E3A696E636F6D696E673E466C6F775F31366F36376F773C2F62706D6E3A696E636F6D696E673E0D0A2020202020203C62706D6E3A6F7574676F696E673E466C6F775F306F6B6A6671643C2F62706D6E3A6F7574676F696E673E0D0A202020203C2F62706D6E3A757365725461736B3E0D0A202020203C62706D6E3A73657175656E6365466C6F772069643D22466C6F775F31366F36376F772220736F757263655265663D2269645F3022207461726765745265663D2269645F3122202F3E0D0A202020203C62706D6E3A757365725461736B2069643D2269645F3222206E616D653D22E9AA8CE694B62220666C6F7761626C653A647565446174653D22247B647565446174657D2220666C6F7761626C653A666F726D4B65793D2265616D5F6465766963655F696E7370656374696F6E223E0D0A2020202020203C62706D6E3A657874656E73696F6E456C656D656E74733E0D0A20202020202020203C666C6F7761626C653A61737369676E6565547970653E7374617469633C2F666C6F7761626C653A61737369676E6565547970653E0D0A20202020202020203C666C6F7761626C653A73746174696341737369676E65655661726961626C65733E5B5D3C2F666C6F7761626C653A73746174696341737369676E65655661726961626C65733E0D0A20202020202020203C666C6F7761626C653A7461736B4C697374656E657220636C6173733D22636F6D2E7979792E666C6F7761626C652E6C697374656E65722E466C6F775461736B4C697374656E657222206576656E743D2263726561746522202F3E0D0A20202020202020203C666C6F7761626C653A61737369676E6565547970653E7374617469633C2F666C6F7761626C653A61737369676E6565547970653E0D0A2020202020203C2F62706D6E3A657874656E73696F6E456C656D656E74733E0D0A2020202020203C62706D6E3A696E636F6D696E673E466C6F775F306F6B6A6671643C2F62706D6E3A696E636F6D696E673E0D0A2020202020203C62706D6E3A6F7574676F696E673E466C6F775F31366B3834667A3C2F62706D6E3A6F7574676F696E673E0D0A202020203C2F62706D6E3A757365725461736B3E0D0A202020203C62706D6E3A73657175656E6365466C6F772069643D22466C6F775F306F6B6A6671642220736F757263655265663D2269645F3122207461726765745265663D2269645F3222202F3E0D0A202020203C62706D6E3A656E644576656E742069643D224576656E745F306E6172317574223E0D0A2020202020203C62706D6E3A696E636F6D696E673E466C6F775F31366B3834667A3C2F62706D6E3A696E636F6D696E673E0D0A202020203C2F62706D6E3A656E644576656E743E0D0A202020203C62706D6E3A73657175656E6365466C6F772069643D22466C6F775F31366B3834667A2220736F757263655265663D2269645F3222207461726765745265663D224576656E745F306E617231757422202F3E0D0A20203C2F62706D6E3A70726F636573733E0D0A20203C62706D6E64693A42504D4E4469616772616D2069643D2242504D4E4469616772616D5F31223E0D0A202020203C62706D6E64693A42504D4E506C616E652069643D2242504D4E506C616E655F31222062706D6E456C656D656E743D2274657374223E0D0A2020202020203C62706D6E64693A42504D4E53686170652069643D224576656E745F306A78373275355F6469222062706D6E456C656D656E743D224576656E745F306A7837327535223E0D0A20202020202020203C64633A426F756E647320783D222D3335382220793D222D333038222077696474683D22333622206865696768743D22333622202F3E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E53686170652069643D2241637469766974795F313036316736755F6469222062706D6E456C656D656E743D2269645F30223E0D0A20202020202020203C64633A426F756E647320783D222D3237302220793D222D333330222077696474683D2231303022206865696768743D22383022202F3E0D0A20202020202020203C62706D6E64693A42504D4E4C6162656C202F3E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E53686170652069643D2241637469766974795F3065747062726B5F6469222062706D6E456C656D656E743D2269645F31223E0D0A20202020202020203C64633A426F756E647320783D222D3131302220793D222D333330222077696474683D2231303022206865696768743D22383022202F3E0D0A20202020202020203C62706D6E64693A42504D4E4C6162656C202F3E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E53686170652069643D2242504D4E53686170655F31756F72763274222062706D6E456C656D656E743D2269645F32223E0D0A20202020202020203C64633A426F756E647320783D2232302220793D222D333330222077696474683D2231303022206865696768743D22383022202F3E0D0A20202020202020203C62706D6E64693A42504D4E4C6162656C202F3E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E53686170652069643D224576656E745F306E61723175745F6469222062706D6E456C656D656E743D224576656E745F306E6172317574223E0D0A20202020202020203C64633A426F756E647320783D223135322220793D222D333038222077696474683D22333622206865696768743D22333622202F3E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E456467652069643D22466C6F775F3135716C786C615F6469222062706D6E456C656D656E743D22466C6F775F3135716C786C61223E0D0A20202020202020203C64693A776179706F696E7420783D222D3332322220793D222D32393022202F3E0D0A20202020202020203C64693A776179706F696E7420783D222D3237302220793D222D32393022202F3E0D0A2020202020203C2F62706D6E64693A42504D4E456467653E0D0A2020202020203C62706D6E64693A42504D4E456467652069643D22466C6F775F31366F36376F775F6469222062706D6E456C656D656E743D22466C6F775F31366F36376F77223E0D0A20202020202020203C64693A776179706F696E7420783D222D3137302220793D222D32393022202F3E0D0A20202020202020203C64693A776179706F696E7420783D222D3131302220793D222D32393022202F3E0D0A2020202020203C2F62706D6E64693A42504D4E456467653E0D0A2020202020203C62706D6E64693A42504D4E456467652069643D22466C6F775F306F6B6A6671645F6469222062706D6E456C656D656E743D22466C6F775F306F6B6A667164223E0D0A20202020202020203C64693A776179706F696E7420783D222D31302220793D222D32393022202F3E0D0A20202020202020203C64693A776179706F696E7420783D2232302220793D222D32393022202F3E0D0A2020202020203C2F62706D6E64693A42504D4E456467653E0D0A2020202020203C62706D6E64693A42504D4E456467652069643D22466C6F775F31366B3834667A5F6469222062706D6E456C656D656E743D22466C6F775F31366B3834667A223E0D0A20202020202020203C64693A776179706F696E7420783D223132302220793D222D32393022202F3E0D0A20202020202020203C64693A776179706F696E7420783D223135322220793D222D32393022202F3E0D0A2020202020203C2F62706D6E64693A42504D4E456467653E0D0A202020203C2F62706D6E64693A42504D4E506C616E653E0D0A20203C2F62706D6E64693A42504D4E4469616772616D3E0D0A3C2F62706D6E3A646566696E6974696F6E733E0D0A, 0); +INSERT INTO `act_ge_bytearray` VALUES ('250035', 1, '设备巡检任务.eam_device_inspection.png', '250033', 0x89504E470D0A1A0A0000000D494844520000022C0000005A08060000009B930D1C000010EB4944415478DAED9D7D6C54551AC64DD4648D26FAC71AD7A851136288D9A8316BDC3F5663CC1A35D1E01FD6C20022AD2822A915178808B25411612B208528DA08CB12B1E9CAC736845DA0D096E054218485F291EDF225944281055A2A528A77CF7333677267E87466DA99B9339DDF93BC99E99D7EDCE93CF7799FFB9EF79C73CD3520AD701CE7BA83070F563736365EA9ADAD75366CD8406438366EDCE83434349C363102FEC1877CE41F3C800700C4854462CB962D4E5B5B9B73E9D225C2A73875EA94535F5F7FDE88C68BF08FC837FEC1037800405CE88E0691C81AB1B864EE74F6C13F22DFF8070FE0010071A1F22B1769F684118ACBF08FC837FEC1037800405C68EC920B34AB84C2817F44BEF10F1EC0030052261417CEB53A07B72D71F66C2C7343CF758C8B1BA1807FF00F1EC00300B242283ACEB6384DFF9AE6FC7BEDC488D031BDC6058E50C03FF8070FE00100BE0BC5D13DFFB84A246C1CDB53C3058E50C03FF8070FE00100FE0BC5BECDB3630A855EE3024728E01FFC8307F00000DF85A269C39F630A855EE3024728E01FFC8307F000008402A1807FF00FC3020FD021806189475E75E3C7120ABDC6058E50C03FF8070FE00100BE0B45F3D685318542AF71812314F00FFEC103780080EF4271A66597D3B47EFAD56558734CAF71812314F00FFEC103780080EF42A138B47DD95542A1635CDC0805FC837FF0001E00901D42F1F3CF4EF3779F5D5D8635C7F41A17384201FFE01F3C800700F82A145A41F23F5B2B628E1DEB3556994428E01FFC8307F000007F84C2DCB1B4366F7276FF734A4C91B0A1EFD1F772978350C03FF8070FE0010019138A787733DCE52014F00FFEC103780080EF4291C8DD4C6F77395CF00805FC837FF0001E009076A1E8AB48D8E0824728E01FFC8307F00080CC8C1D130805FC837FF0001EE4005E79E5955B860E1DFAA2890A134113AD261C4FE8EB606161E197C3860D1B61E2D75971E2C78E1D7B70D5AA55F3172D5AD43475EAD48EF1E3C75F193E7C78F8C4C78C19D3F5CE3BEF9C99316346437979F958F3467F8561E1024528E01F816121724B878C0179CEE4F51A6340BAA30C4ADC303FB3C1C40B4F3CF1C475193D69C771AE0B068393162C58D06A0C89336BD62C67E5CA95CECE9D3B9D969616A7BBBBDBB13873E68CB36BD72E67F5EAD5CEC2850B1D6358BA274E9CF85D5151D183181602A1807FF00F1EC083ECD62163387E67CC4663B22625466C33BFEB998C9C787D7D7DD1BC79F33AC68D1BE75457573BADADAD4E32387BF6ACFBE1BCF9E69B974B4A4AB69A93BF8784412014F00FFEC10378905D5035C4988B593D5554264F9EEC7A80AD5BB73A3FFEF8A373F1E24537C7777575B95F373636BA858C69D3A6C5322E15691B715155A5AAAA6A77515191B362C58AF0C9F515AAC2A8EA3272E4C8CBC5C5C5934918044201FFE01F3C8007D981E1C387DF195D5531F9DA59B26449D2858AC3870F3B9595951A6189362DBBF577527AE2E6E4EEA9A8A8682B2D2D75FF702AA1DFF7F6DB6F5F1C3366CCF27CE86F4128100AF8476058886CD621635406070281E35E73A1D68FB6B6B67EE57BB588949595459B96A3291B699159D11090CA3A1ACE490754AD99397366677171F1BA8C37E4201408058685C0B010E850B8B2E2352BAAAAD4D5D545F4A6F6175BB66C717F6F4A4D8B868154599159E9EF10502243441F7EF861BB791395240C02C302FFE01F3C8007BEF4AC84878134E377FFFEFD69C9F9EA71891A22DA5D505070539F4F5E3D2B1A066A6F6F77320199A292929276F34F9A44C220302CF00FFEC1037890D1A1A059DECA4ABACC8AD7B478974151236E9F4EBCA1A1618C1A6C53DDB392484F8B7903178DD31A44C220302CF00FFEC10378907E84A62E87670369182813D0F050D47A2DC94D79D650D0279F7C7241B381FCC0CA952BCF19D3B29284416058E01FFC8307F02023D595466F836D2A7B56E221AA11775B52BDAC5A144EEBACA4BB6FA5B77E96A2A2A2938140E02112068161817FF00F1EC083F421B4826D7828A8BFB381FA327BC8DBCFA21571133EF9B973E7B66A41183F515353A3AEE1BF9130080C0BFC837FF0001EA47538A8C69A05ADB3E207962F5F1EB18C7F4227AEBD81B4DC7EB20BC3A41A9A421D0804FE37D0D6664128100AF8476058886CD1216D64E8ED5DF12BF7ABAAE36DC04D68C3446D643867CE1C271BF0EEBBEF6E53A92A1712416863A73F20140805FC23FCE21F3C8007C9F221B4EB7278B97D3FE15DC65FBB3CC77D830B162CD8A3F5FFB3014B972EDDDDE7694E992FA9854B59C664FD1EA1C0B0C03F22D3FC8307F020593E28C7DAEFF3BB1544DEC39E8B39DF2FE3BEC1A953A77668D7E56CC08E1D3B9ACD890773296178625D4FCE16A1C0B0C03F22DD86051EA04389F24139D6BEAE8D0CFD84D665F19C6BFCDC3F7EFCF82B7EF7AF589C3E7DFA8239E9D61C4D186167EB2508428161817F44060D0B3CC0B0F4CA07E5587B5CBB2CFB89969616EF79C6CFFD6A7AC9E4FCEB78D089E772C2F03A5B95E4100A0C0BFC23326D58E0018625161FBC5F777575F99AEFF5F7BDE793D01BCC2624F00FCFA94028B22B061ABFE01FFC8307F0A0AF916D393FD72A2C1D03A0C2E2CE74B22BF7E58250D4D6D63AE7CF9F77D6AD5BA7FFBDBB80604D4D8D535F5F1FF367AEBFFE7AE7D5575FE5CE06FEA524C4BB65CB96C5E597B879D75D77394F3EF9A4B366CD1A375E7EF96537F43CFAF7E4718525277820DD79ECB1C7DCCFEED9679F755E7FFDF5084EE873ED8D33959595E1E79AF14285253E1FBCC7FD5A2CB6CF159637DE78E352B6F4B09C3C79B229877B5822042257C68E45585DEC3B76EC70060D1AE43CF2C8231182F0F4D34F477CBFBE4FE272EDB5D73A3367CE74BFE7D0A143AED8E8F8534F3DE58C1D3B16C302FF128EBD7BF7BA3CF29EABBED64A98B112D5AE5DBBDCC72FBEF8C2E9E8E8709F6BE3367B2C8F0D4BCEF1409A220E3CFAE8A3EE7BD0B1E3C78FBB9FE5F3CF3FDFAB61110F3A3B3BDDE75A880CC3129F0FDE1E964CEF1DD8EF1E964993269DC8965942C160B02E07670905B5AC70ACBD10B23D61CC9F3FDFBDD857AD5AE53ECA70D8BB563DEA6ED50A8335383D25147B5C559A9B6FBE19C302FF120E190C5554C4373DCA78C83CBFF4D24B310DF6A2458BC209EDDB6FBF0D5756F4A8DF938786256779A0CF6CFBF6EDEEE3FAF5EBC3C79497B4519EB810FDFD7ACDEA52555595FBBCB4B4345C75D3D73FFCF0433E1B96987CC8E95942656565EBB3651D96B973E7D6E4D03A2C3DDEC9E45AC25072F00A812EFE58DFABFD1F1E7FFCF1880ACB1D77DCE1260C25171DBFFDF6DB9D2143866058E05F5209CBDE1DEBF9E6CD9B9DCF3FFFDCF9F4D34F23CAFE0A9BD834746013D3DD77DF1D91A864C2F3C8B0E43C0FF499353535851F070F1EACBDE5C2AF4F9F3EDDB9F1C61BDD4A4C7485CDFEDC881123220CADD617C9D30A4B5C3E78D76191DEE7D43A2CB367CF1E5D5E5EFE4B361816234235B9B2D26DA2C8951E025B56D59090ADAEA84FC02B1C0A95DFF5F8C0030F380F3FFC7044F956DB2BC800794D108605FEF516963B32BD36D9D8BB6755F04E9D3A1531CC239E3637373B5F7FFD75D8A02859D9E7BDF55DB1347FF60E49DB8A99CE5377FDF60648955FDD14BDF7DE7B11D55D6B58264C98E09A16DD28E9B56030E81E176FE0414CC392BB2BDD6AEF1E9394BA74F7ECF31A2CEA5F39C55E42FE849CF6575F7DE50EE978EF7C5466F57E9F9A7155A2D51D8CEE6C15563CAC9951231D4201FF12BDBB3E70E0809B98C42D3B9CE81D729411F6FE8C3531B6DAE7ADAE68088144955B3C500F9C970F4A5EFACCAD8EE875E5A79E7A982A2A2AC2C7ACF9FDF8E38F69FEEF3DE7DF62FEC797AD51D0F5E7D75E428140E097A4F612128CCBDA2CB1F01386787F65B7667F13874440257795E4431754F8AEC6C6BDF7DEEB2617DD01D9EA8B158AA3478FBA5FE7530F01FCEB7BD866593D9697974754487A6BBA55F2B286257A86108625F7782003AA1BA6B56BD7863F77CD5CD4739916DB5BE7ADC87CF0C107E1C902F62649C3883A76ECD8310C4BFC2A4B78B7E6C58B17E7CE6ECD82493C0FBEF6DA6BDD7E4D71EAEEEE3E6A4EF8BFC66D3D44C2C87C689AA8B7EF4463C65E03126D6C645A5461B1C6C48A8AAA2D5634D47F8050C0BF4463E9D2A5110948CFC5C3DE0C4BF47BCBE7DE855CE58186FAF4B9A91FCE1A583B24A8066C19503DD730A0FD19DB4C6B8712BD9FBF82E515E243AD17D62C8C1C39D2AD766412BA86478D1AE5ADAEBC90D41B78EBADB7EAFD6ABEFDE8A38F969A93AE2661643E6CD39ACCAA42A6E3FEFBEF0FCFB818376E5C4495C5DBE8A6D09D901D0A8A1E9B4628E05F22A1EAEE0D37DC104E4EEA8FD2D0E48913275C6E29BC7CA2C2327078A0CF52433EBA39926955D82A8AB44515DF5B6FBDB5D7AAB0E5839E6B585BCFF5080FE25659C2B385CACACA32BA1E9BFE9E77EA75BCA6F1AB505050F09BD1A3475FCAF4BCECBD7BF7D69B13EE307F7F100923B3A171622DDAA4BB1735BAC9A878AB2A2AD5DAD2ABCAB5128F23478E845FD79DD09C3973DCE121ADC372DF7DF7858D8C77CC19A1807F3D850C896684A871D27B5C4392E2959A69C5A5DB6EBBCDADE2A9995BC6C44E63D5D041B461B1959A6C5D9303C3D2736826D835A1B57464446D7F92CC8AFD6CBDFD75D6B0A8DA621B6EA36792D9FE1678D0338C6EFFD1BB664B5D5D5D4672BE6E2AA2F6397AA64F6F20100894949696FE94A9A1A1CECECE3DE66FEE3127FD2712068161817FF166B2656BE50EC392DACF191DCA5895E52FD63868D57B998974AFBB626E447EF11896FE2D63525C5CBC6CC68C1969372DDDDDDD878B8A8A369913FE8C84416058E01FFC8307F020B3082DD51FF49A96742D2627B3326AD4A82B1EB3B2BBA0A0E0A67EBF016324D6BCFFFEFBEDE9322DAAAC1863B4597D2B036D1A33428150C03F02C342E48A0E199372A7C9C5CD5ED3A2E1A154F6B4A872135559396AE29E94B9AE4020B0B8A4A4A43DD53D2DEA59090D037D36D0CD0A428150C03F02C34264BB0EC93C784D8B6DC4EDEFEC21F5324635D8A6D6AC7851585838DEB8AD0B55555567B5AB627FA72E876603750CE49E158402A1807F048685C8351D0A555A825E73A129CF4B962C7192DD205946478DEFDEA9CB7618282D66C542B387860D1BF677F387CF5557571F308EE972B22BD86A5138F33BF66B08C83C0E2661100805FC837FF0001E641734BA52585838AF875D9F9D2953A6B833F4D4E3A291175BC4D0A3765D568FCAEAD5ABDDE5F6BD2BD87A1B6CFBDDB39244B5E5B7DA9CC89C48FB84091376565656EEFCFEFBEF0F1C3F7EBCD3E34F3A6450B4EBB23632D4DE405A6EDF989415037151388402A1807F04868518683A149AF21CECC9B8F421B6F579EA727FA1BE93D09BD1742835CE1EF2EE4B60A235F4462BB49A5E3EF4A920140805FC23302CC440D3A1D08AB83551393EA1D072FB5AC136E945E1000983C0B0101816021DEA63A1E216635E86AA10112A48B4461914B750A15118EDBAAC5612B23F0983C0B0C03FF8070FE0010008054201FF080C0B810E010C0B8150C03FF8070FE00186059030088402FEC13F78000F004028100AF84760580874089030088402FEC13F78000F004028100A0C0B816121D02100100A8402FE111816021D02240C02A1807FF00F1EC00300100A8402FE111816021D02181602A1807FF00F1EC003004818044201FFE01F3C80070020140805FC23302C043A044818044201FFE01F3C80070020140805FC23302C043A0400428150C03F02C342A0438084412014F00FFEC1037800406A515B5BCB059A3D71D108C565F847E41BFFE0013C00202E1A1A1A5ADBDADAB848B3205A5A5ABE3142B10FFE11F9C63F78000F00888B4D9B360DA9ABAB3B77F2E4C99FB858FDBBA391486CDCB8F1888917E11F916FFC8307F000808460C8F99C71D4DB5406D4D82591F1D0FF7D5FBE8A04FC837FF0001E0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000069C7FF019605ECCABE3E43410000000049454E44AE426082, 1); +INSERT INTO `act_ge_bytearray` VALUES ('250038', 1, '设备保养任务.bpmn', '250037', 0x3C3F786D6C2076657273696F6E3D22312E302220656E636F64696E673D225554462D38223F3E0D0A3C62706D6E3A646566696E6974696F6E7320786D6C6E733A7873693D22687474703A2F2F7777772E77332E6F72672F323030312F584D4C536368656D612D696E7374616E63652220786D6C6E733A62706D6E3D22687474703A2F2F7777772E6F6D672E6F72672F737065632F42504D4E2F32303130303532342F4D4F44454C2220786D6C6E733A62706D6E64693D22687474703A2F2F7777772E6F6D672E6F72672F737065632F42504D4E2F32303130303532342F44492220786D6C6E733A64633D22687474703A2F2F7777772E6F6D672E6F72672F737065632F44442F32303130303532342F44432220786D6C6E733A64693D22687474703A2F2F7777772E6F6D672E6F72672F737065632F44442F32303130303532342F44492220786D6C6E733A666C6F7761626C653D22687474703A2F2F666C6F7761626C652E6F72672F62706D6E222069643D22446566696E6974696F6E735F3031616371666B22207461726765744E616D6573706163653D22687474703A2F2F62706D6E2E696F2F736368656D612F62706D6E223E0D0A20203C62706D6E3A70726F636573732069643D2265616D5F6465766963655F6D61696E74656E616E636522206E616D653D22E8AEBEE5A487E4BF9DE585BBE4BBBBE58AA12220697345786563757461626C653D2274727565223E0D0A202020203C62706D6E3A73746172744576656E742069643D224576656E745F306A78373275352220666C6F7761626C653A696E69746961746F723D22696E69746961746F72223E0D0A2020202020203C62706D6E3A6F7574676F696E673E466C6F775F3135716C786C613C2F62706D6E3A6F7574676F696E673E0D0A202020203C2F62706D6E3A73746172744576656E743E0D0A202020203C62706D6E3A757365725461736B2069643D2269645F3022206E616D653D22E58F91E8B5B72220666C6F7761626C653A666F726D4B65793D2265616D5F6465766963655F6D61696E74656E616E6365223E0D0A2020202020203C62706D6E3A657874656E73696F6E456C656D656E74733E0D0A20202020202020203C666C6F7761626C653A61737369676E6565547970653E7374617469633C2F666C6F7761626C653A61737369676E6565547970653E0D0A20202020202020203C666C6F7761626C653A73746174696341737369676E65655661726961626C65733E5B5D3C2F666C6F7761626C653A73746174696341737369676E65655661726961626C65733E0D0A20202020202020203C666C6F7761626C653A7461736B4C697374656E657220636C6173733D22636F6D2E7979792E666C6F7761626C652E6C697374656E65722E466C6F775461736B4C697374656E657222206576656E743D2263726561746522202F3E0D0A2020202020203C2F62706D6E3A657874656E73696F6E456C656D656E74733E0D0A2020202020203C62706D6E3A696E636F6D696E673E466C6F775F3135716C786C613C2F62706D6E3A696E636F6D696E673E0D0A2020202020203C62706D6E3A6F7574676F696E673E466C6F775F31366F36376F773C2F62706D6E3A6F7574676F696E673E0D0A202020203C2F62706D6E3A757365725461736B3E0D0A202020203C62706D6E3A73657175656E6365466C6F772069643D22466C6F775F3135716C786C612220736F757263655265663D224576656E745F306A783732753522207461726765745265663D2269645F3022202F3E0D0A202020203C62706D6E3A757365725461736B2069643D2269645F3122206E616D653D22E5A484E7BDAE2220666C6F7761626C653A647565446174653D22247B647565446174657D2220666C6F7761626C653A666F726D4B65793D2265616D5F6465766963655F6D61696E74656E616E6365223E0D0A2020202020203C62706D6E3A657874656E73696F6E456C656D656E74733E0D0A20202020202020203C666C6F7761626C653A61737369676E6565547970653E7374617469633C2F666C6F7761626C653A61737369676E6565547970653E0D0A20202020202020203C666C6F7761626C653A73746174696341737369676E65655661726961626C65733E5B5D3C2F666C6F7761626C653A73746174696341737369676E65655661726961626C65733E0D0A20202020202020203C666C6F7761626C653A7461736B4C697374656E657220636C6173733D22636F6D2E7979792E666C6F7761626C652E6C697374656E65722E466C6F775461736B4C697374656E657222206576656E743D2263726561746522202F3E0D0A2020202020203C2F62706D6E3A657874656E73696F6E456C656D656E74733E0D0A2020202020203C62706D6E3A696E636F6D696E673E466C6F775F31366F36376F773C2F62706D6E3A696E636F6D696E673E0D0A2020202020203C62706D6E3A6F7574676F696E673E466C6F775F306F6B6A6671643C2F62706D6E3A6F7574676F696E673E0D0A202020203C2F62706D6E3A757365725461736B3E0D0A202020203C62706D6E3A73657175656E6365466C6F772069643D22466C6F775F31366F36376F772220736F757263655265663D2269645F3022207461726765745265663D2269645F3122202F3E0D0A202020203C62706D6E3A757365725461736B2069643D2269645F3222206E616D653D22E9AA8CE694B62220666C6F7761626C653A647565446174653D22247B647565446174657D2220666C6F7761626C653A666F726D4B65793D2265616D5F6465766963655F6D61696E74656E616E6365223E0D0A2020202020203C62706D6E3A657874656E73696F6E456C656D656E74733E0D0A20202020202020203C666C6F7761626C653A61737369676E6565547970653E7374617469633C2F666C6F7761626C653A61737369676E6565547970653E0D0A20202020202020203C666C6F7761626C653A73746174696341737369676E65655661726961626C65733E5B5D3C2F666C6F7761626C653A73746174696341737369676E65655661726961626C65733E0D0A20202020202020203C666C6F7761626C653A7461736B4C697374656E657220636C6173733D22636F6D2E7979792E666C6F7761626C652E6C697374656E65722E466C6F775461736B4C697374656E657222206576656E743D2263726561746522202F3E0D0A20202020202020203C666C6F7761626C653A61737369676E6565547970653E7374617469633C2F666C6F7761626C653A61737369676E6565547970653E0D0A2020202020203C2F62706D6E3A657874656E73696F6E456C656D656E74733E0D0A2020202020203C62706D6E3A696E636F6D696E673E466C6F775F306F6B6A6671643C2F62706D6E3A696E636F6D696E673E0D0A2020202020203C62706D6E3A6F7574676F696E673E466C6F775F31366B3834667A3C2F62706D6E3A6F7574676F696E673E0D0A202020203C2F62706D6E3A757365725461736B3E0D0A202020203C62706D6E3A73657175656E6365466C6F772069643D22466C6F775F306F6B6A6671642220736F757263655265663D2269645F3122207461726765745265663D2269645F3222202F3E0D0A202020203C62706D6E3A656E644576656E742069643D224576656E745F306E6172317574223E0D0A2020202020203C62706D6E3A696E636F6D696E673E466C6F775F31366B3834667A3C2F62706D6E3A696E636F6D696E673E0D0A202020203C2F62706D6E3A656E644576656E743E0D0A202020203C62706D6E3A73657175656E6365466C6F772069643D22466C6F775F31366B3834667A2220736F757263655265663D2269645F3222207461726765745265663D224576656E745F306E617231757422202F3E0D0A20203C2F62706D6E3A70726F636573733E0D0A20203C62706D6E64693A42504D4E4469616772616D2069643D2242504D4E4469616772616D5F31223E0D0A202020203C62706D6E64693A42504D4E506C616E652069643D2242504D4E506C616E655F31222062706D6E456C656D656E743D2274657374223E0D0A2020202020203C62706D6E64693A42504D4E53686170652069643D224576656E745F306A78373275355F6469222062706D6E456C656D656E743D224576656E745F306A7837327535223E0D0A20202020202020203C64633A426F756E647320783D222D3335382220793D222D333038222077696474683D22333622206865696768743D22333622202F3E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E53686170652069643D2241637469766974795F313036316736755F6469222062706D6E456C656D656E743D2269645F30223E0D0A20202020202020203C64633A426F756E647320783D222D3237302220793D222D333330222077696474683D2231303022206865696768743D22383022202F3E0D0A20202020202020203C62706D6E64693A42504D4E4C6162656C202F3E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E53686170652069643D2241637469766974795F3065747062726B5F6469222062706D6E456C656D656E743D2269645F31223E0D0A20202020202020203C64633A426F756E647320783D222D3131302220793D222D333330222077696474683D2231303022206865696768743D22383022202F3E0D0A20202020202020203C62706D6E64693A42504D4E4C6162656C202F3E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E53686170652069643D2242504D4E53686170655F31756F72763274222062706D6E456C656D656E743D2269645F32223E0D0A20202020202020203C64633A426F756E647320783D2232302220793D222D333330222077696474683D2231303022206865696768743D22383022202F3E0D0A20202020202020203C62706D6E64693A42504D4E4C6162656C202F3E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E53686170652069643D224576656E745F306E61723175745F6469222062706D6E456C656D656E743D224576656E745F306E6172317574223E0D0A20202020202020203C64633A426F756E647320783D223135322220793D222D333038222077696474683D22333622206865696768743D22333622202F3E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E456467652069643D22466C6F775F3135716C786C615F6469222062706D6E456C656D656E743D22466C6F775F3135716C786C61223E0D0A20202020202020203C64693A776179706F696E7420783D222D3332322220793D222D32393022202F3E0D0A20202020202020203C64693A776179706F696E7420783D222D3237302220793D222D32393022202F3E0D0A2020202020203C2F62706D6E64693A42504D4E456467653E0D0A2020202020203C62706D6E64693A42504D4E456467652069643D22466C6F775F31366F36376F775F6469222062706D6E456C656D656E743D22466C6F775F31366F36376F77223E0D0A20202020202020203C64693A776179706F696E7420783D222D3137302220793D222D32393022202F3E0D0A20202020202020203C64693A776179706F696E7420783D222D3131302220793D222D32393022202F3E0D0A2020202020203C2F62706D6E64693A42504D4E456467653E0D0A2020202020203C62706D6E64693A42504D4E456467652069643D22466C6F775F306F6B6A6671645F6469222062706D6E456C656D656E743D22466C6F775F306F6B6A667164223E0D0A20202020202020203C64693A776179706F696E7420783D222D31302220793D222D32393022202F3E0D0A20202020202020203C64693A776179706F696E7420783D2232302220793D222D32393022202F3E0D0A2020202020203C2F62706D6E64693A42504D4E456467653E0D0A2020202020203C62706D6E64693A42504D4E456467652069643D22466C6F775F31366B3834667A5F6469222062706D6E456C656D656E743D22466C6F775F31366B3834667A223E0D0A20202020202020203C64693A776179706F696E7420783D223132302220793D222D32393022202F3E0D0A20202020202020203C64693A776179706F696E7420783D223135322220793D222D32393022202F3E0D0A2020202020203C2F62706D6E64693A42504D4E456467653E0D0A202020203C2F62706D6E64693A42504D4E506C616E653E0D0A20203C2F62706D6E64693A42504D4E4469616772616D3E0D0A3C2F62706D6E3A646566696E6974696F6E733E0D0A, 0); +INSERT INTO `act_ge_bytearray` VALUES ('250039', 1, '设备保养任务.eam_device_maintenance.png', '250037', 0x89504E470D0A1A0A0000000D494844520000022C0000005A08060000009B930D1C000010EB4944415478DAED9D7D6C54551AC64DD4648D26FAC71AD7A851136288D9A8316BDC3F5663CC1A35D1E01FD6C20022AD2822A915178808B25411612B208528DA08CB12B1E9CAC736845DA0D096E054218485F291EDF225944281055A2A528A77CF7333677267E87466DA99B9339DDF93BC99E99D7EDCE93CF7799FFB9EF79C73CD3520AD701CE7BA83070F563736365EA9ADAD75366CD8406438366EDCE83434349C363102FEC1877CE41F3C800700C4854462CB962D4E5B5B9B73E9D225C2A73875EA94535F5F7FDE88C68BF08FC837FEC1037800405CE88E0691C81AB1B864EE74F6C13F22DFF8070FE0010071A1F22B1769F684118ACBF08FC837FEC1037800405C68EC920B34AB84C2817F44BEF10F1EC0030052261417CEB53A07B72D71F66C2C7343CF758C8B1BA1807FF00F1EC00300B242283ACEB6384DFF9AE6FC7BEDC488D031BDC6058E50C03FF8070FE00100BE0BC5D13DFFB84A246C1CDB53C3058E50C03FF8070FE00100FE0BC5BECDB3630A855EE3024728E01FFC8307F00000DF85A269C39F630A855EE3024728E01FFC8307F000008402A1807FF00FC3020FD021806189475E75E3C7120ABDC6058E50C03FF8070FE00100BE0B45F3D685318542AF71812314F00FFEC103780080EF4271A66597D3B47EFAD56558734CAF71812314F00FFEC103780080EF42A138B47DD95542A1635CDC0805FC837FF0001E00901D42F1F3CF4EF3779F5D5D8635C7F41A17384201FFE01F3C800700F82A145A41F23F5B2B628E1DEB3556994428E01FFC8307F000007F84C2DCB1B4366F7276FF734A4C91B0A1EFD1F772978350C03FF8070FE0010019138A787733DCE52014F00FFEC103780080EF4291C8DD4C6F77395CF00805FC837FF0001E009076A1E8AB48D8E0824728E01FFC8307F00080CC8C1D130805FC837FF0001EE4005E79E5955B860E1DFAA2890A134113AD261C4FE8EB606161E197C3860D1B61E2D75971E2C78E1D7B70D5AA55F3172D5AD43475EAD48EF1E3C75F193E7C78F8C4C78C19D3F5CE3BEF9C99316346437979F958F3467F8561E1024528E01F816121724B878C0179CEE4F51A6340BAA30C4ADC303FB3C1C40B4F3CF1C475193D69C771AE0B068393162C58D06A0C89336BD62C67E5CA95CECE9D3B9D969616A7BBBBDBB13873E68CB36BD72E67F5EAD5CEC2850B1D6358BA274E9CF85D5151D183181602A1807FF00F1EC083ECD62163387E67CC4663B22625466C33BFEB998C9C787D7D7DD1BC79F33AC68D1BE75457573BADADAD4E32387BF6ACFBE1BCF9E69B974B4A4AB69A93BF8784412014F00FFEC10378905D5035C4988B593D5554264F9EEC7A80AD5BB73A3FFEF8A373F1E24537C7777575B95F373636BA858C69D3A6C5322E15691B715155A5AAAA6A77515191B362C58AF0C9F515AAC2A8EA3272E4C8CBC5C5C5934918044201FFE01F3C8007D981E1C387DF195D5531F9DA59B26449D2858AC3870F3B9595951A6189362DBBF577527AE2E6E4EEA9A8A8682B2D2D75FF702AA1DFF7F6DB6F5F1C3366CCF27CE86F4128100AF8476058886CD621635406070281E35E73A1D68FB6B6B67EE57BB588949595459B96A3291B699159D11090CA3A1ACE490754AD99397366677171F1BA8C37E4201408058685C0B010E850B8B2E2352BAAAAD4D5D545F4A6F6175BB66C717F6F4A4D8B868154599159E9EF10502243441F7EF861BB791395240C02C302FFE01F3C8007BEF4AC84878134E377FFFEFD69C9F9EA71891A22DA5D505070539F4F5E3D2B1A066A6F6F77320199A292929276F34F9A44C220302CF00FFEC1037890D1A1A059DECA4ABACC8AD7B478974151236E9F4EBCA1A1618C1A6C53DDB392484F8B7903178DD31A44C220302CF00FFEC10378907E84A62E87670369182813D0F050D47A2DC94D79D650D0279F7C7241B381FCC0CA952BCF19D3B29284416058E01FFC8307F02023D595466F836D2A7B56E221AA11775B52BDAC5A144EEBACA4BB6FA5B77E96A2A2A2938140E02112068161817FF00F1EC083F421B4826D7828A8BFB381FA327BC8DBCFA21571133EF9B973E7B66A41183F515353A3AEE1BF9130080C0BFC837FF0001EA47538A8C69A05ADB3E207962F5F1EB18C7F4227AEBD81B4DC7EB20BC3A41A9A421D0804FE37D0D6664128100AF8476058886CD1216D64E8ED5DF12BF7ABAAE36DC04D68C3446D643867CE1C271BF0EEBBEF6E53A92A1712416863A73F20140805FC23FCE21F3C8007C9F221B4EB7278B97D3FE15DC65FBB3CC77D830B162CD8A3F5FFB3014B972EDDDDE7694E992FA9854B59C664FD1EA1C0B0C03F22D3FC8307F020593E28C7DAEFF3BB1544DEC39E8B39DF2FE3BEC1A953A77668D7E56CC08E1D3B9ACD890773296178625D4FCE16A1C0B0C03F22DD86051EA04389F24139D6BEAE8D0CFD84D665F19C6BFCDC3F7EFCF82B7EF7AF589C3E7DFA8239E9D61C4D186167EB2508428161817F44060D0B3CC0B0F4CA07E5587B5CBB2CFB89969616EF79C6CFFD6A7AC9E4FCEB78D089E772C2F03A5B95E4100A0C0BFC23326D58E0018625161FBC5F777575F99AEFF5F7BDE793D01BCC2624F00FCFA94028B22B061ABFE01FFC8307F0A0AF916D393FD72A2C1D03A0C2E2CE74B22BF7E58250D4D6D63AE7CF9F77D6AD5BA7FFBDBB80604D4D8D535F5F1FF367AEBFFE7AE7D5575FE5CE06FEA524C4BB65CB96C5E597B879D75D77394F3EF9A4B366CD1A375E7EF96537F43CFAF7E4718525277820DD79ECB1C7DCCFEED9679F755E7FFDF5084EE873ED8D33959595E1E79AF14285253E1FBCC7FD5A2CB6CF159637DE78E352B6F4B09C3C79B229877B5822042257C68E45585DEC3B76EC70060D1AE43CF2C8231182F0F4D34F477CBFBE4FE272EDB5D73A3367CE74BFE7D0A143AED8E8F8534F3DE58C1D3B16C302FF128EBD7BF7BA3CF29EABBED64A98B112D5AE5DBBDCC72FBEF8C2E9E8E8709F6BE3367B2C8F0D4BCEF1409A220E3CFAE8A3EE7BD0B1E3C78FBB9FE5F3CF3FDFAB61110F3A3B3BDDE75A880CC3129F0FDE1E964CEF1DD8EF1E964993269DC8965942C160B02E07670905B5AC70ACBD10B23D61CC9F3FDFBDD857AD5AE53ECA70D8BB563DEA6ED50A8335383D25147B5C559A9B6FBE19C302FF120E190C5554C4373DCA78C83CBFF4D24B310DF6A2458BC209EDDB6FBF0D5756F4A8DF938786256779A0CF6CFBF6EDEEE3FAF5EBC3C79497B4519EB810FDFD7ACDEA52555595FBBCB4B4345C75D3D73FFCF0433E1B96987CC8E95942656565EBB3651D96B973E7D6E4D03A2C3DDEC9E45AC25072F00A812EFE58DFABFD1F1E7FFCF1880ACB1D77DCE1260C25171DBFFDF6DB9D2143866058E05F5209CBDE1DEBF9E6CD9B9DCF3FFFDCF9F4D34F23CAFE0A9BD834746013D3DD77DF1D91A864C2F3C8B0E43C0FF499353535851F070F1EACBDE5C2AF4F9F3EDDB9F1C61BDD4A4C7485CDFEDC881123220CADD617C9D30A4B5C3E78D76191DEE7D43A2CB367CF1E5D5E5EFE4B361816234235B9B2D26DA2C8951E025B56D59090ADAEA84FC02B1C0A95DFF5F8C0030F380F3FFC7044F956DB2BC800794D108605FEF516963B32BD36D9D8BB6755F04E9D3A1531CC239E3637373B5F7FFD75D8A02859D9E7BDF55DB1347FF60E49DB8A99CE5377FDF60648955FDD14BDF7DE7B11D55D6B58264C98E09A16DD28E9B56030E81E176FE0414CC392BB2BDD6AEF1E9394BA74F7ECF31A2CEA5F39C55E42FE849CF6575F7DE50EE978EF7C5466F57E9F9A7155A2D51D8CEE6C15563CAC9951231D4201FF12BDBB3E70E0809B98C42D3B9CE81D729411F6FE8C3531B6DAE7ADAE68088144955B3C500F9C970F4A5EFACCAD8EE875E5A79E7A982A2A2AC2C7ACF9FDF8E38F69FEEF3DE7DF62FEC797AD51D0F5E7D75E428140E097A4F612128CCBDA2CB1F01386787F65B7667F13874440257795E4431754F8AEC6C6BDF7DEEB2617DD01D9EA8B158AA3478FBA5FE7530F01FCEB7BD866593D9697974754487A6BBA55F2B286257A86108625F7782003AA1BA6B56BD7863F77CD5CD4739916DB5BE7ADC87CF0C107E1C902F62649C3883A76ECD8310C4BFC2A4B78B7E6C58B17E7CE6ECD82493C0FBEF6DA6BDD7E4D71EAEEEE3E6A4EF8BFC66D3D44C2C87C689AA8B7EF4463C65E03126D6C645A5461B1C6C48A8AAA2D5634D47F8050C0BF4463E9D2A5110948CFC5C3DE0C4BF47BCBE7DE855CE58186FAF4B9A91FCE1A583B24A8066C19503DD730A0FD19DB4C6B8712BD9FBF82E515E243AD17D62C8C1C39D2AD766412BA86478D1AE5ADAEBC90D41B78EBADB7EAFD6ABEFDE8A38F969A93AE2661643E6CD39ACCAA42A6E3FEFBEF0FCFB818376E5C4495C5DBE8A6D09D901D0A8A1E9B4628E05F22A1EAEE0D37DC104E4EEA8FD2D0E48913275C6E29BC7CA2C2327078A0CF52433EBA39926955D82A8AB44515DF5B6FBDB5D7AAB0E5839E6B585BCFF5080FE25659C2B385CACACA32BA1E9BFE9E77EA75BCA6F1AB505050F09BD1A3475FCAF4BCECBD7BF7D69B13EE307F7F100923B3A171622DDAA4BB1735BAC9A878AB2A2AD5DAD2ABCAB5128F23478E845FD79DD09C3973DCE121ADC372DF7DF7858D8C77CC19A1807F3D850C896684A871D27B5C4392E2959A69C5A5DB6EBBCDADE2A9995BC6C44E63D5D041B461B1959A6C5D9303C3D2736826D835A1B57464446D7F92CC8AFD6CBDFD75D6B0A8DA621B6EA36792D9FE1678D0338C6EFFD1BB664B5D5D5D4672BE6E2AA2F6397AA64F6F20100894949696FE94A9A1A1CECECE3DE66FEE3127FD2712068161817FF166B2656BE50EC392DACF191DCA5895E52FD63868D57B998974AFBB626E447EF11896FE2D63525C5CBC6CC68C1969372DDDDDDD878B8A8A369913FE8C84416058E01FFC8307F020B3082DD51FF49A96742D2627B3326AD4A82B1EB3B2BBA0A0E0A67EBF016324D6BCFFFEFBEDE9322DAAAC1863B4597D2B036D1A33428150C03F02C342E48A0E199372A7C9C5CD5ED3A2E1A154F6B4A872135559396AE29E94B9AE4020B0B8A4A4A43DD53D2DEA59090D037D36D0CD0A428150C03F02C34264BB0EC93C784D8B6DC4EDEFEC21F5324635D8A6D6AC7851585838DEB8AD0B55555567B5AB627FA72E876603750CE49E158402A1807F048685C8351D0A555A825E73A129CF4B962C7192DD205946478DEFDEA9CB7618282D66C542B387860D1BF677F387CF5557571F308EE972B22BD86A5138F33BF66B08C83C0E2661100805FC837FF0001E641734BA52585838AF875D9F9D2953A6B833F4D4E3A291175BC4D0A3765D568FCAEAD5ABDDE5F6BD2BD87A1B6CFBDDB39244B5E5B7DA9CC89C48FB84091376565656EEFCFEFBEF0F1C3F7EBCD3E34F3A6450B4EBB23632D4DE405A6EDF989415037151388402A1807F04868518683A149AF21CECC9B8F421B6F579EA727FA1BE93D09BD1742835CE1EF2EE4B60A235F4462BB49A5E3EF4A920140805FC23302CC440D3A1D08AB83551393EA1D072FB5AC136E945E1000983C0B0101816021DEA63A1E216635E86AA10112A48B4461914B750A15118EDBAAC5612B23F0983C0B0C03FF8070FE0010008054201FF080C0B810E010C0B8150C03FF8070FE00186059030088402FEC13F78000F004028100AF84760580874089030088402FEC13F78000F004028100A0C0B816121D02100100A8402FE111816021D02240C02A1807FF00F1EC00300100A8402FE111816021D02181602A1807FF00F1EC003004818044201FFE01F3C80070020140805FC23302C043A044818044201FFE01F3C80070020140805FC23302C043A0400428150C03F02C342A0438084412014F00FFEC1037800406A515B5BCB059A3D71D108C565F847E41BFFE0013C00202E1A1A1A5ADBDADAB848B3205A5A5ABE3142B10FFE11F9C63F78000F00888B4D9B360DA9ABAB3B77F2E4C99FB858FDBBA391486CDCB8F1888917E11F916FFC8307F000808460C8F99C71D4DB5406D4D82591F1D0FF7D5FBE8A04FC837FF0001E0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000069C7FF019605ECCABE3E43410000000049454E44AE426082, 1); +INSERT INTO `act_ge_bytearray` VALUES ('250042', 1, '设备盘点任务.bpmn', '250041', 0x3C3F786D6C2076657273696F6E3D22312E302220656E636F64696E673D225554462D38223F3E0D0A3C62706D6E3A646566696E6974696F6E7320786D6C6E733A7873693D22687474703A2F2F7777772E77332E6F72672F323030312F584D4C536368656D612D696E7374616E63652220786D6C6E733A62706D6E3D22687474703A2F2F7777772E6F6D672E6F72672F737065632F42504D4E2F32303130303532342F4D4F44454C2220786D6C6E733A62706D6E64693D22687474703A2F2F7777772E6F6D672E6F72672F737065632F42504D4E2F32303130303532342F44492220786D6C6E733A64633D22687474703A2F2F7777772E6F6D672E6F72672F737065632F44442F32303130303532342F44432220786D6C6E733A64693D22687474703A2F2F7777772E6F6D672E6F72672F737065632F44442F32303130303532342F44492220786D6C6E733A666C6F7761626C653D22687474703A2F2F666C6F7761626C652E6F72672F62706D6E222069643D22446566696E6974696F6E735F3031616371666B22207461726765744E616D6573706163653D22687474703A2F2F62706D6E2E696F2F736368656D612F62706D6E223E0D0A20203C62706D6E3A70726F636573732069643D2265616D5F6465766963655F73746F636B74616B696E6722206E616D653D22E8AEBEE5A487E79B98E782B9E4BBBBE58AA12220697345786563757461626C653D2274727565223E0D0A202020203C62706D6E3A73746172744576656E742069643D224576656E745F306A78373275352220666C6F7761626C653A696E69746961746F723D22696E69746961746F72223E0D0A2020202020203C62706D6E3A6F7574676F696E673E466C6F775F3135716C786C613C2F62706D6E3A6F7574676F696E673E0D0A202020203C2F62706D6E3A73746172744576656E743E0D0A202020203C62706D6E3A757365725461736B2069643D2269645F3022206E616D653D22E58F91E8B5B72220666C6F7761626C653A666F726D4B65793D2265616D5F6465766963655F73746F636B74616B696E67223E0D0A2020202020203C62706D6E3A657874656E73696F6E456C656D656E74733E0D0A20202020202020203C666C6F7761626C653A61737369676E6565547970653E7374617469633C2F666C6F7761626C653A61737369676E6565547970653E0D0A20202020202020203C666C6F7761626C653A73746174696341737369676E65655661726961626C65733E5B5D3C2F666C6F7761626C653A73746174696341737369676E65655661726961626C65733E0D0A20202020202020203C666C6F7761626C653A7461736B4C697374656E657220636C6173733D22636F6D2E7979792E666C6F7761626C652E6C697374656E65722E466C6F775461736B4C697374656E657222206576656E743D2263726561746522202F3E0D0A2020202020203C2F62706D6E3A657874656E73696F6E456C656D656E74733E0D0A2020202020203C62706D6E3A696E636F6D696E673E466C6F775F3135716C786C613C2F62706D6E3A696E636F6D696E673E0D0A2020202020203C62706D6E3A6F7574676F696E673E466C6F775F31366F36376F773C2F62706D6E3A6F7574676F696E673E0D0A202020203C2F62706D6E3A757365725461736B3E0D0A202020203C62706D6E3A73657175656E6365466C6F772069643D22466C6F775F3135716C786C612220736F757263655265663D224576656E745F306A783732753522207461726765745265663D2269645F3022202F3E0D0A202020203C62706D6E3A757365725461736B2069643D2269645F3122206E616D653D22E5A484E7BDAE2220666C6F7761626C653A647565446174653D22247B647565446174657D2220666C6F7761626C653A666F726D4B65793D2265616D5F6465766963655F73746F636B74616B696E67223E0D0A2020202020203C62706D6E3A657874656E73696F6E456C656D656E74733E0D0A20202020202020203C666C6F7761626C653A61737369676E6565547970653E7374617469633C2F666C6F7761626C653A61737369676E6565547970653E0D0A20202020202020203C666C6F7761626C653A73746174696341737369676E65655661726961626C65733E5B5D3C2F666C6F7761626C653A73746174696341737369676E65655661726961626C65733E0D0A20202020202020203C666C6F7761626C653A7461736B4C697374656E657220636C6173733D22636F6D2E7979792E666C6F7761626C652E6C697374656E65722E466C6F775461736B4C697374656E657222206576656E743D2263726561746522202F3E0D0A2020202020203C2F62706D6E3A657874656E73696F6E456C656D656E74733E0D0A2020202020203C62706D6E3A696E636F6D696E673E466C6F775F31366F36376F773C2F62706D6E3A696E636F6D696E673E0D0A2020202020203C62706D6E3A6F7574676F696E673E466C6F775F306F6B6A6671643C2F62706D6E3A6F7574676F696E673E0D0A202020203C2F62706D6E3A757365725461736B3E0D0A202020203C62706D6E3A73657175656E6365466C6F772069643D22466C6F775F31366F36376F772220736F757263655265663D2269645F3022207461726765745265663D2269645F3122202F3E0D0A202020203C62706D6E3A757365725461736B2069643D2269645F3222206E616D653D22E9AA8CE694B62220666C6F7761626C653A647565446174653D22247B647565446174657D2220666C6F7761626C653A666F726D4B65793D2265616D5F6465766963655F73746F636B74616B696E67223E0D0A2020202020203C62706D6E3A657874656E73696F6E456C656D656E74733E0D0A20202020202020203C666C6F7761626C653A61737369676E6565547970653E7374617469633C2F666C6F7761626C653A61737369676E6565547970653E0D0A20202020202020203C666C6F7761626C653A73746174696341737369676E65655661726961626C65733E5B5D3C2F666C6F7761626C653A73746174696341737369676E65655661726961626C65733E0D0A20202020202020203C666C6F7761626C653A7461736B4C697374656E657220636C6173733D22636F6D2E7979792E666C6F7761626C652E6C697374656E65722E466C6F775461736B4C697374656E657222206576656E743D2263726561746522202F3E0D0A20202020202020203C666C6F7761626C653A61737369676E6565547970653E7374617469633C2F666C6F7761626C653A61737369676E6565547970653E0D0A2020202020203C2F62706D6E3A657874656E73696F6E456C656D656E74733E0D0A2020202020203C62706D6E3A696E636F6D696E673E466C6F775F306F6B6A6671643C2F62706D6E3A696E636F6D696E673E0D0A2020202020203C62706D6E3A6F7574676F696E673E466C6F775F31366B3834667A3C2F62706D6E3A6F7574676F696E673E0D0A202020203C2F62706D6E3A757365725461736B3E0D0A202020203C62706D6E3A73657175656E6365466C6F772069643D22466C6F775F306F6B6A6671642220736F757263655265663D2269645F3122207461726765745265663D2269645F3222202F3E0D0A202020203C62706D6E3A656E644576656E742069643D224576656E745F306E6172317574223E0D0A2020202020203C62706D6E3A696E636F6D696E673E466C6F775F31366B3834667A3C2F62706D6E3A696E636F6D696E673E0D0A202020203C2F62706D6E3A656E644576656E743E0D0A202020203C62706D6E3A73657175656E6365466C6F772069643D22466C6F775F31366B3834667A2220736F757263655265663D2269645F3222207461726765745265663D224576656E745F306E617231757422202F3E0D0A20203C2F62706D6E3A70726F636573733E0D0A20203C62706D6E64693A42504D4E4469616772616D2069643D2242504D4E4469616772616D5F31223E0D0A202020203C62706D6E64693A42504D4E506C616E652069643D2242504D4E506C616E655F31222062706D6E456C656D656E743D2274657374223E0D0A2020202020203C62706D6E64693A42504D4E53686170652069643D224576656E745F306A78373275355F6469222062706D6E456C656D656E743D224576656E745F306A7837327535223E0D0A20202020202020203C64633A426F756E647320783D222D3335382220793D222D333038222077696474683D22333622206865696768743D22333622202F3E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E53686170652069643D2241637469766974795F313036316736755F6469222062706D6E456C656D656E743D2269645F30223E0D0A20202020202020203C64633A426F756E647320783D222D3237302220793D222D333330222077696474683D2231303022206865696768743D22383022202F3E0D0A20202020202020203C62706D6E64693A42504D4E4C6162656C202F3E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E53686170652069643D2241637469766974795F3065747062726B5F6469222062706D6E456C656D656E743D2269645F31223E0D0A20202020202020203C64633A426F756E647320783D222D3131302220793D222D333330222077696474683D2231303022206865696768743D22383022202F3E0D0A20202020202020203C62706D6E64693A42504D4E4C6162656C202F3E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E53686170652069643D2242504D4E53686170655F31756F72763274222062706D6E456C656D656E743D2269645F32223E0D0A20202020202020203C64633A426F756E647320783D2232302220793D222D333330222077696474683D2231303022206865696768743D22383022202F3E0D0A20202020202020203C62706D6E64693A42504D4E4C6162656C202F3E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E53686170652069643D224576656E745F306E61723175745F6469222062706D6E456C656D656E743D224576656E745F306E6172317574223E0D0A20202020202020203C64633A426F756E647320783D223135322220793D222D333038222077696474683D22333622206865696768743D22333622202F3E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E456467652069643D22466C6F775F3135716C786C615F6469222062706D6E456C656D656E743D22466C6F775F3135716C786C61223E0D0A20202020202020203C64693A776179706F696E7420783D222D3332322220793D222D32393022202F3E0D0A20202020202020203C64693A776179706F696E7420783D222D3237302220793D222D32393022202F3E0D0A2020202020203C2F62706D6E64693A42504D4E456467653E0D0A2020202020203C62706D6E64693A42504D4E456467652069643D22466C6F775F31366F36376F775F6469222062706D6E456C656D656E743D22466C6F775F31366F36376F77223E0D0A20202020202020203C64693A776179706F696E7420783D222D3137302220793D222D32393022202F3E0D0A20202020202020203C64693A776179706F696E7420783D222D3131302220793D222D32393022202F3E0D0A2020202020203C2F62706D6E64693A42504D4E456467653E0D0A2020202020203C62706D6E64693A42504D4E456467652069643D22466C6F775F306F6B6A6671645F6469222062706D6E456C656D656E743D22466C6F775F306F6B6A667164223E0D0A20202020202020203C64693A776179706F696E7420783D222D31302220793D222D32393022202F3E0D0A20202020202020203C64693A776179706F696E7420783D2232302220793D222D32393022202F3E0D0A2020202020203C2F62706D6E64693A42504D4E456467653E0D0A2020202020203C62706D6E64693A42504D4E456467652069643D22466C6F775F31366B3834667A5F6469222062706D6E456C656D656E743D22466C6F775F31366B3834667A223E0D0A20202020202020203C64693A776179706F696E7420783D223132302220793D222D32393022202F3E0D0A20202020202020203C64693A776179706F696E7420783D223135322220793D222D32393022202F3E0D0A2020202020203C2F62706D6E64693A42504D4E456467653E0D0A202020203C2F62706D6E64693A42504D4E506C616E653E0D0A20203C2F62706D6E64693A42504D4E4469616772616D3E0D0A3C2F62706D6E3A646566696E6974696F6E733E0D0A, 0); +INSERT INTO `act_ge_bytearray` VALUES ('250043', 1, '设备盘点任务.eam_device_stocktaking.png', '250041', 0x89504E470D0A1A0A0000000D494844520000022C0000005A08060000009B930D1C000010EB4944415478DAED9D7D6C54551AC64DD4648D26FAC71AD7A851136288D9A8316BDC3F5663CC1A35D1E01FD6C20022AD2822A915178808B25411612B208528DA08CB12B1E9CAC736845DA0D096E054218485F291EDF225944281055A2A528A77CF7333677267E87466DA99B9339DDF93BC99E99D7EDCE93CF7799FFB9EF79C73CD3520AD701CE7BA83070F563736365EA9ADAD75366CD8406438366EDCE83434349C363102FEC1877CE41F3C800700C4854462CB962D4E5B5B9B73E9D225C2A73875EA94535F5F7FDE88C68BF08FC837FEC1037800405CE88E0691C81AB1B864EE74F6C13F22DFF8070FE0010071A1F22B1769F684118ACBF08FC837FEC1037800405C68EC920B34AB84C2817F44BEF10F1EC0030052261417CEB53A07B72D71F66C2C7343CF758C8B1BA1807FF00F1EC00300B242283ACEB6384DFF9AE6FC7BEDC488D031BDC6058E50C03FF8070FE00100BE0BC5D13DFFB84A246C1CDB53C3058E50C03FF8070FE00100FE0BC5BECDB3630A855EE3024728E01FFC8307F00000DF85A269C39F630A855EE3024728E01FFC8307F000008402A1807FF00FC3020FD021806189475E75E3C7120ABDC6058E50C03FF8070FE00100BE0B45F3D685318542AF71812314F00FFEC103780080EF4271A66597D3B47EFAD56558734CAF71812314F00FFEC103780080EF42A138B47DD95542A1635CDC0805FC837FF0001E00901D42F1F3CF4EF3779F5D5D8635C7F41A17384201FFE01F3C800700F82A145A41F23F5B2B628E1DEB3556994428E01FFC8307F000007F84C2DCB1B4366F7276FF734A4C91B0A1EFD1F772978350C03FF8070FE0010019138A787733DCE52014F00FFEC103780080EF4291C8DD4C6F77395CF00805FC837FF0001E009076A1E8AB48D8E0824728E01FFC8307F00080CC8C1D130805FC837FF0001EE4005E79E5955B860E1DFAA2890A134113AD261C4FE8EB606161E197C3860D1B61E2D75971E2C78E1D7B70D5AA55F3172D5AD43475EAD48EF1E3C75F193E7C78F8C4C78C19D3F5CE3BEF9C99316346437979F958F3467F8561E1024528E01F816121724B878C0179CEE4F51A6340BAA30C4ADC303FB3C1C40B4F3CF1C475193D69C771AE0B068393162C58D06A0C89336BD62C67E5CA95CECE9D3B9D969616A7BBBBDBB13873E68CB36BD72E67F5EAD5CEC2850B1D6358BA274E9CF85D5151D183181602A1807FF00F1EC083ECD62163387E67CC4663B22625466C33BFEB998C9C787D7D7DD1BC79F33AC68D1BE75457573BADADAD4E32387BF6ACFBE1BCF9E69B974B4A4AB69A93BF8784412014F00FFEC10378905D5035C4988B593D5554264F9EEC7A80AD5BB73A3FFEF8A373F1E24537C7777575B95F373636BA858C69D3A6C5322E15691B715155A5AAAA6A77515191B362C58AF0C9F515AAC2A8EA3272E4C8CBC5C5C5934918044201FFE01F3C8007D981E1C387DF195D5531F9DA59B26449D2858AC3870F3B9595951A6189362DBBF577527AE2E6E4EEA9A8A8682B2D2D75FF702AA1DFF7F6DB6F5F1C3366CCF27CE86F4128100AF8476058886CD621635406070281E35E73A1D68FB6B6B67EE57BB588949595459B96A3291B699159D11090CA3A1ACE490754AD99397366677171F1BA8C37E4201408058685C0B010E850B8B2E2352BAAAAD4D5D545F4A6F6175BB66C717F6F4A4D8B868154599159E9EF10502243441F7EF861BB791395240C02C302FFE01F3C8007BEF4AC84878134E377FFFEFD69C9F9EA71891A22DA5D505070539F4F5E3D2B1A066A6F6F77320199A292929276F34F9A44C220302CF00FFEC1037890D1A1A059DECA4ABACC8AD7B478974151236E9F4EBCA1A1618C1A6C53DDB392484F8B7903178DD31A44C220302CF00FFEC10378907E84A62E87670369182813D0F050D47A2DC94D79D650D0279F7C7241B381FCC0CA952BCF19D3B29284416058E01FFC8307F02023D595466F836D2A7B56E221AA11775B52BDAC5A144EEBACA4BB6FA5B77E96A2A2A2938140E02112068161817FF00F1EC083F421B4826D7828A8BFB381FA327BC8DBCFA21571133EF9B973E7B66A41183F515353A3AEE1BF9130080C0BFC837FF0001EA47538A8C69A05ADB3E207962F5F1EB18C7F4227AEBD81B4DC7EB20BC3A41A9A421D0804FE37D0D6664128100AF8476058886CD1216D64E8ED5DF12BF7ABAAE36DC04D68C3446D643867CE1C271BF0EEBBEF6E53A92A1712416863A73F20140805FC23FCE21F3C8007C9F221B4EB7278B97D3FE15DC65FBB3CC77D830B162CD8A3F5FFB3014B972EDDDDE7694E992FA9854B59C664FD1EA1C0B0C03F22D3FC8307F020593E28C7DAEFF3BB1544DEC39E8B39DF2FE3BEC1A953A77668D7E56CC08E1D3B9ACD890773296178625D4FCE16A1C0B0C03F22DD86051EA04389F24139D6BEAE8D0CFD84D665F19C6BFCDC3F7EFCF82B7EF7AF589C3E7DFA8239E9D61C4D186167EB2508428161817F44060D0B3CC0B0F4CA07E5587B5CBB2CFB89969616EF79C6CFFD6A7AC9E4FCEB78D089E772C2F03A5B95E4100A0C0BFC23326D58E0018625161FBC5F777575F99AEFF5F7BDE793D01BCC2624F00FCFA94028B22B061ABFE01FFC8307F0A0AF916D393FD72A2C1D03A0C2E2CE74B22BF7E58250D4D6D63AE7CF9F77D6AD5BA7FFBDBB80604D4D8D535F5F1FF367AEBFFE7AE7D5575FE5CE06FEA524C4BB65CB96C5E597B879D75D77394F3EF9A4B366CD1A375E7EF96537F43CFAF7E4718525277820DD79ECB1C7DCCFEED9679F755E7FFDF5084EE873ED8D33959595E1E79AF14285253E1FBCC7FD5A2CB6CF159637DE78E352B6F4B09C3C79B229877B5822042257C68E45585DEC3B76EC70060D1AE43CF2C8231182F0F4D34F477CBFBE4FE272EDB5D73A3367CE74BFE7D0A143AED8E8F8534F3DE58C1D3B16C302FF128EBD7BF7BA3CF29EABBED64A98B112D5AE5DBBDCC72FBEF8C2E9E8E8709F6BE3367B2C8F0D4BCEF1409A220E3CFAE8A3EE7BD0B1E3C78FBB9FE5F3CF3FDFAB61110F3A3B3BDDE75A880CC3129F0FDE1E964CEF1DD8EF1E964993269DC8965942C160B02E07670905B5AC70ACBD10B23D61CC9F3FDFBDD857AD5AE53ECA70D8BB563DEA6ED50A8335383D25147B5C559A9B6FBE19C302FF120E190C5554C4373DCA78C83CBFF4D24B310DF6A2458BC209EDDB6FBF0D5756F4A8DF938786256779A0CF6CFBF6EDEEE3FAF5EBC3C79497B4519EB810FDFD7ACDEA52555595FBBCB4B4345C75D3D73FFCF0433E1B96987CC8E95942656565EBB3651D96B973E7D6E4D03A2C3DDEC9E45AC25072F00A812EFE58DFABFD1F1E7FFCF1880ACB1D77DCE1260C25171DBFFDF6DB9D2143866058E05F5209CBDE1DEBF9E6CD9B9DCF3FFFDCF9F4D34F23CAFE0A9BD834746013D3DD77DF1D91A864C2F3C8B0E43C0FF499353535851F070F1EACBDE5C2AF4F9F3EDDB9F1C61BDD4A4C7485CDFEDC881123220CADD617C9D30A4B5C3E78D76191DEE7D43A2CB367CF1E5D5E5EFE4B361816234235B9B2D26DA2C8951E025B56D59090ADAEA84FC02B1C0A95DFF5F8C0030F380F3FFC7044F956DB2BC800794D108605FEF516963B32BD36D9D8BB6755F04E9D3A1531CC239E3637373B5F7FFD75D8A02859D9E7BDF55DB1347FF60E49DB8A99CE5377FDF60648955FDD14BDF7DE7B11D55D6B58264C98E09A16DD28E9B56030E81E176FE0414CC392BB2BDD6AEF1E9394BA74F7ECF31A2CEA5F39C55E42FE849CF6575F7DE50EE978EF7C5466F57E9F9A7155A2D51D8CEE6C15563CAC9951231D4201FF12BDBB3E70E0809B98C42D3B9CE81D729411F6FE8C3531B6DAE7ADAE68088144955B3C500F9C970F4A5EFACCAD8EE875E5A79E7A982A2A2AC2C7ACF9FDF8E38F69FEEF3DE7DF62FEC797AD51D0F5E7D75E428140E097A4F612128CCBDA2CB1F01386787F65B7667F13874440257795E4431754F8AEC6C6BDF7DEEB2617DD01D9EA8B158AA3478FBA5FE7530F01FCEB7BD866593D9697974754487A6BBA55F2B286257A86108625F7782003AA1BA6B56BD7863F77CD5CD4739916DB5BE7ADC87CF0C107E1C902F62649C3883A76ECD8310C4BFC2A4B78B7E6C58B17E7CE6ECD82493C0FBEF6DA6BDD7E4D71EAEEEE3E6A4EF8BFC66D3D44C2C87C689AA8B7EF4463C65E03126D6C645A5461B1C6C48A8AAA2D5634D47F8050C0BF4463E9D2A5110948CFC5C3DE0C4BF47BCBE7DE855CE58186FAF4B9A91FCE1A583B24A8066C19503DD730A0FD19DB4C6B8712BD9FBF82E515E243AD17D62C8C1C39D2AD766412BA86478D1AE5ADAEBC90D41B78EBADB7EAFD6ABEFDE8A38F969A93AE2661643E6CD39ACCAA42A6E3FEFBEF0FCFB818376E5C4495C5DBE8A6D09D901D0A8A1E9B4628E05F22A1EAEE0D37DC104E4EEA8FD2D0E48913275C6E29BC7CA2C2327078A0CF52433EBA39926955D82A8AB44515DF5B6FBDB5D7AAB0E5839E6B585BCFF5080FE25659C2B385CACACA32BA1E9BFE9E77EA75BCA6F1AB505050F09BD1A3475FCAF4BCECBD7BF7D69B13EE307F7F100923B3A171622DDAA4BB1735BAC9A878AB2A2AD5DAD2ABCAB5128F23478E845FD79DD09C3973DCE121ADC372DF7DF7858D8C77CC19A1807F3D850C896684A871D27B5C4392E2959A69C5A5DB6EBBCDADE2A9995BC6C44E63D5D041B461B1959A6C5D9303C3D2736826D835A1B57464446D7F92CC8AFD6CBDFD75D6B0A8DA621B6EA36792D9FE1678D0338C6EFFD1BB664B5D5D5D4672BE6E2AA2F6397AA64F6F20100894949696FE94A9A1A1CECECE3DE66FEE3127FD2712068161817FF166B2656BE50EC392DACF191DCA5895E52FD63868D57B998974AFBB626E447EF11896FE2D63525C5CBC6CC68C1969372DDDDDDD878B8A8A369913FE8C84416058E01FFC8307F020B3082DD51FF49A96742D2627B3326AD4A82B1EB3B2BBA0A0E0A67EBF016324D6BCFFFEFBEDE9322DAAAC1863B4597D2B036D1A33428150C03F02C342E48A0E199372A7C9C5CD5ED3A2E1A154F6B4A872135559396AE29E94B9AE4020B0B8A4A4A43DD53D2DEA59090D037D36D0CD0A428150C03F02C34264BB0EC93C784D8B6DC4EDEFEC21F5324635D8A6D6AC7851585838DEB8AD0B55555567B5AB627FA72E876603750CE49E158402A1807F048685C8351D0A555A825E73A129CF4B962C7192DD205946478DEFDEA9CB7618282D66C542B387860D1BF677F387CF5557571F308EE972B22BD86A5138F33BF66B08C83C0E2661100805FC837FF0001E641734BA52585838AF875D9F9D2953A6B833F4D4E3A291175BC4D0A3765D568FCAEAD5ABDDE5F6BD2BD87A1B6CFBDDB39244B5E5B7DA9CC89C48FB84091376565656EEFCFEFBEF0F1C3F7EBCD3E34F3A6450B4EBB23632D4DE405A6EDF989415037151388402A1807F04868518683A149AF21CECC9B8F421B6F579EA727FA1BE93D09BD1742835CE1EF2EE4B60A235F4462BB49A5E3EF4A920140805FC23302CC440D3A1D08AB83551393EA1D072FB5AC136E945E1000983C0B0101816021DEA63A1E216635E86AA10112A48B4461914B750A15118EDBAAC5612B23F0983C0B0C03FF8070FE0010008054201FF080C0B810E010C0B8150C03FF8070FE00186059030088402FEC13F78000F004028100AF84760580874089030088402FEC13F78000F004028100A0C0B816121D02100100A8402FE111816021D02240C02A1807FF00F1EC00300100A8402FE111816021D02181602A1807FF00F1EC003004818044201FFE01F3C80070020140805FC23302C043A044818044201FFE01F3C80070020140805FC23302C043A0400428150C03F02C342A0438084412014F00FFEC1037800406A515B5BCB059A3D71D108C565F847E41BFFE0013C00202E1A1A1A5ADBDADAB848B3205A5A5ABE3142B10FFE11F9C63F78000F00888B4D9B360DA9ABAB3B77F2E4C99FB858FDBBA391486CDCB8F1888917E11F916FFC8307F000808460C8F99C71D4DB5406D4D82591F1D0FF7D5FBE8A04FC837FF0001E0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000069C7FF019605ECCABE3E43410000000049454E44AE426082, 1); + +-- ---------------------------- +-- Table structure for act_ge_property +-- ---------------------------- +DROP TABLE IF EXISTS `act_ge_property`; +CREATE TABLE `act_ge_property` ( + `NAME_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `VALUE_` varchar(300) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `REV_` int NULL DEFAULT NULL, + PRIMARY KEY (`NAME_`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_bin ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_ge_property +-- ---------------------------- +INSERT INTO `act_ge_property` VALUES ('batch.schema.version', '6.8.0.0', 1); +INSERT INTO `act_ge_property` VALUES ('cfg.execution-related-entities-count', 'true', 1); +INSERT INTO `act_ge_property` VALUES ('cfg.task-related-entities-count', 'true', 1); +INSERT INTO `act_ge_property` VALUES ('common.schema.version', '6.8.0.0', 1); +INSERT INTO `act_ge_property` VALUES ('entitylink.schema.version', '6.8.0.0', 1); +INSERT INTO `act_ge_property` VALUES ('eventsubscription.schema.version', '6.8.0.0', 1); +INSERT INTO `act_ge_property` VALUES ('identitylink.schema.version', '6.8.0.0', 1); +INSERT INTO `act_ge_property` VALUES ('job.schema.version', '6.8.0.0', 1); +INSERT INTO `act_ge_property` VALUES ('next.dbid', '252501', 102); +INSERT INTO `act_ge_property` VALUES ('schema.history', 'create(6.8.0.0)', 1); +INSERT INTO `act_ge_property` VALUES ('schema.version', '6.8.0.0', 1); +INSERT INTO `act_ge_property` VALUES ('task.schema.version', '6.8.0.0', 1); +INSERT INTO `act_ge_property` VALUES ('variable.schema.version', '6.8.0.0', 1); + +-- ---------------------------- +-- Table structure for act_hi_actinst +-- ---------------------------- +DROP TABLE IF EXISTS `act_hi_actinst`; +CREATE TABLE `act_hi_actinst` ( + `ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `REV_` int NULL DEFAULT 1, + `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `PROC_INST_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `EXECUTION_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `ACT_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `TASK_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `CALL_PROC_INST_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `ACT_NAME_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `ACT_TYPE_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `ASSIGNEE_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `START_TIME_` datetime(3) NOT NULL, + `END_TIME_` datetime(3) NULL DEFAULT NULL, + `TRANSACTION_ORDER_` int NULL DEFAULT NULL, + `DURATION_` bigint NULL DEFAULT NULL, + `DELETE_REASON_` varchar(4000) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT '', + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_IDX_HI_ACT_INST_START`(`START_TIME_` ASC) USING BTREE, + INDEX `ACT_IDX_HI_ACT_INST_END`(`END_TIME_` ASC) USING BTREE, + INDEX `ACT_IDX_HI_ACT_INST_PROCINST`(`PROC_INST_ID_` ASC, `ACT_ID_` ASC) USING BTREE, + INDEX `ACT_IDX_HI_ACT_INST_EXEC`(`EXECUTION_ID_` ASC, `ACT_ID_` ASC) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_bin ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_hi_actinst +-- ---------------------------- + +-- ---------------------------- +-- Table structure for act_hi_attachment +-- ---------------------------- +DROP TABLE IF EXISTS `act_hi_attachment`; +CREATE TABLE `act_hi_attachment` ( + `ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `REV_` int NULL DEFAULT NULL, + `USER_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `NAME_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `DESCRIPTION_` varchar(4000) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `TYPE_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `TASK_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `PROC_INST_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `URL_` varchar(4000) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `CONTENT_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `TIME_` datetime(3) NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_bin ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_hi_attachment +-- ---------------------------- + +-- ---------------------------- +-- Table structure for act_hi_comment +-- ---------------------------- +DROP TABLE IF EXISTS `act_hi_comment`; +CREATE TABLE `act_hi_comment` ( + `ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `TYPE_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `TIME_` datetime(3) NOT NULL, + `USER_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `TASK_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `PROC_INST_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `ACTION_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `MESSAGE_` varchar(4000) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `FULL_MSG_` longblob NULL, + PRIMARY KEY (`ID_`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_bin ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_hi_comment +-- ---------------------------- + +-- ---------------------------- +-- Table structure for act_hi_detail +-- ---------------------------- +DROP TABLE IF EXISTS `act_hi_detail`; +CREATE TABLE `act_hi_detail` ( + `ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `TYPE_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `PROC_INST_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `EXECUTION_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `TASK_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `ACT_INST_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `NAME_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `VAR_TYPE_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `REV_` int NULL DEFAULT NULL, + `TIME_` datetime(3) NOT NULL, + `BYTEARRAY_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `DOUBLE_` double NULL DEFAULT NULL, + `LONG_` bigint NULL DEFAULT NULL, + `TEXT_` varchar(4000) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `TEXT2_` varchar(4000) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_IDX_HI_DETAIL_PROC_INST`(`PROC_INST_ID_` ASC) USING BTREE, + INDEX `ACT_IDX_HI_DETAIL_ACT_INST`(`ACT_INST_ID_` ASC) USING BTREE, + INDEX `ACT_IDX_HI_DETAIL_TIME`(`TIME_` ASC) USING BTREE, + INDEX `ACT_IDX_HI_DETAIL_NAME`(`NAME_` ASC) USING BTREE, + INDEX `ACT_IDX_HI_DETAIL_TASK_ID`(`TASK_ID_` ASC) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_bin ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_hi_detail +-- ---------------------------- + +-- ---------------------------- +-- Table structure for act_hi_entitylink +-- ---------------------------- +DROP TABLE IF EXISTS `act_hi_entitylink`; +CREATE TABLE `act_hi_entitylink` ( + `ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `LINK_TYPE_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `CREATE_TIME_` datetime(3) NULL DEFAULT NULL, + `SCOPE_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `SUB_SCOPE_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `SCOPE_TYPE_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `SCOPE_DEFINITION_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `PARENT_ELEMENT_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `REF_SCOPE_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `REF_SCOPE_TYPE_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `REF_SCOPE_DEFINITION_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `ROOT_SCOPE_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `ROOT_SCOPE_TYPE_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `HIERARCHY_TYPE_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_IDX_HI_ENT_LNK_SCOPE`(`SCOPE_ID_` ASC, `SCOPE_TYPE_` ASC, `LINK_TYPE_` ASC) USING BTREE, + INDEX `ACT_IDX_HI_ENT_LNK_REF_SCOPE`(`REF_SCOPE_ID_` ASC, `REF_SCOPE_TYPE_` ASC, `LINK_TYPE_` ASC) USING BTREE, + INDEX `ACT_IDX_HI_ENT_LNK_ROOT_SCOPE`(`ROOT_SCOPE_ID_` ASC, `ROOT_SCOPE_TYPE_` ASC, `LINK_TYPE_` ASC) USING BTREE, + INDEX `ACT_IDX_HI_ENT_LNK_SCOPE_DEF`(`SCOPE_DEFINITION_ID_` ASC, `SCOPE_TYPE_` ASC, `LINK_TYPE_` ASC) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_bin ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_hi_entitylink +-- ---------------------------- + +-- ---------------------------- +-- Table structure for act_hi_identitylink +-- ---------------------------- +DROP TABLE IF EXISTS `act_hi_identitylink`; +CREATE TABLE `act_hi_identitylink` ( + `ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `GROUP_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `TYPE_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `USER_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `TASK_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `CREATE_TIME_` datetime(3) NULL DEFAULT NULL, + `PROC_INST_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `SCOPE_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `SUB_SCOPE_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `SCOPE_TYPE_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `SCOPE_DEFINITION_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_IDX_HI_IDENT_LNK_USER`(`USER_ID_` ASC) USING BTREE, + INDEX `ACT_IDX_HI_IDENT_LNK_SCOPE`(`SCOPE_ID_` ASC, `SCOPE_TYPE_` ASC) USING BTREE, + INDEX `ACT_IDX_HI_IDENT_LNK_SUB_SCOPE`(`SUB_SCOPE_ID_` ASC, `SCOPE_TYPE_` ASC) USING BTREE, + INDEX `ACT_IDX_HI_IDENT_LNK_SCOPE_DEF`(`SCOPE_DEFINITION_ID_` ASC, `SCOPE_TYPE_` ASC) USING BTREE, + INDEX `ACT_IDX_HI_IDENT_LNK_TASK`(`TASK_ID_` ASC) USING BTREE, + INDEX `ACT_IDX_HI_IDENT_LNK_PROCINST`(`PROC_INST_ID_` ASC) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_bin ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_hi_identitylink +-- ---------------------------- + +-- ---------------------------- +-- Table structure for act_hi_procinst +-- ---------------------------- +DROP TABLE IF EXISTS `act_hi_procinst`; +CREATE TABLE `act_hi_procinst` ( + `ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `REV_` int NULL DEFAULT 1, + `PROC_INST_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `BUSINESS_KEY_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `START_TIME_` datetime(3) NOT NULL, + `END_TIME_` datetime(3) NULL DEFAULT NULL, + `DURATION_` bigint NULL DEFAULT NULL, + `START_USER_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `START_ACT_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `END_ACT_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `SUPER_PROCESS_INSTANCE_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `DELETE_REASON_` varchar(4000) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT '', + `NAME_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `CALLBACK_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `CALLBACK_TYPE_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `REFERENCE_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `REFERENCE_TYPE_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `PROPAGATED_STAGE_INST_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `BUSINESS_STATUS_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE, + UNIQUE INDEX `PROC_INST_ID_`(`PROC_INST_ID_` ASC) USING BTREE, + INDEX `ACT_IDX_HI_PRO_INST_END`(`END_TIME_` ASC) USING BTREE, + INDEX `ACT_IDX_HI_PRO_I_BUSKEY`(`BUSINESS_KEY_` ASC) USING BTREE, + INDEX `ACT_IDX_HI_PRO_SUPER_PROCINST`(`SUPER_PROCESS_INSTANCE_ID_` ASC) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_bin ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_hi_procinst +-- ---------------------------- + +-- ---------------------------- +-- Table structure for act_hi_taskinst +-- ---------------------------- +DROP TABLE IF EXISTS `act_hi_taskinst`; +CREATE TABLE `act_hi_taskinst` ( + `ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `REV_` int NULL DEFAULT 1, + `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `TASK_DEF_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `TASK_DEF_KEY_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `PROC_INST_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `EXECUTION_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `SCOPE_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `SUB_SCOPE_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `SCOPE_TYPE_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `SCOPE_DEFINITION_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `PROPAGATED_STAGE_INST_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `NAME_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `PARENT_TASK_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `DESCRIPTION_` varchar(4000) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `OWNER_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `ASSIGNEE_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `START_TIME_` datetime(3) NOT NULL, + `CLAIM_TIME_` datetime(3) NULL DEFAULT NULL, + `END_TIME_` datetime(3) NULL DEFAULT NULL, + `DURATION_` bigint NULL DEFAULT NULL, + `DELETE_REASON_` varchar(4000) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `PRIORITY_` int NULL DEFAULT NULL, + `DUE_DATE_` datetime(3) NULL DEFAULT NULL, + `FORM_KEY_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `CATEGORY_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT '', + `LAST_UPDATED_TIME_` datetime(3) NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_IDX_HI_TASK_SCOPE`(`SCOPE_ID_` ASC, `SCOPE_TYPE_` ASC) USING BTREE, + INDEX `ACT_IDX_HI_TASK_SUB_SCOPE`(`SUB_SCOPE_ID_` ASC, `SCOPE_TYPE_` ASC) USING BTREE, + INDEX `ACT_IDX_HI_TASK_SCOPE_DEF`(`SCOPE_DEFINITION_ID_` ASC, `SCOPE_TYPE_` ASC) USING BTREE, + INDEX `ACT_IDX_HI_TASK_INST_PROCINST`(`PROC_INST_ID_` ASC) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_bin ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_hi_taskinst +-- ---------------------------- + +-- ---------------------------- +-- Table structure for act_hi_tsk_log +-- ---------------------------- +DROP TABLE IF EXISTS `act_hi_tsk_log`; +CREATE TABLE `act_hi_tsk_log` ( + `ID_` bigint NOT NULL AUTO_INCREMENT, + `TYPE_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `TASK_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `TIME_STAMP_` timestamp(3) NOT NULL, + `USER_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `DATA_` varchar(4000) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `EXECUTION_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `PROC_INST_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `SCOPE_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `SCOPE_DEFINITION_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `SUB_SCOPE_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `SCOPE_TYPE_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT '', + PRIMARY KEY (`ID_`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_bin ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_hi_tsk_log +-- ---------------------------- + +-- ---------------------------- +-- Table structure for act_hi_varinst +-- ---------------------------- +DROP TABLE IF EXISTS `act_hi_varinst`; +CREATE TABLE `act_hi_varinst` ( + `ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `REV_` int NULL DEFAULT 1, + `PROC_INST_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `EXECUTION_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `TASK_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `NAME_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `VAR_TYPE_` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `SCOPE_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `SUB_SCOPE_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `SCOPE_TYPE_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `BYTEARRAY_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `DOUBLE_` double NULL DEFAULT NULL, + `LONG_` bigint NULL DEFAULT NULL, + `TEXT_` varchar(4000) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `TEXT2_` varchar(4000) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `CREATE_TIME_` datetime(3) NULL DEFAULT NULL, + `LAST_UPDATED_TIME_` datetime(3) NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_IDX_HI_PROCVAR_NAME_TYPE`(`NAME_` ASC, `VAR_TYPE_` ASC) USING BTREE, + INDEX `ACT_IDX_HI_VAR_SCOPE_ID_TYPE`(`SCOPE_ID_` ASC, `SCOPE_TYPE_` ASC) USING BTREE, + INDEX `ACT_IDX_HI_VAR_SUB_ID_TYPE`(`SUB_SCOPE_ID_` ASC, `SCOPE_TYPE_` ASC) USING BTREE, + INDEX `ACT_IDX_HI_PROCVAR_PROC_INST`(`PROC_INST_ID_` ASC) USING BTREE, + INDEX `ACT_IDX_HI_PROCVAR_TASK_ID`(`TASK_ID_` ASC) USING BTREE, + INDEX `ACT_IDX_HI_PROCVAR_EXE`(`EXECUTION_ID_` ASC) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_bin ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_hi_varinst +-- ---------------------------- + +-- ---------------------------- +-- Table structure for act_id_bytearray +-- ---------------------------- +DROP TABLE IF EXISTS `act_id_bytearray`; +CREATE TABLE `act_id_bytearray` ( + `ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `REV_` int NULL DEFAULT NULL, + `NAME_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `BYTES_` longblob NULL, + PRIMARY KEY (`ID_`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_bin ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_id_bytearray +-- ---------------------------- + +-- ---------------------------- +-- Table structure for act_id_group +-- ---------------------------- +DROP TABLE IF EXISTS `act_id_group`; +CREATE TABLE `act_id_group` ( + `ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `REV_` int NULL DEFAULT NULL, + `NAME_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `TYPE_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_bin ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_id_group +-- ---------------------------- + +-- ---------------------------- +-- Table structure for act_id_info +-- ---------------------------- +DROP TABLE IF EXISTS `act_id_info`; +CREATE TABLE `act_id_info` ( + `ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `REV_` int NULL DEFAULT NULL, + `USER_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `TYPE_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `KEY_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `VALUE_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `PASSWORD_` longblob NULL, + `PARENT_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_bin ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_id_info +-- ---------------------------- + +-- ---------------------------- +-- Table structure for act_id_membership +-- ---------------------------- +DROP TABLE IF EXISTS `act_id_membership`; +CREATE TABLE `act_id_membership` ( + `USER_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `GROUP_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + PRIMARY KEY (`USER_ID_`, `GROUP_ID_`) USING BTREE, + INDEX `ACT_FK_MEMB_GROUP`(`GROUP_ID_` ASC) USING BTREE, + CONSTRAINT `ACT_FK_MEMB_GROUP` FOREIGN KEY (`GROUP_ID_`) REFERENCES `act_id_group` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_MEMB_USER` FOREIGN KEY (`USER_ID_`) REFERENCES `act_id_user` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_bin ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_id_membership +-- ---------------------------- + +-- ---------------------------- +-- Table structure for act_id_priv +-- ---------------------------- +DROP TABLE IF EXISTS `act_id_priv`; +CREATE TABLE `act_id_priv` ( + `ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `NAME_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + PRIMARY KEY (`ID_`) USING BTREE, + UNIQUE INDEX `ACT_UNIQ_PRIV_NAME`(`NAME_` ASC) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_bin ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_id_priv +-- ---------------------------- + +-- ---------------------------- +-- Table structure for act_id_priv_mapping +-- ---------------------------- +DROP TABLE IF EXISTS `act_id_priv_mapping`; +CREATE TABLE `act_id_priv_mapping` ( + `ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `PRIV_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `USER_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `GROUP_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_FK_PRIV_MAPPING`(`PRIV_ID_` ASC) USING BTREE, + INDEX `ACT_IDX_PRIV_USER`(`USER_ID_` ASC) USING BTREE, + INDEX `ACT_IDX_PRIV_GROUP`(`GROUP_ID_` ASC) USING BTREE, + CONSTRAINT `ACT_FK_PRIV_MAPPING` FOREIGN KEY (`PRIV_ID_`) REFERENCES `act_id_priv` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_bin ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_id_priv_mapping +-- ---------------------------- + +-- ---------------------------- +-- Table structure for act_id_property +-- ---------------------------- +DROP TABLE IF EXISTS `act_id_property`; +CREATE TABLE `act_id_property` ( + `NAME_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `VALUE_` varchar(300) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `REV_` int NULL DEFAULT NULL, + PRIMARY KEY (`NAME_`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_bin ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_id_property +-- ---------------------------- +INSERT INTO `act_id_property` VALUES ('schema.version', '6.8.0.0', 1); + +-- ---------------------------- +-- Table structure for act_id_token +-- ---------------------------- +DROP TABLE IF EXISTS `act_id_token`; +CREATE TABLE `act_id_token` ( + `ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `REV_` int NULL DEFAULT NULL, + `TOKEN_VALUE_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `TOKEN_DATE_` timestamp(3) NULL DEFAULT NULL, + `IP_ADDRESS_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `USER_AGENT_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `USER_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `TOKEN_DATA_` varchar(2000) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_bin ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_id_token +-- ---------------------------- + +-- ---------------------------- +-- Table structure for act_id_user +-- ---------------------------- +DROP TABLE IF EXISTS `act_id_user`; +CREATE TABLE `act_id_user` ( + `ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `REV_` int NULL DEFAULT NULL, + `FIRST_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `LAST_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `DISPLAY_NAME_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `EMAIL_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `PWD_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `PICTURE_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT '', + PRIMARY KEY (`ID_`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_bin ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_id_user +-- ---------------------------- + +-- ---------------------------- +-- Table structure for act_procdef_info +-- ---------------------------- +DROP TABLE IF EXISTS `act_procdef_info`; +CREATE TABLE `act_procdef_info` ( + `ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `REV_` int NULL DEFAULT NULL, + `INFO_JSON_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE, + UNIQUE INDEX `ACT_UNIQ_INFO_PROCDEF`(`PROC_DEF_ID_` ASC) USING BTREE, + INDEX `ACT_IDX_INFO_PROCDEF`(`PROC_DEF_ID_` ASC) USING BTREE, + INDEX `ACT_FK_INFO_JSON_BA`(`INFO_JSON_ID_` ASC) USING BTREE, + CONSTRAINT `ACT_FK_INFO_JSON_BA` FOREIGN KEY (`INFO_JSON_ID_`) REFERENCES `act_ge_bytearray` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_INFO_PROCDEF` FOREIGN KEY (`PROC_DEF_ID_`) REFERENCES `act_re_procdef` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_bin ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_procdef_info +-- ---------------------------- + +-- ---------------------------- +-- Table structure for act_re_deployment +-- ---------------------------- +DROP TABLE IF EXISTS `act_re_deployment`; +CREATE TABLE `act_re_deployment` ( + `ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `NAME_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `CATEGORY_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `KEY_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT '', + `DEPLOY_TIME_` timestamp(3) NULL DEFAULT NULL, + `DERIVED_FROM_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `DERIVED_FROM_ROOT_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `PARENT_DEPLOYMENT_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `ENGINE_VERSION_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_bin ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_re_deployment +-- ---------------------------- +INSERT INTO `act_re_deployment` VALUES ('250001', '员工资产申请', 'eam_asset_employee_apply', NULL, '', '2024-10-10 16:18:42.074', NULL, NULL, '250001', NULL); +INSERT INTO `act_re_deployment` VALUES ('250005', '员工资产报失', 'eam_asset_employee_loss', NULL, '', '2024-10-10 16:19:05.127', NULL, NULL, '250005', NULL); +INSERT INTO `act_re_deployment` VALUES ('250009', '员工资产报修', 'eam_asset_employee_repair', NULL, '', '2024-10-10 16:19:27.724', NULL, NULL, '250009', NULL); +INSERT INTO `act_re_deployment` VALUES ('250013', '资产设备报废', 'eam_asset_scrap', NULL, '', '2024-10-10 16:19:47.806', NULL, NULL, '250013', NULL); +INSERT INTO `act_re_deployment` VALUES ('250017', '资产采购申请', 'eam_asset_purchase_apply', NULL, '', '2024-10-10 16:20:07.221', NULL, NULL, '250017', NULL); +INSERT INTO `act_re_deployment` VALUES ('250021', '员工资产交接', 'eam_asset_employee_handover', NULL, '', '2024-10-10 16:24:00.909', NULL, NULL, '250021', NULL); +INSERT INTO `act_re_deployment` VALUES ('250025', '物品领用申请', 'eam_asset_stock_goods_use', NULL, '', '2024-10-10 16:24:22.814', NULL, NULL, '250025', NULL); +INSERT INTO `act_re_deployment` VALUES ('250029', '设备报修维修', 'eam_device_repair', NULL, '', '2024-10-10 16:24:42.078', NULL, NULL, '250029', NULL); +INSERT INTO `act_re_deployment` VALUES ('250033', '设备巡检任务', 'eam_device_inspection', NULL, '', '2024-10-10 16:25:04.880', NULL, NULL, '250033', NULL); +INSERT INTO `act_re_deployment` VALUES ('250037', '设备保养任务', 'eam_device_maintenance', NULL, '', '2024-10-10 16:25:18.884', NULL, NULL, '250037', NULL); +INSERT INTO `act_re_deployment` VALUES ('250041', '设备盘点任务', 'eam_device_stocktaking', NULL, '', '2024-10-10 16:25:38.661', NULL, NULL, '250041', NULL); + +-- ---------------------------- +-- Table structure for act_re_model +-- ---------------------------- +DROP TABLE IF EXISTS `act_re_model`; +CREATE TABLE `act_re_model` ( + `ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `REV_` int NULL DEFAULT NULL, + `NAME_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `KEY_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `CATEGORY_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `CREATE_TIME_` timestamp(3) NULL DEFAULT NULL, + `LAST_UPDATE_TIME_` timestamp(3) NULL DEFAULT NULL, + `VERSION_` int NULL DEFAULT NULL, + `META_INFO_` varchar(4000) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `DEPLOYMENT_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `EDITOR_SOURCE_VALUE_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `EDITOR_SOURCE_EXTRA_VALUE_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT '', + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_FK_MODEL_SOURCE`(`EDITOR_SOURCE_VALUE_ID_` ASC) USING BTREE, + INDEX `ACT_FK_MODEL_SOURCE_EXTRA`(`EDITOR_SOURCE_EXTRA_VALUE_ID_` ASC) USING BTREE, + INDEX `ACT_FK_MODEL_DEPLOYMENT`(`DEPLOYMENT_ID_` ASC) USING BTREE, + CONSTRAINT `ACT_FK_MODEL_DEPLOYMENT` FOREIGN KEY (`DEPLOYMENT_ID_`) REFERENCES `act_re_deployment` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_MODEL_SOURCE` FOREIGN KEY (`EDITOR_SOURCE_VALUE_ID_`) REFERENCES `act_ge_bytearray` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_MODEL_SOURCE_EXTRA` FOREIGN KEY (`EDITOR_SOURCE_EXTRA_VALUE_ID_`) REFERENCES `act_ge_bytearray` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_bin ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_re_model +-- ---------------------------- + +-- ---------------------------- +-- Table structure for act_re_procdef +-- ---------------------------- +DROP TABLE IF EXISTS `act_re_procdef`; +CREATE TABLE `act_re_procdef` ( + `ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `REV_` int NULL DEFAULT NULL, + `CATEGORY_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `NAME_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `KEY_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `VERSION_` int NOT NULL, + `DEPLOYMENT_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `RESOURCE_NAME_` varchar(4000) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `DGRM_RESOURCE_NAME_` varchar(4000) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `DESCRIPTION_` varchar(4000) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `HAS_START_FORM_KEY_` tinyint NULL DEFAULT NULL, + `HAS_GRAPHICAL_NOTATION_` tinyint NULL DEFAULT NULL, + `SUSPENSION_STATE_` int NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT '', + `ENGINE_VERSION_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `DERIVED_FROM_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `DERIVED_FROM_ROOT_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `DERIVED_VERSION_` int NOT NULL DEFAULT 0, + PRIMARY KEY (`ID_`) USING BTREE, + UNIQUE INDEX `ACT_UNIQ_PROCDEF`(`KEY_` ASC, `VERSION_` ASC, `DERIVED_VERSION_` ASC, `TENANT_ID_` ASC) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_bin ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_re_procdef +-- ---------------------------- +INSERT INTO `act_re_procdef` VALUES ('eam_asset_employee_apply:1:250004', 2, 'eam_asset_employee_apply', '员工资产申请', 'eam_asset_employee_apply', 1, '250001', '员工资产申请.bpmn', '员工资产申请.eam_asset_employee_apply.png', NULL, 0, 1, 1, '', NULL, NULL, NULL, 0); +INSERT INTO `act_re_procdef` VALUES ('eam_asset_employee_handover:1:250024', 2, 'eam_asset_employee_handover', '员工资产交接', 'eam_asset_employee_handover', 1, '250021', '员工资产交接.bpmn', '员工资产交接.eam_asset_employee_handover.png', NULL, 0, 1, 1, '', NULL, NULL, NULL, 0); +INSERT INTO `act_re_procdef` VALUES ('eam_asset_employee_loss:1:250008', 2, 'eam_asset_employee_loss', '员工资产报失', 'eam_asset_employee_loss', 1, '250005', '员工资产报失.bpmn', '员工资产报失.eam_asset_employee_loss.png', NULL, 0, 1, 1, '', NULL, NULL, NULL, 0); +INSERT INTO `act_re_procdef` VALUES ('eam_asset_employee_repair:1:250012', 2, 'eam_asset_employee_repair', '员工资产报修', 'eam_asset_employee_repair', 1, '250009', '员工资产报修.bpmn', '员工资产报修.eam_asset_employee_repair.png', NULL, 0, 1, 1, '', NULL, NULL, NULL, 0); +INSERT INTO `act_re_procdef` VALUES ('eam_asset_purchase_apply:1:250020', 2, 'eam_asset_purchase_apply', '资产采购申请', 'eam_asset_purchase_apply', 1, '250017', '资产采购申请.bpmn', '资产采购申请.eam_asset_purchase_apply.png', NULL, 0, 1, 1, '', NULL, NULL, NULL, 0); +INSERT INTO `act_re_procdef` VALUES ('eam_asset_scrap:1:250016', 2, 'eam_asset_scrap', '资产设备报废', 'eam_asset_scrap', 1, '250013', '资产设备报废.bpmn', '资产设备报废.eam_asset_scrap.png', NULL, 0, 1, 1, '', NULL, NULL, NULL, 0); +INSERT INTO `act_re_procdef` VALUES ('eam_asset_stock_goods_use:1:250028', 2, 'eam_asset_stock_goods_use', '物品领用申请', 'eam_asset_stock_goods_use', 1, '250025', '物品领用申请.bpmn', '物品领用申请.eam_asset_stock_goods_use.png', NULL, 0, 1, 1, '', NULL, NULL, NULL, 0); +INSERT INTO `act_re_procdef` VALUES ('eam_device_inspection:1:250036', 2, 'eam_device_inspection', '设备巡检任务', 'eam_device_inspection', 1, '250033', '设备巡检任务.bpmn', '设备巡检任务.eam_device_inspection.png', NULL, 0, 1, 1, '', NULL, NULL, NULL, 0); +INSERT INTO `act_re_procdef` VALUES ('eam_device_maintenance:1:250040', 2, 'eam_device_maintenance', '设备保养任务', 'eam_device_maintenance', 1, '250037', '设备保养任务.bpmn', '设备保养任务.eam_device_maintenance.png', NULL, 0, 1, 1, '', NULL, NULL, NULL, 0); +INSERT INTO `act_re_procdef` VALUES ('eam_device_repair:1:250032', 2, 'eam_device_repair', '设备报修维修', 'eam_device_repair', 1, '250029', '设备报修维修.bpmn', '设备报修维修.eam_device_repair.png', NULL, 0, 1, 1, '', NULL, NULL, NULL, 0); +INSERT INTO `act_re_procdef` VALUES ('eam_device_stocktaking:1:250044', 2, 'eam_device_stocktaking', '设备盘点任务', 'eam_device_stocktaking', 1, '250041', '设备盘点任务.bpmn', '设备盘点任务.eam_device_stocktaking.png', NULL, 0, 1, 1, '', NULL, NULL, NULL, 0); + +-- ---------------------------- +-- Table structure for act_ru_actinst +-- ---------------------------- +DROP TABLE IF EXISTS `act_ru_actinst`; +CREATE TABLE `act_ru_actinst` ( + `ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `REV_` int NULL DEFAULT 1, + `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `PROC_INST_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `EXECUTION_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `ACT_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `TASK_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `CALL_PROC_INST_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `ACT_NAME_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `ACT_TYPE_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `ASSIGNEE_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `START_TIME_` datetime(3) NOT NULL, + `END_TIME_` datetime(3) NULL DEFAULT NULL, + `DURATION_` bigint NULL DEFAULT NULL, + `TRANSACTION_ORDER_` int NULL DEFAULT NULL, + `DELETE_REASON_` varchar(4000) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT '', + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_IDX_RU_ACTI_START`(`START_TIME_` ASC) USING BTREE, + INDEX `ACT_IDX_RU_ACTI_END`(`END_TIME_` ASC) USING BTREE, + INDEX `ACT_IDX_RU_ACTI_PROC`(`PROC_INST_ID_` ASC) USING BTREE, + INDEX `ACT_IDX_RU_ACTI_PROC_ACT`(`PROC_INST_ID_` ASC, `ACT_ID_` ASC) USING BTREE, + INDEX `ACT_IDX_RU_ACTI_EXEC`(`EXECUTION_ID_` ASC) USING BTREE, + INDEX `ACT_IDX_RU_ACTI_EXEC_ACT`(`EXECUTION_ID_` ASC, `ACT_ID_` ASC) USING BTREE, + INDEX `ACT_IDX_RU_ACTI_TASK`(`TASK_ID_` ASC) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_bin ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_ru_actinst +-- ---------------------------- + +-- ---------------------------- +-- Table structure for act_ru_deadletter_job +-- ---------------------------- +DROP TABLE IF EXISTS `act_ru_deadletter_job`; +CREATE TABLE `act_ru_deadletter_job` ( + `ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `REV_` int NULL DEFAULT NULL, + `CATEGORY_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `TYPE_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `EXCLUSIVE_` tinyint(1) NULL DEFAULT NULL, + `EXECUTION_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `PROCESS_INSTANCE_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `ELEMENT_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `ELEMENT_NAME_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `SCOPE_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `SUB_SCOPE_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `SCOPE_TYPE_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `SCOPE_DEFINITION_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `CORRELATION_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `EXCEPTION_STACK_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `EXCEPTION_MSG_` varchar(4000) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `DUEDATE_` timestamp(3) NULL DEFAULT NULL, + `REPEAT_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `HANDLER_TYPE_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `HANDLER_CFG_` varchar(4000) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `CUSTOM_VALUES_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `CREATE_TIME_` timestamp(3) NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT '', + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_IDX_DEADLETTER_JOB_EXCEPTION_STACK_ID`(`EXCEPTION_STACK_ID_` ASC) USING BTREE, + INDEX `ACT_IDX_DEADLETTER_JOB_CUSTOM_VALUES_ID`(`CUSTOM_VALUES_ID_` ASC) USING BTREE, + INDEX `ACT_IDX_DEADLETTER_JOB_CORRELATION_ID`(`CORRELATION_ID_` ASC) USING BTREE, + INDEX `ACT_IDX_DJOB_SCOPE`(`SCOPE_ID_` ASC, `SCOPE_TYPE_` ASC) USING BTREE, + INDEX `ACT_IDX_DJOB_SUB_SCOPE`(`SUB_SCOPE_ID_` ASC, `SCOPE_TYPE_` ASC) USING BTREE, + INDEX `ACT_IDX_DJOB_SCOPE_DEF`(`SCOPE_DEFINITION_ID_` ASC, `SCOPE_TYPE_` ASC) USING BTREE, + INDEX `ACT_FK_DEADLETTER_JOB_EXECUTION`(`EXECUTION_ID_` ASC) USING BTREE, + INDEX `ACT_FK_DEADLETTER_JOB_PROCESS_INSTANCE`(`PROCESS_INSTANCE_ID_` ASC) USING BTREE, + INDEX `ACT_FK_DEADLETTER_JOB_PROC_DEF`(`PROC_DEF_ID_` ASC) USING BTREE, + CONSTRAINT `ACT_FK_DEADLETTER_JOB_CUSTOM_VALUES` FOREIGN KEY (`CUSTOM_VALUES_ID_`) REFERENCES `act_ge_bytearray` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_DEADLETTER_JOB_EXCEPTION` FOREIGN KEY (`EXCEPTION_STACK_ID_`) REFERENCES `act_ge_bytearray` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_DEADLETTER_JOB_EXECUTION` FOREIGN KEY (`EXECUTION_ID_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_DEADLETTER_JOB_PROC_DEF` FOREIGN KEY (`PROC_DEF_ID_`) REFERENCES `act_re_procdef` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_DEADLETTER_JOB_PROCESS_INSTANCE` FOREIGN KEY (`PROCESS_INSTANCE_ID_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_bin ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_ru_deadletter_job +-- ---------------------------- + +-- ---------------------------- +-- Table structure for act_ru_entitylink +-- ---------------------------- +DROP TABLE IF EXISTS `act_ru_entitylink`; +CREATE TABLE `act_ru_entitylink` ( + `ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `REV_` int NULL DEFAULT NULL, + `CREATE_TIME_` datetime(3) NULL DEFAULT NULL, + `LINK_TYPE_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `SCOPE_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `SUB_SCOPE_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `SCOPE_TYPE_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `SCOPE_DEFINITION_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `PARENT_ELEMENT_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `REF_SCOPE_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `REF_SCOPE_TYPE_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `REF_SCOPE_DEFINITION_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `ROOT_SCOPE_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `ROOT_SCOPE_TYPE_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `HIERARCHY_TYPE_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_IDX_ENT_LNK_SCOPE`(`SCOPE_ID_` ASC, `SCOPE_TYPE_` ASC, `LINK_TYPE_` ASC) USING BTREE, + INDEX `ACT_IDX_ENT_LNK_REF_SCOPE`(`REF_SCOPE_ID_` ASC, `REF_SCOPE_TYPE_` ASC, `LINK_TYPE_` ASC) USING BTREE, + INDEX `ACT_IDX_ENT_LNK_ROOT_SCOPE`(`ROOT_SCOPE_ID_` ASC, `ROOT_SCOPE_TYPE_` ASC, `LINK_TYPE_` ASC) USING BTREE, + INDEX `ACT_IDX_ENT_LNK_SCOPE_DEF`(`SCOPE_DEFINITION_ID_` ASC, `SCOPE_TYPE_` ASC, `LINK_TYPE_` ASC) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_bin ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_ru_entitylink +-- ---------------------------- + +-- ---------------------------- +-- Table structure for act_ru_event_subscr +-- ---------------------------- +DROP TABLE IF EXISTS `act_ru_event_subscr`; +CREATE TABLE `act_ru_event_subscr` ( + `ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `REV_` int NULL DEFAULT NULL, + `EVENT_TYPE_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `EVENT_NAME_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `EXECUTION_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `PROC_INST_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `ACTIVITY_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `CONFIGURATION_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `CREATED_` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `SUB_SCOPE_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `SCOPE_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `SCOPE_DEFINITION_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `SCOPE_TYPE_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `LOCK_TIME_` timestamp(3) NULL DEFAULT NULL, + `LOCK_OWNER_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT '', + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_IDX_EVENT_SUBSCR_CONFIG_`(`CONFIGURATION_` ASC) USING BTREE, + INDEX `ACT_IDX_EVENT_SUBSCR_SCOPEREF_`(`SCOPE_ID_` ASC, `SCOPE_TYPE_` ASC) USING BTREE, + INDEX `ACT_FK_EVENT_EXEC`(`EXECUTION_ID_` ASC) USING BTREE, + CONSTRAINT `ACT_FK_EVENT_EXEC` FOREIGN KEY (`EXECUTION_ID_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_bin ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_ru_event_subscr +-- ---------------------------- + +-- ---------------------------- +-- Table structure for act_ru_execution +-- ---------------------------- +DROP TABLE IF EXISTS `act_ru_execution`; +CREATE TABLE `act_ru_execution` ( + `ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `REV_` int NULL DEFAULT NULL, + `PROC_INST_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `BUSINESS_KEY_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `PARENT_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `SUPER_EXEC_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `ROOT_PROC_INST_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `ACT_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `IS_ACTIVE_` tinyint NULL DEFAULT NULL, + `IS_CONCURRENT_` tinyint NULL DEFAULT NULL, + `IS_SCOPE_` tinyint NULL DEFAULT NULL, + `IS_EVENT_SCOPE_` tinyint NULL DEFAULT NULL, + `IS_MI_ROOT_` tinyint NULL DEFAULT NULL, + `SUSPENSION_STATE_` int NULL DEFAULT NULL, + `CACHED_ENT_STATE_` int NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT '', + `NAME_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `START_ACT_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `START_TIME_` datetime(3) NULL DEFAULT NULL, + `START_USER_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `LOCK_TIME_` timestamp(3) NULL DEFAULT NULL, + `LOCK_OWNER_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `IS_COUNT_ENABLED_` tinyint NULL DEFAULT NULL, + `EVT_SUBSCR_COUNT_` int NULL DEFAULT NULL, + `TASK_COUNT_` int NULL DEFAULT NULL, + `JOB_COUNT_` int NULL DEFAULT NULL, + `TIMER_JOB_COUNT_` int NULL DEFAULT NULL, + `SUSP_JOB_COUNT_` int NULL DEFAULT NULL, + `DEADLETTER_JOB_COUNT_` int NULL DEFAULT NULL, + `EXTERNAL_WORKER_JOB_COUNT_` int NULL DEFAULT NULL, + `VAR_COUNT_` int NULL DEFAULT NULL, + `ID_LINK_COUNT_` int NULL DEFAULT NULL, + `CALLBACK_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `CALLBACK_TYPE_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `REFERENCE_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `REFERENCE_TYPE_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `PROPAGATED_STAGE_INST_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `BUSINESS_STATUS_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_IDX_EXEC_BUSKEY`(`BUSINESS_KEY_` ASC) USING BTREE, + INDEX `ACT_IDC_EXEC_ROOT`(`ROOT_PROC_INST_ID_` ASC) USING BTREE, + INDEX `ACT_IDX_EXEC_REF_ID_`(`REFERENCE_ID_` ASC) USING BTREE, + INDEX `ACT_FK_EXE_PROCINST`(`PROC_INST_ID_` ASC) USING BTREE, + INDEX `ACT_FK_EXE_PARENT`(`PARENT_ID_` ASC) USING BTREE, + INDEX `ACT_FK_EXE_SUPER`(`SUPER_EXEC_` ASC) USING BTREE, + INDEX `ACT_FK_EXE_PROCDEF`(`PROC_DEF_ID_` ASC) USING BTREE, + CONSTRAINT `ACT_FK_EXE_PARENT` FOREIGN KEY (`PARENT_ID_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE CASCADE ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_EXE_PROCDEF` FOREIGN KEY (`PROC_DEF_ID_`) REFERENCES `act_re_procdef` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_EXE_PROCINST` FOREIGN KEY (`PROC_INST_ID_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `ACT_FK_EXE_SUPER` FOREIGN KEY (`SUPER_EXEC_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE CASCADE ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_bin ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_ru_execution +-- ---------------------------- + +-- ---------------------------- +-- Table structure for act_ru_external_job +-- ---------------------------- +DROP TABLE IF EXISTS `act_ru_external_job`; +CREATE TABLE `act_ru_external_job` ( + `ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `REV_` int NULL DEFAULT NULL, + `CATEGORY_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `TYPE_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `LOCK_EXP_TIME_` timestamp(3) NULL DEFAULT NULL, + `LOCK_OWNER_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `EXCLUSIVE_` tinyint(1) NULL DEFAULT NULL, + `EXECUTION_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `PROCESS_INSTANCE_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `ELEMENT_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `ELEMENT_NAME_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `SCOPE_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `SUB_SCOPE_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `SCOPE_TYPE_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `SCOPE_DEFINITION_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `CORRELATION_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `RETRIES_` int NULL DEFAULT NULL, + `EXCEPTION_STACK_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `EXCEPTION_MSG_` varchar(4000) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `DUEDATE_` timestamp(3) NULL DEFAULT NULL, + `REPEAT_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `HANDLER_TYPE_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `HANDLER_CFG_` varchar(4000) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `CUSTOM_VALUES_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `CREATE_TIME_` timestamp(3) NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT '', + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_IDX_EXTERNAL_JOB_EXCEPTION_STACK_ID`(`EXCEPTION_STACK_ID_` ASC) USING BTREE, + INDEX `ACT_IDX_EXTERNAL_JOB_CUSTOM_VALUES_ID`(`CUSTOM_VALUES_ID_` ASC) USING BTREE, + INDEX `ACT_IDX_EXTERNAL_JOB_CORRELATION_ID`(`CORRELATION_ID_` ASC) USING BTREE, + INDEX `ACT_IDX_EJOB_SCOPE`(`SCOPE_ID_` ASC, `SCOPE_TYPE_` ASC) USING BTREE, + INDEX `ACT_IDX_EJOB_SUB_SCOPE`(`SUB_SCOPE_ID_` ASC, `SCOPE_TYPE_` ASC) USING BTREE, + INDEX `ACT_IDX_EJOB_SCOPE_DEF`(`SCOPE_DEFINITION_ID_` ASC, `SCOPE_TYPE_` ASC) USING BTREE, + CONSTRAINT `ACT_FK_EXTERNAL_JOB_CUSTOM_VALUES` FOREIGN KEY (`CUSTOM_VALUES_ID_`) REFERENCES `act_ge_bytearray` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_EXTERNAL_JOB_EXCEPTION` FOREIGN KEY (`EXCEPTION_STACK_ID_`) REFERENCES `act_ge_bytearray` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_bin ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_ru_external_job +-- ---------------------------- + +-- ---------------------------- +-- Table structure for act_ru_history_job +-- ---------------------------- +DROP TABLE IF EXISTS `act_ru_history_job`; +CREATE TABLE `act_ru_history_job` ( + `ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `REV_` int NULL DEFAULT NULL, + `LOCK_EXP_TIME_` timestamp(3) NULL DEFAULT NULL, + `LOCK_OWNER_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `RETRIES_` int NULL DEFAULT NULL, + `EXCEPTION_STACK_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `EXCEPTION_MSG_` varchar(4000) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `HANDLER_TYPE_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `HANDLER_CFG_` varchar(4000) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `CUSTOM_VALUES_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `ADV_HANDLER_CFG_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `CREATE_TIME_` timestamp(3) NULL DEFAULT NULL, + `SCOPE_TYPE_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT '', + PRIMARY KEY (`ID_`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_bin ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_ru_history_job +-- ---------------------------- + +-- ---------------------------- +-- Table structure for act_ru_identitylink +-- ---------------------------- +DROP TABLE IF EXISTS `act_ru_identitylink`; +CREATE TABLE `act_ru_identitylink` ( + `ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `REV_` int NULL DEFAULT NULL, + `GROUP_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `TYPE_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `USER_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `TASK_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `PROC_INST_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `SCOPE_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `SUB_SCOPE_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `SCOPE_TYPE_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `SCOPE_DEFINITION_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_IDX_IDENT_LNK_USER`(`USER_ID_` ASC) USING BTREE, + INDEX `ACT_IDX_IDENT_LNK_GROUP`(`GROUP_ID_` ASC) USING BTREE, + INDEX `ACT_IDX_IDENT_LNK_SCOPE`(`SCOPE_ID_` ASC, `SCOPE_TYPE_` ASC) USING BTREE, + INDEX `ACT_IDX_IDENT_LNK_SUB_SCOPE`(`SUB_SCOPE_ID_` ASC, `SCOPE_TYPE_` ASC) USING BTREE, + INDEX `ACT_IDX_IDENT_LNK_SCOPE_DEF`(`SCOPE_DEFINITION_ID_` ASC, `SCOPE_TYPE_` ASC) USING BTREE, + INDEX `ACT_IDX_ATHRZ_PROCEDEF`(`PROC_DEF_ID_` ASC) USING BTREE, + INDEX `ACT_FK_TSKASS_TASK`(`TASK_ID_` ASC) USING BTREE, + INDEX `ACT_FK_IDL_PROCINST`(`PROC_INST_ID_` ASC) USING BTREE, + CONSTRAINT `ACT_FK_ATHRZ_PROCEDEF` FOREIGN KEY (`PROC_DEF_ID_`) REFERENCES `act_re_procdef` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_IDL_PROCINST` FOREIGN KEY (`PROC_INST_ID_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_TSKASS_TASK` FOREIGN KEY (`TASK_ID_`) REFERENCES `act_ru_task` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_bin ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_ru_identitylink +-- ---------------------------- + +-- ---------------------------- +-- Table structure for act_ru_job +-- ---------------------------- +DROP TABLE IF EXISTS `act_ru_job`; +CREATE TABLE `act_ru_job` ( + `ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `REV_` int NULL DEFAULT NULL, + `CATEGORY_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `TYPE_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `LOCK_EXP_TIME_` timestamp(3) NULL DEFAULT NULL, + `LOCK_OWNER_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `EXCLUSIVE_` tinyint(1) NULL DEFAULT NULL, + `EXECUTION_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `PROCESS_INSTANCE_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `ELEMENT_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `ELEMENT_NAME_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `SCOPE_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `SUB_SCOPE_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `SCOPE_TYPE_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `SCOPE_DEFINITION_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `CORRELATION_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `RETRIES_` int NULL DEFAULT NULL, + `EXCEPTION_STACK_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `EXCEPTION_MSG_` varchar(4000) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `DUEDATE_` timestamp(3) NULL DEFAULT NULL, + `REPEAT_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `HANDLER_TYPE_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `HANDLER_CFG_` varchar(4000) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `CUSTOM_VALUES_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `CREATE_TIME_` timestamp(3) NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT '', + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_IDX_JOB_EXCEPTION_STACK_ID`(`EXCEPTION_STACK_ID_` ASC) USING BTREE, + INDEX `ACT_IDX_JOB_CUSTOM_VALUES_ID`(`CUSTOM_VALUES_ID_` ASC) USING BTREE, + INDEX `ACT_IDX_JOB_CORRELATION_ID`(`CORRELATION_ID_` ASC) USING BTREE, + INDEX `ACT_IDX_JOB_SCOPE`(`SCOPE_ID_` ASC, `SCOPE_TYPE_` ASC) USING BTREE, + INDEX `ACT_IDX_JOB_SUB_SCOPE`(`SUB_SCOPE_ID_` ASC, `SCOPE_TYPE_` ASC) USING BTREE, + INDEX `ACT_IDX_JOB_SCOPE_DEF`(`SCOPE_DEFINITION_ID_` ASC, `SCOPE_TYPE_` ASC) USING BTREE, + INDEX `ACT_FK_JOB_EXECUTION`(`EXECUTION_ID_` ASC) USING BTREE, + INDEX `ACT_FK_JOB_PROCESS_INSTANCE`(`PROCESS_INSTANCE_ID_` ASC) USING BTREE, + INDEX `ACT_FK_JOB_PROC_DEF`(`PROC_DEF_ID_` ASC) USING BTREE, + CONSTRAINT `ACT_FK_JOB_CUSTOM_VALUES` FOREIGN KEY (`CUSTOM_VALUES_ID_`) REFERENCES `act_ge_bytearray` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_JOB_EXCEPTION` FOREIGN KEY (`EXCEPTION_STACK_ID_`) REFERENCES `act_ge_bytearray` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_JOB_EXECUTION` FOREIGN KEY (`EXECUTION_ID_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_JOB_PROC_DEF` FOREIGN KEY (`PROC_DEF_ID_`) REFERENCES `act_re_procdef` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_JOB_PROCESS_INSTANCE` FOREIGN KEY (`PROCESS_INSTANCE_ID_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_bin ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_ru_job +-- ---------------------------- + +-- ---------------------------- +-- Table structure for act_ru_suspended_job +-- ---------------------------- +DROP TABLE IF EXISTS `act_ru_suspended_job`; +CREATE TABLE `act_ru_suspended_job` ( + `ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `REV_` int NULL DEFAULT NULL, + `CATEGORY_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `TYPE_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `EXCLUSIVE_` tinyint(1) NULL DEFAULT NULL, + `EXECUTION_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `PROCESS_INSTANCE_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `ELEMENT_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `ELEMENT_NAME_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `SCOPE_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `SUB_SCOPE_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `SCOPE_TYPE_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `SCOPE_DEFINITION_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `CORRELATION_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `RETRIES_` int NULL DEFAULT NULL, + `EXCEPTION_STACK_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `EXCEPTION_MSG_` varchar(4000) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `DUEDATE_` timestamp(3) NULL DEFAULT NULL, + `REPEAT_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `HANDLER_TYPE_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `HANDLER_CFG_` varchar(4000) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `CUSTOM_VALUES_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `CREATE_TIME_` timestamp(3) NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT '', + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_IDX_SUSPENDED_JOB_EXCEPTION_STACK_ID`(`EXCEPTION_STACK_ID_` ASC) USING BTREE, + INDEX `ACT_IDX_SUSPENDED_JOB_CUSTOM_VALUES_ID`(`CUSTOM_VALUES_ID_` ASC) USING BTREE, + INDEX `ACT_IDX_SUSPENDED_JOB_CORRELATION_ID`(`CORRELATION_ID_` ASC) USING BTREE, + INDEX `ACT_IDX_SJOB_SCOPE`(`SCOPE_ID_` ASC, `SCOPE_TYPE_` ASC) USING BTREE, + INDEX `ACT_IDX_SJOB_SUB_SCOPE`(`SUB_SCOPE_ID_` ASC, `SCOPE_TYPE_` ASC) USING BTREE, + INDEX `ACT_IDX_SJOB_SCOPE_DEF`(`SCOPE_DEFINITION_ID_` ASC, `SCOPE_TYPE_` ASC) USING BTREE, + INDEX `ACT_FK_SUSPENDED_JOB_EXECUTION`(`EXECUTION_ID_` ASC) USING BTREE, + INDEX `ACT_FK_SUSPENDED_JOB_PROCESS_INSTANCE`(`PROCESS_INSTANCE_ID_` ASC) USING BTREE, + INDEX `ACT_FK_SUSPENDED_JOB_PROC_DEF`(`PROC_DEF_ID_` ASC) USING BTREE, + CONSTRAINT `ACT_FK_SUSPENDED_JOB_CUSTOM_VALUES` FOREIGN KEY (`CUSTOM_VALUES_ID_`) REFERENCES `act_ge_bytearray` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_SUSPENDED_JOB_EXCEPTION` FOREIGN KEY (`EXCEPTION_STACK_ID_`) REFERENCES `act_ge_bytearray` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_SUSPENDED_JOB_EXECUTION` FOREIGN KEY (`EXECUTION_ID_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_SUSPENDED_JOB_PROC_DEF` FOREIGN KEY (`PROC_DEF_ID_`) REFERENCES `act_re_procdef` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_SUSPENDED_JOB_PROCESS_INSTANCE` FOREIGN KEY (`PROCESS_INSTANCE_ID_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_bin ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_ru_suspended_job +-- ---------------------------- + +-- ---------------------------- +-- Table structure for act_ru_task +-- ---------------------------- +DROP TABLE IF EXISTS `act_ru_task`; +CREATE TABLE `act_ru_task` ( + `ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `REV_` int NULL DEFAULT NULL, + `EXECUTION_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `PROC_INST_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `TASK_DEF_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `SCOPE_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `SUB_SCOPE_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `SCOPE_TYPE_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `SCOPE_DEFINITION_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `PROPAGATED_STAGE_INST_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `NAME_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `PARENT_TASK_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `DESCRIPTION_` varchar(4000) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `TASK_DEF_KEY_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `OWNER_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `ASSIGNEE_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `DELEGATION_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `PRIORITY_` int NULL DEFAULT NULL, + `CREATE_TIME_` timestamp(3) NULL DEFAULT NULL, + `DUE_DATE_` datetime(3) NULL DEFAULT NULL, + `CATEGORY_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `SUSPENSION_STATE_` int NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT '', + `FORM_KEY_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `CLAIM_TIME_` datetime(3) NULL DEFAULT NULL, + `IS_COUNT_ENABLED_` tinyint NULL DEFAULT NULL, + `VAR_COUNT_` int NULL DEFAULT NULL, + `ID_LINK_COUNT_` int NULL DEFAULT NULL, + `SUB_TASK_COUNT_` int NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_IDX_TASK_CREATE`(`CREATE_TIME_` ASC) USING BTREE, + INDEX `ACT_IDX_TASK_SCOPE`(`SCOPE_ID_` ASC, `SCOPE_TYPE_` ASC) USING BTREE, + INDEX `ACT_IDX_TASK_SUB_SCOPE`(`SUB_SCOPE_ID_` ASC, `SCOPE_TYPE_` ASC) USING BTREE, + INDEX `ACT_IDX_TASK_SCOPE_DEF`(`SCOPE_DEFINITION_ID_` ASC, `SCOPE_TYPE_` ASC) USING BTREE, + INDEX `ACT_FK_TASK_EXE`(`EXECUTION_ID_` ASC) USING BTREE, + INDEX `ACT_FK_TASK_PROCINST`(`PROC_INST_ID_` ASC) USING BTREE, + INDEX `ACT_FK_TASK_PROCDEF`(`PROC_DEF_ID_` ASC) USING BTREE, + CONSTRAINT `ACT_FK_TASK_EXE` FOREIGN KEY (`EXECUTION_ID_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_TASK_PROCDEF` FOREIGN KEY (`PROC_DEF_ID_`) REFERENCES `act_re_procdef` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_TASK_PROCINST` FOREIGN KEY (`PROC_INST_ID_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_bin ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_ru_task +-- ---------------------------- + +-- ---------------------------- +-- Table structure for act_ru_timer_job +-- ---------------------------- +DROP TABLE IF EXISTS `act_ru_timer_job`; +CREATE TABLE `act_ru_timer_job` ( + `ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `REV_` int NULL DEFAULT NULL, + `CATEGORY_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `TYPE_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `LOCK_EXP_TIME_` timestamp(3) NULL DEFAULT NULL, + `LOCK_OWNER_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `EXCLUSIVE_` tinyint(1) NULL DEFAULT NULL, + `EXECUTION_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `PROCESS_INSTANCE_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `ELEMENT_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `ELEMENT_NAME_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `SCOPE_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `SUB_SCOPE_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `SCOPE_TYPE_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `SCOPE_DEFINITION_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `CORRELATION_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `RETRIES_` int NULL DEFAULT NULL, + `EXCEPTION_STACK_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `EXCEPTION_MSG_` varchar(4000) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `DUEDATE_` timestamp(3) NULL DEFAULT NULL, + `REPEAT_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `HANDLER_TYPE_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `HANDLER_CFG_` varchar(4000) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `CUSTOM_VALUES_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `CREATE_TIME_` timestamp(3) NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT '', + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_IDX_TIMER_JOB_EXCEPTION_STACK_ID`(`EXCEPTION_STACK_ID_` ASC) USING BTREE, + INDEX `ACT_IDX_TIMER_JOB_CUSTOM_VALUES_ID`(`CUSTOM_VALUES_ID_` ASC) USING BTREE, + INDEX `ACT_IDX_TIMER_JOB_CORRELATION_ID`(`CORRELATION_ID_` ASC) USING BTREE, + INDEX `ACT_IDX_TIMER_JOB_DUEDATE`(`DUEDATE_` ASC) USING BTREE, + INDEX `ACT_IDX_TJOB_SCOPE`(`SCOPE_ID_` ASC, `SCOPE_TYPE_` ASC) USING BTREE, + INDEX `ACT_IDX_TJOB_SUB_SCOPE`(`SUB_SCOPE_ID_` ASC, `SCOPE_TYPE_` ASC) USING BTREE, + INDEX `ACT_IDX_TJOB_SCOPE_DEF`(`SCOPE_DEFINITION_ID_` ASC, `SCOPE_TYPE_` ASC) USING BTREE, + INDEX `ACT_FK_TIMER_JOB_EXECUTION`(`EXECUTION_ID_` ASC) USING BTREE, + INDEX `ACT_FK_TIMER_JOB_PROCESS_INSTANCE`(`PROCESS_INSTANCE_ID_` ASC) USING BTREE, + INDEX `ACT_FK_TIMER_JOB_PROC_DEF`(`PROC_DEF_ID_` ASC) USING BTREE, + CONSTRAINT `ACT_FK_TIMER_JOB_CUSTOM_VALUES` FOREIGN KEY (`CUSTOM_VALUES_ID_`) REFERENCES `act_ge_bytearray` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_TIMER_JOB_EXCEPTION` FOREIGN KEY (`EXCEPTION_STACK_ID_`) REFERENCES `act_ge_bytearray` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_TIMER_JOB_EXECUTION` FOREIGN KEY (`EXECUTION_ID_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_TIMER_JOB_PROC_DEF` FOREIGN KEY (`PROC_DEF_ID_`) REFERENCES `act_re_procdef` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_TIMER_JOB_PROCESS_INSTANCE` FOREIGN KEY (`PROCESS_INSTANCE_ID_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_bin ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_ru_timer_job +-- ---------------------------- + +-- ---------------------------- +-- Table structure for act_ru_variable +-- ---------------------------- +DROP TABLE IF EXISTS `act_ru_variable`; +CREATE TABLE `act_ru_variable` ( + `ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `REV_` int NULL DEFAULT NULL, + `TYPE_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `NAME_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `EXECUTION_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `PROC_INST_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `TASK_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `SCOPE_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `SUB_SCOPE_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `SCOPE_TYPE_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `BYTEARRAY_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `DOUBLE_` double NULL DEFAULT NULL, + `LONG_` bigint NULL DEFAULT NULL, + `TEXT_` varchar(4000) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `TEXT2_` varchar(4000) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_IDX_RU_VAR_SCOPE_ID_TYPE`(`SCOPE_ID_` ASC, `SCOPE_TYPE_` ASC) USING BTREE, + INDEX `ACT_IDX_RU_VAR_SUB_ID_TYPE`(`SUB_SCOPE_ID_` ASC, `SCOPE_TYPE_` ASC) USING BTREE, + INDEX `ACT_FK_VAR_BYTEARRAY`(`BYTEARRAY_ID_` ASC) USING BTREE, + INDEX `ACT_IDX_VARIABLE_TASK_ID`(`TASK_ID_` ASC) USING BTREE, + INDEX `ACT_FK_VAR_EXE`(`EXECUTION_ID_` ASC) USING BTREE, + INDEX `ACT_FK_VAR_PROCINST`(`PROC_INST_ID_` ASC) USING BTREE, + CONSTRAINT `ACT_FK_VAR_BYTEARRAY` FOREIGN KEY (`BYTEARRAY_ID_`) REFERENCES `act_ge_bytearray` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_VAR_EXE` FOREIGN KEY (`EXECUTION_ID_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_VAR_PROCINST` FOREIGN KEY (`PROC_INST_ID_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_bin ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of act_ru_variable +-- ---------------------------- + +-- ---------------------------- +-- Table structure for eam_asset +-- ---------------------------- +DROP TABLE IF EXISTS `eam_asset`; +CREATE TABLE `eam_asset` ( + `asset_id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', + `asset_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '资产编号', + `name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '资产名称', + `category_id` bigint NOT NULL COMMENT '资产分类编号', + `warehouse_id` bigint NULL DEFAULT NULL COMMENT '仓库id', + `own_company_id` bigint NOT NULL COMMENT '所属公司', + `status` tinyint NOT NULL DEFAULT 0 COMMENT '资产状态(0-闲置 1-在用 2-借用中 3-维修中 4-调拨中 5-待报废 6-已处置 7-库存 8-已报废 9-开机 10-关机)', + `use_organization_id` bigint NULL DEFAULT NULL COMMENT '使用组织', + `source_id` tinyint NULL DEFAULT NULL COMMENT '资产来源(0-捐赠 1-赠送 2-其他 3-采购 4-自建 5-自购)', + `manager` bigint NULL DEFAULT NULL COMMENT '管理人员id', + `supplier_vendor_id` bigint NULL DEFAULT NULL COMMENT '供应商id', + `manufacturers_vendor_id` bigint NULL DEFAULT NULL COMMENT '资产厂商id', + `model` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '规格型号', + `serial_number` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '序列号', + `use_user_id` bigint NULL DEFAULT NULL COMMENT '使用人员id', + `purpose` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用途', + `position_id` bigint NULL DEFAULT NULL COMMENT '存放位置id', + `unit` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '计量单位', + `position_detail` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '详细位置', + `notes` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '资产备注', + `attachment` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '资产附件', + `maintenance_vendor` bigint NULL DEFAULT NULL COMMENT '维保信息_维保厂商id', + `contactor` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '维保信息_联系人id', + `maintenance_start_date` datetime NULL DEFAULT NULL COMMENT '维保信息_维保开始', + `maintenance_status` tinyint NULL DEFAULT 0 COMMENT '维保信息_维保状态(0-不需要 1-脱保 2-在保 3-未知)', + `contact` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '维保信息_联系方式', + `maintenance_end_date` datetime NULL DEFAULT NULL COMMENT '维保信息_维保到期', + `responsible_person` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '维保信息_负责人id', + `maintenance_type` tinyint NULL DEFAULT 0 COMMENT '维保信息_维保方式(0-原厂 1-第三方)', + `suggest_maintenance_type` tinyint NULL DEFAULT 0 COMMENT '维保信息_建议维保方式(0-原厂 1-第三方)', + `maintenance_notes` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '维保信息_维保备注', + `maintenance_attachment` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '维保信息_维保附件', + `financial_category_id` bigint NULL DEFAULT NULL COMMENT '财务信息_财务分类id', + `expense_item` bigint NULL DEFAULT NULL COMMENT '财务信息_费用项目id', + `total_amount_price` decimal(10, 2) NULL DEFAULT NULL COMMENT '财务信息_未税成本', + `customer_info` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '财务信息_客户信息', + `tax_amount_rate` decimal(10, 2) NULL DEFAULT NULL COMMENT '财务信息_资产税额', + `register_date` datetime NULL DEFAULT NULL COMMENT '财务信息_入账日期', + `financial_option` bigint NULL DEFAULT NULL COMMENT '财务信息_财务选项id', + `nav_price` decimal(10, 2) NULL DEFAULT NULL COMMENT '财务信息_资产净值', + `residuals_rate` decimal(10, 2) NULL DEFAULT NULL COMMENT '财务信息_残值率', + `financial_notes` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '财务信息_财务备注', + `financial_attachment` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '财务信息_附件', + `create_user` bigint NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_user` bigint NULL DEFAULT NULL COMMENT '修改人', + `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间', + `is_deleted` tinyint NULL DEFAULT 0 COMMENT '是否删除(0:正常/1:删除)', + `ext_info` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '扩展字段', + `img` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '资产设备图片', + `user_manual` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '资产设备使用手册', + `maintenance_manual` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '资产设备保养手册', + PRIMARY KEY (`asset_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 29 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '资产信息表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of eam_asset +-- ---------------------------- +INSERT INTO `eam_asset` VALUES (1, 'AS2520234476743168', '测试', 1, NULL, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, NULL, NULL, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1, '2024-09-30 17:10:10', NULL, '2024-09-30 17:10:10', 0, '[{\"key\":\"ext1\",\"name\":\"扩展字段1\",\"sort\":0,\"type\":\"STRING\",\"value\":\"扩展字段1\"},{\"key\":\"ext2\",\"name\":\"扩展字段2\",\"sort\":1,\"type\":\"NUMBER\",\"value\":0},{\"key\":\"ext3\",\"name\":\"扩展字段3\",\"sort\":2,\"type\":\"DATE\",\"value\":\"2024-01-01\"},{\"key\":\"ext4\",\"name\":\"扩展字段4\",\"sort\":3,\"type\":\"RADIO\",\"value\":{\"value\":\"选项1\",\"fields\":[\"选项1\",\"选项2\",\"选项3\"]}}]', NULL, NULL, NULL); + +-- ---------------------------- +-- Table structure for eam_asset_log +-- ---------------------------- +DROP TABLE IF EXISTS `eam_asset_log`; +CREATE TABLE `eam_asset_log` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', + `create_user` bigint NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_user` bigint NULL DEFAULT NULL COMMENT '修改人', + `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间', + `is_deleted` tinyint NULL DEFAULT 0 COMMENT '是否删除(0:正常/1:删除)', + `business_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '业务编号', + `operation_type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '操作类型', + `operation_notes` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '操作内容', + `asset_id` bigint NULL DEFAULT NULL COMMENT '关联资产编号', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '资产操作日志' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of eam_asset_log +-- ---------------------------- + +-- ---------------------------- +-- Table structure for eam_asset_spare_parts +-- ---------------------------- +DROP TABLE IF EXISTS `eam_asset_spare_parts`; +CREATE TABLE `eam_asset_spare_parts` ( + `asset_id` bigint NULL DEFAULT NULL COMMENT '资产id', + `spare_parts_id` bigint NULL DEFAULT NULL COMMENT '备品备件id' +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '备品备件关联信息表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of eam_asset_spare_parts +-- ---------------------------- + +-- ---------------------------- +-- Table structure for eam_basic_category +-- ---------------------------- +DROP TABLE IF EXISTS `eam_basic_category`; +CREATE TABLE `eam_basic_category` ( + `category_id` bigint NOT NULL AUTO_INCREMENT COMMENT '资产分类编号', + `category_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '资产分类名称', + `depth` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '深度', + `parent_id` bigint NOT NULL COMMENT '父节点', + `upper_limit` int NULL DEFAULT NULL COMMENT '安全库存上限', + `lower_limit` int NULL DEFAULT NULL COMMENT '安全库存下限', + `safety_limit` int NULL DEFAULT NULL COMMENT '安全库存', + `create_user` bigint NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_user` bigint NULL DEFAULT NULL COMMENT '修改人', + `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间', + `is_deleted` tinyint NULL DEFAULT 0 COMMENT '是否删除(0:正常/1:删除)', + `asset_ext_temp` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '资产设备信息扩展模板', + PRIMARY KEY (`category_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 98 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '资产分类信息表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of eam_basic_category +-- ---------------------------- +INSERT INTO `eam_basic_category` VALUES (1, '电子设备', '1', 0, 100, 10, 20, NULL, '2024-04-09 16:57:25', 1, '2024-09-12 15:47:51', 0, '[{\"key\":\"ext1\",\"name\":\"扩展字段1\",\"sort\":0,\"type\":\"STRING\",\"value\":\"\"},{\"key\":\"ext2\",\"name\":\"扩展字段2\",\"sort\":1,\"type\":\"NUMBER\",\"value\":0},{\"key\":\"ext3\",\"name\":\"扩展字段3\",\"sort\":2,\"type\":\"DATE\",\"value\":\"2024-01-01\"},{\"key\":\"ext4\",\"name\":\"扩展字段4\",\"sort\":3,\"type\":\"RADIO\",\"value\":{\"value\":\"\",\"fields\":[\"选项1\",\"选项2\",\"选项3\"]}}]'); + +-- ---------------------------- +-- Table structure for eam_basic_financial_category +-- ---------------------------- +DROP TABLE IF EXISTS `eam_basic_financial_category`; +CREATE TABLE `eam_basic_financial_category` ( + `financial_category_id` bigint NOT NULL AUTO_INCREMENT COMMENT '财务分类id', + `financial_category_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '财务分类名称', + `depth` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '深度', + `parent_id` bigint NULL DEFAULT NULL COMMENT '父节点', + `use_terms` int NOT NULL DEFAULT 36 COMMENT '使用期限(月)', + `notes` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', + `create_user` bigint NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_user` bigint NULL DEFAULT NULL COMMENT '修改人', + `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间', + `is_deleted` tinyint NULL DEFAULT 0 COMMENT '是否删除(0:正常/1:删除)', + PRIMARY KEY (`financial_category_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '财务分类信息表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of eam_basic_financial_category +-- ---------------------------- +INSERT INTO `eam_basic_financial_category` VALUES (1, '房屋建筑', NULL, NULL, 240, '折旧年限20年', NULL, NULL, NULL, NULL, 0); +INSERT INTO `eam_basic_financial_category` VALUES (2, '专用设备', NULL, NULL, 120, '折旧年限10年', NULL, NULL, NULL, NULL, 0); +INSERT INTO `eam_basic_financial_category` VALUES (3, '一般办公设备', NULL, NULL, 60, '折旧年限5年', NULL, NULL, NULL, NULL, 0); +INSERT INTO `eam_basic_financial_category` VALUES (4, '运输设备', NULL, NULL, 48, '折旧年限4年', NULL, NULL, NULL, NULL, 0); +INSERT INTO `eam_basic_financial_category` VALUES (5, '电子设备', NULL, NULL, 36, '折旧年限3年', NULL, NULL, NULL, NULL, 0); + +-- ---------------------------- +-- Table structure for eam_basic_maintenance_vendor +-- ---------------------------- +DROP TABLE IF EXISTS `eam_basic_maintenance_vendor`; +CREATE TABLE `eam_basic_maintenance_vendor` ( + `maintenance_vendor_id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', + `name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '名称', + `code` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '编码', + `uscc` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '统一社会信用代码', + `after_sales_contactor` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '售后联系人', + `after_sales_contact` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '售后联系方式', + `business_contactor` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '商务联系人', + `business_contact` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '商务联系方式', + `address` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '地址', + `notes` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '备注', + `create_user` bigint NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_user` bigint NULL DEFAULT NULL COMMENT '修改人', + `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间', + `is_deleted` tinyint NULL DEFAULT 0 COMMENT '是否删除(0:正常/1:删除)', + PRIMARY KEY (`maintenance_vendor_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 16 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '维保商' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of eam_basic_maintenance_vendor +-- ---------------------------- +INSERT INTO `eam_basic_maintenance_vendor` VALUES (1, '维保商测试1', '', '001', '', '', '', '', '', '', 1, '2024-04-09 17:18:08', 1, '2024-04-09 17:19:10', 0); +INSERT INTO `eam_basic_maintenance_vendor` VALUES (9, '用代', '12卅22222211111111111111111113', '112333', '31', '434', '144', '2121', '5555', '6666', 1, '2024-05-02 12:48:29', 1, '2024-05-07 23:52:02', 0); +INSERT INTO `eam_basic_maintenance_vendor` VALUES (11, '华为', 'huawei', NULL, '', NULL, NULL, NULL, '中国', '123', 1, '2024-05-02 13:03:28', 1, '2024-05-07 14:03:08', 0); +INSERT INTO `eam_basic_maintenance_vendor` VALUES (15, '从v', '啊哈哈', '33', '55', '656', '44', '44', '77', '88', 1, '2024-05-07 23:51:50', NULL, '2024-05-07 23:51:50', 0); + +-- ---------------------------- +-- Table structure for eam_basic_manufacturers_vendor +-- ---------------------------- +DROP TABLE IF EXISTS `eam_basic_manufacturers_vendor`; +CREATE TABLE `eam_basic_manufacturers_vendor` ( + `manufacturers_vendor_id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', + `name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '名称', + `code` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '编码', + `address` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '地址', + `notes` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '备注', + `create_user` bigint NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_user` bigint NULL DEFAULT NULL COMMENT '修改人', + `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间', + `is_deleted` tinyint NULL DEFAULT 0 COMMENT '是否删除(0:正常/1:删除)', + PRIMARY KEY (`manufacturers_vendor_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '生产商' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of eam_basic_manufacturers_vendor +-- ---------------------------- +INSERT INTO `eam_basic_manufacturers_vendor` VALUES (1, '生产商测试1', '001', '所属', '22', 1, '2024-04-09 17:19:56', 1, '2024-05-07 23:50:58', 0); +INSERT INTO `eam_basic_manufacturers_vendor` VALUES (5, '擦v给', ' 1', '1', '1', 1, '2024-05-02 13:04:51', 1, '2024-05-07 23:51:12', 0); + +-- ---------------------------- +-- Table structure for eam_basic_position +-- ---------------------------- +DROP TABLE IF EXISTS `eam_basic_position`; +CREATE TABLE `eam_basic_position` ( + `position_id` bigint NOT NULL AUTO_INCREMENT COMMENT '资产分类编号', + `name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '资产分类名称', + `depth` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '深度', + `parent_id` bigint NOT NULL COMMENT '父节点', + `create_user` bigint NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_user` bigint NULL DEFAULT NULL COMMENT '修改人', + `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间', + `is_deleted` tinyint NULL DEFAULT 0 COMMENT '是否删除(0:正常/1:删除)', + PRIMARY KEY (`position_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 8 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '存放位置信息表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of eam_basic_position +-- ---------------------------- +INSERT INTO `eam_basic_position` VALUES (1, '存放位置测试23', '1', 0, 1, '2024-04-09 17:21:09', 1, '2024-05-02 12:20:01', 0); +INSERT INTO `eam_basic_position` VALUES (3, 'vvv', '', 0, 1, '2024-05-02 12:12:05', 1, '2024-05-02 12:21:49', 0); +INSERT INTO `eam_basic_position` VALUES (7, '测试', '2', 1, 1, '2024-05-02 22:00:43', NULL, '2024-05-02 22:00:43', 0); + +-- ---------------------------- +-- Table structure for eam_basic_supplier_vendor +-- ---------------------------- +DROP TABLE IF EXISTS `eam_basic_supplier_vendor`; +CREATE TABLE `eam_basic_supplier_vendor` ( + `supplier_vendor_id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', + `name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '名称', + `code` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '编码', + `uscc` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '统一社会信用代码', + `after_sales_contactor` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '售后联系人', + `after_sales_contact` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '售后联系方式', + `business_contactor` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '商务联系人', + `business_contact` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '商务联系方式', + `address` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '地址', + `notes` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '备注', + `create_user` bigint NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_user` bigint NULL DEFAULT NULL COMMENT '修改人', + `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间', + `is_deleted` tinyint NULL DEFAULT 0 COMMENT '是否删除(0:正常/1:删除)', + PRIMARY KEY (`supplier_vendor_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 12 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '供应商' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of eam_basic_supplier_vendor +-- ---------------------------- +INSERT INTO `eam_basic_supplier_vendor` VALUES (1, '积络科技', '001', '123456', '方杨', '17381994862', '方杨', '17381994862', '成都市武侯区展业大厦', '', NULL, '2024-04-09 11:45:51', NULL, '2024-04-09 11:45:51', 0); +INSERT INTO `eam_basic_supplier_vendor` VALUES (7, '213', '44', '55', '8', '9', '6', '7', '0', '-', 1, '2024-05-02 13:10:34', NULL, '2024-05-02 13:10:34', 0); +INSERT INTO `eam_basic_supplier_vendor` VALUES (11, '大大', '222', '111', '22', '22', '22', '22', '22', '21', 1, '2024-05-07 23:51:19', 1, '2024-05-07 23:51:32', 0); + +-- ---------------------------- +-- Table structure for eam_basic_team +-- ---------------------------- +DROP TABLE IF EXISTS `eam_basic_team`; +CREATE TABLE `eam_basic_team` ( + `team_id` bigint NOT NULL AUTO_INCREMENT, + `team_key` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '班组编号', + `team_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '班组名称', + `status` tinyint NOT NULL DEFAULT 0 COMMENT '状态(0:停用/1:启用)', + `value` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '成员', + `create_user` bigint NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_user` bigint NULL DEFAULT NULL COMMENT '修改人', + `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`team_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '班组信息管理' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of eam_basic_team +-- ---------------------------- +INSERT INTO `eam_basic_team` VALUES (1, 'repair', '维修班组', 1, '[{\"userId\":1,\"userName\":\"超级管理员\"}]', 1, '2024-09-24 15:26:30', NULL, '2024-09-24 15:26:30', ''); + +-- ---------------------------- +-- Table structure for eam_basic_warehouse +-- ---------------------------- +DROP TABLE IF EXISTS `eam_basic_warehouse`; +CREATE TABLE `eam_basic_warehouse` ( + `warehouse_id` bigint NOT NULL AUTO_INCREMENT COMMENT '仓库编号', + `create_user` bigint NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_user` bigint NULL DEFAULT NULL COMMENT '修改人', + `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间', + `is_deleted` tinyint NULL DEFAULT 0 COMMENT '是否删除(0:正常/1:删除)', + `name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '仓库名称', + `status` tinyint NOT NULL DEFAULT 0 COMMENT '状态(0:启用/1:禁用)', + PRIMARY KEY (`warehouse_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '仓库信息表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of eam_basic_warehouse +-- ---------------------------- +INSERT INTO `eam_basic_warehouse` VALUES (1, 1, '2024-05-02 14:24:38', 1, '2024-05-07 23:54:47', 0, 'caad-1', 0); +INSERT INTO `eam_basic_warehouse` VALUES (2, 1, '2024-05-02 14:25:13', NULL, '2024-05-02 14:25:13', 0, 'acv', 0); +INSERT INTO `eam_basic_warehouse` VALUES (3, 1, '2024-05-07 23:54:10', 1, '2024-05-07 23:55:24', 0, 'vv', 0); + +-- ---------------------------- +-- Table structure for eam_business_allocate +-- ---------------------------- +DROP TABLE IF EXISTS `eam_business_allocate`; +CREATE TABLE `eam_business_allocate` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', + `business_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '业务编号', + `name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '业务名称', + `applicant` bigint NOT NULL COMMENT '申请人', + `asset_id_List` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '资产编号List', + `business_generated_date` datetime NULL DEFAULT NULL COMMENT '业务生成日期', + `notes` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '备注', + `attach` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '附件', + `status` tinyint NULL DEFAULT NULL COMMENT '状态(0-草稿、1-已完成、2-拒绝、3-审批中、4-取消)', + `create_user` bigint NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_user` bigint NULL DEFAULT NULL COMMENT '修改人', + `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间', + `is_deleted` tinyint NULL DEFAULT 0 COMMENT '是否删除(0:正常/1:删除)', + `out_warehouse_id` bigint NULL DEFAULT NULL COMMENT '调出仓库', + `in_warehouse_id` bigint NULL DEFAULT NULL COMMENT '调入仓库', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '调拨信息表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of eam_business_allocate +-- ---------------------------- + +-- ---------------------------- +-- Table structure for eam_business_borrow +-- ---------------------------- +DROP TABLE IF EXISTS `eam_business_borrow`; +CREATE TABLE `eam_business_borrow` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', + `business_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '业务编号', + `name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '业务名称', + `applicant` bigint NOT NULL COMMENT '申请人', + `asset_id_List` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '资产编号List', + `business_generated_date` datetime NULL DEFAULT NULL COMMENT '业务生成日期', + `notes` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '备注', + `attach` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '附件', + `status` tinyint NULL DEFAULT NULL COMMENT '状态(0-草稿、1-已完成、2-拒绝、3-审批中、4-取消)', + `create_user` bigint NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_user` bigint NULL DEFAULT NULL COMMENT '修改人', + `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间', + `is_deleted` tinyint NULL DEFAULT 0 COMMENT '是否删除(0:正常/1:删除)', + `use_user_id` bigint NOT NULL COMMENT '借用人', + `return_time` datetime NOT NULL COMMENT '预计归还时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '借用信息表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of eam_business_borrow +-- ---------------------------- + +-- ---------------------------- +-- Table structure for eam_business_collection +-- ---------------------------- +DROP TABLE IF EXISTS `eam_business_collection`; +CREATE TABLE `eam_business_collection` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', + `business_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '业务编号', + `name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '业务名称', + `applicant` bigint NOT NULL COMMENT '申请人id', + `asset_id_List` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '资产编号List', + `business_generated_date` datetime NULL DEFAULT NULL COMMENT '业务生成日期', + `notes` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '备注', + `attach` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '附件', + `status` tinyint NULL DEFAULT NULL COMMENT '状态(0-草稿、1-已完成、2-拒绝、3-审批中、4-取消)', + `create_user` bigint NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_user` bigint NULL DEFAULT NULL COMMENT '修改人', + `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间', + `is_deleted` tinyint NULL DEFAULT 0 COMMENT '是否删除(0:正常/1:删除)', + `use_organization_id` bigint NOT NULL COMMENT '领用后公司/部门', + `position_id` bigint NULL DEFAULT NULL COMMENT '领用后存放位置', + `use_user_id` bigint NOT NULL COMMENT '使用人员id', + `position_detail` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '详细位置', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '资产领用信息表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of eam_business_collection +-- ---------------------------- + +-- ---------------------------- +-- Table structure for eam_business_outbound +-- ---------------------------- +DROP TABLE IF EXISTS `eam_business_outbound`; +CREATE TABLE `eam_business_outbound` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', + `business_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '业务编号', + `name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '业务名称', + `warehouse_id` bigint NOT NULL COMMENT '关联仓库id', + `asset_id_List` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '资产编号List', + `business_generated_date` datetime NULL DEFAULT NULL COMMENT '业务生成日期', + `notes` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '备注', + `attach` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '附件', + `status` tinyint NULL DEFAULT NULL COMMENT '状态(0-草稿、1-已完成、2-拒绝、3-审批中、4-取消)', + `create_user` bigint NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_user` bigint NULL DEFAULT NULL COMMENT '修改人', + `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间', + `is_deleted` tinyint NULL DEFAULT 0 COMMENT '是否删除(0:正常/1:删除)', + `own_company_id` bigint NOT NULL COMMENT '领用公司', + `use_organization_id` bigint NOT NULL COMMENT '领用部门', + `use_user_id` bigint NULL DEFAULT NULL COMMENT '领用人员', + `position_detail` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '出库位置', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '出库信息表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of eam_business_outbound +-- ---------------------------- + +-- ---------------------------- +-- Table structure for eam_business_registration +-- ---------------------------- +DROP TABLE IF EXISTS `eam_business_registration`; +CREATE TABLE `eam_business_registration` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', + `business_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '业务编号', + `name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '业务名称', + `applicant` bigint NULL DEFAULT NULL COMMENT '申请人id', + `status` tinyint NULL DEFAULT NULL COMMENT '状态(0-草稿、1-已完成、2-拒绝、3-审批中、4-取消)', + `asset_id` bigint NULL DEFAULT NULL COMMENT '资产id', + `config` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL, + `create_user` bigint NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_user` bigint NULL DEFAULT NULL COMMENT '修改人', + `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间', + `is_deleted` tinyint NULL DEFAULT 0 COMMENT '是否删除(0:正常/1:删除)', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '资产登记信息表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of eam_business_registration +-- ---------------------------- + +-- ---------------------------- +-- Table structure for eam_business_retirement +-- ---------------------------- +DROP TABLE IF EXISTS `eam_business_retirement`; +CREATE TABLE `eam_business_retirement` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', + `business_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '业务编号', + `name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '业务名称', + `applicant` bigint NOT NULL COMMENT '申请人id', + `asset_id_List` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '资产编号List', + `business_generated_date` datetime NULL DEFAULT NULL COMMENT '业务生成日期', + `notes` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '备注', + `attach` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '附件', + `status` tinyint NULL DEFAULT NULL COMMENT '状态(0-草稿、1-已完成、2-拒绝、3-审批中、4-取消)', + `create_user` bigint NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_user` bigint NULL DEFAULT NULL COMMENT '修改人', + `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间', + `is_deleted` tinyint NULL DEFAULT 0 COMMENT '是否删除(0:正常/1:删除)', + `type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '报废方式', + `expedited_status` tinyint NULL DEFAULT 0 COMMENT '加急状态(0-普通、1:加急)', + `is_retirement` tinyint NULL DEFAULT 0 COMMENT '是否已报废(0-否、1:是)', + `is_clean` tinyint NULL DEFAULT 0 COMMENT '是否已清理(0-否、1:是)', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '资产报废' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of eam_business_retirement +-- ---------------------------- + +-- ---------------------------- +-- Table structure for eam_business_return +-- ---------------------------- +DROP TABLE IF EXISTS `eam_business_return`; +CREATE TABLE `eam_business_return` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', + `business_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '业务编号', + `name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '业务名称', + `applicant` bigint NOT NULL COMMENT '申请人id', + `asset_id_List` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '资产编号List', + `business_generated_date` datetime NULL DEFAULT NULL COMMENT '业务生成日期', + `notes` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '备注', + `attach` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '附件', + `status` tinyint NULL DEFAULT NULL COMMENT '状态(0-草稿、1-已完成、2-拒绝、3-审批中、4-取消)', + `create_user` bigint NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_user` bigint NULL DEFAULT NULL COMMENT '修改人', + `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间', + `is_deleted` tinyint NULL DEFAULT 0 COMMENT '是否删除(0:正常/1:删除)', + `position_id` bigint NULL DEFAULT NULL COMMENT '存放位置id', + `position_detail` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '详细位置', + `manager` bigint NULL DEFAULT NULL COMMENT '管理人员id', + `use_user_id` bigint NULL DEFAULT NULL COMMENT '使用人员id', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '归还信息表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of eam_business_return +-- ---------------------------- + +-- ---------------------------- +-- Table structure for eam_business_return_inventory +-- ---------------------------- +DROP TABLE IF EXISTS `eam_business_return_inventory`; +CREATE TABLE `eam_business_return_inventory` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', + `business_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '业务编号', + `name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '业务名称', + `applicant` bigint NOT NULL COMMENT '申请人', + `asset_id_List` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '资产编号List', + `business_generated_date` datetime NULL DEFAULT NULL COMMENT '业务生成日期', + `notes` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '备注', + `attach` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '附件', + `status` tinyint NULL DEFAULT NULL COMMENT '状态(0-草稿、1-已完成、2-拒绝、3-审批中、4-取消)', + `create_user` bigint NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_user` bigint NULL DEFAULT NULL COMMENT '修改人', + `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间', + `is_deleted` tinyint NULL DEFAULT 0 COMMENT '是否删除(0:正常/1:删除)', + `use_organization_id` bigint NOT NULL COMMENT '领用后公司/部门id', + `position_id` bigint NOT NULL COMMENT '领用后存放位置id', + `position_detail` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '详细位置id', + `warehouse_id` bigint NOT NULL COMMENT '关联仓库id', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '退库信息表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of eam_business_return_inventory +-- ---------------------------- + +-- ---------------------------- +-- Table structure for eam_business_storage +-- ---------------------------- +DROP TABLE IF EXISTS `eam_business_storage`; +CREATE TABLE `eam_business_storage` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', + `business_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '业务编号', + `name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '业务名称', + `warehouse_id` bigint NOT NULL COMMENT '关联仓库id', + `asset_id_List` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '资产编号List', + `business_generated_date` datetime NULL DEFAULT NULL COMMENT '业务生成日期', + `notes` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '备注', + `attach` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '附件', + `status` tinyint NULL DEFAULT NULL COMMENT '状态(0-草稿、1-已完成、2-拒绝、3-审批中、4-取消)', + `create_user` bigint NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_user` bigint NULL DEFAULT NULL COMMENT '修改人', + `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间', + `is_deleted` tinyint NULL DEFAULT 0 COMMENT '是否删除(0:正常/1:删除)', + `manager` bigint NULL DEFAULT NULL COMMENT '管理人员id', + `position_id` bigint NULL DEFAULT NULL COMMENT '存放位置id', + `supplier_vendor_id` bigint NULL DEFAULT NULL COMMENT '供应商id', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '入库信息表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of eam_business_storage +-- ---------------------------- + +-- ---------------------------- +-- Table structure for eam_business_transfer +-- ---------------------------- +DROP TABLE IF EXISTS `eam_business_transfer`; +CREATE TABLE `eam_business_transfer` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', + `business_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '业务编号', + `name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '业务名称', + `asset_id_List` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '资产编号List', + `business_generated_date` datetime NULL DEFAULT NULL COMMENT '业务生成日期', + `notes` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '备注', + `attach` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '附件', + `status` tinyint NULL DEFAULT NULL COMMENT '状态(0-草稿、1-已完成、2-拒绝、3-审批中、4-取消)', + `create_user` bigint NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_user` bigint NULL DEFAULT NULL COMMENT '修改人', + `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间', + `is_deleted` tinyint NULL DEFAULT 0 COMMENT '是否删除(0:正常/1:删除)', + `out_use_organization_id` bigint NOT NULL COMMENT '调出使用公司/部门id', + `in_use_organization_id` bigint NOT NULL COMMENT '调入使用公司/部门id', + `manager_id` bigint NOT NULL COMMENT '调入管理员id', + `use_user_id` bigint NOT NULL COMMENT '使用人员id', + `position_id` bigint NULL DEFAULT NULL COMMENT '存放位置id', + `position_detail` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '详细位置', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '资产转移信息表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of eam_business_transfer +-- ---------------------------- + +-- ---------------------------- +-- Table structure for eam_repair +-- ---------------------------- +DROP TABLE IF EXISTS `eam_repair`; +CREATE TABLE `eam_repair` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', + `business_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '业务编号', + `name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '业务名称', + `asset_id_List` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '资产编号List', + `notes` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '备注', + `attach` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '附件', + `status` tinyint NULL DEFAULT NULL COMMENT '状态(0-草稿、1-已完成、2-拒绝、3-审批中、4-取消)', + `create_user` bigint NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_user` bigint NULL DEFAULT NULL COMMENT '修改人', + `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间', + `is_deleted` tinyint NULL DEFAULT 0 COMMENT '是否删除(0:正常/1:删除)', + `planned_date` datetime NOT NULL COMMENT '计划完成时间', + `repair_type_id` bigint NOT NULL COMMENT '保养计划(维修类型)id', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '维修登记信息表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of eam_repair +-- ---------------------------- + +-- ---------------------------- +-- Table structure for eam_repair_fault +-- ---------------------------- +DROP TABLE IF EXISTS `eam_repair_fault`; +CREATE TABLE `eam_repair_fault` ( + `fault_id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', + `name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '名称', + `img` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '图片url', + `asset_id_List` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '资产编号List', + `attach` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '附件', + `notes` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '备注', + `status` tinyint NULL DEFAULT NULL COMMENT '状态(0-草稿、1-已完成、2-拒绝、3-审批中、4-取消)', + `create_user` bigint NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_user` bigint NULL DEFAULT NULL COMMENT '修改人', + `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间', + `is_deleted` tinyint NULL DEFAULT 0 COMMENT '是否删除(0:正常/1:删除)', + PRIMARY KEY (`fault_id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '故障信息表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of eam_repair_fault +-- ---------------------------- + +-- ---------------------------- +-- Table structure for eam_repair_type +-- ---------------------------- +DROP TABLE IF EXISTS `eam_repair_type`; +CREATE TABLE `eam_repair_type` ( + `repair_type_id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', + `name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '名称', + `config` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '配置信息', + `notes` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '备注', + `create_user` bigint NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_user` bigint NULL DEFAULT NULL COMMENT '修改人', + `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间', + `is_deleted` tinyint NULL DEFAULT 0 COMMENT '是否删除(0:正常/1:删除)', + PRIMARY KEY (`repair_type_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 11 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '保养计划(维修类型)表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of eam_repair_type +-- ---------------------------- +INSERT INTO `eam_repair_type` VALUES (1, '预测性维护', '', '', 1, '2024-04-12 15:19:20', NULL, '2024-04-12 15:19:20', 0); +INSERT INTO `eam_repair_type` VALUES (2, '计划性维护', '', '', 1, '2024-04-12 15:19:49', NULL, '2024-04-12 15:19:49', 0); +INSERT INTO `eam_repair_type` VALUES (3, '突发性维护', '', '', 1, '2024-04-12 15:19:59', NULL, '2024-04-12 15:19:59', 0); +INSERT INTO `eam_repair_type` VALUES (5, '阿松大', '212', NULL, 1, '2024-05-04 23:38:57', NULL, '2024-05-04 23:38:57', 0); +INSERT INTO `eam_repair_type` VALUES (11, '维保期保养', '11111', NULL, 1, '2024-05-07 16:08:40', NULL, '2024-05-07 16:08:40', 0); + +-- ---------------------------- +-- Table structure for eam_stocktaking_details +-- ---------------------------- +DROP TABLE IF EXISTS `eam_stocktaking_details`; +CREATE TABLE `eam_stocktaking_details` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', + `stocktaking_job_id` bigint NULL DEFAULT NULL COMMENT '盘点任务id', + `asset_id` bigint NULL DEFAULT NULL COMMENT '盘点资产id', + `status` tinyint NULL DEFAULT NULL COMMENT '盘点状态(0-盘盈,1-盘亏,2-已盘点,3-带盘点,4-异常)', + `img` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `attachment` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '附件', + `notes` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '备注', + `create_user` bigint NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_user` bigint NULL DEFAULT NULL COMMENT '修改人', + `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间', + `is_deleted` tinyint NULL DEFAULT 0 COMMENT '是否删除(0:正常/1:删除)', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '盘点明细' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of eam_stocktaking_details +-- ---------------------------- + +-- ---------------------------- +-- Table structure for eam_stocktaking_job +-- ---------------------------- +DROP TABLE IF EXISTS `eam_stocktaking_job`; +CREATE TABLE `eam_stocktaking_job` ( + `stocktaking_job_id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', + `name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '业务名称', + `head` bigint NULL DEFAULT NULL COMMENT '负责人id', + `full_stocktaking` tinyint NULL DEFAULT NULL COMMENT '全员盘点(0-禁用,1-启用)', + `stocktaking_user_id` bigint NULL DEFAULT NULL COMMENT '盘点人id', + `stocktaking_start_date` datetime NULL DEFAULT NULL COMMENT '购置开始日期', + `stocktaking_end_date` datetime NULL DEFAULT NULL COMMENT '购置结束日期', + `asset_status` tinyint NULL DEFAULT 0 COMMENT '资产状态(0-闲置 1-在用 2-借用中 3-维修中 4-调拨中 5-待报废 6-已处置 7-库存 8-已报废)', + `own_company_id` bigint NULL DEFAULT NULL COMMENT '所属公司id', + `use_organization_id` bigint NULL DEFAULT NULL COMMENT '使用公司/部门id', + `use_user_id` bigint NULL DEFAULT NULL COMMENT '保管人id', + `category_id` bigint NULL DEFAULT NULL COMMENT '资产分类id', + `position_id` bigint NULL DEFAULT NULL COMMENT '存放位置id', + `warehouse_id` bigint NULL DEFAULT NULL COMMENT '仓库id', + `status` tinyint NULL DEFAULT 0 COMMENT '盘点状态(0-未开始,1-进行中,2-取消,3-已完成)', + `notes` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '备注', + `create_user` bigint NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_user` bigint NULL DEFAULT NULL COMMENT '修改人', + `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间', + `is_deleted` tinyint NULL DEFAULT 0 COMMENT '是否删除(0:正常/1:删除)', + PRIMARY KEY (`stocktaking_job_id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '盘点任务表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of eam_stocktaking_job +-- ---------------------------- + +-- ---------------------------- +-- Table structure for eam_stocktaking_plan +-- ---------------------------- +DROP TABLE IF EXISTS `eam_stocktaking_plan`; +CREATE TABLE `eam_stocktaking_plan` ( + `stocktaking_plan_id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', + `name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '业务名称', + `head` bigint NULL DEFAULT NULL COMMENT '负责人id', + `full_stocktaking` tinyint NULL DEFAULT NULL COMMENT '全员盘点(0-禁用,1-启用)', + `stocktaking_user_id` bigint NULL DEFAULT NULL COMMENT '盘点人id', + `stocktaking_start_date` datetime NULL DEFAULT NULL COMMENT '购置开始日期', + `stocktaking_end_date` datetime NULL DEFAULT NULL COMMENT '购置结束日期', + `asset_status` tinyint NULL DEFAULT 0 COMMENT '资产状态(0-闲置 1-在用 2-借用中 3-维修中 4-调拨中 5-待报废 6-已处置 7-库存 8-已报废)', + `own_company_id` bigint NULL DEFAULT NULL COMMENT '所属公司id', + `use_organization_id` bigint NULL DEFAULT NULL COMMENT '使用公司/部门id', + `use_user_id` bigint NULL DEFAULT NULL COMMENT '保管人id', + `category_id` bigint NULL DEFAULT NULL COMMENT '资产分类id', + `position_id` bigint NULL DEFAULT NULL COMMENT '存放位置id', + `warehouse_id` bigint NULL DEFAULT NULL COMMENT '仓库id', + `status` tinyint NULL DEFAULT 0 COMMENT '启用状态(0-禁用,1-启用)', + `notes` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '备注', + `create_user` bigint NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_user` bigint NULL DEFAULT NULL COMMENT '修改人', + `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间', + `is_deleted` tinyint NULL DEFAULT 0 COMMENT '是否删除(0:正常/1:删除)', + PRIMARY KEY (`stocktaking_plan_id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '盘点计划信息' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of eam_stocktaking_plan +-- ---------------------------- + +-- ---------------------------- +-- Table structure for eam_warehouse_asset +-- ---------------------------- +DROP TABLE IF EXISTS `eam_warehouse_asset`; +CREATE TABLE `eam_warehouse_asset` ( + `warehouse_id` bigint NULL DEFAULT NULL COMMENT '仓库id', + `asset_id` bigint NULL DEFAULT NULL COMMENT '资产id', + `count` int NULL DEFAULT NULL COMMENT '库存数量' +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '库存信息表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of eam_warehouse_asset +-- ---------------------------- + +-- ---------------------------- +-- Table structure for fl_form +-- ---------------------------- +DROP TABLE IF EXISTS `fl_form`; +CREATE TABLE `fl_form` ( + `form_id` bigint NOT NULL AUTO_INCREMENT COMMENT '表单ID', + `form_key` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '表单标识', + `type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '表单类型', + `name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '表单名称', + `pc_icon` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'PC端图标', + `mobile_icon` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '移动端图标', + `config` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '表单内容', + `deploy_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '流程id', + `status` tinyint NULL DEFAULT 0 COMMENT '状态(0:有效/1:无效)', + `is_deleted` tinyint NULL DEFAULT 0 COMMENT '是否删除(0:正常/1:删除)', + `create_user` bigint NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_user` bigint NULL DEFAULT NULL COMMENT '修改人', + `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`form_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 14 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '流程表单对象' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of fl_form +-- ---------------------------- +INSERT INTO `fl_form` VALUES (1, 'eam_asset_employee_apply', '资管流程', '员工资产申请', NULL, NULL, '{\"autoAssign\":0,\"nodes\":[{\"id\":\"1\",\"isDefault\":1,\"name\":\"发起人\",\"remark\":\"发起人\",\"roleIds\":[],\"userIds\":[]},{\"id\":\"2\",\"isDefault\":1,\"name\":\"第一审批人\",\"remark\":\"资产管理员\",\"roleIds\":[1],\"userIds\":[1]},{\"id\":\"3\",\"isDefault\":0,\"name\":\"第二审批人\",\"remark\":\"系统管理员\",\"roleIds\":[2],\"userIds\":[2]}],\"checkRequire\":false}', '250001', 0, 0, NULL, NULL, 1, '2024-10-10 16:18:43', NULL); +INSERT INTO `fl_form` VALUES (2, 'eam_asset_employee_loss', '资管流程', '员工资产报失', NULL, NULL, '{\"autoAssign\":0,\"nodes\":[{\"id\":\"1\",\"isDefault\":1,\"name\":\"发起人\",\"remark\":\"发起人\",\"roleIds\":[],\"userIds\":[]},{\"id\":\"2\",\"isDefault\":1,\"name\":\"第一审批人\",\"remark\":\"资产管理员\",\"roleIds\":[1],\"userIds\":[1]},{\"id\":\"3\",\"isDefault\":0,\"name\":\"第二审批人\",\"remark\":\"系统管理员\",\"roleIds\":[2],\"userIds\":[2]}],\"checkRequire\":false}', '250005', 0, 0, NULL, NULL, 1, '2024-10-10 16:19:05', NULL); +INSERT INTO `fl_form` VALUES (3, 'eam_asset_employee_repair', '资管流程', '员工资产报修', NULL, NULL, '{\"autoAssign\":0,\"nodes\":[{\"id\":\"1\",\"isDefault\":1,\"name\":\"发起人\",\"remark\":\"发起人\",\"roleIds\":[],\"userIds\":[]},{\"id\":\"2\",\"isDefault\":1,\"name\":\"第一审批人\",\"remark\":\"资产管理员\",\"roleIds\":[1],\"userIds\":[1]},{\"id\":\"3\",\"isDefault\":0,\"name\":\"第二审批人\",\"remark\":\"系统管理员\",\"roleIds\":[2],\"userIds\":[2]}],\"checkRequire\":false}', '250009', 0, 0, NULL, NULL, NULL, '2024-10-10 16:19:28', NULL); +INSERT INTO `fl_form` VALUES (4, 'eam_asset_scrap', '资管流程', '资产设备报废', NULL, NULL, '{\"autoAssign\":0,\"nodes\":[{\"id\":\"1\",\"isDefault\":1,\"name\":\"发起人\",\"remark\":\"发起人\",\"roleIds\":[],\"userIds\":[]},{\"id\":\"2\",\"isDefault\":1,\"name\":\"第一审批人\",\"remark\":\"资产管理员\",\"roleIds\":[1],\"userIds\":[1]},{\"id\":\"3\",\"isDefault\":0,\"name\":\"第二审批人\",\"remark\":\"系统管理员\",\"roleIds\":[2],\"userIds\":[2]}],\"checkRequire\":false}', '250013', 0, 0, NULL, NULL, NULL, '2024-10-10 16:19:48', NULL); +INSERT INTO `fl_form` VALUES (5, 'eam_asset_purchase_apply', '资管流程', '资产采购申请', NULL, NULL, '{\"autoAssign\":0,\"nodes\":[{\"id\":\"1\",\"isDefault\":1,\"name\":\"发起人\",\"remark\":\"发起人\",\"roleIds\":[],\"userIds\":[]},{\"id\":\"2\",\"isDefault\":1,\"name\":\"第一审批人\",\"remark\":\"资产管理员\",\"roleIds\":[1],\"userIds\":[1]},{\"id\":\"3\",\"isDefault\":0,\"name\":\"第二审批人\",\"remark\":\"系统管理员\",\"roleIds\":[2],\"userIds\":[2]}],\"checkRequire\":false}', '250017', 0, 0, NULL, NULL, NULL, '2024-10-10 16:20:07', NULL); +INSERT INTO `fl_form` VALUES (6, 'eam_asset_employee_handover', '资管流程', '员工资产交接', NULL, NULL, '{\"autoAssign\":0,\"nodes\":[{\"id\":\"1\",\"isDefault\":1,\"name\":\"发起人\",\"remark\":\"发起人\",\"roleIds\":[],\"userIds\":[]},{\"id\":\"2\",\"isDefault\":1,\"name\":\"第一审批人\",\"remark\":\"资产管理员\",\"roleIds\":[1],\"userIds\":[1]},{\"id\":\"3\",\"isDefault\":0,\"name\":\"第二审批人\",\"remark\":\"系统管理员\",\"roleIds\":[2],\"userIds\":[2]}],\"checkRequire\":false}', '250021', 0, 0, NULL, NULL, NULL, '2024-10-10 16:24:01', NULL); +INSERT INTO `fl_form` VALUES (7, 'eam_asset_stock_goods_use', '资管流程', '物品领用申请', NULL, NULL, '{\"autoAssign\":0,\"nodes\":[{\"id\":\"1\",\"isDefault\":1,\"name\":\"发起人\",\"remark\":\"发起人\",\"roleIds\":[],\"userIds\":[]},{\"id\":\"2\",\"isDefault\":1,\"name\":\"第一审批人\",\"remark\":\"资产管理员\",\"roleIds\":[1],\"userIds\":[1]},{\"id\":\"3\",\"isDefault\":0,\"name\":\"第二审批人\",\"remark\":\"系统管理员\",\"roleIds\":[2],\"userIds\":[2]}],\"checkRequire\":false}', '250025', 0, 0, NULL, NULL, NULL, '2024-10-10 16:24:23', NULL); +INSERT INTO `fl_form` VALUES (8, 'eam_device_repair', '设备流程', '设备报修维修', NULL, NULL, '{\"autoAssign\":0,\"nodes\":[{\"id\":\"id_0\",\"isDefault\":1,\"name\":\"发起\",\"remark\":\"发起人\",\"roleIds\":[1,2,3],\"userIds\":[]},{\"id\":\"id_1_0\",\"isDefault\":1,\"name\":\"指派/受理\",\"remark\":\"班长指派\",\"roleIds\":[1,2,3],\"userIds\":[]},{\"id\":\"id_1\",\"isDefault\":1,\"name\":\"处置\",\"remark\":\"操作员执行\",\"roleIds\":[1,2,3],\"userIds\":[]},{\"id\":\"id_2\",\"isDefault\":1,\"name\":\"验收\",\"remark\":\"发起人验收\",\"roleIds\":[1,2,3],\"userIds\":[]},{\"id\":\"id_3\",\"isDefault\":0,\"name\":\"新增审批节点\",\"remark\":\"系统管理员\",\"roleIds\":[1],\"userIds\":[3]}],\"checkRequire\":true}', '250029', 0, 0, NULL, NULL, 1, '2024-10-10 16:24:42', NULL); +INSERT INTO `fl_form` VALUES (9, 'eam_device_inspection', '设备流程', '设备巡检任务', NULL, NULL, '{\"autoAssign\":0,\"nodes\":[{\"id\":\"id_0\",\"isDefault\":1,\"name\":\"发起\",\"remark\":\"发起人\",\"roleIds\":[1,2,3],\"userIds\":[]},{\"id\":\"id_1_0\",\"isDefault\":1,\"name\":\"指派/受理\",\"remark\":\"班长指派\",\"roleIds\":[1,2,3],\"userIds\":[]},{\"id\":\"id_1\",\"isDefault\":1,\"name\":\"处置\",\"remark\":\"操作员执行\",\"roleIds\":[1,2,3],\"userIds\":[]},{\"id\":\"id_2\",\"isDefault\":1,\"name\":\"验收\",\"remark\":\"发起人验收\",\"roleIds\":[1,2,3],\"userIds\":[]},{\"id\":\"id_3\",\"isDefault\":0,\"name\":\"新增审批节点\",\"remark\":\"系统管理员\",\"roleIds\":[1],\"userIds\":[3]}],\"checkRequire\":true}', '250033', 0, 0, NULL, NULL, NULL, '2024-10-10 16:25:05', NULL); +INSERT INTO `fl_form` VALUES (10, 'eam_device_maintenance', '设备流程', '设备保养任务', NULL, NULL, '{\"autoAssign\":0,\"nodes\":[{\"id\":\"id_0\",\"isDefault\":1,\"name\":\"发起\",\"remark\":\"发起人\",\"roleIds\":[1,2,3],\"userIds\":[]},{\"id\":\"id_1_0\",\"isDefault\":1,\"name\":\"指派/受理\",\"remark\":\"班长指派\",\"roleIds\":[1,2,3],\"userIds\":[]},{\"id\":\"id_1\",\"isDefault\":1,\"name\":\"处置\",\"remark\":\"操作员执行\",\"roleIds\":[1,2,3],\"userIds\":[]},{\"id\":\"id_2\",\"isDefault\":1,\"name\":\"验收\",\"remark\":\"发起人验收\",\"roleIds\":[1,2,3],\"userIds\":[]},{\"id\":\"id_3\",\"isDefault\":0,\"name\":\"新增审批节点\",\"remark\":\"系统管理员\",\"roleIds\":[1],\"userIds\":[3]}],\"checkRequire\":true}', '250037', 0, 0, NULL, NULL, NULL, '2024-10-10 16:25:19', NULL); +INSERT INTO `fl_form` VALUES (11, 'eam_device_stocktaking', '设备流程', '设备盘点任务', NULL, NULL, '{\"autoAssign\":0,\"nodes\":[{\"id\":\"id_0\",\"isDefault\":1,\"name\":\"发起\",\"remark\":\"发起人\",\"roleIds\":[1,2,3],\"userIds\":[]},{\"id\":\"id_1_0\",\"isDefault\":1,\"name\":\"指派/受理\",\"remark\":\"班长指派\",\"roleIds\":[1,2,3],\"userIds\":[]},{\"id\":\"id_1\",\"isDefault\":1,\"name\":\"处置\",\"remark\":\"操作员执行\",\"roleIds\":[1,2,3],\"userIds\":[]},{\"id\":\"id_2\",\"isDefault\":1,\"name\":\"验收\",\"remark\":\"发起人验收\",\"roleIds\":[1,2,3],\"userIds\":[]},{\"id\":\"id_3\",\"isDefault\":0,\"name\":\"新增审批节点\",\"remark\":\"系统管理员\",\"roleIds\":[1],\"userIds\":[3]}],\"checkRequire\":true}', '250041', 0, 0, NULL, NULL, NULL, '2024-10-10 16:25:39', NULL); +INSERT INTO `fl_form` VALUES (12, 'test', '测试流程', '测试', NULL, NULL, '{\"autoAssign\":0,\"nodes\":[{\"id\":\"id_0\",\"isDefault\":1,\"name\":\"发起\",\"remark\":\"发起人\",\"roleIds\":[1,2,3],\"userIds\":[]},{\"id\":\"id_1_0\",\"isDefault\":1,\"name\":\"指派/受理\",\"remark\":\"班长指派\",\"roleIds\":[1,2,3],\"userIds\":[]},{\"id\":\"id_1\",\"isDefault\":1,\"name\":\"处置\",\"remark\":\"操作员执行\",\"roleIds\":[1,2,3],\"userIds\":[]},{\"id\":\"id_2\",\"isDefault\":1,\"name\":\"验收\",\"remark\":\"发起人验收\",\"roleIds\":[1,2,3],\"userIds\":[]},{\"id\":\"id_3\",\"isDefault\":0,\"name\":\"新增审批节点\",\"remark\":\"系统管理员\",\"roleIds\":[1],\"userIds\":[3]}],\"checkRequire\":true}', '157501', 0, 0, NULL, NULL, NULL, '2024-10-08 10:33:14', NULL); + +-- ---------------------------- +-- Table structure for fl_form_item +-- ---------------------------- +DROP TABLE IF EXISTS `fl_form_item`; +CREATE TABLE `fl_form_item` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', + `name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '名称', + `form_key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '表单标识', + `proc_ins_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '流程实例id', + `task_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '任务id', + `contents` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '审批内容', + `logs` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '审批记录', + `status` int NULL DEFAULT NULL COMMENT '状态', + `is_deleted` tinyint NULL DEFAULT 0 COMMENT '是否删除(0:正常/1:删除)', + `create_user` bigint NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `create_type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建方式', + `update_user` bigint NULL DEFAULT NULL COMMENT '修改人', + `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 46 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '流程实例对象' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of fl_form_item +-- ---------------------------- + +-- ---------------------------- +-- Table structure for flw_channel_definition +-- ---------------------------- +DROP TABLE IF EXISTS `flw_channel_definition`; +CREATE TABLE `flw_channel_definition` ( + `ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `NAME_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `VERSION_` int NULL DEFAULT NULL, + `KEY_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `CATEGORY_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `DEPLOYMENT_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `CREATE_TIME_` datetime(3) NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `RESOURCE_NAME_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `DESCRIPTION_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `TYPE_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `IMPLEMENTATION_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE, + UNIQUE INDEX `ACT_IDX_CHANNEL_DEF_UNIQ`(`KEY_` ASC, `VERSION_` ASC, `TENANT_ID_` ASC) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of flw_channel_definition +-- ---------------------------- + +-- ---------------------------- +-- Table structure for flw_ev_databasechangelog +-- ---------------------------- +DROP TABLE IF EXISTS `flw_ev_databasechangelog`; +CREATE TABLE `flw_ev_databasechangelog` ( + `ID` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `AUTHOR` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `FILENAME` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `DATEEXECUTED` datetime NOT NULL, + `ORDEREXECUTED` int NOT NULL, + `EXECTYPE` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `MD5SUM` varchar(35) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `DESCRIPTION` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `COMMENTS` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `TAG` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `LIQUIBASE` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `CONTEXTS` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `LABELS` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `DEPLOYMENT_ID` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of flw_ev_databasechangelog +-- ---------------------------- +INSERT INTO `flw_ev_databasechangelog` VALUES ('1', 'flowable', 'org/flowable/eventregistry/db/liquibase/flowable-eventregistry-db-changelog.xml', '2024-04-23 14:58:20', 1, 'EXECUTED', '8:1b0c48c9cf7945be799d868a2626d687', 'createTable tableName=FLW_EVENT_DEPLOYMENT; createTable tableName=FLW_EVENT_RESOURCE; createTable tableName=FLW_EVENT_DEFINITION; createIndex indexName=ACT_IDX_EVENT_DEF_UNIQ, tableName=FLW_EVENT_DEFINITION; createTable tableName=FLW_CHANNEL_DEFIN...', '', NULL, '4.9.1', NULL, NULL, '3855500464'); +INSERT INTO `flw_ev_databasechangelog` VALUES ('2', 'flowable', 'org/flowable/eventregistry/db/liquibase/flowable-eventregistry-db-changelog.xml', '2024-04-23 14:58:20', 2, 'EXECUTED', '8:0ea825feb8e470558f0b5754352b9cda', 'addColumn tableName=FLW_CHANNEL_DEFINITION; addColumn tableName=FLW_CHANNEL_DEFINITION', '', NULL, '4.9.1', NULL, NULL, '3855500464'); +INSERT INTO `flw_ev_databasechangelog` VALUES ('3', 'flowable', 'org/flowable/eventregistry/db/liquibase/flowable-eventregistry-db-changelog.xml', '2024-04-23 14:58:20', 3, 'EXECUTED', '8:3c2bb293350b5cbe6504331980c9dcee', 'customChange', '', NULL, '4.9.1', NULL, NULL, '3855500464'); + +-- ---------------------------- +-- Table structure for flw_ev_databasechangeloglock +-- ---------------------------- +DROP TABLE IF EXISTS `flw_ev_databasechangeloglock`; +CREATE TABLE `flw_ev_databasechangeloglock` ( + `ID` int NOT NULL, + `LOCKED` bit(1) NOT NULL, + `LOCKGRANTED` datetime NULL DEFAULT NULL, + `LOCKEDBY` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + PRIMARY KEY (`ID`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of flw_ev_databasechangeloglock +-- ---------------------------- +INSERT INTO `flw_ev_databasechangeloglock` VALUES (1, b'0', NULL, NULL); + +-- ---------------------------- +-- Table structure for flw_event_definition +-- ---------------------------- +DROP TABLE IF EXISTS `flw_event_definition`; +CREATE TABLE `flw_event_definition` ( + `ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `NAME_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `VERSION_` int NULL DEFAULT NULL, + `KEY_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `CATEGORY_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `DEPLOYMENT_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `RESOURCE_NAME_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `DESCRIPTION_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE, + UNIQUE INDEX `ACT_IDX_EVENT_DEF_UNIQ`(`KEY_` ASC, `VERSION_` ASC, `TENANT_ID_` ASC) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of flw_event_definition +-- ---------------------------- + +-- ---------------------------- +-- Table structure for flw_event_deployment +-- ---------------------------- +DROP TABLE IF EXISTS `flw_event_deployment`; +CREATE TABLE `flw_event_deployment` ( + `ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `NAME_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `CATEGORY_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `DEPLOY_TIME_` datetime(3) NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `PARENT_DEPLOYMENT_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of flw_event_deployment +-- ---------------------------- + +-- ---------------------------- +-- Table structure for flw_event_resource +-- ---------------------------- +DROP TABLE IF EXISTS `flw_event_resource`; +CREATE TABLE `flw_event_resource` ( + `ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `NAME_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `DEPLOYMENT_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `RESOURCE_BYTES_` longblob NULL, + PRIMARY KEY (`ID_`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of flw_event_resource +-- ---------------------------- + +-- ---------------------------- +-- Table structure for flw_ru_batch +-- ---------------------------- +DROP TABLE IF EXISTS `flw_ru_batch`; +CREATE TABLE `flw_ru_batch` ( + `ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `REV_` int NULL DEFAULT NULL, + `TYPE_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `SEARCH_KEY_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `SEARCH_KEY2_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `CREATE_TIME_` datetime(3) NOT NULL, + `COMPLETE_TIME_` datetime(3) NULL DEFAULT NULL, + `STATUS_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `BATCH_DOC_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT '', + PRIMARY KEY (`ID_`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_bin ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of flw_ru_batch +-- ---------------------------- + +-- ---------------------------- +-- Table structure for flw_ru_batch_part +-- ---------------------------- +DROP TABLE IF EXISTS `flw_ru_batch_part`; +CREATE TABLE `flw_ru_batch_part` ( + `ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `REV_` int NULL DEFAULT NULL, + `BATCH_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `TYPE_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, + `SCOPE_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `SUB_SCOPE_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `SCOPE_TYPE_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `SEARCH_KEY_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `SEARCH_KEY2_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `CREATE_TIME_` datetime(3) NOT NULL, + `COMPLETE_TIME_` datetime(3) NULL DEFAULT NULL, + `STATUS_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `RESULT_DOC_ID_` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT '', + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `FLW_IDX_BATCH_PART`(`BATCH_ID_` ASC) USING BTREE, + CONSTRAINT `FLW_FK_BATCH_PART_PARENT` FOREIGN KEY (`BATCH_ID_`) REFERENCES `flw_ru_batch` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_bin ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of flw_ru_batch_part +-- ---------------------------- + +-- ---------------------------- +-- Table structure for qrtz_blob_triggers +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_blob_triggers`; +CREATE TABLE `qrtz_blob_triggers` ( + `sched_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '调度名称', + `trigger_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'qrtz_triggers表trigger_name的外键', + `trigger_group` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'qrtz_triggers表trigger_group的外键', + `blob_data` blob NULL COMMENT '存放持久化Trigger对象', + PRIMARY KEY (`sched_name`, `trigger_name`, `trigger_group`) USING BTREE, + CONSTRAINT `qrtz_blob_triggers_ibfk_1` FOREIGN KEY (`sched_name`, `trigger_name`, `trigger_group`) REFERENCES `qrtz_triggers` (`sched_name`, `trigger_name`, `trigger_group`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'Blob类型的触发器表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of qrtz_blob_triggers +-- ---------------------------- + +-- ---------------------------- +-- Table structure for qrtz_calendars +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_calendars`; +CREATE TABLE `qrtz_calendars` ( + `sched_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '调度名称', + `calendar_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '日历名称', + `calendar` blob NOT NULL COMMENT '存放持久化calendar对象', + PRIMARY KEY (`sched_name`, `calendar_name`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '日历信息表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of qrtz_calendars +-- ---------------------------- + +-- ---------------------------- +-- Table structure for qrtz_cron_triggers +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_cron_triggers`; +CREATE TABLE `qrtz_cron_triggers` ( + `sched_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '调度名称', + `trigger_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'qrtz_triggers表trigger_name的外键', + `trigger_group` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'qrtz_triggers表trigger_group的外键', + `cron_expression` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'cron表达式', + `time_zone_id` varchar(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '时区', + PRIMARY KEY (`sched_name`, `trigger_name`, `trigger_group`) USING BTREE, + CONSTRAINT `qrtz_cron_triggers_ibfk_1` FOREIGN KEY (`sched_name`, `trigger_name`, `trigger_group`) REFERENCES `qrtz_triggers` (`sched_name`, `trigger_name`, `trigger_group`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'Cron类型的触发器表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of qrtz_cron_triggers +-- ---------------------------- + +-- ---------------------------- +-- Table structure for qrtz_fired_triggers +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_fired_triggers`; +CREATE TABLE `qrtz_fired_triggers` ( + `sched_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '调度名称', + `entry_id` varchar(95) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '调度器实例id', + `trigger_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'qrtz_triggers表trigger_name的外键', + `trigger_group` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'qrtz_triggers表trigger_group的外键', + `instance_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '调度器实例名', + `fired_time` bigint NOT NULL COMMENT '触发的时间', + `sched_time` bigint NOT NULL COMMENT '定时器制定的时间', + `priority` int NOT NULL COMMENT '优先级', + `state` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '状态', + `job_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '任务名称', + `job_group` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '任务组名', + `is_nonconcurrent` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '是否并发', + `requests_recovery` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '是否接受恢复执行', + PRIMARY KEY (`sched_name`, `entry_id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '已触发的触发器表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of qrtz_fired_triggers +-- ---------------------------- + +-- ---------------------------- +-- Table structure for qrtz_job_details +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_job_details`; +CREATE TABLE `qrtz_job_details` ( + `sched_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '调度名称', + `job_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '任务名称', + `job_group` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '任务组名', + `description` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '相关介绍', + `job_class_name` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '执行任务类名称', + `is_durable` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '是否持久化', + `is_nonconcurrent` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '是否并发', + `is_update_data` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '是否更新数据', + `requests_recovery` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '是否接受恢复执行', + `job_data` blob NULL COMMENT '存放持久化job对象', + PRIMARY KEY (`sched_name`, `job_name`, `job_group`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '任务详细信息表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of qrtz_job_details +-- ---------------------------- + +-- ---------------------------- +-- Table structure for qrtz_locks +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_locks`; +CREATE TABLE `qrtz_locks` ( + `sched_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '调度名称', + `lock_name` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '悲观锁名称', + PRIMARY KEY (`sched_name`, `lock_name`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '存储的悲观锁信息表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of qrtz_locks +-- ---------------------------- + +-- ---------------------------- +-- Table structure for qrtz_paused_trigger_grps +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_paused_trigger_grps`; +CREATE TABLE `qrtz_paused_trigger_grps` ( + `sched_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '调度名称', + `trigger_group` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'qrtz_triggers表trigger_group的外键', + PRIMARY KEY (`sched_name`, `trigger_group`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '暂停的触发器表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of qrtz_paused_trigger_grps +-- ---------------------------- + +-- ---------------------------- +-- Table structure for qrtz_scheduler_state +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_scheduler_state`; +CREATE TABLE `qrtz_scheduler_state` ( + `sched_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '调度名称', + `instance_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '实例名称', + `last_checkin_time` bigint NOT NULL COMMENT '上次检查时间', + `checkin_interval` bigint NOT NULL COMMENT '检查间隔时间', + PRIMARY KEY (`sched_name`, `instance_name`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '调度器状态表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of qrtz_scheduler_state +-- ---------------------------- + +-- ---------------------------- +-- Table structure for qrtz_simple_triggers +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_simple_triggers`; +CREATE TABLE `qrtz_simple_triggers` ( + `sched_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '调度名称', + `trigger_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'qrtz_triggers表trigger_name的外键', + `trigger_group` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'qrtz_triggers表trigger_group的外键', + `repeat_count` bigint NOT NULL COMMENT '重复的次数统计', + `repeat_interval` bigint NOT NULL COMMENT '重复的间隔时间', + `times_triggered` bigint NOT NULL COMMENT '已经触发的次数', + PRIMARY KEY (`sched_name`, `trigger_name`, `trigger_group`) USING BTREE, + CONSTRAINT `qrtz_simple_triggers_ibfk_1` FOREIGN KEY (`sched_name`, `trigger_name`, `trigger_group`) REFERENCES `qrtz_triggers` (`sched_name`, `trigger_name`, `trigger_group`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '简单触发器的信息表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of qrtz_simple_triggers +-- ---------------------------- + +-- ---------------------------- +-- Table structure for qrtz_simprop_triggers +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_simprop_triggers`; +CREATE TABLE `qrtz_simprop_triggers` ( + `sched_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '调度名称', + `trigger_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'qrtz_triggers表trigger_name的外键', + `trigger_group` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'qrtz_triggers表trigger_group的外键', + `str_prop_1` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'String类型的trigger的第一个参数', + `str_prop_2` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'String类型的trigger的第二个参数', + `str_prop_3` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'String类型的trigger的第三个参数', + `int_prop_1` int NULL DEFAULT NULL COMMENT 'int类型的trigger的第一个参数', + `int_prop_2` int NULL DEFAULT NULL COMMENT 'int类型的trigger的第二个参数', + `long_prop_1` bigint NULL DEFAULT NULL COMMENT 'long类型的trigger的第一个参数', + `long_prop_2` bigint NULL DEFAULT NULL COMMENT 'long类型的trigger的第二个参数', + `dec_prop_1` decimal(13, 4) NULL DEFAULT NULL COMMENT 'decimal类型的trigger的第一个参数', + `dec_prop_2` decimal(13, 4) NULL DEFAULT NULL COMMENT 'decimal类型的trigger的第二个参数', + `bool_prop_1` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'Boolean类型的trigger的第一个参数', + `bool_prop_2` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'Boolean类型的trigger的第二个参数', + PRIMARY KEY (`sched_name`, `trigger_name`, `trigger_group`) USING BTREE, + CONSTRAINT `qrtz_simprop_triggers_ibfk_1` FOREIGN KEY (`sched_name`, `trigger_name`, `trigger_group`) REFERENCES `qrtz_triggers` (`sched_name`, `trigger_name`, `trigger_group`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '同步机制的行锁表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of qrtz_simprop_triggers +-- ---------------------------- + +-- ---------------------------- +-- Table structure for qrtz_triggers +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_triggers`; +CREATE TABLE `qrtz_triggers` ( + `sched_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '调度名称', + `trigger_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '触发器的名字', + `trigger_group` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '触发器所属组的名字', + `job_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'qrtz_job_details表job_name的外键', + `job_group` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'qrtz_job_details表job_group的外键', + `description` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '相关介绍', + `next_fire_time` bigint NULL DEFAULT NULL COMMENT '上一次触发时间(毫秒)', + `prev_fire_time` bigint NULL DEFAULT NULL COMMENT '下一次触发时间(默认为-1表示不触发)', + `priority` int NULL DEFAULT NULL COMMENT '优先级', + `trigger_state` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '触发器状态', + `trigger_type` varchar(8) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '触发器的类型', + `start_time` bigint NOT NULL COMMENT '开始时间', + `end_time` bigint NULL DEFAULT NULL COMMENT '结束时间', + `calendar_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '日程表名称', + `misfire_instr` smallint NULL DEFAULT NULL COMMENT '补偿执行的策略', + `job_data` blob NULL COMMENT '存放持久化job对象', + PRIMARY KEY (`sched_name`, `trigger_name`, `trigger_group`) USING BTREE, + INDEX `sched_name`(`sched_name` ASC, `job_name` ASC, `job_group` ASC) USING BTREE, + CONSTRAINT `qrtz_triggers_ibfk_1` FOREIGN KEY (`sched_name`, `job_name`, `job_group`) REFERENCES `qrtz_job_details` (`sched_name`, `job_name`, `job_group`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '触发器详细信息表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of qrtz_triggers +-- ---------------------------- + +-- ---------------------------- +-- Table structure for sys_config +-- ---------------------------- +DROP TABLE IF EXISTS `sys_config`; +CREATE TABLE `sys_config` ( + `config_id` int NOT NULL AUTO_INCREMENT COMMENT '参数主键', + `config_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '参数名称', + `config_key` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '参数键名', + `config_value` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '参数键值', + `create_user` bigint NULL DEFAULT NULL COMMENT '创建者', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_user` bigint NULL DEFAULT NULL COMMENT '更新者', + `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`config_id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '参数配置表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of sys_config +-- ---------------------------- + +-- ---------------------------- +-- Table structure for sys_dict_data +-- ---------------------------- +DROP TABLE IF EXISTS `sys_dict_data`; +CREATE TABLE `sys_dict_data` ( + `dict_code` bigint NOT NULL AUTO_INCREMENT COMMENT '字典编码', + `dict_sort` int NULL DEFAULT 0 COMMENT '字典排序', + `dict_label` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '字典标签', + `dict_value` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '字典键值', + `dict_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '字典类型', + `css_class` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '样式属性(其他样式扩展)', + `list_class` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '表格回显样式', + `is_default` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'N' COMMENT '是否默认(Y是 N否)', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '状态(0正常 1停用)', + `create_user` bigint NULL DEFAULT NULL COMMENT '创建者', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_user` bigint NULL DEFAULT NULL COMMENT '更新者', + `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`dict_code`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '字典数据表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of sys_dict_data +-- ---------------------------- + +-- ---------------------------- +-- Table structure for sys_dict_type +-- ---------------------------- +DROP TABLE IF EXISTS `sys_dict_type`; +CREATE TABLE `sys_dict_type` ( + `dict_id` bigint NOT NULL AUTO_INCREMENT COMMENT '字典主键', + `dict_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '字典名称', + `dict_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '字典类型', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '状态(0正常 1停用)', + `create_user` bigint NULL DEFAULT NULL COMMENT '创建者', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_user` bigint NULL DEFAULT NULL COMMENT '更新者', + `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`dict_id`) USING BTREE, + UNIQUE INDEX `dict_type`(`dict_type` ASC) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '字典类型表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of sys_dict_type +-- ---------------------------- + +-- ---------------------------- +-- Table structure for sys_form_temp +-- ---------------------------- +DROP TABLE IF EXISTS `sys_form_temp`; +CREATE TABLE `sys_form_temp` ( + `form_temp_id` bigint NOT NULL AUTO_INCREMENT, + `form_key` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '表单标识(编号)', + `form_type` int NOT NULL DEFAULT 0 COMMENT '表单类型(0-默认表单,1-巡检表单,2-保养表单,3-维修表单)', + `form_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '表单名称', + `form_status` tinyint NOT NULL DEFAULT 1 COMMENT '表单状态(0-停用 ,1-启用)', + `form_value` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '表单内容(List<>)', + `template_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '表单模板地址', + `create_user` bigint NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间', + `update_user` bigint NULL DEFAULT NULL COMMENT '修改人', + `update_time` datetime NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + PRIMARY KEY (`form_temp_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '表单文档模板信息管理' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of sys_form_temp +-- ---------------------------- +INSERT INTO `sys_form_temp` VALUES (1, 'SCSBXJ24083000001', 1, '锅炉类设备巡检表单', 1, '[{\"key\":\"ext1\",\"name\":\"扩展字段1\",\"sort\":0,\"type\":\"STRING\",\"value\":\"文本示例\"},{\"key\":\"ext2\",\"name\":\"扩展字段2\",\"sort\":1,\"type\":\"NUMBER\",\"value\":123.45},{\"key\":\"ext3\",\"name\":\"扩展字段3\",\"sort\":2,\"type\":\"DATE\",\"value\":\"2024-09-24\"},{\"key\":\"ext4\",\"name\":\"扩展字段4\",\"sort\":3,\"type\":\"RADIO\",\"value\":{\"fields\":[\"选项1\",\"选项2\",\"选项3\"],\"value\":\"选项1\"}}]', '', 1, '2024-09-24 11:30:58', NULL, '2024-09-24 11:30:58'); + +-- ---------------------------- +-- Table structure for sys_job +-- ---------------------------- +DROP TABLE IF EXISTS `sys_job`; +CREATE TABLE `sys_job` ( + `job_id` bigint NOT NULL AUTO_INCREMENT COMMENT '任务ID', + `job_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '任务名称', + `job_group` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'DEFAULT' COMMENT '任务组名', + `invoke_target` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '调用目标字符串', + `cron_expression` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'cron执行表达式', + `misfire_policy` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '3' COMMENT '计划执行错误策略(1立即执行 2执行一次 3放弃执行)', + `concurrent` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '1' COMMENT '是否并发执行(0允许 1禁止)', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '状态(0正常 1暂停)', + `create_user` bigint NULL DEFAULT NULL COMMENT '创建者', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_user` bigint NULL DEFAULT NULL COMMENT '更新者', + `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '备注信息', + `config` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '配置信息', + PRIMARY KEY (`job_id`, `job_name`, `job_group`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 106 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '定时任务调度表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of sys_job +-- ---------------------------- +INSERT INTO `sys_job` VALUES (105, '巡检计划', 'inspection', 'SysTask.inspectionJob({\"_formValue\":[{\"key\":\"ext1\",\"name\":\"扩展字段1\",\"sort\":0,\"type\":\"STRING\",\"value\":\"文本示例\"},{\"key\":\"ext2\",\"name\":\"扩展字段2\",\"sort\":1,\"type\":\"NUMBER\",\"value\":123.45},{\"key\":\"ext3\",\"name\":\"扩展字段3\",\"sort\":2,\"type\":\"DATE\",\"value\":\"2024-09-24\"},{\"key\":\"ext4\",\"name\":\"扩展字段4\",\"sort\":3,\"type\":\"RADIO\",\"value\":{\"fields\":[\"选项1\",\"选项2\",\"选项3\"],\"value\":\"选项1\"}}],\"actualStartTime\":\"2024-10-08 10:00:00\",\"assetIdList\":[{\"assetId\":1,\"count\":0,\"warehouseId\":0}],\"businessId\":\"SCSBXJ24083000001\",\"concurrent\":\"1\",\"createUser\":1,\"cycleType\":\"day\",\"duration\":1,\"expectedFinishTime\":\"2024-10-09 23:59:59\",\"expectedStartTime\":\"2024-10-08 15:27:00\",\"formName\":\"锅炉类设备巡检表单\",\"formTempId\":1,\"interval\":0,\"limit\":false,\"misfirePolicy\":\"3\",\"name\":\"巡检计划\",\"order\":false,\"photo\":true,\"planType\":\"inspection\",\"remark\":\"\",\"skipWeekend\":false,\"status\":\"0\",\"teamId\":1,\"teamName\":\"维修班组\",\"templatePath\":\"\"}J)', '00 00 10 1/0 * ?', '3', '1', '0', 1, '2024-10-08 17:04:54', NULL, NULL, '', NULL); + +-- ---------------------------- +-- Table structure for sys_job_log +-- ---------------------------- +DROP TABLE IF EXISTS `sys_job_log`; +CREATE TABLE `sys_job_log` ( + `job_log_id` bigint NOT NULL AUTO_INCREMENT COMMENT '任务日志ID', + `job_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '任务名称', + `job_group` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '任务组名', + `invoke_target` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '调用目标字符串', + `job_message` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '日志信息', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '执行状态(0正常 1失败)', + `exception_info` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '异常信息', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + PRIMARY KEY (`job_log_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 18 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '定时任务调度日志表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of sys_job_log +-- ---------------------------- + +-- ---------------------------- +-- Table structure for sys_log +-- ---------------------------- +DROP TABLE IF EXISTS `sys_log`; +CREATE TABLE `sys_log` ( + `log_id` bigint NOT NULL AUTO_INCREMENT COMMENT '日志ID', + `log_type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '日志类型', + `log_content` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '日志内容', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + PRIMARY KEY (`log_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '系统日志信息表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of sys_log +-- ---------------------------- +INSERT INTO `sys_log` VALUES (1, '登陆日志', '超级管理员登陆', '2024-09-24 16:01:49'); + +-- ---------------------------- +-- Table structure for ums_menu +-- ---------------------------- +DROP TABLE IF EXISTS `ums_menu`; +CREATE TABLE `ums_menu` ( + `menu_id` bigint NOT NULL AUTO_INCREMENT COMMENT '菜单ID', + `menu_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '菜单名称', + `parent_id` bigint NULL DEFAULT NULL COMMENT '父主键ID', + `sort` tinyint NULL DEFAULT 0 COMMENT '排序', + `url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '请求路径', + `menu_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '菜单类型(M目录 C菜单 F按钮)', + `visible` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '菜单状态(1隐藏 0显示)', + `permission` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '权限标识', + `icon` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '菜单图标', + `create_user` bigint NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_user` bigint NULL DEFAULT NULL COMMENT '修改人', + `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间', + `is_deleted` tinyint UNSIGNED NULL DEFAULT 0 COMMENT '是否删除(0:正常/1:删除)', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`menu_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 88 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '菜单表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of ums_menu +-- ---------------------------- +INSERT INTO `ums_menu` VALUES (7, '控制台', 0, 0, '', '', '0', 'dashboard:view', '', 1, '2024-05-15 18:29:59', NULL, '2024-05-15 18:29:59', 0, ''); +INSERT INTO `ums_menu` VALUES (9, '固资台账-资产公共台账', 0, 0, '', '', '0', 'ledger-asset-search:view', '', 1, '2024-05-15 18:32:01', NULL, '2024-05-15 18:32:01', 0, ''); +INSERT INTO `ums_menu` VALUES (11, '固资台账-资产库存台账', 0, 0, '', '', '0', 'ledger-storage:view', '', 1, '2024-05-15 18:32:55', NULL, '2024-05-15 18:32:55', 0, ''); +INSERT INTO `ums_menu` VALUES (13, '固资台账-归属组织台账', 0, 0, '', '', '0', 'ledger-asset-belong:view', '', 1, '2024-05-15 18:33:22', NULL, '2024-05-15 18:33:22', 0, ''); +INSERT INTO `ums_menu` VALUES (15, '固资台账-使用组织台账', 0, 0, '', '', '0', 'ledger-asset-org:view', '', 1, '2024-05-15 18:33:46', NULL, '2024-05-15 18:33:46', 0, ''); +INSERT INTO `ums_menu` VALUES (17, '固资台账-存放位置台账', 0, 0, '', '', '0', 'ledger-asset-position:view', '', 1, '2024-05-15 18:34:07', NULL, '2024-05-15 18:34:07', 0, ''); +INSERT INTO `ums_menu` VALUES (19, '固资台账-分类查询台账', 0, 0, '', '', '0', 'ledger-asset-category:view', '', 1, '2024-05-15 18:34:30', NULL, '2024-05-15 18:34:30', 0, ''); +INSERT INTO `ums_menu` VALUES (21, '固资台账-所管资产台账', 0, 0, '', '', '0', 'ledger-asset-my-own:view', '', 1, '2024-05-15 18:34:53', NULL, '2024-05-15 18:34:53', 0, ''); +INSERT INTO `ums_menu` VALUES (23, '固资管理-资产管理', 0, 0, '', '', '0', 'fixed-asset-manage:view', '', 1, '2024-05-15 18:36:34', NULL, '2024-05-15 18:36:34', 0, ''); +INSERT INTO `ums_menu` VALUES (25, '固资管理-资产入库', 0, 0, '', '', '0', 'fixed-asset-manage-entry:view', '', 1, '2024-05-15 18:37:03', NULL, '2024-05-15 18:37:03', 0, ''); +INSERT INTO `ums_menu` VALUES (27, '固资管理-资产领用', 0, 0, '', '', '0', 'fixed-asset-manage-distribution:view', '', 1, '2024-05-15 18:37:19', NULL, '2024-05-15 18:37:19', 0, ''); +INSERT INTO `ums_menu` VALUES (29, '固资管理-资产退库', 0, 0, '', '', '0', 'fixed-asset-manage-return:view', '', 1, '2024-05-15 18:37:32', NULL, '2024-05-15 18:37:32', 0, ''); +INSERT INTO `ums_menu` VALUES (31, '固资管理-资产借用', 0, 0, '', '', '0', 'fixed-asset-manage-borrow:view', '', 1, '2024-05-15 18:37:43', NULL, '2024-05-15 18:37:43', 0, ''); +INSERT INTO `ums_menu` VALUES (33, '固资管理-资产归还', 0, 0, '', '', '0', 'fixed-asset-manage-revert:view', '', 1, '2024-05-15 18:38:23', NULL, '2024-05-15 18:38:23', 0, ''); +INSERT INTO `ums_menu` VALUES (35, '固资管理-资产调拨', 0, 0, '', '', '0', 'fixed-asset-manage-allot:view', '', 1, '2024-05-15 18:38:38', NULL, '2024-05-15 18:38:38', 0, ''); +INSERT INTO `ums_menu` VALUES (37, '固资管理-资产转换', 0, 0, '', '', '0', 'fixed-asset-manage-transfer:view', '', 1, '2024-05-15 18:38:51', NULL, '2024-05-15 18:38:51', 0, ''); +INSERT INTO `ums_menu` VALUES (39, '固资管理-资产报废', 0, 0, '', '', '0', 'fixed-asset-manage-scrap:view', '', 1, '2024-05-15 18:39:07', NULL, '2024-05-15 18:39:07', 0, ''); +INSERT INTO `ums_menu` VALUES (41, '维护维保-维修类型', 0, 0, '', '', '0', 'fixed-asset-repair-type:view', '', 1, '2024-05-15 18:39:46', NULL, '2024-05-15 18:39:46', 0, ''); +INSERT INTO `ums_menu` VALUES (43, '维护维保-维修登记', 0, 0, '', '', '0', 'fixed-asset-repair-list:view', '', 1, '2024-05-15 18:40:04', NULL, '2024-05-15 18:40:04', 0, ''); +INSERT INTO `ums_menu` VALUES (45, '维护维保-故障登记', 0, 0, '', '', '0', 'fixed-asset-repair-fault:view', '', 1, '2024-05-15 18:40:17', NULL, '2024-05-15 18:40:17', 0, ''); +INSERT INTO `ums_menu` VALUES (47, '盘点管理-盘点计划', 0, 0, '', '', '0', 'stocktaking-plan:view', '', 1, '2024-05-15 18:40:48', NULL, '2024-05-15 18:40:48', 0, ''); +INSERT INTO `ums_menu` VALUES (49, '盘点管理-盘点任务', 0, 0, '', '', '0', 'stocktaking-job:view', '', 1, '2024-05-15 18:41:03', NULL, '2024-05-15 18:41:03', 0, ''); +INSERT INTO `ums_menu` VALUES (51, '预警中心-借用预警', 0, 0, '', '', '0', 'alert-borrow:view', '', 1, '2024-05-15 18:41:49', NULL, '2024-05-15 18:41:49', 0, ''); +INSERT INTO `ums_menu` VALUES (53, '预警中心-维保到期预警', 0, 0, '', '', '0', 'alert-maintenance:view', '', 1, '2024-05-15 18:42:28', NULL, '2024-05-15 18:42:28', 0, ''); +INSERT INTO `ums_menu` VALUES (55, '预警中心-安全库存预警', 0, 0, '', '', '0', 'alert-inventory-safety:view', '', 1, '2024-05-15 18:42:54', NULL, '2024-05-15 18:42:54', 0, ''); +INSERT INTO `ums_menu` VALUES (57, '预警中心-安全库存上限', 0, 0, '', '', '0', 'alert-inventory-up:view', '', 1, '2024-05-15 18:43:10', NULL, '2024-05-15 18:43:10', 0, ''); +INSERT INTO `ums_menu` VALUES (59, '预警中心-安全库存下限', 0, 0, '', '', '0', 'alert-inventory-down:view', '', 1, '2024-05-15 18:43:56', NULL, '2024-05-15 18:43:56', 0, ''); +INSERT INTO `ums_menu` VALUES (61, '基础数据-物品管理', 0, 0, '', '', '0', 'basic-category:view', '', 1, '2024-05-15 18:45:48', 1, '2024-05-15 18:56:30', 0, ''); +INSERT INTO `ums_menu` VALUES (63, '基础数据-生产商', 0, 0, '', '', '0', 'basic-manufacturer:view', '', 1, '2024-05-15 18:46:54', NULL, '2024-05-15 18:46:54', 0, ''); +INSERT INTO `ums_menu` VALUES (65, '基础数据-供应商', 0, 0, '', '', '0', 'basic-supplier:view', '', 1, '2024-05-15 18:47:09', NULL, '2024-05-15 18:47:09', 0, ''); +INSERT INTO `ums_menu` VALUES (67, '基础数据-维保商', 0, 0, '', '', '0', 'basic-maintainer:view', '', 1, '2024-05-15 18:47:26', NULL, '2024-05-15 18:47:26', 0, ''); +INSERT INTO `ums_menu` VALUES (69, '基础数据-存放位置', 0, 0, '', '', '0', 'basic-save-position:view', '', 1, '2024-05-15 18:47:43', NULL, '2024-05-15 18:47:43', 0, ''); +INSERT INTO `ums_menu` VALUES (71, '基础数据-存放仓库', 0, 0, '', '', '0', 'basic-warehouse:view', '', 1, '2024-05-15 18:47:57', NULL, '2024-05-15 18:47:57', 0, ''); +INSERT INTO `ums_menu` VALUES (73, '固资流程-流程首页', 0, 0, '', '', '0', 'asset-flow-home:view', '', 1, '2024-05-15 18:48:41', NULL, '2024-05-15 18:48:41', 0, ''); +INSERT INTO `ums_menu` VALUES (75, '固资流程-我的申请', 0, 0, '', '', '0', 'asset-flow-my-apply:view', '', 1, '2024-05-15 18:48:54', NULL, '2024-05-15 18:48:54', 0, ''); +INSERT INTO `ums_menu` VALUES (77, '固资流程-待我处理', 0, 0, '', '', '0', 'asset-flow-my-todo:view', '', 1, '2024-05-15 18:49:09', NULL, '2024-05-15 18:49:09', 0, ''); +INSERT INTO `ums_menu` VALUES (79, '固资流程-我已处理', 0, 0, '', '', '0', 'asset-flow-my-finished:view', '', 1, '2024-05-15 18:49:22', NULL, '2024-05-15 18:49:22', 0, ''); +INSERT INTO `ums_menu` VALUES (81, '系统管理-组织架构', 0, 0, '', '', '0', 'system-user:view', '', 1, '2024-05-15 18:50:19', NULL, '2024-05-15 18:50:19', 0, ''); +INSERT INTO `ums_menu` VALUES (83, '系统管理-角色管理', 0, 0, '', '', '0', 'system-role:view', '', 1, '2024-05-15 18:50:32', NULL, '2024-05-15 18:50:32', 0, ''); +INSERT INTO `ums_menu` VALUES (85, '系统管理-表单定义', 0, 0, '', '', '0', 'system-flow-form:view', '', 1, '2024-05-15 18:50:49', NULL, '2024-05-15 18:50:49', 0, ''); +INSERT INTO `ums_menu` VALUES (87, '系统管理-授权证书', 0, 0, '', '', '0', 'system-license:view', '', 1, '2024-05-27 22:01:51', NULL, '2024-05-27 22:01:51', 0, ''); + +-- ---------------------------- +-- Table structure for ums_organization +-- ---------------------------- +DROP TABLE IF EXISTS `ums_organization`; +CREATE TABLE `ums_organization` ( + `organization_id` bigint NOT NULL AUTO_INCREMENT COMMENT '组织ID', + `organization_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '组织名称', + `organization_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '组织类型(0:公司/1:部门/2:岗位)', + `order_num` int NULL DEFAULT NULL COMMENT '显示顺序', + `parent_id` bigint NULL DEFAULT NULL COMMENT '父组织id', + `depth` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '深度', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '状态(0:正常/1:停用)', + `is_deleted` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '是否删除有效(0:正常/1:删除有效)', + `create_user` bigint NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_user` bigint NULL DEFAULT NULL COMMENT '修改人', + `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间', + PRIMARY KEY (`organization_id`) USING BTREE, + UNIQUE INDEX `organization_id`(`organization_id` ASC) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '组织信息表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of ums_organization +-- ---------------------------- +INSERT INTO `ums_organization` VALUES (1, '集团总部公司', '0', 1, 0, '1', '0', '0', NULL, NULL, 1, '2024-05-18 10:12:43'); + +-- ---------------------------- +-- Table structure for ums_post +-- ---------------------------- +DROP TABLE IF EXISTS `ums_post`; +CREATE TABLE `ums_post` ( + `post_id` bigint NOT NULL AUTO_INCREMENT COMMENT '岗位ID', + `organization_id` bigint NOT NULL COMMENT '组织ID', + `post_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '岗位名称', + `sort` int NOT NULL COMMENT '显示顺序', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0' COMMENT '状态(0:正常/1:停用)', + `is_deleted` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0' COMMENT '是否删除有效(0:正常/1:删除有效)', + `create_user` bigint NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_user` bigint NULL DEFAULT NULL COMMENT '修改人', + `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`post_id`) USING BTREE, + UNIQUE INDEX `post_id`(`post_id` ASC) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '岗位信息表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of ums_post +-- ---------------------------- + +-- ---------------------------- +-- Table structure for ums_role +-- ---------------------------- +DROP TABLE IF EXISTS `ums_role`; +CREATE TABLE `ums_role` ( + `role_id` bigint NOT NULL AUTO_INCREMENT COMMENT '角色ID', + `role_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '角色名称', + `role_key` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '角色权限字符串', + `role_sort` int NULL DEFAULT NULL COMMENT '显示顺序', + `data_scope` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限)', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0' COMMENT '角色状态(0:正常/1:停用)', + `is_deleted` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '是否删除(0:正常/1:删除)', + `create_user` bigint NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_user` bigint NULL DEFAULT NULL COMMENT '修改人', + `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`role_id`) USING BTREE, + UNIQUE INDEX `role_id`(`role_id` ASC) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '角色表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of ums_role +-- ---------------------------- +INSERT INTO `ums_role` VALUES (1, '超级管理员', 'admin', 1, '1', '0', '0', 0, '2024-03-22 15:11:44', 1, '2024-05-27 22:05:58', '超级管理员'); +INSERT INTO `ums_role` VALUES (2, '普通管理员', 'root', 2, '2', '0', '0', 0, '2024-03-22 15:18:10', 1, '2024-08-19 15:56:21', '普通管理员'); +INSERT INTO `ums_role` VALUES (3, '普通用户', 'user', 3, '3', '0', '0', 0, '2024-04-12 15:18:10', 1, '2024-05-27 10:42:40', '普通用户'); + +-- ---------------------------- +-- Table structure for ums_role_menu +-- ---------------------------- +DROP TABLE IF EXISTS `ums_role_menu`; +CREATE TABLE `ums_role_menu` ( + `role_id` bigint NOT NULL COMMENT '角色ID', + `menu_id` bigint NOT NULL COMMENT '菜单ID', + PRIMARY KEY (`role_id`, `menu_id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '角色权限关联表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of ums_role_menu +-- ---------------------------- +INSERT INTO `ums_role_menu` VALUES (1, 7); +INSERT INTO `ums_role_menu` VALUES (1, 9); +INSERT INTO `ums_role_menu` VALUES (1, 11); +INSERT INTO `ums_role_menu` VALUES (1, 13); +INSERT INTO `ums_role_menu` VALUES (1, 15); +INSERT INTO `ums_role_menu` VALUES (1, 17); +INSERT INTO `ums_role_menu` VALUES (1, 19); +INSERT INTO `ums_role_menu` VALUES (1, 21); +INSERT INTO `ums_role_menu` VALUES (1, 23); +INSERT INTO `ums_role_menu` VALUES (1, 25); +INSERT INTO `ums_role_menu` VALUES (1, 27); +INSERT INTO `ums_role_menu` VALUES (1, 29); +INSERT INTO `ums_role_menu` VALUES (1, 31); +INSERT INTO `ums_role_menu` VALUES (1, 33); +INSERT INTO `ums_role_menu` VALUES (1, 35); +INSERT INTO `ums_role_menu` VALUES (1, 37); +INSERT INTO `ums_role_menu` VALUES (1, 39); +INSERT INTO `ums_role_menu` VALUES (1, 41); +INSERT INTO `ums_role_menu` VALUES (1, 43); +INSERT INTO `ums_role_menu` VALUES (1, 45); +INSERT INTO `ums_role_menu` VALUES (1, 47); +INSERT INTO `ums_role_menu` VALUES (1, 49); +INSERT INTO `ums_role_menu` VALUES (1, 51); +INSERT INTO `ums_role_menu` VALUES (1, 53); +INSERT INTO `ums_role_menu` VALUES (1, 55); +INSERT INTO `ums_role_menu` VALUES (1, 57); +INSERT INTO `ums_role_menu` VALUES (1, 59); +INSERT INTO `ums_role_menu` VALUES (1, 61); +INSERT INTO `ums_role_menu` VALUES (1, 63); +INSERT INTO `ums_role_menu` VALUES (1, 65); +INSERT INTO `ums_role_menu` VALUES (1, 67); +INSERT INTO `ums_role_menu` VALUES (1, 69); +INSERT INTO `ums_role_menu` VALUES (1, 71); +INSERT INTO `ums_role_menu` VALUES (1, 73); +INSERT INTO `ums_role_menu` VALUES (1, 75); +INSERT INTO `ums_role_menu` VALUES (1, 77); +INSERT INTO `ums_role_menu` VALUES (1, 79); +INSERT INTO `ums_role_menu` VALUES (1, 81); +INSERT INTO `ums_role_menu` VALUES (1, 83); +INSERT INTO `ums_role_menu` VALUES (1, 85); +INSERT INTO `ums_role_menu` VALUES (1, 87); +INSERT INTO `ums_role_menu` VALUES (2, 7); +INSERT INTO `ums_role_menu` VALUES (2, 9); +INSERT INTO `ums_role_menu` VALUES (2, 11); +INSERT INTO `ums_role_menu` VALUES (2, 13); +INSERT INTO `ums_role_menu` VALUES (2, 15); +INSERT INTO `ums_role_menu` VALUES (2, 17); +INSERT INTO `ums_role_menu` VALUES (2, 19); +INSERT INTO `ums_role_menu` VALUES (2, 21); +INSERT INTO `ums_role_menu` VALUES (2, 23); +INSERT INTO `ums_role_menu` VALUES (2, 25); +INSERT INTO `ums_role_menu` VALUES (2, 27); +INSERT INTO `ums_role_menu` VALUES (2, 29); +INSERT INTO `ums_role_menu` VALUES (2, 31); +INSERT INTO `ums_role_menu` VALUES (2, 33); +INSERT INTO `ums_role_menu` VALUES (2, 35); +INSERT INTO `ums_role_menu` VALUES (2, 37); +INSERT INTO `ums_role_menu` VALUES (2, 39); +INSERT INTO `ums_role_menu` VALUES (2, 41); +INSERT INTO `ums_role_menu` VALUES (2, 43); +INSERT INTO `ums_role_menu` VALUES (2, 45); +INSERT INTO `ums_role_menu` VALUES (2, 47); +INSERT INTO `ums_role_menu` VALUES (2, 49); +INSERT INTO `ums_role_menu` VALUES (2, 51); +INSERT INTO `ums_role_menu` VALUES (2, 53); +INSERT INTO `ums_role_menu` VALUES (2, 55); +INSERT INTO `ums_role_menu` VALUES (2, 57); +INSERT INTO `ums_role_menu` VALUES (2, 59); +INSERT INTO `ums_role_menu` VALUES (2, 61); +INSERT INTO `ums_role_menu` VALUES (2, 63); +INSERT INTO `ums_role_menu` VALUES (2, 65); +INSERT INTO `ums_role_menu` VALUES (2, 67); +INSERT INTO `ums_role_menu` VALUES (2, 69); +INSERT INTO `ums_role_menu` VALUES (2, 71); +INSERT INTO `ums_role_menu` VALUES (2, 73); +INSERT INTO `ums_role_menu` VALUES (2, 75); +INSERT INTO `ums_role_menu` VALUES (2, 77); +INSERT INTO `ums_role_menu` VALUES (2, 79); +INSERT INTO `ums_role_menu` VALUES (3, 7); +INSERT INTO `ums_role_menu` VALUES (3, 73); +INSERT INTO `ums_role_menu` VALUES (3, 75); + +-- ---------------------------- +-- Table structure for ums_user +-- ---------------------------- +DROP TABLE IF EXISTS `ums_user`; +CREATE TABLE `ums_user` ( + `user_id` bigint NOT NULL AUTO_INCREMENT COMMENT '用户ID', + `login_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '登录账号', + `user_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户昵称', + `email` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户邮箱', + `phone` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '联系电话', + `password` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '密码', + `salt` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '盐加密', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0' COMMENT '状态(0:正常/1:停用)', + `is_deleted` tinyint NOT NULL DEFAULT 0 COMMENT '是否删除(0:正常/1:删除)', + `login_ip` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '最后登录IP', + `login_date` datetime NULL DEFAULT NULL COMMENT '最后登录时间', + `pwd_update_date` datetime NULL DEFAULT NULL COMMENT '密码最后更新时间', + `create_user` bigint NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_user` bigint NULL DEFAULT NULL COMMENT '修改人', + `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', + `sex` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户性别(0-男 1-女 2-未知)', + `avatar` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '头像路径', + PRIMARY KEY (`user_id`) USING BTREE, + UNIQUE INDEX `user_id`(`user_id` ASC) USING BTREE, + UNIQUE INDEX `phone`(`phone` ASC) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of ums_user +-- ---------------------------- +INSERT INTO `ums_user` VALUES (1, 'admin', '超级管理员', 'xxx@xx.com', '12345678900', '1a118e6eb5dedb43a63652c6e64a89f6', '0ktbQOii+L5jOmecU3q3Tg==', '0', 0, NULL, NULL, NULL, 1, NULL, 1, '2024-05-06 21:39:17', '超级管理员账号', '0', NULL); +INSERT INTO `ums_user` VALUES (2, 'root', '普通管理员', 'xxx@qq.com', '12345678901', '1a118e6eb5dedb43a63652c6e64a89f6', '0ktbQOii+L5jOmecU3q3Tg==', '0', 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '普通管理员账号', '0', NULL); +INSERT INTO `ums_user` VALUES (3, 'user1', '普通用户1', 'xxx1@qq.com', '12345678902', '1a118e6eb5dedb43a63652c6e64a89f6', '0ktbQOii+L5jOmecU3q3Tg==', '0', 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '普通用户账号1', '0', NULL); + +-- ---------------------------- +-- Table structure for ums_user_organization +-- ---------------------------- +DROP TABLE IF EXISTS `ums_user_organization`; +CREATE TABLE `ums_user_organization` ( + `organization_id` bigint NOT NULL COMMENT '组织ID', + `user_id` bigint NOT NULL COMMENT '员工ID', + PRIMARY KEY (`organization_id`, `user_id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '组织信息关联表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of ums_user_organization +-- ---------------------------- +INSERT INTO `ums_user_organization` VALUES (1, 1); +INSERT INTO `ums_user_organization` VALUES (1, 2); +INSERT INTO `ums_user_organization` VALUES (1, 3); + +-- ---------------------------- +-- Table structure for ums_user_role +-- ---------------------------- +DROP TABLE IF EXISTS `ums_user_role`; +CREATE TABLE `ums_user_role` ( + `user_id` bigint NOT NULL COMMENT '用户ID', + `role_id` bigint NOT NULL COMMENT '角色ID', + PRIMARY KEY (`user_id`, `role_id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户角色关联表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of ums_user_role +-- ---------------------------- +INSERT INTO `ums_user_role` VALUES (1, 1); +INSERT INTO `ums_user_role` VALUES (2, 2); +INSERT INTO `ums_user_role` VALUES (3, 3); + +-- ---------------------------- +-- Table structure for ums_user_session +-- ---------------------------- +DROP TABLE IF EXISTS `ums_user_session`; +CREATE TABLE `ums_user_session` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', + `sessionId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '用户会话id', + `login_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '登录账号', + `dept_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '部门名称', + `ipaddr` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '登录IP地址', + `login_location` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '登录地点', + `browser` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '浏览器类型', + `os` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '操作系统', + `status` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '在线状态on_line在线off_line离线', + `start_timestamp` datetime NULL DEFAULT NULL COMMENT 'session创建时间', + `last_access_time` datetime NULL DEFAULT NULL COMMENT 'session最后访问时间', + `expire_time` int NULL DEFAULT 0 COMMENT '超时时间,单位为分钟', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '在线用户记录' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of ums_user_session +-- ---------------------------- + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/sql/quartz.sql b/sql/quartz.sql new file mode 100644 index 0000000..a06c6ad --- /dev/null +++ b/sql/quartz.sql @@ -0,0 +1,216 @@ +DROP TABLE IF EXISTS QRTZ_FIRED_TRIGGERS; +DROP TABLE IF EXISTS QRTZ_PAUSED_TRIGGER_GRPS; +DROP TABLE IF EXISTS QRTZ_SCHEDULER_STATE; +DROP TABLE IF EXISTS QRTZ_LOCKS; +DROP TABLE IF EXISTS QRTZ_SIMPLE_TRIGGERS; +DROP TABLE IF EXISTS QRTZ_SIMPROP_TRIGGERS; +DROP TABLE IF EXISTS QRTZ_CRON_TRIGGERS; +DROP TABLE IF EXISTS QRTZ_BLOB_TRIGGERS; +DROP TABLE IF EXISTS QRTZ_TRIGGERS; +DROP TABLE IF EXISTS QRTZ_JOB_DETAILS; +DROP TABLE IF EXISTS QRTZ_CALENDARS; + +-- ---------------------------- +-- 16、定时任务调度表 +-- ---------------------------- +drop table if exists sys_job; +create table sys_job ( + job_id bigint(20) not null auto_increment comment '任务ID', + job_name varchar(64) default '' comment '任务名称', + job_group varchar(64) default 'DEFAULT' comment '任务组名', + invoke_target varchar(500) not null comment '调用目标字符串', + cron_expression varchar(255) default '' comment 'cron执行表达式', + misfire_policy varchar(20) default '3' comment '计划执行错误策略(1立即执行 2执行一次 3放弃执行)', + concurrent char(1) default '1' comment '是否并发执行(0允许 1禁止)', + status char(1) default '0' comment '状态(0正常 1暂停)', + create_user bigint(20) comment '创建者', + create_time datetime comment '创建时间', + update_user bigint(20) comment '更新者', + update_time datetime comment '更新时间', + remark varchar(500) default '' comment '备注信息', + primary key (job_id, job_name, job_group) +) engine=innodb auto_increment=100 comment = '定时任务调度表'; + +insert into sys_job values(1, '系统默认(无参)', 'DEFAULT', 'ryTask.ryNoParams', '0/10 * * * * ?', '3', '1', '1', 1, sysdate(), null, null, ''); +insert into sys_job values(2, '系统默认(有参)', 'DEFAULT', 'ryTask.ryParams(\'ry\')', '0/15 * * * * ?', '3', '1', '1', 1, sysdate(), null, null, ''); +insert into sys_job values(3, '系统默认(多参)', 'DEFAULT', 'ryTask.ryMultipleParams(\'ry\', true, 2000L, 316.50D, 100)', '0/20 * * * * ?', '3', '1', '1', 1, sysdate(), null, null, ''); + + +-- ---------------------------- +-- 17、定时任务调度日志表 +-- ---------------------------- +drop table if exists sys_job_log; +create table sys_job_log ( + job_log_id bigint(20) not null auto_increment comment '任务日志ID', + job_name varchar(64) not null comment '任务名称', + job_group varchar(64) not null comment '任务组名', + invoke_target varchar(500) not null comment '调用目标字符串', + job_message varchar(500) comment '日志信息', + status char(1) default '0' comment '执行状态(0正常 1失败)', + exception_info varchar(2000) default '' comment '异常信息', + create_time datetime comment '创建时间', + primary key (job_log_id) +) engine=innodb comment = '定时任务调度日志表'; + +-- ---------------------------- +-- 1、存储每一个已配置的 jobDetail 的详细信息 +-- ---------------------------- +create table QRTZ_JOB_DETAILS ( + sched_name varchar(120) not null comment '调度名称', + job_name varchar(200) not null comment '任务名称', + job_group varchar(200) not null comment '任务组名', + description varchar(250) null comment '相关介绍', + job_class_name varchar(250) not null comment '执行任务类名称', + is_durable varchar(1) not null comment '是否持久化', + is_nonconcurrent varchar(1) not null comment '是否并发', + is_update_data varchar(1) not null comment '是否更新数据', + requests_recovery varchar(1) not null comment '是否接受恢复执行', + job_data blob null comment '存放持久化job对象', + primary key (sched_name, job_name, job_group) +) engine=innodb comment = '任务详细信息表'; + +-- ---------------------------- +-- 2、 存储已配置的 Trigger 的信息 +-- ---------------------------- +create table QRTZ_TRIGGERS ( + sched_name varchar(120) not null comment '调度名称', + trigger_name varchar(200) not null comment '触发器的名字', + trigger_group varchar(200) not null comment '触发器所属组的名字', + job_name varchar(200) not null comment 'qrtz_job_details表job_name的外键', + job_group varchar(200) not null comment 'qrtz_job_details表job_group的外键', + description varchar(250) null comment '相关介绍', + next_fire_time bigint(13) null comment '上一次触发时间(毫秒)', + prev_fire_time bigint(13) null comment '下一次触发时间(默认为-1表示不触发)', + priority integer null comment '优先级', + trigger_state varchar(16) not null comment '触发器状态', + trigger_type varchar(8) not null comment '触发器的类型', + start_time bigint(13) not null comment '开始时间', + end_time bigint(13) null comment '结束时间', + calendar_name varchar(200) null comment '日程表名称', + misfire_instr smallint(2) null comment '补偿执行的策略', + job_data blob null comment '存放持久化job对象', + primary key (sched_name, trigger_name, trigger_group), + foreign key (sched_name, job_name, job_group) references QRTZ_JOB_DETAILS(sched_name, job_name, job_group) +) engine=innodb comment = '触发器详细信息表'; + +-- ---------------------------- +-- 3、 存储简单的 Trigger,包括重复次数,间隔,以及已触发的次数 +-- ---------------------------- +create table QRTZ_SIMPLE_TRIGGERS ( + sched_name varchar(120) not null comment '调度名称', + trigger_name varchar(200) not null comment 'qrtz_triggers表trigger_name的外键', + trigger_group varchar(200) not null comment 'qrtz_triggers表trigger_group的外键', + repeat_count bigint(7) not null comment '重复的次数统计', + repeat_interval bigint(12) not null comment '重复的间隔时间', + times_triggered bigint(10) not null comment '已经触发的次数', + primary key (sched_name, trigger_name, trigger_group), + foreign key (sched_name, trigger_name, trigger_group) references QRTZ_TRIGGERS(sched_name, trigger_name, trigger_group) +) engine=innodb comment = '简单触发器的信息表'; + +-- ---------------------------- +-- 4、 存储 Cron Trigger,包括 Cron 表达式和时区信息 +-- ---------------------------- +create table QRTZ_CRON_TRIGGERS ( + sched_name varchar(120) not null comment '调度名称', + trigger_name varchar(200) not null comment 'qrtz_triggers表trigger_name的外键', + trigger_group varchar(200) not null comment 'qrtz_triggers表trigger_group的外键', + cron_expression varchar(200) not null comment 'cron表达式', + time_zone_id varchar(80) comment '时区', + primary key (sched_name, trigger_name, trigger_group), + foreign key (sched_name, trigger_name, trigger_group) references QRTZ_TRIGGERS(sched_name, trigger_name, trigger_group) +) engine=innodb comment = 'Cron类型的触发器表'; + +-- ---------------------------- +-- 5、 Trigger 作为 Blob 类型存储(用于 Quartz 用户用 JDBC 创建他们自己定制的 Trigger 类型,JobStore 并不知道如何存储实例的时候) +-- ---------------------------- +create table QRTZ_BLOB_TRIGGERS ( + sched_name varchar(120) not null comment '调度名称', + trigger_name varchar(200) not null comment 'qrtz_triggers表trigger_name的外键', + trigger_group varchar(200) not null comment 'qrtz_triggers表trigger_group的外键', + blob_data blob null comment '存放持久化Trigger对象', + primary key (sched_name, trigger_name, trigger_group), + foreign key (sched_name, trigger_name, trigger_group) references QRTZ_TRIGGERS(sched_name, trigger_name, trigger_group) +) engine=innodb comment = 'Blob类型的触发器表'; + +-- ---------------------------- +-- 6、 以 Blob 类型存储存放日历信息, quartz可配置一个日历来指定一个时间范围 +-- ---------------------------- +create table QRTZ_CALENDARS ( + sched_name varchar(120) not null comment '调度名称', + calendar_name varchar(200) not null comment '日历名称', + calendar blob not null comment '存放持久化calendar对象', + primary key (sched_name, calendar_name) +) engine=innodb comment = '日历信息表'; + +-- ---------------------------- +-- 7、 存储已暂停的 Trigger 组的信息 +-- ---------------------------- +create table QRTZ_PAUSED_TRIGGER_GRPS ( + sched_name varchar(120) not null comment '调度名称', + trigger_group varchar(200) not null comment 'qrtz_triggers表trigger_group的外键', + primary key (sched_name, trigger_group) +) engine=innodb comment = '暂停的触发器表'; + +-- ---------------------------- +-- 8、 存储与已触发的 Trigger 相关的状态信息,以及相联 Job 的执行信息 +-- ---------------------------- +create table QRTZ_FIRED_TRIGGERS ( + sched_name varchar(120) not null comment '调度名称', + entry_id varchar(95) not null comment '调度器实例id', + trigger_name varchar(200) not null comment 'qrtz_triggers表trigger_name的外键', + trigger_group varchar(200) not null comment 'qrtz_triggers表trigger_group的外键', + instance_name varchar(200) not null comment '调度器实例名', + fired_time bigint(13) not null comment '触发的时间', + sched_time bigint(13) not null comment '定时器制定的时间', + priority integer not null comment '优先级', + state varchar(16) not null comment '状态', + job_name varchar(200) null comment '任务名称', + job_group varchar(200) null comment '任务组名', + is_nonconcurrent varchar(1) null comment '是否并发', + requests_recovery varchar(1) null comment '是否接受恢复执行', + primary key (sched_name, entry_id) +) engine=innodb comment = '已触发的触发器表'; + +-- ---------------------------- +-- 9、 存储少量的有关 Scheduler 的状态信息,假如是用于集群中,可以看到其他的 Scheduler 实例 +-- ---------------------------- +create table QRTZ_SCHEDULER_STATE ( + sched_name varchar(120) not null comment '调度名称', + instance_name varchar(200) not null comment '实例名称', + last_checkin_time bigint(13) not null comment '上次检查时间', + checkin_interval bigint(13) not null comment '检查间隔时间', + primary key (sched_name, instance_name) +) engine=innodb comment = '调度器状态表'; + +-- ---------------------------- +-- 10、 存储程序的悲观锁的信息(假如使用了悲观锁) +-- ---------------------------- +create table QRTZ_LOCKS ( + sched_name varchar(120) not null comment '调度名称', + lock_name varchar(40) not null comment '悲观锁名称', + primary key (sched_name, lock_name) +) engine=innodb comment = '存储的悲观锁信息表'; + +-- ---------------------------- +-- 11、 Quartz集群实现同步机制的行锁表 +-- ---------------------------- +create table QRTZ_SIMPROP_TRIGGERS ( + sched_name varchar(120) not null comment '调度名称', + trigger_name varchar(200) not null comment 'qrtz_triggers表trigger_name的外键', + trigger_group varchar(200) not null comment 'qrtz_triggers表trigger_group的外键', + str_prop_1 varchar(512) null comment 'String类型的trigger的第一个参数', + str_prop_2 varchar(512) null comment 'String类型的trigger的第二个参数', + str_prop_3 varchar(512) null comment 'String类型的trigger的第三个参数', + int_prop_1 int null comment 'int类型的trigger的第一个参数', + int_prop_2 int null comment 'int类型的trigger的第二个参数', + long_prop_1 bigint null comment 'long类型的trigger的第一个参数', + long_prop_2 bigint null comment 'long类型的trigger的第二个参数', + dec_prop_1 numeric(13,4) null comment 'decimal类型的trigger的第一个参数', + dec_prop_2 numeric(13,4) null comment 'decimal类型的trigger的第二个参数', + bool_prop_1 varchar(1) null comment 'Boolean类型的trigger的第一个参数', + bool_prop_2 varchar(1) null comment 'Boolean类型的trigger的第二个参数', + primary key (sched_name, trigger_name, trigger_group), + foreign key (sched_name, trigger_name, trigger_group) references QRTZ_TRIGGERS(sched_name, trigger_name, trigger_group) +) engine=innodb comment = '同步机制的行锁表'; + +commit; \ No newline at end of file diff --git a/system/pom.xml b/system/pom.xml new file mode 100644 index 0000000..3faaa30 --- /dev/null +++ b/system/pom.xml @@ -0,0 +1,33 @@ + + + + yyy + com.yyy + 1.0-SNAPSHOT + + 4.0.0 + + system + + + + com.yyy + common + 1.0-SNAPSHOT + + + + com.yyy + kernel + 1.0-SNAPSHOT + + + + com.yyy + quartz + 1.0-SNAPSHOT + + + \ No newline at end of file diff --git a/system/src/main/java/com/yyy/system/controller/EamAssetController.java b/system/src/main/java/com/yyy/system/controller/EamAssetController.java new file mode 100644 index 0000000..dd7afc7 --- /dev/null +++ b/system/src/main/java/com/yyy/system/controller/EamAssetController.java @@ -0,0 +1,472 @@ +package com.yyy.system.controller; + + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.yyy.common.core.controller.BaseController; +import com.yyy.common.core.domain.Result; +import com.yyy.common.core.page.TableDataInfo; +import com.yyy.common.enums.AssetStatusEnum; +import com.yyy.common.enums.BusinessStatusEnum; +import com.yyy.common.enums.DetectTypeEnum; +import com.yyy.common.enums.EncodingEum; +import com.yyy.common.form.FieldData; +import com.yyy.common.utils.bean.BeanUtils; +import com.yyy.common.utils.chart.ChartValue; +import com.yyy.common.utils.common.DateUtils; +import com.yyy.common.utils.common.StringUtils; +import com.yyy.common.utils.poi.ExcelUtil; +import com.yyy.kernel.device.AbstractDevice; +import com.yyy.kernel.device.IDevice; +import com.yyy.kernel.enums.DeviceStatus; +import com.yyy.system.entity.dto.*; +import com.yyy.system.entity.excel.EamAssetExcel; +import com.yyy.system.entity.excel.EamAssetExportExcel; +import com.yyy.system.entity.pojo.*; +import com.yyy.system.entity.vo.*; +import com.yyy.system.service.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.text.SimpleDateFormat; +import java.time.LocalDateTime; +import java.util.*; +import java.util.concurrent.atomic.AtomicReference; +import java.util.stream.Collectors; + +/** + * 资产信息表(eam_asset)表控制层 + * + * @author Fangy + * @since 2024-04-09 13:47:47 + */ +@RestController +@Api(tags = "资产信息表") +@RequestMapping("api/eamAsset") +public class EamAssetController extends BaseController { + + private static final Logger logger = LoggerFactory.getLogger(EamAssetController.class); + /** + * 服务对象 + */ + @Resource + private EamAssetService eamAssetService; + + @Resource + private EamBasicCategoryService eamBasicCategoryService; + + @Resource + private EamBusinessRegistrationService eamBusinessRegistrationService; + + @Resource + private EamAssetLogService eamAssetLogService; + + @Resource + private EamBusinessBorrowService borrowService; + + /** + * 查询分页数据 + */ + @PostMapping("/list") + @ApiOperation(value = "查询分页数据") + public TableDataInfo list(@RequestBody EamAssetQueryDto dto) { + startPage(); + return getDataTable(EamAssetVo.ToVo(eamAssetService.query(dto))); + } + + /** + * 查询详情数据 + */ + @PostMapping("/query") + @ApiOperation(value = "查询详情数据", notes = "v2.0 新增扩展字段相关内容") + public Result query(@RequestParam Long id) { + return success(EamAssetVo.ToVo(eamAssetService.getById(id))); + } + + /** + * 查询详情数据 + */ + @PostMapping("/queryByIds") + @ApiOperation(value = "查询多个") + public Result queryByIds(@RequestBody List idList) { + return success(EamAssetVo.ToVo(eamAssetService.listByIds(idList))); + } + + /** + * 新增数据 + */ + @PostMapping("/add") + @ApiOperation(value = "新增数据", notes = "v2.0 取消所属公司不能为空、新增扩展字段相关内容") + public Result add(@Validated @RequestBody EamAssetDto eamAssetDto) { + EamAsset eamAsset = new EamAsset(); + BeanUtils.copyProperties(eamAssetDto, eamAsset); + Long assetId = eamAssetService.selectLatestPrimaryKey() + 1; + eamAsset.setAssetId(assetId); + eamAsset.setCreateUser(getUserId()); + eamAsset.setAssetCode(EncodingEum.ASSET.getBusinessId()); + eamAsset.setExtInfo(JSONObject.toJSONString(eamAssetDto.get_extInfo())); + eamBusinessRegistrationService.save(EamBusinessRegistration.builder().businessId(EncodingEum.REGISTRATION.getBusinessId()).name(DetectTypeEnum.ALLOCATE.getInfo() + "_" + eamAssetDto.getName()).applicant(null).status(BusinessStatusEnum.DRAFT.getCode()).assetId(assetId).createUser(getUserId()).build()); + return eamAssetService.save(eamAsset) ? success() : error(); + } + + /** + * 修改数据 + */ + @PostMapping("/update") + @ApiOperation(value = "修改数据", notes = "v2.0 取消所属公司不能为空、新增扩展字段相关内容") + public Result update(@Validated @RequestBody EamAssetDto eamAssetDto) { + EamAsset eamAsset = new EamAsset(); + BeanUtils.copyProperties(eamAssetDto, eamAsset); + eamAsset.setUpdateUser(getUserId()); + eamAsset.setExtInfo(JSONObject.toJSONString(eamAssetDto.get_extInfo())); + return eamAssetService.updateById(eamAsset) ? success() : error(); + } + + /** + * 删除数据 + */ + @PostMapping("/delete") + @ApiOperation(value = "删除数据") + public Result delete(@RequestBody List idList) { + return eamAssetService.delete(idList) ? success() : error(); + } + + /** + * 快速复制数据 + */ + @PostMapping("/copy") + @ApiOperation(value = "快速复制数据") + public Result copy(@RequestBody List idList) { + List list = eamAssetService.listByIds(idList); + AtomicReference assetId = new AtomicReference<>(eamAssetService.selectLatestPrimaryKey() + 1); + list.forEach(e -> { + e.setAssetId(assetId.get()); + e.setCreateUser(getUserId()); + eamBusinessRegistrationService.save(EamBusinessRegistration.builder().businessId(EncodingEum.REGISTRATION.getBusinessId()).name(DetectTypeEnum.ALLOCATE.getInfo() + "_" + e.getName()).applicant(null).status(BusinessStatusEnum.DRAFT.getCode()).assetId(assetId.get()).createUser(getUserId()).build()); + assetId.getAndSet(assetId.get() + 1); + }); + eamAssetService.saveBatch(list); + return success(); + } + + /** + * 快速复制数据+数量 + */ + @PostMapping("/copyByNum") + @ApiOperation(value = "快速复制数据+数量") + public Result copyByNum(@RequestParam Long id, @RequestParam Integer num) { + if (num > 200) { + return error("复制失败!复制数量大于200,请重新操作"); + } + EamAsset asset = eamAssetService.getById(id); + Long assetId = eamAssetService.selectLatestPrimaryKey() + 1; + List list = new ArrayList<>(); + for (int i = 0; i < num; i++) { + EamAsset newAsset = new EamAsset(); + BeanUtils.copyProperties(asset, newAsset); + newAsset.setAssetCode(EncodingEum.ASSET.getBusinessId()); + newAsset.setStatus(AssetStatusEnum.UN_USEd.getCode()); + newAsset.setAssetId(assetId + i); + newAsset.setCreateUser(getUserId()); + list.add(newAsset); + eamBusinessRegistrationService.save(EamBusinessRegistration.builder().businessId(EncodingEum.REGISTRATION.getBusinessId()).name(DetectTypeEnum.REGISTRATION.getInfo() + "_" + asset.getName()).applicant(null).status(BusinessStatusEnum.DRAFT.getCode()).assetId(assetId + i).createUser(getUserId()).build()); + } + eamAssetService.saveBatch(list); + return success(); + } + + @PostMapping("/export") + @ApiOperation(value = "导出资产数据excel") + public void export(@RequestBody List idList, HttpServletResponse response) { + List list = eamAssetService.listByIds(idList); + ExcelUtil util = new ExcelUtil<>(EamAssetExportExcel.class); + util.exportExcel(response, EamAssetExportExcel.ToExcel(list), "资产数据"); + } + + @PostMapping("/importData") + @ApiOperation(value = "导入资产数据excel") + public Result importData(MultipartFile file) throws Exception { + ExcelUtil util = new ExcelUtil<>(EamAssetExcel.class); + List list = eamAssetService.excelToPojo(util.importExcel(file.getInputStream())); + eamAssetService.saveBatch(list); + return success(); + } + + @PostMapping("/importTemplate") + @ApiOperation(value = "导入资产数据excel模板", notes = "v2.0 新增导入扩展字段(通过资产类别)") + public void importTemplate(@RequestParam(required = false) Long categoryId, HttpServletResponse response) { + ExcelUtil util = new ExcelUtil<>(EamAssetExcel.class); + try { + if (categoryId != null) { + // 扩展资产表单 + EamAssetExcel assetExcel = new EamAssetExcel(); + EamBasicCategory category = eamBasicCategoryService.getById(categoryId); + if (category != null && StringUtils.isNotEmpty(category.getAssetExtTemp())) { + List extInfoList = JSONObject.parseArray(category.getAssetExtTemp(), FieldData.class); + assetExcel.set_extInfo(extInfoList); + } + List result = Collections.singletonList(assetExcel); + util.exportExcel(response, result, "资产数据"); + } else { + // 标准资产表单 + util.importTemplateExcel(response, "资产数据"); + } + } catch (Exception e) { + logger.error("导出资产数据模板时发生错误,返回错误响应。", e); + response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); + } + } + + @PostMapping("/warning/safety") + @ApiOperation(value = "库存安全预警接口", notes = "下限+上限+安库") + public TableDataInfo safety() { + startPage(); + List list = eamAssetService.queryWarehouseInventory(new EamWarehouseInventoryDto()); + return getDataTable(EamWarehouseInventoryVo.ToVo(list).stream().filter(e -> { + if (e.getSafetyLimit() == null || e.getUpperLimit() == null || e.getLowerLimit() == null) { + return false; + } + return !(e.getSafetyLimit() <= e.getCount() && e.getCount() <= e.getUpperLimit()); + }).collect(Collectors.toList())); + } + + @PostMapping("/warning/maintenance") + @ApiOperation(value = "维保到期预警接口") + public TableDataInfo maintenance() { + startPage(); + List list = eamAssetService.maintenance(DateUtils.getTime()); + return getDataTable(EamAssetVo.ToVo(list)); + } + + @PostMapping("/warning/borrow") + @ApiOperation(value = "借用预警接口") + public TableDataInfo borrow() { + startPage(); + List result = borrowService.list(new QueryWrapper<>()).stream() + .filter(borrow -> borrow.getIsDeleted().equals(0) && JSON.parseArray(borrow.getAssetIdList()).size() != 0 && + borrow.getReturnTime().before(DateUtils.toDate(LocalDateTime.now().plusDays(3)))) + .flatMap(borrow -> eamAssetService.listByIds(JSON.parseArray(borrow.getAssetIdList(), EamWarehouseAssetDto.class).stream().map(EamWarehouseAssetDto::getAssetId).distinct().collect(Collectors.toList())).stream() + .filter(asset -> asset.getStatus().equals(AssetStatusEnum.BORROW.getCode())) + .map(asset -> EamWarningBorrowVo.ToVo(asset, borrow.getBusinessId(), borrow.getReturnTime()))) + .collect(Collectors.toList()); + return getDataTable(result); + } + + @GetMapping("/operationalStatistics") + @ApiOperation(value = "运行统计") + public Result operationalStatistics(@ApiParam(value = "资产id") @RequestParam Long id, @ApiParam(value = "类型 0-近一周 1-近一月 2-近一年 3-全部") @RequestParam Integer type) { + Date startTime = null; + Date endTime = new Date(); // 当前时间 + switch (type) { + case 0: + startTime = DateUtils.addWeeks(endTime, -1); + break; + case 1: + startTime = DateUtils.addMonths(endTime, -1); + break; + case 2: + startTime = DateUtils.addYears(endTime, -1); + break; + case 3: + // 全部,不设置startTime + break; + default: + return error("类型参数错误"); + } + EamAsset eamAsset = eamAssetService.getById(id); + DeviceStatus deviceStatus = DeviceStatus.OFF; + if (eamAsset.getSerialNumber() != null) { + IDevice device = AbstractDevice.getByIdentity(eamAsset.getSerialNumber()); + if (device != null) { + deviceStatus = device.status(); + } + } + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("asset_id", id); + if (startTime != null) { + queryWrapper.between("create_time", startTime, endTime); + } + + List logs = eamAssetLogService.list(queryWrapper); + Map logCounts = logs.stream() + .collect(Collectors.groupingBy( + log -> DetectTypeEnum.fromInfo(log.getOperationType()), + Collectors.counting() + )); + + // 过滤 ON 和 OFF 类型的日志 + List filteredLogs = logs.stream() + .filter(log -> DetectTypeEnum.ON.getInfo().equals(log.getOperationType()) || + DetectTypeEnum.OFF.getInfo().equals(log.getOperationType())) + .sorted(Comparator.comparing(EamAssetLog::getCreateTime)) + .collect(Collectors.toList()); + + List openLogs = new ArrayList<>(); + List runLogs = new ArrayList<>(); + + Map map = new HashMap<>(); + EamAssetLog currentNode = null; + + for (EamAssetLog log : filteredLogs) { + if (currentNode == null && DetectTypeEnum.ON.getInfo().equals(log.getOperationType())) { + currentNode = log; + } else if (currentNode != null && currentNode.getOperationType().equals(DetectTypeEnum.OFF.getInfo()) && log.getOperationType().equals(DetectTypeEnum.ON.getInfo())) { + currentNode = log; + } else if (currentNode != null && currentNode.getOperationType().equals(DetectTypeEnum.ON.getInfo()) && log.getOperationType().equals(DetectTypeEnum.OFF.getInfo())) { + timeDistance(map, log.getCreateTime(), currentNode.getCreateTime()); + currentNode = log; + } + } + // 区间第一条是关机上一条是开机的情况,最后一条是开机的情况 + if (filteredLogs != null && filteredLogs.size() > 0 && filteredLogs.get(0).getOperationType().equals(DetectTypeEnum.OFF.getInfo())) { + QueryWrapper queryWrapperBefore = new QueryWrapper<>(); + queryWrapperBefore.eq("asset_id", id); + queryWrapperBefore.le("create_time", startTime); + queryWrapperBefore.eq("operation_type", DetectTypeEnum.ON.getInfo()); + queryWrapperBefore.last("limit 1"); + EamAssetLog logBefore = eamAssetLogService.getOne(queryWrapperBefore); + if (logBefore != null && logBefore.getOperationType().equals(DetectTypeEnum.ON.getInfo())) { + timeDistance(map, filteredLogs.get(0).getCreateTime(), startTime); + } + } + if (filteredLogs != null && filteredLogs.size() > 0 && filteredLogs.get(filteredLogs.size() - 1).getOperationType().equals(DetectTypeEnum.ON.getInfo())) { + timeDistance(map, endTime, filteredLogs.get(filteredLogs.size() - 1).getCreateTime()); + } + + + if (type == 2 || (type == 3 && map.size() > 30)) { + map.entrySet() + .stream() + .collect(Collectors.groupingBy( + entry -> entry.getKey().substring(0, 7), // 提取 "yyyy-MM" + Collectors.summingLong(Map.Entry::getValue) + )).forEach((key, value) -> { + openLogs.add(ChartValue.builder().name(key).value(value).build()); + }); + } else { + map.forEach((key, value) -> { + openLogs.add(ChartValue.builder().name(key).value(value).build()); + }); + } + + openLogs.sort(Comparator.comparing(ChartValue::getName)); + long openTotal = map.values().stream().mapToLong(Long::longValue).sum(); + long totalTime = DateUtils.getHourDiff(endTime, startTime); + runLogs.add(ChartValue.builder().name("设备开机").value(openTotal).build()); + runLogs.add(ChartValue.builder().name("设备关机").value(totalTime - openTotal).build()); + + Integer depreciation = null; + if (eamAsset.getRegisterDate() != null && eamAsset.get_eamBasicFinancialCategory() != null) { + Integer monthDiff = DateUtils.getMonthDiff(new Date(), eamAsset.getRegisterDate()); + //使用期限(月) + Integer useTerms = eamAsset.get_eamBasicFinancialCategory().getUseTerms(); + if (useTerms != null && useTerms > 0) { + // 确保已使用月份数不超过使用期限 + monthDiff = Math.min(monthDiff, useTerms); + // 计算折旧比例 + double depreciationProportion = (double) monthDiff / useTerms; + // 确保比例在0到1之间 + depreciationProportion = Math.max(0.0, Math.min(depreciationProportion, 1.0)); + // 将比例扩大一百倍并四舍五入到最接近的整数 + depreciation = (int) Math.round(depreciationProportion * 100); + } + } + + Integer maintenanceDays = null; + if (eamAsset.getMaintenanceStartDate() != null && eamAsset.getMaintenanceEndDate() != null) { + maintenanceDays = DateUtils.differentDaysByMillisecond(eamAsset.getMaintenanceEndDate(), eamAsset.getMaintenanceStartDate()); + } + + return success(OperationalStatisticsVo.builder() + .deviceStatus(deviceStatus) + .img(eamAsset.getImg()) + .openLogs(openLogs) + .runLogs(runLogs) + .repairCount(logCounts.getOrDefault(DetectTypeEnum.REPAIR, 0L).intValue()) + .maintenanceCount(logCounts.getOrDefault(DetectTypeEnum.MAINTENANCE, 0L).intValue()) + .stocktakingCount(logCounts.getOrDefault(DetectTypeEnum.STOCKTAKING, 0L).intValue()) + .inspectionCount(logCounts.getOrDefault(DetectTypeEnum.INSPECTION, 0L).intValue()) + .depreciation(depreciation)// + .maintenanceDays(maintenanceDays) + .build() + ); + } + + + /** + * 查询库存 + */ + @PostMapping("/warehouse/list") + @ApiOperation(value = "查询库存列表") + public TableDataInfo warehouseList(@RequestBody EamWarehouseInventoryDto eamWarehouseInventoryDto) { + startPage(); + List list = eamAssetService.queryWarehouseInventory(eamWarehouseInventoryDto); + return getDataTable(EamWarehouseInventoryVo.ToVo(list)); + } + + /** + * 查询业务表单中的库存流转记录 + */ + @PostMapping("/warehouse/listByIds") + @ApiOperation(value = "查询业务表单中的库存流转记录") + public TableDataInfo warehouseList(@RequestBody List eamWarehouseAssetDtoList) { + startPage(); + List list = eamAssetService.queryWarehouseInventoryByIds(eamWarehouseAssetDtoList); + return getDataTable(EamWarehouseInventoryVo.ToVo(list)); + } + + private void timeDistance(Map map, Date endDate, Date startTime) { + long roundedHours = DateUtils.getHourDiff(endDate, startTime); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + String formattedDate = sdf.format(startTime); + + Date newDate = DateUtils.parseDate(DateUtils.dateTime(DateUtils.addDays(startTime, 1))); + + long startTimeToNextDay = DateUtils.getHourDiff(newDate, startTime); + if (roundedHours < startTimeToNextDay) { + if (map.containsKey(formattedDate)) { + Long value = map.get(formattedDate); + map.put(formattedDate, value + roundedHours); + } else { + map.put(formattedDate, roundedHours); + } + } else { + if (map.containsKey(formattedDate)) { + Long value = map.get(formattedDate); + map.put(formattedDate, value + startTimeToNextDay); + } else { + map.put(formattedDate, startTimeToNextDay); + } + roundedHours = roundedHours - startTimeToNextDay; + + // 时间差大于或等于24小时,拆分为每天24小时 + long fullDays = roundedHours / 24; + long remainingHours = roundedHours % 24; + + Calendar cal = Calendar.getInstance(); + cal.setTime(DateUtils.addDays(startTime, 1)); + + for (int i = 0; i < fullDays; i++) { + String date = sdf.format(cal.getTime()); + map.put(date, 24L); + cal.add(Calendar.DATE, 1); + } + + if (remainingHours > 0) { + String date = sdf.format(cal.getTime()); + map.put(date, remainingHours); + } + } + } +} + diff --git a/system/src/main/java/com/yyy/system/controller/EamAssetLogController.java b/system/src/main/java/com/yyy/system/controller/EamAssetLogController.java new file mode 100644 index 0000000..2a6a720 --- /dev/null +++ b/system/src/main/java/com/yyy/system/controller/EamAssetLogController.java @@ -0,0 +1,75 @@ +package com.yyy.system.controller; + + +import com.yyy.common.core.controller.BaseController; +import com.yyy.common.core.domain.Result; +import com.yyy.common.core.page.TableDataInfo; +import com.yyy.common.enums.DetectTypeEnum; +import com.yyy.common.utils.common.StringUtils; +import com.yyy.system.entity.pojo.EamAssetLog; +import com.yyy.system.entity.dto.EamAssetLogDto; +import com.yyy.system.entity.vo.EamAssetLogVo; +import com.yyy.system.entity.vo.EamDeviceLogVo; +import com.yyy.system.service.EamAssetLogService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 资产操作日志(eam_asset_log)表控制层 + * + * @author Fangy + * @since 2024-04-09 10:23:38 + */ +@RestController +@Api(tags = "资产操作日志") +@RequestMapping("api/eamAssetLog") +public class EamAssetLogController extends BaseController { + + private static final Logger logger = LoggerFactory.getLogger(EamAssetLogController.class); + /** + * 服务对象 + */ + @Resource + private EamAssetLogService eamAssetLogService; + + /** + * 查询分页数据 + */ + @PostMapping("/list") + @ApiOperation(value = "查询分页数据") + public TableDataInfo list(@RequestBody EamAssetLogDto eamAssetLogDto) { + startPage(); + List list = eamAssetLogService.queryAsset(eamAssetLogDto); + return getDataTable(EamAssetLogVo.ToVo(list)); + } + + @PostMapping("/list/device") + @ApiOperation(value = "维修、巡检、保养、盘点日志记录") + public TableDataInfo listDevice(@RequestBody EamAssetLogDto eamAssetLogDto) { + if (StringUtils.isBlank(eamAssetLogDto.getOperationType())) { + throw new IllegalArgumentException("操作类型参数缺失,可选项:" + DetectTypeEnum.deviceInfos().toString()); + } + if (!DetectTypeEnum.deviceInfos().contains(eamAssetLogDto.getOperationType())) { + throw new IllegalArgumentException("无效的操作类型,可选项:" + DetectTypeEnum.deviceInfos().toString()); + } + startPage(); + List list = eamAssetLogService.query(eamAssetLogDto); + return getDataTable(EamDeviceLogVo.ToVo(list)); + } + + /** + * 查询详情数据 + */ + @PostMapping("/query") + @ApiOperation(value = "查询详情数据") + public Result query(@RequestParam Long id) { + return success(EamAssetLogVo.ToVo(eamAssetLogService.getById(id))); + } +} + diff --git a/system/src/main/java/com/yyy/system/controller/EamBasicCategoryController.java b/system/src/main/java/com/yyy/system/controller/EamBasicCategoryController.java new file mode 100644 index 0000000..81b707a --- /dev/null +++ b/system/src/main/java/com/yyy/system/controller/EamBasicCategoryController.java @@ -0,0 +1,147 @@ +package com.yyy.system.controller; + + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.yyy.common.core.controller.BaseController; +import com.yyy.common.core.domain.Result; +import com.yyy.common.form.FieldData; +import com.yyy.common.utils.bean.BeanUtils; +import com.yyy.common.utils.poi.ExcelUtil; +import com.yyy.system.entity.excel.EamAssetExcel; +import com.yyy.system.entity.pojo.EamAsset; +import com.yyy.system.entity.pojo.EamBasicCategory; +import com.yyy.system.entity.dto.EamBasicCategoryDto; +import com.yyy.system.entity.vo.EamBasicCategoryVo; +import com.yyy.system.service.EamBasicCategoryService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 资产分类信息表(eam_basic_category)表控制层 + * + * @author Fangy + * @since 2024-04-08 14:37:24 + */ +@RestController +@Api(tags = "资产分类信息表") +@RequestMapping("api/eamBasicCategory") +public class EamBasicCategoryController extends BaseController { + + private static final Logger logger = LoggerFactory.getLogger(EamBasicCategoryController.class); + /** + * 服务对象 + */ + @Resource + private EamBasicCategoryService eamBasicCategoryService; + + /** + * 资产分类信息树 + */ + @PostMapping("/tree") + @ApiOperation(value = "资产分类信息树", notes = "v2.0 新增扩展信息模板相关") + public Result> tree() { + return success(EamBasicCategoryVo.ToVo(eamBasicCategoryService.list(new QueryWrapper().eq("is_deleted", 0)))); + } + + /** + * 查询详情数据 + */ + @PostMapping("/query") + @ApiOperation(value = "查询详情数据", notes = "v2.0 新增扩展信息模板相关") + public Result query(@RequestParam Long id) { + return success(EamBasicCategoryVo.ToVo(eamBasicCategoryService.getById(id))); + } + + /** + * 新增数据 + */ + @PostMapping("/add") + @ApiOperation(value = "新增数据", notes = "v2.0 新增扩展信息模板相关") + public Result add(@Validated @RequestBody EamBasicCategoryDto eamBasicCategoryDto) { + String flag = validateLimit(eamBasicCategoryDto); + if (flag != null) { + return error(flag); + } + EamBasicCategory eamBasicCategory = new EamBasicCategory(); + BeanUtils.copyProperties(eamBasicCategoryDto, eamBasicCategory); + eamBasicCategory.setCreateUser(getUserId()); + eamBasicCategory.setAssetExtTemp(JSONObject.toJSONString(eamBasicCategoryDto.get_assetExtTemp())); + return eamBasicCategoryService.save(eamBasicCategory) ? success() : error(); + } + + /** + * 修改数据 + */ + @PostMapping("/update") + @ApiOperation(value = "修改数据", notes = "v2.0 新增扩展信息模板相关") + public Result update(@Validated @RequestBody EamBasicCategoryDto eamBasicCategoryDto) { + String flag = validateLimit(eamBasicCategoryDto); + if (flag != null) { + return error(flag); + } + EamBasicCategory eamBasicCategory = new EamBasicCategory(); + BeanUtils.copyProperties(eamBasicCategoryDto, eamBasicCategory); + eamBasicCategory.setUpdateUser(getUserId()); + eamBasicCategory.setAssetExtTemp(JSONObject.toJSONString(eamBasicCategoryDto.get_assetExtTemp())); + return eamBasicCategoryService.updateById(eamBasicCategory) ? success() : error(); + } + + /** + * 删除数据 + */ + @PostMapping("/delete") + @ApiOperation(value = "删除数据") + public Result delete(@RequestBody List idList) { + if (idList.contains(1L) || idList.contains(2L) || idList.contains(3L) || idList.contains(4L)) { + return error("资产、设备、备品备件等基础数据不允许删除!"); + } + return eamBasicCategoryService.removeBatchByIds(idList) ? success() : error(); + } + + private String validateLimit(EamBasicCategoryDto eamBasicCategoryDto) { + if (eamBasicCategoryDto.getParentId() == null || eamBasicCategoryDto.getParentId() == 0) { + return "请选择资产、设备、备品备件或其他并添加下级分类。"; + } + if (eamBasicCategoryDto.getCategoryId()!=null && (eamBasicCategoryDto.getCategoryId().equals(1L) || eamBasicCategoryDto.getCategoryId().equals(2L) || eamBasicCategoryDto.getCategoryId().equals(3L) || eamBasicCategoryDto.getCategoryId().equals(4L))) { + //基础数据名称不允许修改 + eamBasicCategoryDto.setCategoryName(null); + } + Integer lowerLimit = eamBasicCategoryDto.getLowerLimit(); + Integer safetyLimit = eamBasicCategoryDto.getSafetyLimit(); + Integer upperLimit = eamBasicCategoryDto.getUpperLimit(); + + if (lowerLimit != null && safetyLimit != null && safetyLimit < lowerLimit) { + return "安全库存应该大于安全库存下限!"; + } else if (upperLimit != null && safetyLimit != null && safetyLimit > upperLimit) { + return "安全库存应该小于安全库存上限!"; + } else if (lowerLimit != null && upperLimit != null && lowerLimit > upperLimit) { + return "安全库存上限应该大于安全库存下限!"; + } + return null; + } + + @PostMapping("/importTemplate") + @ApiOperation(value = "下载模板示例") + public void importTemplate(HttpServletResponse response) { + ExcelUtil util = new ExcelUtil<>(FieldData.class); + util.importTemplateExcel(response, "扩展属性表单模板"); + } + + @PostMapping("/importData") + @ApiOperation(value = "上传表单模板,返回扩展字段Json串") + public Result importData(MultipartFile file) throws Exception { + ExcelUtil util = new ExcelUtil<>(FieldData.class); + return success(util.importExcel(file.getInputStream())); + } +} + diff --git a/system/src/main/java/com/yyy/system/controller/EamBasicFinancialCategoryController.java b/system/src/main/java/com/yyy/system/controller/EamBasicFinancialCategoryController.java new file mode 100644 index 0000000..196d61e --- /dev/null +++ b/system/src/main/java/com/yyy/system/controller/EamBasicFinancialCategoryController.java @@ -0,0 +1,104 @@ +package com.yyy.system.controller; + + + +import com.yyy.common.core.controller.BaseController; +import com.yyy.common.core.domain.Result; +import com.yyy.common.core.page.TableDataInfo; +import com.yyy.common.utils.bean.BeanUtils; +import com.yyy.system.entity.pojo.EamBasicFinancialCategory; +import com.yyy.system.entity.dto.EamBasicFinancialCategoryDto; +import com.yyy.system.entity.vo.EamBasicFinancialCategoryVo; +import com.yyy.system.service.EamBasicFinancialCategoryService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 财务分类信息表(eam_basic_financial_category)表控制层 + * @author Fangy + * @since 2024-05-11 14:38:13 + */ +@RestController +@Api(tags = "财务分类信息表相关接口") +@RequestMapping("api/eamBasicFinancialCategory") +public class EamBasicFinancialCategoryController extends BaseController { + + private static final Logger logger = LoggerFactory.getLogger(EamBasicFinancialCategoryController.class); + /** + * 服务对象 + */ + @Resource + private EamBasicFinancialCategoryService eamBasicFinancialCategoryService; + + /** + * 查询分页数据 + * + */ + @PostMapping("/list") + @ApiOperation(value = "查询分页数据") + public TableDataInfo list(@RequestBody EamBasicFinancialCategoryDto eamBasicFinancialCategoryDto) { + startPage(); + List list = eamBasicFinancialCategoryService.query(eamBasicFinancialCategoryDto); + return getDataTable(EamBasicFinancialCategoryVo.ToVo(list)); + } + + @PostMapping("/all") + @ApiOperation(value = "查询所有数据") + public Result list() { + return success(EamBasicFinancialCategoryVo.ToVo(eamBasicFinancialCategoryService.query(new EamBasicFinancialCategoryDto()))); + } + + /** + * 查询详情数据 + * + */ + @PostMapping("/query") + @ApiOperation(value = "查询详情数据") + public Result query(@RequestParam Long id) { + return success(EamBasicFinancialCategoryVo.ToVo(eamBasicFinancialCategoryService.getById(id))); + } + + /** + * 新增数据 + * + */ + @PostMapping("/add") + @ApiOperation(value = "新增数据") + public Result add(@Validated @RequestBody EamBasicFinancialCategoryDto eamBasicFinancialCategoryDto) { + EamBasicFinancialCategory eamBasicFinancialCategory = new EamBasicFinancialCategory(); + BeanUtils.copyProperties(eamBasicFinancialCategoryDto, eamBasicFinancialCategory); + eamBasicFinancialCategory.setCreateUser(getUserId()); + return eamBasicFinancialCategoryService.save(eamBasicFinancialCategory)?success():error(); + } + + /** + * 修改数据 + * + */ + @PostMapping("/update") + @ApiOperation(value = "修改数据") + public Result update(@Validated @RequestBody EamBasicFinancialCategoryDto eamBasicFinancialCategoryDto) { + EamBasicFinancialCategory eamBasicFinancialCategory = new EamBasicFinancialCategory(); + BeanUtils.copyProperties(eamBasicFinancialCategoryDto, eamBasicFinancialCategory); + eamBasicFinancialCategory.setUpdateUser(getUserId()); + return eamBasicFinancialCategoryService.updateById(eamBasicFinancialCategory) ? success() : error(); + } + + /** + * 删除数据 + * + */ + @PostMapping("/delete") + @ApiOperation(value = "删除数据") + public Result delete(@RequestBody List idList) { + return eamBasicFinancialCategoryService.removeBatchByIds(idList) ? success() : error(); + } +} + diff --git a/system/src/main/java/com/yyy/system/controller/EamBasicMaintenanceVendorController.java b/system/src/main/java/com/yyy/system/controller/EamBasicMaintenanceVendorController.java new file mode 100644 index 0000000..a628b5d --- /dev/null +++ b/system/src/main/java/com/yyy/system/controller/EamBasicMaintenanceVendorController.java @@ -0,0 +1,98 @@ +package com.yyy.system.controller; + + + +import com.yyy.common.core.controller.BaseController; +import com.yyy.common.core.domain.Result; +import com.yyy.common.core.page.TableDataInfo; +import com.yyy.common.utils.bean.BeanUtils; +import com.yyy.system.entity.pojo.EamBasicMaintenanceVendor; +import com.yyy.system.entity.dto.EamBasicMaintenanceVendorDto; +import com.yyy.system.entity.vo.EamBasicMaintenanceVendorVo; +import com.yyy.system.service.EamBasicMaintenanceVendorService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 维保商(eam_basic_maintenance_vendor)表控制层 + * @author Fangy + * @since 2024-04-09 12:52:28 + */ +@RestController +@Api(tags = "维保商") +@RequestMapping("api/eamBasicMaintenanceVendor") +public class EamBasicMaintenanceVendorController extends BaseController { + + private static final Logger logger = LoggerFactory.getLogger(EamBasicMaintenanceVendorController.class); + /** + * 服务对象 + */ + @Resource + private EamBasicMaintenanceVendorService eamBasicMaintenanceVendorService; + + /** + * 查询分页数据 + * + */ + @PostMapping("/list") + @ApiOperation(value = "查询分页数据") + public TableDataInfo list(@RequestBody EamBasicMaintenanceVendorDto eamBasicMaintenanceVendorDto) { + startPage(); + List list = eamBasicMaintenanceVendorService.query(eamBasicMaintenanceVendorDto); + return getDataTable(EamBasicMaintenanceVendorVo.ToVo(list)); + } + + /** + * 查询详情数据 + * + */ + @PostMapping("/query") + @ApiOperation(value = "查询详情数据") + public Result query(@RequestParam Long id) { + return success(EamBasicMaintenanceVendorVo.ToVo(eamBasicMaintenanceVendorService.getById(id))); + } + + /** + * 新增数据 + * + */ + @PostMapping("/add") + @ApiOperation(value = "新增数据") + public Result add(@Validated @RequestBody EamBasicMaintenanceVendorDto eamBasicMaintenanceVendorDto) { + EamBasicMaintenanceVendor eamBasicMaintenanceVendor = new EamBasicMaintenanceVendor(); + BeanUtils.copyProperties(eamBasicMaintenanceVendorDto, eamBasicMaintenanceVendor); + eamBasicMaintenanceVendor.setCreateUser(getUserId()); + return eamBasicMaintenanceVendorService.save(eamBasicMaintenanceVendor)?success():error(); + } + + /** + * 修改数据 + * + */ + @PostMapping("/update") + @ApiOperation(value = "修改数据") + public Result update(@Validated @RequestBody EamBasicMaintenanceVendorDto eamBasicMaintenanceVendorDto) { + EamBasicMaintenanceVendor eamBasicMaintenanceVendor = new EamBasicMaintenanceVendor(); + BeanUtils.copyProperties(eamBasicMaintenanceVendorDto, eamBasicMaintenanceVendor); + eamBasicMaintenanceVendor.setUpdateUser(getUserId()); + return eamBasicMaintenanceVendorService.updateById(eamBasicMaintenanceVendor) ? success() : error(); + } + + /** + * 删除数据 + * + */ + @PostMapping("/delete") + @ApiOperation(value = "删除数据") + public Result delete(@RequestBody List idList) { + return eamBasicMaintenanceVendorService.removeBatchByIds(idList) ? success() : error(); + } +} + diff --git a/system/src/main/java/com/yyy/system/controller/EamBasicManufacturersVendorController.java b/system/src/main/java/com/yyy/system/controller/EamBasicManufacturersVendorController.java new file mode 100644 index 0000000..45f1e44 --- /dev/null +++ b/system/src/main/java/com/yyy/system/controller/EamBasicManufacturersVendorController.java @@ -0,0 +1,93 @@ +package com.yyy.system.controller; + + +import com.yyy.common.core.controller.BaseController; +import com.yyy.common.core.domain.Result; +import com.yyy.common.core.page.TableDataInfo; +import com.yyy.common.utils.bean.BeanUtils; +import com.yyy.system.entity.pojo.EamBasicManufacturersVendor; +import com.yyy.system.entity.dto.EamBasicManufacturersVendorDto; +import com.yyy.system.entity.vo.EamBasicManufacturersVendorVo; +import com.yyy.system.service.EamBasicManufacturersVendorService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 生产商(eam_basic_manufacturers_vendor)表控制层 + * + * @author Fangy + * @since 2024-04-09 12:45:34 + */ +@RestController +@Api(tags = "生产商") +@RequestMapping("api/eamBasicManufacturersVendor") +public class EamBasicManufacturersVendorController extends BaseController { + + private static final Logger logger = LoggerFactory.getLogger(EamBasicManufacturersVendorController.class); + /** + * 服务对象 + */ + @Resource + private EamBasicManufacturersVendorService eamBasicManufacturersVendorService; + + /** + * 查询分页数据 + */ + @PostMapping("/list") + @ApiOperation(value = "查询分页数据") + public TableDataInfo list(@RequestBody EamBasicManufacturersVendorDto eamBasicManufacturersVendorDto) { + startPage(); + List list = eamBasicManufacturersVendorService.query(eamBasicManufacturersVendorDto); + return getDataTable(EamBasicManufacturersVendorVo.ToVo(list)); + } + + /** + * 查询详情数据 + */ + @PostMapping("/query") + @ApiOperation(value = "查询详情数据") + public Result query(@RequestParam Long id) { + return success(EamBasicManufacturersVendorVo.ToVo(eamBasicManufacturersVendorService.getById(id))); + } + + /** + * 新增数据 + */ + @PostMapping("/add") + @ApiOperation(value = "新增数据") + public Result add(@Validated @RequestBody EamBasicManufacturersVendorDto eamBasicManufacturersVendorDto) { + EamBasicManufacturersVendor eamBasicManufacturersVendor = new EamBasicManufacturersVendor(); + BeanUtils.copyProperties(eamBasicManufacturersVendorDto, eamBasicManufacturersVendor); + eamBasicManufacturersVendor.setCreateUser(getUserId()); + return eamBasicManufacturersVendorService.save(eamBasicManufacturersVendor) ? success() : error(); + } + + /** + * 修改数据 + */ + @PostMapping("/update") + @ApiOperation(value = "修改数据") + public Result update(@Validated @RequestBody EamBasicManufacturersVendorDto eamBasicManufacturersVendorDto) { + EamBasicManufacturersVendor eamBasicManufacturersVendor = new EamBasicManufacturersVendor(); + BeanUtils.copyProperties(eamBasicManufacturersVendorDto, eamBasicManufacturersVendor); + eamBasicManufacturersVendor.setUpdateUser(getUserId()); + return eamBasicManufacturersVendorService.updateById(eamBasicManufacturersVendor) ? success() : error(); + } + + /** + * 删除数据 + */ + @PostMapping("/delete") + @ApiOperation(value = "删除数据") + public Result delete(@RequestBody List idList) { + return eamBasicManufacturersVendorService.removeBatchByIds(idList) ? success() : error(); + } +} + diff --git a/system/src/main/java/com/yyy/system/controller/EamBasicPositionController.java b/system/src/main/java/com/yyy/system/controller/EamBasicPositionController.java new file mode 100644 index 0000000..907f3d8 --- /dev/null +++ b/system/src/main/java/com/yyy/system/controller/EamBasicPositionController.java @@ -0,0 +1,104 @@ +package com.yyy.system.controller; + + + +import com.yyy.common.core.controller.BaseController; +import com.yyy.common.core.domain.Result; +import com.yyy.common.core.page.TableDataInfo; +import com.yyy.common.utils.bean.BeanUtils; +import com.yyy.system.entity.pojo.EamBasicPosition; +import com.yyy.system.entity.dto.EamBasicPositionDto; +import com.yyy.system.entity.vo.EamBasicPositionVo; +import com.yyy.system.service.EamBasicPositionService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 存放位置信息表(eam_basic_position)表控制层 + * @author Fangy + * @since 2024-04-09 12:52:28 + */ +@RestController +@Api(tags = "存放位置信息表(地址管理)") +@RequestMapping("api/eamBasicPosition") +public class EamBasicPositionController extends BaseController { + + private static final Logger logger = LoggerFactory.getLogger(EamBasicPositionController.class); + /** + * 服务对象 + */ + @Resource + private EamBasicPositionService eamBasicPositionService; + + /** + * 查询分页数据 + * + */ + @PostMapping("/list") + @ApiOperation(value = "查询分页数据") + public TableDataInfo list(@RequestBody EamBasicPositionDto eamBasicPositionDto) { + startPage(); + List list = eamBasicPositionService.query(eamBasicPositionDto); + return getDataTable(EamBasicPositionVo.ToVo(list)); + } + + @PostMapping("/tree") + @ApiOperation(value = "查询树形数据") + public Result> tree() { + return success(EamBasicPositionVo.ToVo(eamBasicPositionService.query(new EamBasicPositionDto()))); + } + + /** + * 查询详情数据 + * + */ + @PostMapping("/query") + @ApiOperation(value = "查询详情数据") + public Result query(@RequestParam Long id) { + return success(EamBasicPositionVo.ToVo(eamBasicPositionService.getById(id))); + } + + /** + * 新增数据 + * + */ + @PostMapping("/add") + @ApiOperation(value = "新增数据") + public Result add(@Validated @RequestBody EamBasicPositionDto eamBasicPositionDto) { + EamBasicPosition eamBasicPosition = new EamBasicPosition(); + BeanUtils.copyProperties(eamBasicPositionDto, eamBasicPosition); + eamBasicPosition.setCreateUser(getUserId()); + return eamBasicPositionService.save(eamBasicPosition)?success():error(); + } + + /** + * 修改数据 + * + */ + @PostMapping("/update") + @ApiOperation(value = "修改数据") + public Result update(@Validated @RequestBody EamBasicPositionDto eamBasicPositionDto) { + EamBasicPosition eamBasicPosition = new EamBasicPosition(); + BeanUtils.copyProperties(eamBasicPositionDto, eamBasicPosition); + eamBasicPosition.setUpdateUser(getUserId()); + return eamBasicPositionService.updateById(eamBasicPosition) ? success() : error(); + } + + /** + * 删除数据 + * + */ + @PostMapping("/delete") + @ApiOperation(value = "删除数据") + public Result delete(@RequestBody List idList) { + return eamBasicPositionService.removeBatchByIds(idList) ? success() : error(); + } +} + diff --git a/system/src/main/java/com/yyy/system/controller/EamBasicSupplierVendorController.java b/system/src/main/java/com/yyy/system/controller/EamBasicSupplierVendorController.java new file mode 100644 index 0000000..47f248c --- /dev/null +++ b/system/src/main/java/com/yyy/system/controller/EamBasicSupplierVendorController.java @@ -0,0 +1,97 @@ +package com.yyy.system.controller; + + +import com.yyy.common.core.controller.BaseController; +import com.yyy.common.core.domain.Result; +import com.yyy.common.core.page.TableDataInfo; +import com.yyy.common.utils.bean.BeanUtils; +import com.yyy.system.entity.pojo.EamBasicSupplierVendor; +import com.yyy.system.entity.dto.EamBasicSupplierVendorDto; +import com.yyy.system.entity.vo.EamBasicSupplierVendorVo; +import com.yyy.system.service.EamBasicSupplierVendorService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 供应商(eam_basic_supplier_vendor)表控制层 + * @author Fangy + * @since 2024-04-09 10:56:09 + */ +@RestController +@Api(tags = "供应商") +@RequestMapping("api/eamBasicSupplierVendor") +public class EamBasicSupplierVendorController extends BaseController { + + private static final Logger logger = LoggerFactory.getLogger(EamBasicSupplierVendorController.class); + /** + * 服务对象 + */ + @Resource + private EamBasicSupplierVendorService eamBasicSupplierVendorService; + + /** + * 查询分页数据 + * + */ + @PostMapping("/list") + @ApiOperation(value = "查询分页数据") + public TableDataInfo list(@RequestBody EamBasicSupplierVendorDto eamBasicSupplierVendorDto) { + startPage(); + List list = eamBasicSupplierVendorService.query(eamBasicSupplierVendorDto); + return getDataTable(EamBasicSupplierVendorVo.ToVo(list)); + } + + /** + * 查询详情数据 + * + */ + @PostMapping("/query") + @ApiOperation(value = "查询详情数据") + public Result query(@RequestParam Long id) { + return success(EamBasicSupplierVendorVo.ToVo(eamBasicSupplierVendorService.getById(id))); + } + + /** + * 新增数据 + * + */ + @PostMapping("/add") + @ApiOperation(value = "新增数据") + public Result add(@Validated @RequestBody EamBasicSupplierVendorDto eamBasicSupplierVendorDto) { + EamBasicSupplierVendor eamBasicSupplierVendor = new EamBasicSupplierVendor(); + BeanUtils.copyProperties(eamBasicSupplierVendorDto, eamBasicSupplierVendor); + eamBasicSupplierVendor.setCreateUser(getUserId()); + return eamBasicSupplierVendorService.save(eamBasicSupplierVendor)?success():error(); + } + + /** + * 修改数据 + * + */ + @PostMapping("/update") + @ApiOperation(value = "修改数据") + public Result update(@Validated @RequestBody EamBasicSupplierVendorDto eamBasicSupplierVendorDto) { + EamBasicSupplierVendor eamBasicSupplierVendor = new EamBasicSupplierVendor(); + BeanUtils.copyProperties(eamBasicSupplierVendorDto, eamBasicSupplierVendor); + eamBasicSupplierVendor.setUpdateUser(getUserId()); + return eamBasicSupplierVendorService.updateById(eamBasicSupplierVendor) ? success() : error(); + } + + /** + * 删除数据 + * + */ + @PostMapping("/delete") + @ApiOperation(value = "删除数据") + public Result delete(@RequestBody List idList) { + return eamBasicSupplierVendorService.removeBatchByIds(idList) ? success() : error(); + } +} + diff --git a/system/src/main/java/com/yyy/system/controller/EamBasicTeamController.java b/system/src/main/java/com/yyy/system/controller/EamBasicTeamController.java new file mode 100644 index 0000000..e0be55d --- /dev/null +++ b/system/src/main/java/com/yyy/system/controller/EamBasicTeamController.java @@ -0,0 +1,107 @@ +package com.yyy.system.controller; + + + +import com.alibaba.fastjson.JSONObject; +import com.yyy.common.core.controller.BaseController; +import com.yyy.common.core.domain.Result; +import com.yyy.common.core.page.TableDataInfo; +import com.yyy.common.utils.bean.BeanUtils; +import com.yyy.system.entity.pojo.EamBasicTeam; +import com.yyy.system.entity.dto.EamBasicTeamDto; +import com.yyy.system.entity.vo.EamBasicTeamVo; +import com.yyy.system.service.EamBasicTeamService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 班组信息管理(eam_basic_team)表控制层 + * @author Fangy + * @since 2024-09-18 14:57:08 + */ +@RestController +@Api(tags = "班组信息管理相关接口") +@RequestMapping("api/v2/eamBasicTeam") +public class EamBasicTeamController extends BaseController { + + private static final Logger logger = LoggerFactory.getLogger(EamBasicTeamController.class); + /** + * 服务对象 + */ + @Resource + private EamBasicTeamService eamBasicTeamService; + + @PostMapping("/all") + @ApiOperation(value = "查询所有数据") + public Result> all() { + return success(eamBasicTeamService.query(new EamBasicTeamDto())); + } + + /** + * 查询分页数据 + * + */ + @PostMapping("/list") + @ApiOperation(value = "查询分页数据") + public TableDataInfo list(@RequestBody EamBasicTeamDto eamBasicTeamDto) { + startPage(); + List list = eamBasicTeamService.query(eamBasicTeamDto); + return getDataTable(EamBasicTeamVo.ToVo(list)); + } + + /** + * 查询详情数据 + * + */ + @PostMapping("/query") + @ApiOperation(value = "查询详情数据") + public Result query(@RequestParam Long id) { + return success(EamBasicTeamVo.ToVo(eamBasicTeamService.getById(id))); + } + + /** + * 新增数据 + * + */ + @PostMapping("/add") + @ApiOperation(value = "新增数据") + public Result add(@Validated @RequestBody EamBasicTeamDto eamBasicTeamDto) { + EamBasicTeam eamBasicTeam = new EamBasicTeam(); + BeanUtils.copyProperties(eamBasicTeamDto, eamBasicTeam); + eamBasicTeam.setCreateUser(getUserId()); + eamBasicTeam.setValue(JSONObject.toJSONString(eamBasicTeamDto.get_value())); + return eamBasicTeamService.save(eamBasicTeam)?success():error(); + } + + /** + * 修改数据 + * + */ + @PostMapping("/update") + @ApiOperation(value = "修改数据") + public Result update(@Validated @RequestBody EamBasicTeamDto eamBasicTeamDto) { + EamBasicTeam eamBasicTeam = new EamBasicTeam(); + BeanUtils.copyProperties(eamBasicTeamDto, eamBasicTeam); + eamBasicTeam.setUpdateUser(getUserId()); + eamBasicTeam.setValue(JSONObject.toJSONString(eamBasicTeamDto.get_value())); + return eamBasicTeamService.updateById(eamBasicTeam) ? success() : error(); + } + + /** + * 删除数据 + * + */ + @PostMapping("/delete") + @ApiOperation(value = "删除数据") + public Result delete(@RequestBody List idList) { + return eamBasicTeamService.removeBatchByIds(idList) ? success() : error(); + } +} + diff --git a/system/src/main/java/com/yyy/system/controller/EamBasicWarehouseController.java b/system/src/main/java/com/yyy/system/controller/EamBasicWarehouseController.java new file mode 100644 index 0000000..113d4f2 --- /dev/null +++ b/system/src/main/java/com/yyy/system/controller/EamBasicWarehouseController.java @@ -0,0 +1,98 @@ +package com.yyy.system.controller; + + + +import com.yyy.common.core.controller.BaseController; +import com.yyy.common.core.domain.Result; +import com.yyy.common.core.page.TableDataInfo; +import com.yyy.common.utils.bean.BeanUtils; +import com.yyy.system.entity.pojo.EamBasicWarehouse; +import com.yyy.system.entity.dto.EamBasicWarehouseDto; +import com.yyy.system.entity.vo.EamBasicWarehouseVo; +import com.yyy.system.service.EamBasicWarehouseService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 仓库信息表(eam_basic_warehouse)表控制层 + * @author Fangy + * @since 2024-04-09 13:16:56 + */ +@RestController +@Api(tags = "仓库信息表") +@RequestMapping("api/eamBasicWarehouse") +public class EamBasicWarehouseController extends BaseController { + + private static final Logger logger = LoggerFactory.getLogger(EamBasicWarehouseController.class); + /** + * 服务对象 + */ + @Resource + private EamBasicWarehouseService eamBasicWarehouseService; + + /** + * 查询分页数据 + * + */ + @PostMapping("/list") + @ApiOperation(value = "查询分页数据") + public TableDataInfo list(@RequestBody EamBasicWarehouseDto eamBasicWarehouseDto) { + startPage(); + List list = eamBasicWarehouseService.query(eamBasicWarehouseDto); + return getDataTable(EamBasicWarehouseVo.ToVo(list)); + } + + /** + * 查询详情数据 + * + */ + @PostMapping("/query") + @ApiOperation(value = "查询详情数据") + public Result query(@RequestParam Long id) { + return success(EamBasicWarehouseVo.ToVo(eamBasicWarehouseService.getById(id))); + } + + /** + * 新增数据 + * + */ + @PostMapping("/add") + @ApiOperation(value = "新增数据") + public Result add(@Validated @RequestBody EamBasicWarehouseDto eamBasicWarehouseDto) { + EamBasicWarehouse eamBasicWarehouse = new EamBasicWarehouse(); + BeanUtils.copyProperties(eamBasicWarehouseDto, eamBasicWarehouse); + eamBasicWarehouse.setCreateUser(getUserId()); + return eamBasicWarehouseService.save(eamBasicWarehouse)?success():error(); + } + + /** + * 修改数据 + * + */ + @PostMapping("/update") + @ApiOperation(value = "修改数据") + public Result update(@Validated @RequestBody EamBasicWarehouseDto eamBasicWarehouseDto) { + EamBasicWarehouse eamBasicWarehouse = new EamBasicWarehouse(); + BeanUtils.copyProperties(eamBasicWarehouseDto, eamBasicWarehouse); + eamBasicWarehouse.setUpdateUser(getUserId()); + return eamBasicWarehouseService.updateById(eamBasicWarehouse) ? success() : error(); + } + + /** + * 删除数据 + * + */ + @PostMapping("/delete") + @ApiOperation(value = "删除数据") + public Result delete(@RequestBody List idList) { + return eamBasicWarehouseService.removeBatchByIds(idList) ? success() : error(); + } +} + diff --git a/system/src/main/java/com/yyy/system/controller/EamBusinessAllocateController.java b/system/src/main/java/com/yyy/system/controller/EamBusinessAllocateController.java new file mode 100644 index 0000000..d861fc0 --- /dev/null +++ b/system/src/main/java/com/yyy/system/controller/EamBusinessAllocateController.java @@ -0,0 +1,172 @@ +package com.yyy.system.controller; + + +import com.alibaba.fastjson.JSON; +import com.yyy.common.core.controller.BaseController; +import com.yyy.common.core.domain.Result; +import com.yyy.common.core.page.TableDataInfo; +import com.yyy.common.enums.AssetStatusEnum; +import com.yyy.common.enums.BusinessStatusEnum; +import com.yyy.common.enums.DetectTypeEnum; +import com.yyy.common.enums.EncodingEum; +import com.yyy.common.utils.bean.BeanUtils; +import com.yyy.system.entity.dto.EamWarehouseAssetDto; +import com.yyy.system.entity.pojo.EamAsset; +import com.yyy.system.entity.pojo.EamBusinessAllocate; +import com.yyy.system.entity.dto.EamBusinessAllocateDto; +import com.yyy.system.entity.vo.EamBusinessAllocateVo; +import com.yyy.system.service.EamAssetLogService; +import com.yyy.system.service.EamAssetService; +import com.yyy.system.service.EamBusinessAllocateService; +import com.yyy.system.service.EamWarehouseAssetService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 调拨信息表(eam_business_allocate)表控制层 + * + * @author Fangy + * @since 2024-04-11 16:16:11 + */ +@RestController +@Api(tags = "调拨信息表相关接口") +@RequestMapping("api/eamBusinessAllocate") +public class EamBusinessAllocateController extends BaseController { + + private static final Logger logger = LoggerFactory.getLogger(EamBusinessAllocateController.class); + /** + * 服务对象 + */ + @Resource + private EamBusinessAllocateService eamBusinessAllocateService; + + @Resource + private EamAssetService assetService; + + @Resource + private EamAssetLogService eamAssetLogService; + + @Resource + private EamWarehouseAssetService eamWarehouseAssetService; + + /** + * 查询分页数据 + */ + @PostMapping("/list") + @ApiOperation(value = "查询分页数据") + public TableDataInfo list(@RequestBody EamBusinessAllocateDto eamBusinessAllocateDto) { + startPage(); + List list = eamBusinessAllocateService.query(eamBusinessAllocateDto); + return getDataTable(EamBusinessAllocateVo.ToVo(list)); + } + + /** + * 查询详情数据 + */ + @PostMapping("/query") + @ApiOperation(value = "查询详情数据") + public Result query(@RequestParam Long id) { + return success(EamBusinessAllocateVo.ToVo(eamBusinessAllocateService.getById(id))); + } + + /** + * 新增数据 + */ + @PostMapping("/add") + @ApiOperation(value = "新增数据") + public Result add(@Validated @RequestBody EamBusinessAllocateDto eamBusinessAllocateDto) { + EamBusinessAllocate eamBusinessAllocate = new EamBusinessAllocate(); + BeanUtils.copyProperties(eamBusinessAllocateDto, eamBusinessAllocate); + eamBusinessAllocate.setApplicant(getUserId()); + eamBusinessAllocate.setCreateUser(getUserId()); + eamBusinessAllocate.setBusinessId(EncodingEum.ALLOCATE.getBusinessId()); + eamBusinessAllocate.setStatus(BusinessStatusEnum.DRAFT.getCode()); + eamBusinessAllocate.setAssetIdList(JSON.toJSONString(eamBusinessAllocateDto.getAssetIdList())); + + List assetIdList = eamBusinessAllocateDto.getAssetIdList(); + if (assetIdList != null && !assetIdList.isEmpty()) { + if (eamWarehouseAssetService.reduceVerify(assetIdList)){ + eamWarehouseAssetService.reduce(assetIdList); + }else { + return error("库存不足!"); + } + assetIdList.forEach(assetDto -> assetDto.setWarehouseId(eamBusinessAllocate.getInWarehouseId())); + eamWarehouseAssetService.add(assetIdList); + List assetList = assetService.listByIds(assetIdList.stream().map(EamWarehouseAssetDto::getAssetId).distinct().collect(Collectors.toList())); + assetList.forEach(e -> { + e.setWarehouseId(eamBusinessAllocate.getOutWarehouseId()); + e.setStatus(AssetStatusEnum.ALLOCATE.getCode()); + eamAssetLogService.add(eamBusinessAllocate.getBusinessId(), DetectTypeEnum.ALLOCATE, DetectTypeEnum.ALLOCATE.getInfo(), e.getAssetId(), getUserId()); + }); + assetService.updateBatchById(assetList); + eamBusinessAllocate.setStatus(BusinessStatusEnum.COMPLETED.getCode()); + } + return eamBusinessAllocateService.save(eamBusinessAllocate) ? success() : error(); + } + + /** + * 修改数据 + */ + @PostMapping("/update") + @ApiOperation(value = "修改数据") + public Result update(@Validated @RequestBody EamBusinessAllocateDto eamBusinessAllocateDto) { +// if (eamBusinessAllocateService.isCompleted(eamBusinessAllocateDto.getId())) { +// return error("业务状态错误,业务已完成,内容不允许修改!"); +// } + EamBusinessAllocate eamBusinessAllocate = new EamBusinessAllocate(); + BeanUtils.copyProperties(eamBusinessAllocateDto, eamBusinessAllocate); + eamBusinessAllocate.setUpdateUser(getUserId()); + + eamBusinessAllocate.setAssetIdList(JSON.toJSONString(eamBusinessAllocateDto.getAssetIdList())); + return eamBusinessAllocateService.updateById(eamBusinessAllocate) ? success() : error(); + } + + /** + * 删除数据 + */ + @PostMapping("/delete") + @ApiOperation(value = "删除数据") + public Result delete(@RequestBody List idList) { + return eamBusinessAllocateService.removeBatchByIds(idList) ? success() : error(); + } + + @PostMapping("/confirm") + @ApiOperation(value = "确认", notes = "二期取消确认步骤") + public Result confirm(@RequestBody List idList) { + return error("接口已删除,二期取消确认步骤"); +// List list = eamBusinessAllocateService.listByIds(idList); +// for (EamBusinessAllocate x : list) { +// if (x.getStatus().equals(BusinessStatusEnum.COMPLETED.getCode())) { +// return error("业务状态错误,业务已完成,确认失败! 业务名称: " + x.getName() + " 业务编号: " + x.getBusinessId()); +// } +// List assetIdList = JSON.parseArray(x.getAssetIdList(), EamWarehouseAssetDto.class); +// if (assetIdList != null && !assetIdList.isEmpty()) { +// if(!eamWarehouseAssetService.reduce(assetIdList)){ +// return error("库存不足!"); +// } +// assetIdList.forEach(eamWarehouseAssetDto -> {eamWarehouseAssetDto.setWarehouseId(x.getInWarehouseId());}); +// eamWarehouseAssetService.add(assetIdList); +// List assetList = assetService.listByIds(assetIdList.stream().map(EamWarehouseAssetDto::getAssetId).distinct().collect(Collectors.toList())); +// assetList.forEach(e -> { +// e.setWarehouseId(x.getOutWarehouseId()); +// e.setStatus(AssetStatusEnum.ALLOCATE.getCode()); +// eamAssetLogService.add(x.getBusinessId(), DetectTypeEnum.ALLOCATE, DetectTypeEnum.ALLOCATE.getInfo(), e.getAssetId(), getUserId()); +// }); +// assetService.updateBatchById(assetList); +// x.setStatus(BusinessStatusEnum.COMPLETED.getCode());; +// } +// } +// +// eamBusinessAllocateService.updateBatchById(list); +// return success(); + } +} + diff --git a/system/src/main/java/com/yyy/system/controller/EamBusinessBorrowController.java b/system/src/main/java/com/yyy/system/controller/EamBusinessBorrowController.java new file mode 100644 index 0000000..5f2edd6 --- /dev/null +++ b/system/src/main/java/com/yyy/system/controller/EamBusinessBorrowController.java @@ -0,0 +1,168 @@ +package com.yyy.system.controller; + + +import com.alibaba.fastjson.JSON; +import com.yyy.common.core.controller.BaseController; +import com.yyy.common.core.domain.Result; +import com.yyy.common.core.page.TableDataInfo; +import com.yyy.common.enums.AssetStatusEnum; +import com.yyy.common.enums.BusinessStatusEnum; +import com.yyy.common.enums.DetectTypeEnum; +import com.yyy.common.enums.EncodingEum; +import com.yyy.common.utils.bean.BeanUtils; +import com.yyy.system.entity.dto.EamWarehouseAssetDto; +import com.yyy.system.entity.pojo.EamAsset; +import com.yyy.system.entity.pojo.EamBusinessBorrow; +import com.yyy.system.entity.dto.EamBusinessBorrowDto; +import com.yyy.system.entity.vo.EamBusinessBorrowVo; +import com.yyy.system.service.EamAssetLogService; +import com.yyy.system.service.EamAssetService; +import com.yyy.system.service.EamBusinessBorrowService; +import com.yyy.system.service.EamWarehouseAssetService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 借用信息表(eam_business_borrow)表控制层 + * + * @author Fangy + * @since 2024-04-10 17:26:36 + */ +@RestController +@Api(tags = "借用信息表相关接口") +@RequestMapping("api/eamBusinessBorrow") +public class EamBusinessBorrowController extends BaseController { + + private static final Logger logger = LoggerFactory.getLogger(EamBusinessBorrowController.class); + /** + * 服务对象 + */ + @Resource + private EamBusinessBorrowService eamBusinessBorrowService; + + @Resource + private EamAssetService assetService; + + @Resource + private EamAssetLogService eamAssetLogService; + + @Resource + private EamWarehouseAssetService eamWarehouseAssetService; + + /** + * 查询分页数据 + */ + @PostMapping("/list") + @ApiOperation(value = "查询分页数据") + public TableDataInfo list(@RequestBody EamBusinessBorrowDto eamBusinessBorrowDto) { + startPage(); + List list = eamBusinessBorrowService.query(eamBusinessBorrowDto); + return getDataTable(EamBusinessBorrowVo.ToVo(list)); + } + + /** + * 查询详情数据 + */ + @PostMapping("/query") + @ApiOperation(value = "查询详情数据") + public Result query(@RequestParam Long id) { + return success(EamBusinessBorrowVo.ToVo(eamBusinessBorrowService.getById(id))); + } + + /** + * 新增数据 + */ + @PostMapping("/add") + @ApiOperation(value = "新增数据") + public Result add(@Validated @RequestBody EamBusinessBorrowDto eamBusinessBorrowDto) { + EamBusinessBorrow eamBusinessBorrow = new EamBusinessBorrow(); + BeanUtils.copyProperties(eamBusinessBorrowDto, eamBusinessBorrow); + eamBusinessBorrow.setApplicant(getUserId()); + eamBusinessBorrow.setCreateUser(getUserId()); + eamBusinessBorrow.setBusinessId(EncodingEum.BORROW.getBusinessId()); + eamBusinessBorrow.setStatus(BusinessStatusEnum.DRAFT.getCode()); + eamBusinessBorrow.setAssetIdList(JSON.toJSONString(eamBusinessBorrowDto.getAssetIdList())); + + List assetIdList = eamBusinessBorrowDto.getAssetIdList(); + if (assetIdList != null && !assetIdList.isEmpty()) { + if (eamWarehouseAssetService.reduceVerify(assetIdList)){ + eamWarehouseAssetService.reduce(assetIdList); + }else { + return error("库存不足!"); + } + List assetList = assetService.listByIds(assetIdList.stream().map(EamWarehouseAssetDto::getAssetId).distinct().collect(Collectors.toList())); + assetList.forEach(e -> { + e.setUseUserId(eamBusinessBorrow.getUseUserId()); + e.setStatus(AssetStatusEnum.BORROW.getCode()); + eamAssetLogService.add(eamBusinessBorrow.getBusinessId(), DetectTypeEnum.BORROW, DetectTypeEnum.BORROW.getInfo(), e.getAssetId(), getUserId()); + }); + assetService.updateBatchById(assetList); + eamBusinessBorrow.setStatus(BusinessStatusEnum.COMPLETED.getCode()); + } + return eamBusinessBorrowService.save(eamBusinessBorrow) ? success() : error(); + } + + /** + * 修改数据 + */ + @PostMapping("/update") + @ApiOperation(value = "修改数据") + public Result update(@Validated @RequestBody EamBusinessBorrowDto eamBusinessBorrowDto) { +// if (eamBusinessBorrowService.isCompleted(eamBusinessBorrowDto.getId())) { +// return error("业务状态错误,业务已完成,内容不允许修改!"); +// } + EamBusinessBorrow eamBusinessBorrow = new EamBusinessBorrow(); + BeanUtils.copyProperties(eamBusinessBorrowDto, eamBusinessBorrow); + eamBusinessBorrow.setUpdateUser(getUserId()); + + eamBusinessBorrow.setAssetIdList(JSON.toJSONString(eamBusinessBorrowDto.getAssetIdList())); + return eamBusinessBorrowService.updateById(eamBusinessBorrow) ? success() : error(); + } + + /** + * 删除数据 + */ + @PostMapping("/delete") + @ApiOperation(value = "删除数据") + public Result delete(@RequestBody List idList) { + return eamBusinessBorrowService.removeBatchByIds(idList) ? success() : error(); + } + + @PostMapping("/confirm") + @ApiOperation(value = "确认") + public Result confirm(@RequestBody List idList) { + return error("接口已删除,二期取消确认步骤"); +// List list = eamBusinessBorrowService.listByIds(idList); +// for (EamBusinessBorrow x: list) { +// if (x.getStatus().equals(BusinessStatusEnum.COMPLETED.getCode())) { +// return error("业务状态错误,业务已完成,确认失败! 业务名称: " + x.getName() + " 业务编号: " + x.getBusinessId()); +// } +// List assetIdList = JSON.parseArray(x.getAssetIdList(), EamWarehouseAssetDto.class); +// if (assetIdList != null && !assetIdList.isEmpty()) { +// if(!eamWarehouseAssetService.reduce(assetIdList)){ +// return error("库存不足!"); +// } +// List assetList = assetService.listByIds(assetIdList.stream().map(EamWarehouseAssetDto::getAssetId).distinct().collect(Collectors.toList())); +// assetList.forEach(e -> { +// e.setUseUserId(x.getUseUserId()); +// e.setStatus(AssetStatusEnum.BORROW.getCode()); +// eamAssetLogService.add(x.getBusinessId(), DetectTypeEnum.BORROW, DetectTypeEnum.BORROW.getInfo(), e.getAssetId(), getUserId()); +// }); +// assetService.updateBatchById(assetList); +// x.setStatus(BusinessStatusEnum.COMPLETED.getCode()); +// } +// } +// +// eamBusinessBorrowService.updateBatchById(list); +// return success(); + } +} + diff --git a/system/src/main/java/com/yyy/system/controller/EamBusinessCollectionController.java b/system/src/main/java/com/yyy/system/controller/EamBusinessCollectionController.java new file mode 100644 index 0000000..7a64a32 --- /dev/null +++ b/system/src/main/java/com/yyy/system/controller/EamBusinessCollectionController.java @@ -0,0 +1,175 @@ +package com.yyy.system.controller; + + +import com.alibaba.fastjson.JSON; +import com.yyy.common.core.controller.BaseController; +import com.yyy.common.core.domain.Result; +import com.yyy.common.core.page.TableDataInfo; +import com.yyy.common.enums.AssetStatusEnum; +import com.yyy.common.enums.BusinessStatusEnum; +import com.yyy.common.enums.DetectTypeEnum; +import com.yyy.common.enums.EncodingEum; +import com.yyy.common.utils.bean.BeanUtils; +import com.yyy.system.entity.dto.EamWarehouseAssetDto; +import com.yyy.system.entity.pojo.EamAsset; +import com.yyy.system.entity.pojo.EamBusinessCollection; +import com.yyy.system.entity.dto.EamBusinessCollectionDto; +import com.yyy.system.entity.vo.EamBusinessCollectionVo; +import com.yyy.system.service.EamAssetLogService; +import com.yyy.system.service.EamAssetService; +import com.yyy.system.service.EamBusinessCollectionService; +import com.yyy.system.service.EamWarehouseAssetService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 资产领用信息表(eam_business_collection)表控制层 + * + * @author Fangy + * @since 2024-04-12 11:48:05 + */ +@RestController +@Api(tags = "资产领用信息表相关接口") +@RequestMapping("api/eamBusinessCollection") +public class EamBusinessCollectionController extends BaseController { + + private static final Logger logger = LoggerFactory.getLogger(EamBusinessCollectionController.class); + /** + * 服务对象 + */ + @Resource + private EamBusinessCollectionService eamBusinessCollectionService; + + @Resource + private EamAssetService assetService; + + @Resource + private EamAssetLogService eamAssetLogService; + + @Resource + private EamWarehouseAssetService eamWarehouseAssetService; + + /** + * 查询分页数据 + */ + @PostMapping("/list") + @ApiOperation(value = "查询分页数据") + public TableDataInfo list(@RequestBody EamBusinessCollectionDto eamBusinessCollectionDto) { + startPage(); + List list = eamBusinessCollectionService.query(eamBusinessCollectionDto); + return getDataTable(EamBusinessCollectionVo.ToVo(list)); + } + + /** + * 查询详情数据 + */ + @PostMapping("/query") + @ApiOperation(value = "查询详情数据") + public Result query(@RequestParam Long id) { + return success(EamBusinessCollectionVo.ToVo(eamBusinessCollectionService.getById(id))); + } + + /** + * 新增数据 + */ + @PostMapping("/add") + @ApiOperation(value = "新增数据") + public Result add(@Validated @RequestBody EamBusinessCollectionDto eamBusinessCollectionDto) { + EamBusinessCollection eamBusinessCollection = new EamBusinessCollection(); + BeanUtils.copyProperties(eamBusinessCollectionDto, eamBusinessCollection); + eamBusinessCollection.setApplicant(getUserId()); + eamBusinessCollection.setCreateUser(getUserId()); + eamBusinessCollection.setBusinessId(EncodingEum.COLLECTION.getBusinessId()); + eamBusinessCollection.setStatus(BusinessStatusEnum.DRAFT.getCode()); + eamBusinessCollection.setAssetIdList(JSON.toJSONString(eamBusinessCollectionDto.getAssetIdList())); + + List assetIdList = eamBusinessCollectionDto.getAssetIdList(); + if (assetIdList != null && !assetIdList.isEmpty()) { + if (eamWarehouseAssetService.reduceVerify(assetIdList)){ + eamWarehouseAssetService.reduce(assetIdList); + }else { + return error("库存不足!"); + } + List assetList = assetService.listByIds(assetIdList.stream().map(EamWarehouseAssetDto::getAssetId).distinct().collect(Collectors.toList())); + assetList.forEach(e -> { + e.setUseOrganizationId(eamBusinessCollection.getUseOrganizationId()); + e.setPositionId(eamBusinessCollection.getPositionId()); + e.setUseUserId(eamBusinessCollection.getUseUserId()); + e.setPositionDetail(eamBusinessCollection.getPositionDetail()); + e.setStatus(AssetStatusEnum.IN_USE.getCode()); + eamAssetLogService.add(eamBusinessCollection.getBusinessId(), DetectTypeEnum.COLLECTION, DetectTypeEnum.COLLECTION.getInfo(), e.getAssetId(), getUserId()); + }); + assetService.updateBatchById(assetList); + eamBusinessCollection.setStatus(BusinessStatusEnum.COMPLETED.getCode()); + } + return eamBusinessCollectionService.save(eamBusinessCollection) ? success() : error(); + } + + /** + * 修改数据 + */ + @PostMapping("/update") + @ApiOperation(value = "修改数据") + public Result update(@Validated @RequestBody EamBusinessCollectionDto eamBusinessCollectionDto) { +// if (eamBusinessCollectionService.isCompleted(eamBusinessCollectionDto.getId())) { +// return error("业务状态错误,业务已完成,内容不允许修改!"); +// } + EamBusinessCollection eamBusinessCollection = new EamBusinessCollection(); + BeanUtils.copyProperties(eamBusinessCollectionDto, eamBusinessCollection); + eamBusinessCollection.setUpdateUser(getUserId()); + + eamBusinessCollection.setAssetIdList(JSON.toJSONString(eamBusinessCollectionDto.getAssetIdList())); + return eamBusinessCollectionService.updateById(eamBusinessCollection) ? success() : error(); + } + + /** + * 删除数据 + */ + @PostMapping("/delete") + @ApiOperation(value = "删除数据") + public Result delete(@RequestBody List idList) { + return eamBusinessCollectionService.removeBatchByIds(idList) ? success() : error(); + } + + + @PostMapping("/confirm") + @ApiOperation(value = "确认") + public Result confirm(@RequestBody List idList) { + return error("接口已删除,二期取消确认步骤"); +// List list = eamBusinessCollectionService.listByIds(idList); +// for (EamBusinessCollection x:list) { +// List assetIdList = JSON.parseArray(x.getAssetIdList(), EamWarehouseAssetDto.class); +// if (x.getStatus().equals(BusinessStatusEnum.COMPLETED.getCode())) { +// return error("业务状态错误,业务已完成,确认失败! 业务名称: " + x.getName() + " 业务编号: " + x.getBusinessId()); +// } +// if (assetIdList != null && !assetIdList.isEmpty()) { +// if(!eamWarehouseAssetService.reduce(assetIdList)){ +// return error("库存不足!"); +// } +// List assetList = assetService.listByIds(assetIdList.stream().map(EamWarehouseAssetDto::getAssetId).distinct().collect(Collectors.toList())); +// assetList.forEach(e -> { +// e.setUseOrganizationId(x.getUseOrganizationId()); +// e.setPositionId(x.getPositionId()); +// e.setUseUserId(x.getUseUserId()); +// e.setPositionDetail(x.getPositionDetail()); +// e.setStatus(AssetStatusEnum.IN_USE.getCode()); +// eamAssetLogService.add(x.getBusinessId(), DetectTypeEnum.COLLECTION, DetectTypeEnum.COLLECTION.getInfo(), e.getAssetId(), getUserId()); +// }); +// assetService.updateBatchById(assetList); +// x.setStatus(BusinessStatusEnum.COMPLETED.getCode()); +// } +// } +// +// eamBusinessCollectionService.updateBatchById(list); +// return success(); + } +} + diff --git a/system/src/main/java/com/yyy/system/controller/EamBusinessController.java b/system/src/main/java/com/yyy/system/controller/EamBusinessController.java new file mode 100644 index 0000000..c4cd269 --- /dev/null +++ b/system/src/main/java/com/yyy/system/controller/EamBusinessController.java @@ -0,0 +1,53 @@ +package com.yyy.system.controller; + +import com.yyy.common.core.controller.BaseController; +import com.yyy.common.core.page.TableDataInfo; +import com.yyy.common.enums.DetectTypeEnum; +import com.yyy.common.utils.poi.ExcelUtil; +import com.yyy.system.entity.dto.EamBusinessDto; +import com.yyy.system.entity.excel.EamAssetExcel; +import com.yyy.system.entity.pojo.EamAsset; +import com.yyy.system.service.EamBusinessService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 资产管理业务 + * + */ +@RestController +@Api(tags = "资产管理相关接口") +@RequestMapping("api/v2/eamManager") +public class EamBusinessController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(EamBusinessController.class); + + @Resource + EamBusinessService eamBusinessService; + /** + * 查询分页数据 + */ + @PostMapping("/list") + @ApiOperation(value = "查询分页数据") + public TableDataInfo list(@RequestBody EamBusinessDto dto) { + startPage(); + return getDataTable(eamBusinessService.query(dto)); + } + + @PostMapping("/export") + @ApiOperation(value = "导出excel") + public void export(@RequestBody List idList, HttpServletResponse response) { +// List list = eamAssetService.listByIds(idList); +// ExcelUtil util = new ExcelUtil<>(EamAssetExcel.class); +// util.exportExcel(response, EamAssetExcel.ToExcel(list), "资产数据"); + } +} diff --git a/system/src/main/java/com/yyy/system/controller/EamBusinessOutboundController.java b/system/src/main/java/com/yyy/system/controller/EamBusinessOutboundController.java new file mode 100644 index 0000000..b9bcf18 --- /dev/null +++ b/system/src/main/java/com/yyy/system/controller/EamBusinessOutboundController.java @@ -0,0 +1,175 @@ +package com.yyy.system.controller; + +import com.alibaba.fastjson.JSON; +import com.yyy.common.core.controller.BaseController; +import com.yyy.common.core.domain.Result; +import com.yyy.common.core.page.TableDataInfo; +import com.yyy.common.enums.BusinessStatusEnum; +import com.yyy.common.enums.DetectTypeEnum; +import com.yyy.common.enums.EncodingEum; +import com.yyy.common.utils.bean.BeanUtils; +import com.yyy.system.entity.dto.EamWarehouseAssetDto; +import com.yyy.system.entity.pojo.EamAsset; +import com.yyy.system.entity.pojo.EamBusinessOutbound; +import com.yyy.system.entity.dto.EamBusinessOutboundDto; +import com.yyy.system.entity.vo.EamBusinessOutboundVo; +import com.yyy.system.service.EamAssetLogService; +import com.yyy.system.service.EamAssetService; +import com.yyy.system.service.EamBusinessOutboundService; +import com.yyy.system.service.EamWarehouseAssetService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 出库信息表(eam_business_outbound)表控制层 + * + * @author Fangy + * @since 2024-04-10 17:26:36 + */ +@RestController +@Api(tags = "出库信息表相关接口") +@RequestMapping("api/eamBusinessOutbound") +public class EamBusinessOutboundController extends BaseController { + + private static final Logger logger = LoggerFactory.getLogger(EamBusinessOutboundController.class); + /** + * 服务对象 + */ + @Resource + private EamBusinessOutboundService eamBusinessOutboundService; + + @Resource + private EamAssetService assetService; + + @Resource + private EamAssetLogService eamAssetLogService; + + @Resource + private EamWarehouseAssetService eamWarehouseAssetService; + + /** + * 查询分页数据 + */ + @PostMapping("/list") + @ApiOperation(value = "查询分页数据") + public TableDataInfo list(@RequestBody EamBusinessOutboundDto eamBusinessOutboundDto) { + startPage(); + List list = eamBusinessOutboundService.query(eamBusinessOutboundDto); + return getDataTable(EamBusinessOutboundVo.ToVo(list)); + } + + /** + * 查询详情数据 + */ + @PostMapping("/query") + @ApiOperation(value = "查询详情数据") + public Result query(@RequestParam Long id) { + return success(EamBusinessOutboundVo.ToVo(eamBusinessOutboundService.getById(id))); + } + + /** + * 新增数据 + */ + @PostMapping("/add") + @ApiOperation(value = "新增数据") + public Result add(@Validated @RequestBody EamBusinessOutboundDto eamBusinessOutboundDto) { + EamBusinessOutbound eamBusinessOutbound = new EamBusinessOutbound(); + BeanUtils.copyProperties(eamBusinessOutboundDto, eamBusinessOutbound); + eamBusinessOutbound.setCreateUser(getUserId()); + eamBusinessOutbound.setBusinessId(EncodingEum.OUTBOUND.getBusinessId()); + eamBusinessOutbound.setStatus(BusinessStatusEnum.DRAFT.getCode()); + eamBusinessOutboundDto.getAssetIdList().forEach(e -> e.setWarehouseId(eamBusinessOutboundDto.getWarehouseId())); + eamBusinessOutbound.setAssetIdList(JSON.toJSONString(eamBusinessOutboundDto.getAssetIdList())); + + List assetIdList = eamBusinessOutboundDto.getAssetIdList(); + if (assetIdList != null && !assetIdList.isEmpty()) { + if (eamWarehouseAssetService.reduceVerify(assetIdList)){ + eamWarehouseAssetService.reduce(assetIdList); + }else { + return error("库存不足!"); + } + List assetList = assetService.listByIds(assetIdList.stream().map(EamWarehouseAssetDto::getAssetId).distinct().collect(Collectors.toList())); + assetList.forEach(e -> { + e.setWarehouseId(eamBusinessOutbound.getWarehouseId()); + e.setOwnCompanyId(eamBusinessOutbound.getOwnCompanyId()); + e.setUseOrganizationId(eamBusinessOutbound.getUseOrganizationId()); + e.setUseUserId(eamBusinessOutbound.getUseUserId()); + e.setPositionDetail(eamBusinessOutbound.getPositionDetail()); + eamAssetLogService.add(eamBusinessOutbound.getBusinessId(), DetectTypeEnum.OUTBOUND, DetectTypeEnum.OUTBOUND.getInfo(), e.getAssetId(), getUserId()); + }); + assetService.updateBatchById(assetList); + eamBusinessOutbound.setStatus(BusinessStatusEnum.COMPLETED.getCode()); + } + + return eamBusinessOutboundService.save(eamBusinessOutbound) ? success() : error(); + } + + /** + * 修改数据 + */ + @PostMapping("/update") + @ApiOperation(value = "修改数据") + public Result update(@Validated @RequestBody EamBusinessOutboundDto eamBusinessOutboundDto) { +// if (eamBusinessOutboundService.isCompleted(eamBusinessOutboundDto.getId())){ +// return error("业务状态错误,业务已完成,内容不允许修改!"); +// } + EamBusinessOutbound eamBusinessOutbound = new EamBusinessOutbound(); + BeanUtils.copyProperties(eamBusinessOutboundDto, eamBusinessOutbound); + eamBusinessOutbound.setUpdateUser(getUserId()); + + eamBusinessOutboundDto.getAssetIdList().forEach(e -> e.setWarehouseId(eamBusinessOutboundDto.getWarehouseId())); + eamBusinessOutbound.setAssetIdList(JSON.toJSONString(eamBusinessOutboundDto.getAssetIdList())); + return eamBusinessOutboundService.updateById(eamBusinessOutbound) ? success() : error(); + } + + /** + * 删除数据 + */ + @PostMapping("/delete") + @ApiOperation(value = "删除数据") + public Result delete(@RequestBody List idList) { + return eamBusinessOutboundService.removeBatchByIds(idList) ? success() : error(); + } + + @PostMapping("/confirm") + @ApiOperation(value = "确认") + public Result confirm(@RequestBody List idList) { + return error("接口已删除,二期取消确认步骤"); +// List eamBusinessOutbounds = eamBusinessOutboundService.listByIds(idList); +// +// for (EamBusinessOutbound eamBusinessOutbound : eamBusinessOutbounds) { +// if (eamBusinessOutbound.getStatus().equals(BusinessStatusEnum.COMPLETED.getCode())) { +// return error("业务状态错误,业务已完成,确认失败! 业务名称: " + eamBusinessOutbound.getName() + " 业务编号: " + eamBusinessOutbound.getBusinessId()); +// } +// List assetIdList = JSON.parseArray(eamBusinessOutbound.getAssetIdList(), EamWarehouseAssetDto.class); +// if (assetIdList != null && !assetIdList.isEmpty()) { +// if(!eamWarehouseAssetService.reduce(assetIdList)){ +// return error("库存不足!"); +// } +// List assetList = assetService.listByIds(assetIdList.stream().map(EamWarehouseAssetDto::getAssetId).distinct().collect(Collectors.toList())); +// assetList.forEach(e -> { +// e.setWarehouseId(eamBusinessOutbound.getWarehouseId()); +// e.setOwnCompanyId(eamBusinessOutbound.getOwnCompanyId()); +// e.setUseOrganizationId(eamBusinessOutbound.getUseOrganizationId()); +// e.setUseUserId(eamBusinessOutbound.getUseUserId()); +// e.setPositionDetail(eamBusinessOutbound.getPositionDetail()); +// eamAssetLogService.add(eamBusinessOutbound.getBusinessId(), DetectTypeEnum.OUTBOUND, DetectTypeEnum.OUTBOUND.getInfo(), e.getAssetId(), getUserId()); +// }); +// assetService.updateBatchById(assetList); +// eamBusinessOutbound.setStatus(BusinessStatusEnum.COMPLETED.getCode()); +// } +// } +// +// eamBusinessOutboundService.updateBatchById(eamBusinessOutbounds); +// return success(); + } +} + diff --git a/system/src/main/java/com/yyy/system/controller/EamBusinessRetirementController.java b/system/src/main/java/com/yyy/system/controller/EamBusinessRetirementController.java new file mode 100644 index 0000000..7324b45 --- /dev/null +++ b/system/src/main/java/com/yyy/system/controller/EamBusinessRetirementController.java @@ -0,0 +1,187 @@ +package com.yyy.system.controller; + + +import com.alibaba.fastjson.JSON; +import com.yyy.common.core.controller.BaseController; +import com.yyy.common.core.domain.Result; +import com.yyy.common.core.page.TableDataInfo; +import com.yyy.common.enums.AssetStatusEnum; +import com.yyy.common.enums.BusinessStatusEnum; +import com.yyy.common.enums.DetectTypeEnum; +import com.yyy.common.enums.EncodingEum; +import com.yyy.common.utils.bean.BeanUtils; +import com.yyy.system.entity.dto.EamWarehouseAssetDto; +import com.yyy.system.entity.pojo.EamAsset; +import com.yyy.system.entity.pojo.EamBusinessRetirement; +import com.yyy.system.entity.dto.EamBusinessRetirementDto; +import com.yyy.system.entity.vo.EamBusinessRetirementVo; +import com.yyy.system.service.EamAssetLogService; +import com.yyy.system.service.EamAssetService; +import com.yyy.system.service.EamBusinessRetirementService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 资产报废(eam_business_retirement)表控制层 + * + * @author Fangy + * @since 2024-05-10 10:37:08 + */ +@RestController +@Api(tags = "资产报废相关接口") +@RequestMapping("api/eamBusinessRetirement") +public class EamBusinessRetirementController extends BaseController { + + private static final Logger logger = LoggerFactory.getLogger(EamBusinessRetirementController.class); + /** + * 服务对象 + */ + @Resource + private EamBusinessRetirementService eamBusinessRetirementService; + + @Resource + private EamAssetService assetService; + + @Resource + private EamAssetLogService eamAssetLogService; + + + /** + * 查询分页数据 + */ + @PostMapping("/list") + @ApiOperation(value = "查询分页数据") + public TableDataInfo list(@RequestBody EamBusinessRetirementDto eamBusinessRetirementDto) { + startPage(); + List list = eamBusinessRetirementService.query(eamBusinessRetirementDto); + return getDataTable(EamBusinessRetirementVo.ToVo(list)); + } + + /** + * 查询详情数据 + */ + @PostMapping("/query") + @ApiOperation(value = "查询详情数据") + public Result query(@RequestParam Long id) { + return success(EamBusinessRetirementVo.ToVo(eamBusinessRetirementService.getById(id))); + } + + /** + * 新增数据 + */ + @PostMapping("/add") + @ApiOperation(value = "新增数据") + public Result add(@Validated @RequestBody EamBusinessRetirementDto eamBusinessRetirementDto) { + EamBusinessRetirement eamBusinessRetirement = new EamBusinessRetirement(); + BeanUtils.copyProperties(eamBusinessRetirementDto, eamBusinessRetirement); + eamBusinessRetirement.setCreateUser(getUserId()); + eamBusinessRetirement.setApplicant(getUserId()); + eamBusinessRetirement.setBusinessId(EncodingEum.RETIREMENT.getBusinessId()); + eamBusinessRetirement.setStatus(BusinessStatusEnum.DRAFT.getCode()); + eamBusinessRetirement.setAssetIdList(JSON.toJSONString(eamBusinessRetirementDto.getAssetIdList())); + + List assetIdList = eamBusinessRetirementDto.getAssetIdList(); + if (assetIdList != null && !assetIdList.isEmpty()) { + List assetList = assetService.listByIds(assetIdList.stream().map(EamWarehouseAssetDto::getAssetId).distinct().collect(Collectors.toList())); + assetList.forEach(e -> { + e.setStatus(AssetStatusEnum.SCRAPPED.getCode()); + eamAssetLogService.add(eamBusinessRetirement.getBusinessId(), DetectTypeEnum.RETIREMENT, DetectTypeEnum.RETIREMENT.getInfo(), e.getAssetId(), getUserId()); + }); + assetService.updateBatchById(assetList); + // 已完成的条件?? + eamBusinessRetirement.setStatus(BusinessStatusEnum.COMPLETED.getCode()); + eamBusinessRetirement.setIsRetirement(1); + } + + return eamBusinessRetirementService.save(eamBusinessRetirement) ? success() : error(); + } + + /** + * 修改数据 + */ + @PostMapping("/update") + @ApiOperation(value = "修改数据") + public Result update(@Validated @RequestBody EamBusinessRetirementDto eamBusinessRetirementDto) { +// if (eamBusinessRetirementService.isCompleted(eamBusinessRetirementDto.getId())){ +// return error("业务状态错误,业务已完成,内容不允许修改!"); +// } + EamBusinessRetirement eamBusinessRetirement = new EamBusinessRetirement(); + BeanUtils.copyProperties(eamBusinessRetirementDto, eamBusinessRetirement); + eamBusinessRetirement.setUpdateUser(getUserId()); + + eamBusinessRetirement.setAssetIdList(JSON.toJSONString(eamBusinessRetirementDto.getAssetIdList())); + return eamBusinessRetirementService.updateById(eamBusinessRetirement) ? success() : error(); + } + + /** + * 删除数据 + */ + @PostMapping("/delete") + @ApiOperation(value = "删除数据") + public Result delete(@RequestBody List idList) { + return eamBusinessRetirementService.removeBatchByIds(idList) ? success() : error(); + } + + @PostMapping("/confirm") + @ApiOperation(value = "废弃") + public Result confirm(@RequestBody List idList) { + return error("接口已删除,二期取消确认步骤"); +// List list = eamBusinessRetirementService.listByIds(idList); +// for (EamBusinessRetirement x : list) { +// if (x.getIsRetirement().equals(1)) { +// return error("资产已报废,确认失败! 业务名称: " + x.getName() + " 业务编号: " + x.getBusinessId()); +// } +// List assetIdList = JSON.parseArray(x.getAssetIdList(), EamWarehouseAssetDto.class); +// if (assetIdList != null && !assetIdList.isEmpty()) { +// List assetList = assetService.listByIds(assetIdList.stream().map(EamWarehouseAssetDto::getAssetId).distinct().collect(Collectors.toList())); +// assetList.forEach(e -> { +// e.setStatus(AssetStatusEnum.SCRAPPED.getCode()); +// eamAssetLogService.add(x.getBusinessId(), DetectTypeEnum.RETIREMENT, DetectTypeEnum.RETIREMENT.getInfo(), e.getAssetId(), getUserId()); +// }); +// assetService.updateBatchById(assetList); +// //已完成的条件 +// x.setStatus(BusinessStatusEnum.COMPLETED.getCode()); +// x.setIsRetirement(1); +// } +// } +// +// eamBusinessRetirementService.updateBatchById(list); +// return success(); + } + + @PostMapping("/clean") + @ApiOperation(value = "清理") + public Result clean(@RequestBody List idList) { + List list = eamBusinessRetirementService.listByIds(idList); + for (EamBusinessRetirement x : list) { + if (x.getIsRetirement().equals(0)) { + return error("资产清理失败,请先进行报废操作! 业务名称: " + x.getName() + " 业务编号: " + x.getBusinessId()); + } + if (x.getIsClean().equals(1)) { + return error("资产已清理,确认失败! 业务名称: " + x.getName() + " 业务编号: " + x.getBusinessId()); + } + List assetIdList = JSON.parseArray(x.getAssetIdList(), EamWarehouseAssetDto.class); + if (assetIdList != null && !assetIdList.isEmpty()) { + List assetList = assetService.listByIds(assetIdList.stream().map(EamWarehouseAssetDto::getAssetId).distinct().collect(Collectors.toList())); + assetList.forEach(e -> { + e.setIsDeleted(1); + eamAssetLogService.add(x.getBusinessId(), DetectTypeEnum.CLEAN, DetectTypeEnum.CLEAN.getInfo(), e.getAssetId(), getUserId()); + }); + assetService.updateBatchById(assetList); + x.setIsClean(1); + } + } + + eamBusinessRetirementService.updateBatchById(list); + return success(); + } +} + diff --git a/system/src/main/java/com/yyy/system/controller/EamBusinessReturnController.java b/system/src/main/java/com/yyy/system/controller/EamBusinessReturnController.java new file mode 100644 index 0000000..c461794 --- /dev/null +++ b/system/src/main/java/com/yyy/system/controller/EamBusinessReturnController.java @@ -0,0 +1,169 @@ +package com.yyy.system.controller; + + +import com.alibaba.fastjson.JSON; +import com.yyy.common.core.controller.BaseController; +import com.yyy.common.core.domain.Result; +import com.yyy.common.core.page.TableDataInfo; +import com.yyy.common.enums.AssetStatusEnum; +import com.yyy.common.enums.BusinessStatusEnum; +import com.yyy.common.enums.DetectTypeEnum; +import com.yyy.common.enums.EncodingEum; +import com.yyy.common.utils.bean.BeanUtils; +import com.yyy.system.entity.dto.EamWarehouseAssetDto; +import com.yyy.system.entity.pojo.EamAsset; +import com.yyy.system.entity.pojo.EamBusinessReturn; +import com.yyy.system.entity.dto.EamBusinessReturnDto; +import com.yyy.system.entity.vo.EamBusinessReturnVo; +import com.yyy.system.service.EamAssetLogService; +import com.yyy.system.service.EamAssetService; +import com.yyy.system.service.EamBusinessReturnService; +import com.yyy.system.service.EamWarehouseAssetService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 归还信息表(eam_business_return)表控制层 + * + * @author Fangy + * @since 2024-04-10 17:26:46 + */ +@RestController +@Api(tags = "归还信息表相关接口") +@RequestMapping("api/eamBusinessReturn") +public class EamBusinessReturnController extends BaseController { + + private static final Logger logger = LoggerFactory.getLogger(EamBusinessReturnController.class); + /** + * 服务对象 + */ + @Resource + private EamBusinessReturnService eamBusinessReturnService; + + @Resource + private EamAssetService assetService; + + @Resource + private EamAssetLogService eamAssetLogService; + + @Resource + private EamWarehouseAssetService eamWarehouseAssetService; + + /** + * 查询分页数据 + */ + @PostMapping("/list") + @ApiOperation(value = "查询分页数据") + public TableDataInfo list(@RequestBody EamBusinessReturnDto eamBusinessReturnDto) { + startPage(); + List list = eamBusinessReturnService.query(eamBusinessReturnDto); + return getDataTable(EamBusinessReturnVo.ToVo(list)); + } + + /** + * 查询详情数据 + */ + @PostMapping("/query") + @ApiOperation(value = "查询详情数据") + public Result query(@RequestParam Long id) { + return success(EamBusinessReturnVo.ToVo(eamBusinessReturnService.getById(id))); + } + + /** + * 新增数据 + */ + @PostMapping("/add") + @ApiOperation(value = "新增数据") + public Result add(@Validated @RequestBody EamBusinessReturnDto eamBusinessReturnDto) { + EamBusinessReturn eamBusinessReturn = new EamBusinessReturn(); + BeanUtils.copyProperties(eamBusinessReturnDto, eamBusinessReturn); + eamBusinessReturn.setApplicant(getUserId()); + eamBusinessReturn.setCreateUser(getUserId()); + eamBusinessReturn.setBusinessId(EncodingEum.RETURN.getBusinessId()); + eamBusinessReturn.setStatus(BusinessStatusEnum.DRAFT.getCode()); + eamBusinessReturn.setAssetIdList(JSON.toJSONString(eamBusinessReturnDto.getAssetIdList())); + + List assetIdList = eamBusinessReturnDto.getAssetIdList(); + if (assetIdList != null && !assetIdList.isEmpty()) { + eamWarehouseAssetService.add(assetIdList); + List assetList = assetService.listByIds(assetIdList.stream().map(EamWarehouseAssetDto::getAssetId).distinct().collect(Collectors.toList())); + assetList.forEach(e -> { + e.setPositionId(eamBusinessReturn.getPositionId()); + e.setPositionDetail(eamBusinessReturn.getPositionDetail()); + e.setManager(eamBusinessReturn.getManager()); + e.setUseUserId(eamBusinessReturn.getUseUserId()); + e.setStatus(AssetStatusEnum.IN_USE.getCode()); + eamAssetLogService.add(eamBusinessReturn.getBusinessId(), DetectTypeEnum.RETURN, DetectTypeEnum.RETURN.getInfo(), e.getAssetId(), getUserId()); + }); + assetService.updateBatchById(assetList); + eamBusinessReturn.setStatus(BusinessStatusEnum.COMPLETED.getCode()); + } + return eamBusinessReturnService.save(eamBusinessReturn) ? success() : error(); + } + + /** + * 修改数据 + */ + @PostMapping("/update") + @ApiOperation(value = "修改数据") + public Result update(@Validated @RequestBody EamBusinessReturnDto eamBusinessReturnDto) { +// if (eamBusinessReturnService.isCompleted(eamBusinessReturnDto.getId())){ +// return error("业务状态错误,业务已完成,内容不允许修改!"); +// } + EamBusinessReturn eamBusinessReturn = new EamBusinessReturn(); + BeanUtils.copyProperties(eamBusinessReturnDto, eamBusinessReturn); + eamBusinessReturn.setUpdateUser(getUserId()); + + eamBusinessReturn.setAssetIdList(JSON.toJSONString(eamBusinessReturnDto.getAssetIdList())); + return eamBusinessReturnService.updateById(eamBusinessReturn) ? success() : error(); + } + + /** + * 删除数据 + */ + @PostMapping("/delete") + @ApiOperation(value = "删除数据") + public Result delete(@RequestBody List idList) { + return eamBusinessReturnService.removeBatchByIds(idList) ? success() : error(); + } + + @PostMapping("/confirm") + @ApiOperation(value = "确认") + public Result confirm(@RequestBody List idList) { + return error("接口已删除,二期取消确认步骤"); +// List list = eamBusinessReturnService.listByIds(idList); +// +// for (EamBusinessReturn x : list) { +// if (x.getStatus().equals(BusinessStatusEnum.COMPLETED.getCode())) { +// return error("业务状态错误,业务已完成,确认失败! 业务名称: " + x.getName() + " 业务编号: " + x.getBusinessId()); +// } +// List assetIdList = JSON.parseArray(x.getAssetIdList(), EamWarehouseAssetDto.class); +// if (assetIdList != null && !assetIdList.isEmpty()) { +// eamWarehouseAssetService.add(assetIdList); +// List assetList = assetService.listByIds(assetIdList.stream().map(EamWarehouseAssetDto::getAssetId).distinct().collect(Collectors.toList())); +// assetList.forEach(e -> { +// e.setPositionId(x.getPositionId()); +// e.setPositionDetail(x.getPositionDetail()); +// e.setManager(x.getManager()); +// e.setUseUserId(x.getUseUserId()); +// e.setStatus(AssetStatusEnum.IN_USE.getCode()); +// eamAssetLogService.add(x.getBusinessId(), DetectTypeEnum.RETURN, DetectTypeEnum.RETURN.getInfo(), e.getAssetId(), getUserId()); +// }); +// assetService.updateBatchById(assetList); +// x.setStatus(BusinessStatusEnum.COMPLETED.getCode()); +// } +// } +// +// eamBusinessReturnService.updateBatchById(list); +// return success(); + } +} + diff --git a/system/src/main/java/com/yyy/system/controller/EamBusinessReturnInventoryController.java b/system/src/main/java/com/yyy/system/controller/EamBusinessReturnInventoryController.java new file mode 100644 index 0000000..97a3258 --- /dev/null +++ b/system/src/main/java/com/yyy/system/controller/EamBusinessReturnInventoryController.java @@ -0,0 +1,135 @@ +package com.yyy.system.controller; + + +import com.alibaba.fastjson.JSON; +import com.yyy.common.core.controller.BaseController; +import com.yyy.common.core.domain.Result; +import com.yyy.common.core.page.TableDataInfo; +import com.yyy.common.enums.BusinessStatusEnum; +import com.yyy.common.enums.DetectTypeEnum; +import com.yyy.common.enums.EncodingEum; +import com.yyy.common.utils.bean.BeanUtils; +import com.yyy.system.entity.dto.EamWarehouseAssetDto; +import com.yyy.system.entity.pojo.EamAsset; +import com.yyy.system.entity.pojo.EamBusinessReturnInventory; +import com.yyy.system.entity.dto.EamBusinessReturnInventoryDto; +import com.yyy.system.entity.vo.EamBusinessReturnInventoryVo; +import com.yyy.system.service.EamAssetLogService; +import com.yyy.system.service.EamAssetService; +import com.yyy.system.service.EamBusinessReturnInventoryService; +import com.yyy.system.service.EamWarehouseAssetService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 退库信息表(eam_business_return_inventory)表控制层 + * + * @author Fangy + * @since 2024-04-12 11:10:52 + */ +@RestController +@Api(tags = "退库信息表相关接口") +@RequestMapping("api/eamBusinessReturnInventory") +public class EamBusinessReturnInventoryController extends BaseController { + + private static final Logger logger = LoggerFactory.getLogger(EamBusinessReturnInventoryController.class); + /** + * 服务对象 + */ + @Resource + private EamBusinessReturnInventoryService eamBusinessReturnInventoryService; + + @Resource + private EamAssetService eamAssetService; + + @Resource + private EamAssetLogService eamAssetLogService; + + @Resource + private EamWarehouseAssetService eamWarehouseAssetService; + + /** + * 查询分页数据 + */ + @PostMapping("/list") + @ApiOperation(value = "查询分页数据") + public TableDataInfo list(@RequestBody EamBusinessReturnInventoryDto eamBusinessReturnInventoryDto) { + startPage(); + List list = eamBusinessReturnInventoryService.query(eamBusinessReturnInventoryDto); + return getDataTable(EamBusinessReturnInventoryVo.ToVo(list)); + } + + /** + * 查询详情数据 + */ + @PostMapping("/query") + @ApiOperation(value = "查询详情数据") + public Result query(@RequestParam Long id) { + return success(EamBusinessReturnInventoryVo.ToVo(eamBusinessReturnInventoryService.getById(id))); + } + + /** + * 新增数据 + */ + @PostMapping("/add") + @ApiOperation(value = "新增数据") + public Result add(@Validated @RequestBody EamBusinessReturnInventoryDto eamBusinessReturnInventoryDto) { + EamBusinessReturnInventory eamBusinessReturnInventory = new EamBusinessReturnInventory(); + BeanUtils.copyProperties(eamBusinessReturnInventoryDto, eamBusinessReturnInventory); + eamBusinessReturnInventory.setApplicant(getUserId()); + eamBusinessReturnInventory.setCreateUser(getUserId()); + eamBusinessReturnInventory.setBusinessId(EncodingEum.RETURN_INVENTORY.getBusinessId()); + eamBusinessReturnInventory.setStatus(BusinessStatusEnum.DRAFT.getCode()); + eamBusinessReturnInventoryDto.getAssetIdList().forEach(e -> e.setWarehouseId(eamBusinessReturnInventoryDto.getWarehouseId())); + eamBusinessReturnInventory.setAssetIdList(JSON.toJSONString(eamBusinessReturnInventoryDto.getAssetIdList())); + + List assetIdList = eamBusinessReturnInventoryDto.getAssetIdList(); + if (assetIdList != null && !assetIdList.isEmpty()) { + eamWarehouseAssetService.add(assetIdList); + List assetList = eamAssetService.listByIds(assetIdList.stream().map(EamWarehouseAssetDto::getAssetId).distinct().collect(Collectors.toList())); + assetList.forEach(e -> { + e.setUseOrganizationId(eamBusinessReturnInventory.getUseOrganizationId()); + e.setPositionId(eamBusinessReturnInventory.getPositionId()); + e.setPositionDetail(eamBusinessReturnInventory.getPositionDetail()); + e.setWarehouseId(eamBusinessReturnInventory.getWarehouseId()); + eamAssetLogService.add(eamBusinessReturnInventory.getBusinessId(), DetectTypeEnum.RETURN_INVENTORY, DetectTypeEnum.RETURN_INVENTORY.getInfo(), e.getAssetId(), getUserId()); + }); + eamAssetService.updateBatchById(assetList); + eamBusinessReturnInventory.setStatus(BusinessStatusEnum.COMPLETED.getCode()); + } + + return eamBusinessReturnInventoryService.save(eamBusinessReturnInventory) ? success() : error(); + } + + /** + * 修改数据 + */ + @PostMapping("/update") + @ApiOperation(value = "修改数据") + public Result update(@Validated @RequestBody EamBusinessReturnInventoryDto eamBusinessReturnInventoryDto) { + EamBusinessReturnInventory eamBusinessReturnInventory = new EamBusinessReturnInventory(); + BeanUtils.copyProperties(eamBusinessReturnInventoryDto, eamBusinessReturnInventory); + eamBusinessReturnInventory.setUpdateUser(getUserId()); + eamBusinessReturnInventoryDto.getAssetIdList().forEach(e -> e.setWarehouseId(eamBusinessReturnInventoryDto.getWarehouseId())); + eamBusinessReturnInventory.setAssetIdList(JSON.toJSONString(eamBusinessReturnInventoryDto.getAssetIdList())); + return eamBusinessReturnInventoryService.updateById(eamBusinessReturnInventory) ? success() : error(); + } + + /** + * 删除数据 + */ + @PostMapping("/delete") + @ApiOperation(value = "删除数据") + public Result delete(@RequestBody List idList) { + return eamBusinessReturnInventoryService.removeBatchByIds(idList) ? success() : error(); + } +} + diff --git a/system/src/main/java/com/yyy/system/controller/EamBusinessStorageController.java b/system/src/main/java/com/yyy/system/controller/EamBusinessStorageController.java new file mode 100644 index 0000000..360ab29 --- /dev/null +++ b/system/src/main/java/com/yyy/system/controller/EamBusinessStorageController.java @@ -0,0 +1,188 @@ +package com.yyy.system.controller; + + +import com.alibaba.fastjson.JSON; +import com.yyy.common.core.controller.BaseController; +import com.yyy.common.core.domain.Result; +import com.yyy.common.core.page.TableDataInfo; +import com.yyy.common.enums.AssetStatusEnum; +import com.yyy.common.enums.BusinessStatusEnum; +import com.yyy.common.enums.DetectTypeEnum; +import com.yyy.common.enums.EncodingEum; +import com.yyy.common.utils.bean.BeanUtils; +import com.yyy.common.utils.common.DateUtils; +import com.yyy.system.entity.dto.EamWarehouseAssetDto; +import com.yyy.system.entity.dto.EamWarehouseInventoryDto; +import com.yyy.system.entity.pojo.EamAsset; +import com.yyy.system.entity.pojo.EamBusinessStorage; +import com.yyy.system.entity.dto.EamBusinessStorageDto; +import com.yyy.system.entity.pojo.EamWarehouseInventory; +import com.yyy.system.entity.vo.EamBusinessStorageVo; +import com.yyy.system.entity.vo.EamWarehouseInventoryVo; +import com.yyy.system.service.EamAssetLogService; +import com.yyy.system.service.EamAssetService; +import com.yyy.system.service.EamBusinessStorageService; +import com.yyy.system.service.EamWarehouseAssetService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 入库信息表(eam_business_storage)表控制层 + * + * @author Fangy + * @since 2024-04-11 10:18:14 + */ +@RestController +@Api(tags = "入库信息表相关接口") +@RequestMapping("api/eamBusinessStorage") +public class EamBusinessStorageController extends BaseController { + + private static final Logger logger = LoggerFactory.getLogger(EamBusinessStorageController.class); + /** + * 服务对象 + */ + @Resource + private EamBusinessStorageService eamBusinessStorageService; + + @Resource + private EamAssetService eamAssetService; + + @Resource + private EamAssetLogService eamAssetLogService; + + @Resource + private EamWarehouseAssetService eamWarehouseAssetService; + + /** + * 查询分页数据 + */ + @PostMapping("/list") + @ApiOperation(value = "查询分页数据") + public TableDataInfo list(@RequestBody EamBusinessStorageDto eamBusinessStorageDto) { + startPage(); + List list = eamBusinessStorageService.query(eamBusinessStorageDto); + return getDataTable(EamBusinessStorageVo.ToVo(list)); + } + + /** + * 查询详情数据 + */ + @PostMapping("/query") + @ApiOperation(value = "查询详情数据") + public Result query(@RequestParam Long id) { + return success(EamBusinessStorageVo.ToVo(eamBusinessStorageService.getById(id))); + } + + /** + * 新增数据 + */ + @PostMapping("/add") + @ApiOperation(value = "新增数据") + public Result add(@Validated @RequestBody EamBusinessStorageDto eamBusinessStorageDto) { + EamBusinessStorage eamBusinessStorage = new EamBusinessStorage(); + BeanUtils.copyProperties(eamBusinessStorageDto, eamBusinessStorage); + eamBusinessStorage.setCreateUser(getUserId()); + eamBusinessStorage.setBusinessId(EncodingEum.STORAGE.getBusinessId()); + eamBusinessStorage.setStatus(BusinessStatusEnum.DRAFT.getCode()); + eamBusinessStorageDto.getAssetIdList().forEach(e -> e.setWarehouseId(eamBusinessStorageDto.getWarehouseId())); + eamBusinessStorage.setAssetIdList(JSON.toJSONString(eamBusinessStorageDto.getAssetIdList())); + + List assetIdList = eamBusinessStorageDto.getAssetIdList(); + if (assetIdList != null && !assetIdList.isEmpty()) { + eamWarehouseAssetService.add(assetIdList); + List eamAssetList = eamAssetService.listByIds(assetIdList.stream().map(EamWarehouseAssetDto::getAssetId).distinct().collect(Collectors.toList())); + eamAssetList.forEach(e -> { + e.setStatus(AssetStatusEnum.INVENTORY.getCode()); + e.setWarehouseId(eamBusinessStorage.getWarehouseId()); + e.setManager(eamBusinessStorage.getManager()); + e.setPositionId(eamBusinessStorage.getPositionId()); + e.setSupplierVendorId(eamBusinessStorage.getSupplierVendorId()); + e.setCreateTime(eamBusinessStorage.getCreateTime() != null ? eamBusinessStorage.getCreateTime() : DateUtils.getNowDate()); + eamAssetLogService.add(eamBusinessStorage.getBusinessId(), DetectTypeEnum.STORAGE, DetectTypeEnum.STORAGE.getInfo(), e.getAssetId(), getUserId()); + }); + eamAssetService.updateBatchById(eamAssetList); + eamBusinessStorage.setStatus(BusinessStatusEnum.COMPLETED.getCode()); + } + + return eamBusinessStorageService.save(eamBusinessStorage) ? success() : error(); + } + + /** + * 修改数据 + */ + @PostMapping("/update") + @ApiOperation(value = "修改数据") + public Result update(@Validated @RequestBody EamBusinessStorageDto eamBusinessStorageDto) { +// if (eamBusinessStorageService.isCompleted(eamBusinessStorageDto.getId())){ +// return error("业务状态错误,业务已完成,内容不允许修改!"); +// } + EamBusinessStorage eamBusinessStorage = new EamBusinessStorage(); + BeanUtils.copyProperties(eamBusinessStorageDto, eamBusinessStorage); + eamBusinessStorage.setUpdateUser(getUserId()); + + eamBusinessStorageDto.getAssetIdList().forEach(e -> e.setWarehouseId(eamBusinessStorageDto.getWarehouseId())); + eamBusinessStorage.setAssetIdList(JSON.toJSONString(eamBusinessStorageDto.getAssetIdList())); + return eamBusinessStorageService.updateById(eamBusinessStorage) ? success() : error(); + } + + /** + * 删除数据 + */ + @PostMapping("/delete") + @ApiOperation(value = "删除数据") + public Result delete(@RequestBody List idList) { + return eamBusinessStorageService.removeBatchByIds(idList) ? success() : error(); + } + + /** + * @param idList + * @return + */ + @PostMapping("/confirm") + @ApiOperation(value = "确认") + public Result confirm(@RequestBody List idList) { + return error("接口已删除,二期取消确认步骤"); +// List eamBusinessStorages = eamBusinessStorageService.listByIds(idList); +// for (EamBusinessStorage eamBusinessStorage : eamBusinessStorages) { +// if (eamBusinessStorage.getStatus().equals(BusinessStatusEnum.COMPLETED.getCode())) { +// return error("业务状态错误,业务已完成,确认失败! 业务名称: " + eamBusinessStorage.getName() + " 业务编号: " + eamBusinessStorage.getBusinessId()); +// } +// List assetIdList = JSON.parseArray(eamBusinessStorage.getAssetIdList(), EamWarehouseAssetDto.class); +// if (assetIdList != null && !assetIdList.isEmpty()) { +// eamWarehouseAssetService.add(assetIdList); +// List eamAssetList = eamAssetService.listByIds(assetIdList.stream().map(EamWarehouseAssetDto::getAssetId).distinct().collect(Collectors.toList())); +// eamAssetList.forEach(e -> { +// e.setStatus(AssetStatusEnum.INVENTORY.getCode()); +// e.setWarehouseId(eamBusinessStorage.getWarehouseId()); +// e.setManager(eamBusinessStorage.getManager()); +// e.setPositionId(eamBusinessStorage.getPositionId()); +// e.setSupplierVendorId(eamBusinessStorage.getSupplierVendorId()); +// e.setCreateTime(eamBusinessStorage.getCreateTime() != null ? eamBusinessStorage.getCreateTime() : DateUtils.getNowDate()); +// eamAssetLogService.add(eamBusinessStorage.getBusinessId(), DetectTypeEnum.STORAGE, DetectTypeEnum.STORAGE.getInfo(), e.getAssetId(), getUserId()); +// }); +// eamAssetService.updateBatchById(eamAssetList); +// eamBusinessStorage.setStatus(BusinessStatusEnum.COMPLETED.getCode()); +// } +// } +// +// eamBusinessStorageService.updateBatchById(eamBusinessStorages); +// return success(); + } + + @PostMapping("/warehouse/list") + @ApiOperation(value = "查询库存列表") + public TableDataInfo warehouseList(@RequestBody EamWarehouseInventoryDto eamWarehouseInventoryDto) { + startPage(); + List list = eamAssetService.queryWarehouseInventoryStorage(eamWarehouseInventoryDto); + return getDataTable(EamWarehouseInventoryVo.ToVo(list)); + } +} + diff --git a/system/src/main/java/com/yyy/system/controller/EamBusinessTransferController.java b/system/src/main/java/com/yyy/system/controller/EamBusinessTransferController.java new file mode 100644 index 0000000..0e00ac2 --- /dev/null +++ b/system/src/main/java/com/yyy/system/controller/EamBusinessTransferController.java @@ -0,0 +1,174 @@ +package com.yyy.system.controller; + + +import com.alibaba.fastjson.JSON; +import com.yyy.common.core.controller.BaseController; +import com.yyy.common.core.domain.Result; +import com.yyy.common.core.page.TableDataInfo; +import com.yyy.common.enums.BusinessStatusEnum; +import com.yyy.common.enums.DetectTypeEnum; +import com.yyy.common.enums.EncodingEum; +import com.yyy.common.utils.bean.BeanUtils; +import com.yyy.system.entity.dto.EamWarehouseAssetDto; +import com.yyy.system.entity.pojo.EamAsset; +import com.yyy.system.entity.pojo.EamBusinessTransfer; +import com.yyy.system.entity.dto.EamBusinessTransferDto; +import com.yyy.system.entity.vo.EamBusinessTransferVo; +import com.yyy.system.service.EamAssetLogService; +import com.yyy.system.service.EamAssetService; +import com.yyy.system.service.EamBusinessTransferService; +import com.yyy.system.service.EamWarehouseAssetService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 资产转移信息表(eam_business_transfer)表控制层 + * + * @author Fangy + * @since 2024-04-10 17:26:46 + */ +@RestController +@Api(tags = "资产转移信息表相关接口") +@RequestMapping("api/eamBusinessTransfer") +public class EamBusinessTransferController extends BaseController { + + private static final Logger logger = LoggerFactory.getLogger(EamBusinessTransferController.class); + /** + * 服务对象 + */ + @Resource + private EamBusinessTransferService eamBusinessTransferService; + + @Resource + private EamAssetService eamAssetService; + + @Resource + private EamAssetLogService eamAssetLogService; + + @Resource + private EamWarehouseAssetService eamWarehouseAssetService; + + /** + * 查询分页数据 + */ + @PostMapping("/list") + @ApiOperation(value = "查询分页数据") + public TableDataInfo list(@RequestBody EamBusinessTransferDto eamBusinessTransferDto) { + startPage(); + List list = eamBusinessTransferService.query(eamBusinessTransferDto); + return getDataTable(EamBusinessTransferVo.ToVo(list)); + } + + /** + * 查询详情数据 + */ + @PostMapping("/query") + @ApiOperation(value = "查询详情数据") + public Result query(@RequestParam Long id) { + return success(EamBusinessTransferVo.ToVo(eamBusinessTransferService.getById(id))); + } + + /** + * 新增数据 + */ + @PostMapping("/add") + @ApiOperation(value = "新增数据") + public Result add(@Validated @RequestBody EamBusinessTransferDto eamBusinessTransferDto) { + EamBusinessTransfer eamBusinessTransfer = new EamBusinessTransfer(); + BeanUtils.copyProperties(eamBusinessTransferDto, eamBusinessTransfer); + eamBusinessTransfer.setCreateUser(getUserId()); + eamBusinessTransfer.setBusinessId(EncodingEum.TRANSFER.getBusinessId()); + eamBusinessTransfer.setStatus(BusinessStatusEnum.DRAFT.getCode()); + eamBusinessTransfer.setAssetIdList(JSON.toJSONString(eamBusinessTransferDto.getAssetIdList())); + + + List assetIdList = eamBusinessTransferDto.getAssetIdList(); + if (assetIdList != null && !assetIdList.isEmpty()) { + if (eamWarehouseAssetService.reduceVerify(assetIdList)){ + eamWarehouseAssetService.reduce(assetIdList); + }else { + return error("库存不足!"); + } + List assetList = eamAssetService.listByIds(assetIdList.stream().map(EamWarehouseAssetDto::getAssetId).distinct().collect(Collectors.toList())); + assetList.forEach(e -> { + e.setPositionId(eamBusinessTransfer.getPositionId()); + e.setPositionDetail(eamBusinessTransfer.getPositionDetail()); + e.setManager(eamBusinessTransfer.getManagerId()); + e.setUseUserId(eamBusinessTransfer.getUseUserId()); + e.setUseOrganizationId(eamBusinessTransfer.getInUseOrganizationId()); + eamAssetLogService.add(eamBusinessTransfer.getBusinessId(), DetectTypeEnum.TRANSFER, DetectTypeEnum.TRANSFER.getInfo(), e.getAssetId(), getUserId()); + }); + eamAssetService.updateBatchById(assetList); + eamBusinessTransfer.setStatus(BusinessStatusEnum.COMPLETED.getCode()); + } + + return eamBusinessTransferService.save(eamBusinessTransfer) ? success() : error(); + } + + /** + * 修改数据 + */ + @PostMapping("/update") + @ApiOperation(value = "修改数据") + public Result update(@Validated @RequestBody EamBusinessTransferDto eamBusinessTransferDto) { +// if (eamBusinessTransferService.isCompleted(eamBusinessTransferDto.getId())){ +// return error("业务状态错误,业务已完成,内容不允许修改!"); +// } + EamBusinessTransfer eamBusinessTransfer = new EamBusinessTransfer(); + BeanUtils.copyProperties(eamBusinessTransferDto, eamBusinessTransfer); + eamBusinessTransfer.setUpdateUser(getUserId()); + + eamBusinessTransfer.setAssetIdList(JSON.toJSONString(eamBusinessTransferDto.getAssetIdList())); + return eamBusinessTransferService.updateById(eamBusinessTransfer) ? success() : error(); + } + + /** + * 删除数据 + */ + @PostMapping("/delete") + @ApiOperation(value = "删除数据") + public Result delete(@RequestBody List idList) { + return eamBusinessTransferService.removeBatchByIds(idList) ? success() : error(); + } + + @PostMapping("/confirm") + @ApiOperation(value = "确认") + public Result confirm(@RequestBody List idList) { + return error("接口已删除,二期取消确认步骤"); +// List list = eamBusinessTransferService.listByIds(idList); +// for (EamBusinessTransfer x : list) { +// if (x.getStatus().equals(BusinessStatusEnum.COMPLETED.getCode())) { +// return error("业务状态错误,业务已完成,确认失败! 业务名称: " + x.getName() + " 业务编号: " + x.getBusinessId()); +// } +// List assetIdList = JSON.parseArray(x.getAssetIdList(), EamWarehouseAssetDto.class); +// if (assetIdList != null && !assetIdList.isEmpty()) { +// if(!eamWarehouseAssetService.reduce(assetIdList)){ +// return error("库存不足!"); +// } +// List assetList = eamAssetService.listByIds(assetIdList.stream().map(EamWarehouseAssetDto::getAssetId).distinct().collect(Collectors.toList())); +// assetList.forEach(e -> { +// e.setPositionId(x.getPositionId()); +// e.setPositionDetail(x.getPositionDetail()); +// e.setManager(x.getManagerId()); +// e.setUseUserId(x.getUseUserId()); +// e.setUseOrganizationId(x.getInUseOrganizationId()); +// eamAssetLogService.add(x.getBusinessId(), DetectTypeEnum.TRANSFER, DetectTypeEnum.TRANSFER.getInfo(), e.getAssetId(), getUserId()); +// }); +// eamAssetService.updateBatchById(assetList); +// x.setStatus(BusinessStatusEnum.COMPLETED.getCode()); +// } +// } +// +// eamBusinessTransferService.updateBatchById(list); +// return success(); + } +} + diff --git a/system/src/main/java/com/yyy/system/controller/EamDeviceController.java b/system/src/main/java/com/yyy/system/controller/EamDeviceController.java new file mode 100644 index 0000000..da6433d --- /dev/null +++ b/system/src/main/java/com/yyy/system/controller/EamDeviceController.java @@ -0,0 +1,185 @@ +package com.yyy.system.controller; + +import com.yyy.common.core.controller.BaseController; +import com.yyy.common.core.domain.Result; +import com.yyy.common.core.page.TableDataInfo; +import com.yyy.common.enums.DetectTypeEnum; +import com.yyy.common.enums.EncodingEum; +import com.yyy.common.utils.chart.ChartValue; +import com.yyy.kernel.service.DeviceService; +import com.yyy.system.entity.dto.EamAssetLogDto; +import com.yyy.system.entity.dto.EamAssetQueryDto; +import com.yyy.system.entity.pojo.EamAsset; +import com.yyy.system.entity.pojo.EamAssetLog; +import com.yyy.system.entity.vo.DeviceVo; +import com.yyy.system.entity.vo.EamAssetVo; +import com.yyy.system.service.EamAssetLogService; +import com.yyy.system.service.EamAssetService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; + +@RestController +@Api(tags = "设备开关机") +@RequestMapping("api/v2/device") +public class EamDeviceController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(EamDeviceController.class); + + @Resource + private EamAssetService eamAssetService; + + @Resource + private DeviceService deviceService; + + @Resource + private EamAssetLogService eamAssetLogService; + + /** + * 查询分页数据 + */ + @PostMapping("/list") + @ApiOperation(value = "查询分页数据") + public TableDataInfo list(@RequestBody EamAssetQueryDto eamAssetQueryDto) { + startPage(); + List list = eamAssetService.query(eamAssetQueryDto); + return getDataTable(DeviceVo.ToVos(list)); + } + + /** + * 查询详情数据 + */ + @PostMapping("/query") + @ApiOperation(value = "查询详情数据") + public Result query(@RequestParam Long id) { + return success(DeviceVo.ToVo(eamAssetService.getById(id))); + } + + /** + * 批量开机 + */ + @PostMapping("/on") + @ApiOperation(value = "批量开机") + public Result on(@RequestBody List idList) { + List assetList = eamAssetService.listByIds(idList); + if (CollectionUtils.isEmpty(assetList)) { + return error(); + } + String operationType = EncodingEum.ON.getInfo(); + String operationInfo = EncodingEum.ON.getInfo(); + Long createUser = getUserId(); + List assetLogList = new ArrayList<>(); + List errorList = new ArrayList<>(); + for (EamAsset asset : assetList) { + if (deviceService.openDevice(asset.getSerialNumber())) { + assetLogList.add(EamAssetLog.builder().businessId(EncodingEum.ON.getBusinessId()).operationType(operationType).operationNotes(operationInfo).assetId(asset.getAssetId()).createUser(createUser).isDeleted(0).build()); + }else { + errorList.add(asset.getName()); + } + } + if (assetList.size() > 0) { + eamAssetLogService.saveBatch(assetLogList); + } + if (errorList.size()>0){ + return error("以下设备开机失败:" + errorList.toString() + " \n 请检查设备是否已开机或已关机、设备SN码是否正确"); + } + return success(); + + } + + /** + * 批量关机 + */ + @PostMapping("/off") + @ApiOperation(value = "批量关机") + public boolean off(@RequestBody List idList) { + List assetList = eamAssetService.listByIds(idList); + if (CollectionUtils.isEmpty(assetList)) { + return false; + } + String operationType = EncodingEum.OFF.getInfo(); + String operationInfo = EncodingEum.OFF.getInfo(); + Long createUser = getUserId(); + + List assetLogList = new ArrayList<>(); + for (EamAsset asset : assetList) { + if (deviceService.closeDevice(asset.getSerialNumber())) { + assetLogList.add(EamAssetLog.builder().businessId(EncodingEum.OFF.getBusinessId()).operationType(operationType).operationNotes(operationInfo).assetId(asset.getAssetId()).createUser(createUser).isDeleted(0).build()); + } + } + if (assetList.size() > 0) { + eamAssetLogService.saveBatch(assetLogList); + } + return true; + } + + /** + * 批量开机 + */ + @PostMapping("/open/on") + @ApiOperation(value = "批量开机 (开放给外部系统使用,不需要鉴权)") + public boolean openOn(@RequestBody List snList) { + List assetList = eamAssetService.listBySNList(snList); + if (CollectionUtils.isEmpty(assetList)) { + return false; + } + String operationType = EncodingEum.ON.getInfo(); + String operationInfo = EncodingEum.ON.getInfo(); + Long createUser = 1L; + List assetLogList = new ArrayList<>(); + for (EamAsset asset : assetList) { + if (deviceService.openDevice(asset.getSerialNumber())) { + assetLogList.add(EamAssetLog.builder().businessId(EncodingEum.ON.getBusinessId()).operationType(operationType).operationNotes(operationInfo).assetId(asset.getAssetId()).createUser(createUser).isDeleted(0).build()); + } + } + if (assetList.size() > 0) { + eamAssetLogService.saveBatch(assetLogList); + } + return true; + } + + /** + * 批量关机 + */ + @PostMapping("/open/off") + @ApiOperation(value = "批量关机 (开放给外部系统使用,不需要鉴权)") + public boolean openOff(@RequestBody List snList) { + List assetList = eamAssetService.listBySNList(snList); + if (CollectionUtils.isEmpty(assetList)) { + return false; + } + String operationType = EncodingEum.OFF.getInfo(); + String operationInfo = EncodingEum.OFF.getInfo(); + Long createUser = 1L; + List assetLogList = new ArrayList<>(); + for (EamAsset asset : assetList) { + if (deviceService.closeDevice(asset.getSerialNumber())) { + assetLogList.add(EamAssetLog.builder().businessId(EncodingEum.OFF.getBusinessId()).operationType(operationType).operationNotes(operationInfo).assetId(asset.getAssetId()).createUser(createUser).isDeleted(0).build()); + } + } + if (assetList.size() > 0) { + eamAssetLogService.saveBatch(assetLogList); + } + return true; + } + + @PostMapping("/record") + @ApiOperation(value = "开关机记录") + public Result> record(@RequestParam Long id) { + List onLogs = eamAssetLogService.query(EamAssetLogDto.builder().assetId(id).operationType(DetectTypeEnum.ON.getInfo()).build()); + List offLogs = eamAssetLogService.query(EamAssetLogDto.builder().assetId(id).operationType(DetectTypeEnum.OFF.getInfo()).build()); + List result = new ArrayList<>(); + result.addAll(onLogs); + result.addAll(offLogs); + result.sort(Comparator.comparing(EamAssetLog::getCreateTime)); + return success(result); + } +} diff --git a/system/src/main/java/com/yyy/system/controller/EamPlanController.java b/system/src/main/java/com/yyy/system/controller/EamPlanController.java new file mode 100644 index 0000000..e198179 --- /dev/null +++ b/system/src/main/java/com/yyy/system/controller/EamPlanController.java @@ -0,0 +1,115 @@ +package com.yyy.system.controller; + +import com.alibaba.fastjson.JSONObject; +import com.yyy.common.core.controller.BaseController; +import com.yyy.common.core.domain.Result; +import com.yyy.common.core.page.TableDataInfo; +import com.yyy.common.exception.job.TaskException; +import com.yyy.common.utils.poi.ExcelUtil; +import com.yyy.quartz.domain.SysJob; +import com.yyy.quartz.service.ISysJobService; +import com.yyy.quartz.util.CronUtils; +import com.yyy.system.entity.dto.DevicePlanAddDto; +import com.yyy.system.entity.dto.DevicePlanQueryDto; +import com.yyy.system.service.DevicePlanService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.quartz.SchedulerException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +@Controller +@Api(tags = "计划相关接口") +@RequestMapping("api/v2/plan/") +public class EamPlanController extends BaseController { + + @Autowired + private DevicePlanService devicePlanService; + + @Autowired + private ISysJobService jobService; + + @PostMapping("/list") + @ResponseBody + @ApiOperation(value = "查询分页数据") + public TableDataInfo list(@RequestBody DevicePlanQueryDto dto) { + startPage(); + List list = devicePlanService.selectList(dto); + return getDataTable(list); + } + + @PostMapping("/export") + @ResponseBody + @ApiOperation(value = "导出Excel数据(计划报表)", notes = "计划报表 导出Excel行数据") + public void export(@RequestBody JSONObject jsonObject, HttpServletResponse response) { + Assert.isTrue(jsonObject != null && jsonObject.containsKey("idList"), "参数缺失"); + List idList = JSONObject.parseArray(jsonObject.get("idList").toString(), Long.class); + List list = devicePlanService.selectByIds(idList); + ExcelUtil util = new ExcelUtil(DevicePlanAddDto.class); + util.exportExcel(response, list, "计划列表", "计划报表"); + } + + + //TODO 权限控制 1、普通操作员,仅支持查看任务。管理员、班长等角色支持修改、删除、停用/启用。 + @PostMapping("/delete") + @ResponseBody + @ApiOperation(value = "删除数据 (jobId+planType)") + public Result delete(@RequestBody DevicePlanAddDto dto) throws SchedulerException { + return devicePlanService.delete(dto); + } + + @PostMapping("/deleteByIds") + @ResponseBody + @ApiOperation(value = "删除数据") + public Result deleteByIds(String ids) throws SchedulerException { + return devicePlanService.deleteByIds(ids); + } + + @PostMapping("/changeStatus") + @ResponseBody + @ApiOperation(value = "任务调度状态修改") + public Result changeStatus(@RequestBody DevicePlanAddDto dto) throws SchedulerException { + return devicePlanService.changeStatus(dto); + } + + @PostMapping("/add") + @ResponseBody + @ApiOperation(value = "新增计划") + public Result add(@RequestBody @Validated DevicePlanAddDto dto) throws SchedulerException, TaskException { + dto.setCreateUser(getUserId()); + return devicePlanService.insert(dto); + } + + + @PostMapping("/update") + @ResponseBody + @ApiOperation(value = "修改计划") + public Result update(@RequestBody @Validated DevicePlanAddDto dto) throws SchedulerException, TaskException { + return devicePlanService.update(dto); + } + + @PostMapping("/checkCronExpressionIsValid") + @ResponseBody + @ApiOperation(value = "校验cron表达式是否有效") + public boolean checkCronExpressionIsValid(SysJob job) { + return jobService.checkCronExpressionIsValid(job.getCronExpression()); + } + + @GetMapping("/queryCronExpression") + @ResponseBody + @ApiOperation(value = "查询cron表达式近5次的执行时间") + public Result queryCronExpression(@RequestParam(value = "cronExpression", required = false) String cronExpression) { + if (jobService.checkCronExpressionIsValid(cronExpression)) { + List dateList = CronUtils.getRecentTriggerTime(cronExpression); + return success(dateList); + } else { + return error("表达式无效"); + } + } +} diff --git a/system/src/main/java/com/yyy/system/controller/EamRepairController.java b/system/src/main/java/com/yyy/system/controller/EamRepairController.java new file mode 100644 index 0000000..bfad906 --- /dev/null +++ b/system/src/main/java/com/yyy/system/controller/EamRepairController.java @@ -0,0 +1,143 @@ +package com.yyy.system.controller; + + +import com.alibaba.fastjson.JSON; +import com.yyy.common.core.controller.BaseController; +import com.yyy.common.core.domain.Result; +import com.yyy.common.core.page.TableDataInfo; +import com.yyy.common.enums.AssetStatusEnum; +import com.yyy.common.enums.BusinessStatusEnum; +import com.yyy.common.enums.DetectTypeEnum; +import com.yyy.common.enums.EncodingEum; +import com.yyy.common.utils.bean.BeanUtils; +import com.yyy.system.entity.dto.EamWarehouseAssetDto; +import com.yyy.system.entity.pojo.EamAsset; +import com.yyy.system.entity.pojo.EamRepair; +import com.yyy.system.entity.dto.EamRepairDto; +import com.yyy.system.entity.vo.EamRepairVo; +import com.yyy.system.service.EamAssetLogService; +import com.yyy.system.service.EamAssetService; +import com.yyy.system.service.EamRepairService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 维修登记信息表(eam_repair)表控制层 + * + * @author Fangy + * @since 2024-04-12 15:00:36 + */ + +@RestController +@Api(tags = "维修登记信息表相关接口") +@RequestMapping("api/eamRepair") +public class EamRepairController extends BaseController { + + private static final Logger logger = LoggerFactory.getLogger(EamRepairController.class); + /** + * 服务对象 + */ + @Resource + private EamRepairService eamRepairService; + + @Resource + private EamAssetService eamAssetService; + + @Resource + private EamAssetLogService eamAssetLogService; + + /** + * 查询分页数据 + */ + @PostMapping("/list") + @ApiOperation(value = "查询分页数据") + public TableDataInfo list(@RequestBody EamRepairDto eamRepairDto) { + startPage(); + List list = eamRepairService.query(eamRepairDto); + return getDataTable(EamRepairVo.ToVo(list)); + } + + /** + * 查询详情数据 + */ + @PostMapping("/query") + @ApiOperation(value = "查询详情数据") + public Result query(@RequestParam Long id) { + return success(EamRepairVo.ToVo(eamRepairService.getById(id))); + } + + /** + * 新增数据 + */ + @PostMapping("/add") + @ApiOperation(value = "新增数据") + public Result add(@Validated @RequestBody EamRepairDto eamRepairDto) { + EamRepair eamRepair = new EamRepair(); + BeanUtils.copyProperties(eamRepairDto, eamRepair); + eamRepair.setCreateUser(getUserId()); + eamRepair.setBusinessId(EncodingEum.REPAIR.getBusinessId()); + eamRepair.setStatus(BusinessStatusEnum.DRAFT.getCode()); + + eamRepair.setAssetIdList(JSON.toJSONString(eamRepairDto.getAssetIdList())); + return eamRepairService.save(eamRepair) ? success() : error(); + } + + /** + * 修改数据 + */ + @PostMapping("/update") + @ApiOperation(value = "修改数据") + public Result update(@Validated @RequestBody EamRepairDto eamRepairDto) { + if (eamRepairService.isCompleted(eamRepairDto.getId())){ + return error("业务状态错误,业务已完成,内容不允许修改!"); + } + EamRepair eamRepair = new EamRepair(); + BeanUtils.copyProperties(eamRepairDto, eamRepair); + eamRepair.setUpdateUser(getUserId()); + + eamRepair.setAssetIdList(JSON.toJSONString(eamRepairDto.getAssetIdList())); + return eamRepairService.updateById(eamRepair) ? success() : error(); + } + + /** + * 删除数据 + */ + @PostMapping("/delete") + @ApiOperation(value = "删除数据") + public Result delete(@RequestBody List idList) { + return eamRepairService.removeBatchByIds(idList) ? success() : error(); + } + + @PostMapping("/confirm") + @ApiOperation(value = "确认") + public Result confirm(@RequestBody List idList) { + List list = eamRepairService.listByIds(idList); + for (EamRepair x : list) { + if (x.getStatus().equals(BusinessStatusEnum.COMPLETED.getCode())) { + return error("业务状态错误,业务已完成,确认失败! 业务名称: " + x.getName() + " 业务编号: " + x.getBusinessId()); + } + List assetIdList = JSON.parseArray(x.getAssetIdList(), EamWarehouseAssetDto.class); + if (assetIdList != null && !assetIdList.isEmpty()) { + List assetList = eamAssetService.listByIds(assetIdList.stream().map(EamWarehouseAssetDto::getAssetId).distinct().collect(Collectors.toList())); + assetList.forEach(e -> { + e.setStatus(AssetStatusEnum.REPAIR.getCode()); + eamAssetLogService.add(x.getBusinessId(), DetectTypeEnum.TRANSFER, DetectTypeEnum.TRANSFER.getInfo(), e.getAssetId(), getUserId()); + }); + eamAssetService.updateBatchById(assetList); + x.setStatus(BusinessStatusEnum.COMPLETED.getCode()); + } + } + + eamRepairService.updateBatchById(list); + return success(); + } +} + diff --git a/system/src/main/java/com/yyy/system/controller/EamRepairFaultController.java b/system/src/main/java/com/yyy/system/controller/EamRepairFaultController.java new file mode 100644 index 0000000..e021c73 --- /dev/null +++ b/system/src/main/java/com/yyy/system/controller/EamRepairFaultController.java @@ -0,0 +1,136 @@ +package com.yyy.system.controller; + + +import com.alibaba.fastjson.JSON; +import com.yyy.common.core.controller.BaseController; +import com.yyy.common.core.domain.Result; +import com.yyy.common.core.page.TableDataInfo; +import com.yyy.common.enums.BusinessStatusEnum; +import com.yyy.common.enums.DetectTypeEnum; +import com.yyy.common.utils.bean.BeanUtils; +import com.yyy.system.entity.dto.EamWarehouseAssetDto; +import com.yyy.system.entity.pojo.EamAsset; +import com.yyy.system.entity.pojo.EamRepairFault; +import com.yyy.system.entity.dto.EamRepairFaultDto; +import com.yyy.system.entity.vo.EamRepairFaultVo; +import com.yyy.system.service.EamAssetLogService; +import com.yyy.system.service.EamAssetService; +import com.yyy.system.service.EamRepairFaultService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 故障信息表(eam_repair_fault)表控制层 + * + * @author Fangy + * @since 2024-04-12 14:50:46 + */ +@RestController +@Api(tags = "故障信息表相关接口") +@RequestMapping("api/eamRepairFault") +public class EamRepairFaultController extends BaseController { + + private static final Logger logger = LoggerFactory.getLogger(EamRepairFaultController.class); + /** + * 服务对象 + */ + @Resource + private EamRepairFaultService eamRepairFaultService; + + @Resource + private EamAssetService eamAssetService; + + @Resource + private EamAssetLogService eamAssetLogService; + + /** + * 查询分页数据 + */ + @PostMapping("/list") + @ApiOperation(value = "查询分页数据") + public TableDataInfo list(@RequestBody EamRepairFaultDto eamRepairFaultDto) { + startPage(); + List list = eamRepairFaultService.query(eamRepairFaultDto); + return getDataTable(EamRepairFaultVo.ToVo(list)); + } + + /** + * 查询详情数据 + */ + @PostMapping("/query") + @ApiOperation(value = "查询详情数据") + public Result query(@RequestParam Long id) { + return success(EamRepairFaultVo.ToVo(eamRepairFaultService.getById(id))); + } + + /** + * 新增数据 + */ + @PostMapping("/add") + @ApiOperation(value = "新增数据") + public Result add(@Validated @RequestBody EamRepairFaultDto eamRepairFaultDto) { + EamRepairFault eamRepairFault = new EamRepairFault(); + BeanUtils.copyProperties(eamRepairFaultDto, eamRepairFault); + eamRepairFault.setCreateUser(getUserId()); + eamRepairFault.setAssetIdList(JSON.toJSONString(eamRepairFaultDto.getAssetIdList())); + return eamRepairFaultService.save(eamRepairFault) ? success() : error(); + } + + /** + * 修改数据 + */ + @PostMapping("/update") + @ApiOperation(value = "修改数据") + public Result update(@Validated @RequestBody EamRepairFaultDto eamRepairFaultDto) { + if (eamRepairFaultService.isCompleted(eamRepairFaultDto.getFaultId())){ + return error("业务状态错误,业务已完成,内容不允许修改!"); + } + EamRepairFault eamRepairFault = new EamRepairFault(); + BeanUtils.copyProperties(eamRepairFaultDto, eamRepairFault); + eamRepairFault.setUpdateUser(getUserId()); + + eamRepairFault.setAssetIdList(JSON.toJSONString(eamRepairFaultDto.getAssetIdList())); + return eamRepairFaultService.updateById(eamRepairFault) ? success() : error(); + } + + /** + * 删除数据 + */ + @PostMapping("/delete") + @ApiOperation(value = "删除数据") + public Result delete(@RequestBody List idList) { + return eamRepairFaultService.removeBatchByIds(idList) ? success() : error(); + } + + @PostMapping("/confirm") + @ApiOperation(value = "确认") + public Result confirm(@RequestBody List idList) { + List list = eamRepairFaultService.listByIds(idList); + for (EamRepairFault x : list) { + if (x.getStatus().equals(BusinessStatusEnum.COMPLETED.getCode())) { + return error("业务状态错误,业务已完成,确认失败! 业务名称: " + x.getName()); + } + List assetIdList = JSON.parseArray(x.getAssetIdList(), EamWarehouseAssetDto.class); + if (assetIdList != null && !assetIdList.isEmpty()) { + List assetList = eamAssetService.listByIds(assetIdList.stream().map(EamWarehouseAssetDto::getAssetId).distinct().collect(Collectors.toList())); + assetList.forEach(e -> { + eamAssetLogService.add(x.getFaultId().toString(), DetectTypeEnum.TRANSFER, DetectTypeEnum.TRANSFER.getInfo(), e.getAssetId(), getUserId()); + }); + x.setStatus(BusinessStatusEnum.COMPLETED.getCode()); + } + + } + + eamRepairFaultService.updateBatchById(list); + return success(); + } +} + diff --git a/system/src/main/java/com/yyy/system/controller/EamRepairTypeController.java b/system/src/main/java/com/yyy/system/controller/EamRepairTypeController.java new file mode 100644 index 0000000..af9a927 --- /dev/null +++ b/system/src/main/java/com/yyy/system/controller/EamRepairTypeController.java @@ -0,0 +1,98 @@ +package com.yyy.system.controller; + + + +import com.yyy.common.core.controller.BaseController; +import com.yyy.common.core.domain.Result; +import com.yyy.common.core.page.TableDataInfo; +import com.yyy.common.utils.bean.BeanUtils; +import com.yyy.system.entity.pojo.EamRepairType; +import com.yyy.system.entity.dto.EamRepairTypeDto; +import com.yyy.system.entity.vo.EamRepairTypeVo; +import com.yyy.system.service.EamRepairTypeService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 保养计划(维修类型)表(eam_repair_type)表控制层 + * @author Fangy + * @since 2024-04-12 15:00:38 + */ +@RestController +@Api(tags = "保养计划(维修类型)表相关接口") +@RequestMapping("api/eamRepairType") +public class EamRepairTypeController extends BaseController { + + private static final Logger logger = LoggerFactory.getLogger(EamRepairTypeController.class); + /** + * 服务对象 + */ + @Resource + private EamRepairTypeService eamRepairTypeService; + + /** + * 查询分页数据 + * + */ + @PostMapping("/list") + @ApiOperation(value = "查询分页数据") + public TableDataInfo list(@RequestBody EamRepairTypeDto eamRepairTypeDto) { + startPage(); + List list = eamRepairTypeService.query(eamRepairTypeDto); + return getDataTable(EamRepairTypeVo.ToVo(list)); + } + + /** + * 查询详情数据 + * + */ + @PostMapping("/query") + @ApiOperation(value = "查询详情数据") + public Result query(@RequestParam Long id) { + return success(EamRepairTypeVo.ToVo(eamRepairTypeService.getById(id))); + } + + /** + * 新增数据 + * + */ + @PostMapping("/add") + @ApiOperation(value = "新增数据") + public Result add(@Validated @RequestBody EamRepairTypeDto eamRepairTypeDto) { + EamRepairType eamRepairType = new EamRepairType(); + BeanUtils.copyProperties(eamRepairTypeDto, eamRepairType); + eamRepairType.setCreateUser(getUserId()); + return eamRepairTypeService.save(eamRepairType)?success():error(); + } + + /** + * 修改数据 + * + */ + @PostMapping("/update") + @ApiOperation(value = "修改数据") + public Result update(@Validated @RequestBody EamRepairTypeDto eamRepairTypeDto) { + EamRepairType eamRepairType = new EamRepairType(); + BeanUtils.copyProperties(eamRepairTypeDto, eamRepairType); + eamRepairType.setUpdateUser(getUserId()); + return eamRepairTypeService.updateById(eamRepairType) ? success() : error(); + } + + /** + * 删除数据 + * + */ + @PostMapping("/delete") + @ApiOperation(value = "删除数据") + public Result delete(@RequestBody List idList) { + return eamRepairTypeService.removeBatchByIds(idList) ? success() : error(); + } +} + diff --git a/system/src/main/java/com/yyy/system/controller/EamStocktakingDetailsController.java b/system/src/main/java/com/yyy/system/controller/EamStocktakingDetailsController.java new file mode 100644 index 0000000..d6eccef --- /dev/null +++ b/system/src/main/java/com/yyy/system/controller/EamStocktakingDetailsController.java @@ -0,0 +1,107 @@ +package com.yyy.system.controller; + +import com.yyy.common.core.controller.BaseController; +import com.yyy.common.core.domain.Result; +import com.yyy.common.core.page.TableDataInfo; +import com.yyy.common.enums.StocktakingStatusEnum; +import com.yyy.common.utils.bean.BeanUtils; +import com.yyy.system.entity.pojo.EamStocktakingDetails; +import com.yyy.system.entity.dto.EamStocktakingDetailsDto; +import com.yyy.system.entity.vo.EamStocktakingDetailsVo; +import com.yyy.system.service.EamStocktakingDetailsService; +import com.yyy.system.service.EamStocktakingJobService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 盘点明细(eam_stocktaking_details)表控制层 + * @author Fangy + * @since 2024-04-12 14:50:46 + */ +@RestController +@Api(tags = "盘点明细相关接口") +@RequestMapping("api/eamStocktakingDetails") +public class EamStocktakingDetailsController extends BaseController { + + private static final Logger logger = LoggerFactory.getLogger(EamStocktakingDetailsController.class); + /** + * 服务对象 + */ + @Resource + private EamStocktakingDetailsService eamStocktakingDetailsService; + + @Resource + private EamStocktakingJobService eamStocktakingJobService; + + /** + * 查询分页数据 + * + */ + @PostMapping("/list") + @ApiOperation(value = "查询分页数据") + public TableDataInfo list(@RequestBody EamStocktakingDetailsDto eamStocktakingDetailsDto) { + startPage(); + List list = eamStocktakingDetailsService.query(eamStocktakingDetailsDto); + return getDataTable(EamStocktakingDetailsVo.ToVo(list)); + } + + /** + * 查询详情数据 + * + */ + @PostMapping("/query") + @ApiOperation(value = "查询详情数据") + public Result query(@RequestParam Long id) { + return success(EamStocktakingDetailsVo.ToVo(eamStocktakingDetailsService.getById(id))); + } + + /** + * 新增数据 + * + */ + @PostMapping("/add") + @ApiOperation(value = "新增数据") + public Result add(@Validated @RequestBody EamStocktakingDetailsDto eamStocktakingDetailsDto) { + EamStocktakingDetails eamStocktakingDetails = new EamStocktakingDetails(); + BeanUtils.copyProperties(eamStocktakingDetailsDto, eamStocktakingDetails); + eamStocktakingDetails.setCreateUser(getUserId()); + return eamStocktakingDetailsService.save(eamStocktakingDetails)?success():error(); + } + + /** + * 修改数据 + * + */ + @PostMapping("/update") + @ApiOperation(value = "修改数据") + public Result update(@Validated @RequestBody EamStocktakingDetailsDto eamStocktakingDetailsDto) { + if (eamStocktakingDetailsDto.getStocktakingJobId()!=null){ + if (!eamStocktakingJobService.getById(eamStocktakingDetailsDto.getStocktakingJobId()).getStatus().equals(StocktakingStatusEnum.IN_PROGRESS.getCode())){ + return error("盘点任务未在进行中,盘点明细修改失败!"); + } + } + + EamStocktakingDetails eamStocktakingDetails = new EamStocktakingDetails(); + BeanUtils.copyProperties(eamStocktakingDetailsDto, eamStocktakingDetails); + eamStocktakingDetails.setUpdateUser(getUserId()); + return eamStocktakingDetailsService.updateById(eamStocktakingDetails) ? success() : error(); + } + + /** + * 删除数据 + * + */ + @PostMapping("/delete") + @ApiOperation(value = "删除数据") + public Result delete(@RequestBody List idList) { + return eamStocktakingDetailsService.removeBatchByIds(idList) ? success() : error(); + } +} + diff --git a/system/src/main/java/com/yyy/system/controller/EamStocktakingJobController.java b/system/src/main/java/com/yyy/system/controller/EamStocktakingJobController.java new file mode 100644 index 0000000..230b2f6 --- /dev/null +++ b/system/src/main/java/com/yyy/system/controller/EamStocktakingJobController.java @@ -0,0 +1,196 @@ +package com.yyy.system.controller; + +import com.yyy.common.core.controller.BaseController; +import com.yyy.common.core.domain.Result; +import com.yyy.common.core.page.TableDataInfo; +import com.yyy.common.enums.StockTackingDetailStatusEnum; +import com.yyy.common.enums.StocktakingStatusEnum; +import com.yyy.common.utils.bean.BeanUtils; +import com.yyy.system.entity.dto.EamAssetQueryDto; +import com.yyy.system.entity.dto.EamStocktakingDetailsDto; +import com.yyy.system.entity.pojo.EamStocktakingDetails; +import com.yyy.system.entity.pojo.EamStocktakingJob; +import com.yyy.system.entity.dto.EamStocktakingJobDto; +import com.yyy.system.entity.vo.EamStocktakingJobVo; +import com.yyy.system.service.EamAssetService; +import com.yyy.system.service.EamStocktakingDetailsService; +import com.yyy.system.service.EamStocktakingJobService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 盘点任务表(eam_stocktaking_job)表控制层 + * + * @author Fangy + * @since 2024-04-12 14:50:46 + */ +@RestController +@Api(tags = "盘点任务表相关接口") +@RequestMapping("api/eamStocktakingJob") +public class EamStocktakingJobController extends BaseController { + + private static final Logger logger = LoggerFactory.getLogger(EamStocktakingJobController.class); + /** + * 服务对象 + */ + @Resource + private EamStocktakingJobService eamStocktakingJobService; + + @Resource + private EamStocktakingDetailsService eamStocktakingDetailsService; + + @Resource + private EamAssetService eamAssetService; + + + /** + * 查询分页数据 + */ + @PostMapping("/list") + @ApiOperation(value = "查询分页数据") + public TableDataInfo list(@RequestBody EamStocktakingJobDto eamStocktakingJobDto) { + startPage(); + List list = EamStocktakingJobVo.ToVo(eamStocktakingJobService.query(eamStocktakingJobDto)); + + for (EamStocktakingJobVo job : list) { + Map countMap = new HashMap<>(); + for (StockTackingDetailStatusEnum statusEnum : StockTackingDetailStatusEnum.values()) { + countMap.put(statusEnum.getCode(), 0); + } + + List detailsList = eamStocktakingDetailsService.query(EamStocktakingDetailsDto.builder().stocktakingJobId(job.getStocktakingJobId()).build()); + + for (EamStocktakingDetails details : detailsList) { + int status = details.getStatus(); + countMap.put(status, countMap.get(status) + 1); + } + + job.setCountPending(countMap.get(StockTackingDetailStatusEnum.PENDING.getCode())); + job.setCountCompleted(countMap.get(StockTackingDetailStatusEnum.COMPLETED.getCode())); + job.setCountLoss(countMap.get(StockTackingDetailStatusEnum.SHORTAGE.getCode())); + job.setCountSurplus(countMap.get(StockTackingDetailStatusEnum.SURPLUS.getCode())); + job.setCountException(countMap.get(StockTackingDetailStatusEnum.EXCEPTION.getCode())); + } + + return getDataTable(list); + } + + /** + * 查询详情数据 + */ + @PostMapping("/query") + @ApiOperation(value = "查询详情数据") + public Result query(@RequestParam Long id) { + return success(EamStocktakingJobVo.ToVo(eamStocktakingJobService.getById(id))); + } + + /** + * 新增数据 + */ + @PostMapping("/add") + @ApiOperation(value = "新增数据") + public Result add(@Validated @RequestBody EamStocktakingJobDto eamStocktakingJobDto) { + EamStocktakingJob eamStocktakingJob = new EamStocktakingJob(); + BeanUtils.copyProperties(eamStocktakingJobDto, eamStocktakingJob); + eamStocktakingJob.setCreateUser(getUserId()); + eamStocktakingJob.setStatus(StocktakingStatusEnum.NOT_STARTED.getCode()); + + return eamStocktakingJobService.save(eamStocktakingJob) ? success() : error(); + } + + /** + * 修改数据 + */ + @PostMapping("/update") + @ApiOperation(value = "修改数据") + public Result update(@Validated @RequestBody EamStocktakingJobDto eamStocktakingJobDto) { + if (!eamStocktakingJobService.getById(eamStocktakingJobDto.getStocktakingJobId()).getStatus().equals(StocktakingStatusEnum.NOT_STARTED.getCode())) { + return error("盘点任务状态错误!只允许修改未开始的盘点任务"); + } + EamStocktakingJob eamStocktakingJob = new EamStocktakingJob(); + BeanUtils.copyProperties(eamStocktakingJobDto, eamStocktakingJob); + eamStocktakingJob.setUpdateUser(getUserId()); + return eamStocktakingJobService.updateById(eamStocktakingJob) ? success() : error(); + } + + /** + * 删除数据 + */ + @PostMapping("/delete") + @ApiOperation(value = "删除数据") + public Result delete(@RequestBody List idList) { + return eamStocktakingJobService.removeBatchByIds(idList) ? success() : error(); + } + + /** + * 开始盘点 + */ + @PostMapping("/start") + @ApiOperation(value = "开始盘点") + public Result start(@RequestBody List idList) { + List jobs = eamStocktakingJobService.listByIds(idList); + for (EamStocktakingJob job : jobs) { + if (!eamStocktakingJobService.getById(job.getStocktakingJobId()).getStatus().equals(StocktakingStatusEnum.NOT_STARTED.getCode())) { + return error("盘点任务状态错误!盘点任务:" + job.getName() + "在进行中或已完成"); + } + } + + jobs.forEach(job -> { + if (job.getFullStocktaking().equals(0)){ + eamAssetService.stocktaking(job).forEach(eamAsset -> { + eamStocktakingDetailsService.save(EamStocktakingDetails.builder() + .stocktakingJobId(job.getStocktakingJobId()) + .assetId(eamAsset.getAssetId()) + .status(StockTackingDetailStatusEnum.PENDING.getCode()) + .createUser(getUserId()).build()); + }); + }else { + eamAssetService.query(new EamAssetQueryDto()).forEach(eamAsset -> { + eamStocktakingDetailsService.save(EamStocktakingDetails.builder() + .stocktakingJobId(job.getStocktakingJobId()) + .assetId(eamAsset.getAssetId()) + .status(StockTackingDetailStatusEnum.PENDING.getCode()) + .createUser(getUserId()).build()); + }); + } + + job.setStatus(StocktakingStatusEnum.IN_PROGRESS.getCode()); + }); + eamStocktakingJobService.updateBatchById(jobs); + return success(); + } + + /** + * 结束盘点 + */ + @PostMapping("/complete") + @ApiOperation(value = "结束盘点") + public Result complete(@RequestBody List idList) { + List jobs = eamStocktakingJobService.listByIds(idList); + for (EamStocktakingJob job : jobs) { + if (!eamStocktakingJobService.getById(job.getStocktakingJobId()).getStatus().equals(StocktakingStatusEnum.IN_PROGRESS.getCode())) { + return error("盘点任务状态错误!盘点任务:" + job.getName() + "未在进行中"); + } + List detailsList = eamStocktakingDetailsService.query(EamStocktakingDetailsDto.builder().stocktakingJobId(job.getStocktakingJobId()).build()); + for (EamStocktakingDetails details : detailsList) { + if (details.getStatus().equals(StockTackingDetailStatusEnum.PENDING.getCode())) { + return error("资产未盘点完,不能执行结束操作!"); + } + } + job.setStatus(StocktakingStatusEnum.COMPLETED.getCode()); + } + eamStocktakingJobService.updateBatchById(jobs); + return success(); + } + +} + diff --git a/system/src/main/java/com/yyy/system/controller/EamStocktakingPlanController.java b/system/src/main/java/com/yyy/system/controller/EamStocktakingPlanController.java new file mode 100644 index 0000000..8e09b4a --- /dev/null +++ b/system/src/main/java/com/yyy/system/controller/EamStocktakingPlanController.java @@ -0,0 +1,121 @@ +package com.yyy.system.controller; + + + +import com.yyy.common.core.controller.BaseController; +import com.yyy.common.core.domain.Result; +import com.yyy.common.core.page.TableDataInfo; +import com.yyy.common.enums.StocktakingStatusEnum; +import com.yyy.common.utils.bean.BeanUtils; +import com.yyy.system.entity.pojo.EamStocktakingJob; +import com.yyy.system.entity.pojo.EamStocktakingPlan; +import com.yyy.system.entity.dto.EamStocktakingPlanDto; +import com.yyy.system.entity.vo.EamStocktakingPlanVo; +import com.yyy.system.service.EamStocktakingJobService; +import com.yyy.system.service.EamStocktakingPlanService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; + +/** + * 盘点计划信息(eam_stocktaking_plan)表控制层 + * @author Fangy + * @since 2024-04-12 14:50:46 + */ +@RestController +@Api(tags = "盘点计划信息相关接口") +@RequestMapping("api/eamStocktakingPlan") +public class EamStocktakingPlanController extends BaseController { + + private static final Logger logger = LoggerFactory.getLogger(EamStocktakingPlanController.class); + /** + * 服务对象 + */ + @Resource + private EamStocktakingPlanService eamStocktakingPlanService; + + @Resource + private EamStocktakingJobService eamStocktakingJobService; + + /** + * 查询分页数据 + * + */ + @PostMapping("/list") + @ApiOperation(value = "查询分页数据") + public TableDataInfo list(@RequestBody EamStocktakingPlanDto eamStocktakingPlanDto) { + startPage(); + List list = eamStocktakingPlanService.query(eamStocktakingPlanDto); + return getDataTable(EamStocktakingPlanVo.ToVo(list)); + } + + /** + * 查询详情数据 + * + */ + @PostMapping("/query") + @ApiOperation(value = "查询详情数据") + public Result query(@RequestParam Long id) { + return success(EamStocktakingPlanVo.ToVo(eamStocktakingPlanService.getById(id))); + } + + /** + * 新增数据 + * + */ + @PostMapping("/add") + @ApiOperation(value = "新增数据") + public Result add(@Validated @RequestBody EamStocktakingPlanDto eamStocktakingPlanDto) { + EamStocktakingPlan eamStocktakingPlan = new EamStocktakingPlan(); + BeanUtils.copyProperties(eamStocktakingPlanDto, eamStocktakingPlan); + eamStocktakingPlan.setCreateUser(getUserId()); + return eamStocktakingPlanService.save(eamStocktakingPlan)?success():error(); + } + + /** + * 修改数据 + * + */ + @PostMapping("/update") + @ApiOperation(value = "修改数据") + public Result update(@Validated @RequestBody EamStocktakingPlanDto eamStocktakingPlanDto) { + EamStocktakingPlan eamStocktakingPlan = new EamStocktakingPlan(); + BeanUtils.copyProperties(eamStocktakingPlanDto, eamStocktakingPlan); + eamStocktakingPlan.setUpdateUser(getUserId()); + return eamStocktakingPlanService.updateById(eamStocktakingPlan) ? success() : error(); + } + + /** + * 删除数据 + * + */ + @PostMapping("/delete") + @ApiOperation(value = "删除数据") + public Result delete(@RequestBody List idList) { + return eamStocktakingPlanService.removeBatchByIds(idList) ? success() : error(); + } + + @PostMapping("/job") + @ApiOperation(value = "创建盘点任务") + public Result job(@RequestBody List idList) { + List list = eamStocktakingPlanService.listByIds(idList); + List jobs = new ArrayList<>(); + list.forEach(x -> { + EamStocktakingJob eamStocktakingJob = new EamStocktakingJob(); + BeanUtils.copyProperties(x, eamStocktakingJob); + eamStocktakingJob.setCreateUser(getUserId()); + eamStocktakingJob.setStatus(StocktakingStatusEnum.NOT_STARTED.getCode()); + jobs.add(eamStocktakingJob); + }); + eamStocktakingJobService.saveBatch(jobs); + return success(); + } +} + diff --git a/system/src/main/java/com/yyy/system/controller/QrCodeController.java b/system/src/main/java/com/yyy/system/controller/QrCodeController.java new file mode 100644 index 0000000..9d4b52b --- /dev/null +++ b/system/src/main/java/com/yyy/system/controller/QrCodeController.java @@ -0,0 +1,39 @@ +package com.yyy.system.controller; + +import com.yyy.common.core.qr.QrCodeManageAction; +import com.yyy.common.utils.common.DateUtils; +import com.yyy.system.entity.pojo.EamAsset; +import com.yyy.system.service.EamAssetService; +import com.yyy.system.service.UmsOrganizationService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletResponse; + +@RestController +@Api(tags = "资产信息二维码") +@RequestMapping("api/qr") +public class QrCodeController { + + @Autowired + EamAssetService eamAssetService; + + @Autowired + UmsOrganizationService umsOrganizationService; + + @Autowired + QrCodeManageAction qrCodeManageAction; + + @PostMapping("/generate") + @ApiOperation(value = "生成资产二维码") + public void generate(Long id, HttpServletResponse httpServletResponse) { + EamAsset asset = eamAssetService.getById(id); + qrCodeManageAction.printQr(asset.getName(), asset.getAssetCode(), DateUtils.parseDateToStr("yyyy-MM-dd", asset.getCreateTime()), asset.get_useOrganization() != null ? asset.get_useOrganization().getOrganizationName() : null, httpServletResponse); + } + + //TODO 对接打印机sdk +} diff --git a/system/src/main/java/com/yyy/system/controller/SysAlarmController.java b/system/src/main/java/com/yyy/system/controller/SysAlarmController.java new file mode 100644 index 0000000..82b7a20 --- /dev/null +++ b/system/src/main/java/com/yyy/system/controller/SysAlarmController.java @@ -0,0 +1,69 @@ +package com.yyy.system.controller; + +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.yyy.common.core.controller.BaseController; +import com.yyy.common.core.page.TableDataInfo; +import com.yyy.common.enums.AssetStatusEnum; +import com.yyy.common.utils.common.DateUtils; +import com.yyy.system.entity.dto.EamWarehouseAssetDto; +import com.yyy.system.entity.dto.EamWarehouseInventoryDto; +import com.yyy.system.entity.pojo.EamAsset; +import com.yyy.system.entity.pojo.EamWarehouseInventory; +import com.yyy.system.entity.vo.AlarmVo; +import com.yyy.system.entity.vo.EamAssetVo; +import com.yyy.system.entity.vo.EamWarehouseInventoryVo; +import com.yyy.system.entity.vo.EamWarningBorrowVo; +import com.yyy.system.service.EamAssetService; +import com.yyy.system.service.EamBusinessBorrowService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +@RestController +@Api(tags = "消息中心-告警数据") +@RequestMapping("api/v2/alarm") +public class SysAlarmController extends BaseController { + + @Resource + private EamAssetService eamAssetService; + + @Resource + private EamBusinessBorrowService borrowService; + + @PostMapping("/list") + @ApiOperation(value = "查询分页数据") + public TableDataInfo list() { + + startPage(); + List list = eamAssetService.queryWarehouseInventory(new EamWarehouseInventoryDto()); + List upList = list.stream().filter(e -> e.getUpperLimit() <= e.getCount()).collect(Collectors.toList()); + List downList = list.stream().filter(e -> e.getLowerLimit() >= e.getCount()).collect(Collectors.toList()); + List safetyList = list.stream().filter(e -> e.getSafetyLimit() <= e.getCount() && e.getCount() < e.getUpperLimit()).collect(Collectors.toList()); + List maintenanceList = eamAssetService.maintenance(DateUtils.getTime()); + List borrowList = borrowService.list(new QueryWrapper<>()).stream().filter(borrow -> borrow.getIsDeleted().equals(0) && JSON.parseArray(borrow.getAssetIdList()).size() != 0 && borrow.getReturnTime().before(DateUtils.toDate(LocalDateTime.now().plusDays(3)))).flatMap(borrow -> eamAssetService.listByIds(JSON.parseArray(borrow.getAssetIdList(), EamWarehouseAssetDto.class).stream().map(EamWarehouseAssetDto::getAssetId).distinct().collect(Collectors.toList())).stream().filter(asset -> asset.getStatus().equals(AssetStatusEnum.BORROW.getCode())).map(asset -> EamWarningBorrowVo.ToVo(asset, borrow.getBusinessId(), borrow.getReturnTime()))).collect(Collectors.toList()); + + List upAlarmList = upList.stream().map(e -> AlarmVo.builder().assetCode(e.getAssetCode()).name(e.getName()).type("库存上限告警").content("库存已达到或超过上限").build()).collect(Collectors.toList()); + List downAlarmList = downList.stream().map(e -> AlarmVo.builder().assetCode(e.getAssetId()).name(e.getName()).type("库存下限告警").content("库存已低于下限").build()).collect(Collectors.toList()); + List safetyAlarmList = safetyList.stream().map(e -> AlarmVo.builder().assetCode(e.getAssetId()).name(e.getName()).type("安全库存告警").content("库存接近安全库存").build()).collect(Collectors.toList()); + List maintenanceAlarmList = maintenanceList.stream().map(e -> AlarmVo.builder().assetCode(e.getAssetId().toString()).name(e.getName()).type("维保到期告警").content("维保即将到期").build()).collect(Collectors.toList()); + List borrowAlarmList = borrowList.stream().map(borrow -> AlarmVo.builder().assetCode(borrow.getAssetCode()).name(borrow.getName()).type("借用到期告警").content("借用即将到期,需及时归还").build()).collect(Collectors.toList()); + + List alarmList = new ArrayList<>(); + alarmList.addAll(upAlarmList); + alarmList.addAll(downAlarmList); + alarmList.addAll(safetyAlarmList); + alarmList.addAll(maintenanceAlarmList); + alarmList.addAll(borrowAlarmList); + + return getDataTable(alarmList); + } +} diff --git a/system/src/main/java/com/yyy/system/controller/SysConfigController.java b/system/src/main/java/com/yyy/system/controller/SysConfigController.java new file mode 100644 index 0000000..a979922 --- /dev/null +++ b/system/src/main/java/com/yyy/system/controller/SysConfigController.java @@ -0,0 +1,98 @@ +package com.yyy.system.controller; + + + +import com.yyy.common.core.controller.BaseController; +import com.yyy.common.core.domain.Result; +import com.yyy.common.core.page.TableDataInfo; +import com.yyy.common.utils.bean.BeanUtils; +import com.yyy.system.entity.pojo.SysConfig; +import com.yyy.system.entity.dto.SysConfigDto; +import com.yyy.system.entity.vo.SysConfigVo; +import com.yyy.system.service.SysConfigService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 参数配置表(sys_config)表控制层 + * @author Fangy + * @since 2024-11-01 11:41:13 + */ +@RestController +@Api(tags = "参数配置表相关接口") +@RequestMapping("api/sysConfig") +public class SysConfigController extends BaseController { + + private static final Logger logger = LoggerFactory.getLogger(SysConfigController.class); + /** + * 服务对象 + */ + @Resource + private SysConfigService sysConfigService; + + /** + * 查询分页数据 + * + */ + @PostMapping("/list") + @ApiOperation(value = "查询分页数据") + public TableDataInfo list(@RequestBody SysConfigDto sysConfigDto) { + startPage(); + List list = sysConfigService.query(sysConfigDto); + return getDataTable(SysConfigVo.ToVo(list)); + } + + /** + * 查询详情数据 + * + */ + @PostMapping("/query") + @ApiOperation(value = "查询详情数据") + public Result query(@RequestParam Long id) { + return success(SysConfigVo.ToVo(sysConfigService.getById(id))); + } + + /** + * 新增数据 + * + */ + @PostMapping("/add") + @ApiOperation(value = "新增数据") + public Result add(@Validated @RequestBody SysConfigDto sysConfigDto) { + SysConfig sysConfig = new SysConfig(); + BeanUtils.copyProperties(sysConfigDto, sysConfig); + sysConfig.setCreateUser(getUserId()); + return sysConfigService.save(sysConfig)?success():error(); + } + + /** + * 修改数据 + * + */ + @PostMapping("/update") + @ApiOperation(value = "修改数据", notes = "数据大屏标语修改") + public Result update(@Validated @RequestBody SysConfigDto sysConfigDto) { + SysConfig sysConfig = new SysConfig(); + BeanUtils.copyProperties(sysConfigDto, sysConfig); + sysConfig.setUpdateUser(getUserId()); + return sysConfigService.updateById(sysConfig) ? success() : error(); + } + + /** + * 删除数据 + * + */ + @PostMapping("/delete") + @ApiOperation(value = "删除数据") + public Result delete(@RequestBody List idList) { + return sysConfigService.removeBatchByIds(idList) ? success() : error(); + } +} + diff --git a/system/src/main/java/com/yyy/system/controller/SysDictDataController.java b/system/src/main/java/com/yyy/system/controller/SysDictDataController.java new file mode 100644 index 0000000..79befce --- /dev/null +++ b/system/src/main/java/com/yyy/system/controller/SysDictDataController.java @@ -0,0 +1,93 @@ +package com.yyy.system.controller; + + +import com.yyy.common.core.controller.BaseController; +import com.yyy.common.core.domain.Result; +import com.yyy.common.core.page.TableDataInfo; +import com.yyy.common.utils.bean.BeanUtils; +import com.yyy.system.entity.pojo.SysDictData; +import com.yyy.system.entity.dto.SysDictDataDto; +import com.yyy.system.entity.vo.SysDictDataVo; +import com.yyy.system.service.SysDictDataService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 字典数据表(sys_dict_data)表控制层 + * + * @author Fangy + * @since 2024-09-05 16:51:24 + */ +@RestController +@Api(tags = "字典数据表相关接口") +@RequestMapping("api/v2/sysDictData") +public class SysDictDataController extends BaseController { + + private static final Logger logger = LoggerFactory.getLogger(SysDictDataController.class); + /** + * 服务对象 + */ + @Resource + private SysDictDataService sysDictDataService; +// +// /** +// * 查询分页数据 +// */ +// @PostMapping("/list") +// @ApiOperation(value = "查询分页数据") +// public TableDataInfo list(@RequestBody SysDictDataDto sysDictDataDto) { +// startPage(); +// List list = sysDictDataService.query(sysDictDataDto); +// return getDataTable(SysDictDataVo.ToVo(list)); +// } +// +// /** +// * 查询详情数据 +// */ +// @PostMapping("/query") +// @ApiOperation(value = "查询详情数据") +// public Result query(@RequestParam Long id) { +// return success(SysDictDataVo.ToVo(sysDictDataService.getById(id))); +// } +// +// /** +// * 新增数据 +// */ +// @PostMapping("/add") +// @ApiOperation(value = "新增数据") +// public Result add(@Validated @RequestBody SysDictDataDto sysDictDataDto) { +// SysDictData sysDictData = new SysDictData(); +// BeanUtils.copyProperties(sysDictDataDto, sysDictData); +// sysDictData.setCreateUser(getUserId()); +// return sysDictDataService.save(sysDictData) ? success() : error(); +// } +// +// /** +// * 修改数据 +// */ +// @PostMapping("/update") +// @ApiOperation(value = "修改数据") +// public Result update(@Validated @RequestBody SysDictDataDto sysDictDataDto) { +// SysDictData sysDictData = new SysDictData(); +// BeanUtils.copyProperties(sysDictDataDto, sysDictData); +// sysDictData.setUpdateUser(getUserId()); +// return sysDictDataService.updateById(sysDictData) ? success() : error(); +// } +// +// /** +// * 删除数据 +// */ +// @PostMapping("/delete") +// @ApiOperation(value = "删除数据") +// public Result delete(@RequestBody List idList) { +// return sysDictDataService.removeBatchByIds(idList) ? success() : error(); +// } +} + diff --git a/system/src/main/java/com/yyy/system/controller/SysDictTypeController.java b/system/src/main/java/com/yyy/system/controller/SysDictTypeController.java new file mode 100644 index 0000000..4f3bbae --- /dev/null +++ b/system/src/main/java/com/yyy/system/controller/SysDictTypeController.java @@ -0,0 +1,93 @@ +package com.yyy.system.controller; + + +import com.yyy.common.core.controller.BaseController; +import com.yyy.common.core.domain.Result; +import com.yyy.common.core.page.TableDataInfo; +import com.yyy.common.utils.bean.BeanUtils; +import com.yyy.system.entity.pojo.SysDictType; +import com.yyy.system.entity.dto.SysDictTypeDto; +import com.yyy.system.entity.vo.SysDictTypeVo; +import com.yyy.system.service.SysDictTypeService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 字典类型表(sys_dict_type)表控制层 + * + * @author Fangy + * @since 2024-09-05 16:40:30 + */ +@RestController +@Api(tags = "字典类型表相关接口") +@RequestMapping("api/v2/sysDictType") +public class SysDictTypeController extends BaseController { + + private static final Logger logger = LoggerFactory.getLogger(SysDictTypeController.class); + /** + * 服务对象 + */ + @Resource + private SysDictTypeService sysDictTypeService; + +// /** +// * 查询分页数据 +// */ +// @PostMapping("/list") +// @ApiOperation(value = "查询分页数据") +// public TableDataInfo list(@RequestBody SysDictTypeDto sysDictTypeDto) { +// startPage(); +// List list = sysDictTypeService.query(sysDictTypeDto); +// return getDataTable(SysDictTypeVo.ToVo(list)); +// } +// +// /** +// * 查询详情数据 +// */ +// @PostMapping("/query") +// @ApiOperation(value = "查询详情数据") +// public Result query(@RequestParam Long id) { +// return success(SysDictTypeVo.ToVo(sysDictTypeService.getById(id))); +// } +// +// /** +// * 新增数据 +// */ +// @PostMapping("/add") +// @ApiOperation(value = "新增数据") +// public Result add(@Validated @RequestBody SysDictTypeDto sysDictTypeDto) { +// SysDictType sysDictType = new SysDictType(); +// BeanUtils.copyProperties(sysDictTypeDto, sysDictType); +// sysDictType.setCreateUser(getUserId()); +// return sysDictTypeService.save(sysDictType) ? success() : error(); +// } +// +// /** +// * 修改数据 +// */ +// @PostMapping("/update") +// @ApiOperation(value = "修改数据") +// public Result update(@Validated @RequestBody SysDictTypeDto sysDictTypeDto) { +// SysDictType sysDictType = new SysDictType(); +// BeanUtils.copyProperties(sysDictTypeDto, sysDictType); +// sysDictType.setUpdateUser(getUserId()); +// return sysDictTypeService.updateById(sysDictType) ? success() : error(); +// } +// +// /** +// * 删除数据 +// */ +// @PostMapping("/delete") +// @ApiOperation(value = "删除数据") +// public Result delete(@RequestBody List idList) { +// return sysDictTypeService.removeBatchByIds(idList) ? success() : error(); +// } +} + diff --git a/system/src/main/java/com/yyy/system/controller/SysFormLogController.java b/system/src/main/java/com/yyy/system/controller/SysFormLogController.java new file mode 100644 index 0000000..f641f6f --- /dev/null +++ b/system/src/main/java/com/yyy/system/controller/SysFormLogController.java @@ -0,0 +1,139 @@ +package com.yyy.system.controller; + + +import com.alibaba.fastjson.JSONObject; +import com.yyy.common.core.controller.BaseController; +import com.yyy.common.core.domain.Result; +import com.yyy.common.core.page.TableDataInfo; +import com.yyy.common.form.FieldData; +import com.yyy.common.utils.bean.BeanUtils; +import com.yyy.common.utils.common.DateUtils; +import com.yyy.system.entity.dto.SysFormLogAddDto; +import com.yyy.system.entity.pojo.SysFormLog; +import com.yyy.system.entity.dto.SysFormLogQuarryDto; +import com.yyy.system.entity.pojo.SysFormTemp; +import com.yyy.system.entity.vo.SysFormLogVo; +import com.yyy.system.service.SysFormLogService; +import com.yyy.system.service.SysFormTempService; +import com.yyy.system.service.WordExportService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 表单记录(sys_form_log)表控制层 + * + * @author Fangy + * @since 2024-10-17 15:40:04 + */ +@RestController +@Api(tags = "表单记录相关接口") +@RequestMapping("api/v2/sysFormLog") +public class SysFormLogController extends BaseController { + + private static final Logger logger = LoggerFactory.getLogger(SysFormLogController.class); + /** + * 服务对象 + */ + @Resource + private SysFormLogService sysFormLogService; + @Resource + private SysFormTempService sysFormTempService; + @Resource + private WordExportService wordExportService; + + /** + * 查询分页数据 + */ + @PostMapping("/list") + @ApiOperation(value = "查询分页数据") + public TableDataInfo list(@RequestBody SysFormLogQuarryDto sysFormLogQuarryDto) { + startPage(); + List list = sysFormLogService.query(sysFormLogQuarryDto); + return getDataTable(SysFormLogVo.ToVo(list)); + } + + /** + * 查询详情数据 + */ + @PostMapping("/query") + @ApiOperation(value = "查询详情数据") + public Result query(@RequestParam Long id) { + return success(SysFormLogVo.ToVo(sysFormLogService.getById(id))); + } + + /** + * 新增数据 + */ + @PostMapping("/add") + @ApiOperation(value = "新增数据") + public Result add(@Validated @RequestBody SysFormLogAddDto dto) { + SysFormTemp temp = sysFormTempService.getById(dto.getFormTempId()); + if (temp == null) { + return error("报表模板不存在"); + } + SysFormLog sysFormLog = new SysFormLog(); + sysFormLog.setFormTempId(dto.getFormTempId()); + sysFormLog.setFormKey(dto.getFormKey() == null ? temp.getFormKey() + "_" + DateUtils.dateTimeNow() : dto.getFormKey()); + sysFormLog.setFormType(temp.getFormType()); + sysFormLog.setFormName(dto.getFormName()); + sysFormLog.setFormValue(JSONObject.toJSONString(dto.get_formValue())); + sysFormLog.setCreateUser(getUserId()); + + return sysFormLogService.save(sysFormLog) ? success() : error(); + } + + /** + * 修改数据 + */ + @PostMapping("/update") + @ApiOperation(value = "修改数据") + public Result update(@Validated @RequestBody SysFormLogAddDto dto) { + if (dto.getFormLogId() == null) { + return error("报表记录id参数缺少"); + } + SysFormTemp temp = sysFormTempService.getById(dto.getFormTempId()); + if (temp == null) { + return error("报表模板不存在"); + } + SysFormLog sysFormLog = new SysFormLog(); + sysFormLog.setFormLogId(dto.getFormLogId()); + sysFormLog.setFormTempId(dto.getFormTempId()); + sysFormLog.setFormKey(dto.getFormKey() == null ? temp.getFormKey() + "_" + DateUtils.dateTimeNow() : dto.getFormKey()); + sysFormLog.setFormType(temp.getFormType()); + sysFormLog.setFormName(dto.getFormName()); + sysFormLog.setFormValue(JSONObject.toJSONString(dto.get_formValue())); + sysFormLog.setUpdateUser(getUserId()); + return sysFormLogService.updateById(sysFormLog) ? success() : error(); + } + + /** + * 删除数据 + */ + @PostMapping("/delete") + @ApiOperation(value = "删除数据") + public Result delete(@RequestBody List idList) { + return sysFormLogService.removeBatchByIds(idList) ? success() : error(); + } + + @GetMapping("/download/{formLogId}") + @ApiOperation(value = "下载") + public void download(@ApiParam(value = "报表id") @PathVariable(value = "formLogId") Long formLogId, HttpServletResponse response) { + SysFormLog sysFormLog = sysFormLogService.getById(formLogId); + if (sysFormLog.getFormTempId() == null) { + return; + } + SysFormTemp formTemp = sysFormTempService.getById(sysFormLog.getFormTempId()); + List list = JSONObject.parseArray(sysFormLog.getFormValue(), FieldData.class); + wordExportService.generateCharts(formTemp.getTemplatePath(), sysFormLog.getFormName(), formTemp.getFormKey(), formTemp.getFormName(), list, response); + } +} + diff --git a/system/src/main/java/com/yyy/system/controller/SysFormTempController.java b/system/src/main/java/com/yyy/system/controller/SysFormTempController.java new file mode 100644 index 0000000..b1102ec --- /dev/null +++ b/system/src/main/java/com/yyy/system/controller/SysFormTempController.java @@ -0,0 +1,333 @@ +package com.yyy.system.controller; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.yyy.common.config.AppConfig; +import com.yyy.common.core.controller.BaseController; +import com.yyy.common.core.domain.Result; +import com.yyy.common.core.domain.ResultCode; +import com.yyy.common.core.page.TableDataInfo; +import com.yyy.common.enums.FieldDataTypeEnum; +import com.yyy.common.form.FieldData; +import com.yyy.common.utils.bean.BeanUtils; +import com.yyy.common.utils.common.StringUtils; +import com.yyy.common.utils.file.FileTypeUtils; +import com.yyy.common.utils.file.FileUploadUtils; +import com.yyy.common.utils.file.FileUtils; +import com.yyy.common.utils.poi.ExcelUtil; +import com.yyy.common.utils.poi.FormExportUtils; +import com.yyy.system.entity.excel.SysFormTempExcel; +import com.yyy.system.entity.pojo.SysFormTemp; +import com.yyy.system.entity.dto.SysFormTempDto; +import com.yyy.system.entity.vo.SysFormTempVo; +import com.yyy.system.service.SysFormTempService; +import com.yyy.system.service.WordExportService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.io.ClassPathResource; +import org.springframework.util.StreamUtils; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.PrintWriter; +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +/** + * 表单文档模板信息管理(sys_form_temp)表控制层 + * + * @author Fangy + * @since 2024-09-18 11:38:58 + */ +@RestController +@Api(tags = "流程表单-表单文档模板信息管理相关接口") +@RequestMapping("api/v2/sysFormTemp") +public class SysFormTempController extends BaseController { + + private static final Logger logger = LoggerFactory.getLogger(SysFormTempController.class); + /** + * 服务对象 + */ + @Resource + private SysFormTempService sysFormTempService; + + @Resource + private WordExportService wordExportService; + + @PostMapping("/all") + @ApiOperation(value = "查询所有") + public Result> all() { +// return success(SysFormTempVo.ToVo(sysFormTempService.query(new SysFormTempDto()))); + return success(sysFormTempService.query(new SysFormTempDto())); + } + + /** + * 查询分页数据 + */ + @PostMapping("/list") + @ApiOperation(value = "查询分页数据") + public TableDataInfo list(@RequestBody SysFormTempDto sysFormTempDto) { + startPage(); + List list = sysFormTempService.query(sysFormTempDto); + return getDataTable(SysFormTempVo.ToVo(list)); + } + + /** + * 查询详情数据 + */ + @PostMapping("/query") + @ApiOperation(value = "查询详情数据", notes = "formTempId") + public Result query(@RequestParam Long id) { + return success(SysFormTempVo.ToVo(sysFormTempService.getById(id))); + } + + /** + * 新增数据 + */ + @PostMapping("/add") + @ApiOperation(value = "新增数据") + public Result add(@Validated @RequestBody SysFormTempDto sysFormTempDto) { + SysFormTemp sysFormTemp = new SysFormTemp(); + BeanUtils.copyProperties(sysFormTempDto, sysFormTemp); + sysFormTemp.setCreateUser(getUserId()); + sysFormTemp.setFormValue(JSONObject.toJSONString(sysFormTempDto.get_formValue())); + + boolean isSaved = sysFormTempService.save(sysFormTemp); + if (isSaved) { + return success(sysFormTemp); + } else { + return error("Failed to save the form template."); + } + //return sysFormTempService.save(sysFormTemp) ? success() : error(); + } + + /** + * 修改数据 + */ + @PostMapping("/update") + @ApiOperation(value = "修改数据") + public Result update(@Validated @RequestBody SysFormTempDto sysFormTempDto) { + SysFormTemp sysFormTemp = new SysFormTemp(); + BeanUtils.copyProperties(sysFormTempDto, sysFormTemp); + sysFormTemp.setUpdateUser(getUserId()); + sysFormTemp.setFormValue(JSONObject.toJSONString(sysFormTempDto.get_formValue())); + return sysFormTempService.updateById(sysFormTemp) ? success() : error(); + } + + /** + * 删除数据 + */ + @PostMapping("/delete") + @ApiOperation(value = "删除数据") + public Result delete(@RequestBody List idList) { + if (idList.contains(1L)|| idList.contains(2L)|| idList.contains(3L)|| idList.contains(4L)){ + return error("模板数据不允许删除!"); + } + return sysFormTempService.removeBatchByIds(idList) ? success() : error(); + } + + @PostMapping("/exportExcel") + @ApiOperation(value = "导出表单模板excel") + public void exportExcel(@RequestBody List idList, HttpServletResponse response) { + List list = sysFormTempService.listByIds(idList); + ExcelUtil util = new ExcelUtil<>(SysFormTempExcel.class); + util.exportExcel(response, SysFormTempExcel.ToExcel(list), "表单模板"); + } + + @PostMapping("/importByExcel") + @ApiOperation(value = "导入表单模板excel") + public Result importByExcel(MultipartFile file) throws Exception { + ExcelUtil util = new ExcelUtil<>(SysFormTempExcel.class); + List list = SysFormTempExcel.ToPojo(util.importExcel(file.getInputStream())); + return toResult(sysFormTempService.saveBatch(list)); + } + + @PostMapping("/importTemplate") + @ApiOperation(value = "下载{扩展字段}模板示例") + public void importTemplate(HttpServletResponse response) { + List _formValue = new ArrayList<>(); + _formValue.add(FieldData.builder().key("ext1").name("字符串").remark("备注1").sort(1).type(FieldDataTypeEnum.STRING).value("文本示例").build()); + _formValue.add(FieldData.builder().key("ext2").name("数字").remark("备注2").sort(2).type(FieldDataTypeEnum.NUMBER).value(123.45).build()); + _formValue.add(FieldData.builder().key("ext3").name("日期").remark("备注3").sort(3).type(FieldDataTypeEnum.DATE).value("2024-01-01").build()); + + JSONObject radioValue = new JSONObject(); + radioValue.put("fields", Arrays.asList("选项1", "选项2", "选项3")); + radioValue.put("value", "选项1"); + _formValue.add(FieldData.builder().key("ext4").name("单选框").remark("备注4").sort(4).type(FieldDataTypeEnum.RADIO).value(radioValue).build()); + + JSONObject listValue = new JSONObject(); + listValue.put("fields", Arrays.asList("key1", "key2", "key3")); + JSONObject listItem1 = new JSONObject(); + listItem1.put("key1", "value1"); + listItem1.put("key2", "value2"); + listItem1.put("key3", "value3"); + JSONObject listItem2 = new JSONObject(); + listItem2.put("key1", "value11"); + listItem2.put("key2", "value22"); + listItem2.put("key3", "value33"); + JSONObject listItem3 = new JSONObject(); + listItem3.put("key1", "value111"); + listItem3.put("key2", "value222"); + listItem3.put("key3", "value333"); + JSONArray list = new JSONArray(); + list.add(listItem1); + list.add(listItem2); + list.add(listItem3); + listValue.put("value", list); + _formValue.add(FieldData.builder().key("ext5").name("列表").remark("备注5").sort(5).type(FieldDataTypeEnum.LIST).value(listValue).build()); + + ExcelUtil util = new ExcelUtil<>(FieldData.class); + util.exportExcel(response, _formValue, "扩展属性表单模板"); + } + + @PostMapping("/importData") + @ApiOperation(value = "上传{扩展字段}表单模板,返回扩展字段Json串") + public Result importData(MultipartFile file) throws Exception { + ExcelUtil util = new ExcelUtil<>(FieldData.class); + return success(util.importExcel(file.getInputStream())); + } + + @PostMapping("/formTemplate") + @ApiOperation(value = "下载word和excel的模板示例 、默认维修的模板 ") + public void formTemplate(HttpServletResponse response) { + /** + * 下载resources/temp 下的 个人巡检记录.xlsx和仪器设备维修记录.docx文件 zip + */ + String[] fileNames = { + "temp/设备维修模板.docx", + "temp/设备巡检模板.docx", + "temp/设备保养模板.docx", + "temp/资产设备盘点模板.docx" + }; + + // 设置响应内容类型为ZIP + response.setContentType("application/zip"); + try { + // 设置响应头,指定下载的文件名,处理中文名的编码问题 + String zipFileName = "模板示例.zip"; + String encodedFileName = URLEncoder.encode(zipFileName, "UTF-8").replaceAll("\\+", "%20"); + response.setHeader("Content-Disposition", "attachment; filename*=UTF-8''" + encodedFileName); + + // 创建Zip输出流 + ZipOutputStream zos = new ZipOutputStream(response.getOutputStream()); + + // 遍历文件列表并添加到ZIP中 + for (String filePath : fileNames) { + ClassPathResource resource = new ClassPathResource(filePath); + if (resource.exists()) { + // 获取文件名 + String fileName = new File(filePath).getName(); + // 创建新的ZIP条目 + ZipEntry zipEntry = new ZipEntry(fileName); + zos.putNextEntry(zipEntry); + + // 读取文件内容并写入ZIP + InputStream is = resource.getInputStream(); + StreamUtils.copy(is, zos); + is.close(); + + // 关闭当前ZIP条目 + zos.closeEntry(); + } else { + logger.error("文件未找到: " + filePath); + } + } + + // 关闭ZIP输出流 + zos.finish(); + zos.close(); + + } catch (IOException e) { + try { + response.reset(); + response.setContentType("application/json"); + response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); + PrintWriter writer = response.getWriter(); + writer.write("{\"error\":\"文件下载失败,请稍后重试。\"}"); + writer.flush(); + writer.close(); + } catch (IOException ex) { + logger.error(ex.getMessage(), e); + } + } + } + + + @PostMapping("/preview") + @ApiOperation(value = "模板预览(不支持Excel !!!excel转pdf显示需要授权,只能文件下载下来预览)") + public void preview(@RequestParam Long id, HttpServletResponse response) { + SysFormTemp formTemp = sysFormTempService.getById(id); + if (StringUtils.isNotBlank(formTemp.getTemplatePath())) { + List list = JSONObject.parseArray(formTemp.getFormValue(), FieldData.class); + if (!wordExportService.generatePDF(formTemp.getTemplatePath(), formTemp.getFormName(), formTemp.getFormKey(), formTemp.getFormName(), list, response)) { + logger.error("模板预览失败:模板id:" + id); + } + } + } + + @PostMapping("/confirm") + @ApiOperation(value = "模板确认 (不支持Excel !!!excel转pdf显示需要授权,只能文件下载下来预览)") + public void confirm(@RequestBody SysFormTempDto dto, HttpServletResponse response) { + if (StringUtils.isNotBlank(dto.getTemplatePath())) { + wordExportService.generatePDF(dto.getTemplatePath(), dto.getFormName(), dto.getFormKey(), dto.getFormName(), dto.get_formValue(), response); + } + } + + @ApiOperation(value = "模板上传接口 (限制文件输入格式) 系统会将doc格式转换成docx") + @PostMapping("/upload") + @ResponseBody + public Result uploadFile(MultipartFile file) { + try { + String extension = FileTypeUtils.getFileType(file.getOriginalFilename()); + if ("xls".equals(extension) || "xlsx".equals(extension)) { + //TODO 暂不支持 xls/xlsx 格式文件 + return error("暂不支持 xls/xlsx 格式文件"); + } + if (!"docx".equals(extension) && !"doc".equals(extension) && !"xls".equals(extension) && !"xlsx".equals(extension)) { + return error("文件格式错误,请上传docx/doc/xls/xlsx格式文件"); + } + + // 上传文件路径 + String filePath = AppConfig.getTempPath(); + File tempFile = FileUploadUtils.convertMultipartFileToFile(file, filePath + "/" + file.getOriginalFilename()); + String fileName = file.getOriginalFilename(); + + List fields = new ArrayList<>(); + FormExportUtils exportUtils = new FormExportUtils<>(FieldData.class); + + if ("doc".equals(extension)) { + fileName = FileUtils.getNameNotSuffix(file.getOriginalFilename()) + ".docx"; + File newFile = new File(filePath + "/" + fileName); + FileUploadUtils.doc2docx(tempFile, newFile); + fields = exportUtils.getFieldData(newFile); + }else { + fields = exportUtils.getFieldData(tempFile); + } + + // 上传并返回新文件名称 + JSONObject result = new JSONObject(); + result.put("fileName", filePath + "/" + fileName); + result.put("newFileName", fileName); + result.put("originalFilename", file.getOriginalFilename()); + result.put("_formValue", fields); + return new Result(ResultCode.success, result); + } catch (Exception e) { + return new Result(ResultCode.operate_failure, e.getMessage()); + } + } +} + diff --git a/system/src/main/java/com/yyy/system/controller/SysLogController.java b/system/src/main/java/com/yyy/system/controller/SysLogController.java new file mode 100644 index 0000000..5202766 --- /dev/null +++ b/system/src/main/java/com/yyy/system/controller/SysLogController.java @@ -0,0 +1,91 @@ +package com.yyy.system.controller; + + +import com.yyy.common.core.controller.BaseController; +import com.yyy.common.core.domain.Result; +import com.yyy.common.core.page.TableDataInfo; +import com.yyy.common.utils.bean.BeanUtils; +import com.yyy.system.entity.pojo.SysLog; +import com.yyy.system.entity.dto.SysLogDto; +import com.yyy.system.entity.vo.SysLogVo; +import com.yyy.system.service.SysLogService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 系统日志信息表(sys_log)表控制层 + * + * @author Fangy + * @since 2024-09-24 15:57:56 + */ +@RestController +@Api(tags = "系统日志信息表相关接口") +@RequestMapping("api/v2/sysLog") +public class SysLogController extends BaseController { + + private static final Logger logger = LoggerFactory.getLogger(SysLogController.class); + /** + * 服务对象 + */ + @Resource + private SysLogService sysLogService; + + /** + * 查询分页数据 + */ + @PostMapping("/list") + @ApiOperation(value = "查询分页数据") + public TableDataInfo list(@RequestBody SysLogDto sysLogDto) { + startPage(); + List list = sysLogService.query(sysLogDto); + return getDataTable(SysLogVo.ToVo(list)); + } +// +// /** +// * 查询详情数据 +// */ +// @PostMapping("/query") +// @ApiOperation(value = "查询详情数据") +// public Result query(@RequestParam Long id) { +// return success(SysLogVo.ToVo(sysLogService.getById(id))); +// } +// +// /** +// * 新增数据 +// */ +// @PostMapping("/add") +// @ApiOperation(value = "新增数据") +// public Result add(@Validated @RequestBody SysLogDto sysLogDto) { +// SysLog sysLog = new SysLog(); +// BeanUtils.copyProperties(sysLogDto, sysLog); +// return sysLogService.save(sysLog) ? success() : error(); +// } +// +// /** +// * 修改数据 +// */ +// @PostMapping("/update") +// @ApiOperation(value = "修改数据") +// public Result update(@Validated @RequestBody SysLogDto sysLogDto) { +// SysLog sysLog = new SysLog(); +// BeanUtils.copyProperties(sysLogDto, sysLog); +// return sysLogService.updateById(sysLog) ? success() : error(); +// } +// +// /** +// * 删除数据 +// */ +// @PostMapping("/delete") +// @ApiOperation(value = "删除数据") +// public Result delete(@RequestBody List idList) { +// return sysLogService.removeBatchByIds(idList) ? success() : error(); +// } +} + diff --git a/system/src/main/java/com/yyy/system/controller/TestController.java b/system/src/main/java/com/yyy/system/controller/TestController.java new file mode 100644 index 0000000..3dc9187 --- /dev/null +++ b/system/src/main/java/com/yyy/system/controller/TestController.java @@ -0,0 +1,103 @@ +package com.yyy.system.controller; + + +import com.yyy.common.core.controller.BaseController; +import com.yyy.common.core.domain.Result; +import com.yyy.common.core.domain.entity.SysDictData; +import com.yyy.common.utils.common.DictUtils; +import com.yyy.system.entity.word.enums.SanitaryConditionEnum; +import com.yyy.system.entity.word.form.RepairForm; +import com.yyy.system.entity.word.form.ReplacementParts; +import com.yyy.system.service.WordExportService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.*; + + +@RestController +@Api(tags = "测试") +@RequestMapping("api/test") +public class TestController extends BaseController { + + private static final Logger logger = LoggerFactory.getLogger(TestController.class); + + @Autowired + private WordExportService wordExportService; + + /** + * 查询分页数据 + */ + @GetMapping("/get") + @ApiOperation(value = "get") + public Result get() { + return success(DictUtils.getDictCache("test")); + } + + @GetMapping("/set") + @ApiOperation(value = "set") + public Result set() { + List dictDatas = new ArrayList<>(); + + SysDictData sysDictData1 = new SysDictData(); + sysDictData1.setDictCode(1L); + sysDictData1.setDictSort(1L); + sysDictData1.setDictLabel("label1"); + sysDictData1.setDictValue("value1"); + sysDictData1.setDictType("type1"); + sysDictData1.setCssClass("cssClass1"); + sysDictData1.setListClass("listClass1"); + sysDictData1.setIsDefault("Y"); + sysDictData1.setStatus("0"); + sysDictData1.setCreateBy("admin"); + sysDictData1.setCreateTime(new Date()); + sysDictData1.setUpdateBy("admin"); + sysDictData1.setUpdateTime(new Date()); + sysDictData1.setRemark("remark1"); + + SysDictData sysDictData2 = new SysDictData(); + sysDictData2.setDictCode(2L); + sysDictData2.setDictSort(2L); + sysDictData2.setDictLabel("label2"); + sysDictData2.setDictValue("value2"); + sysDictData2.setDictType("type2"); + sysDictData2.setCssClass("cssClass2"); + sysDictData2.setListClass("listClass2"); + sysDictData2.setIsDefault("N"); + sysDictData2.setStatus("1"); + sysDictData2.setCreateBy("admin"); + sysDictData2.setCreateTime(new Date()); + sysDictData2.setUpdateBy("admin"); + sysDictData2.setUpdateTime(new Date()); + sysDictData2.setRemark("remark2"); + + dictDatas.add(sysDictData1); + dictDatas.add(sysDictData2); + + DictUtils.setDictCache("test", dictDatas); + + return success("数据设置成功"); + } + + @PostMapping("/exportWord") + @ApiOperation(value = "exportWord") + public void export(HttpServletResponse resp, HttpServletRequest req) + { + List replacementParts = new ArrayList<>(); + replacementParts.add(ReplacementParts.builder().count(1).replacementPartModel("123456").replacementPartName("打印机").build()); + replacementParts.add(ReplacementParts.builder().count(2).replacementPartModel("123456").replacementPartName("打印机").build()); + replacementParts.add(ReplacementParts.builder().count(3).replacementPartModel("123456").replacementPartName("打印机").build()); + + RepairForm data = new RepairForm("RD-MR-EQ-024", "仪器设备维修记录", "打印机", "力宝大厦", "得力xxx", "123456", replacementParts, SanitaryConditionEnum.getData(SanitaryConditionEnum.EXCELLENT), "E:/data/设备维修模板.docx"); + if (!wordExportService.generateCharts(data, "E:/data/test.docx")) { + logger.error("模板文件格式错误,请使用Word或WPS另存为docx格式"); + } + } +} + diff --git a/system/src/main/java/com/yyy/system/entity/bo/JobDefect.java b/system/src/main/java/com/yyy/system/entity/bo/JobDefect.java new file mode 100644 index 0000000..f243cb5 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/bo/JobDefect.java @@ -0,0 +1,124 @@ +package com.yyy.system.entity.bo; + +import com.yyy.common.form.FieldData; +import com.yyy.system.entity.pojo.EamAsset; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.List; +import java.util.stream.Collectors; + +@ApiModel("巡检、保养、盘点执行信息数据") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class JobDefect implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(notes = "设备Id") + private Long assetId; + + @ApiModelProperty(notes = "设备名称") + private String name; + + @ApiModelProperty(notes = "设备编号") + private String assetCode; + + @ApiModelProperty(notes = "设备分类编号") + private Long categoryId; + + @ApiModelProperty(notes = "设备分类名称") + private String categoryName; + + @ApiModelProperty(notes = "设备规格型号") + private String model; + + @ApiModelProperty(notes = "资产状态(0-闲置 1-在用 2-借用中 3-维修中 4-调拨中 5-待报废 6-已处置 7-库存 8-已报废)") + private Integer status; + +// @ApiModelProperty(notes = "设备标签?") +// private String label; + + @ApiModelProperty(notes = "管理人员id") + private Long managerId; + + @ApiModelProperty(notes = "管理人员名称") + private String managerName; + + @ApiModelProperty(notes = "资产厂商id") + private Long manufacturersVendorId; + + @ApiModelProperty(notes = "资产厂商名称") + private String manufacturersVendorName; + + @ApiModelProperty(notes = "存放位置id") + private Long positionId; + + @ApiModelProperty(notes = "设备位置") + private String positionName; + + @ApiModelProperty(notes = "详细位置") + private String positionDetail; + + @ApiModelProperty(notes = "巡检状态:0-待检,1-正常(完成),2-异常,3-取消。 盘点状态:0-待盘点,1-正常(完成),2-盘赢,3-盘亏") + private Integer defectStatus = 0; + + @ApiModelProperty(notes = "是否自动发起报修流程") + private Boolean autoRepair = false; + + @ApiModelProperty(notes = "总结") + private String notes; + + @ApiModelProperty(notes = "图片") + private String img; + + @ApiModelProperty(notes = "附件") + private String attachment; + + @ApiModelProperty(notes = "检查项目") + List _formValue; + + @ApiModelProperty(notes = "备品备件信息") + List sparePartsList; + + @ApiModelProperty(notes = "维修/保养成本") + private Double cost; + + @ApiModelProperty(notes = "审批意见(使用部门)") + private String opinion; + + public static JobDefect toDefect(EamAsset asset, List _formValue) { + return JobDefect.builder() + .assetId(asset.getAssetId()) + .assetCode(asset.getAssetCode()) + .name(asset.getName()) + .categoryId(asset.getCategoryId()) + .categoryName(asset.get_category() != null ? asset.get_category().getCategoryName() : "") + .model(asset.getModel()) + .status(asset.getStatus()) + .managerId(asset.getManager()) + .managerName(asset.get_manager() != null ? asset.get_manager().getUserName() : "") + .manufacturersVendorId(asset.getManufacturersVendorId()) + .manufacturersVendorName(asset.get_manufacturersVendor() != null ? asset.get_manufacturersVendor().getName() : "") + .positionId(asset.getPositionId()) + .positionName(asset.get_position() != null ? asset.get_position().getName() : "") + .positionDetail(asset.getPositionDetail()) + .defectStatus(0) + ._formValue(_formValue) + .sparePartsList(null) + .cost(null) + .opinion(null) + .build(); + } + + public static List toDefectList(List assets, List _formValue) { + return assets.stream().map(asset -> toDefect(asset, _formValue)).collect(Collectors.toList()); + } +} diff --git a/system/src/main/java/com/yyy/system/entity/bo/SpareParts.java b/system/src/main/java/com/yyy/system/entity/bo/SpareParts.java new file mode 100644 index 0000000..8b4fb79 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/bo/SpareParts.java @@ -0,0 +1,44 @@ +package com.yyy.system.entity.bo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@ApiModel("备品备件") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class SpareParts implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(notes = "设备Id") + private Long assetId; + + @ApiModelProperty(notes = "仓库Id") + private Long warehouseId; + + @ApiModelProperty(notes = "设备名称") + private String name; + + @ApiModelProperty(notes = "设备编号") + private String assetCode; + + @ApiModelProperty(notes = "设备分类编号") + private Long categoryId; + + @ApiModelProperty(notes = "设备分类名称") + private String categoryName; + + @ApiModelProperty(notes = "设备规格型号") + private String model; + + @ApiModelProperty(notes = "数量") + private Integer count; +} diff --git a/system/src/main/java/com/yyy/system/entity/dto/DeviceJobDto.java b/system/src/main/java/com/yyy/system/entity/dto/DeviceJobDto.java new file mode 100644 index 0000000..30a63f8 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/dto/DeviceJobDto.java @@ -0,0 +1,74 @@ +package com.yyy.system.entity.dto; + +import com.alibaba.fastjson.annotation.JSONField; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.yyy.common.enums.PlanTypeEnum; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.util.Date; +import java.util.List; + +@ApiModel("巡检、保养、盘点任务修改创建") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class DeviceJobDto { + + @ApiModelProperty(notes = "任务类型 (inspection-巡检计划、maintenance-保养计划、stocktaking-盘点计划)", required = true) + @NotNull(message = "任务类型不能为空") + private PlanTypeEnum jobType; + + @ApiModelProperty(value = "任务名称", required = true) + @NotBlank(message = "任务名称不能为空") + private String name; + + @ApiModelProperty(value = "计划编号") + private String businessId; + + @ApiModelProperty(value = "计划用时 /天") + private Integer duration; + + @ApiModelProperty(value = "实际开始时间,任务开始时间", required = true) + @NotNull(message = "任务开始时间不能为空") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @JSONField(format="yyyy-MM-dd HH:mm:ss") + private Date actualStartTime; + + @ApiModelProperty(value = "执行班组Id", required = true) + private Long teamId; + + @ApiModelProperty(value = "执行班组Name", required = true) + private String teamName; + + @ApiModelProperty(notes = "超期限制") + private boolean limit; + + @ApiModelProperty(notes = "顺序巡检") + private boolean order; + + @ApiModelProperty("备注") + private String remark; + + @ApiModelProperty(notes = "表单Id") + private Long formTempId; + + @ApiModelProperty(notes = "表单模板名称") + private String formName; + + @ApiModelProperty(notes = "表单模板地址url") + private String templatePath; +// +// @ApiModelProperty(notes = "表单内容") +// private List _formValue; + + @ApiModelProperty(notes = "资产库存信息List") + private List assetIdList; +} diff --git a/system/src/main/java/com/yyy/system/entity/dto/DeviceJobQueryDto.java b/system/src/main/java/com/yyy/system/entity/dto/DeviceJobQueryDto.java new file mode 100644 index 0000000..b3e6d9f --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/dto/DeviceJobQueryDto.java @@ -0,0 +1,33 @@ +package com.yyy.system.entity.dto; + +import com.yyy.common.enums.FlowStatus; +import com.yyy.common.enums.PlanTypeEnum; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotNull; + +@ApiModel("任务查询参数") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DeviceJobQueryDto { + + @NotNull(message = "任务类型不能为空") + @ApiModelProperty(notes = "任务类型 (inspection-巡检计划、maintenance-保养计划、stocktaking-盘点计划)", required = true) + private PlanTypeEnum jobType; + + @ApiModelProperty(notes = "流程状态 (1-起草 2-审批中 3-已结束 4-已驳回 5-已废弃 6-流程异常 7-待指派 8-已挂起)") + private FlowStatus status; + + @ApiModelProperty(notes = "任务名称") + private String name; + + @ApiModelProperty(notes = "创建方式") + private String createType; +} diff --git a/system/src/main/java/com/yyy/system/entity/dto/DeviceJobRepairDto.java b/system/src/main/java/com/yyy/system/entity/dto/DeviceJobRepairDto.java new file mode 100644 index 0000000..6f719da --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/dto/DeviceJobRepairDto.java @@ -0,0 +1,75 @@ +package com.yyy.system.entity.dto; + +import com.alibaba.fastjson.annotation.JSONField; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.yyy.common.enums.EncodingEum; +import com.yyy.common.utils.common.StringUtils; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +@ApiModel("维修任务修改创建") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class DeviceJobRepairDto { + @ApiModelProperty(value = "任务名称", required = true) + @NotBlank(message = "任务名称不能为空") + private String name; + + @ApiModelProperty(value = "任务编号") + private String businessId; + + @ApiModelProperty(value = "故障时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @JSONField(format="yyyy-MM-dd HH:mm:ss") + private String plannedDate; + + @ApiModelProperty("故障说明备注") + private String remark; + + @ApiModelProperty(notes = "图片") + private String img; + + @ApiModelProperty(notes = "附件") + private String attachment; + + @ApiModelProperty(notes = "资产库存信息List") + private List assetIdList; + + @ApiModelProperty(notes = "表单Id") + private Long formTempId; + + @ApiModelProperty(notes = "表单模板名称") + private String formName; + + @ApiModelProperty(value = "计划用时 /天") + private Integer duration = 0; + + @ApiModelProperty(notes = "超期限制") + private boolean limit = false; + +// @ApiModelProperty(notes = "表单模板地址url") +// private String templatePath; + +// @ApiModelProperty(notes = "表单内容") +// private List _formValue; + +// @ApiModelProperty(notes = "备品备件信息") +// List sparePartsList; + + public void setBusinessId(String businessId) { + if (StringUtils.isBlank(businessId)){ + this.businessId = EncodingEum.REPAIR.getBusinessId(); + }else { + this.businessId = businessId; + } + } +} diff --git a/system/src/main/java/com/yyy/system/entity/dto/DevicePlanAddDto.java b/system/src/main/java/com/yyy/system/entity/dto/DevicePlanAddDto.java new file mode 100644 index 0000000..c8aa0b9 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/dto/DevicePlanAddDto.java @@ -0,0 +1,135 @@ +package com.yyy.system.entity.dto; + +import com.alibaba.fastjson.annotation.JSONField; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.yyy.common.annotation.excel.Excel; +import com.yyy.common.constant.ScheduleConstants; +import com.yyy.common.enums.PlanCycleTypeEnum; +import com.yyy.common.enums.PlanTypeEnum; +import com.yyy.common.form.FieldData; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.apache.poi.ss.usermodel.IndexedColors; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.util.Date; +import java.util.List; + +@ApiModel("计划新增/修改") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DevicePlanAddDto { + + @ApiModelProperty(notes = "主键") + private Long jobId; + + @NotNull(message = "计划类型不能为空") + @ApiModelProperty(notes = "计划类型 (inspection-巡检计划、maintenance-保养计划、stocktaking-盘点计划)", required = true) + @Excel(name = "计划类型", readConverterExp = "inspection=巡检计划,maintenance=保养计划,stocktaking=盘点计划", combo = "巡检计划,保养计划,盘点计划") + private PlanTypeEnum PlanType; + + //内容 + @NotBlank(message = "计划名称不能为空") + @ApiModelProperty(notes = "计划名称", required = true) + @Excel(name = "计划名称") + private String name; + + @ApiModelProperty(notes = "计划编号") + @Excel(name = "计划编号") + private String businessId; + + @ApiModelProperty(notes = "执行班组", required = true) + private Integer teamId; + + @ApiModelProperty(notes = "执行班组名称", required = true) + @Excel(name = "执行班组") + private String teamName; + + @ApiModelProperty(notes = "计划周期类型(day=日循环计划,week=周循环计划,month=月循环计划,once=单任务计划)", required = true) + @Excel(name = "执行周期", readConverterExp = "day=日循环计划,week=周循环计划,month=月循环计划,once=单任务计划", combo = "日循环计划,周循环计划,月循环计划,单任务计划") + private PlanCycleTypeEnum CycleType; + + @ApiModelProperty(notes = "计划开始", required = true) + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "开始时间", dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date expectedStartTime; + + @ApiModelProperty(notes = "计划结束", required = true) + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "截止时间", dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date expectedFinishTime; + + @ApiModelProperty(notes = "任务开始", required = true) + @NotNull(message = "任务开始时间不能为空") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date actualStartTime; + + @ApiModelProperty(notes = "重复间隔(/天、周、月) 取值范围(天:0-30 )") + private Integer interval = 0; + + @ApiModelProperty(notes = "跳过周末") + private boolean skipWeekend; + + @ApiModelProperty(notes = "任务时长 /天") + private Integer duration; + + @ApiModelProperty(notes = "超期限制") + private boolean limit; + + @ApiModelProperty(notes = "顺序巡检") + private boolean order; + + @ApiModelProperty(notes = "计划备注") + private String remark; + + @ApiModelProperty(notes = "任务单据", required = true) + private Long formTempId; + +// @ApiModelProperty(notes = "表单标识(编号)") +// private String formKey; + + @ApiModelProperty(notes = "表单名称") + private String formName; + + @ApiModelProperty(notes = "表单内容(List<>)") + private List _formValue; + + @ApiModelProperty(notes = "表单模板地址url") + private String templatePath; + + @ApiModelProperty(notes = "是否开启拍照") + private boolean photo; + + @ApiModelProperty(notes = "任务状态(0=正常(default) 1=暂停)") + private String status = ScheduleConstants.Status.NORMAL.getValue(); + + @ApiModelProperty(notes = "计划执行错误策略: 1=立即触发执行,2=触发一次执行,3=不触发立即执行(default)") + private String misfirePolicy = ScheduleConstants.MISFIRE_DO_NOTHING; + + @ApiModelProperty(notes = "是否并发执行(0=允许 1=禁止(default))") + private String concurrent = "1"; + + @ApiModelProperty(notes = "创建人") + private Long createUser; + + @ApiModelProperty(notes = "资产库存信息List") + private List assetIdList; + + @ApiModelProperty(notes = "下次执行时间") + @Excel(name = "下次执行时间", dateFormat = "yyyy-MM-dd HH:mm:ss") + private String nextExecuteTime; + + @ApiModelProperty(notes = "设备数") + @Excel(name = "设备数") + private Integer count; +} diff --git a/system/src/main/java/com/yyy/system/entity/dto/DevicePlanQueryDto.java b/system/src/main/java/com/yyy/system/entity/dto/DevicePlanQueryDto.java new file mode 100644 index 0000000..2875378 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/dto/DevicePlanQueryDto.java @@ -0,0 +1,32 @@ +package com.yyy.system.entity.dto; + +import com.yyy.common.enums.PlanTypeEnum; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotNull; + +@ApiModel("计划查询参数") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DevicePlanQueryDto { + + @NotNull(message = "计划类型不能为空") + @ApiModelProperty(notes = "计划类型 (inspection-巡检计划、maintenance-保养计划、stocktaking-盘点计划)", required = true) + private PlanTypeEnum planType; + + @ApiModelProperty(notes = "计划名称") + private String name; + + @ApiModelProperty(notes = "任务状态(0正常 1暂停)") + private String status; + + @ApiModelProperty(notes = "班组ID") + private Integer teamId; +} diff --git a/system/src/main/java/com/yyy/system/entity/dto/EamAssetDto.java b/system/src/main/java/com/yyy/system/entity/dto/EamAssetDto.java new file mode 100644 index 0000000..b37b60e --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/dto/EamAssetDto.java @@ -0,0 +1,171 @@ +package com.yyy.system.entity.dto; + +import java.util.Date; +import java.io.Serializable; +import java.util.List; + +import com.yyy.common.form.FieldData; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.Builder; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +@ApiModel("资产信息表(EamAssetDto)传输数据类") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class EamAssetDto implements Serializable { + private static final long serialVersionUID = 624832407722399706L; + + @ApiModelProperty(notes = "主键") + private Long assetId; + + @ApiModelProperty(notes = "资产名称", required = true) + @NotBlank(message = "资产名称不能为空") + private String name; + + @ApiModelProperty(notes = "资产分类编号") + private Long categoryId; + + @ApiModelProperty(notes = "仓库id") + private Long warehouseId; + + @ApiModelProperty(notes = "所属公司") + private Long ownCompanyId; + + @ApiModelProperty(notes = "资产状态(0-闲置 1-在用 2-借用中 3-维修中 4-调拨中 5-待报废 6-已处置 7-库存 8-已报废)", required = true) + @NotNull(message = "资产状态不能为空") + private Integer status; + + @ApiModelProperty(notes = "使用组织") + private Long useOrganizationId; + + @ApiModelProperty(notes = "资产来源(0-捐赠 1-赠送 2-其他 3-采购 4-自建 5-自购)") + private Integer sourceId; + + @ApiModelProperty(notes = "管理人员id") + private Long manager; + + @ApiModelProperty(notes = "供应商id") + private Long supplierVendorId; + + @ApiModelProperty(notes = "资产厂商id") + private Long manufacturersVendorId; + + @ApiModelProperty(notes = "规格型号") + private String model; + + @ApiModelProperty(notes = "序列号") + private String serialNumber; + + @ApiModelProperty(notes = "使用人员id") + private Long useUserId; + + @ApiModelProperty(notes = "用途") + private String purpose; + + @ApiModelProperty(notes = "存放位置id") + private Long positionId; + + @ApiModelProperty(notes = "计量单位") + private String unit; + + @ApiModelProperty(notes = "详细位置") + private String positionDetail; + + @ApiModelProperty(notes = "资产备注") + private String notes; + + @ApiModelProperty(notes = "资产附件") + private String attachment; + + @ApiModelProperty(notes = "维保信息_维保厂商id") + private Long maintenanceVendor; + + @ApiModelProperty(notes = "维保信息_联系人id") + private String contactor; + + @ApiModelProperty(notes = "维保信息_维保开始") + private Date maintenanceStartDate; + + @ApiModelProperty(notes = "维保信息_维保状态(0-不需要 1-脱保 2-在保 3-未知)") + private Integer maintenanceStatus; + + @ApiModelProperty(notes = "维保信息_联系方式") + private String contact; + + @ApiModelProperty(notes = "维保信息_维保到期") + private Date maintenanceEndDate; + + @ApiModelProperty(notes = "维保信息_负责人id") + private String responsiblePerson; + + @ApiModelProperty(notes = "维保信息_维保方式(0-原厂 1-第三方)") + private Integer maintenanceType; + + @ApiModelProperty(notes = "维保信息_建议维保方式(0-原厂 1-第三方)") + private Integer suggestMaintenanceType; + + @ApiModelProperty(notes = "维保信息_维保备注") + private String maintenanceNotes; + + @ApiModelProperty(notes = "维保信息_维保附件") + private String maintenanceAttachment; + + @ApiModelProperty(notes = "财务信息_财务分类id") + private Long financialCategoryId; + + @ApiModelProperty(notes = "财务信息_费用项目id") + private Long expenseItem; + + @ApiModelProperty(notes = "财务信息_未税成本") + private Double totalAmountPrice; + + @ApiModelProperty(notes = "财务信息_客户信息") + private String customerInfo; + + @ApiModelProperty(notes = "财务信息_资产税额") + private Double taxAmountRate; + + @ApiModelProperty(notes = "财务信息_入账日期") + private Date registerDate; + + @ApiModelProperty(notes = "财务信息_财务选项id") + private Long financialOption; + + @ApiModelProperty(notes = "财务信息_资产净值") + private Double navPrice; + + @ApiModelProperty(notes = "财务信息_残值率") + private Double residualsRate; + + @ApiModelProperty(notes = "财务信息_财务备注") + private String financialNotes; + + @ApiModelProperty(notes = "财务信息_附件") + private String financialAttachment; + + @ApiModelProperty("扩展字段信息") + private List _extInfo; + + @ApiModelProperty("资产设备图片 (二期新增)") + private String img; + + @ApiModelProperty("资产设备使用手册URL (二期新增)") + private String userManual; + + @ApiModelProperty("资产设备保养手册URL (二期新增)") + private String maintenanceManual; + + @ApiModelProperty("当前页数") + private int pageNum = 1; + + @ApiModelProperty("页面大小") + private int pageSize = 10; +} diff --git a/system/src/main/java/com/yyy/system/entity/dto/EamAssetLogDto.java b/system/src/main/java/com/yyy/system/entity/dto/EamAssetLogDto.java new file mode 100644 index 0000000..8dd0a5e --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/dto/EamAssetLogDto.java @@ -0,0 +1,35 @@ +package com.yyy.system.entity.dto; + +import java.io.Serializable; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.Builder; + +@ApiModel("资产操作日志(EamAssetLogDto)传输数据类") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class EamAssetLogDto implements Serializable { + private static final long serialVersionUID = 253739933368791772L; + + @ApiModelProperty(notes = "主键") + private Long id; + + @ApiModelProperty(notes = "业务编号") + private String businessId; + + @ApiModelProperty(notes = "操作类型") + private String operationType; + + @ApiModelProperty(notes = "操作内容") + private String operationNotes; + + @ApiModelProperty(notes = "关联资产编号") + private Long assetId; + +} diff --git a/system/src/main/java/com/yyy/system/entity/dto/EamAssetQueryDto.java b/system/src/main/java/com/yyy/system/entity/dto/EamAssetQueryDto.java new file mode 100644 index 0000000..4598a6d --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/dto/EamAssetQueryDto.java @@ -0,0 +1,64 @@ +package com.yyy.system.entity.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@ApiModel("资产信息查询参数") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class EamAssetQueryDto implements Serializable { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(notes = "资产编号") + private String assetCode; + + @ApiModelProperty(notes = "资产名称") + private String name; + + @ApiModelProperty(notes = "供应商id") + private Long supplierVendorId; + + @ApiModelProperty(notes = "仓库id") + private Long warehouseId; + + @ApiModelProperty(notes = "资产分类编号") + private Long categoryId; + + @ApiModelProperty(notes = "所属公司") + private Long ownCompanyId; + + @ApiModelProperty(notes = "资产状态(0-闲置 1-在用 2-借用中 3-维修中 4-调拨中 5-待报废 6-已处置 7-库存 8-已报废)") + private Integer status; + + @ApiModelProperty(notes = "使用组织") + private Long useOrganizationId; + + @ApiModelProperty(notes = "资产来源(0-捐赠 1-赠送 2-其他 3-采购 4-自建 5-自购)") + private Integer sourceId; + + @ApiModelProperty(notes = "管理人员id") + private Long manager; + + @ApiModelProperty(notes = "资产厂商id") + private Long manufacturersVendorId; + + @ApiModelProperty(notes = "规格型号") + private String model; + + @ApiModelProperty(notes = "序列号") + private String serialNumber; + + @ApiModelProperty(notes = "使用人员id") + private Long useUserId; + + @ApiModelProperty(notes = "存放位置id") + private Long positionId; +} diff --git a/system/src/main/java/com/yyy/system/entity/dto/EamBasicCategoryDto.java b/system/src/main/java/com/yyy/system/entity/dto/EamBasicCategoryDto.java new file mode 100644 index 0000000..091b4cb --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/dto/EamBasicCategoryDto.java @@ -0,0 +1,50 @@ +package com.yyy.system.entity.dto; + +import java.io.Serializable; +import java.util.List; + +import com.yyy.common.form.FieldData; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.Builder; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +@ApiModel("资产分类信息表(EamBasicCategoryDto)传输数据类") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class EamBasicCategoryDto implements Serializable { + private static final long serialVersionUID = -59694793087911227L; + + @ApiModelProperty(notes = "资产分类编号") + private Long categoryId; + + @ApiModelProperty(notes = "资产分类名称", required = true) + @NotBlank(message = "资产分类名称不能为空") + private String categoryName; + + @ApiModelProperty(notes = "深度") + private String depth; + + @ApiModelProperty(notes = "父节点", required = true) + @NotNull(message = "父节点不能为空") + private Long parentId; + + @ApiModelProperty(notes = "安全库存上限") + private Integer upperLimit; + + @ApiModelProperty(notes = "安全库存下限") + private Integer lowerLimit; + + @ApiModelProperty(notes = "安全库存") + private Integer safetyLimit; + + @ApiModelProperty("扩展字段模板") + private List _assetExtTemp; +} diff --git a/system/src/main/java/com/yyy/system/entity/dto/EamBasicFinancialCategoryDto.java b/system/src/main/java/com/yyy/system/entity/dto/EamBasicFinancialCategoryDto.java new file mode 100644 index 0000000..49bc0bb --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/dto/EamBasicFinancialCategoryDto.java @@ -0,0 +1,42 @@ +package com.yyy.system.entity.dto; + +import java.io.Serializable; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.Builder; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +@ApiModel("财务分类信息表(EamBasicFinancialCategoryDto)传输数据类") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class EamBasicFinancialCategoryDto implements Serializable { + private static final long serialVersionUID = -96247475943876218L; + + @ApiModelProperty(notes = "财务分类id") + private Long financialCategoryId; + + @ApiModelProperty(notes = "财务分类名称", required = true) + @NotBlank(message = "财务分类名称不能为空") + private String financialCategoryName; + + @ApiModelProperty(notes = "深度") + private String depth; + + @ApiModelProperty(notes = "父节点") + private Long parentId; + + @ApiModelProperty(notes = "使用期限(月)", required = true) + @NotNull(message = "使用期限不能为空") + private Integer useTerms; + + @ApiModelProperty(notes = "备注") + private String notes; +} diff --git a/system/src/main/java/com/yyy/system/entity/dto/EamBasicMaintenanceVendorDto.java b/system/src/main/java/com/yyy/system/entity/dto/EamBasicMaintenanceVendorDto.java new file mode 100644 index 0000000..3d851ef --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/dto/EamBasicMaintenanceVendorDto.java @@ -0,0 +1,52 @@ +package com.yyy.system.entity.dto; + +import java.io.Serializable; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.Builder; + +import javax.validation.constraints.NotBlank; + +@ApiModel("维保商(EamBasicMaintenanceVendorDto)传输数据类") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class EamBasicMaintenanceVendorDto implements Serializable { + private static final long serialVersionUID = -53152788236374946L; + + @ApiModelProperty(notes = "主键") + private Long maintenanceVendorId; + + @ApiModelProperty(notes = "名称", required = true) + @NotBlank(message = "名称不能为空") + private String name; + + @ApiModelProperty(notes = "编码") + private String code; + + @ApiModelProperty(notes = "统一社会信用代码") + private String uscc; + + @ApiModelProperty(notes = "售后联系人") + private String afterSalesContactor; + + @ApiModelProperty(notes = "售后联系方式") + private String afterSalesContact; + + @ApiModelProperty(notes = "商务联系人") + private String businessContactor; + + @ApiModelProperty(notes = "商务联系方式") + private String businessContact; + + @ApiModelProperty(notes = "地址") + private String address; + + @ApiModelProperty(notes = "备注") + private String notes; +} diff --git a/system/src/main/java/com/yyy/system/entity/dto/EamBasicManufacturersVendorDto.java b/system/src/main/java/com/yyy/system/entity/dto/EamBasicManufacturersVendorDto.java new file mode 100644 index 0000000..efa0687 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/dto/EamBasicManufacturersVendorDto.java @@ -0,0 +1,38 @@ +package com.yyy.system.entity.dto; + +import java.io.Serializable; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.Builder; + +import javax.validation.constraints.NotBlank; + +@ApiModel("生产商(EamBasicManufacturersVendorDto)传输数据类") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class EamBasicManufacturersVendorDto implements Serializable { + private static final long serialVersionUID = 744965564771222550L; + + @ApiModelProperty(notes = "主键") + private Long manufacturersVendorId; + + @ApiModelProperty(notes = "名称", required = true) + @NotBlank(message = "名称不能为空") + private String name; + + @ApiModelProperty(notes = "编码") + private String code; + + @ApiModelProperty(notes = "地址") + private String address; + + @ApiModelProperty(notes = "备注") + private String notes; + +} diff --git a/system/src/main/java/com/yyy/system/entity/dto/EamBasicPositionDto.java b/system/src/main/java/com/yyy/system/entity/dto/EamBasicPositionDto.java new file mode 100644 index 0000000..fa18c81 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/dto/EamBasicPositionDto.java @@ -0,0 +1,36 @@ +package com.yyy.system.entity.dto; + +import java.io.Serializable; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.Builder; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +@ApiModel("存放位置信息表(EamBasicPositionDto)传输数据类") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class EamBasicPositionDto implements Serializable { + private static final long serialVersionUID = 584237642356107675L; + + @ApiModelProperty(notes = "资产分类编号") + private Long positionId; + + @ApiModelProperty(notes = "资产分类名称", required = true) + @NotBlank(message = "名称不能为空") + private String name; + + @ApiModelProperty(notes = "深度") + private String depth; + + @ApiModelProperty(notes = "父节点", required = true) + @NotNull(message = "父节点不能为空") + private Long parentId; +} diff --git a/system/src/main/java/com/yyy/system/entity/dto/EamBasicSupplierVendorDto.java b/system/src/main/java/com/yyy/system/entity/dto/EamBasicSupplierVendorDto.java new file mode 100644 index 0000000..d1e27bf --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/dto/EamBasicSupplierVendorDto.java @@ -0,0 +1,52 @@ +package com.yyy.system.entity.dto; + +import java.io.Serializable; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.Builder; + +import javax.validation.constraints.NotBlank; + +@ApiModel("供应商(EamBasicSupplierVendorDto)传输数据类") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class EamBasicSupplierVendorDto implements Serializable { + private static final long serialVersionUID = 775453042990179749L; + + @ApiModelProperty(notes = "主键") + private Long supplierVendorId; + + @ApiModelProperty(notes = "名称", required = true) + @NotBlank(message = "名称不能为空") + private String name; + + @ApiModelProperty(notes = "编码") + private String code; + + @ApiModelProperty(notes = "统一社会信用代码") + private String uscc; + + @ApiModelProperty(notes = "售后联系人") + private String afterSalesContactor; + + @ApiModelProperty(notes = "售后联系方式") + private String afterSalesContact; + + @ApiModelProperty(notes = "商务联系人") + private String businessContactor; + + @ApiModelProperty(notes = "商务联系方式") + private String businessContact; + + @ApiModelProperty(notes = "地址") + private String address; + + @ApiModelProperty(notes = "备注") + private String notes; +} diff --git a/system/src/main/java/com/yyy/system/entity/dto/EamBasicTeamDto.java b/system/src/main/java/com/yyy/system/entity/dto/EamBasicTeamDto.java new file mode 100644 index 0000000..991d8e0 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/dto/EamBasicTeamDto.java @@ -0,0 +1,51 @@ +package com.yyy.system.entity.dto; + +import java.util.Date; +import java.io.Serializable; +import java.util.List; + +import com.yyy.common.core.domain.dto.UmsUserKV; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.Builder; + +@ApiModel("班组信息管理(EamBasicTeamDto)传输数据类") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class EamBasicTeamDto implements Serializable { + private static final long serialVersionUID = -42505305228925777L; + + private Long teamId; + + @ApiModelProperty(notes = "班组编号") + private String teamKey; + + @ApiModelProperty(notes = "班组名称") + private String teamName; + + @ApiModelProperty(notes = "状态(0:停用/1:启用)") + private Integer status; + + @ApiModelProperty(notes = "成员") + private List _value; + + @ApiModelProperty(notes = "创建人") + private Long createUser; + + @ApiModelProperty(notes = "创建时间") + private Date createTime; + + @ApiModelProperty(notes = "修改人") + private Long updateUser; + + @ApiModelProperty(notes = "修改时间") + private Date updateTime; + + @ApiModelProperty(notes = "备注") + private String remark; +} diff --git a/system/src/main/java/com/yyy/system/entity/dto/EamBasicWarehouseDto.java b/system/src/main/java/com/yyy/system/entity/dto/EamBasicWarehouseDto.java new file mode 100644 index 0000000..9634eee --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/dto/EamBasicWarehouseDto.java @@ -0,0 +1,32 @@ +package com.yyy.system.entity.dto; + +import java.io.Serializable; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.Builder; + +import javax.validation.constraints.NotBlank; + +@ApiModel("仓库信息表(EamBasicWarehouseDto)传输数据类") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class EamBasicWarehouseDto implements Serializable { + private static final long serialVersionUID = 675397200931880870L; + + @ApiModelProperty(notes = "仓库编号") + private Long warehouseId; + + @ApiModelProperty(notes = "仓库名称", required = true) + @NotBlank(message = "名称不能为空") + private String name; + + @ApiModelProperty(notes = "状态(0:启用/1:禁用)") + private Integer status; + +} diff --git a/system/src/main/java/com/yyy/system/entity/dto/EamBusinessAllocateDto.java b/system/src/main/java/com/yyy/system/entity/dto/EamBusinessAllocateDto.java new file mode 100644 index 0000000..7877963 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/dto/EamBusinessAllocateDto.java @@ -0,0 +1,63 @@ +package com.yyy.system.entity.dto; + +import java.util.Date; +import java.io.Serializable; +import java.util.List; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.Builder; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +@ApiModel("调拨信息表(EamBusinessAllocateDto)传输数据类") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class EamBusinessAllocateDto implements Serializable { + private static final long serialVersionUID = -63102138206363679L; + + @ApiModelProperty(notes = "主键") + private Long id; + + @ApiModelProperty(notes = "业务编号") + private String businessId; + + @ApiModelProperty(notes = "业务名称", required = true) + @NotBlank(message = "名称不能为空") + private String name; + + @ApiModelProperty(notes = "状态(0-草稿、1-已完成、2-拒绝、3-审批中、4-取消)") + private Integer status; + + @ApiModelProperty(notes = "申请人") + private Long applicant; + +// @ApiModelProperty(notes = "资产编号List") +// private String assetIdList; + + @ApiModelProperty(notes = "资产库存信息List") + private List assetIdList; + + @ApiModelProperty(notes = "业务生成日期") + private Date businessGeneratedDate; + + @ApiModelProperty(notes = "备注") + private String notes; + + @ApiModelProperty(notes = "附件") + private String attach; + + @ApiModelProperty(notes = "调出仓库(去掉不作填写)") + private Long outWarehouseId; + + @ApiModelProperty(notes = "调入仓库") + @NotNull(message = "调入仓库id不能为空") + private Long inWarehouseId; + +} diff --git a/system/src/main/java/com/yyy/system/entity/dto/EamBusinessBorrowDto.java b/system/src/main/java/com/yyy/system/entity/dto/EamBusinessBorrowDto.java new file mode 100644 index 0000000..0975738 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/dto/EamBusinessBorrowDto.java @@ -0,0 +1,64 @@ +package com.yyy.system.entity.dto; + +import java.util.Date; +import java.io.Serializable; +import java.util.List; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.Builder; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +@ApiModel("借用信息表(EamBusinessBorrowDto)传输数据类") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class EamBusinessBorrowDto implements Serializable { + private static final long serialVersionUID = -50651710099451649L; + + @ApiModelProperty(notes = "主键") + private Long id; + + @ApiModelProperty(notes = "业务编号") + private String businessId; + + @ApiModelProperty(notes = "业务名称", required = true) + @NotBlank(message = "名称不能为空") + private String name; + + @ApiModelProperty(notes = "状态(0-草稿、1-已完成、2-拒绝、3-审批中、4-取消)") + private Integer status; + + @ApiModelProperty(notes = "申请人") + private Long applicant; + +// @ApiModelProperty(notes = "资产编号List") +// private String assetIdList; + + @ApiModelProperty(notes = "资产库存信息List") + private List assetIdList; + + @ApiModelProperty(notes = "业务生成日期") + private Date businessGeneratedDate; + + @ApiModelProperty(notes = "备注") + private String notes; + + @ApiModelProperty(notes = "附件") + private String attach; + + @ApiModelProperty(notes = "借用人", required = true) + @NotNull(message = "借用人信息不能为空") + private Long useUserId; + + @ApiModelProperty(notes = "预计归还时间", required = true) + @NotNull(message = "预计归还时间不能为空") + private Date returnTime; + +} diff --git a/system/src/main/java/com/yyy/system/entity/dto/EamBusinessCollectionDto.java b/system/src/main/java/com/yyy/system/entity/dto/EamBusinessCollectionDto.java new file mode 100644 index 0000000..d5f91ca --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/dto/EamBusinessCollectionDto.java @@ -0,0 +1,70 @@ +package com.yyy.system.entity.dto; + +import java.util.Date; +import java.io.Serializable; +import java.util.List; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.Builder; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +@ApiModel("资产领用信息表(EamBusinessCollectionDto)传输数据类") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class EamBusinessCollectionDto implements Serializable { + private static final long serialVersionUID = 662482349128319495L; + + @ApiModelProperty(notes = "主键") + private Long id; + + @ApiModelProperty(notes = "业务编号") + private String businessId; + + @ApiModelProperty(notes = "业务名称", required = true) + @NotBlank(message = "名称不能为空") + private String name; + + @ApiModelProperty(notes = "状态(0-草稿、1-已完成、2-拒绝、3-审批中、4-取消)") + private Integer status; + + @ApiModelProperty(notes = "申请人id") + private Long applicant; + +// @ApiModelProperty(notes = "资产编号List") +// private String assetIdList; + + @ApiModelProperty(notes = "资产库存信息List") + private List assetIdList; + + @ApiModelProperty(notes = "业务生成日期") + private Date businessGeneratedDate; + + @ApiModelProperty(notes = "备注") + private String notes; + + @ApiModelProperty(notes = "附件") + private String attach; + + @ApiModelProperty(notes = "领用后公司/部门", required = true) + @NotNull(message = "领用后公司/部门信息不能为空") + private Long useOrganizationId; + + @ApiModelProperty(notes = "领用后存放位置") + private Long positionId; + + @ApiModelProperty(notes = "使用人员id", required = true) + @NotNull(message = "使用人员信息不能为空") + private Long useUserId; + + @ApiModelProperty(notes = "详细位置") + private String positionDetail; + +} diff --git a/system/src/main/java/com/yyy/system/entity/dto/EamBusinessDto.java b/system/src/main/java/com/yyy/system/entity/dto/EamBusinessDto.java new file mode 100644 index 0000000..e21777a --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/dto/EamBusinessDto.java @@ -0,0 +1,39 @@ +package com.yyy.system.entity.dto; + +import com.yyy.common.enums.DetectTypeEnum; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@ApiModel("资产管理查询对象") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class EamBusinessDto implements Serializable { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(notes = "业务类型:ALLOCATE-资产调拨,BORROW-资产借用,COLLECTION-资产领用,OUTBOUND-资产出库,RETURN-资产归还," + + "RETURN_INVENTORY-资产退库,STORAGE-资产入库\"),\n" + + " TRANSFER(\"transfer\", \"资产转移\"),\n" + + " REPAIR_FAULT(\"repair_fault\", \"故障登记\"),\n" + + " REPAIR(\"repair\", \"设备报修\"),\n" + + " RETIREMENT(\"retirement\", \"资产报废\"),\n" + + " CLEAN(\"clean\", \"资产清理\"),\n" + + " UNKNOWN(\"null\", \"未知操作\");") + private DetectTypeEnum type; + + @ApiModelProperty(notes = "业务状态(0-草稿、1-已完成、2-拒绝、3-审批中、4-取消)") + private String status; + + @ApiModelProperty(notes = "业务编号") + private String businessId; + + @ApiModelProperty(notes = "业务名称") + private String name; +} diff --git a/system/src/main/java/com/yyy/system/entity/dto/EamBusinessOutboundDto.java b/system/src/main/java/com/yyy/system/entity/dto/EamBusinessOutboundDto.java new file mode 100644 index 0000000..05243d4 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/dto/EamBusinessOutboundDto.java @@ -0,0 +1,86 @@ +package com.yyy.system.entity.dto; + +import java.util.Date; +import java.io.Serializable; +import java.util.List; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.Builder; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +@ApiModel("出库信息表(EamBusinessOutboundDto)传输数据类") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class EamBusinessOutboundDto implements Serializable { + private static final long serialVersionUID = -27411236665281266L; + + @ApiModelProperty(notes = "主键") + private Long id; + + @ApiModelProperty(notes = "业务编号") + private String businessId; + + @ApiModelProperty(notes = "业务名称", required = true) + @NotBlank(message = "名称不能为空") + private String name; + + @ApiModelProperty(notes = "关联仓库id", required = true) + //@NotNull(message = "关联仓库信息不能为空") + private Long warehouseId; + +// @ApiModelProperty(notes = "资产编号List") +// private String assetIdList; + + @ApiModelProperty(notes = "资产库存信息List") + private List assetIdList; + + @ApiModelProperty(notes = "业务生成日期") + private Date businessGeneratedDate; + + @ApiModelProperty(notes = "备注") + private String notes; + + @ApiModelProperty(notes = "附件") + private String attach; + + @ApiModelProperty(notes = "状态(0-草稿、1-已完成、2-拒绝、3-审批中、4-取消)") + private Integer status; + + @ApiModelProperty(notes = "创建人") + private Long createUser; + + @ApiModelProperty(notes = "创建时间") + private Date createTime; + + @ApiModelProperty(notes = "修改人") + private Long updateUser; + + @ApiModelProperty(notes = "修改时间") + private Date updateTime; + + @ApiModelProperty(notes = "是否删除(0:正常/1:删除)") + private Integer isDeleted; + + @ApiModelProperty(notes = "领用公司", required = true) + @NotNull(message = "领用公司信息不能为空") + private Long ownCompanyId; + + @ApiModelProperty(notes = "领用部门", required = true) + @NotNull(message = "领用部门信息不能为空") + private Long useOrganizationId; + + @ApiModelProperty(notes = "领用人员") + private Long useUserId; + + @ApiModelProperty(notes = "出库位置") + private String positionDetail; + +} diff --git a/system/src/main/java/com/yyy/system/entity/dto/EamBusinessRegistrationDto.java b/system/src/main/java/com/yyy/system/entity/dto/EamBusinessRegistrationDto.java new file mode 100644 index 0000000..c8f2850 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/dto/EamBusinessRegistrationDto.java @@ -0,0 +1,59 @@ +package com.yyy.system.entity.dto; + +import java.util.Date; +import java.io.Serializable; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.Builder; + +import javax.validation.constraints.NotBlank; + +@ApiModel("资产登记信息表(EamBusinessRegistrationDto)传输数据类") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class EamBusinessRegistrationDto implements Serializable { + private static final long serialVersionUID = 889250606055899345L; + + @ApiModelProperty(notes = "主键") + private Long id; + + @ApiModelProperty(notes = "业务编号") + private String businessId; + + @ApiModelProperty(notes = "业务名称", required = true) + @NotBlank(message = "名称不能为空") + private String name; + + @ApiModelProperty(notes = "申请人id") + private Long applicant; + + @ApiModelProperty(notes = "状态(0-草稿、1-已完成、2-拒绝、3-审批中、4-取消)") + private Integer status; + + @ApiModelProperty(notes = "资产id") + private Long assetId; + + private String config; + + @ApiModelProperty(notes = "创建人") + private Long createUser; + + @ApiModelProperty(notes = "创建时间") + private Date createTime; + + @ApiModelProperty(notes = "修改人") + private Long updateUser; + + @ApiModelProperty(notes = "修改时间") + private Date updateTime; + + @ApiModelProperty(notes = "是否删除(0:正常/1:删除)") + private Integer isDeleted; + +} diff --git a/system/src/main/java/com/yyy/system/entity/dto/EamBusinessRetirementDto.java b/system/src/main/java/com/yyy/system/entity/dto/EamBusinessRetirementDto.java new file mode 100644 index 0000000..e750e37 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/dto/EamBusinessRetirementDto.java @@ -0,0 +1,61 @@ +package com.yyy.system.entity.dto; + +import java.util.Date; +import java.io.Serializable; +import java.util.List; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.Builder; + +import javax.validation.constraints.NotBlank; + +@ApiModel("资产报废(EamBusinessRetirementDto)传输数据类") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class EamBusinessRetirementDto implements Serializable { + private static final long serialVersionUID = -31290923290228685L; + + @ApiModelProperty(notes = "主键") + private Long id; + + @ApiModelProperty(notes = "业务编号") + private String businessId; + + @ApiModelProperty(notes = "业务名称", required = true) + @NotBlank(message = "名称不能为空") + private String name; + + @ApiModelProperty(notes = "申请人id") + private Long applicant; + +// @ApiModelProperty(notes = "资产编号List") +// private String assetIdList; + + @ApiModelProperty(notes = "资产库存信息List") + private List assetIdList; + + @ApiModelProperty(notes = "业务生成日期") + private Date businessGeneratedDate; + + @ApiModelProperty(notes = "备注") + private String notes; + + @ApiModelProperty(notes = "附件") + private String attach; + + @ApiModelProperty(notes = "状态(0-草稿、1-已完成、2-拒绝、3-审批中、4-取消)") + private Integer status; + + @ApiModelProperty(notes = "报废方式") + private String type; + + @ApiModelProperty(notes = "加急状态(0-普通、1:加急)") + private Integer expeditedStatus; + +} diff --git a/system/src/main/java/com/yyy/system/entity/dto/EamBusinessReturnDto.java b/system/src/main/java/com/yyy/system/entity/dto/EamBusinessReturnDto.java new file mode 100644 index 0000000..92f98d2 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/dto/EamBusinessReturnDto.java @@ -0,0 +1,64 @@ +package com.yyy.system.entity.dto; + +import java.util.Date; +import java.io.Serializable; +import java.util.List; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.Builder; + +import javax.validation.constraints.NotBlank; + +@ApiModel("归还信息表(EamBusinessReturnDto)传输数据类") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class EamBusinessReturnDto implements Serializable { + private static final long serialVersionUID = 400513398547554828L; + + @ApiModelProperty(notes = "主键") + private Long id; + + @ApiModelProperty(notes = "业务编号") + private String businessId; + + @ApiModelProperty(notes = "业务名称", required = true) + @NotBlank(message = "名称不能为空") + private String name; + + @ApiModelProperty(notes = "状态(0-草稿、1-已完成、2-拒绝、3-审批中、4-取消)") + private Integer status; + + @ApiModelProperty(notes = "申请人id") + private Long applicant; + + @ApiModelProperty(notes = "资产库存信息List") + private List assetIdList; + + @ApiModelProperty(notes = "业务生成日期") + private Date businessGeneratedDate; + + @ApiModelProperty(notes = "备注") + private String notes; + + @ApiModelProperty(notes = "附件") + private String attach; + + @ApiModelProperty(notes = "存放位置id") + private Long positionId; + + @ApiModelProperty(notes = "详细位置") + private String positionDetail; + + @ApiModelProperty(notes = "管理人员id") + private Long manager; + + @ApiModelProperty(notes = "使用人员id") + private Long useUserId; + +} diff --git a/system/src/main/java/com/yyy/system/entity/dto/EamBusinessReturnInventoryDto.java b/system/src/main/java/com/yyy/system/entity/dto/EamBusinessReturnInventoryDto.java new file mode 100644 index 0000000..1909dc4 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/dto/EamBusinessReturnInventoryDto.java @@ -0,0 +1,71 @@ +package com.yyy.system.entity.dto; + +import java.util.Date; +import java.io.Serializable; +import java.util.List; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.Builder; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +@ApiModel("退库信息表(EamBusinessReturnInventoryDto)传输数据类") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class EamBusinessReturnInventoryDto implements Serializable { + private static final long serialVersionUID = -83712703020240753L; + + @ApiModelProperty(notes = "主键") + private Long id; + + @ApiModelProperty(notes = "业务编号") + private String businessId; + + @ApiModelProperty(notes = "业务名称", required = true) + @NotBlank(message = "名称不能为空") + private String name; + + @ApiModelProperty(notes = "状态(0-草稿、1-已完成、2-拒绝、3-审批中、4-取消)") + private Integer status; + + @ApiModelProperty(notes = "申请人") + private Long applicant; + +// @ApiModelProperty(notes = "资产编号List") +// private String assetIdList; + + @ApiModelProperty(notes = "资产库存信息List") + private List assetIdList; + + @ApiModelProperty(notes = "业务生成日期") + private Date businessGeneratedDate; + + @ApiModelProperty(notes = "备注") + private String notes; + + @ApiModelProperty(notes = "附件") + private String attach; + + @ApiModelProperty(notes = "领用后公司/部门id", required = true) + @NotNull(message = "领用后公司/部门信息不能为空") + private Long useOrganizationId; + + @ApiModelProperty(notes = "领用后存放位置id", required = true) + @NotNull(message = "领用后存放位置信息不能为空") + private Long positionId; + + @ApiModelProperty(notes = "详细位置id") + private String positionDetail; + + @ApiModelProperty(notes = "关联仓库id", required = true) + @NotNull(message = "关联仓库信息不能为空") + private Long warehouseId; + +} diff --git a/system/src/main/java/com/yyy/system/entity/dto/EamBusinessStorageDto.java b/system/src/main/java/com/yyy/system/entity/dto/EamBusinessStorageDto.java new file mode 100644 index 0000000..b933147 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/dto/EamBusinessStorageDto.java @@ -0,0 +1,68 @@ +package com.yyy.system.entity.dto; + +import java.util.Date; +import java.io.Serializable; +import java.util.List; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.Builder; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +@ApiModel("入库信息表(EamBusinessStorageDto)传输数据类") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class EamBusinessStorageDto implements Serializable { + private static final long serialVersionUID = 256130598975168804L; + + @ApiModelProperty(notes = "主键") + private Long id; + + @ApiModelProperty(notes = "业务编号") + private String businessId; + + @ApiModelProperty(notes = "业务名称", required = true) + @NotBlank(message = "领用后公司/部门信息不能为空") + private String name; + + @ApiModelProperty(notes = "状态(0-草稿、1-已完成、2-拒绝、3-审批中、4-取消)") + private Integer status; + + @ApiModelProperty(notes = "关联仓库id", required = true) + @NotNull(message = "仓库信息不能为空") + private Long warehouseId; + +// @ApiModelProperty(notes = "资产编号List") +// private String assetIdList; + + @ApiModelProperty(notes = "资产库存信息List") + private List assetIdList; + + @ApiModelProperty(notes = "业务生成日期") + private Date businessGeneratedDate; + + @ApiModelProperty(notes = "备注") + private String notes; + + @ApiModelProperty(notes = "附件") + private String attach; + + @ApiModelProperty(notes = "管理人员id") + private Long manager; + + @ApiModelProperty(notes = "存放位置id") + private Long positionId; + + @ApiModelProperty(notes = "供应商id") + private Long supplierVendorId; + + @ApiModelProperty(notes = "购置日期") + private Date createTime; +} diff --git a/system/src/main/java/com/yyy/system/entity/dto/EamBusinessTransferDto.java b/system/src/main/java/com/yyy/system/entity/dto/EamBusinessTransferDto.java new file mode 100644 index 0000000..68b62db --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/dto/EamBusinessTransferDto.java @@ -0,0 +1,72 @@ +package com.yyy.system.entity.dto; + +import java.util.Date; +import java.io.Serializable; +import java.util.List; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.Builder; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +@ApiModel("资产转移信息表(EamBusinessTransferDto)传输数据类") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class EamBusinessTransferDto implements Serializable { + private static final long serialVersionUID = 509476249445368630L; + + @ApiModelProperty(notes = "主键") + private Long id; + + @ApiModelProperty(notes = "业务编号") + private String businessId; + + @ApiModelProperty(notes = "业务名称", required = true) + @NotBlank(message = "名称不能为空") + private String name; + + @ApiModelProperty(notes = "状态(0-草稿、1-已完成、2-拒绝、3-审批中、4-取消)") + private Integer status; + + @ApiModelProperty(notes = "资产库存信息List") + private List assetIdList; + + @ApiModelProperty(notes = "业务生成日期") + private Date businessGeneratedDate; + + @ApiModelProperty(notes = "备注") + private String notes; + + @ApiModelProperty(notes = "附件") + private String attach; + + @ApiModelProperty(notes = "调出使用公司/部门id", required = true) + @NotNull(message = "调出使用公司/部门信息不能为空") + private Long outUseOrganizationId; + + @ApiModelProperty(notes = "调入使用公司/部门id", required = true) + @NotNull(message = "调入使用公司/部门信息不能为空") + private Long inUseOrganizationId; + + @ApiModelProperty(notes = "调入管理员id", required = true) + @NotNull(message = "调入管理员信息不能为空") + private Long managerId; + + @ApiModelProperty(notes = "使用人员id", required = true) + @NotNull(message = "使用人员信息不能为空") + private Long useUserId; + + @ApiModelProperty(notes = "存放位置id") + private Long positionId; + + @ApiModelProperty(notes = "详细位置") + private String positionDetail; + +} diff --git a/system/src/main/java/com/yyy/system/entity/dto/EamRepairDto.java b/system/src/main/java/com/yyy/system/entity/dto/EamRepairDto.java new file mode 100644 index 0000000..0e6ff7e --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/dto/EamRepairDto.java @@ -0,0 +1,52 @@ +package com.yyy.system.entity.dto; + +import java.util.Date; +import java.io.Serializable; +import java.util.List; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.Builder; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +@ApiModel("维修登记信息表(EamRepairDto)传输数据类") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class EamRepairDto implements Serializable { + private static final long serialVersionUID = -74217844130364369L; + + @ApiModelProperty(notes = "主键") + private Long id; + + @ApiModelProperty(notes = "业务编号") + private String businessId; + + @ApiModelProperty(notes = "业务名称", required = true) + @NotBlank(message = "名称不能为空") + private String name; + + @ApiModelProperty(notes = "资产库存信息List") + private List assetIdList; + + @ApiModelProperty(notes = "备注") + private String notes; + + @ApiModelProperty(notes = "附件") + private String attach; + + @ApiModelProperty(notes = "计划完成时间", required = true) + @NotNull(message = "计划完成时间不能为空") + private Date plannedDate; + + @ApiModelProperty(notes = "保养计划(维修类型)id", required = true) + @NotNull(message = "保养计划(维修类型)不能为空") + private Long repairTypeId; + +} diff --git a/system/src/main/java/com/yyy/system/entity/dto/EamRepairFaultDto.java b/system/src/main/java/com/yyy/system/entity/dto/EamRepairFaultDto.java new file mode 100644 index 0000000..927ce28 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/dto/EamRepairFaultDto.java @@ -0,0 +1,42 @@ +package com.yyy.system.entity.dto; + +import java.io.Serializable; +import java.util.List; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.Builder; + +import javax.validation.constraints.NotBlank; + +@ApiModel("故障信息表(EamRepairFaultDto)传输数据类") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class EamRepairFaultDto implements Serializable { + private static final long serialVersionUID = 381025083859651223L; + + @ApiModelProperty(notes = "主键") + private Long faultId; + + @ApiModelProperty(notes = "名称", required = true) + @NotBlank(message = "名称不能为空") + private String name; + + @ApiModelProperty(notes = "图片url") + private String img; + + @ApiModelProperty(notes = "资产库存信息List") + private List assetIdList; + + @ApiModelProperty(notes = "附件") + private String attach; + + @ApiModelProperty(notes = "备注") + private String notes; + +} diff --git a/system/src/main/java/com/yyy/system/entity/dto/EamRepairTypeDto.java b/system/src/main/java/com/yyy/system/entity/dto/EamRepairTypeDto.java new file mode 100644 index 0000000..d34ba5b --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/dto/EamRepairTypeDto.java @@ -0,0 +1,34 @@ +package com.yyy.system.entity.dto; + +import java.io.Serializable; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.Builder; + +import javax.validation.constraints.NotBlank; + +@ApiModel("保养计划(维修类型)表(EamRepairTypeDto)传输数据类") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class EamRepairTypeDto implements Serializable { + private static final long serialVersionUID = -36927849869321150L; + + @ApiModelProperty(notes = "主键") + private Long repairTypeId; + + @ApiModelProperty(notes = "名称", required = true) + @NotBlank(message = "名称不能为空") + private String name; + + @ApiModelProperty(notes = "配置信息") + private String config; + + @ApiModelProperty(notes = "备注") + private String notes; +} diff --git a/system/src/main/java/com/yyy/system/entity/dto/EamSparePartsDto.java b/system/src/main/java/com/yyy/system/entity/dto/EamSparePartsDto.java new file mode 100644 index 0000000..e17496d --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/dto/EamSparePartsDto.java @@ -0,0 +1,23 @@ +package com.yyy.system.entity.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@ApiModel("备品备件关联") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class EamSparePartsDto { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(notes = "资产id") + private Long assetId; + + @ApiModelProperty(notes = "备品备件id") + private Long sparePartsId; +} diff --git a/system/src/main/java/com/yyy/system/entity/dto/EamStocktakingDetailsDto.java b/system/src/main/java/com/yyy/system/entity/dto/EamStocktakingDetailsDto.java new file mode 100644 index 0000000..9357856 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/dto/EamStocktakingDetailsDto.java @@ -0,0 +1,43 @@ +package com.yyy.system.entity.dto; + +import java.io.Serializable; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.Builder; + +import javax.validation.constraints.NotNull; + +@ApiModel("盘点明细(EamStocktakingDetailsDto)传输数据类") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class EamStocktakingDetailsDto implements Serializable { + private static final long serialVersionUID = 980010959180221430L; + + @ApiModelProperty(notes = "主键") + private Long id; + + @ApiModelProperty(notes = "盘点任务id") + private Long stocktakingJobId; + + @ApiModelProperty(notes = "盘点资产id") + private Long assetId; + + @ApiModelProperty(notes = "盘点状态(0-盘盈,1-盘亏,2-已盘点,3-带盘点,4-异常)") + @NotNull + private Integer status; + + private String img; + + @ApiModelProperty(notes = "附件") + private String attachment; + + @ApiModelProperty(notes = "备注") + private String notes; + +} diff --git a/system/src/main/java/com/yyy/system/entity/dto/EamStocktakingJobDto.java b/system/src/main/java/com/yyy/system/entity/dto/EamStocktakingJobDto.java new file mode 100644 index 0000000..6ab8986 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/dto/EamStocktakingJobDto.java @@ -0,0 +1,87 @@ +package com.yyy.system.entity.dto; + +import java.util.Date; +import java.io.Serializable; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.Builder; + +import javax.validation.constraints.NotBlank; + +@ApiModel("盘点任务表(EamStocktakingJobDto)传输数据类") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class EamStocktakingJobDto implements Serializable { + private static final long serialVersionUID = 554208677774088308L; + + @ApiModelProperty(notes = "主键") + private Long stocktakingJobId; + + @ApiModelProperty(notes = "业务名称", required = true) + @NotBlank(message = "名称不能为空") + private String name; + + @ApiModelProperty(notes = "负责人id") + private Long head; + + @ApiModelProperty(notes = "全员盘点(0-禁用,1-启用)") + private Integer fullStocktaking; + + @ApiModelProperty(notes = "盘点人id") + private Long stocktakingUserId; + + @ApiModelProperty(notes = "购置开始日期") + private Date stocktakingStartDate; + + @ApiModelProperty(notes = "购置结束日期") + private Date stocktakingEndDate; + + @ApiModelProperty(notes = "资产状态(0-闲置 1-在用 2-借用中 3-维修中 4-调拨中 5-待报废 6-已处置 7-库存 8-已报废)") + private Integer assetStatus; + + @ApiModelProperty(notes = "所属公司id") + private Long ownCompanyId; + + @ApiModelProperty(notes = "使用公司/部门id") + private Long useOrganizationId; + + @ApiModelProperty(notes = "保管人id") + private Long useUserId; + + @ApiModelProperty(notes = "资产分类id") + private Long categoryId; + + @ApiModelProperty(notes = "存放位置id") + private Long positionId; + + @ApiModelProperty(notes = "仓库id") + private Long warehouseId; + + @ApiModelProperty(notes = "盘点状态(0-未开始,1-进行中,2-取消,3-已完成)") + private Integer status; + + @ApiModelProperty(notes = "备注") + private String notes; + + @ApiModelProperty(notes = "创建人") + private Long createUser; + + @ApiModelProperty(notes = "创建时间") + private Date createTime; + + @ApiModelProperty(notes = "修改人") + private Long updateUser; + + @ApiModelProperty(notes = "修改时间") + private Date updateTime; + + @ApiModelProperty(notes = "是否删除(0:正常/1:删除)") + private Integer isDeleted; + +} diff --git a/system/src/main/java/com/yyy/system/entity/dto/EamStocktakingPlanDto.java b/system/src/main/java/com/yyy/system/entity/dto/EamStocktakingPlanDto.java new file mode 100644 index 0000000..80ecf61 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/dto/EamStocktakingPlanDto.java @@ -0,0 +1,72 @@ +package com.yyy.system.entity.dto; + +import java.util.Date; +import java.io.Serializable; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.Builder; + +import javax.validation.constraints.NotBlank; + +@ApiModel("盘点计划信息(EamStocktakingPlanDto)传输数据类") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class EamStocktakingPlanDto implements Serializable { + private static final long serialVersionUID = 816855296322664044L; + + @ApiModelProperty(notes = "主键") + private Long stocktakingPlanId; + + @ApiModelProperty(notes = "业务名称", required = true) + @NotBlank(message = "名称不能为空") + private String name; + + @ApiModelProperty(notes = "负责人id") + private Long head; + + @ApiModelProperty(notes = "全员盘点(0-禁用,1-启用)") + private Integer fullStocktaking; + + @ApiModelProperty(notes = "盘点人id") + private Long stocktakingUserId; + + @ApiModelProperty(notes = "购置开始日期") + private Date stocktakingStartDate; + + @ApiModelProperty(notes = "购置结束日期") + private Date stocktakingEndDate; + + @ApiModelProperty(notes = "资产状态(0-闲置 1-在用 2-借用中 3-维修中 4-调拨中 5-待报废 6-已处置 7-库存 8-已报废)") + private Integer assetStatus; + + @ApiModelProperty(notes = "所属公司id") + private Long ownCompanyId; + + @ApiModelProperty(notes = "使用公司/部门id") + private Long useOrganizationId; + + @ApiModelProperty(notes = "保管人id") + private Long useUserId; + + @ApiModelProperty(notes = "资产分类id") + private Long categoryId; + + @ApiModelProperty(notes = "存放位置id") + private Long positionId; + + @ApiModelProperty(notes = "仓库id") + private Long warehouseId; + + @ApiModelProperty(notes = "启用状态(0-禁用,1-启用)") + private Integer status; + + @ApiModelProperty(notes = "备注") + private String notes; + +} diff --git a/system/src/main/java/com/yyy/system/entity/dto/EamWarehouseAssetDto.java b/system/src/main/java/com/yyy/system/entity/dto/EamWarehouseAssetDto.java new file mode 100644 index 0000000..2b410ba --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/dto/EamWarehouseAssetDto.java @@ -0,0 +1,28 @@ +package com.yyy.system.entity.dto; + +import java.io.Serializable; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.Builder; + +@ApiModel("库存信息表(EamWarehouseAssetDto)传输数据类") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class EamWarehouseAssetDto implements Serializable { + private static final long serialVersionUID = 417670270918226515L; + + @ApiModelProperty(notes = "仓库id") + private Long warehouseId; + + @ApiModelProperty(notes = "资产id") + private Long assetId; + + @ApiModelProperty(notes = "库存数量") + private Integer count; +} diff --git a/system/src/main/java/com/yyy/system/entity/dto/EamWarehouseInventoryDto.java b/system/src/main/java/com/yyy/system/entity/dto/EamWarehouseInventoryDto.java new file mode 100644 index 0000000..f7f1495 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/dto/EamWarehouseInventoryDto.java @@ -0,0 +1,43 @@ +package com.yyy.system.entity.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@ApiModel("库存信息") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class EamWarehouseInventoryDto implements Serializable { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("资产id") + private String assetId; + + @ApiModelProperty("资产编号") + private String assetCode; + + @ApiModelProperty("资产名称") + private String name; + + @ApiModelProperty("规格型号") + private String model; + + @ApiModelProperty("资产序列号") + private String serialNumber; + + @ApiModelProperty("资产状态(0-闲置 1-在用 2-借用中 3-维修中 4-调拨中 5-待报废 6-已处置 7-库存 8-已报废)") + private Integer status; + + @ApiModelProperty("仓库id") + private Long warehouseId; + + @ApiModelProperty("资产分类id") + private Long categoryId; +} diff --git a/system/src/main/java/com/yyy/system/entity/dto/FlFormDto.java b/system/src/main/java/com/yyy/system/entity/dto/FlFormDto.java new file mode 100644 index 0000000..df9d7d0 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/dto/FlFormDto.java @@ -0,0 +1,64 @@ +package com.yyy.system.entity.dto; + +import java.io.Serializable; +import java.util.List; + +import com.yyy.system.entity.vo.FlowNode; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.Builder; + +import javax.validation.constraints.NotBlank; + +@ApiModel("流程表单对象(FlFormDto)传输数据类") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class FlFormDto implements Serializable { + private static final long serialVersionUID = -49468202790837884L; + + @ApiModelProperty(notes = "表单ID") + private Long formId; + + @ApiModelProperty(notes = "表单标识", required = true) + @NotBlank(message = "标识不能为空") + private String formKey; + + @ApiModelProperty(notes = "表单类型") + private String type; + + @ApiModelProperty(notes = "表单名称", required = true) + @NotBlank(message = "名称不能为空") + private String name; + + @ApiModelProperty(notes = "PC端图标") + private String pcIcon; + + @ApiModelProperty(notes = "移动端图标") + private String mobileIcon; + +// @ApiModelProperty(notes = "表单内容") +// private String config; + + @ApiModelProperty(notes = "流程id") + private String deployId; + + @ApiModelProperty(notes = "状态(0:有效/1:无效)") + private Integer status; + + @ApiModelProperty(notes = "备注信息") + private Integer remark; + + @ApiModelProperty("审批节点") + private List nodes; + + @ApiModelProperty(notes = "验收要求") + private boolean checkRequire; + + @ApiModelProperty(notes = "自动指派(0-关 1-开)") + private Integer autoAssign; +} diff --git a/system/src/main/java/com/yyy/system/entity/dto/FlFormItemCalendarDto.java b/system/src/main/java/com/yyy/system/entity/dto/FlFormItemCalendarDto.java new file mode 100644 index 0000000..0335112 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/dto/FlFormItemCalendarDto.java @@ -0,0 +1,37 @@ +package com.yyy.system.entity.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.Date; + +@ApiModel("流程实例对象 任务日历查询参数") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class FlFormItemCalendarDto implements Serializable { + private static final long serialVersionUID = 932570210184231324L; + + @ApiModelProperty(notes = "名称") + private String name; + +// @ApiModelProperty(notes = "表单标识") +// private String formKey; + @ApiModelProperty(notes = "任务类型 (repair=维修任务、inspection-巡检计划、maintenance-保养计划、stocktaking-盘点计划)") + private String jobType; + + @ApiModelProperty(notes = "状态(1-起草 2-审批中 3-已结束 4-已驳回 5-已废弃 6-流程异常 7-待指派 8-已挂起)") + private Integer status; + + @ApiModelProperty(notes = "创建方式") + private String createType; + + @ApiModelProperty(notes = "月份 2024-9") + private Date month; +} diff --git a/system/src/main/java/com/yyy/system/entity/dto/FlFormItemDto.java b/system/src/main/java/com/yyy/system/entity/dto/FlFormItemDto.java new file mode 100644 index 0000000..f17fa0d --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/dto/FlFormItemDto.java @@ -0,0 +1,62 @@ +package com.yyy.system.entity.dto; + +import java.util.Date; +import java.io.Serializable; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.Builder; + +@ApiModel("流程实例对象(FlFormItemDto)传输数据类") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class FlFormItemDto implements Serializable { + private static final long serialVersionUID = 932570210184231324L; + + @ApiModelProperty(notes = "主键") + private Long id; + + @ApiModelProperty(notes = "名称") + private String name; + + @ApiModelProperty(notes = "表单标识") + private String formKey; + + @ApiModelProperty(notes = "流程实例id") + private String procInsId; + + @ApiModelProperty("任务id") + private String taskId; + + @ApiModelProperty(notes = "审批内容") + private String contents; + + @ApiModelProperty(notes = "审批记录") + private String logs; + + @ApiModelProperty(notes = "状态(1-起草 2-审批中 3-已结束 4-已驳回 5-已废弃 6-流程异常 7-待指派 8-已挂起)") + private Integer status; + + @ApiModelProperty(notes = "是否删除(0:正常/1:删除)") + private Integer isDeleted; + + @ApiModelProperty(notes = "创建人") + private Long createUser; + + @ApiModelProperty(notes = "创建时间") + private Date createTime; + + @ApiModelProperty(notes = "修改人") + private Long updateUser; + + @ApiModelProperty(notes = "修改时间") + private Date updateTime; + + @ApiModelProperty(notes = "创建方式") + private String createType; +} diff --git a/system/src/main/java/com/yyy/system/entity/dto/FlListenerDto.java b/system/src/main/java/com/yyy/system/entity/dto/FlListenerDto.java new file mode 100644 index 0000000..5a92d3c --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/dto/FlListenerDto.java @@ -0,0 +1,56 @@ +package com.yyy.system.entity.dto; + +import java.util.Date; +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.Builder; + +@ApiModel("流程监听对象(FlListenerDto)传输数据类") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class FlListenerDto implements Serializable { + private static final long serialVersionUID = 771678526107429157L; + + @ApiModelProperty(notes = "主键") + private Long id; + + @ApiModelProperty(notes = "名称") + private String name; + + @ApiModelProperty(notes = "监听类型") + private String type; + + @ApiModelProperty(notes = "事件类型") + private String eventType; + + @ApiModelProperty(notes = "值类型") + private String valueType; + + @ApiModelProperty(notes = "执行内容") + private String value; + + @ApiModelProperty(notes = "状态") + private Integer status; + + @ApiModelProperty(notes = "是否删除(0:正常/1:删除)") + private Integer isDeleted; + + @ApiModelProperty(notes = "创建人") + private Long createUser; + + @ApiModelProperty(notes = "创建时间") + private Date createTime; + + @ApiModelProperty(notes = "修改人") + private Long updateUser; + + @ApiModelProperty(notes = "修改时间") + private Date updateTime; + +} diff --git a/system/src/main/java/com/yyy/system/entity/dto/FlowProcDefDto.java b/system/src/main/java/com/yyy/system/entity/dto/FlowProcDefDto.java new file mode 100644 index 0000000..3530c2a --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/dto/FlowProcDefDto.java @@ -0,0 +1,56 @@ +package com.yyy.system.entity.dto; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.Date; + +/** + *

流程定义

+ * + * @author Tony + * @date 2021-04-03 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@ApiModel("流程定义") +public class FlowProcDefDto implements Serializable { + + @ApiModelProperty("流程id") + private String id; + + @ApiModelProperty("流程名称") + private String name; + + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + @ApiModelProperty("配置表单名称") + private String formName; + + @ApiModelProperty("配置表单id") + private Long formId; + + @ApiModelProperty("版本") + private int version; + + @ApiModelProperty("部署ID") + private String deploymentId; + + @ApiModelProperty("流程定义状态: 1:激活 , 2:中止") + private int suspensionState; + + @ApiModelProperty("部署时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date deploymentTime; + + +} diff --git a/system/src/main/java/com/yyy/system/entity/dto/SysConfigDto.java b/system/src/main/java/com/yyy/system/entity/dto/SysConfigDto.java new file mode 100644 index 0000000..ad5ab16 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/dto/SysConfigDto.java @@ -0,0 +1,48 @@ +package com.yyy.system.entity.dto; + +import java.util.Date; +import java.io.Serializable; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.Builder; + +@ApiModel("参数配置表(SysConfigDto)传输数据类") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SysConfigDto implements Serializable { + private static final long serialVersionUID = 142089603258541346L; + + @ApiModelProperty(notes = "参数主键") + private Integer configId; + + @ApiModelProperty(notes = "参数名称") + private String configName; + + @ApiModelProperty(notes = "参数键名") + private String configKey; + + @ApiModelProperty(notes = "参数键值") + private String configValue; + + @ApiModelProperty(notes = "创建者") + private Long createUser; + + @ApiModelProperty(notes = "创建时间") + private Date createTime; + + @ApiModelProperty(notes = "更新者") + private Long updateUser; + + @ApiModelProperty(notes = "更新时间") + private Date updateTime; + + @ApiModelProperty(notes = "备注") + private String remark; + +} diff --git a/system/src/main/java/com/yyy/system/entity/dto/SysDictDataDto.java b/system/src/main/java/com/yyy/system/entity/dto/SysDictDataDto.java new file mode 100644 index 0000000..ce66080 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/dto/SysDictDataDto.java @@ -0,0 +1,63 @@ +package com.yyy.system.entity.dto; + +import java.util.Date; +import java.io.Serializable; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.Builder; + +@ApiModel("字典数据表(SysDictDataDto)传输数据类") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SysDictDataDto implements Serializable { + private static final long serialVersionUID = -69614175798170536L; + + @ApiModelProperty(notes = "字典编码") + private Long dictCode; + + @ApiModelProperty(notes = "字典排序") + private Integer dictSort; + + @ApiModelProperty(notes = "字典标签") + private String dictLabel; + + @ApiModelProperty(notes = "字典键值") + private String dictValue; + + @ApiModelProperty(notes = "字典类型") + private String dictType; + + @ApiModelProperty(notes = "样式属性(其他样式扩展)") + private String cssClass; + + @ApiModelProperty(notes = "表格回显样式") + private String listClass; + + @ApiModelProperty(notes = "是否默认(Y是 N否)") + private String isDefault; + + @ApiModelProperty(notes = "状态(0正常 1停用)") + private String status; + + @ApiModelProperty(notes = "创建者") + private Long createUser; + + @ApiModelProperty(notes = "创建时间") + private Date createTime; + + @ApiModelProperty(notes = "更新者") + private Long updateUser; + + @ApiModelProperty(notes = "更新时间") + private Date updateTime; + + @ApiModelProperty(notes = "备注") + private String remark; + +} diff --git a/system/src/main/java/com/yyy/system/entity/dto/SysDictTypeDto.java b/system/src/main/java/com/yyy/system/entity/dto/SysDictTypeDto.java new file mode 100644 index 0000000..109e77e --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/dto/SysDictTypeDto.java @@ -0,0 +1,48 @@ +package com.yyy.system.entity.dto; + +import java.util.Date; +import java.io.Serializable; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.Builder; + +@ApiModel("字典类型表(SysDictTypeDto)传输数据类") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SysDictTypeDto implements Serializable { + private static final long serialVersionUID = -72144408115995345L; + + @ApiModelProperty(notes = "字典主键") + private Long dictId; + + @ApiModelProperty(notes = "字典名称") + private String dictName; + + @ApiModelProperty(notes = "字典类型") + private String dictType; + + @ApiModelProperty(notes = "状态(0正常 1停用)") + private String status; + + @ApiModelProperty(notes = "创建者") + private Long createUser; + + @ApiModelProperty(notes = "创建时间") + private Date createTime; + + @ApiModelProperty(notes = "更新者") + private Long updateUser; + + @ApiModelProperty(notes = "更新时间") + private Date updateTime; + + @ApiModelProperty(notes = "备注") + private String remark; + +} diff --git a/system/src/main/java/com/yyy/system/entity/dto/SysFormLogAddDto.java b/system/src/main/java/com/yyy/system/entity/dto/SysFormLogAddDto.java new file mode 100644 index 0000000..84d4cfc --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/dto/SysFormLogAddDto.java @@ -0,0 +1,39 @@ +package com.yyy.system.entity.dto; + +import com.yyy.common.form.FieldData; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.List; + +@ApiModel("表单记录新增、修改参数") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SysFormLogAddDto implements Serializable { + private static final long serialVersionUID = -99563516686433322L; + + private Long formLogId; + + @ApiModelProperty("表单模板Id") + @NotNull(message = "表单模板不能为空") + private Long formTempId; + + @ApiModelProperty(notes = "报表编号 (手填或者自动生成)") + private String formKey; + + @ApiModelProperty(notes = "报表名称") + @NotBlank(message = "报表名称不能为空") + private String formName; + + @ApiModelProperty(notes = "报表内容(List<>)") + private List _formValue; +} diff --git a/system/src/main/java/com/yyy/system/entity/dto/SysFormLogQuarryDto.java b/system/src/main/java/com/yyy/system/entity/dto/SysFormLogQuarryDto.java new file mode 100644 index 0000000..7ba54d5 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/dto/SysFormLogQuarryDto.java @@ -0,0 +1,30 @@ +package com.yyy.system.entity.dto; + +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.Builder; + +@ApiModel("表单记录查询参数") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SysFormLogQuarryDto implements Serializable { + private static final long serialVersionUID = -99563516686433322L; + + @ApiModelProperty("表单模板Id") + private Long formTempId; + + @ApiModelProperty(notes = "报表编号") + private String formKey; + + @ApiModelProperty(notes = "表单类型(0-默认表单,1-巡检表单,2-保养表单,3-维修表单)") + private Integer formType; + + @ApiModelProperty(notes = "报表名称") + private String formName; +} diff --git a/system/src/main/java/com/yyy/system/entity/dto/SysFormTempDto.java b/system/src/main/java/com/yyy/system/entity/dto/SysFormTempDto.java new file mode 100644 index 0000000..1099360 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/dto/SysFormTempDto.java @@ -0,0 +1,41 @@ +package com.yyy.system.entity.dto; + +import java.io.Serializable; +import java.util.List; + +import com.yyy.common.form.FieldData; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.Builder; + +@ApiModel("表单文档模板信息管理(SysFormTempDto)传输数据类") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SysFormTempDto implements Serializable { + private static final long serialVersionUID = 438291181298935200L; + + private Long formTempId; + + @ApiModelProperty(notes = "表单标识(编号)") + private String formKey; + + @ApiModelProperty(notes = "表单类型(0-默认表单,1-巡检表单,2-保养表单,3-维修表单)") + private Integer formType; + + @ApiModelProperty(notes = "表单名称") + private String formName; + + @ApiModelProperty(notes = "表单状态(0-停用 ,1-启用)") + private Integer formStatus; + + @ApiModelProperty(notes = "表单内容(List<>)") + private List _formValue; + + @ApiModelProperty(notes = "表单模板地址") + private String templatePath; +} diff --git a/system/src/main/java/com/yyy/system/entity/dto/SysLogDto.java b/system/src/main/java/com/yyy/system/entity/dto/SysLogDto.java new file mode 100644 index 0000000..156ef02 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/dto/SysLogDto.java @@ -0,0 +1,32 @@ +package com.yyy.system.entity.dto; + +import java.util.Date; +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.Builder; + +@ApiModel("系统日志信息表(SysLogDto)传输数据类") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SysLogDto implements Serializable { + private static final long serialVersionUID = 366128147942255654L; + + @ApiModelProperty(notes = "日志ID") + private Long logId; + + @ApiModelProperty(notes = "日志类型") + private String logType; + + @ApiModelProperty(notes = "日志内容") + private String logContent; + + @ApiModelProperty(notes = "创建时间") + private Date createTime; + +} diff --git a/system/src/main/java/com/yyy/system/entity/dto/WordExportDto.java b/system/src/main/java/com/yyy/system/entity/dto/WordExportDto.java new file mode 100644 index 0000000..04ef00a --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/dto/WordExportDto.java @@ -0,0 +1,27 @@ +package com.yyy.system.entity.dto; + + +import com.yyy.common.form.FieldData; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import javax.validation.constraints.NotNull; +import java.util.List; + +@ApiModel("word文档预览,下载上传参数") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class WordExportDto { + + @ApiModelProperty(notes = "任务单据", required = true) + @NotNull(message = "计划模板不能为空") + private Long formTempId; + + @ApiModelProperty(notes = "表单内容(List<>)") + private List _formValue; +} diff --git a/system/src/main/java/com/yyy/system/entity/dto/WorkReportGenerateDto.java b/system/src/main/java/com/yyy/system/entity/dto/WorkReportGenerateDto.java new file mode 100644 index 0000000..a8c492e --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/dto/WorkReportGenerateDto.java @@ -0,0 +1,118 @@ +package com.yyy.system.entity.dto; + +import com.yyy.common.annotation.word.WordExport; +import com.yyy.common.enums.WordContentTypeEnum; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.Date; + +@ApiModel("工作报表下载参数") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class WorkReportGenerateDto implements Serializable { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "开始日期") + @WordExport(key = "startDate", name = "开始日期", format = "yyyy-MM-dd") + private Date startDate; + + @ApiModelProperty(value = "结束日期") + @WordExport(key = "endDate", name = "结束日期", format = "yyyy-MM-dd") + private Date endDate; + + @ApiModelProperty("当期工作概述") + @WordExport(key = "workOverview", name = "当期工作概述") + private String workOverview; + + @ApiModelProperty("工作计划") + @WordExport(key = "workPlan", name = "工作计划") + private String workPlan; + + @ApiModelProperty("总结") + @WordExport(key = "summarize", name = "总结") + private String summarize; + + @ApiModelProperty("署名(姓名、日期)") + @WordExport(key = "sign", name = "署名") + private String sign; + + @ApiModelProperty("报修维修任务数") + @WordExport(key = "repairTaskTotal", name = "维修任务数") + private Integer repairTaskTotal; + + @ApiModelProperty("已修复设备") + @WordExport(key = "repairDeviceComplete", name = "已修复设备") + private Integer repairDeviceComplete; + + @ApiModelProperty("未修复设备") + @WordExport(key = "repairDeviceUnComplete", name = "未修复设备") + private Integer repairDeviceUnComplete; + + @ApiModelProperty("设备巡检任务数") + @WordExport(key = "inspectTaskTotal", name = "巡检任务数") + private Integer inspectTaskTotal; + + @ApiModelProperty("已修复设备") + @WordExport(key = "inspectDeviceComplete", name = "已巡设备") + private Integer inspectDeviceComplete; + + @ApiModelProperty("未修复设备") + @WordExport(key = "inspectDeviceUnComplete", name = "未巡设备") + private Integer inspectDeviceUnComplete; + + @ApiModelProperty("保养任务数") + @WordExport(key = "maintainTaskTotal", name = "保养任务数") + private Integer maintainTaskTotal; + + @ApiModelProperty("已保养设备") + @WordExport(key = "maintainDeviceComplete", name = "已保养设备") + private Integer maintainDeviceComplete; + + @ApiModelProperty("未保养设备") + @WordExport(key = "maintainDeviceUnComplete", name = "未保养设备") + private Integer maintainDeviceUnComplete; + + @ApiModelProperty("维修任务饼图 base64格式") + @WordExport(key = "repairTaskPie", name = "维修任务饼图", content_type = WordContentTypeEnum.PICTURE, width = 111, height = 113) + private String repairTaskPie; + + @ApiModelProperty("维修任务柱状图 base64格式") + @WordExport(key = "repairTaskBar", name = "维修任务柱状图", content_type = WordContentTypeEnum.PICTURE, width = 197, height = 113) + private String repairTaskBar; + + @ApiModelProperty("维修任务分析") + @WordExport(key = "repairTaskAnalysis", name = "维修任务分析") + private String repairTaskAnalysis; + + @ApiModelProperty("巡检任务饼图 base64格式") + @WordExport(key = "inspectTaskPie", name = "巡检任务饼图", content_type = WordContentTypeEnum.PICTURE, width = 111, height = 113) + private String inspectTaskPie; + + @ApiModelProperty("巡检任务柱状图 base64格式") + @WordExport(key = "inspectTaskBar", name = "巡检任务柱状图", content_type = WordContentTypeEnum.PICTURE, width = 197, height = 113) + private String inspectTaskBar; + + @ApiModelProperty("巡检任务分析") + @WordExport(key = "inspectTaskAnalysis", name = "巡检任务分析") + private String inspectTaskAnalysis; + + @ApiModelProperty("保养任务饼图 base64格式") + @WordExport(key = "maintainTaskPie", name = "保养任务饼图", content_type = WordContentTypeEnum.PICTURE, width = 111, height = 113) + private String maintainTaskPie; + + @ApiModelProperty("保养任务柱状图 base64格式") + @WordExport(key = "maintainTaskBar", name = "保养任务柱状图", content_type = WordContentTypeEnum.PICTURE, width = 197, height = 113) + private String maintainTaskBar; + + @ApiModelProperty("保养任务分析") + @WordExport(key = "maintainTaskAnalysis", name = "保养任务分析") + private String maintainTaskAnalysis; +} diff --git a/system/src/main/java/com/yyy/system/entity/dto/WorkReportItemDto.java b/system/src/main/java/com/yyy/system/entity/dto/WorkReportItemDto.java new file mode 100644 index 0000000..e9a17dd --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/dto/WorkReportItemDto.java @@ -0,0 +1,40 @@ +package com.yyy.system.entity.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@ApiModel("工作报表任务项") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class WorkReportItemDto implements Serializable { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("任务类型 key") + private String formKey; + + @ApiModelProperty("任务总数") + private Integer jobTotal; + + @ApiModelProperty(value = "设备完成数") + private Integer deviceComplete; + + @ApiModelProperty(value = "设备未完成数") + private Integer deviceUnComplete; + + @ApiModelProperty("饼图 base64数据") + private String img1; + + @ApiModelProperty("折线图 base64数据") + private String img2; + + @ApiModelProperty("内容") + private String content; +} diff --git a/system/src/main/java/com/yyy/system/entity/dto/WorkReportQueryDto.java b/system/src/main/java/com/yyy/system/entity/dto/WorkReportQueryDto.java new file mode 100644 index 0000000..060b7ee --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/dto/WorkReportQueryDto.java @@ -0,0 +1,46 @@ +package com.yyy.system.entity.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.yyy.common.enums.WorkReportTypeEnum; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +@ApiModel("工作报告查询参数") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class WorkReportQueryDto implements Serializable { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "任务类型 keys", notes = "流程的formKey字段") + @NotNull(message = "任务类型不能为空") + private List formKeys; + + @ApiModelProperty(value = "报告类型 (0-日 1-周 2-月 3-年)") + @NotNull(message = "报告类型不能为空") + private WorkReportTypeEnum reportType; + + @ApiModelProperty(value = "开始日期 yyyy-MM-dd") + @NotNull(message = "开始日期不能为空") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + private Date startDate; + + @ApiModelProperty(value = "结束日期 yyyy-MM-dd") + @NotNull(message = "结束日期不能为空") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + private Date endDate; + + public void setReportType(Integer reportType) { + this.reportType = WorkReportTypeEnum.getByCode(reportType); + } +} diff --git a/system/src/main/java/com/yyy/system/entity/excel/EamAssetExcel.java b/system/src/main/java/com/yyy/system/entity/excel/EamAssetExcel.java new file mode 100644 index 0000000..05cdbe9 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/excel/EamAssetExcel.java @@ -0,0 +1,128 @@ +package com.yyy.system.entity.excel; + +import com.alibaba.fastjson.JSONObject; +import com.yyy.common.annotation.excel.Excel; +import com.yyy.common.form.FieldData; +import com.yyy.common.utils.bean.BeanUtils; +import com.yyy.system.entity.pojo.EamAsset; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.apache.poi.ss.usermodel.IndexedColors; + +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 资产信息导入Excel + * + * @author Fangy + * @since 2024-04-09 13:47:48 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class EamAssetExcel { + private static final long serialVersionUID = 1L; + + @Excel(name = "资产编号", prompt = "资产编码:导入时可留空,系统将自动生成资产编号。如需手动输入,请确保编号在系统中唯一,避免重复", needMerge = true) + private String assetCode; + + @Excel(name = "资产名称", prompt = "资产名称必填", headerBackgroundColor = IndexedColors.RED, needMerge = true) + private String name; + + @Excel(name = "资产分类", readConverterExp = "0=资产,1=设备,2=备品备件", combo = "资产,设备,备品备件", headerBackgroundColor = IndexedColors.RED, needMerge = true) + private Long categoryName; + + @Excel(name = "资产状态", readConverterExp = "0=闲置,1=在用,2=借用中,3=维修中,4=调拨中,5=待报废,6=已处置,7=库存,8=已报废", combo = "闲置,在用,借用中,维修中,调拨中,待报废,已处置,库存,已报废", headerBackgroundColor = IndexedColors.RED, needMerge = true) + private Integer status; + + @Excel(name = "资产来源", readConverterExp = "0=捐赠,1=赠送,2=其他,3=采购,4=自建,5=自购", combo = "捐赠,赠送,其他,采购,自建,自购", needMerge = true) + private Integer sourceId; + + @Excel(name = "规格型号", needMerge = true) + private String model; + + @Excel(name = "序列号", needMerge = true) + private String serialNumber; + + @Excel(name = "用途", needMerge = true) + private String purpose; + + @Excel(name = "计量单位", needMerge = true) + private String unit; + + @Excel(name = "详细位置", needMerge = true) + private String positionDetail; + + @Excel(name = "资产备注", needMerge = true) + private String notes; + + @Excel(name = "维保信息_联系人", needMerge = true) + private String contactor; + + @Excel(name = "维保信息_维保开始时间", dateFormat = "yyyy-MM-dd HH:mm:ss", prompt = "日期格式 yyyy-MM-dd HH:mm:ss", needMerge = true) + private Date maintenanceStartDate; + + @Excel(name = "维保信息_维保状态", readConverterExp = "0=不需要,1=脱保,2=在保,3=未知", combo = "不需要,脱保,在保,未知", needMerge = true) + private Integer maintenanceStatus; + + @Excel(name = "维保信息_联系方式", needMerge = true) + private String contact; + + @Excel(name = "维保信息_维保到期", dateFormat = "yyyy-MM-dd HH:mm:ss", prompt = "日期格式 yyyy-MM-dd HH:mm:ss", needMerge = true) + private Date maintenanceEndDate; + + @Excel(name = "维保信息_负责人", needMerge = true) + private String responsiblePerson; + + @Excel(name = "维保信息_维保方式", readConverterExp = "0=原厂,1=第三方", combo = "原厂,第三方", needMerge = true) + private Integer maintenanceType; + + @Excel(name = "维保信息_建议维保方式", readConverterExp = "0=原厂,1=第三方", combo = "原厂,第三方", needMerge = true) + private Integer suggestMaintenanceType; + + @Excel(name = "维保信息_维保备注", needMerge = true) + private String maintenanceNotes; + + @Excel(name = "财务信息_未税成本", cellType = Excel.ColumnType.NUMERIC, scale = 2, prompt = "保留2位小数,若您填写超过2位小数后,系统会自动做四舍五入处理", needMerge = true) + private Double totalAmountPrice; + + @Excel(name = "财务信息_客户信息", needMerge = true) + private String customerInfo; + + @Excel(name = "财务信息_资产税额", cellType = Excel.ColumnType.NUMERIC, scale = 2, prompt = "保留2位小数,若您填写超过2位小数后,系统会自动做四舍五入处理", needMerge = true) + private Double taxAmountRate; + + @Excel(name = "财务信息_入账日期", dateFormat = "yyyy-MM-dd HH:mm:ss", prompt = "日期格式 yyyy-MM-dd HH:mm:ss", needMerge = true) + private Date registerDate; + + @Excel(name = "财务信息_资产净值", cellType = Excel.ColumnType.NUMERIC, scale = 2, prompt = "保留2位小数,若您填写超过2位小数后,系统会自动做四舍五入处理", needMerge = true) + private Double navPrice; + + @Excel(name = "财务信息_残值率", cellType = Excel.ColumnType.NUMERIC, scale = 2, prompt = "残值率范围:0-1,保留2位小数,若您填写超过2位小数后,系统会自动做四舍五入处理", needMerge = true) + private Double residualsRate; + + @Excel(name = "财务信息_财务备注", needMerge = true) + private String financialNotes; + + @Excel(name = "扩展字段") + private List _extInfo; + + public static EamAssetExcel ToExcel(EamAsset e) { + EamAssetExcel excel = new EamAssetExcel(); + BeanUtils.copyProperties(e, excel); + + if (e.getExtInfo() != null) { + excel.set_extInfo(JSONObject.parseArray(e.getExtInfo(), FieldData.class)); + } + return excel; + } + + public static List ToExcel(List list) { + return list.stream().map(EamAssetExcel::ToExcel).collect(Collectors.toList()); + } +} diff --git a/system/src/main/java/com/yyy/system/entity/excel/EamAssetExportExcel.java b/system/src/main/java/com/yyy/system/entity/excel/EamAssetExportExcel.java new file mode 100644 index 0000000..dd2d55f --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/excel/EamAssetExportExcel.java @@ -0,0 +1,165 @@ +package com.yyy.system.entity.excel; + +import com.alibaba.fastjson.JSONObject; +import com.yyy.common.annotation.excel.Excel; +import com.yyy.common.form.FieldData; +import com.yyy.common.utils.bean.BeanUtils; +import com.yyy.system.entity.pojo.EamAsset; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.apache.poi.ss.usermodel.IndexedColors; + +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 资产信息导出Excel + * + * @author Fangy + * @since 2024-04-09 13:47:48 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class EamAssetExportExcel { + private static final long serialVersionUID = 1L; + + @Excel(name = "资产编号", prompt = "资产编码:导入时可留空,系统将自动生成资产编号。如需手动输入,请确保编号在系统中唯一,避免重复", needMerge = true) + private String assetCode; + + @Excel(name = "资产名称", prompt = "资产名称必填", needMerge = true) + private String name; + + @Excel(name = "资产分类", needMerge = true) + private String categoryName; + + @Excel(name = "所属公司", needMerge = true) + private String ownCompanyName; + + @Excel(name = "资产状态", readConverterExp = "0=闲置,1=在用,2=借用中,3=维修中,4=调拨中,5=待报废,6=已处置,7=库存,8=已报废", combo = "闲置,在用,借用中,维修中,调拨中,待报废,已处置,库存,已报废", needMerge = true) + private Integer status; + + @Excel(name = "使用部门", needMerge = true) + private String useOrganizationName; + + @Excel(name = "资产来源", readConverterExp = "0=捐赠,1=赠送,2=其他,3=采购,4=自建,5=自购", combo = "捐赠,赠送,其他,采购,自建,自购", needMerge = true) + private Integer sourceId; + + @Excel(name = "管理人员", needMerge = true) + private String managerName; + + @Excel(name = "供应商", needMerge = true) + private String supplierVendorName; + + @Excel(name = "生产厂商", needMerge = true) + private String manufacturersVendorName; + + @Excel(name = "规格型号", needMerge = true) + private String model; + + @Excel(name = "序列号", needMerge = true) + private String serialNumber; + + @Excel(name = "使用人员", needMerge = true) + private String useUserName; + + @Excel(name = "用途", needMerge = true) + private String purpose; + + @Excel(name = "存放位置", needMerge = true) + private String positionName; + + @Excel(name = "计量单位", needMerge = true) + private String unit; + + @Excel(name = "详细位置", needMerge = true) + private String positionDetail; + + @Excel(name = "资产备注", needMerge = true) + private String notes; + + @Excel(name = "维保信息_维保厂商", needMerge = true) + private String maintenanceVendorName; + + @Excel(name = "维保信息_联系人", needMerge = true) + private String contactor; + + @Excel(name = "维保信息_维保开始时间", dateFormat = "yyyy-MM-dd HH:mm:ss", prompt = "日期格式 yyyy-MM-dd HH:mm:ss", needMerge = true) + private Date maintenanceStartDate; + + @Excel(name = "维保信息_维保状态", readConverterExp = "0=不需要,1=脱保,2=在保,3=未知", combo = "不需要,脱保,在保,未知", needMerge = true) + private Integer maintenanceStatus; + + @Excel(name = "维保信息_联系方式", needMerge = true) + private String contact; + + @Excel(name = "维保信息_维保到期", dateFormat = "yyyy-MM-dd HH:mm:ss", prompt = "日期格式 yyyy-MM-dd HH:mm:ss", needMerge = true) + private Date maintenanceEndDate; + + @Excel(name = "维保信息_负责人", needMerge = true) + private String responsiblePerson; + + @Excel(name = "维保信息_维保方式", readConverterExp = "0=原厂,1=第三方", combo = "原厂,第三方", needMerge = true) + private Integer maintenanceType; + + @Excel(name = "维保信息_建议维保方式", readConverterExp = "0=原厂,1=第三方", combo = "原厂,第三方", needMerge = true) + private Integer suggestMaintenanceType; + + @Excel(name = "维保信息_维保备注", needMerge = true) + private String maintenanceNotes; + + @Excel(name = "财务信息_财务分类", needMerge = true) + private String financialCategoryName; + + @Excel(name = "财务信息_未税成本", cellType = Excel.ColumnType.NUMERIC, scale = 2, prompt = "保留2位小数,若您填写超过2位小数后,系统会自动做四舍五入处理", needMerge = true) + private Double totalAmountPrice; + + @Excel(name = "财务信息_客户信息", needMerge = true) + private String customerInfo; + + @Excel(name = "财务信息_资产税额", cellType = Excel.ColumnType.NUMERIC, scale = 2, prompt = "保留2位小数,若您填写超过2位小数后,系统会自动做四舍五入处理", needMerge = true) + private Double taxAmountRate; + + @Excel(name = "财务信息_入账日期", dateFormat = "yyyy-MM-dd HH:mm:ss", prompt = "日期格式 yyyy-MM-dd HH:mm:ss", needMerge = true) + private Date registerDate; + + @Excel(name = "财务信息_资产净值", cellType = Excel.ColumnType.NUMERIC, scale = 2, prompt = "保留2位小数,若您填写超过2位小数后,系统会自动做四舍五入处理", needMerge = true) + private Double navPrice; + + @Excel(name = "财务信息_残值率", cellType = Excel.ColumnType.NUMERIC, scale = 2, prompt = "残值率范围:0-1,保留2位小数,若您填写超过2位小数后,系统会自动做四舍五入处理", needMerge = true) + private Double residualsRate; + + @Excel(name = "财务信息_财务备注", needMerge = true) + private String financialNotes; + + @Excel(name = "扩展字段") + private List _extInfo; + + public static EamAssetExportExcel ToExcel(EamAsset e) { + EamAssetExportExcel excel = new EamAssetExportExcel(); + BeanUtils.copyProperties(e, excel); + excel.setCategoryName(e.get_category() != null ? e.get_category().getCategoryName() : ""); + excel.setOwnCompanyName(e.get_ownCompany() != null ? e.get_ownCompany().getOrganizationName() : ""); + excel.setUseOrganizationName(e.get_useOrganization() != null ? e.get_useOrganization().getOrganizationName() : ""); + excel.setManagerName(e.get_manager() != null ? e.get_manager().getUserName() : ""); + excel.setSupplierVendorName(e.get_supplierVendor() != null ? e.get_supplierVendor().getName() : ""); + excel.setManufacturersVendorName(e.get_manufacturersVendor() != null ? e.get_manufacturersVendor().getName() : ""); + excel.setUseUserName(e.get_useUser() != null ? e.get_useUser().getUserName() : ""); + excel.setPositionName(e.get_position() != null ? e.get_position().getName() : ""); + excel.setMaintenanceVendorName(e.get_maintenanceVendor() != null ? e.get_maintenanceVendor().getName() : ""); + excel.setFinancialCategoryName(e.get_eamBasicFinancialCategory() != null ? e.get_eamBasicFinancialCategory().getFinancialCategoryName() : ""); + + if (e.getExtInfo() != null) { + excel.set_extInfo(JSONObject.parseArray(e.getExtInfo(), FieldData.class)); + } + return excel; + } + + public static List ToExcel(List list) { + return list.stream().map(EamAssetExportExcel::ToExcel).collect(Collectors.toList()); + } +} diff --git a/system/src/main/java/com/yyy/system/entity/excel/SysFormTempExcel.java b/system/src/main/java/com/yyy/system/entity/excel/SysFormTempExcel.java new file mode 100644 index 0000000..791b455 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/excel/SysFormTempExcel.java @@ -0,0 +1,83 @@ +package com.yyy.system.entity.excel; + +import com.alibaba.fastjson.JSONObject; +import com.yyy.common.annotation.excel.Excel; +import com.yyy.common.form.FieldData; +import com.yyy.common.utils.bean.BeanUtils; +import com.yyy.common.utils.common.StringUtils; +import com.yyy.system.entity.pojo.SysFormTemp; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.poi.ss.usermodel.IndexedColors; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * 表单文档模板信息Excel + */ +@Slf4j +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SysFormTempExcel { + private static final long serialVersionUID = 931122555095106361L; + + @Excel(name = "表单ID", prompt = "导入时不可填写,系统将自动生成。如需手动输入,请确保编号在系统中唯一,避免重复", needMerge = true) + private Long formTempId; + + @Excel(name = "表单编号", prompt = "可手动录入,留空时系统将自动生成", needMerge = true) + private String formKey; + + @Excel(name = "资产分类", readConverterExp = "0=默认表单,1=巡检表单,2=保养表单,3=维修表单", combo = "默认表单,巡检表单,保养表单,维修表单", headerBackgroundColor = IndexedColors.RED, needMerge = true) + private Integer formType = 0; + + @Excel(name = "表单名称", prompt = "表单名称必填", headerBackgroundColor = IndexedColors.RED, needMerge = true) + private String formName; + + @Excel(name = "表单状态", readConverterExp = "0=停用,1=启用", combo = "默认表单,巡检表单,保养表单,维修表单", headerBackgroundColor = IndexedColors.RED, needMerge = true) + private Integer formStatus = 1; + + @Excel(name = "表单内容", prompt = "", needMerge = true) + private String formValue; + + @Excel(name = "表单模板地址", prompt = "", needMerge = true) + private String templatePath; + + public static SysFormTempExcel ToExcel(SysFormTemp sysFormTemp) { + SysFormTempExcel excel = new SysFormTempExcel(); + BeanUtils.copyProperties(sysFormTemp, excel); + return excel; + } + + public static List ToExcel(List sysFormTemps) { + return sysFormTemps.stream().map(SysFormTempExcel::ToExcel).collect(Collectors.toList()); + } + + public static SysFormTemp ToPojo(SysFormTempExcel excel) { + SysFormTemp pojo = new SysFormTemp(); + BeanUtils.copyProperties(excel, pojo); + if (StringUtils.isNotBlank(excel.getFormValue())) { + try { + List list = JSONObject.parseArray(excel.getFormValue(), FieldData.class); + if (list != null && list.size() > 0) { + pojo.setFormValue(JSONObject.toJSONString(list)); + } else { + pojo.setFormValue("[]"); + } + } catch (Exception e) { + log.error("表单Excel模板转换错误:" + e.getMessage(), e); + pojo.setFormValue("[]"); + } + } + return pojo; + } + + public static List ToPojo(List excels) { + return excels.stream().map(SysFormTempExcel::ToPojo).collect(Collectors.toList()); + } +} diff --git a/system/src/main/java/com/yyy/system/entity/pojo/EamAsset.java b/system/src/main/java/com/yyy/system/entity/pojo/EamAsset.java new file mode 100644 index 0000000..5d3c5ce --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/pojo/EamAsset.java @@ -0,0 +1,399 @@ +package com.yyy.system.entity.pojo; + +import java.util.Date; + +import com.yyy.common.annotation.excel.Excel; +import com.yyy.common.core.domain.entity.UmsOrganization; +import com.yyy.common.core.domain.entity.UmsUser; +import lombok.*; +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import org.apache.poi.ss.usermodel.IndexedColors; + +/** + * 资产信息表(EamAsset)表实体类 + * + * @author Fangy + * @since 2024-04-09 13:47:48 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@TableName(value = "eam_asset") +public class EamAsset { + private static final long serialVersionUID = 955338389791091368L; + + + /** + * 主键(主键) + */ + @JsonIgnore + @TableId(value = "asset_id", type = IdType.AUTO) + private Long assetId; + + /** + * 资产编号 + */ + @Excel(name = "资产编号", prompt = "资产编号由后台自动生成,导入数据时不填写", needMerge = true) + @TableField("asset_code") + private String assetCode; + + /** + * 资产名称 + */ + @Excel(name = "资产名称", prompt = "资产名称必填", headerBackgroundColor = IndexedColors.RED, needMerge = true) + @TableField("name") + private String name; + + /** + * 资产分类编号 + */ + @TableField("category_id") + @Excel(name = "资产分类编号", headerBackgroundColor = IndexedColors.RED, needMerge = true) + private Long categoryId; + + /** + * 仓库id + */ + @TableField("warehouse_id") + private Long warehouseId; + + /** + * 所属公司 + */ + @TableField("own_company_id") + private Long ownCompanyId; + + /** + * 资产状态(0-闲置 1-在用 2-借用中 3-维修中 4-调拨中 5-待报废 6-已处置 7-库存 8-已报废) + */ + @TableField("status") + @Excel(name = "资产状态", readConverterExp = "0=闲置,1=在用,2=借用中,3=维修中,4=调拨中,5=待报废,6=已处置,7=库存,8=已报废", combo = "闲置,在用,借用中,维修中,调拨中,待报废,已处置,库存,已报废", headerBackgroundColor = IndexedColors.RED, needMerge = true) + private Integer status; + + /** + * 使用组织 + */ + @TableField("use_organization_id") + private Long useOrganizationId; + + /** + * 资产来源(0-捐赠 1-赠送 2-其他 3-采购 4-自建 5-自购) + */ + @TableField("source_id") + @Excel(name = "资产来源", readConverterExp = "0=捐赠,1=赠送,2=其他,3=采购,4=自建,5=自购", combo = "捐赠,赠送,其他,采购,自建,自购", needMerge = true) + private Integer sourceId; + + /** + * 管理人员id + */ + @TableField("manager") + private Long manager; + + /** + * 供应商id + */ + @TableField("supplier_vendor_id") + private Long supplierVendorId; + + /** + * 资产厂商id + */ + @TableField("manufacturers_vendor_id") + private Long manufacturersVendorId; + + /** + * 规格型号 + */ + @TableField("model") + @Excel(name = "规格型号", needMerge = true) + private String model; + + /** + * 序列号 + */ + @TableField("serial_number") + @Excel(name = "序列号", needMerge = true) + private String serialNumber; + + /** + * 使用人员id + */ + @TableField("use_user_id") + private Long useUserId; + + /** + * 用途 + */ + @TableField("purpose") + @Excel(name = "用途", needMerge = true) + private String purpose; + + /** + * 存放位置id + */ + @TableField("position_id") + private Long positionId; + + /** + * 计量单位 + */ + @TableField("unit") + @Excel(name = "计量单位", needMerge = true) + private String unit; + + /** + * 详细位置 + */ + @TableField("position_detail") + @Excel(name = "详细位置", needMerge = true) + private String positionDetail; + + /** + * 资产备注 + */ + @TableField("notes") + @Excel(name = "资产备注", needMerge = true) + private String notes; + + /** + * 资产附件 + */ + @TableField("attachment") + private String attachment; + + /** + * 维保信息_维保厂商id + */ + @TableField("maintenance_vendor") + private Long maintenanceVendor; + + /** + * 维保信息_联系人id + */ + @TableField("contactor") + @Excel(name = "维保信息_联系人", needMerge = true) + private String contactor; + + /** + * 维保信息_维保开始 + */ + @TableField("maintenance_start_date") + @Excel(name = "维保信息_维保开始时间", dateFormat = "yyyy-MM-dd HH:mm:ss", prompt = "日期格式 yyyy-MM-dd HH:mm:ss", needMerge = true) + private Date maintenanceStartDate; + + /** + * 维保信息_维保状态(0-不需要 1-脱保 2-在保 3-未知) + */ + @TableField("maintenance_status") + @Excel(name = "维保信息_维保状态", readConverterExp = "0=不需要,1=脱保,2=在保,3=未知", combo = "不需要,脱保,在保,未知", needMerge = true) + private Integer maintenanceStatus; + + /** + * 维保信息_联系方式 + */ + @TableField("contact") + @Excel(name = "维保信息_联系方式", needMerge = true) + private String contact; + + /** + * 维保信息_维保到期 + */ + @TableField("maintenance_end_date") + @Excel(name = "维保信息_维保到期", dateFormat = "yyyy-MM-dd HH:mm:ss", prompt = "日期格式 yyyy-MM-dd HH:mm:ss", needMerge = true) + private Date maintenanceEndDate; + + /** + * 维保信息_负责人id + */ + @TableField("responsible_person") + @Excel(name = "维保信息_负责人", needMerge = true) + private String responsiblePerson; + + /** + * 维保信息_维保方式(0-原厂 1-第三方) + */ + @TableField("maintenance_type") + @Excel(name = "维保信息_维保方式", readConverterExp = "0=原厂,1=第三方", combo = "原厂,第三方", needMerge = true) + private Integer maintenanceType; + + /** + * 维保信息_建议维保方式(0-原厂 1-第三方) + */ + @TableField("suggest_maintenance_type") + @Excel(name = "维保信息_建议维保方式", readConverterExp = "0=原厂,1=第三方", combo = "原厂,第三方", needMerge = true) + private Integer suggestMaintenanceType; + + /** + * 维保信息_维保备注 + */ + @TableField("maintenance_notes") + @Excel(name = "维保信息_维保备注", needMerge = true) + private String maintenanceNotes; + + /** + * 维保信息_维保附件 + */ + @TableField("maintenance_attachment") + private String maintenanceAttachment; + + /** + * 财务信息_财务分类id + */ + @TableField("financial_category_id") + private Long financialCategoryId; + + /** + * 财务信息_费用项目id + */ + @TableField("expense_item") + private Long expenseItem; + + /** + * 财务信息_未税成本 + */ + @TableField("total_amount_price") + @Excel(name = "财务信息_未税成本", cellType = Excel.ColumnType.NUMERIC, scale = 2, prompt = "保留2位小数,若您填写超过2位小数后,系统会自动做四舍五入处理", needMerge = true) + private Double totalAmountPrice; + + /** + * 财务信息_客户信息 + */ + @TableField("customer_info") + @Excel(name = "财务信息_客户信息", needMerge = true) + private String customerInfo; + + /** + * 财务信息_资产税额 + */ + @TableField("tax_amount_rate") + @Excel(name = "财务信息_资产税额", cellType = Excel.ColumnType.NUMERIC, scale = 2, prompt = "保留2位小数,若您填写超过2位小数后,系统会自动做四舍五入处理", needMerge = true) + private Double taxAmountRate; + + /** + * 财务信息_入账日期 + */ + @TableField("register_date") + @Excel(name = "财务信息_入账日期", dateFormat = "yyyy-MM-dd HH:mm:ss", prompt = "日期格式 yyyy-MM-dd HH:mm:ss", needMerge = true) + private Date registerDate; + + /** + * 财务信息_财务选项id + */ + @TableField("financial_option") + private Long financialOption; + + /** + * 财务信息_资产净值 + */ + @TableField("nav_price") + @Excel(name = "财务信息_资产净值", cellType = Excel.ColumnType.NUMERIC, scale = 2, prompt = "保留2位小数,若您填写超过2位小数后,系统会自动做四舍五入处理", needMerge = true) + private Double navPrice; + + /** + * 财务信息_残值率 + */ + @TableField("residuals_rate") + @Excel(name = "财务信息_残值率", cellType = Excel.ColumnType.NUMERIC, scale = 2, prompt = "残值率范围:0-1,保留2位小数,若您填写超过2位小数后,系统会自动做四舍五入处理", needMerge = true) + private Double residualsRate; + + /** + * 财务信息_财务备注 + */ + @TableField("financial_notes") + @Excel(name = "财务信息_财务备注", needMerge = true) + private String financialNotes; + + /** + * 财务信息_附件 + */ + @TableField("financial_attachment") + private String financialAttachment; + + /** + * 创建人 + */ + @TableField("create_user") + private Long createUser; + + /** + * 创建时间 + */ + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + /** + * 修改人 + */ + @TableField("update_user") + private Long updateUser; + + /** + * 修改时间 + */ + + @JsonIgnore + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime; + + /** + * 是否删除(0:正常/1:删除) + */ + @TableField("is_deleted") + private Integer isDeleted; + + @TableField(exist = false) + private Integer _businessStatus; + + @TableField(exist = false) + private EamBasicCategory _category; + + @TableField(exist = false) + private UmsOrganization _ownCompany; + + @TableField(exist = false) + private UmsOrganization _useOrganization; + + @TableField(exist = false) + private UmsUser _manager; + + @TableField(exist = false) + private EamBasicManufacturersVendor _manufacturersVendor; + + @TableField(exist = false) + private UmsUser _useUser; + + @TableField(exist = false) + private EamBasicPosition _position; + + @TableField(exist = false) + private EamBasicMaintenanceVendor _maintenanceVendor; + + @TableField(exist = false) + private EamBasicWarehouse _warehouse; + + @TableField(exist = false) + private Integer count; + + @TableField(exist = false) + private EamBasicSupplierVendor _supplierVendor; + + @TableField(exist = false) + private EamBasicFinancialCategory _eamBasicFinancialCategory; + + @TableField("ext_info") + private String extInfo; + + @TableField("img") + private String img; + + @TableField("user_manual") + private String userManual; + + @TableField("maintenance_manual") + private String maintenanceManual; +} diff --git a/system/src/main/java/com/yyy/system/entity/pojo/EamAssetLog.java b/system/src/main/java/com/yyy/system/entity/pojo/EamAssetLog.java new file mode 100644 index 0000000..63e1a79 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/pojo/EamAssetLog.java @@ -0,0 +1,89 @@ +package com.yyy.system.entity.pojo; + +import java.util.Date; + +import lombok.*; +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; + +/** + * 资产操作日志(EamAssetLog)表实体类 + * + * @author Fangy + * @since 2024-04-09 10:23:38 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@TableName(value = "eam_asset_log") +public class EamAssetLog { + private static final long serialVersionUID = 143689497584219486L; + + + /** + * 主键(主键) + */ + @JsonIgnore + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 创建人 + */ + @TableField("create_user") + private Long createUser; + + /** + * 创建时间 + */ + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + /** + * 修改人 + */ + @TableField("update_user") + private Long updateUser; + + /** + * 修改时间 + */ + + @JsonIgnore + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime; + + /** + * 是否删除(0:正常/1:删除) + */ + @TableField("is_deleted") + private Integer isDeleted; + + /** + * 业务编号 + */ + @TableField("business_id") + private String businessId; + + /** + * 操作类型 + */ + @TableField("operation_type") + private String operationType; + + /** + * 操作内容 + */ + @TableField("operation_notes") + private String operationNotes; + + /** + * 关联资产编号 + */ + @TableField("asset_id") + private Long assetId; +} diff --git a/system/src/main/java/com/yyy/system/entity/pojo/EamBasicCategory.java b/system/src/main/java/com/yyy/system/entity/pojo/EamBasicCategory.java new file mode 100644 index 0000000..c86a2b5 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/pojo/EamBasicCategory.java @@ -0,0 +1,113 @@ +package com.yyy.system.entity.pojo; + +import java.util.Date; + +import com.yyy.common.annotation.tree.TreeNodeId; +import com.yyy.common.annotation.tree.TreeNodeName; +import com.yyy.common.annotation.tree.TreeNodeParentId; +import lombok.*; +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; + +/** + * 资产分类信息表(EamBasicCategory)表实体类 + * + * @author Fangy + * @since 2024-04-08 14:22:31 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@TableName(value = "eam_basic_category") +public class EamBasicCategory { + private static final long serialVersionUID = 947712692118768878L; + + + /** + * 资产分类编号(主键) + */ + @JsonIgnore + @TableId(value = "category_id", type = IdType.AUTO) + @TreeNodeId + private Long categoryId; + + /** + * 资产分类名称 + */ + @TableField("category_name") + @TreeNodeName + private String categoryName; + + /** + * 深度 + */ + @TableField("depth") + private String depth; + + /** + * 父节点 + */ + @TableField("parent_id") + @TreeNodeParentId + private Long parentId; + + /** + * 安全库存上限 + */ + @TableField("upper_limit") + private Integer upperLimit; + + /** + * 安全库存下限 + */ + @TableField("lower_limit") + private Integer lowerLimit; + + /** + * 安全库存 + */ + @TableField("safety_limit") + private Integer safetyLimit; + + /** + * 创建人 + */ + @TableField("create_user") + private Long createUser; + + /** + * 创建时间 + */ + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + /** + * 修改人 + */ + @TableField("update_user") + private Long updateUser; + + /** + * 修改时间 + */ + + @JsonIgnore + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime; + + /** + * 是否删除(0:正常/1:删除) + */ + @TableField("is_deleted") + private Integer isDeleted; + + /** + * 资产扩展信息 + */ + @TableField("asset_ext_temp") + private String assetExtTemp; +} diff --git a/system/src/main/java/com/yyy/system/entity/pojo/EamBasicFinancialCategory.java b/system/src/main/java/com/yyy/system/entity/pojo/EamBasicFinancialCategory.java new file mode 100644 index 0000000..1c8a741 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/pojo/EamBasicFinancialCategory.java @@ -0,0 +1,95 @@ +package com.yyy.system.entity.pojo; + +import java.util.Date; + +import lombok.*; +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; + +/** + * 财务分类信息表(EamBasicFinancialCategory)表实体类 + * + * @author Fangy + * @since 2024-05-11 14:38:13 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@TableName(value = "eam_basic_financial_category") +public class EamBasicFinancialCategory { + private static final long serialVersionUID = -37124077590596294L; + + + /** + * 财务分类id(主键) + */ + @JsonIgnore + @TableId(value = "financial_category_id", type = IdType.AUTO) + private Long financialCategoryId; + + /** + * 财务分类名称 + */ + @TableField("financial_category_name") + private String financialCategoryName; + + /** + * 深度 + */ + @TableField("depth") + private String depth; + + /** + * 父节点 + */ + @TableField("parent_id") + private Long parentId; + + /** + * 使用期限(月) + */ + @TableField("use_terms") + private Integer useTerms; + + /** + * 备注 + */ + @TableField("notes") + private String notes; + + /** + * 创建人 + */ + @TableField("create_user") + private Long createUser; + + /** + * 创建时间 + */ + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + /** + * 修改人 + */ + @TableField("update_user") + private Long updateUser; + + /** + * 修改时间 + */ + + @JsonIgnore + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime; + + /** + * 是否删除(0:正常/1:删除) + */ + @TableField("is_deleted") + private Integer isDeleted; +} diff --git a/system/src/main/java/com/yyy/system/entity/pojo/EamBasicMaintenanceVendor.java b/system/src/main/java/com/yyy/system/entity/pojo/EamBasicMaintenanceVendor.java new file mode 100644 index 0000000..4cca413 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/pojo/EamBasicMaintenanceVendor.java @@ -0,0 +1,119 @@ +package com.yyy.system.entity.pojo; + +import java.util.Date; + +import lombok.*; +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; + +/** + * 维保商(EamBasicMaintenanceVendor)表实体类 + * + * @author Fangy + * @since 2024-04-09 12:52:28 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@TableName(value = "eam_basic_maintenance_vendor") +public class EamBasicMaintenanceVendor { + private static final long serialVersionUID = 220113763926607961L; + + + /** + * 主键(主键) + */ + @JsonIgnore + @TableId(value = "maintenance_vendor_id", type = IdType.AUTO) + private Long maintenanceVendorId; + + /** + * 名称 + */ + @TableField("name") + private String name; + + /** + * 编码 + */ + @TableField("code") + private String code; + + /** + * 统一社会信用代码 + */ + @TableField("uscc") + private String uscc; + + /** + * 售后联系人 + */ + @TableField("after_sales_contactor") + private String afterSalesContactor; + + /** + * 售后联系方式 + */ + @TableField("after_sales_contact") + private String afterSalesContact; + + /** + * 商务联系人 + */ + @TableField("business_contactor") + private String businessContactor; + + /** + * 商务联系方式 + */ + @TableField("business_contact") + private String businessContact; + + /** + * 地址 + */ + @TableField("address") + private String address; + + /** + * 备注 + */ + @TableField("notes") + private String notes; + + /** + * 创建人 + */ + @TableField("create_user") + private Long createUser; + + /** + * 创建时间 + */ + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + /** + * 修改人 + */ + @TableField("update_user") + private Long updateUser; + + /** + * 修改时间 + */ + + @JsonIgnore + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime; + + /** + * 是否删除(0:正常/1:删除) + */ + @TableField("is_deleted") + private Integer isDeleted; +} diff --git a/system/src/main/java/com/yyy/system/entity/pojo/EamBasicManufacturersVendor.java b/system/src/main/java/com/yyy/system/entity/pojo/EamBasicManufacturersVendor.java new file mode 100644 index 0000000..e4f05ab --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/pojo/EamBasicManufacturersVendor.java @@ -0,0 +1,89 @@ +package com.yyy.system.entity.pojo; + +import java.util.Date; + +import lombok.*; +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; + +/** + * 生产商(EamBasicManufacturersVendor)表实体类 + * + * @author Fangy + * @since 2024-04-09 12:45:34 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@TableName(value = "eam_basic_manufacturers_vendor") +public class EamBasicManufacturersVendor { + private static final long serialVersionUID = 329289269225198534L; + + + /** + * 主键(主键) + */ + @JsonIgnore + @TableId(value = "manufacturers_vendor_id", type = IdType.AUTO) + private Long manufacturersVendorId; + + /** + * 名称 + */ + @TableField("name") + private String name; + + /** + * 编码 + */ + @TableField("code") + private String code; + + /** + * 地址 + */ + @TableField("address") + private String address; + + /** + * 备注 + */ + @TableField("notes") + private String notes; + + /** + * 创建人 + */ + @TableField("create_user") + private Long createUser; + + /** + * 创建时间 + */ + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + /** + * 修改人 + */ + @TableField("update_user") + private Long updateUser; + + /** + * 修改时间 + */ + + @JsonIgnore + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime; + + /** + * 是否删除(0:正常/1:删除) + */ + @TableField("is_deleted") + private Integer isDeleted; +} diff --git a/system/src/main/java/com/yyy/system/entity/pojo/EamBasicPosition.java b/system/src/main/java/com/yyy/system/entity/pojo/EamBasicPosition.java new file mode 100644 index 0000000..bf41435 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/pojo/EamBasicPosition.java @@ -0,0 +1,82 @@ +package com.yyy.system.entity.pojo; + +import java.util.Date; + +import lombok.*; +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; + +/** + * 存放位置信息表(EamBasicPosition)表实体类 + * + * @author Fangy + * @since 2024-04-09 12:52:28 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@TableName(value = "eam_basic_position") +public class EamBasicPosition { + private static final long serialVersionUID = -69312696070666693L; + + /** + * 存放位置编号(主键) + */ + @JsonIgnore + @TableId(value = "position_id", type = IdType.AUTO) + private Long positionId; + + /** + * 存放位置名称 + */ + @TableField("name") + private String name; + + /** + * 深度 + */ + @TableField("depth") + private String depth; + + /** + * 父节点 + */ + @TableField("parent_id") + private Long parentId; + + /** + * 创建人 + */ + @TableField("create_user") + private Long createUser; + + /** + * 创建时间 + */ + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + /** + * 修改人 + */ + @TableField("update_user") + private Long updateUser; + + /** + * 修改时间 + */ + + @JsonIgnore + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime; + + /** + * 是否删除(0:正常/1:删除) + */ + @TableField("is_deleted") + private Integer isDeleted; +} diff --git a/system/src/main/java/com/yyy/system/entity/pojo/EamBasicSupplierVendor.java b/system/src/main/java/com/yyy/system/entity/pojo/EamBasicSupplierVendor.java new file mode 100644 index 0000000..8cfce98 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/pojo/EamBasicSupplierVendor.java @@ -0,0 +1,118 @@ +package com.yyy.system.entity.pojo; + +import java.util.Date; + +import lombok.*; +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; + +/** + * 供应商(EamBasicSupplierVendor)表实体类 + * + * @author Fangy + * @since 2024-04-09 10:56:09 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@TableName(value = "eam_basic_supplier_vendor") +public class EamBasicSupplierVendor { + private static final long serialVersionUID = -81573902638425707L; + + /** + * 主键(主键) + */ + @JsonIgnore + @TableId(value = "supplier_vendor_id", type = IdType.AUTO) + private Long supplierVendorId; + + /** + * 名称 + */ + @TableField("name") + private String name; + + /** + * 编码 + */ + @TableField("code") + private String code; + + /** + * 统一社会信用代码 + */ + @TableField("uscc") + private String uscc; + + /** + * 售后联系人 + */ + @TableField("after_sales_contactor") + private String afterSalesContactor; + + /** + * 售后联系方式 + */ + @TableField("after_sales_contact") + private String afterSalesContact; + + /** + * 商务联系人 + */ + @TableField("business_contactor") + private String businessContactor; + + /** + * 商务联系方式 + */ + @TableField("business_contact") + private String businessContact; + + /** + * 地址 + */ + @TableField("address") + private String address; + + /** + * 备注 + */ + @TableField("notes") + private String notes; + + /** + * 创建人 + */ + @TableField("create_user") + private Long createUser; + + /** + * 创建时间 + */ + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + /** + * 修改人 + */ + @TableField("update_user") + private Long updateUser; + + /** + * 修改时间 + */ + + @JsonIgnore + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime; + + /** + * 是否删除(0:正常/1:删除) + */ + @TableField("is_deleted") + private Integer isDeleted; +} diff --git a/system/src/main/java/com/yyy/system/entity/pojo/EamBasicTeam.java b/system/src/main/java/com/yyy/system/entity/pojo/EamBasicTeam.java new file mode 100644 index 0000000..2a137cc --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/pojo/EamBasicTeam.java @@ -0,0 +1,86 @@ +package com.yyy.system.entity.pojo; + +import java.util.Date; + +import lombok.*; +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; + +/** + * 班组信息管理(EamBasicTeam)表实体类 + * + * @author Fangy + * @since 2024-09-18 14:57:08 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@TableName(value = "eam_basic_team") +public class EamBasicTeam { + private static final long serialVersionUID = -65228904812545781L; + + @JsonIgnore + @TableId(value = "team_id", type = IdType.AUTO) + private Long teamId; + + /** + * 班组编号 + */ + @TableField("team_key") + private String teamKey; + + /** + * 班组名称 + */ + @TableField("team_name") + private String teamName; + + /** + * 状态(0:停用/1:启用) + */ + @TableField("status") + private Integer status; + + /** + * 成员 + */ + @TableField("value") + private String value; + + /** + * 创建人 + */ + @TableField("create_user") + private Long createUser; + + @TableField(exist = false) + private String createUserName; + + /** + * 创建时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + /** + * 修改人 + */ + @TableField("update_user") + private Long updateUser; + + /** + * 修改时间 + */ + @JsonIgnore + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime; + + /** + * 备注 + */ + @TableField("remark") + private String remark; +} diff --git a/system/src/main/java/com/yyy/system/entity/pojo/EamBasicWarehouse.java b/system/src/main/java/com/yyy/system/entity/pojo/EamBasicWarehouse.java new file mode 100644 index 0000000..18690b3 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/pojo/EamBasicWarehouse.java @@ -0,0 +1,77 @@ +package com.yyy.system.entity.pojo; + +import java.util.Date; + +import lombok.*; +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; + +/** + * 仓库信息表(EamBasicWarehouse)表实体类 + * + * @author Fangy + * @since 2024-04-09 13:16:58 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@TableName(value = "eam_basic_warehouse") +public class EamBasicWarehouse { + private static final long serialVersionUID = -56577035365694173L; + + + /** + * 仓库编号(主键) + */ + @JsonIgnore + @TableId(value = "warehouse_id", type = IdType.AUTO) + private Long warehouseId; + + /** + * 创建人 + */ + @TableField("create_user") + private Long createUser; + + /** + * 创建时间 + */ + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + /** + * 修改人 + */ + @TableField("update_user") + private Long updateUser; + + /** + * 修改时间 + */ + + @JsonIgnore + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime; + + /** + * 是否删除(0:正常/1:删除) + */ + @TableField("is_deleted") + private Integer isDeleted; + + /** + * 仓库名称 + */ + @TableField("name") + private String name; + + /** + * 状态(0:启用/1:禁用) + */ + @TableField("status") + private Integer status; +} diff --git a/system/src/main/java/com/yyy/system/entity/pojo/EamBusinessAllocate.java b/system/src/main/java/com/yyy/system/entity/pojo/EamBusinessAllocate.java new file mode 100644 index 0000000..c901fba --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/pojo/EamBusinessAllocate.java @@ -0,0 +1,136 @@ +package com.yyy.system.entity.pojo; + +import java.util.Date; + +import com.yyy.common.core.domain.entity.UmsUser; +import io.swagger.annotations.ApiModelProperty; +import lombok.*; +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; + +/** + * 调拨信息表(EamBusinessAllocate)表实体类 + * + * @author Fangy + * @since 2024-04-11 16:16:13 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@TableName(value = "eam_business_allocate") +public class EamBusinessAllocate { + private static final long serialVersionUID = -39121729482601805L; + + + /** + * 主键(主键) + */ + @JsonIgnore + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 业务编号 + */ + @TableField("business_id") + private String businessId; + + /** + * 业务名称 + */ + @TableField("name") + private String name; + + /** + * 申请人 + */ + @TableField("applicant") + private Long applicant; + + /** + * 资产编号List + */ + @TableField("asset_id_List") + private String assetIdList; + + /** + * 业务生成日期 + */ + @TableField("business_generated_date") + private Date businessGeneratedDate; + + /** + * 备注 + */ + @TableField("notes") + private String notes; + + /** + * 附件 + */ + @TableField("attach") + private String attach; + + /** + * 状态(0-草稿、1-已完成、2-拒绝、3-审批中、4-取消) + */ + @TableField("status") + private Integer status; + + /** + * 创建人 + */ + @TableField("create_user") + private Long createUser; + + /** + * 创建时间 + */ + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + /** + * 修改人 + */ + @TableField("update_user") + private Long updateUser; + + /** + * 修改时间 + */ + + @JsonIgnore + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime; + + /** + * 是否删除(0:正常/1:删除) + */ + @TableField("is_deleted") + private Integer isDeleted; + + /** + * 调出仓库 + */ + @TableField("out_warehouse_id") + private Long outWarehouseId; + + /** + * 调入仓库 + */ + @TableField("in_warehouse_id") + private Long inWarehouseId; + + @TableField(exist = false) + private UmsUser _applicant; + + @TableField(exist = false) + private EamBasicWarehouse _outWarehouse; + + @TableField(exist = false) + private EamBasicWarehouse _inWarehouse; +} diff --git a/system/src/main/java/com/yyy/system/entity/pojo/EamBusinessBorrow.java b/system/src/main/java/com/yyy/system/entity/pojo/EamBusinessBorrow.java new file mode 100644 index 0000000..a1ca3b4 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/pojo/EamBusinessBorrow.java @@ -0,0 +1,132 @@ +package com.yyy.system.entity.pojo; + +import java.util.Date; + +import com.yyy.common.core.domain.entity.UmsUser; +import lombok.*; +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; + +/** + * 借用信息表(EamBusinessBorrow)表实体类 + * + * @author Fangy + * @since 2024-04-10 17:26:36 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@TableName(value = "eam_business_borrow") +public class EamBusinessBorrow { + private static final long serialVersionUID = 818243213283927361L; + + + /** + * 主键(主键) + */ + @JsonIgnore + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 业务编号 + */ + @TableField("business_id") + private String businessId; + + /** + * 业务名称 + */ + @TableField("name") + private String name; + + /** + * 申请人 + */ + @TableField("applicant") + private Long applicant; + + /** + * 资产编号List + */ + @TableField("asset_id_List") + private String assetIdList; + + /** + * 业务生成日期 + */ + @TableField("business_generated_date") + private Date businessGeneratedDate; + + /** + * 备注 + */ + @TableField("notes") + private String notes; + + /** + * 附件 + */ + @TableField("attach") + private String attach; + + /** + * 状态(0-草稿、1-已完成、2-拒绝、3-审批中、4-取消) + */ + @TableField("status") + private Integer status; + + /** + * 创建人 + */ + @TableField("create_user") + private Long createUser; + + /** + * 创建时间 + */ + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + /** + * 修改人 + */ + @TableField("update_user") + private Long updateUser; + + /** + * 修改时间 + */ + + @JsonIgnore + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime; + + /** + * 是否删除(0:正常/1:删除) + */ + @TableField("is_deleted") + private Integer isDeleted; + + /** + * 借用人 + */ + @TableField("use_user_id") + private Long useUserId; + + /** + * 预计归还时间 + */ + @TableField("return_time") + private Date returnTime; + + @TableField(exist = false) + private UmsUser _applicant; + + @TableField(exist = false) + private UmsUser _useUser; +} diff --git a/system/src/main/java/com/yyy/system/entity/pojo/EamBusinessCollection.java b/system/src/main/java/com/yyy/system/entity/pojo/EamBusinessCollection.java new file mode 100644 index 0000000..af52aea --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/pojo/EamBusinessCollection.java @@ -0,0 +1,151 @@ +package com.yyy.system.entity.pojo; + +import java.util.Date; + +import com.yyy.common.core.domain.entity.UmsOrganization; +import com.yyy.common.core.domain.entity.UmsUser; +import lombok.*; +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; + +/** + * 资产领用信息表(EamBusinessCollection)表实体类 + * + * @author Fangy + * @since 2024-04-12 11:48:06 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@TableName(value = "eam_business_collection") +public class EamBusinessCollection { + private static final long serialVersionUID = -68989280014419345L; + + + /** + * 主键(主键) + */ + @JsonIgnore + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 业务编号 + */ + @TableField("business_id") + private String businessId; + + /** + * 业务名称 + */ + @TableField("name") + private String name; + + /** + * 申请人id + */ + @TableField("applicant") + private Long applicant; + + /** + * 资产编号List + */ + @TableField("asset_id_List") + private String assetIdList; + + /** + * 业务生成日期 + */ + @TableField("business_generated_date") + private Date businessGeneratedDate; + + /** + * 备注 + */ + @TableField("notes") + private String notes; + + /** + * 附件 + */ + @TableField("attach") + private String attach; + + /** + * 状态(0-草稿、1-已完成、2-拒绝、3-审批中、4-取消) + */ + @TableField("status") + private Integer status; + + /** + * 创建人 + */ + @TableField("create_user") + private Long createUser; + + /** + * 创建时间 + */ + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + /** + * 修改人 + */ + @TableField("update_user") + private Long updateUser; + + /** + * 修改时间 + */ + + @JsonIgnore + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime; + + /** + * 是否删除(0:正常/1:删除) + */ + @TableField("is_deleted") + private Integer isDeleted; + + /** + * 领用后公司/部门 + */ + @TableField("use_organization_id") + private Long useOrganizationId; + + /** + * 领用后存放位置 + */ + @TableField("position_id") + private Long positionId; + + /** + * 使用人员id + */ + @TableField("use_user_id") + private Long useUserId; + + /** + * 详细位置 + */ + @TableField("position_detail") + private String positionDetail; + + @TableField(exist = false) + private UmsUser _applicant; + + @TableField(exist = false) + private UmsOrganization _useOrganization; + + @TableField(exist = false) + private EamBasicPosition _position; + + @TableField(exist = false) + private UmsUser _useUser; +} diff --git a/system/src/main/java/com/yyy/system/entity/pojo/EamBusinessOutbound.java b/system/src/main/java/com/yyy/system/entity/pojo/EamBusinessOutbound.java new file mode 100644 index 0000000..3fbe968 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/pojo/EamBusinessOutbound.java @@ -0,0 +1,150 @@ +package com.yyy.system.entity.pojo; + +import java.util.Date; + +import com.yyy.common.core.domain.entity.UmsOrganization; +import com.yyy.common.core.domain.entity.UmsUser; +import lombok.*; +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; + +/** + * 出库信息表(EamBusinessOutbound)表实体类 + * + * @author Fangy + * @since 2024-04-10 17:26:37 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@TableName(value = "eam_business_outbound") +public class EamBusinessOutbound { + private static final long serialVersionUID = -45404155224503791L; + + + /** + * 主键(主键) + */ + @JsonIgnore + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 业务编号 + */ + @TableField("business_id") + private String businessId; + + /** + * 业务名称 + */ + @TableField("name") + private String name; + + /** + * 关联仓库id + */ + @TableField("warehouse_id") + private Long warehouseId; + + /** + * 资产编号List + */ + @TableField("asset_id_List") + private String assetIdList; + + /** + * 业务生成日期 + */ + @TableField("business_generated_date") + private Date businessGeneratedDate; + + /** + * 备注 + */ + @TableField("notes") + private String notes; + + /** + * 附件 + */ + @TableField("attach") + private String attach; + + /** + * 状态(0-草稿、1-已完成、2-拒绝、3-审批中、4-取消) + */ + @TableField("status") + private Integer status; + + /** + * 创建人 + */ + @TableField("create_user") + private Long createUser; + + /** + * 创建时间 + */ + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + /** + * 修改人 + */ + @TableField("update_user") + private Long updateUser; + + /** + * 修改时间 + */ + + @JsonIgnore + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime; + + /** + * 是否删除(0:正常/1:删除) + */ + @TableField("is_deleted") + private Integer isDeleted; + + /** + * 领用公司 + */ + @TableField("own_company_id") + private Long ownCompanyId; + + /** + * 领用部门 + */ + @TableField("use_organization_id") + private Long useOrganizationId; + + /** + * 领用人员 + */ + @TableField("use_user_id") + private Long useUserId; + + /** + * 出库位置 + */ + @TableField("position_detail") + private String positionDetail; + + private EamBasicWarehouse _warehouse; + + @TableField(exist = false) + private UmsOrganization _ownCompany; + + @TableField(exist = false) + private UmsOrganization _useOrganization; + + @TableField(exist = false) + private UmsUser _useUser; +} diff --git a/system/src/main/java/com/yyy/system/entity/pojo/EamBusinessRegistration.java b/system/src/main/java/com/yyy/system/entity/pojo/EamBusinessRegistration.java new file mode 100644 index 0000000..6505557 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/pojo/EamBusinessRegistration.java @@ -0,0 +1,97 @@ +package com.yyy.system.entity.pojo; + +import java.util.Date; + +import lombok.*; +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; + +/** + * 资产登记信息表(EamBusinessRegistration)表实体类 + * + * @author Fangy + * @since 2024-04-10 13:17:46 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@TableName(value = "eam_business_registration") +public class EamBusinessRegistration { + private static final long serialVersionUID = 130986266559178214L; + + + /** + * 主键(主键) + */ + @JsonIgnore + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 业务编号 + */ + @TableField("business_id") + private String businessId; + + /** + * 业务名称 + */ + @TableField("name") + private String name; + + /** + * 申请人id + */ + @TableField("applicant") + private Long applicant; + + /** + * 状态(0-草稿、1-已完成、2-拒绝、3-审批中、4-取消) + */ + @TableField("status") + private Integer status; + + /** + * 资产id + */ + @TableField("asset_id") + private Long assetId; + @TableField("config") + private String config; + + /** + * 创建人 + */ + @TableField("create_user") + private Long createUser; + + /** + * 创建时间 + */ + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + /** + * 修改人 + */ + @TableField("update_user") + private Long updateUser; + + /** + * 修改时间 + */ + + @JsonIgnore + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime; + + /** + * 是否删除(0:正常/1:删除) + */ + @TableField("is_deleted") + private Integer isDeleted; +} diff --git a/system/src/main/java/com/yyy/system/entity/pojo/EamBusinessRetirement.java b/system/src/main/java/com/yyy/system/entity/pojo/EamBusinessRetirement.java new file mode 100644 index 0000000..7183f06 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/pojo/EamBusinessRetirement.java @@ -0,0 +1,141 @@ +package com.yyy.system.entity.pojo; + +import java.util.Date; + +import com.yyy.common.core.domain.entity.UmsUser; +import lombok.*; +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; + +/** + * 资产报废(EamBusinessRetirement)表实体类 + * + * @author Fangy + * @since 2024-05-10 10:54:27 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@TableName(value = "eam_business_retirement") +public class EamBusinessRetirement { + private static final long serialVersionUID = -63757723324677277L; + + + /** + * 主键(主键) + */ + @JsonIgnore + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 业务编号 + */ + @TableField("business_id") + private String businessId; + + /** + * 业务名称 + */ + @TableField("name") + private String name; + + /** + * 申请人id + */ + @TableField("applicant") + private Long applicant; + + /** + * 资产编号List + */ + @TableField("asset_id_List") + private String assetIdList; + + /** + * 业务生成日期 + */ + @TableField("business_generated_date") + private Date businessGeneratedDate; + + /** + * 备注 + */ + @TableField("notes") + private String notes; + + /** + * 附件 + */ + @TableField("attach") + private String attach; + + /** + * 状态(0-草稿、1-已完成、2-拒绝、3-审批中、4-取消) + */ + @TableField("status") + private Integer status; + + /** + * 创建人 + */ + @TableField("create_user") + private Long createUser; + + /** + * 创建时间 + */ + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + /** + * 修改人 + */ + @TableField("update_user") + private Long updateUser; + + /** + * 修改时间 + */ + + @JsonIgnore + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime; + + /** + * 是否删除(0:正常/1:删除) + */ + @TableField("is_deleted") + private Integer isDeleted; + + /** + * 报废方式 + */ + @TableField("type") + private String type; + + /** + * 加急状态(0-普通、1:加急) + */ + @TableField("expedited_status") + private Integer expeditedStatus; + + /** + * 是否已报废(0-否、1:是) + */ + @TableField("is_retirement") + private Integer isRetirement; + + /** + * 是否已清理(0-否、1:是) + */ + @TableField("is_clean") + private Integer isClean; + + @TableField(exist = false) + private UmsUser _applicant; +} diff --git a/system/src/main/java/com/yyy/system/entity/pojo/EamBusinessReturn.java b/system/src/main/java/com/yyy/system/entity/pojo/EamBusinessReturn.java new file mode 100644 index 0000000..2405393 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/pojo/EamBusinessReturn.java @@ -0,0 +1,149 @@ +package com.yyy.system.entity.pojo; + +import java.util.Date; + +import com.yyy.common.core.domain.entity.UmsUser; +import lombok.*; +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; + +/** + * 归还信息表(EamBusinessReturn)表实体类 + * + * @author Fangy + * @since 2024-04-10 17:26:46 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@TableName(value = "eam_business_return") +public class EamBusinessReturn { + private static final long serialVersionUID = -20403778402283811L; + + + /** + * 主键(主键) + */ + @JsonIgnore + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 业务编号 + */ + @TableField("business_id") + private String businessId; + + /** + * 业务名称 + */ + @TableField("name") + private String name; + + /** + * 申请人id + */ + @TableField("applicant") + private Long applicant; + + /** + * 资产编号List + */ + @TableField("asset_id_List") + private String assetIdList; + + /** + * 业务生成日期 + */ + @TableField("business_generated_date") + private Date businessGeneratedDate; + + /** + * 备注 + */ + @TableField("notes") + private String notes; + + /** + * 附件 + */ + @TableField("attach") + private String attach; + + /** + * 状态(0-草稿、1-已完成、2-拒绝、3-审批中、4-取消) + */ + @TableField("status") + private Integer status; + + /** + * 创建人 + */ + @TableField("create_user") + private Long createUser; + + /** + * 创建时间 + */ + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + /** + * 修改人 + */ + @TableField("update_user") + private Long updateUser; + + /** + * 修改时间 + */ + @JsonIgnore + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime; + + /** + * 是否删除(0:正常/1:删除) + */ + @TableField("is_deleted") + private Integer isDeleted; + + /** + * 存放位置id + */ + @TableField("position_id") + private Long positionId; + + /** + * 详细位置 + */ + @TableField("position_detail") + private String positionDetail; + + /** + * 管理人员id + */ + @TableField("manager") + private Long manager; + + /** + * 使用人员id + */ + @TableField("use_user_id") + private Long useUserId; + + @TableField(exist = false) + private UmsUser _applicant; + + @TableField(exist = false) + private EamBasicPosition _position; + + @TableField(exist = false) + private UmsUser _manager; + + @TableField(exist = false) + private UmsUser _useUser; +} diff --git a/system/src/main/java/com/yyy/system/entity/pojo/EamBusinessReturnInventory.java b/system/src/main/java/com/yyy/system/entity/pojo/EamBusinessReturnInventory.java new file mode 100644 index 0000000..587f4bc --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/pojo/EamBusinessReturnInventory.java @@ -0,0 +1,151 @@ +package com.yyy.system.entity.pojo; + +import java.util.Date; + +import com.yyy.common.core.domain.entity.UmsOrganization; +import com.yyy.common.core.domain.entity.UmsUser; +import lombok.*; +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; + +/** + * 退库信息表(EamBusinessReturnInventory)表实体类 + * + * @author Fangy + * @since 2024-04-12 11:10:54 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@TableName(value = "eam_business_return_inventory") +public class EamBusinessReturnInventory { + private static final long serialVersionUID = -18521566912276488L; + + + /** + * 主键(主键) + */ + @JsonIgnore + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 业务编号 + */ + @TableField("business_id") + private String businessId; + + /** + * 业务名称 + */ + @TableField("name") + private String name; + + /** + * 申请人 + */ + @TableField("applicant") + private Long applicant; + + /** + * 资产编号List + */ + @TableField("asset_id_List") + private String assetIdList; + + /** + * 业务生成日期 + */ + @TableField("business_generated_date") + private Date businessGeneratedDate; + + /** + * 备注 + */ + @TableField("notes") + private String notes; + + /** + * 附件 + */ + @TableField("attach") + private String attach; + + /** + * 状态(0-草稿、1-已完成、2-拒绝、3-审批中、4-取消) + */ + @TableField("status") + private Integer status; + + /** + * 创建人 + */ + @TableField("create_user") + private Long createUser; + + /** + * 创建时间 + */ + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + /** + * 修改人 + */ + @TableField("update_user") + private Long updateUser; + + /** + * 修改时间 + */ + + @JsonIgnore + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime; + + /** + * 是否删除(0:正常/1:删除) + */ + @TableField("is_deleted") + private Integer isDeleted; + + /** + * 领用后公司/部门id + */ + @TableField("use_organization_id") + private Long useOrganizationId; + + /** + * 领用后存放位置id + */ + @TableField("position_id") + private Long positionId; + + /** + * 详细位置id + */ + @TableField("position_detail") + private String positionDetail; + + /** + * 关联仓库id + */ + @TableField("warehouse_id") + private Long warehouseId; + + @TableField(exist = false) + private UmsUser _applicant; + + @TableField(exist = false) + private UmsOrganization _useOrganization; + + @TableField(exist = false) + private EamBasicPosition _position; + + @TableField(exist = false) + private EamBasicWarehouse _warehouse; +} diff --git a/system/src/main/java/com/yyy/system/entity/pojo/EamBusinessStorage.java b/system/src/main/java/com/yyy/system/entity/pojo/EamBusinessStorage.java new file mode 100644 index 0000000..8525fa0 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/pojo/EamBusinessStorage.java @@ -0,0 +1,144 @@ +package com.yyy.system.entity.pojo; + +import java.util.Date; + +import com.yyy.common.core.domain.entity.UmsUser; +import lombok.*; +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; + +/** + * 入库信息表(EamBusinessStorage)表实体类 + * + * @author Fangy + * @since 2024-04-10 17:26:46 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@TableName(value = "eam_business_storage") +public class EamBusinessStorage { + private static final long serialVersionUID = -48106546260607219L; + + + /** + * 主键(主键) + */ + @JsonIgnore + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 业务编号 + */ + @TableField("business_id") + private String businessId; + + /** + * 业务名称 + */ + @TableField("name") + private String name; + + /** + * 关联仓库id + */ + @TableField("warehouse_id") + private Long warehouseId; + + /** + * 资产编号List + */ + @TableField("asset_id_List") + private String assetIdList; + + /** + * 业务生成日期 + */ + @TableField("business_generated_date") + private Date businessGeneratedDate; + + /** + * 备注 + */ + @TableField("notes") + private String notes; + + /** + * 附件 + */ + @TableField("attach") + private String attach; + + /** + * 状态(0-草稿、1-已完成、2-拒绝、3-审批中、4-取消) + */ + @TableField("status") + private Integer status; + + /** + * 创建人 + */ + @TableField("create_user") + private Long createUser; + + /** + * 创建时间 + */ + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + /** + * 修改人 + */ + @TableField("update_user") + private Long updateUser; + + /** + * 修改时间 + */ + + @JsonIgnore + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime; + + /** + * 是否删除(0:正常/1:删除) + */ + @TableField("is_deleted") + private Integer isDeleted; + + /** + * 管理人员id + */ + @TableField("manager") + private Long manager; + + /** + * 存放位置id + */ + @TableField("position_id") + private Long positionId; + + /** + * 供应商id + */ + @TableField("supplier_vendor_id") + private Long supplierVendorId; + + @TableField(exist = false) + private EamBasicWarehouse _warehouse; + + @TableField(exist = false) + private UmsUser _manager; + + @TableField(exist = false) + private EamBasicPosition _position; + + @TableField(exist = false) + private EamBasicSupplierVendor _supplierVendor; +} diff --git a/system/src/main/java/com/yyy/system/entity/pojo/EamBusinessTransfer.java b/system/src/main/java/com/yyy/system/entity/pojo/EamBusinessTransfer.java new file mode 100644 index 0000000..6563952 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/pojo/EamBusinessTransfer.java @@ -0,0 +1,156 @@ +package com.yyy.system.entity.pojo; + +import java.util.Date; + +import com.yyy.common.core.domain.entity.UmsOrganization; +import com.yyy.common.core.domain.entity.UmsUser; +import lombok.*; +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; + +/** + * 资产转移信息表(EamBusinessTransfer)表实体类 + * + * @author Fangy + * @since 2024-04-10 17:26:46 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@TableName(value = "eam_business_transfer") +public class EamBusinessTransfer { + private static final long serialVersionUID = -65104760920536564L; + + + /** + * 主键(主键) + */ + @JsonIgnore + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 业务编号 + */ + @TableField("business_id") + private String businessId; + + /** + * 业务名称 + */ + @TableField("name") + private String name; + + /** + * 资产编号List + */ + @TableField("asset_id_List") + private String assetIdList; + + /** + * 业务生成日期 + */ + @TableField("business_generated_date") + private Date businessGeneratedDate; + + /** + * 备注 + */ + @TableField("notes") + private String notes; + + /** + * 附件 + */ + @TableField("attach") + private String attach; + + /** + * 状态(0-草稿、1-已完成、2-拒绝、3-审批中、4-取消) + */ + @TableField("status") + private Integer status; + + /** + * 创建人 + */ + @TableField("create_user") + private Long createUser; + + /** + * 创建时间 + */ + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + /** + * 修改人 + */ + @TableField("update_user") + private Long updateUser; + + /** + * 修改时间 + */ + + @JsonIgnore + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime; + + /** + * 是否删除(0:正常/1:删除) + */ + @TableField("is_deleted") + private Integer isDeleted; + + /** + * 调出使用公司/部门id + */ + @TableField("out_use_organization_id") + private Long outUseOrganizationId; + + /** + * 调入使用公司/部门id + */ + @TableField("in_use_organization_id") + private Long inUseOrganizationId; + + /** + * 调入管理员id + */ + @TableField("manager_id") + private Long managerId; + + /** + * 使用人员id + */ + @TableField("use_user_id") + private Long useUserId; + + /** + * 存放位置id + */ + @TableField("position_id") + private Long positionId; + + /** + * 详细位置 + */ + @TableField("position_detail") + private String positionDetail; + + @TableField(exist = false) + private UmsOrganization _outUseOrganization; + @TableField(exist = false) + private UmsOrganization _inUseOrganization; + @TableField(exist = false) + private UmsUser _manager; + @TableField(exist = false) + private UmsUser _useUser; + @TableField(exist = false) + private EamBasicPosition _position; +} diff --git a/system/src/main/java/com/yyy/system/entity/pojo/EamRepair.java b/system/src/main/java/com/yyy/system/entity/pojo/EamRepair.java new file mode 100644 index 0000000..8829d0d --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/pojo/EamRepair.java @@ -0,0 +1,116 @@ +package com.yyy.system.entity.pojo; + +import java.util.Date; + +import lombok.*; +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; + +/** + * 维修登记信息表(EamRepair)表实体类 + * + * @author Fangy + * @since 2024-04-12 15:00:37 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@TableName(value = "eam_repair") +public class EamRepair { + private static final long serialVersionUID = -22890008642236348L; + + + /** + * 主键(主键) + */ + @JsonIgnore + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 业务编号 + */ + @TableField("business_id") + private String businessId; + + /** + * 业务名称 + */ + @TableField("name") + private String name; + + /** + * 资产编号List + */ + @TableField("asset_id_List") + private String assetIdList; + + /** + * 备注 + */ + @TableField("notes") + private String notes; + + /** + * 附件 + */ + @TableField("attach") + private String attach; + + /** + * 状态(0-草稿、1-已完成、2-拒绝、3-审批中、4-取消) + */ + @TableField("status") + private Integer status; + + /** + * 创建人 + */ + @TableField("create_user") + private Long createUser; + + /** + * 创建时间 + */ + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + /** + * 修改人 + */ + @TableField("update_user") + private Long updateUser; + + /** + * 修改时间 + */ + + @JsonIgnore + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime; + + /** + * 是否删除(0:正常/1:删除) + */ + @TableField("is_deleted") + private Integer isDeleted; + + /** + * 计划完成时间 + */ + @TableField("planned_date") + private Date plannedDate; + + /** + * 保养计划(维修类型)id + */ + @TableField("repair_type_id") + private Long repairTypeId; + + @TableField(exist = false) + private EamRepairType _repairType; +} diff --git a/system/src/main/java/com/yyy/system/entity/pojo/EamRepairFault.java b/system/src/main/java/com/yyy/system/entity/pojo/EamRepairFault.java new file mode 100644 index 0000000..7f1eb94 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/pojo/EamRepairFault.java @@ -0,0 +1,101 @@ +package com.yyy.system.entity.pojo; + +import java.util.Date; + +import lombok.*; +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; + +/** + * 故障信息表(EamRepairFault)表实体类 + * + * @author Fangy + * @since 2024-04-12 15:41:30 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@TableName(value = "eam_repair_fault") +public class EamRepairFault { + private static final long serialVersionUID = -29712126701575650L; + + + /** + * 主键(主键) + */ + @JsonIgnore + @TableId(value = "fault_id", type = IdType.AUTO) + private Long faultId; + + /** + * 名称 + */ + @TableField("name") + private String name; + + /** + * 图片url + */ + @TableField("img") + private String img; + + /** + * 资产编号List + */ + @TableField("asset_id_List") + private String assetIdList; + + /** + * 附件 + */ + @TableField("attach") + private String attach; + + /** + * 备注 + */ + @TableField("notes") + private String notes; + + /** + * 状态(0-草稿、1-已完成、2-拒绝、3-审批中、4-取消) + */ + @TableField("status") + private Integer status; + + /** + * 创建人 + */ + @TableField("create_user") + private Long createUser; + + /** + * 创建时间 + */ + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + /** + * 修改人 + */ + @TableField("update_user") + private Long updateUser; + + /** + * 修改时间 + */ + + @JsonIgnore + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime; + + /** + * 是否删除(0:正常/1:删除) + */ + @TableField("is_deleted") + private Integer isDeleted; +} diff --git a/system/src/main/java/com/yyy/system/entity/pojo/EamRepairType.java b/system/src/main/java/com/yyy/system/entity/pojo/EamRepairType.java new file mode 100644 index 0000000..feeeb3d --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/pojo/EamRepairType.java @@ -0,0 +1,83 @@ +package com.yyy.system.entity.pojo; + +import java.util.Date; + +import lombok.*; +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; + +/** + * 保养计划(维修类型)表(EamRepairType)表实体类 + * + * @author Fangy + * @since 2024-04-12 15:00:39 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@TableName(value = "eam_repair_type") +public class EamRepairType { + private static final long serialVersionUID = 409427712443185629L; + + + /** + * 主键(主键) + */ + @JsonIgnore + @TableId(value = "repair_type_id", type = IdType.AUTO) + private Long repairTypeId; + + /** + * 名称 + */ + @TableField("name") + private String name; + + /** + * 配置信息 + */ + @TableField("config") + private String config; + + /** + * 备注 + */ + @TableField("notes") + private String notes; + + /** + * 创建人 + */ + @TableField("create_user") + private Long createUser; + + /** + * 创建时间 + */ + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + /** + * 修改人 + */ + @TableField("update_user") + private Long updateUser; + + /** + * 修改时间 + */ + + @JsonIgnore + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime; + + /** + * 是否删除(0:正常/1:删除) + */ + @TableField("is_deleted") + private Integer isDeleted; +} diff --git a/system/src/main/java/com/yyy/system/entity/pojo/EamStocktakingDetails.java b/system/src/main/java/com/yyy/system/entity/pojo/EamStocktakingDetails.java new file mode 100644 index 0000000..2ec9c3c --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/pojo/EamStocktakingDetails.java @@ -0,0 +1,101 @@ +package com.yyy.system.entity.pojo; + +import java.util.Date; + +import lombok.*; +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; + +/** + * 盘点明细(EamStocktakingDetails)表实体类 + * + * @author Fangy + * @since 2024-04-12 14:50:46 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@TableName(value = "eam_stocktaking_details") +public class EamStocktakingDetails { + private static final long serialVersionUID = -34302754388950638L; + + + /** + * 主键(主键) + */ + @JsonIgnore + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 盘点任务id + */ + @TableField("stocktaking_job_id") + private Long stocktakingJobId; + + /** + * 盘点资产id + */ + @TableField("asset_id") + private Long assetId; + + /** + * 盘点状态(0-盘盈,1-盘亏,2-已盘点,3-带盘点,4-异常) + */ + @TableField("status") + private Integer status; + + @TableField("img") + private String img; + + /** + * 附件 + */ + @TableField("attachment") + private String attachment; + + /** + * 备注 + */ + @TableField("notes") + private String notes; + + /** + * 创建人 + */ + @TableField("create_user") + private Long createUser; + + /** + * 创建时间 + */ + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + /** + * 修改人 + */ + @TableField("update_user") + private Long updateUser; + + /** + * 修改时间 + */ + + @JsonIgnore + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime; + + /** + * 是否删除(0:正常/1:删除) + */ + @TableField("is_deleted") + private Integer isDeleted; + + @TableField(exist = false) + private EamAsset _asset; +} diff --git a/system/src/main/java/com/yyy/system/entity/pojo/EamStocktakingJob.java b/system/src/main/java/com/yyy/system/entity/pojo/EamStocktakingJob.java new file mode 100644 index 0000000..08c06a7 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/pojo/EamStocktakingJob.java @@ -0,0 +1,181 @@ +package com.yyy.system.entity.pojo; + +import java.util.Date; + +import com.yyy.common.core.domain.entity.UmsOrganization; +import com.yyy.common.core.domain.entity.UmsUser; +import lombok.*; +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; + +/** + * 盘点任务表(EamStocktakingJob)表实体类 + * + * @author Fangy + * @since 2024-04-12 14:50:46 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@TableName(value = "eam_stocktaking_job") +public class EamStocktakingJob { + private static final long serialVersionUID = -31883664987595595L; + + + /** + * 主键(主键) + */ + @JsonIgnore + @TableId(value = "stocktaking_job_id", type = IdType.AUTO) + private Long stocktakingJobId; + + /** + * 业务名称 + */ + @TableField("name") + private String name; + + /** + * 负责人id + */ + @TableField("head") + private Long head; + + /** + * 全员盘点(0-禁用,1-启用) + */ + @TableField("full_stocktaking") + private Integer fullStocktaking; + + /** + * 盘点人id + */ + @TableField("stocktaking_user_id") + private Long stocktakingUserId; + + /** + * 购置开始日期 + */ + @TableField("stocktaking_start_date") + private Date stocktakingStartDate; + + /** + * 购置结束日期 + */ + @TableField("stocktaking_end_date") + private Date stocktakingEndDate; + + /** + * 资产状态(0-闲置 1-在用 2-借用中 3-维修中 4-调拨中 5-待报废 6-已处置 7-库存 8-已报废) + */ + @TableField("asset_status") + private Integer assetStatus; + + /** + * 所属公司id + */ + @TableField("own_company_id") + private Long ownCompanyId; + + /** + * 使用公司/部门id + */ + @TableField("use_organization_id") + private Long useOrganizationId; + + /** + * 保管人id + */ + @TableField("use_user_id") + private Long useUserId; + + /** + * 资产分类id + */ + @TableField("category_id") + private Long categoryId; + + /** + * 存放位置id + */ + @TableField("position_id") + private Long positionId; + + /** + * 仓库id + */ + @TableField("warehouse_id") + private Long warehouseId; + + /** + * 盘点状态(0-未开始,1-进行中,2-取消,3-已完成) + */ + @TableField("status") + private Integer status; + + /** + * 备注 + */ + @TableField("notes") + private String notes; + + /** + * 创建人 + */ + @TableField("create_user") + private Long createUser; + + /** + * 创建时间 + */ + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + /** + * 修改人 + */ + @TableField("update_user") + private Long updateUser; + + /** + * 修改时间 + */ + + @JsonIgnore + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime; + + /** + * 是否删除(0:正常/1:删除) + */ + @TableField("is_deleted") + private Integer isDeleted; + + @TableField(exist = false) + private UmsUser _stocktakingUser; + + @TableField(exist = false) + private UmsUser _head; + + @TableField(exist = false) + private UmsOrganization _ownCompany; + + @TableField(exist = false) + private UmsOrganization _useOrganization; + + @TableField(exist = false) + private UmsUser _useUser; + + @TableField(exist = false) + private EamBasicCategory _category; + + @TableField(exist = false) + private EamBasicPosition _position; + + @TableField(exist = false) + private EamBasicWarehouse _warehouse; +} diff --git a/system/src/main/java/com/yyy/system/entity/pojo/EamStocktakingPlan.java b/system/src/main/java/com/yyy/system/entity/pojo/EamStocktakingPlan.java new file mode 100644 index 0000000..a3c7ca0 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/pojo/EamStocktakingPlan.java @@ -0,0 +1,181 @@ +package com.yyy.system.entity.pojo; + +import java.util.Date; + +import com.yyy.common.core.domain.entity.UmsOrganization; +import com.yyy.common.core.domain.entity.UmsUser; +import lombok.*; +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; + +/** + * 盘点计划信息(EamStocktakingPlan)表实体类 + * + * @author Fangy + * @since 2024-04-12 14:50:46 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@TableName(value = "eam_stocktaking_plan") +public class EamStocktakingPlan { + private static final long serialVersionUID = 123788071961761015L; + + + /** + * 主键(主键) + */ + @JsonIgnore + @TableId(value = "stocktaking_plan_id", type = IdType.AUTO) + private Long stocktakingPlanId; + + /** + * 业务名称 + */ + @TableField("name") + private String name; + + /** + * 负责人id + */ + @TableField("head") + private Long head; + + /** + * 全员盘点(0-禁用,1-启用) + */ + @TableField("full_stocktaking") + private Integer fullStocktaking; + + /** + * 盘点人id + */ + @TableField("stocktaking_user_id") + private Long stocktakingUserId; + + /** + * 购置开始日期 + */ + @TableField("stocktaking_start_date") + private Date stocktakingStartDate; + + /** + * 购置结束日期 + */ + @TableField("stocktaking_end_date") + private Date stocktakingEndDate; + + /** + * 资产状态(0-闲置 1-在用 2-借用中 3-维修中 4-调拨中 5-待报废 6-已处置 7-库存 8-已报废) + */ + @TableField("asset_status") + private Integer assetStatus; + + /** + * 所属公司id + */ + @TableField("own_company_id") + private Long ownCompanyId; + + /** + * 使用公司/部门id + */ + @TableField("use_organization_id") + private Long useOrganizationId; + + /** + * 保管人id + */ + @TableField("use_user_id") + private Long useUserId; + + /** + * 资产分类id + */ + @TableField("category_id") + private Long categoryId; + + /** + * 存放位置id + */ + @TableField("position_id") + private Long positionId; + + /** + * 仓库id + */ + @TableField("warehouse_id") + private Long warehouseId; + + /** + * 启用状态(0-禁用,1-启用) + */ + @TableField("status") + private Integer status; + + /** + * 备注 + */ + @TableField("notes") + private String notes; + + /** + * 创建人 + */ + @TableField("create_user") + private Long createUser; + + /** + * 创建时间 + */ + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + /** + * 修改人 + */ + @TableField("update_user") + private Long updateUser; + + /** + * 修改时间 + */ + + @JsonIgnore + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime; + + /** + * 是否删除(0:正常/1:删除) + */ + @TableField("is_deleted") + private Integer isDeleted; + + @TableField(exist = false) + private UmsUser _stocktakingUser; + + @TableField(exist = false) + private UmsUser _head; + + @TableField(exist = false) + private UmsOrganization _ownCompany; + + @TableField(exist = false) + private UmsOrganization _useOrganization; + + @TableField(exist = false) + private UmsUser _useUser; + + @TableField(exist = false) + private EamBasicCategory _category; + + @TableField(exist = false) + private EamBasicPosition _position; + + @TableField(exist = false) + private EamBasicWarehouse _warehouse; +} diff --git a/system/src/main/java/com/yyy/system/entity/pojo/EamWarehouseAsset.java b/system/src/main/java/com/yyy/system/entity/pojo/EamWarehouseAsset.java new file mode 100644 index 0000000..5982e22 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/pojo/EamWarehouseAsset.java @@ -0,0 +1,40 @@ +package com.yyy.system.entity.pojo; + +import lombok.*; +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; + +/** + * 库存信息表(EamWarehouseAsset)表实体类 + * + * @author Fangy + * @since 2024-05-08 14:00:19 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@TableName(value = "eam_warehouse_asset") +public class EamWarehouseAsset { + private static final long serialVersionUID = -11832184427745361L; + + + /** + * 仓库id + */ + @TableField("warehouse_id") + private Long warehouseId; + + /** + * 资产id + */ + @TableField("asset_id") + private Long assetId; + + /** + * 库存数量 + */ + @TableField("count") + private Integer count; +} diff --git a/system/src/main/java/com/yyy/system/entity/pojo/EamWarehouseInventory.java b/system/src/main/java/com/yyy/system/entity/pojo/EamWarehouseInventory.java new file mode 100644 index 0000000..6669b9d --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/pojo/EamWarehouseInventory.java @@ -0,0 +1,44 @@ +package com.yyy.system.entity.pojo; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class EamWarehouseInventory { + private static final long serialVersionUID = 1L; + + private String assetId; + + private String assetCode; + + private String name; + + private String model; + + private String serialNumber; + + private Integer status; + + private String unit; + + private Integer count; + + private Long warehouseId; + + private String warehouseName; + + private Long categoryId; + + private String categoryName; + + private Integer upperLimit; + + private Integer lowerLimit; + + private Integer safetyLimit; +} diff --git a/system/src/main/java/com/yyy/system/entity/pojo/FlForm.java b/system/src/main/java/com/yyy/system/entity/pojo/FlForm.java new file mode 100644 index 0000000..ed9596f --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/pojo/FlForm.java @@ -0,0 +1,123 @@ +package com.yyy.system.entity.pojo; + +import java.util.Date; + +import com.yyy.common.core.domain.entity.UmsUser; +import lombok.*; +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; + +/** + * 流程表单对象(FlForm)表实体类 + * + * @author Fangy + * @since 2024-04-24 12:57:34 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@TableName(value = "fl_form") +public class FlForm { + private static final long serialVersionUID = -20152204578974282L; + + + /** + * 表单ID(主键) + */ + @JsonIgnore + @TableId(value = "form_id", type = IdType.AUTO) + private Long formId; + + /** + * 表单标识 + */ + @TableField("form_key") + private String formKey; + + /** + * 表单类型 + */ + @TableField("type") + private String type; + + /** + * 表单名称 + */ + @TableField("name") + private String name; + + /** + * PC端图标 + */ + @TableField("pc_icon") + private String pcIcon; + + /** + * 移动端图标 + */ + @TableField("mobile_icon") + private String mobileIcon; + + /** + * 表单内容 + */ + @TableField("config") + private String config; + + /** + * 流程id + */ + @TableField("deploy_id") + private String deployId; + + /** + * 状态(0:有效/1:无效) + */ + @TableField("status") + private Integer status; + + /** + * 是否删除(0:正常/1:删除) + */ + @TableField("is_deleted") + private Integer isDeleted; + + /** + * 备注 + */ + @TableField("remark") + private String remark; + + /** + * 创建人 + */ + @TableField("create_user") + private Long createUser; + + /** + * 创建时间 + */ + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + /** + * 修改人 + */ + @TableField("update_user") + private Long updateUser; + + /** + * 修改时间 + */ + + @JsonIgnore + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime; + + @TableField(exist = false) + private UmsUser _assignee; +} diff --git a/system/src/main/java/com/yyy/system/entity/pojo/FlFormItem.java b/system/src/main/java/com/yyy/system/entity/pojo/FlFormItem.java new file mode 100644 index 0000000..2940166 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/pojo/FlFormItem.java @@ -0,0 +1,109 @@ +package com.yyy.system.entity.pojo; + +import java.util.Date; + +import lombok.*; +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; + +/** + * 流程实例对象(FlFormItem)表实体类 + * + * @author Fangy + * @since 2024-04-30 11:25:57 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@TableName(value = "fl_form_item") +public class FlFormItem { + private static final long serialVersionUID = 504018976657946216L; + + /** + * 主键(主键) + */ + @JsonIgnore + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 名称 + */ + @TableField("name") + private String name; + + /** + * 表单标识 + */ + @TableField("form_key") + private String formKey; + + /** + * 流程实例id + */ + @TableField("proc_ins_id") + private String procInsId; + + @TableField("task_id") + private String taskId; + + /** + * 审批内容 + */ + @TableField("contents") + private String contents; + + /** + * 审批记录 + */ + @TableField("logs") + private String logs; + + /** + * 状态 + */ + @TableField("status") + private Integer status; + + /** + * 是否删除(0:正常/1:删除) + */ + @TableField("is_deleted") + private Integer isDeleted; + + /** + * 创建人 + */ + @TableField("create_user") + private Long createUser; + + /** + * 创建时间 + */ + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + /** + * 修改人 + */ + @TableField("update_user") + private Long updateUser; + + /** + * 修改时间 + */ + + @JsonIgnore + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime; + + /** + * 创建方式 + */ + @TableField("create_type") + private String createType; +} diff --git a/system/src/main/java/com/yyy/system/entity/pojo/FlListener.java b/system/src/main/java/com/yyy/system/entity/pojo/FlListener.java new file mode 100644 index 0000000..e05429d --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/pojo/FlListener.java @@ -0,0 +1,101 @@ +package com.yyy.system.entity.pojo; + +import java.util.Date; + +import lombok.*; +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; + +/** + * 流程监听对象(FlListener)表实体类 + * + * @author Fangy + * @since 2024-04-23 12:22:45 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@TableName(value = "fl_listener") +public class FlListener { + private static final long serialVersionUID = 113581845402610395L; + + + /** + * 主键(主键) + */ + @JsonIgnore + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 名称 + */ + @TableField("name") + private String name; + + /** + * 监听类型 + */ + @TableField("type") + private String type; + + /** + * 事件类型 + */ + @TableField("event_type") + private String eventType; + + /** + * 值类型 + */ + @TableField("value_type") + private String valueType; + + /** + * 执行内容 + */ + @TableField("value") + private String value; + + /** + * 状态 + */ + @TableField("status") + private Integer status; + + /** + * 是否删除(0:正常/1:删除) + */ + @TableField("is_deleted") + private Integer isDeleted; + + /** + * 创建人 + */ + @TableField("create_user") + private Long createUser; + + /** + * 创建时间 + */ + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + /** + * 修改人 + */ + @TableField("update_user") + private Long updateUser; + + /** + * 修改时间 + */ + + @JsonIgnore + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime; +} diff --git a/system/src/main/java/com/yyy/system/entity/pojo/SysConfig.java b/system/src/main/java/com/yyy/system/entity/pojo/SysConfig.java new file mode 100644 index 0000000..51b6eb6 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/pojo/SysConfig.java @@ -0,0 +1,82 @@ +package com.yyy.system.entity.pojo; + +import java.util.Date; +import lombok.*; +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; + +/** + * 参数配置表(SysConfig)表实体类 + * + * @author Fangy + * @since 2024-11-01 11:41:13 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@TableName(value = "sys_config") +public class SysConfig { + private static final long serialVersionUID = -48303879487904935L; + + + /** + * 参数主键(主键) + */ + @JsonIgnore + @TableId(value="config_id", type = IdType.AUTO) + private Integer configId; + + /** + * 参数名称 + */ + @TableField("config_name") + private String configName; + + /** + * 参数键名 + */ + @TableField("config_key") + private String configKey; + + /** + * 参数键值 + */ + @TableField("config_value") + private String configValue; + + /** + * 创建者 + */ + @TableField("create_user") + private Long createUser; + + /** + * 创建时间 + */ + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + /** + * 更新者 + */ + @TableField("update_user") + private Long updateUser; + + /** + * 更新时间 + */ + + @JsonIgnore + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime; + + /** + * 备注 + */ + @TableField("remark") + private String remark; + } diff --git a/system/src/main/java/com/yyy/system/entity/pojo/SysDictData.java b/system/src/main/java/com/yyy/system/entity/pojo/SysDictData.java new file mode 100644 index 0000000..e4c38a4 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/pojo/SysDictData.java @@ -0,0 +1,113 @@ +package com.yyy.system.entity.pojo; + +import java.util.Date; + +import lombok.*; +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; + +/** + * 字典数据表(SysDictData)表实体类 + * + * @author Fangy + * @since 2024-09-05 16:51:24 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@TableName(value = "sys_dict_data") +public class SysDictData { + private static final long serialVersionUID = 882724352087430720L; + + + /** + * 字典编码(主键) + */ + @JsonIgnore + @TableId(value = "dict_code", type = IdType.AUTO) + private Long dictCode; + + /** + * 字典排序 + */ + @TableField("dict_sort") + private Integer dictSort; + + /** + * 字典标签 + */ + @TableField("dict_label") + private String dictLabel; + + /** + * 字典键值 + */ + @TableField("dict_value") + private String dictValue; + + /** + * 字典类型 + */ + @TableField("dict_type") + private String dictType; + + /** + * 样式属性(其他样式扩展) + */ + @TableField("css_class") + private String cssClass; + + /** + * 表格回显样式 + */ + @TableField("list_class") + private String listClass; + + /** + * 是否默认(Y是 N否) + */ + @TableField("is_default") + private String isDefault; + + /** + * 状态(0正常 1停用) + */ + @TableField("status") + private String status; + + /** + * 创建者 + */ + @TableField("create_user") + private Long createUser; + + /** + * 创建时间 + */ + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + /** + * 更新者 + */ + @TableField("update_user") + private Long updateUser; + + /** + * 更新时间 + */ + + @JsonIgnore + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime; + + /** + * 备注 + */ + @TableField("remark") + private String remark; +} diff --git a/system/src/main/java/com/yyy/system/entity/pojo/SysDictType.java b/system/src/main/java/com/yyy/system/entity/pojo/SysDictType.java new file mode 100644 index 0000000..9f23dce --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/pojo/SysDictType.java @@ -0,0 +1,81 @@ +package com.yyy.system.entity.pojo; + +import java.util.Date; + +import lombok.*; +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; + +/** + * 字典类型表(SysDictType)表实体类 + * + * @author Fangy + * @since 2024-09-05 16:40:30 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@TableName(value = "sys_dict_type") +public class SysDictType { + private static final long serialVersionUID = 229963951150708242L; + + + /** + * 字典主键(主键) + */ + @JsonIgnore + @TableId(value = "dict_id", type = IdType.AUTO) + private Long dictId; + + /** + * 字典名称 + */ + @TableField("dict_name") + private String dictName; + + /** + * 字典类型 + */ + @TableField("dict_type") + private String dictType; + + /** + * 状态(0正常 1停用) + */ + @TableField("status") + private String status; + + /** + * 创建者 + */ + @TableField("create_user") + private Long createUser; + + /** + * 创建时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + /** + * 更新者 + */ + @TableField("update_user") + private Long updateUser; + + /** + * 更新时间 + */ + @JsonIgnore + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime; + + /** + * 备注 + */ + @TableField("remark") + private String remark; +} diff --git a/system/src/main/java/com/yyy/system/entity/pojo/SysFormLog.java b/system/src/main/java/com/yyy/system/entity/pojo/SysFormLog.java new file mode 100644 index 0000000..f8271e1 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/pojo/SysFormLog.java @@ -0,0 +1,84 @@ +package com.yyy.system.entity.pojo; + +import java.util.Date; + +import lombok.*; +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; + +/** + * 表单记录(SysFormLog)表实体类 + * + * @author Fangy + * @since 2024-10-17 15:40:05 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@TableName(value = "sys_form_log") +public class SysFormLog { + private static final long serialVersionUID = 571731730815681602L; + + @JsonIgnore + @TableId(value = "form_log_id", type = IdType.AUTO) + private Long formLogId; + + @TableField("form_temp_id") + private Long formTempId; + + @TableField(exist = false) + private String formTempName; + + /** + * 表单标识(编号) + */ + @TableField("form_key") + private String formKey; + + /** + * 表单类型(0-默认表单,1-巡检表单,2-保养表单,3-维修表单) + */ + @TableField("form_type") + private Integer formType; + + /** + * 表单名称 + */ + @TableField("form_name") + private String formName; + + /** + * 表单内容(List<>) + */ + @TableField("form_value") + private String formValue; + + /** + * 创建人 + */ + @TableField("create_user") + private Long createUser; + + /** + * 创建时间 + */ + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + /** + * 修改人 + */ + @TableField("update_user") + private Long updateUser; + + /** + * 修改时间 + */ + @JsonIgnore + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime; +} diff --git a/system/src/main/java/com/yyy/system/entity/pojo/SysFormTemp.java b/system/src/main/java/com/yyy/system/entity/pojo/SysFormTemp.java new file mode 100644 index 0000000..ea0e42e --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/pojo/SysFormTemp.java @@ -0,0 +1,93 @@ +package com.yyy.system.entity.pojo; + +import java.util.Date; + +import lombok.*; +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; + +/** + * 表单文档模板信息管理(SysFormTemp)表实体类 + * + * @author Fangy + * @since 2024-09-18 11:38:59 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@TableName(value = "sys_form_temp") +public class SysFormTemp { + private static final long serialVersionUID = 931122555095106361L; + + @JsonIgnore + @TableId(value = "form_temp_id", type = IdType.AUTO) + private Long formTempId; + + /** + * 表单标识(编号) + */ + @TableField("form_key") + private String formKey; + + /** + * 表单类型(0-默认表单,1-巡检表单,2-保养表单,3-维修表单) + */ + @TableField("form_type") + private Integer formType; + + /** + * 表单名称 + */ + @TableField("form_name") + private String formName; + + /** + * 表单状态(0-停用 ,1-启用) + */ + @TableField("form_status") + private Integer formStatus; + + /** + * 表单内容(List<>) + */ + @TableField("form_value") + private String formValue; + + /** + * 表单模板地址 + */ + @TableField("template_path") + private String templatePath; + + /** + * 创建人 + */ + @TableField("create_user") + private Long createUser; + + @TableField(exist = false) + private String createUserName; + + /** + * 创建时间 + */ + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + /** + * 修改人 + */ + @TableField("update_user") + private Long updateUser; + + /** + * 修改时间 + */ + @JsonIgnore + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime; +} diff --git a/system/src/main/java/com/yyy/system/entity/pojo/SysLog.java b/system/src/main/java/com/yyy/system/entity/pojo/SysLog.java new file mode 100644 index 0000000..50bbcfd --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/pojo/SysLog.java @@ -0,0 +1,50 @@ +package com.yyy.system.entity.pojo; + +import java.util.Date; +import lombok.*; +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; + +/** + * 系统日志信息表(SysLog)表实体类 + * + * @author Fangy + * @since 2024-09-24 15:57:56 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@TableName(value = "sys_log") +public class SysLog { + private static final long serialVersionUID = -71371159198944404L; + + + /** + * 日志ID(主键) + */ + @JsonIgnore + @TableId(value="log_id", type = IdType.AUTO) + private Long logId; + + /** + * 日志类型 + */ + @TableField("log_type") + private String logType; + + /** + * 日志内容 + */ + @TableField("log_content") + private String logContent; + + /** + * 创建时间 + */ + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(fill = FieldFill.INSERT) + private Date createTime; + } diff --git a/system/src/main/java/com/yyy/system/entity/vo/AlarmVo.java b/system/src/main/java/com/yyy/system/entity/vo/AlarmVo.java new file mode 100644 index 0000000..3d58e8b --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/vo/AlarmVo.java @@ -0,0 +1,34 @@ +package com.yyy.system.entity.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 资产信息表(EamAsset)视图数据类 + * + * @author Fangy + * @since 2024-04-09 13:47:50 + */ +@ApiModel("告警信息") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class AlarmVo { + + @ApiModelProperty("资产编号") + private String assetCode; + + @ApiModelProperty("资产名称") + private String name; + + @ApiModelProperty("告警分类") + private String type; + + @ApiModelProperty("告警内容") + private String content; +} diff --git a/system/src/main/java/com/yyy/system/entity/vo/DeviceJobVo.java b/system/src/main/java/com/yyy/system/entity/vo/DeviceJobVo.java new file mode 100644 index 0000000..bfb7769 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/vo/DeviceJobVo.java @@ -0,0 +1,144 @@ +package com.yyy.system.entity.vo; + +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.annotation.JSONField; +import com.alibaba.fastjson.serializer.SerializerFeature; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.yyy.common.core.domain.entity.UmsUser; +import com.yyy.common.enums.FlowStatus; +import com.yyy.common.enums.PlanTypeEnum; +import com.yyy.common.utils.bean.BeanUtils; +import com.yyy.system.entity.bo.JobDefect; +import com.yyy.system.entity.pojo.FlFormItem; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; + +import java.util.*; +import java.util.stream.Collectors; + +@ApiModel("维修、巡检、保养、盘点任务分页查询数据") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class DeviceJobVo { + @ApiModelProperty("主键Id") + private Long id; + + @ApiModelProperty("流程Id") + private String procInsId; + + @ApiModelProperty("任务编号/当前节点Id") + private String taskId; + + @ApiModelProperty(notes = "任务类型 (repair=维修任务、inspection-巡检计划、maintenance-保养计划、stocktaking-盘点计划)") + private PlanTypeEnum jobType; + + @ApiModelProperty("任务名称") + private String name; + + @ApiModelProperty("计划编号") + private String businessId; + + @ApiModelProperty("任务状态") + private FlowStatus status; + + @ApiModelProperty("创建方式/任务来源") + private String createType; + + @ApiModelProperty("预计开始时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date expectedStartTime; + + @ApiModelProperty("预计完成时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date expectedFinishTime; + + @ApiModelProperty(value = "计划用时 /天") + private Integer duration; + + @ApiModelProperty("实际开始时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date actualStartTime; + + @ApiModelProperty("实际完成时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date actualFinishTime; + + @ApiModelProperty("设备总数") + private Integer total; + + @ApiModelProperty("待处理设备数") + private Integer unfinished; + + @ApiModelProperty("已处理设备数") + private Integer finished; + + @ApiModelProperty("执行班组Id") + private Long teamId; + + @ApiModelProperty("执行班组Name") + private String teamName; + + @ApiModelProperty("任务反馈") + private String feedback; + + @ApiModelProperty("备注") + private String remark; + + @ApiModelProperty(notes = "表单Id") + private Long formTempId; + + @ApiModelProperty(notes = "表单模板名称") + private String formName; + +// @ApiModelProperty(notes = "表单模板地址url") +// private String templatePath; + + @ApiModelProperty(notes = "设备执行信息List") + private List defects; + + public static DeviceJobVo ToVo(FlFormItem item) { + DeviceJobVo vo = new DeviceJobVo(); + BeanUtils.copyProperties(item, vo); + + vo.setTaskId(item.getTaskId()); + vo.setJobType(PlanTypeEnum.getByCode(item.getFormKey())); + vo.setStatus(FlowStatus.getByCode(item.getStatus())); + + JSONObject config = JSONObject.parseObject(item.getContents()); + vo.setBusinessId(config.getString("businessId")); + vo.setCreateType(config.getString("createType")); + + vo.setExpectedStartTime(config.getDate("expectedStartTime")); + vo.setExpectedFinishTime(config.getDate("expectedFinishTime")); + vo.setActualStartTime(config.getDate("actualStartTime")); + vo.setActualFinishTime(config.getDate("actualFinishTime")); + vo.setDuration(config.getInteger("duration")); + vo.setTeamId(config.getLong("teamId")); + vo.setTeamName(config.getString("teamName")); + vo.setFeedback(config.getString("feedback")); + vo.setRemark(config.getString("remark")); + vo.setFormTempId(config.getLong("formTempId")); + vo.setFormName(config.getString("formName")); + if (config.containsKey("defects")){ + List defects = config.getJSONArray("defects").toJavaList(JobDefect.class); + long unfinishedCount = defects.stream().filter(defect -> defect.getDefectStatus() == 0).count(); + vo.setTotal(defects.size()); + vo.setUnfinished((int) unfinishedCount); + vo.setFinished(defects.size() - vo.getUnfinished()); + vo.setDefects(defects); + } + return vo; + } + + public static List ToVo(List items) { + return Optional.ofNullable(items).orElse(Collections.emptyList()).stream().map(DeviceJobVo::ToVo).collect(Collectors.toList()); + } +} diff --git a/system/src/main/java/com/yyy/system/entity/vo/DeviceVo.java b/system/src/main/java/com/yyy/system/entity/vo/DeviceVo.java new file mode 100644 index 0000000..dedf536 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/vo/DeviceVo.java @@ -0,0 +1,47 @@ +package com.yyy.system.entity.vo; + +import com.alibaba.fastjson.JSONObject; +import com.yyy.common.form.FieldData; +import com.yyy.common.utils.bean.BeanUtils; +import com.yyy.common.utils.common.StringUtils; +import com.yyy.kernel.device.AbstractDevice; +import com.yyy.kernel.device.IDevice; +import com.yyy.kernel.enums.DeviceStatus; +import com.yyy.system.entity.pojo.EamAsset; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Collections; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +@ApiModel("设备开关机状态") +@Data +@AllArgsConstructor +@NoArgsConstructor +public class DeviceVo extends EamAssetVo{ + @ApiModelProperty("设备开关机状态 ") + private DeviceStatus deviceStatus = DeviceStatus.OFF; + + public static DeviceVo ToVo(EamAsset eamAsset) { + DeviceVo vo = new DeviceVo(); + BeanUtils.copyProperties(eamAsset, vo); + vo.set_extInfo(JSONObject.parseArray(eamAsset.getExtInfo(), FieldData.class)); + if (StringUtils.isNotEmpty(eamAsset.getSerialNumber())){ + IDevice device = AbstractDevice.getByIdentity(eamAsset.getSerialNumber()); + if (device != null){ + vo.setDeviceStatus(device.status()); + } + } + + return vo; + } + + public static List ToVos(List eamAssets) { + return Optional.ofNullable(eamAssets).orElse(Collections.emptyList()).stream().map(DeviceVo::ToVo).collect(Collectors.toList()); + } +} diff --git a/system/src/main/java/com/yyy/system/entity/vo/EamAssetLogVo.java b/system/src/main/java/com/yyy/system/entity/vo/EamAssetLogVo.java new file mode 100644 index 0000000..4930022 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/vo/EamAssetLogVo.java @@ -0,0 +1,57 @@ +package com.yyy.system.entity.vo; + +import java.util.*; +import java.util.stream.Collectors; + +import com.yyy.system.entity.pojo.EamAssetLog; +import com.yyy.common.utils.bean.BeanUtils; +import lombok.Data; +import lombok.Builder; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * 资产操作日志(EamAssetLog)视图数据类 + * + * @author Fangy + * @since 2024-04-09 10:23:39 + */ +@ApiModel("EamAssetLogVo资产操作日志视图数据类") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class EamAssetLogVo { + + @ApiModelProperty("主键") + private Long id; + + @ApiModelProperty("业务编号") + private String businessId; + + @ApiModelProperty("操作类型") + private String operationType; + + @ApiModelProperty("操作内容") + private String operationNotes; + + @ApiModelProperty("关联资产编号") + private Long assetId; + + @ApiModelProperty("创建时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date createTime; + + public static EamAssetLogVo ToVo(EamAssetLog eamAssetLog) { + EamAssetLogVo eamAssetLogVo = new EamAssetLogVo(); + BeanUtils.copyProperties(eamAssetLog, eamAssetLogVo); + return eamAssetLogVo; + } + + public static List ToVo(List eamAssetLogs) { + return Optional.ofNullable(eamAssetLogs).orElse(Collections.emptyList()).stream().map(EamAssetLogVo::ToVo).collect(Collectors.toList()); + } +} diff --git a/system/src/main/java/com/yyy/system/entity/vo/EamAssetVo.java b/system/src/main/java/com/yyy/system/entity/vo/EamAssetVo.java new file mode 100644 index 0000000..194ba90 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/vo/EamAssetVo.java @@ -0,0 +1,196 @@ +package com.yyy.system.entity.vo; + +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +import com.alibaba.fastjson.JSONObject; +import com.yyy.common.core.domain.entity.UmsOrganization; +import com.yyy.common.core.domain.entity.UmsUser; +import com.yyy.common.form.FieldData; +import com.yyy.system.entity.pojo.EamAsset; +import com.yyy.system.entity.pojo.*; +import com.yyy.common.utils.bean.BeanUtils; +import lombok.Data; +import lombok.Builder; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * 资产信息表(EamAsset)视图数据类 + * + * @author Fangy + * @since 2024-04-09 13:47:50 + */ +@ApiModel("EamAssetVo资产信息表视图数据类") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class EamAssetVo { + + @ApiModelProperty("主键") + private Long assetId; + + @ApiModelProperty("资产编号") + private String assetCode; + + @ApiModelProperty("资产名称") + private String name; + + @ApiModelProperty("资产状态(0-闲置 1-在用 2-借用中 3-维修中 4-调拨中 5-待报废 6-已处置 7-库存 8-已报废)") + private Integer status; + + @ApiModelProperty("资产来源(0-捐赠 1-赠送 2-其他 3-采购 4-自建 5-自购)") + private Integer sourceId; + + @ApiModelProperty("规格型号") + private String model; + + @ApiModelProperty("序列号") + private String serialNumber; + + @ApiModelProperty("用途") + private String purpose; + + @ApiModelProperty("计量单位") + private String unit; + + @ApiModelProperty("详细位置") + private String positionDetail; + + @ApiModelProperty("资产备注") + private String notes; + + @ApiModelProperty("资产附件") + private String attachment; + + @ApiModelProperty("维保信息_联系人id") + private String contactor; + + @ApiModelProperty("维保信息_维保开始") + private Date maintenanceStartDate; + + @ApiModelProperty("维保信息_维保状态(0-不需要 1-脱保 2-在保 3-未知)") + private Integer maintenanceStatus; + + @ApiModelProperty("维保信息_联系方式") + private String contact; + + @ApiModelProperty("维保信息_维保到期") + private Date maintenanceEndDate; + + @ApiModelProperty("维保信息_负责人id") + private String responsiblePerson; + + @ApiModelProperty("维保信息_维保方式(0-原厂 1-第三方)") + private Integer maintenanceType; + + @ApiModelProperty("维保信息_建议维保方式(0-原厂 1-第三方)") + private Integer suggestMaintenanceType; + + @ApiModelProperty("维保信息_维保备注") + private String maintenanceNotes; + + @ApiModelProperty("维保信息_维保附件") + private String maintenanceAttachment; + + @ApiModelProperty("财务信息_财务分类id") + private Long financialCategoryId; + + @ApiModelProperty("财务信息_费用项目id") + private Long expenseItem; + + @ApiModelProperty("财务信息_未税成本") + private Double totalAmountPrice; + + @ApiModelProperty("财务信息_客户信息") + private String customerInfo; + + @ApiModelProperty("财务信息_资产税额") + private Double taxAmountRate; + + @ApiModelProperty("财务信息_入账日期") + private Date registerDate; + + @ApiModelProperty("财务信息_财务选项id") + private Long financialOption; + + @ApiModelProperty("财务信息_资产净值") + private Double navPrice; + + @ApiModelProperty("财务信息_残值率") + private Double residualsRate; + + @ApiModelProperty("财务信息_财务备注") + private String financialNotes; + + @ApiModelProperty("财务信息_附件") + private String financialAttachment; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("业务状态(0-草稿、1-已完成、2-拒绝、3-审批中、4-取消)") + private Integer _businessStatus; + + @ApiModelProperty(notes = "仓库") + private EamBasicWarehouse _warehouse; + + @ApiModelProperty(notes = "供应商") + private EamBasicSupplierVendor _supplierVendor; + + @ApiModelProperty("资产分类信息") + private EamBasicCategory _category; + + @ApiModelProperty("所属公司信息") + private UmsOrganization _ownCompany; + + @ApiModelProperty("使用组织") + private UmsOrganization _useOrganization; + + @ApiModelProperty("管理人员") + private UmsUser _manager; + + @ApiModelProperty("资产厂商") + private EamBasicManufacturersVendor _manufacturersVendor; + + @ApiModelProperty("使用人员") + private UmsUser _useUser; + + @ApiModelProperty("存放位置") + private EamBasicPosition _position; + + @ApiModelProperty("维保信息_维保厂商") + private EamBasicMaintenanceVendor _maintenanceVendor; + + @ApiModelProperty("财务分类") + private EamBasicFinancialCategory _eamBasicFinancialCategory; + + @ApiModelProperty("扩展字段信息") + private List _extInfo; + + @ApiModelProperty("资产设备图片 (二期新增)") + private String img; + + @ApiModelProperty("资产设备使用手册URL (二期新增)") + private String userManual; + + @ApiModelProperty("资产设备保养手册URL (二期新增)") + private String maintenanceManual; + + public static EamAssetVo ToVo(EamAsset eamAsset) { + EamAssetVo eamAssetVo = new EamAssetVo(); + BeanUtils.copyProperties(eamAsset, eamAssetVo); + eamAssetVo.set_extInfo(JSONObject.parseArray(eamAsset.getExtInfo(), FieldData.class)); + return eamAssetVo; + } + + public static List ToVo(List eamAssets) { + return Optional.ofNullable(eamAssets).orElse(Collections.emptyList()).stream().map(EamAssetVo::ToVo).collect(Collectors.toList()); + } +} diff --git a/system/src/main/java/com/yyy/system/entity/vo/EamBasicCategoryVo.java b/system/src/main/java/com/yyy/system/entity/vo/EamBasicCategoryVo.java new file mode 100644 index 0000000..a012ab4 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/vo/EamBasicCategoryVo.java @@ -0,0 +1,70 @@ +package com.yyy.system.entity.vo; + +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +import com.alibaba.fastjson.JSONObject; +import com.yyy.common.form.FieldData; +import com.yyy.system.entity.pojo.EamBasicCategory; +import com.yyy.common.utils.bean.BeanUtils; +import lombok.Data; +import lombok.Builder; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * 资产分类信息表(EamBasicCategory)视图数据类 + * + * @author Fangy + * @since 2024-04-08 14:22:31 + */ +@ApiModel("EamBasicCategoryVo资产分类信息表视图数据类") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class EamBasicCategoryVo { + + @ApiModelProperty("资产分类编号") + private Long categoryId; + + @ApiModelProperty("资产分类名称") + private String categoryName; + + @ApiModelProperty("深度") + private String depth; + + @ApiModelProperty("父节点") + private Long parentId; + + @ApiModelProperty("安全库存上限") + private Integer upperLimit; + + @ApiModelProperty("安全库存下限") + private Integer lowerLimit; + + @ApiModelProperty(notes = "安全库存") + private Integer safetyLimit; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("扩展字段模板") + private List _assetExtTemp; + + public static EamBasicCategoryVo ToVo(EamBasicCategory eamBasicCategory) { + EamBasicCategoryVo eamBasicCategoryVo = new EamBasicCategoryVo(); + BeanUtils.copyProperties(eamBasicCategory, eamBasicCategoryVo); + eamBasicCategoryVo.set_assetExtTemp(JSONObject.parseArray(eamBasicCategory.getAssetExtTemp(), FieldData.class)); + return eamBasicCategoryVo; + } + + public static List ToVo(List eamBasicCategories) { + return Optional.ofNullable(eamBasicCategories).orElse(Collections.emptyList()).stream().map(EamBasicCategoryVo::ToVo).collect(Collectors.toList()); + } +} diff --git a/system/src/main/java/com/yyy/system/entity/vo/EamBasicFinancialCategoryVo.java b/system/src/main/java/com/yyy/system/entity/vo/EamBasicFinancialCategoryVo.java new file mode 100644 index 0000000..31c879b --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/vo/EamBasicFinancialCategoryVo.java @@ -0,0 +1,64 @@ +package com.yyy.system.entity.vo; + +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +import com.yyy.system.entity.pojo.EamBasicFinancialCategory; +import com.yyy.common.utils.bean.BeanUtils; +import lombok.Data; +import lombok.Builder; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * 财务分类信息表(EamBasicFinancialCategory)视图数据类 + * + * @author Fangy + * @since 2024-05-11 14:38:13 + */ +@ApiModel("EamBasicFinancialCategoryVo财务分类信息表视图数据类") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class EamBasicFinancialCategoryVo { + + @ApiModelProperty("财务分类id") + private Long financialCategoryId; + + @ApiModelProperty("财务分类名称") + private String financialCategoryName; + + @ApiModelProperty("深度") + private String depth; + + @ApiModelProperty("父节点") + private Long parentId; + + @ApiModelProperty("使用期限(月)") + private Integer useTerms; + + @ApiModelProperty("备注") + private String notes; + + @ApiModelProperty("创建时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date createTime; + + public static EamBasicFinancialCategoryVo ToVo(EamBasicFinancialCategory eamBasicFinancialCategory) { + EamBasicFinancialCategoryVo eamBasicFinancialCategoryVo = new EamBasicFinancialCategoryVo(); + BeanUtils.copyProperties(eamBasicFinancialCategory, eamBasicFinancialCategoryVo); + return eamBasicFinancialCategoryVo; + } + + public static List ToVo(List eamBasicFinancialCategorys) { + return Optional.ofNullable(eamBasicFinancialCategorys).orElse(Collections.emptyList()).stream().map(EamBasicFinancialCategoryVo::ToVo).collect(Collectors.toList()); + } +} diff --git a/system/src/main/java/com/yyy/system/entity/vo/EamBasicMaintenanceVendorVo.java b/system/src/main/java/com/yyy/system/entity/vo/EamBasicMaintenanceVendorVo.java new file mode 100644 index 0000000..28f14bf --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/vo/EamBasicMaintenanceVendorVo.java @@ -0,0 +1,75 @@ +package com.yyy.system.entity.vo; + +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +import com.yyy.system.entity.pojo.EamBasicMaintenanceVendor; +import com.yyy.common.utils.bean.BeanUtils; +import lombok.Data; +import lombok.Builder; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * 维保商(EamBasicMaintenanceVendor)视图数据类 + * + * @author Fangy + * @since 2024-04-09 12:52:28 + */ +@ApiModel("EamBasicMaintenanceVendorVo维保商视图数据类") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class EamBasicMaintenanceVendorVo { + + @ApiModelProperty("主键") + private Long maintenanceVendorId; + + @ApiModelProperty("名称") + private String name; + + @ApiModelProperty("编码") + private String code; + + @ApiModelProperty("统一社会信用代码") + private String uscc; + + @ApiModelProperty("售后联系人") + private String afterSalesContactor; + + @ApiModelProperty("售后联系方式") + private String afterSalesContact; + + @ApiModelProperty("商务联系人") + private String businessContactor; + + @ApiModelProperty("商务联系方式") + private String businessContact; + + @ApiModelProperty("地址") + private String address; + + @ApiModelProperty("备注") + private String notes; + + @ApiModelProperty("创建时间") + private Date createTime; + + public static EamBasicMaintenanceVendorVo ToVo(EamBasicMaintenanceVendor eamBasicMaintenanceVendor) { + EamBasicMaintenanceVendorVo eamBasicMaintenanceVendorVo = new EamBasicMaintenanceVendorVo(); + BeanUtils.copyProperties(eamBasicMaintenanceVendor, eamBasicMaintenanceVendorVo); + return eamBasicMaintenanceVendorVo; + } + + public static List ToVo(List eamBasicMaintenanceVendors) { + return Optional.ofNullable(eamBasicMaintenanceVendors).orElse(Collections.emptyList()).stream().map(EamBasicMaintenanceVendorVo::ToVo).collect(Collectors.toList()); + } +} diff --git a/system/src/main/java/com/yyy/system/entity/vo/EamBasicManufacturersVendorVo.java b/system/src/main/java/com/yyy/system/entity/vo/EamBasicManufacturersVendorVo.java new file mode 100644 index 0000000..5f256b2 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/vo/EamBasicManufacturersVendorVo.java @@ -0,0 +1,60 @@ +package com.yyy.system.entity.vo; + +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +import com.yyy.system.entity.pojo.EamBasicManufacturersVendor; +import com.yyy.common.utils.bean.BeanUtils; +import lombok.Data; +import lombok.Builder; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * 生产商(EamBasicManufacturersVendor)视图数据类 + * + * @author Fangy + * @since 2024-04-09 12:45:34 + */ +@ApiModel("EamBasicManufacturersVendorVo生产商视图数据类") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class EamBasicManufacturersVendorVo { + + @ApiModelProperty("主键") + private Long manufacturersVendorId; + + @ApiModelProperty("名称") + private String name; + + @ApiModelProperty("编码") + private String code; + + @ApiModelProperty("地址") + private String address; + + @ApiModelProperty("备注") + private String notes; + + @ApiModelProperty("创建时间") + private Date createTime; + + public static EamBasicManufacturersVendorVo ToVo(EamBasicManufacturersVendor eamBasicManufacturersVendor) { + EamBasicManufacturersVendorVo eamBasicManufacturersVendorVo = new EamBasicManufacturersVendorVo(); + BeanUtils.copyProperties(eamBasicManufacturersVendor, eamBasicManufacturersVendorVo); + return eamBasicManufacturersVendorVo; + } + + public static List ToVo(List eamBasicManufacturersVendors) { + return Optional.ofNullable(eamBasicManufacturersVendors).orElse(Collections.emptyList()).stream().map(EamBasicManufacturersVendorVo::ToVo).collect(Collectors.toList()); + } +} diff --git a/system/src/main/java/com/yyy/system/entity/vo/EamBasicPositionVo.java b/system/src/main/java/com/yyy/system/entity/vo/EamBasicPositionVo.java new file mode 100644 index 0000000..b481f1e --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/vo/EamBasicPositionVo.java @@ -0,0 +1,57 @@ +package com.yyy.system.entity.vo; + +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +import com.yyy.system.entity.pojo.EamBasicPosition; +import com.yyy.common.utils.bean.BeanUtils; +import lombok.Data; +import lombok.Builder; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * 存放位置信息表(EamBasicPosition)视图数据类 + * + * @author Fangy + * @since 2024-04-09 12:52:28 + */ +@ApiModel("EamBasicPositionVo存放位置信息表视图数据类") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class EamBasicPositionVo { + + @ApiModelProperty("资产分类编号") + private Long positionId; + + @ApiModelProperty("资产分类名称") + private String name; + + @ApiModelProperty("深度") + private String depth; + + @ApiModelProperty("父节点") + private Long parentId; + + @ApiModelProperty("创建时间") + private Date createTime; + + public static EamBasicPositionVo ToVo(EamBasicPosition eamBasicPosition) { + EamBasicPositionVo eamBasicPositionVo = new EamBasicPositionVo(); + BeanUtils.copyProperties(eamBasicPosition, eamBasicPositionVo); + return eamBasicPositionVo; + } + + public static List ToVo(List eamBasicPositions) { + return Optional.ofNullable(eamBasicPositions).orElse(Collections.emptyList()).stream().map(EamBasicPositionVo::ToVo).collect(Collectors.toList()); + } +} diff --git a/system/src/main/java/com/yyy/system/entity/vo/EamBasicSupplierVendorVo.java b/system/src/main/java/com/yyy/system/entity/vo/EamBasicSupplierVendorVo.java new file mode 100644 index 0000000..baf71d2 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/vo/EamBasicSupplierVendorVo.java @@ -0,0 +1,75 @@ +package com.yyy.system.entity.vo; + +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +import com.yyy.system.entity.pojo.EamBasicSupplierVendor; +import com.yyy.common.utils.bean.BeanUtils; +import lombok.Data; +import lombok.Builder; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * 供应商(EamBasicSupplierVendor)视图数据类 + * + * @author Fangy + * @since 2024-04-09 11:05:03 + */ +@ApiModel("EamBasicSupplierVendorVo供应商视图数据类") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class EamBasicSupplierVendorVo { + + @ApiModelProperty("主键") + private Long supplierVendorId; + + @ApiModelProperty("名称") + private String name; + + @ApiModelProperty("编码") + private String code; + + @ApiModelProperty("统一社会信用代码") + private String uscc; + + @ApiModelProperty("售后联系人") + private String afterSalesContactor; + + @ApiModelProperty("售后联系方式") + private String afterSalesContact; + + @ApiModelProperty("商务联系人") + private String businessContactor; + + @ApiModelProperty("商务联系方式") + private String businessContact; + + @ApiModelProperty("地址") + private String address; + + @ApiModelProperty("备注") + private String notes; + + @ApiModelProperty("创建时间") + private Date createTime; + + public static EamBasicSupplierVendorVo ToVo(EamBasicSupplierVendor eamBasicSupplierVendor) { + EamBasicSupplierVendorVo eamBasicSupplierVendorVo = new EamBasicSupplierVendorVo(); + BeanUtils.copyProperties(eamBasicSupplierVendor, eamBasicSupplierVendorVo); + return eamBasicSupplierVendorVo; + } + + public static List ToVo(List eamBasicSupplierVendors) { + return Optional.ofNullable(eamBasicSupplierVendors).orElse(Collections.emptyList()).stream().map(EamBasicSupplierVendorVo::ToVo).collect(Collectors.toList()); + } +} diff --git a/system/src/main/java/com/yyy/system/entity/vo/EamBasicTeamVo.java b/system/src/main/java/com/yyy/system/entity/vo/EamBasicTeamVo.java new file mode 100644 index 0000000..eb83f40 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/vo/EamBasicTeamVo.java @@ -0,0 +1,84 @@ +package com.yyy.system.entity.vo; + +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +import com.alibaba.fastjson.JSONObject; +import com.yyy.common.core.domain.dto.UmsUserKV; +import com.yyy.system.entity.pojo.EamBasicTeam; +import com.yyy.common.utils.bean.BeanUtils; +import lombok.Data; +import lombok.Builder; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * 班组信息管理(EamBasicTeam)视图数据类 + * + * @author Fangy + * @since 2024-09-18 14:57:08 + */ +@ApiModel("EamBasicTeamVo班组信息管理视图数据类") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class EamBasicTeamVo { + + private Long teamId; + + @ApiModelProperty("班组编号") + private String teamKey; + + @ApiModelProperty("班组名称") + private String teamName; + + @ApiModelProperty("状态(0:停用/1:启用)") + private Integer status; + + @ApiModelProperty("成员") + private List _value; + + @ApiModelProperty("成员数") + private Integer count; + + @ApiModelProperty("创建人") + @JsonIgnore + private Long createUser; + + @ApiModelProperty("创建人") + private String createUserName; + + @ApiModelProperty("创建时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date createTime; + + @ApiModelProperty("修改人") + @JsonIgnore + private Long updateUser; + + @ApiModelProperty("修改时间") + @JsonIgnore + private Date updateTime; + + @ApiModelProperty("备注") + private String remark; + + public static EamBasicTeamVo ToVo(EamBasicTeam eamBasicTeam) { + EamBasicTeamVo eamBasicTeamVo = new EamBasicTeamVo(); + BeanUtils.copyProperties(eamBasicTeam, eamBasicTeamVo); + List list = JSONObject.parseArray(eamBasicTeam.getValue(), UmsUserKV.class); + eamBasicTeamVo.set_value(list); + eamBasicTeamVo.setCount(list.size()); + return eamBasicTeamVo; + } + + public static List ToVo(List eamBasicTeams) { + return eamBasicTeams.stream().map(EamBasicTeamVo::ToVo).collect(Collectors.toList()); + } +} diff --git a/system/src/main/java/com/yyy/system/entity/vo/EamBasicWarehouseVo.java b/system/src/main/java/com/yyy/system/entity/vo/EamBasicWarehouseVo.java new file mode 100644 index 0000000..1308d1f --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/vo/EamBasicWarehouseVo.java @@ -0,0 +1,52 @@ +package com.yyy.system.entity.vo; + +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +import com.yyy.system.entity.pojo.EamBasicWarehouse; +import com.yyy.common.utils.bean.BeanUtils; +import lombok.Data; +import lombok.Builder; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * 仓库信息表(EamBasicWarehouse)视图数据类 + * + * @author Fangy + * @since 2024-04-09 13:16:59 + */ +@ApiModel("EamBasicWarehouseVo仓库信息表视图数据类") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class EamBasicWarehouseVo { + + @ApiModelProperty("仓库编号") + private Long warehouseId; + + @ApiModelProperty("仓库名称") + private String name; + + @ApiModelProperty("状态(0:启用/1:禁用)") + private Integer status; + + @ApiModelProperty("创建时间") + private Date createTime; + + public static EamBasicWarehouseVo ToVo(EamBasicWarehouse eamBasicWarehouse) { + EamBasicWarehouseVo eamBasicWarehouseVo = new EamBasicWarehouseVo(); + BeanUtils.copyProperties(eamBasicWarehouse, eamBasicWarehouseVo); + return eamBasicWarehouseVo; + } + + public static List ToVo(List eamBasicWarehouses) { + return Optional.ofNullable(eamBasicWarehouses).orElse(Collections.emptyList()).stream().map(EamBasicWarehouseVo::ToVo).collect(Collectors.toList()); + } +} diff --git a/system/src/main/java/com/yyy/system/entity/vo/EamBigScreenVo.java b/system/src/main/java/com/yyy/system/entity/vo/EamBigScreenVo.java new file mode 100644 index 0000000..16f9211 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/vo/EamBigScreenVo.java @@ -0,0 +1,52 @@ +package com.yyy.system.entity.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + + +@ApiModel("数据大屏展示数据") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class EamBigScreenVo { + + @ApiModelProperty("标语 (欢迎XX领导莅临指导)") + private String slogan; + + //资产相关 + @ApiModelProperty("资产分类排名") + private List assetCategoryChart; + + @ApiModelProperty("资产状态分布") + private List assetStatusChart; + + @ApiModelProperty("资产价值统计") + private List assetCostStatistics; + + @ApiModelProperty("资产变动分析 (新增)") + private List assetChangeChart; + + @ApiModelProperty("资产设备总数") + private Integer assetTotal; + + @ApiModelProperty("资产存放分布") + private List assetPositionChart; + + //流程相关 + @ApiModelProperty("流程数量统计") + private List flowCountStatistics; + + @ApiModelProperty("流程类型统计") + private List flowTypeChart; + + //消息相关 + @ApiModelProperty("消息中心") + private List messages; +} diff --git a/system/src/main/java/com/yyy/system/entity/vo/EamBusinessAllocateVo.java b/system/src/main/java/com/yyy/system/entity/vo/EamBusinessAllocateVo.java new file mode 100644 index 0000000..6aaecda --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/vo/EamBusinessAllocateVo.java @@ -0,0 +1,84 @@ +package com.yyy.system.entity.vo; + +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +import com.alibaba.fastjson.JSON; +import com.yyy.common.core.domain.entity.UmsUser; +import com.yyy.system.entity.dto.EamWarehouseAssetDto; +import com.yyy.system.entity.pojo.EamBasicWarehouse; +import com.yyy.system.entity.pojo.EamBusinessAllocate; +import com.yyy.common.utils.bean.BeanUtils; +import lombok.Data; +import lombok.Builder; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * 调拨信息表(EamBusinessAllocate)视图数据类 + * + * @author Fangy + * @since 2024-04-11 16:16:14 + */ +@ApiModel("EamBusinessAllocateVo调拨信息表视图数据类") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class EamBusinessAllocateVo { + + @ApiModelProperty("主键") + private Long id; + + @ApiModelProperty("业务编号") + private String businessId; + + @ApiModelProperty("业务名称") + private String name; + + @ApiModelProperty(notes = "资产库存信息List") + private List assetIdList; + + @ApiModelProperty("业务生成日期") + private Date businessGeneratedDate; + + @ApiModelProperty("备注") + private String notes; + + @ApiModelProperty("附件") + private String attach; + + @ApiModelProperty("状态(0-草稿、1-已完成、2-拒绝、3-审批中、4-取消)") + private Integer status; + + @ApiModelProperty("创建时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date createTime; + + @ApiModelProperty("申请人") + private UmsUser _applicant; + + @ApiModelProperty("调出仓库") + private EamBasicWarehouse _outWarehouse; + + @ApiModelProperty("调入仓库") + private EamBasicWarehouse _inWarehouse; + + public static EamBusinessAllocateVo ToVo(EamBusinessAllocate eamBusinessAllocate) { + EamBusinessAllocateVo eamBusinessAllocateVo = new EamBusinessAllocateVo(); + BeanUtils.copyProperties(eamBusinessAllocate, eamBusinessAllocateVo); + eamBusinessAllocateVo.setAssetIdList(JSON.parseArray(eamBusinessAllocate.getAssetIdList(),EamWarehouseAssetDto.class)); + return eamBusinessAllocateVo; + } + + public static List ToVo(List eamBusinessAllocates) { + return Optional.ofNullable(eamBusinessAllocates).orElse(Collections.emptyList()).stream().map(EamBusinessAllocateVo::ToVo).collect(Collectors.toList()); + } +} diff --git a/system/src/main/java/com/yyy/system/entity/vo/EamBusinessBorrowVo.java b/system/src/main/java/com/yyy/system/entity/vo/EamBusinessBorrowVo.java new file mode 100644 index 0000000..f72db4b --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/vo/EamBusinessBorrowVo.java @@ -0,0 +1,82 @@ +package com.yyy.system.entity.vo; + +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +import com.alibaba.fastjson.JSON; +import com.yyy.common.core.domain.entity.UmsUser; +import com.yyy.system.entity.dto.EamWarehouseAssetDto; +import com.yyy.system.entity.pojo.EamBusinessBorrow; +import com.yyy.common.utils.bean.BeanUtils; +import lombok.Data; +import lombok.Builder; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * 借用信息表(EamBusinessBorrow)视图数据类 + * + * @author Fangy + * @since 2024-04-10 17:26:36 + */ +@ApiModel("EamBusinessBorrowVo借用信息表视图数据类") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class EamBusinessBorrowVo { + + @ApiModelProperty("主键") + private Long id; + + @ApiModelProperty("业务编号") + private String businessId; + + @ApiModelProperty("业务名称") + private String name; + + @ApiModelProperty("申请人") + private UmsUser _applicant; + + @ApiModelProperty(notes = "资产库存信息List") + private List assetIdList; + + @ApiModelProperty("业务生成日期") + private Date businessGeneratedDate; + + @ApiModelProperty("备注") + private String notes; + + @ApiModelProperty("附件") + private String attach; + + @ApiModelProperty("状态(0-草稿、1-已完成、2-拒绝、3-审批中、4-取消)") + private Integer status; + + @ApiModelProperty("借用人") + private UmsUser _useUser; + + @ApiModelProperty("预计归还时间") + private Date returnTime; + + @ApiModelProperty("创建时间") + private Date createTime; + + public static EamBusinessBorrowVo ToVo(EamBusinessBorrow eamBusinessBorrow) { + EamBusinessBorrowVo eamBusinessBorrowVo = new EamBusinessBorrowVo(); + BeanUtils.copyProperties(eamBusinessBorrow, eamBusinessBorrowVo); + eamBusinessBorrowVo.setAssetIdList(JSON.parseArray(eamBusinessBorrow.getAssetIdList(),EamWarehouseAssetDto.class)); + return eamBusinessBorrowVo; + } + + public static List ToVo(List eamBusinessBorrows) { + return Optional.ofNullable(eamBusinessBorrows).orElse(Collections.emptyList()).stream().map(EamBusinessBorrowVo::ToVo).collect(Collectors.toList()); + } +} diff --git a/system/src/main/java/com/yyy/system/entity/vo/EamBusinessCollectionVo.java b/system/src/main/java/com/yyy/system/entity/vo/EamBusinessCollectionVo.java new file mode 100644 index 0000000..3c0df55 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/vo/EamBusinessCollectionVo.java @@ -0,0 +1,90 @@ +package com.yyy.system.entity.vo; + +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +import com.alibaba.fastjson.JSON; +import com.yyy.common.core.domain.entity.UmsOrganization; +import com.yyy.common.core.domain.entity.UmsUser; +import com.yyy.system.entity.dto.EamWarehouseAssetDto; +import com.yyy.system.entity.pojo.EamBasicPosition; +import com.yyy.system.entity.pojo.EamBusinessCollection; +import com.yyy.common.utils.bean.BeanUtils; +import lombok.Data; +import lombok.Builder; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * 资产领用信息表(EamBusinessCollection)视图数据类 + * + * @author Fangy + * @since 2024-04-12 11:48:10 + */ +@ApiModel("EamBusinessCollectionVo资产领用信息表视图数据类") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class EamBusinessCollectionVo { + + @ApiModelProperty("主键") + private Long id; + + @ApiModelProperty("业务编号") + private String businessId; + + @ApiModelProperty("业务名称") + private String name; + + @ApiModelProperty("申请人") + private UmsUser _applicant; + + @ApiModelProperty(notes = "资产库存信息List") + private List assetIdList; + + @ApiModelProperty("业务生成日期") + private Date businessGeneratedDate; + + @ApiModelProperty("备注") + private String notes; + + @ApiModelProperty("附件") + private String attach; + + @ApiModelProperty("状态(0-草稿、1-已完成、2-拒绝、3-审批中、4-取消)") + private Integer status; + + @ApiModelProperty("创建时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date createTime; + + @ApiModelProperty("领用后公司/部门") + private UmsOrganization _useOrganization; + + @ApiModelProperty("领用后存放位置") + private EamBasicPosition _position; + + @ApiModelProperty("使用人员id") + private UmsUser _useUser; + + @ApiModelProperty("详细位置") + private String positionDetail; + + public static EamBusinessCollectionVo ToVo(EamBusinessCollection eamBusinessCollection) { + EamBusinessCollectionVo eamBusinessCollectionVo = new EamBusinessCollectionVo(); + BeanUtils.copyProperties(eamBusinessCollection, eamBusinessCollectionVo); + eamBusinessCollectionVo.setAssetIdList(JSON.parseArray(eamBusinessCollection.getAssetIdList(),EamWarehouseAssetDto.class)); + return eamBusinessCollectionVo; + } + + public static List ToVo(List eamBusinessCollections) { + return Optional.ofNullable(eamBusinessCollections).orElse(Collections.emptyList()).stream().map(EamBusinessCollectionVo::ToVo).collect(Collectors.toList()); + } +} diff --git a/system/src/main/java/com/yyy/system/entity/vo/EamBusinessOutboundVo.java b/system/src/main/java/com/yyy/system/entity/vo/EamBusinessOutboundVo.java new file mode 100644 index 0000000..9563b6f --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/vo/EamBusinessOutboundVo.java @@ -0,0 +1,91 @@ +package com.yyy.system.entity.vo; + +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.annotation.TableField; +import com.yyy.common.core.domain.entity.UmsOrganization; +import com.yyy.common.core.domain.entity.UmsUser; +import com.yyy.system.entity.dto.EamWarehouseAssetDto; +import com.yyy.system.entity.pojo.EamBasicWarehouse; +import com.yyy.system.entity.pojo.EamBusinessOutbound; +import com.yyy.common.utils.bean.BeanUtils; +import lombok.Data; +import lombok.Builder; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * 出库信息表(EamBusinessOutbound)视图数据类 + * + * @author Fangy + * @since 2024-04-10 17:26:37 + */ +@ApiModel("EamBusinessOutboundVo出库信息表视图数据类") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class EamBusinessOutboundVo { + + @ApiModelProperty("主键") + private Long id; + + @ApiModelProperty("业务编号") + private String businessId; + + @ApiModelProperty("业务名称") + private String name; + + @ApiModelProperty(notes = "资产库存信息List") + private List assetIdList; + + @ApiModelProperty("业务生成日期") + private Date businessGeneratedDate; + + @ApiModelProperty("备注") + private String notes; + + @ApiModelProperty("附件") + private String attach; + + @ApiModelProperty("状态(0-草稿、1-已完成、2-拒绝、3-审批中、4-取消)") + private Integer status; + + @ApiModelProperty("出库位置") + private String positionDetail; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("仓库") + private EamBasicWarehouse _warehouse; + + @ApiModelProperty("领用公司") + private UmsOrganization _ownCompany; + + @ApiModelProperty("领用部门") + private UmsOrganization _useOrganization; + + @ApiModelProperty("领用人员") + private UmsUser _useUser; + + public static EamBusinessOutboundVo ToVo(EamBusinessOutbound eamBusinessOutbound) { + EamBusinessOutboundVo eamBusinessOutboundVo = new EamBusinessOutboundVo(); + BeanUtils.copyProperties(eamBusinessOutbound, eamBusinessOutboundVo); + eamBusinessOutboundVo.setAssetIdList(JSON.parseArray(eamBusinessOutbound.getAssetIdList(), EamWarehouseAssetDto.class)); + return eamBusinessOutboundVo; + } + + public static List ToVo(List eamBusinessOutbounds) { + return Optional.ofNullable(eamBusinessOutbounds).orElse(Collections.emptyList()).stream().map(EamBusinessOutboundVo::ToVo).collect(Collectors.toList()); + } +} diff --git a/system/src/main/java/com/yyy/system/entity/vo/EamBusinessRegistrationVo.java b/system/src/main/java/com/yyy/system/entity/vo/EamBusinessRegistrationVo.java new file mode 100644 index 0000000..57e8ffb --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/vo/EamBusinessRegistrationVo.java @@ -0,0 +1,65 @@ +package com.yyy.system.entity.vo; + +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +import com.yyy.system.entity.pojo.EamBusinessRegistration; +import com.yyy.common.utils.bean.BeanUtils; +import lombok.Data; +import lombok.Builder; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * 资产登记信息表(EamBusinessRegistration)视图数据类 + * + * @author Fangy + * @since 2024-04-10 13:17:47 + */ +@ApiModel("EamBusinessRegistrationVo资产登记信息表视图数据类") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class EamBusinessRegistrationVo { + + @ApiModelProperty("主键") + private Long id; + + @ApiModelProperty("业务编号") + private String businessId; + + @ApiModelProperty("业务名称") + private String name; + + @ApiModelProperty("申请人id") + private Long applicant; + + @ApiModelProperty("状态(0-草稿、1-已完成、2-拒绝、3-审批中、4-取消)") + private Integer status; + + @ApiModelProperty("资产id") + private Long assetId; + + private String config; + + @ApiModelProperty("创建时间") + private Date createTime; + + public static EamBusinessRegistrationVo ToVo(EamBusinessRegistration eamBusinessRegistration) { + EamBusinessRegistrationVo eamBusinessRegistrationVo = new EamBusinessRegistrationVo(); + BeanUtils.copyProperties(eamBusinessRegistration, eamBusinessRegistrationVo); + return eamBusinessRegistrationVo; + } + + public static List ToVo(List eamBusinessRegistrations) { + return Optional.ofNullable(eamBusinessRegistrations).orElse(Collections.emptyList()).stream().map(EamBusinessRegistrationVo::ToVo).collect(Collectors.toList()); + } +} diff --git a/system/src/main/java/com/yyy/system/entity/vo/EamBusinessRetirementVo.java b/system/src/main/java/com/yyy/system/entity/vo/EamBusinessRetirementVo.java new file mode 100644 index 0000000..9bdc090 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/vo/EamBusinessRetirementVo.java @@ -0,0 +1,89 @@ +package com.yyy.system.entity.vo; + +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +import com.alibaba.fastjson.JSON; +import com.yyy.common.core.domain.entity.UmsUser; +import com.yyy.system.entity.dto.EamWarehouseAssetDto; +import com.yyy.system.entity.pojo.EamBusinessRetirement; +import com.yyy.common.utils.bean.BeanUtils; +import lombok.Data; +import lombok.Builder; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * 资产报废(EamBusinessRetirement)视图数据类 + * + * @author Fangy + * @since 2024-05-10 10:54:29 + */ +@ApiModel("EamBusinessRetirementVo资产报废视图数据类") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class EamBusinessRetirementVo { + + @ApiModelProperty("主键") + private Long id; + + @ApiModelProperty("业务编号") + private String businessId; + + @ApiModelProperty("业务名称") + private String name; + + @ApiModelProperty("申请人") + private UmsUser _applicant; + + @ApiModelProperty(notes = "资产库存信息List") + private List assetIdList; + + @ApiModelProperty("业务生成日期") + private Date businessGeneratedDate; + + @ApiModelProperty("备注") + private String notes; + + @ApiModelProperty("附件") + private String attach; + + @ApiModelProperty("状态(0-草稿、1-已完成、2-拒绝、3-审批中、4-取消)") + private Integer status; + + @ApiModelProperty("创建时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date createTime; + + @ApiModelProperty("报废方式") + private String type; + + @ApiModelProperty("加急状态(0-普通、1:加急)") + private Integer expeditedStatus; + + @ApiModelProperty("是否已报废(0-否、1:是)") + private Integer isRetirement; + + @ApiModelProperty("是否已清理(0-否、1:是)") + private Integer isClean; + + public static EamBusinessRetirementVo ToVo(EamBusinessRetirement eamBusinessRetirement) { + EamBusinessRetirementVo eamBusinessRetirementVo = new EamBusinessRetirementVo(); + BeanUtils.copyProperties(eamBusinessRetirement, eamBusinessRetirementVo); + eamBusinessRetirementVo.setAssetIdList(JSON.parseArray(eamBusinessRetirement.getAssetIdList(), EamWarehouseAssetDto.class)); + return eamBusinessRetirementVo; + } + + public static List ToVo(List eamBusinessRetirements) { + return Optional.ofNullable(eamBusinessRetirements).orElse(Collections.emptyList()).stream().map(EamBusinessRetirementVo::ToVo).collect(Collectors.toList()); + } +} diff --git a/system/src/main/java/com/yyy/system/entity/vo/EamBusinessReturnInventoryVo.java b/system/src/main/java/com/yyy/system/entity/vo/EamBusinessReturnInventoryVo.java new file mode 100644 index 0000000..d506579 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/vo/EamBusinessReturnInventoryVo.java @@ -0,0 +1,93 @@ +package com.yyy.system.entity.vo; + +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.annotation.TableField; +import com.yyy.common.core.domain.entity.UmsOrganization; +import com.yyy.common.core.domain.entity.UmsUser; +import com.yyy.system.entity.dto.EamWarehouseAssetDto; +import com.yyy.system.entity.pojo.EamBasicPosition; +import com.yyy.system.entity.pojo.EamBasicWarehouse; +import com.yyy.system.entity.pojo.EamBusinessReturnInventory; +import com.yyy.common.utils.bean.BeanUtils; +import lombok.Data; +import lombok.Builder; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * 退库信息表(EamBusinessReturnInventory)视图数据类 + * + * @author Fangy + * @since 2024-04-12 11:10:56 + */ +@ApiModel("EamBusinessReturnInventoryVo退库信息表视图数据类") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class EamBusinessReturnInventoryVo { + + @ApiModelProperty("主键") + private Long id; + + @ApiModelProperty("业务编号") + private String businessId; + + @ApiModelProperty("业务名称") + private String name; + + @ApiModelProperty(notes = "资产库存信息List") + private List assetIdList; + + @ApiModelProperty("业务生成日期") + private Date businessGeneratedDate; + + @ApiModelProperty("备注") + private String notes; + + @ApiModelProperty("附件") + private String attach; + + @ApiModelProperty("状态(0-草稿、1-已完成、2-拒绝、3-审批中、4-取消)") + private Integer status; + + @ApiModelProperty("创建时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date createTime; + + @ApiModelProperty("详细位置id") + private String positionDetail; + + @ApiModelProperty("申请人") + private UmsUser _applicant; + + @ApiModelProperty("领用后公司/部门") + private UmsOrganization _useOrganization; + + @ApiModelProperty("领用后存放位置") + private EamBasicPosition _position; + + @ApiModelProperty("关联仓库") + private EamBasicWarehouse _warehouse; + + public static EamBusinessReturnInventoryVo ToVo(EamBusinessReturnInventory eamBusinessReturnInventory) { + EamBusinessReturnInventoryVo eamBusinessReturnInventoryVo = new EamBusinessReturnInventoryVo(); + BeanUtils.copyProperties(eamBusinessReturnInventory, eamBusinessReturnInventoryVo); + eamBusinessReturnInventoryVo.setAssetIdList(JSON.parseArray(eamBusinessReturnInventory.getAssetIdList(),EamWarehouseAssetDto.class)); + return eamBusinessReturnInventoryVo; + } + + public static List ToVo(List eamBusinessReturnInventorys) { + return Optional.ofNullable(eamBusinessReturnInventorys).orElse(Collections.emptyList()).stream().map(EamBusinessReturnInventoryVo::ToVo).collect(Collectors.toList()); + } +} diff --git a/system/src/main/java/com/yyy/system/entity/vo/EamBusinessReturnVo.java b/system/src/main/java/com/yyy/system/entity/vo/EamBusinessReturnVo.java new file mode 100644 index 0000000..81ec20a --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/vo/EamBusinessReturnVo.java @@ -0,0 +1,89 @@ +package com.yyy.system.entity.vo; + +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +import com.alibaba.fastjson.JSON; +import com.yyy.common.core.domain.entity.UmsUser; +import com.yyy.system.entity.dto.EamWarehouseAssetDto; +import com.yyy.system.entity.pojo.EamBasicPosition; +import com.yyy.system.entity.pojo.EamBusinessReturn; +import com.yyy.common.utils.bean.BeanUtils; +import lombok.Data; +import lombok.Builder; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * 归还信息表(EamBusinessReturn)视图数据类 + * + * @author Fangy + * @since 2024-04-10 17:26:46 + */ +@ApiModel("EamBusinessReturnVo归还信息表视图数据类") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class EamBusinessReturnVo { + + @ApiModelProperty("主键") + private Long id; + + @ApiModelProperty("业务编号") + private String businessId; + + @ApiModelProperty("业务名称") + private String name; + + @ApiModelProperty("申请人") + private UmsUser _applicant; + + @ApiModelProperty(notes = "资产库存信息List") + private List assetIdList; + + @ApiModelProperty("业务生成日期") + private Date businessGeneratedDate; + + @ApiModelProperty("备注") + private String notes; + + @ApiModelProperty("附件") + private String attach; + + @ApiModelProperty("状态(0-草稿、1-已完成、2-拒绝、3-审批中、4-取消)") + private Integer status; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("存放位置") + private EamBasicPosition _position; + + @ApiModelProperty("详细位置") + private String positionDetail; + + @ApiModelProperty("管理人员") + private UmsUser _manager; + + @ApiModelProperty("使用人员") + private UmsUser _useUser; + + public static EamBusinessReturnVo ToVo(EamBusinessReturn eamBusinessReturn) { + EamBusinessReturnVo eamBusinessReturnVo = new EamBusinessReturnVo(); + BeanUtils.copyProperties(eamBusinessReturn, eamBusinessReturnVo); + eamBusinessReturnVo.setAssetIdList(JSON.parseArray(eamBusinessReturn.getAssetIdList(),EamWarehouseAssetDto.class)); + return eamBusinessReturnVo; + } + + public static List ToVo(List eamBusinessReturns) { + return Optional.ofNullable(eamBusinessReturns).orElse(Collections.emptyList()).stream().map(EamBusinessReturnVo::ToVo).collect(Collectors.toList()); + } +} diff --git a/system/src/main/java/com/yyy/system/entity/vo/EamBusinessStorageVo.java b/system/src/main/java/com/yyy/system/entity/vo/EamBusinessStorageVo.java new file mode 100644 index 0000000..b277c19 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/vo/EamBusinessStorageVo.java @@ -0,0 +1,97 @@ +package com.yyy.system.entity.vo; + +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.annotation.TableField; +import com.yyy.common.core.domain.entity.UmsUser; +import com.yyy.system.entity.dto.EamWarehouseAssetDto; +import com.yyy.system.entity.pojo.EamBasicPosition; +import com.yyy.system.entity.pojo.EamBasicSupplierVendor; +import com.yyy.system.entity.pojo.EamBasicWarehouse; +import com.yyy.system.entity.pojo.EamBusinessStorage; +import com.yyy.common.utils.bean.BeanUtils; +import lombok.Data; +import lombok.Builder; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * 入库信息表(EamBusinessStorage)视图数据类 + * + * @author Fangy + * @since 2024-04-10 17:26:46 + */ +@ApiModel("EamBusinessStorageVo入库信息表视图数据类") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class EamBusinessStorageVo { + + @ApiModelProperty("主键") + private Long id; + + @ApiModelProperty("业务编号") + private String businessId; + + @ApiModelProperty("业务名称") + private String name; + + @ApiModelProperty("关联仓库id") + private Long warehouseId; + + @ApiModelProperty(notes = "资产库存信息List") + private List assetIdList; + + @ApiModelProperty("业务生成日期") + private Date businessGeneratedDate; + + @ApiModelProperty("备注") + private String notes; + + @ApiModelProperty("附件") + private String attach; + + @ApiModelProperty("状态(0-草稿、1-已完成、2-拒绝、3-审批中、4-取消)") + private Integer status; + + @ApiModelProperty("管理人员id") + private Long manager; + + @ApiModelProperty("存放位置id") + private Long positionId; + + @ApiModelProperty("供应商id") + private Long supplierVendorId; + + @ApiModelProperty(notes = "购置日期") + private Date createTime; + + private EamBasicWarehouse _warehouse; + + private UmsUser _manager; + + private EamBasicPosition _position; + + private EamBasicSupplierVendor _supplierVendor; + + public static EamBusinessStorageVo ToVo(EamBusinessStorage eamBusinessStorage) { + EamBusinessStorageVo eamBusinessStorageVo = new EamBusinessStorageVo(); + BeanUtils.copyProperties(eamBusinessStorage, eamBusinessStorageVo); + eamBusinessStorageVo.setAssetIdList(JSON.parseArray(eamBusinessStorage.getAssetIdList(),EamWarehouseAssetDto.class)); + return eamBusinessStorageVo; + } + + public static List ToVo(List eamBusinessStorages) { + return Optional.ofNullable(eamBusinessStorages).orElse(Collections.emptyList()).stream().map(EamBusinessStorageVo::ToVo).collect(Collectors.toList()); + } +} diff --git a/system/src/main/java/com/yyy/system/entity/vo/EamBusinessTransferVo.java b/system/src/main/java/com/yyy/system/entity/vo/EamBusinessTransferVo.java new file mode 100644 index 0000000..9754b08 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/vo/EamBusinessTransferVo.java @@ -0,0 +1,93 @@ +package com.yyy.system.entity.vo; + +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +import com.alibaba.fastjson.JSON; +import com.yyy.common.core.domain.entity.UmsOrganization; +import com.yyy.common.core.domain.entity.UmsUser; +import com.yyy.system.entity.dto.EamWarehouseAssetDto; +import com.yyy.system.entity.pojo.EamBasicPosition; +import com.yyy.system.entity.pojo.EamBusinessTransfer; +import com.yyy.common.utils.bean.BeanUtils; +import lombok.Data; +import lombok.Builder; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * 资产转移信息表(EamBusinessTransfer)视图数据类 + * + * @author Fangy + * @since 2024-04-10 17:26:47 + */ +@ApiModel("EamBusinessTransferVo资产转移信息表视图数据类") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class EamBusinessTransferVo { + + @ApiModelProperty("主键") + private Long id; + + @ApiModelProperty("业务编号") + private String businessId; + + @ApiModelProperty("业务名称") + private String name; + + @ApiModelProperty(notes = "资产库存信息List") + private List assetIdList; + + @ApiModelProperty("业务生成日期") + private Date businessGeneratedDate; + + @ApiModelProperty("备注") + private String notes; + + @ApiModelProperty("附件") + private String attach; + + @ApiModelProperty("状态(0-草稿、1-已完成、2-拒绝、3-审批中、4-取消)") + private Integer status; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("调出使用公司/部门") + private UmsOrganization _outUseOrganization; + + @ApiModelProperty("调入使用公司/部门") + private UmsOrganization _inUseOrganization; + + @ApiModelProperty("调入管理员") + private UmsUser _manager; + + @ApiModelProperty("使用人员") + private UmsUser _useUser; + + @ApiModelProperty("存放位置") + private EamBasicPosition _position; + + @ApiModelProperty("详细位置") + private String positionDetail; + + public static EamBusinessTransferVo ToVo(EamBusinessTransfer eamBusinessTransfer) { + EamBusinessTransferVo eamBusinessTransferVo = new EamBusinessTransferVo(); + BeanUtils.copyProperties(eamBusinessTransfer, eamBusinessTransferVo); + eamBusinessTransferVo.setAssetIdList(JSON.parseArray(eamBusinessTransfer.getAssetIdList(),EamWarehouseAssetDto.class)); + return eamBusinessTransferVo; + } + + public static List ToVo(List eamBusinessTransfers) { + return Optional.ofNullable(eamBusinessTransfers).orElse(Collections.emptyList()).stream().map(EamBusinessTransferVo::ToVo).collect(Collectors.toList()); + } +} diff --git a/system/src/main/java/com/yyy/system/entity/vo/EamBusinessVo.java b/system/src/main/java/com/yyy/system/entity/vo/EamBusinessVo.java new file mode 100644 index 0000000..ea2c173 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/vo/EamBusinessVo.java @@ -0,0 +1,51 @@ +package com.yyy.system.entity.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.yyy.common.enums.DetectTypeEnum; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; + +/** + * 调拨信息表(EamBusinessAllocate)视图数据类 + * + * @author Fangy + * @since 2024-04-11 16:16:14 + */ +@ApiModel("资产管理列表展示信息") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class EamBusinessVo { + + @ApiModelProperty("主键") + private Long id; + + @ApiModelProperty("业务编号") + private String businessId; + + @ApiModelProperty("业务名称") + private String name; + + @ApiModelProperty(notes = "业务类型") + private DetectTypeEnum type; + + @ApiModelProperty("备注") + private String notes; + + @ApiModelProperty("状态(0-草稿、1-已完成、2-拒绝、3-审批中、4-取消)") + private Integer status; + + @ApiModelProperty("创建时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date createTime; + + @ApiModelProperty("申请人") + private String applicant; +} diff --git a/system/src/main/java/com/yyy/system/entity/vo/EamChartVo.java b/system/src/main/java/com/yyy/system/entity/vo/EamChartVo.java new file mode 100644 index 0000000..b675a29 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/vo/EamChartVo.java @@ -0,0 +1,22 @@ +package com.yyy.system.entity.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + + +@ApiModel("主页图表数据") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class EamChartVo { + @ApiModelProperty("总数") + private Integer total; + + @ApiModelProperty("名称") + private String name; +} diff --git a/system/src/main/java/com/yyy/system/entity/vo/EamDeviceLogVo.java b/system/src/main/java/com/yyy/system/entity/vo/EamDeviceLogVo.java new file mode 100644 index 0000000..b58ec4d --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/vo/EamDeviceLogVo.java @@ -0,0 +1,68 @@ +package com.yyy.system.entity.vo; + +import com.alibaba.fastjson.JSONObject; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.yyy.common.utils.bean.BeanUtils; +import com.yyy.system.entity.pojo.EamAssetLog; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + + +@ApiModel("设备维修、巡检、保养、盘点日志记录") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class EamDeviceLogVo { + + @ApiModelProperty("主键") + private Long id; + + @ApiModelProperty("业务编号") + private String businessId; + + @ApiModelProperty("操作类型") + private String operationType; + +// @ApiModelProperty("操作内容") +// private String operationNotes; + @ApiModelProperty("流程id") + private String procInsId; + + @ApiModelProperty("备注") + private String remark; + + @ApiModelProperty("关联资产编号") + private Long assetId; + + @ApiModelProperty("创建时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date createTime; + + public static EamDeviceLogVo ToVo(EamAssetLog eamAssetLog) { + EamDeviceLogVo eamAssetLogVo = new EamDeviceLogVo(); + BeanUtils.copyProperties(eamAssetLog, eamAssetLogVo); + JSONObject object = JSONObject.parseObject(eamAssetLog.getOperationNotes()); + if (object.containsKey("procInsId")) { + eamAssetLogVo.setProcInsId(object.getString("procInsId")); + } + if (object.containsKey("remark")){ + eamAssetLogVo.setRemark(object.getString("remark")); + } + return eamAssetLogVo; + } + + public static List ToVo(List eamAssetLogs) { + return Optional.ofNullable(eamAssetLogs).orElse(Collections.emptyList()).stream().map(EamDeviceLogVo::ToVo).collect(Collectors.toList()); + } +} diff --git a/system/src/main/java/com/yyy/system/entity/vo/EamHomeVo.java b/system/src/main/java/com/yyy/system/entity/vo/EamHomeVo.java new file mode 100644 index 0000000..f808771 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/vo/EamHomeVo.java @@ -0,0 +1,55 @@ +package com.yyy.system.entity.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + + +@ApiModel("主页展示数据") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class EamHomeVo { + + @ApiModelProperty("资产总数") + private EamTotalVo assetTotal; + + @ApiModelProperty("借用预警") + private EamTotalVo borrowWarning; + + @ApiModelProperty("维保到期预警") + private EamTotalVo maintenanceWarning; + + @ApiModelProperty("库存安全预警") + private EamTotalVo inventorySecurityWarning; + + @ApiModelProperty("待我处理") + private Long todo; + + @ApiModelProperty("资产状态分布") + private List assetStatusChart; + + @ApiModelProperty("资产存放分布") + private List assetPositionChart; + + @ApiModelProperty("资产类型分布") + private List assetCategoryChart; + + @ApiModelProperty("资产库存分布") + private List assetInventoryChart; + + @ApiModelProperty("资产归属分布") + private List assetOwnChart; + + @ApiModelProperty("资产使用分布") + private List assetUseChart; + + @ApiModelProperty("最近新增资产") + private List recentlyAddedAssets; +} diff --git a/system/src/main/java/com/yyy/system/entity/vo/EamRepairFaultVo.java b/system/src/main/java/com/yyy/system/entity/vo/EamRepairFaultVo.java new file mode 100644 index 0000000..b0f9467 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/vo/EamRepairFaultVo.java @@ -0,0 +1,69 @@ +package com.yyy.system.entity.vo; + +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +import com.alibaba.fastjson.JSON; +import com.yyy.system.entity.dto.EamWarehouseAssetDto; +import com.yyy.system.entity.pojo.EamRepairFault; +import com.yyy.common.utils.bean.BeanUtils; +import lombok.Data; +import lombok.Builder; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * 故障信息表(EamRepairFault)视图数据类 + * + * @author Fangy + * @since 2024-04-12 15:41:32 + */ +@ApiModel("EamRepairFaultVo故障信息表视图数据类") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class EamRepairFaultVo { + + @ApiModelProperty("主键") + private Long faultId; + + @ApiModelProperty("名称") + private String name; + + @ApiModelProperty("图片url") + private String img; + + @ApiModelProperty(notes = "资产库存信息List") + private List assetIdList; + + @ApiModelProperty("附件") + private String attach; + + @ApiModelProperty("备注") + private String notes; + + @ApiModelProperty("状态(0-草稿、1-已完成、2-拒绝、3-审批中、4-取消)") + private Integer status; + + @ApiModelProperty("创建时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date createTime; + + public static EamRepairFaultVo ToVo(EamRepairFault eamRepairFault) { + EamRepairFaultVo eamRepairFaultVo = new EamRepairFaultVo(); + BeanUtils.copyProperties(eamRepairFault, eamRepairFaultVo); + eamRepairFaultVo.setAssetIdList(JSON.parseArray(eamRepairFault.getAssetIdList(),EamWarehouseAssetDto.class)); + return eamRepairFaultVo; + } + + public static List ToVo(List eamRepairFaults) { + return Optional.ofNullable(eamRepairFaults).orElse(Collections.emptyList()).stream().map(EamRepairFaultVo::ToVo).collect(Collectors.toList()); + } +} diff --git a/system/src/main/java/com/yyy/system/entity/vo/EamRepairTypeVo.java b/system/src/main/java/com/yyy/system/entity/vo/EamRepairTypeVo.java new file mode 100644 index 0000000..0a2a6a5 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/vo/EamRepairTypeVo.java @@ -0,0 +1,57 @@ +package com.yyy.system.entity.vo; + +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +import com.yyy.system.entity.pojo.EamRepairType; +import com.yyy.common.utils.bean.BeanUtils; +import lombok.Data; +import lombok.Builder; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * 保养计划(维修类型)表(EamRepairType)视图数据类 + * + * @author Fangy + * @since 2024-04-12 15:00:40 + */ +@ApiModel("EamRepairTypeVo保养计划(维修类型)表视图数据类") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class EamRepairTypeVo { + + @ApiModelProperty("主键") + private Long repairTypeId; + + @ApiModelProperty("名称") + private String name; + + @ApiModelProperty("配置信息") + private String config; + + @ApiModelProperty("备注") + private String notes; + + @ApiModelProperty("创建时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date createTime; + + public static EamRepairTypeVo ToVo(EamRepairType eamRepairType) { + EamRepairTypeVo eamRepairTypeVo = new EamRepairTypeVo(); + BeanUtils.copyProperties(eamRepairType, eamRepairTypeVo); + return eamRepairTypeVo; + } + + public static List ToVo(List eamRepairTypes) { + return Optional.ofNullable(eamRepairTypes).orElse(Collections.emptyList()).stream().map(EamRepairTypeVo::ToVo).collect(Collectors.toList()); + } +} diff --git a/system/src/main/java/com/yyy/system/entity/vo/EamRepairVo.java b/system/src/main/java/com/yyy/system/entity/vo/EamRepairVo.java new file mode 100644 index 0000000..be24fab --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/vo/EamRepairVo.java @@ -0,0 +1,77 @@ +package com.yyy.system.entity.vo; + +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +import com.alibaba.fastjson.JSON; +import com.yyy.system.entity.dto.EamWarehouseAssetDto; +import com.yyy.system.entity.pojo.EamRepair; +import com.yyy.common.utils.bean.BeanUtils; +import com.yyy.system.entity.pojo.EamRepairType; +import lombok.Data; +import lombok.Builder; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * 维修登记信息表(EamRepair)视图数据类 + * + * @author Fangy + * @since 2024-04-12 15:00:38 + */ +@ApiModel("EamRepairVo维修登记信息表视图数据类") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class EamRepairVo { + + @ApiModelProperty("主键") + private Long id; + + @ApiModelProperty("业务编号") + private String businessId; + + @ApiModelProperty("业务名称") + private String name; + + @ApiModelProperty(notes = "资产库存信息List") + private List assetIdList; + + @ApiModelProperty("备注") + private String notes; + + @ApiModelProperty("附件") + private String attach; + + @ApiModelProperty("状态(0-草稿、1-已完成、2-拒绝、3-审批中、4-取消)") + private Integer status; + + @ApiModelProperty("创建时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date createTime; + + @ApiModelProperty("计划完成时间") + private Date plannedDate; + + @ApiModelProperty("保养计划(维修类型)") + private EamRepairType _repairType; + + public static EamRepairVo ToVo(EamRepair eamRepair) { + EamRepairVo eamRepairVo = new EamRepairVo(); + BeanUtils.copyProperties(eamRepair, eamRepairVo); + eamRepairVo.setAssetIdList(JSON.parseArray(eamRepair.getAssetIdList(),EamWarehouseAssetDto.class)); + return eamRepairVo; + } + + public static List ToVo(List eamRepairs) { + return Optional.ofNullable(eamRepairs).orElse(Collections.emptyList()).stream().map(EamRepairVo::ToVo).collect(Collectors.toList()); + } +} diff --git a/system/src/main/java/com/yyy/system/entity/vo/EamStatisticsVo.java b/system/src/main/java/com/yyy/system/entity/vo/EamStatisticsVo.java new file mode 100644 index 0000000..f241118 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/vo/EamStatisticsVo.java @@ -0,0 +1,22 @@ +package com.yyy.system.entity.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + + +@ApiModel("数据大屏统计数据") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class EamStatisticsVo { + @ApiModelProperty("名称") + private String name; + + @ApiModelProperty("内容") + private String content; +} diff --git a/system/src/main/java/com/yyy/system/entity/vo/EamStocktakingDetailsVo.java b/system/src/main/java/com/yyy/system/entity/vo/EamStocktakingDetailsVo.java new file mode 100644 index 0000000..bdb6e52 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/vo/EamStocktakingDetailsVo.java @@ -0,0 +1,71 @@ +package com.yyy.system.entity.vo; + +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +import com.yyy.system.entity.pojo.EamAsset; +import com.yyy.system.entity.pojo.EamStocktakingDetails; +import com.yyy.common.utils.bean.BeanUtils; +import lombok.Data; +import lombok.Builder; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * 盘点明细(EamStocktakingDetails)视图数据类 + * + * @author Fangy + * @since 2024-04-12 14:50:46 + */ +@ApiModel("EamStocktakingDetailsVo盘点明细视图数据类") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class EamStocktakingDetailsVo { + + @ApiModelProperty("主键") + private Long id; + + @ApiModelProperty("盘点任务id") + private Long stocktakingJobId; + + @ApiModelProperty("盘点资产") + private EamAsset _asset; + + @ApiModelProperty("盘点状态(0-盘盈,1-盘亏,2-已盘点,3-待盘点,4-异常)") + private Integer status; + + private String img; + + @ApiModelProperty("附件") + private String attachment; + + @ApiModelProperty("备注") + private String notes; + + @ApiModelProperty("创建人") + @JsonIgnore + private Long createUser; + + @ApiModelProperty("创建时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date createTime; + + public static EamStocktakingDetailsVo ToVo(EamStocktakingDetails eamStocktakingDetails) { + EamStocktakingDetailsVo eamStocktakingDetailsVo = new EamStocktakingDetailsVo(); + BeanUtils.copyProperties(eamStocktakingDetails, eamStocktakingDetailsVo); + return eamStocktakingDetailsVo; + } + + public static List ToVo(List eamStocktakingDetailss) { + return Optional.ofNullable(eamStocktakingDetailss).orElse(Collections.emptyList()).stream().map(EamStocktakingDetailsVo::ToVo).collect(Collectors.toList()); + } +} diff --git a/system/src/main/java/com/yyy/system/entity/vo/EamStocktakingJobVo.java b/system/src/main/java/com/yyy/system/entity/vo/EamStocktakingJobVo.java new file mode 100644 index 0000000..e5cf700 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/vo/EamStocktakingJobVo.java @@ -0,0 +1,115 @@ +package com.yyy.system.entity.vo; + +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +import com.yyy.common.core.domain.entity.UmsOrganization; +import com.yyy.common.core.domain.entity.UmsUser; +import com.yyy.system.entity.pojo.EamBasicCategory; +import com.yyy.system.entity.pojo.EamBasicPosition; +import com.yyy.system.entity.pojo.EamBasicWarehouse; +import com.yyy.system.entity.pojo.EamStocktakingJob; +import com.yyy.common.utils.bean.BeanUtils; +import lombok.Data; +import lombok.Builder; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * 盘点任务表(EamStocktakingJob)视图数据类 + * + * @author Fangy + * @since 2024-04-12 14:50:46 + */ +@ApiModel("EamStocktakingJobVo盘点任务表视图数据类") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class EamStocktakingJobVo { + + @ApiModelProperty("主键") + private Long stocktakingJobId; + + @ApiModelProperty("业务名称") + private String name; + + @ApiModelProperty("负责人") + private UmsUser _head; + + @ApiModelProperty("全员盘点(0-禁用,1-启用)") + private Integer fullStocktaking; + + @ApiModelProperty("盘点人") + private UmsUser _stocktakingUser; + + @ApiModelProperty("购置开始日期") + private Date stocktakingStartDate; + + @ApiModelProperty("购置结束日期") + private Date stocktakingEndDate; + + @ApiModelProperty("资产状态(0-闲置 1-在用 2-借用中 3-维修中 4-调拨中 5-待报废 6-已处置 7-库存 8-已报废)") + private Integer assetStatus; + + @ApiModelProperty("所属公司") + private UmsOrganization _ownCompany; + + @ApiModelProperty("使用公司/部门") + private UmsOrganization _useOrganization; + + @ApiModelProperty("保管人") + private UmsUser _useUser; + + @ApiModelProperty("资产分类") + private EamBasicCategory _category; + + @ApiModelProperty("存放位置") + private EamBasicPosition _position; + + @ApiModelProperty("仓库") + private EamBasicWarehouse _warehouse; + + @ApiModelProperty("盘点状态(0-未开始,1-进行中,2-取消,3-已完成)") + private Integer status; + + @ApiModelProperty("备注") + private String notes; + + @ApiModelProperty("创建时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date createTime; + + @ApiModelProperty("待盘点") + private Integer countPending; + + @ApiModelProperty("已盘点") + private Integer countCompleted; + + @ApiModelProperty("盘亏") + private Integer countLoss; + + @ApiModelProperty("盘盈") + private Integer countSurplus; + + @ApiModelProperty("异常数据") + private Integer countException; + + + public static EamStocktakingJobVo ToVo(EamStocktakingJob eamStocktakingJob) { + EamStocktakingJobVo eamStocktakingJobVo = new EamStocktakingJobVo(); + BeanUtils.copyProperties(eamStocktakingJob, eamStocktakingJobVo); + return eamStocktakingJobVo; + } + + public static List ToVo(List eamStocktakingJobs) { + return Optional.ofNullable(eamStocktakingJobs).orElse(Collections.emptyList()).stream().map(EamStocktakingJobVo::ToVo).collect(Collectors.toList()); + } +} diff --git a/system/src/main/java/com/yyy/system/entity/vo/EamStocktakingPlanVo.java b/system/src/main/java/com/yyy/system/entity/vo/EamStocktakingPlanVo.java new file mode 100644 index 0000000..4ed1f44 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/vo/EamStocktakingPlanVo.java @@ -0,0 +1,102 @@ +package com.yyy.system.entity.vo; + +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +import com.yyy.common.core.domain.entity.UmsOrganization; +import com.yyy.common.core.domain.entity.UmsUser; +import com.yyy.system.entity.pojo.EamBasicCategory; +import com.yyy.system.entity.pojo.EamBasicPosition; +import com.yyy.system.entity.pojo.EamBasicWarehouse; +import com.yyy.system.entity.pojo.EamStocktakingPlan; +import com.yyy.common.utils.bean.BeanUtils; +import lombok.Data; +import lombok.Builder; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * 盘点计划信息(EamStocktakingPlan)视图数据类 + * + * @author Fangy + * @since 2024-04-12 14:50:46 + */ +@ApiModel("EamStocktakingPlanVo盘点计划信息视图数据类") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class EamStocktakingPlanVo { + + @ApiModelProperty("主键") + private Long stocktakingPlanId; + + @ApiModelProperty("业务名称") + private String name; + + @ApiModelProperty("负责人id") + private UmsUser _head; + + @ApiModelProperty("全员盘点(0-禁用,1-启用)") + private Integer fullStocktaking; + + @ApiModelProperty("盘点人") + private UmsUser _stocktakingUser; + + @ApiModelProperty("购置开始日期") + private Date stocktakingStartDate; + + @ApiModelProperty("购置结束日期") + private Date stocktakingEndDate; + + @ApiModelProperty("资产状态(0-闲置 1-在用 2-借用中 3-维修中 4-调拨中 5-待报废 6-已处置 7-库存 8-已报废)") + private Integer assetStatus; + + @ApiModelProperty("所属公司") + private UmsOrganization _ownCompany; + + @ApiModelProperty("使用公司/部门") + private UmsOrganization _useOrganization; + + @ApiModelProperty("保管人") + private UmsUser _useUser; + + @ApiModelProperty("资产分类") + private EamBasicCategory _category; + + @ApiModelProperty("存放位置") + private EamBasicPosition _position; + + @ApiModelProperty("仓库") + private EamBasicWarehouse _warehouse; + + @ApiModelProperty("启用状态(0-禁用,1-启用)") + private Integer status; + + @ApiModelProperty("备注") + private String notes; + + @ApiModelProperty("创建时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date createTime; + + @ApiModelProperty("是否删除(0:正常/1:删除)") + private Integer isDeleted; + + public static EamStocktakingPlanVo ToVo(EamStocktakingPlan eamStocktakingPlan) { + EamStocktakingPlanVo eamStocktakingPlanVo = new EamStocktakingPlanVo(); + BeanUtils.copyProperties(eamStocktakingPlan, eamStocktakingPlanVo); + return eamStocktakingPlanVo; + } + + public static List ToVo(List eamStocktakingPlans) { + return Optional.ofNullable(eamStocktakingPlans).orElse(Collections.emptyList()).stream().map(EamStocktakingPlanVo::ToVo).collect(Collectors.toList()); + } +} diff --git a/system/src/main/java/com/yyy/system/entity/vo/EamTotalVo.java b/system/src/main/java/com/yyy/system/entity/vo/EamTotalVo.java new file mode 100644 index 0000000..f137f78 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/vo/EamTotalVo.java @@ -0,0 +1,26 @@ +package com.yyy.system.entity.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + + +@ApiModel("主页总数展示数据") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class EamTotalVo { + + @ApiModelProperty("总数") + private Integer total; + + @ApiModelProperty("今日变化") + private Integer change; + + @ApiModelProperty("名称") + private String name; +} diff --git a/system/src/main/java/com/yyy/system/entity/vo/EamWarehouseAssetVo.java b/system/src/main/java/com/yyy/system/entity/vo/EamWarehouseAssetVo.java new file mode 100644 index 0000000..65c2a0c --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/vo/EamWarehouseAssetVo.java @@ -0,0 +1,50 @@ +package com.yyy.system.entity.vo; + +import java.util.Collections; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +import com.yyy.system.entity.pojo.EamWarehouseAsset; +import com.yyy.common.utils.bean.BeanUtils; +import lombok.Data; +import lombok.Builder; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * 库存信息表(EamWarehouseAsset)视图数据类 + * + * @author Fangy + * @since 2024-05-08 14:00:19 + */ +@ApiModel("EamWarehouseAssetVo库存信息表视图数据类") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class EamWarehouseAssetVo { + + @ApiModelProperty("仓库id") + private Long warehouseId; + + @ApiModelProperty("资产id") + private Long assetId; + + @ApiModelProperty("库存数量") + private Integer count; + + public static EamWarehouseAssetVo ToVo(EamWarehouseAsset eamWarehouseAsset) { + EamWarehouseAssetVo eamWarehouseAssetVo = new EamWarehouseAssetVo(); + BeanUtils.copyProperties(eamWarehouseAsset, eamWarehouseAssetVo); + return eamWarehouseAssetVo; + } + + public static List ToVo(List eamWarehouseAssets) { + return Optional.ofNullable(eamWarehouseAssets).orElse(Collections.emptyList()).stream().map(EamWarehouseAssetVo::ToVo).collect(Collectors.toList()); + } +} diff --git a/system/src/main/java/com/yyy/system/entity/vo/EamWarehouseInventoryVo.java b/system/src/main/java/com/yyy/system/entity/vo/EamWarehouseInventoryVo.java new file mode 100644 index 0000000..95f9854 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/vo/EamWarehouseInventoryVo.java @@ -0,0 +1,85 @@ +package com.yyy.system.entity.vo; + +import java.util.Collections; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +import com.yyy.system.entity.pojo.*; +import com.yyy.common.utils.bean.BeanUtils; +import lombok.Data; +import lombok.Builder; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * 库存信息表(EamWarehouseInventory)视图数据类 + * + * @author Fangy + * @since 2024-04-11 13:30:21 + */ +@ApiModel("EamWarehouseInventoryVo库存信息表视图数据类") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class EamWarehouseInventoryVo { + + @ApiModelProperty("资产id") + private String assetId; + + @ApiModelProperty("资产编号") + private String assetCode; + + @ApiModelProperty("资产名称") + private String name; + + @ApiModelProperty("规格型号") + private String model; + + @ApiModelProperty("资产序列号") + private String serialNumber; + + @ApiModelProperty("计量单位") + private String unit; + + @ApiModelProperty("库存数量") + private Integer count; + + @ApiModelProperty("资产状态(0-闲置 1-在用 2-借用中 3-维修中 4-调拨中 5-待报废 6-已处置 7-库存 8-已报废)") + private Integer status; + + @ApiModelProperty("仓库Id") + private Long warehouseId; + + @ApiModelProperty("仓库名称") + private String warehouseName; + + @ApiModelProperty("资产分类Id") + private Long categoryId; + + @ApiModelProperty("资产分类名称") + private String categoryName; + + @ApiModelProperty("安全库存上限") + private Integer upperLimit; + + @ApiModelProperty("安全库存下限") + private Integer lowerLimit; + + @ApiModelProperty("安全库存") + private Integer safetyLimit; + + + public static EamWarehouseInventoryVo ToVo(EamWarehouseInventory eamWarehouseInventory) { + EamWarehouseInventoryVo eamWarehouseInventoryVo = new EamWarehouseInventoryVo(); + BeanUtils.copyProperties(eamWarehouseInventory, eamWarehouseInventoryVo); + return eamWarehouseInventoryVo; + } + + public static List ToVo(List eamWarehouseInventories) { + return Optional.ofNullable(eamWarehouseInventories).orElse(Collections.emptyList()).stream().map(EamWarehouseInventoryVo::ToVo).collect(Collectors.toList()); + } +} diff --git a/system/src/main/java/com/yyy/system/entity/vo/EamWarningBorrowVo.java b/system/src/main/java/com/yyy/system/entity/vo/EamWarningBorrowVo.java new file mode 100644 index 0000000..d60f70f --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/vo/EamWarningBorrowVo.java @@ -0,0 +1,95 @@ +package com.yyy.system.entity.vo; + +import com.yyy.common.core.domain.entity.UmsOrganization; +import com.yyy.common.core.domain.entity.UmsUser; +import com.yyy.common.utils.bean.BeanUtils; +import com.yyy.system.entity.pojo.EamAsset; +import com.yyy.system.entity.pojo.*; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +@ApiModel("EamAssetVo资产信息表视图数据类") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class EamWarningBorrowVo { + + @ApiModelProperty("借出单据") + private String businessId; + + @ApiModelProperty("预计归还时间") + private Date returnTime; + + @ApiModelProperty("资产编号") + private String assetCode; + + @ApiModelProperty("资产名称") + private String name; + + @ApiModelProperty("资产状态(0-闲置 1-在用 2-借用中 3-维修中 4-调拨中 5-待报废 6-已处置 7-库存 8-已报废)") + private Integer status; + + @ApiModelProperty("资产来源(0-捐赠 1-赠送 2-其他 3-采购 4-自建 5-自购)") + private Integer sourceId; + + @ApiModelProperty("规格型号") + private String model; + + @ApiModelProperty("序列号") + private String serialNumber; + + @ApiModelProperty("用途") + private String purpose; + + @ApiModelProperty("计量单位") + private String unit; + + @ApiModelProperty("详细位置") + private String positionDetail; + + @ApiModelProperty("资产备注") + private String notes; + + @ApiModelProperty("资产分类信息") + private EamBasicCategory _category; + + @ApiModelProperty("所属公司信息") + private UmsOrganization _ownCompany; + + @ApiModelProperty("使用组织") + private UmsOrganization _useOrganization; + + @ApiModelProperty("管理人员") + private UmsUser _manager; + + @ApiModelProperty("使用人员") + private UmsUser _useUser; + + @ApiModelProperty("存放位置") + private EamBasicPosition _position; + + public static EamWarningBorrowVo ToVo(EamAsset eamAsset, String businessId, Date returnTime) { + EamWarningBorrowVo eamWarningBorrowVo = new EamWarningBorrowVo(); + BeanUtils.copyProperties(eamAsset, eamWarningBorrowVo); + eamWarningBorrowVo.setBusinessId(businessId); + eamWarningBorrowVo.setReturnTime(returnTime); + return eamWarningBorrowVo; + } + + public static List ToVo(List eamAssets, String businessId, Date returnTime) { + return Optional.ofNullable(eamAssets).orElse(Collections.emptyList()).stream() + .map(eamAsset -> ToVo(eamAsset, businessId, returnTime)) + .collect(Collectors.toList()); + } +} diff --git a/system/src/main/java/com/yyy/system/entity/vo/FlFormItemCalendarVo.java b/system/src/main/java/com/yyy/system/entity/vo/FlFormItemCalendarVo.java new file mode 100644 index 0000000..ce7f540 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/vo/FlFormItemCalendarVo.java @@ -0,0 +1,54 @@ +package com.yyy.system.entity.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.yyy.common.utils.bean.BeanUtils; +import com.yyy.system.entity.pojo.FlFormItem; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +@ApiModel("日历查询展示数据") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class FlFormItemCalendarVo { + + @ApiModelProperty("主键") + private Long id; + + @ApiModelProperty("名称") + private String name; + + @ApiModelProperty("表单标识") + private String formKey; + + @ApiModelProperty("状态 (1-起草 2-审批中 3-已结束 4-已驳回 5-已废弃 6-流程异常 7-待指派 8-已挂起)") + private Integer status; + + @ApiModelProperty("创建时间") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + private Date createTime; + + @ApiModelProperty(notes = "创建方式") + private String createType; + + public static FlFormItemCalendarVo ToVo(FlFormItem flFormItem) { + FlFormItemCalendarVo flFormItemVo = new FlFormItemCalendarVo(); + BeanUtils.copyProperties(flFormItem, flFormItemVo); + return flFormItemVo; + } + + public static List ToVo(List flFormItems) { + return Optional.ofNullable(flFormItems).orElse(Collections.emptyList()).stream().map(FlFormItemCalendarVo::ToVo).collect(Collectors.toList()); + } +} diff --git a/system/src/main/java/com/yyy/system/entity/vo/FlFormItemVo.java b/system/src/main/java/com/yyy/system/entity/vo/FlFormItemVo.java new file mode 100644 index 0000000..d1ff722 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/vo/FlFormItemVo.java @@ -0,0 +1,88 @@ +package com.yyy.system.entity.vo; + +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +import com.yyy.system.entity.pojo.FlFormItem; +import com.yyy.common.utils.bean.BeanUtils; +import lombok.Data; +import lombok.Builder; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * 流程实例对象(FlFormItem)视图数据类 + * + * @author Fangy + * @since 2024-04-30 11:25:58 + */ +@ApiModel("FlFormItemVo流程实例对象视图数据类") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class FlFormItemVo { + + @ApiModelProperty("主键") + private Long id; + + @ApiModelProperty("名称") + private String name; + + @ApiModelProperty("表单标识") + private String formKey; + + @ApiModelProperty("流程实例id") + private String procInsId; + + @ApiModelProperty("任务id") + private String taskId; + + @ApiModelProperty("审批内容") + private String contents; + + @ApiModelProperty("审批记录") + private String logs; + + @ApiModelProperty("状态 (1-起草 2-审批中 3-已结束 4-已驳回 5-已废弃 6-流程异常 7-待指派 8-已挂起)") + private Integer status; + + @ApiModelProperty("是否删除(0:正常/1:删除)") + private Integer isDeleted; + + @ApiModelProperty("创建人") + @JsonIgnore + private Long createUser; + + @ApiModelProperty("创建时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date createTime; + + @ApiModelProperty("修改人") + @JsonIgnore + private Long updateUser; + + @ApiModelProperty("修改时间") + @JsonIgnore + private Date updateTime; + + @ApiModelProperty(notes = "创建方式") + private String createType; + + public static FlFormItemVo ToVo(FlFormItem flFormItem) { + FlFormItemVo flFormItemVo = new FlFormItemVo(); + BeanUtils.copyProperties(flFormItem, flFormItemVo); + return flFormItemVo; + } + + public static List ToVo(List flFormItems) { + return Optional.ofNullable(flFormItems).orElse(Collections.emptyList()).stream().map(FlFormItemVo::ToVo).collect(Collectors.toList()); + } +} diff --git a/system/src/main/java/com/yyy/system/entity/vo/FlFormVo.java b/system/src/main/java/com/yyy/system/entity/vo/FlFormVo.java new file mode 100644 index 0000000..9a6b168 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/vo/FlFormVo.java @@ -0,0 +1,95 @@ +package com.yyy.system.entity.vo; + +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +import com.alibaba.fastjson.JSONObject; +import com.yyy.common.core.domain.entity.UmsUser; +import com.yyy.system.entity.pojo.FlForm; +import com.yyy.common.utils.bean.BeanUtils; +import lombok.Data; +import lombok.Builder; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * 流程表单对象(FlForm)视图数据类 + * + * @author Fangy + * @since 2024-04-24 12:57:36 + */ +@ApiModel("FlFormVo流程表单对象视图数据类") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class FlFormVo { + + @ApiModelProperty("表单ID") + private Long formId; + + @ApiModelProperty("表单标识") + private String formKey; + + @ApiModelProperty("表单类型") + private String type; + + @ApiModelProperty("表单名称") + private String name; + + @ApiModelProperty("PC端图标") + private String pcIcon; + + @ApiModelProperty("移动端图标") + private String mobileIcon; + +// @ApiModelProperty("表单内容") +// private String config; + + @ApiModelProperty("流程id") + private String deployId; + + @ApiModelProperty("状态(0:启用/1:停用)") + private Integer status; + + @ApiModelProperty("创建时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date createTime; + +// @ApiModelProperty("审批人") +// private UmsUser _assignee; + + @ApiModelProperty("审批节点") + private List nodes; + + @ApiModelProperty(notes = "备注信息") + private Integer remark; + + @ApiModelProperty(notes = "验收要求") + private boolean checkRequire; + + @ApiModelProperty(notes = "自动指派(0-关 1-开)") + private Integer autoAssign; + + public static FlFormVo ToVo(FlForm flForm) { + FlFormVo flFormVo = new FlFormVo(); + BeanUtils.copyProperties(flForm, flFormVo); + + JSONObject config = JSONObject.parseObject(flForm.getConfig()); + flFormVo.setNodes(config.getJSONArray("nodes").toJavaList(FlowNode.class)); + flFormVo.setAutoAssign(config.getInteger("autoAssign")); + flFormVo.setCheckRequire(config.getBoolean("checkRequire")); + return flFormVo; + } + + public static List ToVo(List flForms) { + return Optional.ofNullable(flForms).orElse(Collections.emptyList()).stream().map(FlFormVo::ToVo).collect(Collectors.toList()); + } +} diff --git a/system/src/main/java/com/yyy/system/entity/vo/FlListenerVo.java b/system/src/main/java/com/yyy/system/entity/vo/FlListenerVo.java new file mode 100644 index 0000000..d224524 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/vo/FlListenerVo.java @@ -0,0 +1,82 @@ +package com.yyy.system.entity.vo; + +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +import com.yyy.system.entity.pojo.FlListener; +import com.yyy.common.utils.bean.BeanUtils; +import lombok.Data; +import lombok.Builder; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * 流程监听对象(FlListener)视图数据类 + * + * @author Fangy + * @since 2024-04-23 12:22:45 + */ +@ApiModel("FlListenerVo流程监听对象视图数据类") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class FlListenerVo { + + @ApiModelProperty("主键") + private Long id; + + @ApiModelProperty("名称") + private String name; + + @ApiModelProperty("监听类型") + private String type; + + @ApiModelProperty("事件类型") + private String eventType; + + @ApiModelProperty("值类型") + private String valueType; + + @ApiModelProperty("执行内容") + private String value; + + @ApiModelProperty("状态") + private Integer status; + + @ApiModelProperty("是否删除(0:正常/1:删除)") + private Integer isDeleted; + + @ApiModelProperty("创建人") + @JsonIgnore + private Long createUser; + + @ApiModelProperty("创建时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date createTime; + + @ApiModelProperty("修改人") + @JsonIgnore + private Long updateUser; + + @ApiModelProperty("修改时间") + @JsonIgnore + private Date updateTime; + + public static FlListenerVo ToVo(FlListener flListener) { + FlListenerVo flListenerVo = new FlListenerVo(); + BeanUtils.copyProperties(flListener, flListenerVo); + return flListenerVo; + } + + public static List ToVo(List flListeners) { + return Optional.ofNullable(flListeners).orElse(Collections.emptyList()).stream().map(FlListenerVo::ToVo).collect(Collectors.toList()); + } +} diff --git a/system/src/main/java/com/yyy/system/entity/vo/FlowNode.java b/system/src/main/java/com/yyy/system/entity/vo/FlowNode.java new file mode 100644 index 0000000..f7c3aae --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/vo/FlowNode.java @@ -0,0 +1,37 @@ +package com.yyy.system.entity.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + + +@ApiModel("审批节点") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class FlowNode { + + @ApiModelProperty("节点id") + private String id; + + @ApiModelProperty("节点名称") + private String name; + + @ApiModelProperty("角色") + private List roleIds; + + @ApiModelProperty("用户") + private List userIds; + + @ApiModelProperty("备注") + private String remark; + + @ApiModelProperty("是否为默认节点(0-可编辑 1-不可编辑)") + private Integer isDefault; +} diff --git a/system/src/main/java/com/yyy/system/entity/vo/OperationalStatisticsVo.java b/system/src/main/java/com/yyy/system/entity/vo/OperationalStatisticsVo.java new file mode 100644 index 0000000..a856146 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/vo/OperationalStatisticsVo.java @@ -0,0 +1,56 @@ +package com.yyy.system.entity.vo; + +import com.yyy.common.utils.chart.ChartValue; +import com.yyy.kernel.enums.DeviceStatus; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + * 资产信息表(EamAsset)视图数据类 + * + * @author Fangy + * @since 2024-04-09 13:47:50 + */ +@ApiModel("告警信息") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class OperationalStatisticsVo { + + @ApiModelProperty("设备开关机状态") + private DeviceStatus deviceStatus; + + @ApiModelProperty("设备照片url") + private String img; + + @ApiModelProperty("开关机时长分析") + private List openLogs; + + @ApiModelProperty("运行状态分析") + private List runLogs; + + @ApiModelProperty("累计维修次数") + private Integer repairCount; + + @ApiModelProperty("累计巡检次数") + private Integer inspectionCount; + + @ApiModelProperty("累计保养次数") + private Integer maintenanceCount; + + @ApiModelProperty("累计盘点次数") + private Integer stocktakingCount; + + @ApiModelProperty("折旧损耗(%)") + private Integer depreciation; + + @ApiModelProperty("维保剩余天数") + private Integer maintenanceDays; +} diff --git a/system/src/main/java/com/yyy/system/entity/vo/ProcessHomePageVo.java b/system/src/main/java/com/yyy/system/entity/vo/ProcessHomePageVo.java new file mode 100644 index 0000000..a99d42e --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/vo/ProcessHomePageVo.java @@ -0,0 +1,28 @@ +package com.yyy.system.entity.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@ApiModel("流程首页统计信息") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class ProcessHomePageVo { + + @ApiModelProperty("分类") + private String type; + + @ApiModelProperty("总数") + private Integer count; + + @ApiModelProperty("当日新增") + private Integer increase; + + @ApiModelProperty("待我处理") + private Integer todo; +} diff --git a/system/src/main/java/com/yyy/system/entity/vo/SysConfigVo.java b/system/src/main/java/com/yyy/system/entity/vo/SysConfigVo.java new file mode 100644 index 0000000..1cb61d3 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/vo/SysConfigVo.java @@ -0,0 +1,71 @@ +package com.yyy.system.entity.vo; + +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +import com.yyy.system.entity.pojo.SysConfig; +import com.yyy.common.utils.bean.BeanUtils; +import lombok.Data; +import lombok.Builder; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * 参数配置表(SysConfig)视图数据类 + * + * @author Fangy + * @since 2024-11-01 11:41:13 + */ +@ApiModel("SysConfigVo参数配置表视图数据类") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class SysConfigVo { + + @ApiModelProperty("参数主键") + private Integer configId; + + @ApiModelProperty("参数名称") + private String configName; + + @ApiModelProperty("参数键名") + private String configKey; + + @ApiModelProperty("参数键值") + private String configValue; + + @ApiModelProperty("创建者") + @JsonIgnore + private Long createUser; + + @ApiModelProperty("创建时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date createTime; + + @ApiModelProperty("更新者") + @JsonIgnore + private Long updateUser; + + @ApiModelProperty("更新时间") + @JsonIgnore + private Date updateTime; + + @ApiModelProperty("备注") + private String remark; + + public static SysConfigVo ToVo(SysConfig sysConfig) { + SysConfigVo sysConfigVo = new SysConfigVo(); + BeanUtils.copyProperties(sysConfig, sysConfigVo); + return sysConfigVo; + } + + public static List ToVo(List sysConfigs) { + return sysConfigs.stream().map(SysConfigVo::ToVo).collect(Collectors.toList()); + } +} diff --git a/system/src/main/java/com/yyy/system/entity/vo/SysDictDataVo.java b/system/src/main/java/com/yyy/system/entity/vo/SysDictDataVo.java new file mode 100644 index 0000000..cab837f --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/vo/SysDictDataVo.java @@ -0,0 +1,86 @@ +package com.yyy.system.entity.vo; + +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +import com.yyy.system.entity.pojo.SysDictData; +import com.yyy.common.utils.bean.BeanUtils; +import lombok.Data; +import lombok.Builder; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * 字典数据表(SysDictData)视图数据类 + * + * @author Fangy + * @since 2024-09-05 16:51:24 + */ +@ApiModel("SysDictDataVo字典数据表视图数据类") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class SysDictDataVo { + + @ApiModelProperty("字典编码") + private Long dictCode; + + @ApiModelProperty("字典排序") + private Integer dictSort; + + @ApiModelProperty("字典标签") + private String dictLabel; + + @ApiModelProperty("字典键值") + private String dictValue; + + @ApiModelProperty("字典类型") + private String dictType; + + @ApiModelProperty("样式属性(其他样式扩展)") + private String cssClass; + + @ApiModelProperty("表格回显样式") + private String listClass; + + @ApiModelProperty("是否默认(Y是 N否)") + private String isDefault; + + @ApiModelProperty("状态(0正常 1停用)") + private String status; + + @ApiModelProperty("创建者") + @JsonIgnore + private Long createUser; + + @ApiModelProperty("创建时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date createTime; + + @ApiModelProperty("更新者") + @JsonIgnore + private Long updateUser; + + @ApiModelProperty("更新时间") + @JsonIgnore + private Date updateTime; + + @ApiModelProperty("备注") + private String remark; + + public static SysDictDataVo ToVo(SysDictData sysDictData) { + SysDictDataVo sysDictDataVo = new SysDictDataVo(); + BeanUtils.copyProperties(sysDictData, sysDictDataVo); + return sysDictDataVo; + } + + public static List ToVo(List sysDictDatas) { + return sysDictDatas.stream().map(SysDictDataVo::ToVo).collect(Collectors.toList()); + } +} diff --git a/system/src/main/java/com/yyy/system/entity/vo/SysDictTypeVo.java b/system/src/main/java/com/yyy/system/entity/vo/SysDictTypeVo.java new file mode 100644 index 0000000..ce42beb --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/vo/SysDictTypeVo.java @@ -0,0 +1,71 @@ +package com.yyy.system.entity.vo; + +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +import com.yyy.system.entity.pojo.SysDictType; +import com.yyy.common.utils.bean.BeanUtils; +import lombok.Data; +import lombok.Builder; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * 字典类型表(SysDictType)视图数据类 + * + * @author Fangy + * @since 2024-09-05 16:40:30 + */ +@ApiModel("SysDictTypeVo字典类型表视图数据类") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class SysDictTypeVo { + + @ApiModelProperty("字典主键") + private Long dictId; + + @ApiModelProperty("字典名称") + private String dictName; + + @ApiModelProperty("字典类型") + private String dictType; + + @ApiModelProperty("状态(0正常 1停用)") + private String status; + + @ApiModelProperty("创建者") + @JsonIgnore + private Long createUser; + + @ApiModelProperty("创建时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date createTime; + + @ApiModelProperty("更新者") + @JsonIgnore + private Long updateUser; + + @ApiModelProperty("更新时间") + @JsonIgnore + private Date updateTime; + + @ApiModelProperty("备注") + private String remark; + + public static SysDictTypeVo ToVo(SysDictType sysDictType) { + SysDictTypeVo sysDictTypeVo = new SysDictTypeVo(); + BeanUtils.copyProperties(sysDictType, sysDictTypeVo); + return sysDictTypeVo; + } + + public static List ToVo(List sysDictTypes) { + return sysDictTypes.stream().map(SysDictTypeVo::ToVo).collect(Collectors.toList()); + } +} diff --git a/system/src/main/java/com/yyy/system/entity/vo/SysFormLogVo.java b/system/src/main/java/com/yyy/system/entity/vo/SysFormLogVo.java new file mode 100644 index 0000000..385deac --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/vo/SysFormLogVo.java @@ -0,0 +1,67 @@ +package com.yyy.system.entity.vo; + +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +import com.alibaba.fastjson.JSONObject; +import com.yyy.common.form.FieldData; +import com.yyy.system.entity.pojo.SysFormLog; +import com.yyy.common.utils.bean.BeanUtils; +import lombok.Data; +import lombok.Builder; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * 表单记录(SysFormLog)视图数据类 + * + * @author Fangy + * @since 2024-10-17 15:40:07 + */ +@ApiModel("SysFormLogVo表单记录视图数据类") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class SysFormLogVo { + + private Long formLogId; + + @ApiModelProperty("表单模板Id") + private Long formTempId; + + @ApiModelProperty("表单模板名称") + private String formTempName; + + @ApiModelProperty("报表编号") + private String formKey; + + @ApiModelProperty("表单类型(0-默认表单,1-巡检表单,2-保养表单,3-维修表单)") + private Integer formType; + + @ApiModelProperty("报表名称") + private String formName; + + @ApiModelProperty("报表内容(List<>)") + private List _formValue; + + @ApiModelProperty("创建时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date createTime; + + public static SysFormLogVo ToVo(SysFormLog sysFormLog) { + SysFormLogVo sysFormLogVo = new SysFormLogVo(); + BeanUtils.copyProperties(sysFormLog, sysFormLogVo); + List list = JSONObject.parseArray(sysFormLog.getFormValue(), FieldData.class); + sysFormLogVo.set_formValue(list); + return sysFormLogVo; + } + + public static List ToVo(List sysFormLogs) { + return sysFormLogs.stream().map(SysFormLogVo::ToVo).collect(Collectors.toList()); + } +} diff --git a/system/src/main/java/com/yyy/system/entity/vo/SysFormTempVo.java b/system/src/main/java/com/yyy/system/entity/vo/SysFormTempVo.java new file mode 100644 index 0000000..97d1159 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/vo/SysFormTempVo.java @@ -0,0 +1,87 @@ +package com.yyy.system.entity.vo; + +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +import com.alibaba.fastjson.JSONObject; +import com.yyy.common.form.FieldData; +import com.yyy.system.entity.pojo.SysFormTemp; +import com.yyy.common.utils.bean.BeanUtils; +import lombok.Data; +import lombok.Builder; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * 表单文档模板信息管理(SysFormTemp)视图数据类 + * + * @author Fangy + * @since 2024-09-18 11:39:01 + */ +@ApiModel("SysFormTempVo表单文档模板信息管理视图数据类") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class SysFormTempVo { + + private Long formTempId; + + @ApiModelProperty("表单标识(编号)") + private String formKey; + + @ApiModelProperty("表单类型(0-默认表单,1-巡检表单,2-保养表单,3-维修表单)") + private Integer formType; + + @ApiModelProperty("表单名称") + private String formName; + + @ApiModelProperty("表单状态(0-停用 ,1-启用)") + private Integer formStatus; + + @ApiModelProperty("表单内容(List<>)") + private List _formValue; + + @ApiModelProperty("扩展字段的数量(项目数量)") + private Integer count; + + @ApiModelProperty("表单模板地址") + private String templatePath; + + @ApiModelProperty("创建人") + @JsonIgnore + private Long createUser; + + @ApiModelProperty("创建人") + private String createUserName; + + @ApiModelProperty("创建时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date createTime; + + @ApiModelProperty("修改人") + @JsonIgnore + private Long updateUser; + + @ApiModelProperty("修改时间") + @JsonIgnore + private Date updateTime; + + public static SysFormTempVo ToVo(SysFormTemp sysFormTemp) { + SysFormTempVo sysFormTempVo = new SysFormTempVo(); + BeanUtils.copyProperties(sysFormTemp, sysFormTempVo); + List list = JSONObject.parseArray(sysFormTemp.getFormValue(), FieldData.class); + sysFormTempVo.set_formValue(list); + sysFormTempVo.setCount(list.size()); + return sysFormTempVo; + } + + public static List ToVo(List sysFormTemps) { + return sysFormTemps.stream().map(SysFormTempVo::ToVo).collect(Collectors.toList()); + } +} diff --git a/system/src/main/java/com/yyy/system/entity/vo/SysLogVo.java b/system/src/main/java/com/yyy/system/entity/vo/SysLogVo.java new file mode 100644 index 0000000..53ec485 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/vo/SysLogVo.java @@ -0,0 +1,53 @@ +package com.yyy.system.entity.vo; + +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +import com.yyy.system.entity.pojo.SysLog; +import com.yyy.common.utils.bean.BeanUtils; +import lombok.Data; +import lombok.Builder; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * 系统日志信息表(SysLog)视图数据类 + * + * @author Fangy + * @since 2024-09-24 15:57:56 + */ +@ApiModel("SysLogVo系统日志信息表视图数据类") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class SysLogVo { + + @ApiModelProperty("日志ID") + private Long logId; + + @ApiModelProperty("日志类型") + private String logType; + + @ApiModelProperty("日志内容") + private String logContent; + + @ApiModelProperty("创建时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date createTime; + + public static SysLogVo ToVo(SysLog sysLog) { + SysLogVo sysLogVo = new SysLogVo(); + BeanUtils.copyProperties(sysLog, sysLogVo); + return sysLogVo; + } + + public static List ToVo(List sysLogs) { + return sysLogs.stream().map(SysLogVo::ToVo).collect(Collectors.toList()); + } +} diff --git a/system/src/main/java/com/yyy/system/entity/vo/WorkReportData.java b/system/src/main/java/com/yyy/system/entity/vo/WorkReportData.java new file mode 100644 index 0000000..11dd216 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/vo/WorkReportData.java @@ -0,0 +1,40 @@ +package com.yyy.system.entity.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; + +@ApiModel("工作报表 -详情") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class WorkReportData { + + @ApiModelProperty("任务类型 key") + private String formKey; + + @ApiModelProperty("任务类型 名称") + private String taskTypeName; + + @ApiModelProperty(value = "任务名称") + private String taskName; + + @ApiModelProperty(value = "设备总数") + private Integer deviceTotal; + + @ApiModelProperty(value = "设备完成数") + private Integer deviceComplete; + + @ApiModelProperty(value = "状态 同流程状态") + private Integer status; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; +} diff --git a/system/src/main/java/com/yyy/system/entity/vo/WorkReportItem.java b/system/src/main/java/com/yyy/system/entity/vo/WorkReportItem.java new file mode 100644 index 0000000..650db3b --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/vo/WorkReportItem.java @@ -0,0 +1,34 @@ +package com.yyy.system.entity.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@ApiModel("工作报表 -详情") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class WorkReportItem { + + @ApiModelProperty("任务类型 key") + private String formKey; + + @ApiModelProperty("任务类型 名称") + private String taskTypeName; + + @ApiModelProperty(value = "任务总数") + private String taskTotal; + + @ApiModelProperty(value = "任务完成数") + private String taskComplete; + + @ApiModelProperty(value = "设备完成数") + private Integer deviceComplete; + + @ApiModelProperty(value = "设备未完成数") + private Integer deviceUncompleted; +} diff --git a/system/src/main/java/com/yyy/system/entity/vo/WorkReportVo.java b/system/src/main/java/com/yyy/system/entity/vo/WorkReportVo.java new file mode 100644 index 0000000..98afbaa --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/vo/WorkReportVo.java @@ -0,0 +1,41 @@ +package com.yyy.system.entity.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.yyy.common.enums.WorkReportTypeEnum; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; +import java.util.List; + +@ApiModel("工作报表") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class WorkReportVo { + + @ApiModelProperty("账号名") + private String userName; + + @ApiModelProperty(value = "时段 (日 周 月 年)") + private WorkReportTypeEnum reportType; + + @ApiModelProperty("组织名称") + private String organizationName;; + + @ApiModelProperty(value = "开始日期 yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + private Date startDate; + + @ApiModelProperty(value = "结束日期 yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + private Date endDate; + + @ApiModelProperty("原始数据列表") + List taskList; +} diff --git a/system/src/main/java/com/yyy/system/entity/word/enums/SanitaryConditionEnum.java b/system/src/main/java/com/yyy/system/entity/word/enums/SanitaryConditionEnum.java new file mode 100644 index 0000000..3b085b9 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/word/enums/SanitaryConditionEnum.java @@ -0,0 +1,35 @@ +package com.yyy.system.entity.word.enums; + + +import java.util.HashMap; +import java.util.Map; + +public enum SanitaryConditionEnum { + EXCELLENT("excellent", "优"), + GOOD("good", "良"), + FAIR("fair", "可"), + POOR("poor", "差"); + + private String key; + private String info; + + // Constructor needs to match the enum constants definition + SanitaryConditionEnum(String key, String info) { + this.key = key; + this.info = info; + } + + public String getKey() { + return key; + } + + public String getInfo() { + return info; + } + + public static Map getData(SanitaryConditionEnum e){ + return new HashMap(){{ + put(e.getKey(),"√"); + }}; + } +} diff --git a/system/src/main/java/com/yyy/system/entity/word/form/RepairForm.java b/system/src/main/java/com/yyy/system/entity/word/form/RepairForm.java new file mode 100644 index 0000000..61b513a --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/word/form/RepairForm.java @@ -0,0 +1,45 @@ +package com.yyy.system.entity.word.form; + +import com.yyy.common.annotation.word.WordExport; +import com.yyy.common.enums.WordContentTypeEnum; +import com.yyy.common.enums.WordPluginsTypeEnum; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class RepairForm { + @WordExport(key = "businessId", name = "编号") + private String businessId; + + @WordExport(key = "formName", name = "表单名称") + private String formName; + + @WordExport(key = "deviceName", name = "设备名称") + private String deviceName; + + @WordExport(key = "position", name = "安装地点") + private String position; + + @WordExport(key = "model", name = "型号规格") + private String model; + + @WordExport(key = "sn", name = "设备编号") + private String sn; + + @WordExport(key = "replacementParts", name = "更换零部件", content_type = WordContentTypeEnum.LoopRowTable, plugin_type = WordPluginsTypeEnum.LoopRowTable) + private List replacementParts; + + @WordExport(key = "sanitaryCondition", name = "工作后卫生情况", content_type = WordContentTypeEnum.SECTION) + private Map sanitaryCondition = new HashMap<>(); + + private String templatePath; +} diff --git a/system/src/main/java/com/yyy/system/entity/word/form/ReplacementParts.java b/system/src/main/java/com/yyy/system/entity/word/form/ReplacementParts.java new file mode 100644 index 0000000..b903072 --- /dev/null +++ b/system/src/main/java/com/yyy/system/entity/word/form/ReplacementParts.java @@ -0,0 +1,16 @@ +package com.yyy.system.entity.word.form; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class ReplacementParts { + private String replacementPartName; + private String replacementPartModel; + private int count; +} diff --git a/system/src/main/java/com/yyy/system/mapper/EamAssetLogMapper.java b/system/src/main/java/com/yyy/system/mapper/EamAssetLogMapper.java new file mode 100644 index 0000000..3bf2c92 --- /dev/null +++ b/system/src/main/java/com/yyy/system/mapper/EamAssetLogMapper.java @@ -0,0 +1,18 @@ +package com.yyy.system.mapper; + +import org.springframework.stereotype.Repository; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yyy.system.entity.pojo.EamAssetLog; + +import java.util.List; + +/** + * 资产操作日志(EamAssetLog)表数据库访问层 + * + * @author Fangy + * @date 2024-04-09 10:23:38 + */ +@Repository +public interface EamAssetLogMapper extends BaseMapper { + List query(EamAssetLog eamAssetLog); +} diff --git a/system/src/main/java/com/yyy/system/mapper/EamAssetMapper.java b/system/src/main/java/com/yyy/system/mapper/EamAssetMapper.java new file mode 100644 index 0000000..7aff608 --- /dev/null +++ b/system/src/main/java/com/yyy/system/mapper/EamAssetMapper.java @@ -0,0 +1,34 @@ +package com.yyy.system.mapper; + +import com.yyy.system.entity.dto.EamSparePartsDto; +import com.yyy.system.entity.pojo.EamWarehouseInventory; +import org.springframework.stereotype.Repository; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yyy.system.entity.pojo.EamAsset; + +import java.util.List; + +/** + * 资产信息表(EamAsset)表数据库访问层 + * + * @author Fangy + * @date 2024-04-09 13:47:48 + */ +@Repository +public interface EamAssetMapper extends BaseMapper { + List query(EamAsset eamAsset); + + int count(EamAsset eamAsset); + + EamAsset joinById(Long id); + + List joinByIds(List list); + + List maintenance(String time); + + void sparePartsAdd(EamSparePartsDto eamSparePartsDto); + + List sparePartsList(Long assetId); + + void sparePartsDel(EamSparePartsDto eamSparePartsDto); +} diff --git a/system/src/main/java/com/yyy/system/mapper/EamBasicCategoryMapper.java b/system/src/main/java/com/yyy/system/mapper/EamBasicCategoryMapper.java new file mode 100644 index 0000000..a422def --- /dev/null +++ b/system/src/main/java/com/yyy/system/mapper/EamBasicCategoryMapper.java @@ -0,0 +1,16 @@ +package com.yyy.system.mapper; +import org.springframework.stereotype.Repository; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yyy.system.entity.pojo.EamBasicCategory; + +import java.util.List; + +/** + * 资产分类信息表(EamBasicCategory)表数据库访问层 + * @author Fangy + * @date 2024-04-08 14:22:31 + */ +@Repository +public interface EamBasicCategoryMapper extends BaseMapper { + List query(EamBasicCategory eamBasicCategory); +} diff --git a/system/src/main/java/com/yyy/system/mapper/EamBasicFinancialCategoryMapper.java b/system/src/main/java/com/yyy/system/mapper/EamBasicFinancialCategoryMapper.java new file mode 100644 index 0000000..b5b6bd0 --- /dev/null +++ b/system/src/main/java/com/yyy/system/mapper/EamBasicFinancialCategoryMapper.java @@ -0,0 +1,15 @@ +package com.yyy.system.mapper; +import org.springframework.stereotype.Repository; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yyy.system.entity.pojo.EamBasicFinancialCategory; +import java.util.List; + +/** + * 财务分类信息表(EamBasicFinancialCategory)表数据库访问层 + * @author Fangy + * @date 2024-05-11 14:38:13 + */ +@Repository +public interface EamBasicFinancialCategoryMapper extends BaseMapper { + List query(EamBasicFinancialCategory eamBasicFinancialCategory); +} diff --git a/system/src/main/java/com/yyy/system/mapper/EamBasicMaintenanceVendorMapper.java b/system/src/main/java/com/yyy/system/mapper/EamBasicMaintenanceVendorMapper.java new file mode 100644 index 0000000..a2249a0 --- /dev/null +++ b/system/src/main/java/com/yyy/system/mapper/EamBasicMaintenanceVendorMapper.java @@ -0,0 +1,15 @@ +package com.yyy.system.mapper; +import org.springframework.stereotype.Repository; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yyy.system.entity.pojo.EamBasicMaintenanceVendor; +import java.util.List; + +/** + * 维保商(EamBasicMaintenanceVendor)表数据库访问层 + * @author Fangy + * @date 2024-04-09 12:52:28 + */ +@Repository +public interface EamBasicMaintenanceVendorMapper extends BaseMapper { + List query(EamBasicMaintenanceVendor eamBasicMaintenanceVendor); +} diff --git a/system/src/main/java/com/yyy/system/mapper/EamBasicManufacturersVendorMapper.java b/system/src/main/java/com/yyy/system/mapper/EamBasicManufacturersVendorMapper.java new file mode 100644 index 0000000..314a1d2 --- /dev/null +++ b/system/src/main/java/com/yyy/system/mapper/EamBasicManufacturersVendorMapper.java @@ -0,0 +1,18 @@ +package com.yyy.system.mapper; + +import org.springframework.stereotype.Repository; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yyy.system.entity.pojo.EamBasicManufacturersVendor; + +import java.util.List; + +/** + * 生产商(EamBasicManufacturersVendor)表数据库访问层 + * + * @author Fangy + * @date 2024-04-09 12:45:34 + */ +@Repository +public interface EamBasicManufacturersVendorMapper extends BaseMapper { + List query(EamBasicManufacturersVendor eamBasicManufacturersVendor); +} diff --git a/system/src/main/java/com/yyy/system/mapper/EamBasicPositionMapper.java b/system/src/main/java/com/yyy/system/mapper/EamBasicPositionMapper.java new file mode 100644 index 0000000..20db6aa --- /dev/null +++ b/system/src/main/java/com/yyy/system/mapper/EamBasicPositionMapper.java @@ -0,0 +1,15 @@ +package com.yyy.system.mapper; +import org.springframework.stereotype.Repository; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yyy.system.entity.pojo.EamBasicPosition; +import java.util.List; + +/** + * 存放位置信息表(EamBasicPosition)表数据库访问层 + * @author Fangy + * @date 2024-04-09 12:52:28 + */ +@Repository +public interface EamBasicPositionMapper extends BaseMapper { + List query(EamBasicPosition eamBasicPosition); +} diff --git a/system/src/main/java/com/yyy/system/mapper/EamBasicSupplierVendorMapper.java b/system/src/main/java/com/yyy/system/mapper/EamBasicSupplierVendorMapper.java new file mode 100644 index 0000000..6d5b387 --- /dev/null +++ b/system/src/main/java/com/yyy/system/mapper/EamBasicSupplierVendorMapper.java @@ -0,0 +1,15 @@ +package com.yyy.system.mapper; +import org.springframework.stereotype.Repository; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yyy.system.entity.pojo.EamBasicSupplierVendor; +import java.util.List; + +/** + * 供应商(EamBasicSupplierVendor)表数据库访问层 + * @author Fangy + * @date 2024-04-09 10:56:09 + */ +@Repository +public interface EamBasicSupplierVendorMapper extends BaseMapper { + List query(EamBasicSupplierVendor eamBasicSupplierVendor); +} diff --git a/system/src/main/java/com/yyy/system/mapper/EamBasicTeamMapper.java b/system/src/main/java/com/yyy/system/mapper/EamBasicTeamMapper.java new file mode 100644 index 0000000..6fe7868 --- /dev/null +++ b/system/src/main/java/com/yyy/system/mapper/EamBasicTeamMapper.java @@ -0,0 +1,15 @@ +package com.yyy.system.mapper; +import org.springframework.stereotype.Repository; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yyy.system.entity.pojo.EamBasicTeam; +import java.util.List; + +/** + * 班组信息管理(EamBasicTeam)表数据库访问层 + * @author Fangy + * @date 2024-09-18 14:57:08 + */ +@Repository +public interface EamBasicTeamMapper extends BaseMapper { + List query(EamBasicTeam eamBasicTeam); +} diff --git a/system/src/main/java/com/yyy/system/mapper/EamBasicWarehouseMapper.java b/system/src/main/java/com/yyy/system/mapper/EamBasicWarehouseMapper.java new file mode 100644 index 0000000..a1794ef --- /dev/null +++ b/system/src/main/java/com/yyy/system/mapper/EamBasicWarehouseMapper.java @@ -0,0 +1,15 @@ +package com.yyy.system.mapper; +import org.springframework.stereotype.Repository; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yyy.system.entity.pojo.EamBasicWarehouse; +import java.util.List; + +/** + * 仓库信息表(EamBasicWarehouse)表数据库访问层 + * @author Fangy + * @date 2024-04-09 13:16:57 + */ +@Repository +public interface EamBasicWarehouseMapper extends BaseMapper { + List query(EamBasicWarehouse eamBasicWarehouse); +} diff --git a/system/src/main/java/com/yyy/system/mapper/EamBusinessAllocateMapper.java b/system/src/main/java/com/yyy/system/mapper/EamBusinessAllocateMapper.java new file mode 100644 index 0000000..e5ac5ec --- /dev/null +++ b/system/src/main/java/com/yyy/system/mapper/EamBusinessAllocateMapper.java @@ -0,0 +1,15 @@ +package com.yyy.system.mapper; +import org.springframework.stereotype.Repository; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yyy.system.entity.pojo.EamBusinessAllocate; +import java.util.List; + +/** + * 调拨信息表(EamBusinessAllocate)表数据库访问层 + * @author Fangy + * @date 2024-04-11 16:16:12 + */ +@Repository +public interface EamBusinessAllocateMapper extends BaseMapper { + List query(EamBusinessAllocate eamBusinessAllocate); +} diff --git a/system/src/main/java/com/yyy/system/mapper/EamBusinessBorrowMapper.java b/system/src/main/java/com/yyy/system/mapper/EamBusinessBorrowMapper.java new file mode 100644 index 0000000..f31c9f7 --- /dev/null +++ b/system/src/main/java/com/yyy/system/mapper/EamBusinessBorrowMapper.java @@ -0,0 +1,15 @@ +package com.yyy.system.mapper; +import org.springframework.stereotype.Repository; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yyy.system.entity.pojo.EamBusinessBorrow; +import java.util.List; + +/** + * 借用信息表(EamBusinessBorrow)表数据库访问层 + * @author Fangy + * @date 2024-04-10 17:26:36 + */ +@Repository +public interface EamBusinessBorrowMapper extends BaseMapper { + List query(EamBusinessBorrow eamBusinessBorrow); +} diff --git a/system/src/main/java/com/yyy/system/mapper/EamBusinessCollectionMapper.java b/system/src/main/java/com/yyy/system/mapper/EamBusinessCollectionMapper.java new file mode 100644 index 0000000..3fca44d --- /dev/null +++ b/system/src/main/java/com/yyy/system/mapper/EamBusinessCollectionMapper.java @@ -0,0 +1,15 @@ +package com.yyy.system.mapper; +import org.springframework.stereotype.Repository; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yyy.system.entity.pojo.EamBusinessCollection; +import java.util.List; + +/** + * 资产领用信息表(EamBusinessCollection)表数据库访问层 + * @author Fangy + * @date 2024-04-12 11:48:06 + */ +@Repository +public interface EamBusinessCollectionMapper extends BaseMapper { + List query(EamBusinessCollection eamBusinessCollection); +} diff --git a/system/src/main/java/com/yyy/system/mapper/EamBusinessOutboundMapper.java b/system/src/main/java/com/yyy/system/mapper/EamBusinessOutboundMapper.java new file mode 100644 index 0000000..e3bf3f9 --- /dev/null +++ b/system/src/main/java/com/yyy/system/mapper/EamBusinessOutboundMapper.java @@ -0,0 +1,15 @@ +package com.yyy.system.mapper; +import org.springframework.stereotype.Repository; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yyy.system.entity.pojo.EamBusinessOutbound; +import java.util.List; + +/** + * 出库信息表(EamBusinessOutbound)表数据库访问层 + * @author Fangy + * @date 2024-04-10 17:26:36 + */ +@Repository +public interface EamBusinessOutboundMapper extends BaseMapper { + List query(EamBusinessOutbound eamBusinessOutbound); +} diff --git a/system/src/main/java/com/yyy/system/mapper/EamBusinessRegistrationMapper.java b/system/src/main/java/com/yyy/system/mapper/EamBusinessRegistrationMapper.java new file mode 100644 index 0000000..36d0ee8 --- /dev/null +++ b/system/src/main/java/com/yyy/system/mapper/EamBusinessRegistrationMapper.java @@ -0,0 +1,15 @@ +package com.yyy.system.mapper; +import org.springframework.stereotype.Repository; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yyy.system.entity.pojo.EamBusinessRegistration; +import java.util.List; + +/** + * 资产登记信息表(EamBusinessRegistration)表数据库访问层 + * @author Fangy + * @date 2024-04-10 13:17:45 + */ +@Repository +public interface EamBusinessRegistrationMapper extends BaseMapper { + List query(EamBusinessRegistration eamBusinessRegistration); +} diff --git a/system/src/main/java/com/yyy/system/mapper/EamBusinessRetirementMapper.java b/system/src/main/java/com/yyy/system/mapper/EamBusinessRetirementMapper.java new file mode 100644 index 0000000..fe4f3e1 --- /dev/null +++ b/system/src/main/java/com/yyy/system/mapper/EamBusinessRetirementMapper.java @@ -0,0 +1,15 @@ +package com.yyy.system.mapper; +import org.springframework.stereotype.Repository; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yyy.system.entity.pojo.EamBusinessRetirement; +import java.util.List; + +/** + * 资产报废(EamBusinessRetirement)表数据库访问层 + * @author Fangy + * @date 2024-05-10 10:37:08 + */ +@Repository +public interface EamBusinessRetirementMapper extends BaseMapper { + List query(EamBusinessRetirement eamBusinessRetirement); +} diff --git a/system/src/main/java/com/yyy/system/mapper/EamBusinessReturnInventoryMapper.java b/system/src/main/java/com/yyy/system/mapper/EamBusinessReturnInventoryMapper.java new file mode 100644 index 0000000..005c9a2 --- /dev/null +++ b/system/src/main/java/com/yyy/system/mapper/EamBusinessReturnInventoryMapper.java @@ -0,0 +1,15 @@ +package com.yyy.system.mapper; +import org.springframework.stereotype.Repository; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yyy.system.entity.pojo.EamBusinessReturnInventory; +import java.util.List; + +/** + * 退库信息表(EamBusinessReturnInventory)表数据库访问层 + * @author Fangy + * @date 2024-04-12 11:10:54 + */ +@Repository +public interface EamBusinessReturnInventoryMapper extends BaseMapper { + List query(EamBusinessReturnInventory eamBusinessReturnInventory); +} diff --git a/system/src/main/java/com/yyy/system/mapper/EamBusinessReturnMapper.java b/system/src/main/java/com/yyy/system/mapper/EamBusinessReturnMapper.java new file mode 100644 index 0000000..d3ebbf4 --- /dev/null +++ b/system/src/main/java/com/yyy/system/mapper/EamBusinessReturnMapper.java @@ -0,0 +1,15 @@ +package com.yyy.system.mapper; +import org.springframework.stereotype.Repository; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yyy.system.entity.pojo.EamBusinessReturn; +import java.util.List; + +/** + * 归还信息表(EamBusinessReturn)表数据库访问层 + * @author Fangy + * @date 2024-04-10 17:26:46 + */ +@Repository +public interface EamBusinessReturnMapper extends BaseMapper { + List query(EamBusinessReturn eamBusinessReturn); +} diff --git a/system/src/main/java/com/yyy/system/mapper/EamBusinessStorageMapper.java b/system/src/main/java/com/yyy/system/mapper/EamBusinessStorageMapper.java new file mode 100644 index 0000000..dc51f13 --- /dev/null +++ b/system/src/main/java/com/yyy/system/mapper/EamBusinessStorageMapper.java @@ -0,0 +1,15 @@ +package com.yyy.system.mapper; +import org.springframework.stereotype.Repository; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yyy.system.entity.pojo.EamBusinessStorage; +import java.util.List; + +/** + * 入库信息表(EamBusinessStorage)表数据库访问层 + * @author Fangy + * @date 2024-04-10 17:26:46 + */ +@Repository +public interface EamBusinessStorageMapper extends BaseMapper { + List query(EamBusinessStorage eamBusinessStorage); +} diff --git a/system/src/main/java/com/yyy/system/mapper/EamBusinessTransferMapper.java b/system/src/main/java/com/yyy/system/mapper/EamBusinessTransferMapper.java new file mode 100644 index 0000000..96d0a62 --- /dev/null +++ b/system/src/main/java/com/yyy/system/mapper/EamBusinessTransferMapper.java @@ -0,0 +1,15 @@ +package com.yyy.system.mapper; +import org.springframework.stereotype.Repository; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yyy.system.entity.pojo.EamBusinessTransfer; +import java.util.List; + +/** + * 资产转移信息表(EamBusinessTransfer)表数据库访问层 + * @author Fangy + * @date 2024-04-10 17:26:46 + */ +@Repository +public interface EamBusinessTransferMapper extends BaseMapper { + List query(EamBusinessTransfer eamBusinessTransfer); +} diff --git a/system/src/main/java/com/yyy/system/mapper/EamRepairFaultMapper.java b/system/src/main/java/com/yyy/system/mapper/EamRepairFaultMapper.java new file mode 100644 index 0000000..b64d6b3 --- /dev/null +++ b/system/src/main/java/com/yyy/system/mapper/EamRepairFaultMapper.java @@ -0,0 +1,15 @@ +package com.yyy.system.mapper; +import org.springframework.stereotype.Repository; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yyy.system.entity.pojo.EamRepairFault; +import java.util.List; + +/** + * 故障信息表(EamRepairFault)表数据库访问层 + * @author Fangy + * @date 2024-04-12 15:41:29 + */ +@Repository +public interface EamRepairFaultMapper extends BaseMapper { + List query(EamRepairFault eamRepairFault); +} diff --git a/system/src/main/java/com/yyy/system/mapper/EamRepairMapper.java b/system/src/main/java/com/yyy/system/mapper/EamRepairMapper.java new file mode 100644 index 0000000..cc8c3bd --- /dev/null +++ b/system/src/main/java/com/yyy/system/mapper/EamRepairMapper.java @@ -0,0 +1,15 @@ +package com.yyy.system.mapper; +import org.springframework.stereotype.Repository; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yyy.system.entity.pojo.EamRepair; +import java.util.List; + +/** + * 维修登记信息表(EamRepair)表数据库访问层 + * @author Fangy + * @date 2024-04-12 15:00:37 + */ +@Repository +public interface EamRepairMapper extends BaseMapper { + List query(EamRepair eamRepair); +} diff --git a/system/src/main/java/com/yyy/system/mapper/EamRepairTypeMapper.java b/system/src/main/java/com/yyy/system/mapper/EamRepairTypeMapper.java new file mode 100644 index 0000000..ec62e0b --- /dev/null +++ b/system/src/main/java/com/yyy/system/mapper/EamRepairTypeMapper.java @@ -0,0 +1,15 @@ +package com.yyy.system.mapper; +import org.springframework.stereotype.Repository; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yyy.system.entity.pojo.EamRepairType; +import java.util.List; + +/** + * 保养计划(维修类型)表(EamRepairType)表数据库访问层 + * @author Fangy + * @date 2024-04-12 15:00:38 + */ +@Repository +public interface EamRepairTypeMapper extends BaseMapper { + List query(EamRepairType eamRepairType); +} diff --git a/system/src/main/java/com/yyy/system/mapper/EamStocktakingDetailsMapper.java b/system/src/main/java/com/yyy/system/mapper/EamStocktakingDetailsMapper.java new file mode 100644 index 0000000..dec2b55 --- /dev/null +++ b/system/src/main/java/com/yyy/system/mapper/EamStocktakingDetailsMapper.java @@ -0,0 +1,15 @@ +package com.yyy.system.mapper; +import org.springframework.stereotype.Repository; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yyy.system.entity.pojo.EamStocktakingDetails; +import java.util.List; + +/** + * 盘点明细(EamStocktakingDetails)表数据库访问层 + * @author Fangy + * @date 2024-04-12 14:50:46 + */ +@Repository +public interface EamStocktakingDetailsMapper extends BaseMapper { + List query(EamStocktakingDetails eamStocktakingDetails); +} diff --git a/system/src/main/java/com/yyy/system/mapper/EamStocktakingJobMapper.java b/system/src/main/java/com/yyy/system/mapper/EamStocktakingJobMapper.java new file mode 100644 index 0000000..63b2734 --- /dev/null +++ b/system/src/main/java/com/yyy/system/mapper/EamStocktakingJobMapper.java @@ -0,0 +1,15 @@ +package com.yyy.system.mapper; +import org.springframework.stereotype.Repository; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yyy.system.entity.pojo.EamStocktakingJob; +import java.util.List; + +/** + * 盘点任务表(EamStocktakingJob)表数据库访问层 + * @author Fangy + * @date 2024-04-12 14:50:46 + */ +@Repository +public interface EamStocktakingJobMapper extends BaseMapper { + List query(EamStocktakingJob eamStocktakingJob); +} diff --git a/system/src/main/java/com/yyy/system/mapper/EamStocktakingPlanMapper.java b/system/src/main/java/com/yyy/system/mapper/EamStocktakingPlanMapper.java new file mode 100644 index 0000000..fbc1738 --- /dev/null +++ b/system/src/main/java/com/yyy/system/mapper/EamStocktakingPlanMapper.java @@ -0,0 +1,15 @@ +package com.yyy.system.mapper; +import org.springframework.stereotype.Repository; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yyy.system.entity.pojo.EamStocktakingPlan; +import java.util.List; + +/** + * 盘点计划信息(EamStocktakingPlan)表数据库访问层 + * @author Fangy + * @date 2024-04-12 14:50:46 + */ +@Repository +public interface EamStocktakingPlanMapper extends BaseMapper { + List query(EamStocktakingPlan eamStocktakingPlan); +} diff --git a/system/src/main/java/com/yyy/system/mapper/EamWarehouseAssetMapper.java b/system/src/main/java/com/yyy/system/mapper/EamWarehouseAssetMapper.java new file mode 100644 index 0000000..79a13fb --- /dev/null +++ b/system/src/main/java/com/yyy/system/mapper/EamWarehouseAssetMapper.java @@ -0,0 +1,19 @@ +package com.yyy.system.mapper; +import org.springframework.stereotype.Repository; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yyy.system.entity.pojo.EamWarehouseAsset; +import java.util.List; + +/** + * 库存信息表(EamWarehouseAsset)表数据库访问层 + * @author Fangy + * @date 2024-05-08 14:00:19 + */ +@Repository +public interface EamWarehouseAssetMapper extends BaseMapper { + List query(EamWarehouseAsset eamWarehouseAsset); + + void storage(EamWarehouseAsset eamWarehouseAsset); + + void outbound(EamWarehouseAsset eamWarehouseAsset); +} diff --git a/system/src/main/java/com/yyy/system/mapper/EamWarehouseInventoryMapper.java b/system/src/main/java/com/yyy/system/mapper/EamWarehouseInventoryMapper.java new file mode 100644 index 0000000..d1ab960 --- /dev/null +++ b/system/src/main/java/com/yyy/system/mapper/EamWarehouseInventoryMapper.java @@ -0,0 +1,23 @@ +package com.yyy.system.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yyy.system.entity.dto.EamWarehouseAssetDto; +import com.yyy.system.entity.pojo.EamWarehouseInventory; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * 资产信息表(EamAsset)表数据库访问层 + * + * @author Fangy + * @date 2024-04-09 13:47:48 + */ +@Repository +public interface EamWarehouseInventoryMapper extends BaseMapper { + List query(EamWarehouseInventory eamWarehouseInventory); + + EamWarehouseInventory queryHistory(EamWarehouseAssetDto eamWarehouseAssetDto); + + List queryWarehouseInventoryStorage(EamWarehouseInventory eamWarehouseInventory); +} diff --git a/system/src/main/java/com/yyy/system/mapper/FlFormItemMapper.java b/system/src/main/java/com/yyy/system/mapper/FlFormItemMapper.java new file mode 100644 index 0000000..4207505 --- /dev/null +++ b/system/src/main/java/com/yyy/system/mapper/FlFormItemMapper.java @@ -0,0 +1,15 @@ +package com.yyy.system.mapper; +import org.springframework.stereotype.Repository; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yyy.system.entity.pojo.FlFormItem; +import java.util.List; + +/** + * 流程实例对象(FlFormItem)表数据库访问层 + * @author Fangy + * @date 2024-04-30 11:25:56 + */ +@Repository +public interface FlFormItemMapper extends BaseMapper { + List query(FlFormItem flFormItem); +} diff --git a/system/src/main/java/com/yyy/system/mapper/FlFormMapper.java b/system/src/main/java/com/yyy/system/mapper/FlFormMapper.java new file mode 100644 index 0000000..3be4c49 --- /dev/null +++ b/system/src/main/java/com/yyy/system/mapper/FlFormMapper.java @@ -0,0 +1,15 @@ +package com.yyy.system.mapper; +import org.springframework.stereotype.Repository; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yyy.system.entity.pojo.FlForm; +import java.util.List; + +/** + * 流程表单对象(FlForm)表数据库访问层 + * @author Fangy + * @date 2024-04-24 12:54:51 + */ +@Repository +public interface FlFormMapper extends BaseMapper { + List query(FlForm flForm); +} diff --git a/system/src/main/java/com/yyy/system/mapper/FlListenerMapper.java b/system/src/main/java/com/yyy/system/mapper/FlListenerMapper.java new file mode 100644 index 0000000..0dfd66b --- /dev/null +++ b/system/src/main/java/com/yyy/system/mapper/FlListenerMapper.java @@ -0,0 +1,15 @@ +package com.yyy.system.mapper; +import org.springframework.stereotype.Repository; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yyy.system.entity.pojo.FlListener; +import java.util.List; + +/** + * 流程监听对象(FlListener)表数据库访问层 + * @author Fangy + * @date 2024-04-23 12:22:45 + */ +@Repository +public interface FlListenerMapper extends BaseMapper { + List query(FlListener flListener); +} diff --git a/system/src/main/java/com/yyy/system/mapper/FlowDeployMapper.java b/system/src/main/java/com/yyy/system/mapper/FlowDeployMapper.java new file mode 100644 index 0000000..7d0fe3a --- /dev/null +++ b/system/src/main/java/com/yyy/system/mapper/FlowDeployMapper.java @@ -0,0 +1,29 @@ +package com.yyy.system.mapper; + + +import com.yyy.system.entity.dto.FlowProcDefDto; + +import java.util.List; + +/** + * 流程定义查询 + **/ +public interface FlowDeployMapper { + + /** + * 流程定义列表 + * @param name + * @return + */ + List selectDeployList(String name); + + /** + * 查询流程 + */ + FlowProcDefDto getByDeployId(String deploymentId); + + /** + * 查询流程 + */ + FlowProcDefDto getByPid(String pid); +} diff --git a/system/src/main/java/com/yyy/system/mapper/SysConfigMapper.java b/system/src/main/java/com/yyy/system/mapper/SysConfigMapper.java new file mode 100644 index 0000000..a52a4d9 --- /dev/null +++ b/system/src/main/java/com/yyy/system/mapper/SysConfigMapper.java @@ -0,0 +1,15 @@ +package com.yyy.system.mapper; +import org.springframework.stereotype.Repository; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yyy.system.entity.pojo.SysConfig; +import java.util.List; + +/** + * 参数配置表(SysConfig)表数据库访问层 + * @author Fangy + * @date 2024-11-01 11:41:13 + */ +@Repository +public interface SysConfigMapper extends BaseMapper { + List query(SysConfig sysConfig); +} diff --git a/system/src/main/java/com/yyy/system/mapper/SysDictDataMapper.java b/system/src/main/java/com/yyy/system/mapper/SysDictDataMapper.java new file mode 100644 index 0000000..2e1e379 --- /dev/null +++ b/system/src/main/java/com/yyy/system/mapper/SysDictDataMapper.java @@ -0,0 +1,15 @@ +package com.yyy.system.mapper; +import org.springframework.stereotype.Repository; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yyy.system.entity.pojo.SysDictData; +import java.util.List; + +/** + * 字典数据表(SysDictData)表数据库访问层 + * @author Fangy + * @date 2024-09-05 16:51:24 + */ +@Repository +public interface SysDictDataMapper extends BaseMapper { + List query(SysDictData sysDictData); +} diff --git a/system/src/main/java/com/yyy/system/mapper/SysDictTypeMapper.java b/system/src/main/java/com/yyy/system/mapper/SysDictTypeMapper.java new file mode 100644 index 0000000..1aa8fa1 --- /dev/null +++ b/system/src/main/java/com/yyy/system/mapper/SysDictTypeMapper.java @@ -0,0 +1,15 @@ +package com.yyy.system.mapper; +import org.springframework.stereotype.Repository; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yyy.system.entity.pojo.SysDictType; +import java.util.List; + +/** + * 字典类型表(SysDictType)表数据库访问层 + * @author Fangy + * @date 2024-09-05 16:40:30 + */ +@Repository +public interface SysDictTypeMapper extends BaseMapper { + List query(SysDictType sysDictType); +} diff --git a/system/src/main/java/com/yyy/system/mapper/SysFormLogMapper.java b/system/src/main/java/com/yyy/system/mapper/SysFormLogMapper.java new file mode 100644 index 0000000..eb7688b --- /dev/null +++ b/system/src/main/java/com/yyy/system/mapper/SysFormLogMapper.java @@ -0,0 +1,15 @@ +package com.yyy.system.mapper; +import org.springframework.stereotype.Repository; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yyy.system.entity.pojo.SysFormLog; +import java.util.List; + +/** + * 表单记录(SysFormLog)表数据库访问层 + * @author Fangy + * @date 2024-10-17 15:40:05 + */ +@Repository +public interface SysFormLogMapper extends BaseMapper { + List query(SysFormLog sysFormLog); +} diff --git a/system/src/main/java/com/yyy/system/mapper/SysFormTempMapper.java b/system/src/main/java/com/yyy/system/mapper/SysFormTempMapper.java new file mode 100644 index 0000000..c5053b0 --- /dev/null +++ b/system/src/main/java/com/yyy/system/mapper/SysFormTempMapper.java @@ -0,0 +1,15 @@ +package com.yyy.system.mapper; +import org.springframework.stereotype.Repository; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yyy.system.entity.pojo.SysFormTemp; +import java.util.List; + +/** + * 表单文档模板信息管理(SysFormTemp)表数据库访问层 + * @author Fangy + * @date 2024-09-18 11:38:59 + */ +@Repository +public interface SysFormTempMapper extends BaseMapper { + List query(SysFormTemp sysFormTemp); +} diff --git a/system/src/main/java/com/yyy/system/mapper/SysLogMapper.java b/system/src/main/java/com/yyy/system/mapper/SysLogMapper.java new file mode 100644 index 0000000..22a6b82 --- /dev/null +++ b/system/src/main/java/com/yyy/system/mapper/SysLogMapper.java @@ -0,0 +1,15 @@ +package com.yyy.system.mapper; +import org.springframework.stereotype.Repository; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yyy.system.entity.pojo.SysLog; +import java.util.List; + +/** + * 系统日志信息表(SysLog)表数据库访问层 + * @author Fangy + * @date 2024-09-24 15:57:56 + */ +@Repository +public interface SysLogMapper extends BaseMapper { + List query(SysLog sysLog); +} diff --git a/system/src/main/java/com/yyy/system/mapper/UmsMenuMapper.java b/system/src/main/java/com/yyy/system/mapper/UmsMenuMapper.java new file mode 100644 index 0000000..6e7b614 --- /dev/null +++ b/system/src/main/java/com/yyy/system/mapper/UmsMenuMapper.java @@ -0,0 +1,24 @@ +package com.yyy.system.mapper; +import com.yyy.common.core.domain.entity.UmsMenu; +import org.springframework.stereotype.Repository; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + * 菜单表(UmsMenu)表数据库访问层 + * @author Fangy + * @date 2024-04-02 14:08:06 + */ +@Repository +public interface UmsMenuMapper extends BaseMapper { + /** + * 根据用户ID查询权限 + * + * @param userId 用户ID + * @return 权限列表 + */ + public List selectPermsByUserId(Long userId); + + public List selectPermsByRoleId(Long roleId); +} diff --git a/system/src/main/java/com/yyy/system/mapper/UmsOrganizationMapper.java b/system/src/main/java/com/yyy/system/mapper/UmsOrganizationMapper.java new file mode 100644 index 0000000..fb88bbc --- /dev/null +++ b/system/src/main/java/com/yyy/system/mapper/UmsOrganizationMapper.java @@ -0,0 +1,14 @@ +package com.yyy.system.mapper; +import org.springframework.stereotype.Repository; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yyy.common.core.domain.entity.UmsOrganization; + +/** + * 组织信息表(UmsOrganization)表数据库访问层 + * @author Fangy + * @date 2024-04-03 09:47:07 + */ +@Repository +public interface UmsOrganizationMapper extends BaseMapper { + UmsOrganization getByUid(Long userId); +} diff --git a/system/src/main/java/com/yyy/system/mapper/UmsRoleMapper.java b/system/src/main/java/com/yyy/system/mapper/UmsRoleMapper.java new file mode 100644 index 0000000..d388b66 --- /dev/null +++ b/system/src/main/java/com/yyy/system/mapper/UmsRoleMapper.java @@ -0,0 +1,22 @@ +package com.yyy.system.mapper; +import com.yyy.common.core.domain.entity.UmsRole; +import org.springframework.stereotype.Repository; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + * 角色表(UmsRole)表数据库访问层 + * @author Fangy + * @date 2024-04-02 14:08:04 + */ +@Repository +public interface UmsRoleMapper extends BaseMapper { + /** + * 根据用户ID查询角色 + * + * @param userId 用户ID + * @return 角色列表 + */ + public List selectRolesByUserId(Long userId); +} diff --git a/system/src/main/java/com/yyy/system/mapper/UmsRoleMenuMapper.java b/system/src/main/java/com/yyy/system/mapper/UmsRoleMenuMapper.java new file mode 100644 index 0000000..69e604c --- /dev/null +++ b/system/src/main/java/com/yyy/system/mapper/UmsRoleMenuMapper.java @@ -0,0 +1,15 @@ +package com.yyy.system.mapper; +import org.springframework.stereotype.Repository; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yyy.common.core.domain.entity.UmsRoleMenu; +import java.util.List; + +/** + * 角色权限关联表(UmsRoleMenu)表数据库访问层 + * @author Fangy + * @date 2024-04-12 20:42:25 + */ +@Repository +public interface UmsRoleMenuMapper extends BaseMapper { + List query(UmsRoleMenu umsRoleMenu); +} diff --git a/system/src/main/java/com/yyy/system/mapper/UmsUserMapper.java b/system/src/main/java/com/yyy/system/mapper/UmsUserMapper.java new file mode 100644 index 0000000..d65d6cc --- /dev/null +++ b/system/src/main/java/com/yyy/system/mapper/UmsUserMapper.java @@ -0,0 +1,17 @@ +package com.yyy.system.mapper; +import com.yyy.common.core.domain.dto.UmsUserQueryDto; +import com.yyy.common.core.domain.entity.UmsUser; +import org.springframework.stereotype.Repository; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + * 用户表(UmsUser)表数据库访问层 + * @author Fangy + * @date 2024-04-02 14:08:03 + */ +@Repository +public interface UmsUserMapper extends BaseMapper { + List query(UmsUserQueryDto umsUserQueryDto); +} diff --git a/system/src/main/java/com/yyy/system/mapper/UmsUserOrganizationMapper.java b/system/src/main/java/com/yyy/system/mapper/UmsUserOrganizationMapper.java new file mode 100644 index 0000000..34f7768 --- /dev/null +++ b/system/src/main/java/com/yyy/system/mapper/UmsUserOrganizationMapper.java @@ -0,0 +1,14 @@ +package com.yyy.system.mapper; +import org.springframework.stereotype.Repository; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yyy.common.core.domain.entity.UmsUserOrganization; + +/** + * 组织信息关联表(UmsUserOrganization)表数据库访问层 + * @author Fangy + * @date 2024-04-03 14:51:06 + */ +@Repository +public interface UmsUserOrganizationMapper extends BaseMapper { + +} diff --git a/system/src/main/java/com/yyy/system/mapper/UmsUserRoleMapper.java b/system/src/main/java/com/yyy/system/mapper/UmsUserRoleMapper.java new file mode 100644 index 0000000..92fd57a --- /dev/null +++ b/system/src/main/java/com/yyy/system/mapper/UmsUserRoleMapper.java @@ -0,0 +1,14 @@ +package com.yyy.system.mapper; +import com.yyy.common.core.domain.entity.UmsUserRole; +import org.springframework.stereotype.Repository; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * 用户角色关联表(UmsUserRole)表数据库访问层 + * @author Fangy + * @date 2024-04-03 15:08:07 + */ +@Repository +public interface UmsUserRoleMapper extends BaseMapper { + +} diff --git a/system/src/main/java/com/yyy/system/service/DevicePlanService.java b/system/src/main/java/com/yyy/system/service/DevicePlanService.java new file mode 100644 index 0000000..3871234 --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/DevicePlanService.java @@ -0,0 +1,66 @@ +package com.yyy.system.service; + +import com.yyy.common.core.domain.Result; +import com.yyy.common.exception.job.TaskException; +import com.yyy.system.entity.dto.DevicePlanAddDto; +import com.yyy.system.entity.dto.DevicePlanQueryDto; +import org.quartz.SchedulerException; + +import java.util.List; + +/** + * 计划信息 服务层 + * + */ +public interface DevicePlanService { + /** + * 获取计划任务 + * + * @param dto 查询参数 + * @return 计划集合 + */ + public List selectList(DevicePlanQueryDto dto); + + /** + * 获取计划任务 + * + * @param idList 查询参数 + * @return 计划集合 + */ + public List selectByIds(List idList); + + + /** + * 新增计划任务 + * + * @param dto 调度信息 + * @return 结果 + */ + public Result insert(DevicePlanAddDto dto) throws SchedulerException, TaskException; + + /** + * 修改计划任务 + * + * @param dto 调度信息 + * @return 结果 + */ + public Result update(DevicePlanAddDto dto) throws SchedulerException, TaskException; + + /** + * 删除任务后,所对应的trigger也将被删除 + * + * @param dto 调度信息 + * @return 结果 + */ + public Result delete(DevicePlanAddDto dto) throws SchedulerException; + + /** + * 批量删除调度信息 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public Result deleteByIds(String ids) throws SchedulerException; + + public Result changeStatus(DevicePlanAddDto dto) throws SchedulerException; +} diff --git a/system/src/main/java/com/yyy/system/service/EamAssetLogService.java b/system/src/main/java/com/yyy/system/service/EamAssetLogService.java new file mode 100644 index 0000000..c38e6f3 --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/EamAssetLogService.java @@ -0,0 +1,23 @@ +package com.yyy.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yyy.common.enums.DetectTypeEnum; +import com.yyy.system.entity.pojo.EamAssetLog; +import com.yyy.system.entity.dto.EamAssetLogDto; + +import java.util.List; + +/** + * 资产操作日志(EamAssetLog)表服务接口 + * + * @author Fangy + * @date 2024-04-09 10:23:38 + */ + +public interface EamAssetLogService extends IService { + List query(EamAssetLogDto eamAssetLogDto); + + List queryAsset(EamAssetLogDto eamAssetLogDto); + + boolean add(String businessId, DetectTypeEnum type, String notes, Long assetId, Long createUser); +} diff --git a/system/src/main/java/com/yyy/system/service/EamAssetService.java b/system/src/main/java/com/yyy/system/service/EamAssetService.java new file mode 100644 index 0000000..e348f03 --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/EamAssetService.java @@ -0,0 +1,58 @@ +package com.yyy.system.service; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yyy.system.entity.dto.EamAssetQueryDto; +import com.yyy.system.entity.dto.EamSparePartsDto; +import com.yyy.system.entity.dto.EamWarehouseAssetDto; +import com.yyy.system.entity.dto.EamWarehouseInventoryDto; +import com.yyy.system.entity.excel.EamAssetExcel; +import com.yyy.system.entity.pojo.EamAsset; +import com.yyy.system.entity.pojo.EamStocktakingJob; +import com.yyy.system.entity.pojo.EamWarehouseInventory; +import com.yyy.system.entity.vo.EamBigScreenVo; +import com.yyy.system.entity.vo.EamHomeVo; + +import java.util.List; + +/** + * 资产信息表(EamAsset)表服务接口 + * @author Fangy + * @date 2024-04-09 13:47:49 + */ + +public interface EamAssetService extends IService { + List query(EamAssetQueryDto eamAssetQueryDto); + + int count(EamAssetQueryDto eamAssetQueryDto); + + boolean delete(List ids); + + EamAsset getById(Long id); + + List listByIds(List idList); + + List listBySNList(List SNList); + + Long selectLatestPrimaryKey(); + + List maintenance(String time); + + List stocktaking(EamStocktakingJob stocktakingJob); + + boolean sparePartsAdd(EamSparePartsDto eamSparePartsDto); + + List sparePartsList(Long assetId); + + boolean sparePartsDel(EamSparePartsDto eamSparePartsDto); + + List queryWarehouseInventory(EamWarehouseInventoryDto eamWarehouseInventoryDto); + + List queryWarehouseInventoryByIds(List eamWarehouseAssetDtoList); + + List queryWarehouseInventoryStorage(EamWarehouseInventoryDto eamWarehouseInventoryDto); + + List excelToPojo(List list); + + EamHomeVo homeData(); + + void bigScreenData(EamBigScreenVo vo); +} diff --git a/system/src/main/java/com/yyy/system/service/EamBasicCategoryService.java b/system/src/main/java/com/yyy/system/service/EamBasicCategoryService.java new file mode 100644 index 0000000..a4a25c4 --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/EamBasicCategoryService.java @@ -0,0 +1,18 @@ +package com.yyy.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yyy.system.entity.dto.EamBasicCategoryDto; +import com.yyy.system.entity.pojo.EamBasicCategory; + +import java.util.List; + +/** + * 资产分类信息表(EamBasicCategory)表服务接口 + * + * @author Fangy + * @date 2024-04-08 14:22:31 + */ + +public interface EamBasicCategoryService extends IService { + List query(EamBasicCategoryDto eamBasicCategoryDto); +} diff --git a/system/src/main/java/com/yyy/system/service/EamBasicFinancialCategoryService.java b/system/src/main/java/com/yyy/system/service/EamBasicFinancialCategoryService.java new file mode 100644 index 0000000..235e401 --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/EamBasicFinancialCategoryService.java @@ -0,0 +1,15 @@ +package com.yyy.system.service; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yyy.system.entity.pojo.EamBasicFinancialCategory; +import com.yyy.system.entity.dto.EamBasicFinancialCategoryDto; +import java.util.List; + +/** + * 财务分类信息表(EamBasicFinancialCategory)表服务接口 + * @author Fangy + * @date 2024-05-11 14:38:13 + */ + +public interface EamBasicFinancialCategoryService extends IService { + List query(EamBasicFinancialCategoryDto eamBasicFinancialCategoryDto); +} diff --git a/system/src/main/java/com/yyy/system/service/EamBasicMaintenanceVendorService.java b/system/src/main/java/com/yyy/system/service/EamBasicMaintenanceVendorService.java new file mode 100644 index 0000000..20b3ab4 --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/EamBasicMaintenanceVendorService.java @@ -0,0 +1,15 @@ +package com.yyy.system.service; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yyy.system.entity.pojo.EamBasicMaintenanceVendor; +import com.yyy.system.entity.dto.EamBasicMaintenanceVendorDto; +import java.util.List; + +/** + * 维保商(EamBasicMaintenanceVendor)表服务接口 + * @author Fangy + * @date 2024-04-09 12:52:28 + */ + +public interface EamBasicMaintenanceVendorService extends IService { + List query(EamBasicMaintenanceVendorDto eamBasicMaintenanceVendorDto); +} diff --git a/system/src/main/java/com/yyy/system/service/EamBasicManufacturersVendorService.java b/system/src/main/java/com/yyy/system/service/EamBasicManufacturersVendorService.java new file mode 100644 index 0000000..01d8ccc --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/EamBasicManufacturersVendorService.java @@ -0,0 +1,18 @@ +package com.yyy.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yyy.system.entity.pojo.EamBasicManufacturersVendor; +import com.yyy.system.entity.dto.EamBasicManufacturersVendorDto; + +import java.util.List; + +/** + * 生产商(EamBasicManufacturersVendor)表服务接口 + * + * @author Fangy + * @date 2024-04-09 12:45:34 + */ + +public interface EamBasicManufacturersVendorService extends IService { + List query(EamBasicManufacturersVendorDto eamBasicManufacturersVendorDto); +} diff --git a/system/src/main/java/com/yyy/system/service/EamBasicPositionService.java b/system/src/main/java/com/yyy/system/service/EamBasicPositionService.java new file mode 100644 index 0000000..4ac7eb6 --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/EamBasicPositionService.java @@ -0,0 +1,15 @@ +package com.yyy.system.service; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yyy.system.entity.pojo.EamBasicPosition; +import com.yyy.system.entity.dto.EamBasicPositionDto; +import java.util.List; + +/** + * 存放位置信息表(EamBasicPosition)表服务接口 + * @author Fangy + * @date 2024-04-09 12:52:28 + */ + +public interface EamBasicPositionService extends IService { + List query(EamBasicPositionDto eamBasicPositionDto); +} diff --git a/system/src/main/java/com/yyy/system/service/EamBasicSupplierVendorService.java b/system/src/main/java/com/yyy/system/service/EamBasicSupplierVendorService.java new file mode 100644 index 0000000..0884523 --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/EamBasicSupplierVendorService.java @@ -0,0 +1,15 @@ +package com.yyy.system.service; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yyy.system.entity.pojo.EamBasicSupplierVendor; +import com.yyy.system.entity.dto.EamBasicSupplierVendorDto; +import java.util.List; + +/** + * 供应商(EamBasicSupplierVendor)表服务接口 + * @author Fangy + * @date 2024-04-09 10:56:09 + */ + +public interface EamBasicSupplierVendorService extends IService { + List query(EamBasicSupplierVendorDto eamBasicSupplierVendorDto); +} diff --git a/system/src/main/java/com/yyy/system/service/EamBasicTeamService.java b/system/src/main/java/com/yyy/system/service/EamBasicTeamService.java new file mode 100644 index 0000000..e611340 --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/EamBasicTeamService.java @@ -0,0 +1,15 @@ +package com.yyy.system.service; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yyy.system.entity.pojo.EamBasicTeam; +import com.yyy.system.entity.dto.EamBasicTeamDto; +import java.util.List; + +/** + * 班组信息管理(EamBasicTeam)表服务接口 + * @author Fangy + * @date 2024-09-18 14:57:08 + */ + +public interface EamBasicTeamService extends IService { + List query(EamBasicTeamDto eamBasicTeamDto); +} diff --git a/system/src/main/java/com/yyy/system/service/EamBasicWarehouseService.java b/system/src/main/java/com/yyy/system/service/EamBasicWarehouseService.java new file mode 100644 index 0000000..76e8752 --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/EamBasicWarehouseService.java @@ -0,0 +1,15 @@ +package com.yyy.system.service; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yyy.system.entity.pojo.EamBasicWarehouse; +import com.yyy.system.entity.dto.EamBasicWarehouseDto; +import java.util.List; + +/** + * 仓库信息表(EamBasicWarehouse)表服务接口 + * @author Fangy + * @date 2024-04-09 13:16:58 + */ + +public interface EamBasicWarehouseService extends IService { + List query(EamBasicWarehouseDto eamBasicWarehouseDto); +} diff --git a/system/src/main/java/com/yyy/system/service/EamBusinessAllocateService.java b/system/src/main/java/com/yyy/system/service/EamBusinessAllocateService.java new file mode 100644 index 0000000..011a349 --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/EamBusinessAllocateService.java @@ -0,0 +1,20 @@ +package com.yyy.system.service; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yyy.system.entity.pojo.EamBusinessAllocate; +import com.yyy.system.entity.dto.EamBusinessAllocateDto; +import java.util.List; +import java.util.Map; + +/** + * 调拨信息表(EamBusinessAllocate)表服务接口 + * @author Fangy + * @date 2024-04-11 16:16:13 + */ + +public interface EamBusinessAllocateService extends IService { + List query(EamBusinessAllocateDto eamBusinessAllocateDto); + + EamBusinessAllocate getById(Long id); + + boolean isCompleted(Long id); +} diff --git a/system/src/main/java/com/yyy/system/service/EamBusinessBorrowService.java b/system/src/main/java/com/yyy/system/service/EamBusinessBorrowService.java new file mode 100644 index 0000000..6c72f17 --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/EamBusinessBorrowService.java @@ -0,0 +1,19 @@ +package com.yyy.system.service; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yyy.system.entity.pojo.EamBusinessBorrow; +import com.yyy.system.entity.dto.EamBusinessBorrowDto; +import java.util.List; + +/** + * 借用信息表(EamBusinessBorrow)表服务接口 + * @author Fangy + * @date 2024-04-10 17:26:36 + */ + +public interface EamBusinessBorrowService extends IService { + List query(EamBusinessBorrowDto eamBusinessBorrowDto); + + EamBusinessBorrow getById(Long id); + + boolean isCompleted(Long id); +} diff --git a/system/src/main/java/com/yyy/system/service/EamBusinessCollectionService.java b/system/src/main/java/com/yyy/system/service/EamBusinessCollectionService.java new file mode 100644 index 0000000..486f477 --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/EamBusinessCollectionService.java @@ -0,0 +1,22 @@ +package com.yyy.system.service; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yyy.system.entity.pojo.EamBusinessCollection; +import com.yyy.system.entity.dto.EamBusinessCollectionDto; +import java.util.List; +import java.util.Map; + +/** + * 资产领用信息表(EamBusinessCollection)表服务接口 + * @author Fangy + * @date 2024-04-12 11:48:07 + */ + +public interface EamBusinessCollectionService extends IService { + List query(EamBusinessCollectionDto eamBusinessCollectionDto); + + EamBusinessCollection getById(Long id); + + boolean isCompleted(Long id); + + void formLink(Map variables); +} diff --git a/system/src/main/java/com/yyy/system/service/EamBusinessOutboundService.java b/system/src/main/java/com/yyy/system/service/EamBusinessOutboundService.java new file mode 100644 index 0000000..2fb618b --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/EamBusinessOutboundService.java @@ -0,0 +1,19 @@ +package com.yyy.system.service; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yyy.system.entity.pojo.EamBusinessOutbound; +import com.yyy.system.entity.dto.EamBusinessOutboundDto; +import java.util.List; + +/** + * 出库信息表(EamBusinessOutbound)表服务接口 + * @author Fangy + * @date 2024-04-10 17:26:37 + */ + +public interface EamBusinessOutboundService extends IService { + List query(EamBusinessOutboundDto eamBusinessOutboundDto); + + EamBusinessOutbound getById(Long id); + + boolean isCompleted(Long id); +} diff --git a/system/src/main/java/com/yyy/system/service/EamBusinessRegistrationService.java b/system/src/main/java/com/yyy/system/service/EamBusinessRegistrationService.java new file mode 100644 index 0000000..ae349dd --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/EamBusinessRegistrationService.java @@ -0,0 +1,20 @@ +package com.yyy.system.service; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yyy.common.enums.BusinessStatusEnum; +import com.yyy.system.entity.pojo.EamBusinessRegistration; +import com.yyy.system.entity.dto.EamBusinessRegistrationDto; +import java.util.List; + +/** + * 资产登记信息表(EamBusinessRegistration)表服务接口 + * @author Fangy + * @date 2024-04-10 13:17:47 + */ + +public interface EamBusinessRegistrationService extends IService { + List query(EamBusinessRegistrationDto eamBusinessRegistrationDto); + + List query(List assetIdList); + + boolean update(List idList, BusinessStatusEnum status); +} diff --git a/system/src/main/java/com/yyy/system/service/EamBusinessRetirementService.java b/system/src/main/java/com/yyy/system/service/EamBusinessRetirementService.java new file mode 100644 index 0000000..709f063 --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/EamBusinessRetirementService.java @@ -0,0 +1,22 @@ +package com.yyy.system.service; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yyy.system.entity.pojo.EamBusinessRetirement; +import com.yyy.system.entity.dto.EamBusinessRetirementDto; +import java.util.List; +import java.util.Map; + +/** + * 资产报废(EamBusinessRetirement)表服务接口 + * @author Fangy + * @date 2024-05-10 10:37:08 + */ + +public interface EamBusinessRetirementService extends IService { + List query(EamBusinessRetirementDto eamBusinessRetirementDto); + + EamBusinessRetirement getById(Long id); + + boolean isCompleted(Long id); + + void formLink(Map variables); +} diff --git a/system/src/main/java/com/yyy/system/service/EamBusinessReturnInventoryService.java b/system/src/main/java/com/yyy/system/service/EamBusinessReturnInventoryService.java new file mode 100644 index 0000000..5db9c7d --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/EamBusinessReturnInventoryService.java @@ -0,0 +1,22 @@ +package com.yyy.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yyy.system.entity.pojo.EamBusinessReturnInventory; +import com.yyy.system.entity.dto.EamBusinessReturnInventoryDto; + +import java.util.List; + +/** + * 退库信息表(EamBusinessReturnInventory)表服务接口 + * + * @author Fangy + * @date 2024-04-12 11:10:55 + */ + +public interface EamBusinessReturnInventoryService extends IService { + List query(EamBusinessReturnInventoryDto eamBusinessReturnInventoryDto); + + EamBusinessReturnInventory getById(Long id); + + boolean isCompleted(Long id); +} diff --git a/system/src/main/java/com/yyy/system/service/EamBusinessReturnService.java b/system/src/main/java/com/yyy/system/service/EamBusinessReturnService.java new file mode 100644 index 0000000..066793e --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/EamBusinessReturnService.java @@ -0,0 +1,23 @@ +package com.yyy.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yyy.system.entity.pojo.EamBusinessReturn; +import com.yyy.system.entity.dto.EamBusinessReturnDto; + +import java.util.List; + +/** + * 归还信息表(EamBusinessReturn)表服务接口 + * + * @author Fangy + * @date 2024-04-10 17:26:46 + */ + +public interface EamBusinessReturnService extends IService { + + List query(EamBusinessReturnDto eamBusinessReturnDto); + + EamBusinessReturn getById(Long id); + + boolean isCompleted(Long id); +} diff --git a/system/src/main/java/com/yyy/system/service/EamBusinessService.java b/system/src/main/java/com/yyy/system/service/EamBusinessService.java new file mode 100644 index 0000000..0c12d45 --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/EamBusinessService.java @@ -0,0 +1,19 @@ +package com.yyy.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yyy.system.entity.dto.EamBusinessAllocateDto; +import com.yyy.system.entity.dto.EamBusinessDto; +import com.yyy.system.entity.pojo.EamBusinessAllocate; +import com.yyy.system.entity.vo.EamBusinessVo; + +import java.util.List; + +/** + * 调拨信息表(EamBusinessAllocate)表服务接口 + * @author Fangy + * @date 2024-04-11 16:16:13 + */ + +public interface EamBusinessService { + List query(EamBusinessDto dto); +} diff --git a/system/src/main/java/com/yyy/system/service/EamBusinessStorageService.java b/system/src/main/java/com/yyy/system/service/EamBusinessStorageService.java new file mode 100644 index 0000000..7ff3a2c --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/EamBusinessStorageService.java @@ -0,0 +1,19 @@ +package com.yyy.system.service; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yyy.system.entity.pojo.EamBusinessStorage; +import com.yyy.system.entity.dto.EamBusinessStorageDto; +import java.util.List; + +/** + * 入库信息表(EamBusinessStorage)表服务接口 + * @author Fangy + * @date 2024-04-10 17:26:46 + */ + +public interface EamBusinessStorageService extends IService { + List query(EamBusinessStorageDto eamBusinessStorageDto); + + EamBusinessStorage getById(Long id); + + boolean isCompleted(Long id); +} diff --git a/system/src/main/java/com/yyy/system/service/EamBusinessTransferService.java b/system/src/main/java/com/yyy/system/service/EamBusinessTransferService.java new file mode 100644 index 0000000..2332584 --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/EamBusinessTransferService.java @@ -0,0 +1,22 @@ +package com.yyy.system.service; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yyy.system.entity.pojo.EamBusinessTransfer; +import com.yyy.system.entity.dto.EamBusinessTransferDto; +import java.util.List; +import java.util.Map; + +/** + * 资产转移信息表(EamBusinessTransfer)表服务接口 + * @author Fangy + * @date 2024-04-10 17:26:47 + */ + +public interface EamBusinessTransferService extends IService { + List query(EamBusinessTransferDto eamBusinessTransferDto); + + EamBusinessTransfer getById(Long id); + + boolean isCompleted(Long id); + + void formLink(Map variables); +} diff --git a/system/src/main/java/com/yyy/system/service/EamRepairFaultService.java b/system/src/main/java/com/yyy/system/service/EamRepairFaultService.java new file mode 100644 index 0000000..b300fdf --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/EamRepairFaultService.java @@ -0,0 +1,23 @@ +package com.yyy.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yyy.system.entity.pojo.EamRepairFault; +import com.yyy.system.entity.dto.EamRepairFaultDto; + +import java.util.List; +import java.util.Map; + +/** + * 故障信息表(EamRepairFault)表服务接口 + * + * @author Fangy + * @date 2024-04-12 15:41:31 + */ + +public interface EamRepairFaultService extends IService { + List query(EamRepairFaultDto eamRepairFaultDto); + + boolean isCompleted(Long id); + + void formLink(Map variables); +} diff --git a/system/src/main/java/com/yyy/system/service/EamRepairService.java b/system/src/main/java/com/yyy/system/service/EamRepairService.java new file mode 100644 index 0000000..6baabde --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/EamRepairService.java @@ -0,0 +1,24 @@ +package com.yyy.system.service; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yyy.system.entity.pojo.EamRepair; +import com.yyy.system.entity.dto.EamRepairDto; +import java.util.List; +import java.util.Map; + +/** + * 维修登记信息表(EamRepair)表服务接口 + * @author Fangy + * @date 2024-04-12 15:00:37 + */ + +public interface EamRepairService extends IService { + List query(EamRepairDto eamRepairDto); + + EamRepair getById(Long id); + + List getByAssetId(Long id); + + boolean isCompleted(Long id); + + void formLink(Map variables); +} diff --git a/system/src/main/java/com/yyy/system/service/EamRepairTypeService.java b/system/src/main/java/com/yyy/system/service/EamRepairTypeService.java new file mode 100644 index 0000000..fe46824 --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/EamRepairTypeService.java @@ -0,0 +1,15 @@ +package com.yyy.system.service; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yyy.system.entity.pojo.EamRepairType; +import com.yyy.system.entity.dto.EamRepairTypeDto; +import java.util.List; + +/** + * 保养计划(维修类型)表(EamRepairType)表服务接口 + * @author Fangy + * @date 2024-04-12 15:00:39 + */ + +public interface EamRepairTypeService extends IService { + List query(EamRepairTypeDto eamRepairTypeDto); +} diff --git a/system/src/main/java/com/yyy/system/service/EamStocktakingDetailsService.java b/system/src/main/java/com/yyy/system/service/EamStocktakingDetailsService.java new file mode 100644 index 0000000..c62f9b7 --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/EamStocktakingDetailsService.java @@ -0,0 +1,17 @@ +package com.yyy.system.service; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yyy.system.entity.pojo.EamStocktakingDetails; +import com.yyy.system.entity.dto.EamStocktakingDetailsDto; +import java.util.List; + +/** + * 盘点明细(EamStocktakingDetails)表服务接口 + * @author Fangy + * @date 2024-04-12 14:50:46 + */ + +public interface EamStocktakingDetailsService extends IService { + List query(EamStocktakingDetailsDto eamStocktakingDetailsDto); + + EamStocktakingDetails getById(Long id); +} diff --git a/system/src/main/java/com/yyy/system/service/EamStocktakingJobService.java b/system/src/main/java/com/yyy/system/service/EamStocktakingJobService.java new file mode 100644 index 0000000..e4a8727 --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/EamStocktakingJobService.java @@ -0,0 +1,17 @@ +package com.yyy.system.service; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yyy.system.entity.pojo.EamStocktakingJob; +import com.yyy.system.entity.dto.EamStocktakingJobDto; +import java.util.List; + +/** + * 盘点任务表(EamStocktakingJob)表服务接口 + * @author Fangy + * @date 2024-04-12 14:50:46 + */ + +public interface EamStocktakingJobService extends IService { + List query(EamStocktakingJobDto eamStocktakingJobDto); + + EamStocktakingJob getById(Long id); +} diff --git a/system/src/main/java/com/yyy/system/service/EamStocktakingPlanService.java b/system/src/main/java/com/yyy/system/service/EamStocktakingPlanService.java new file mode 100644 index 0000000..3f485c9 --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/EamStocktakingPlanService.java @@ -0,0 +1,17 @@ +package com.yyy.system.service; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yyy.system.entity.pojo.EamStocktakingPlan; +import com.yyy.system.entity.dto.EamStocktakingPlanDto; +import java.util.List; + +/** + * 盘点计划信息(EamStocktakingPlan)表服务接口 + * @author Fangy + * @date 2024-04-12 14:50:46 + */ + +public interface EamStocktakingPlanService extends IService { + List query(EamStocktakingPlanDto eamStocktakingPlanDto); + + EamStocktakingPlan getById(Long id); +} diff --git a/system/src/main/java/com/yyy/system/service/EamWarehouseAssetService.java b/system/src/main/java/com/yyy/system/service/EamWarehouseAssetService.java new file mode 100644 index 0000000..3db9c82 --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/EamWarehouseAssetService.java @@ -0,0 +1,22 @@ +package com.yyy.system.service; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yyy.system.entity.pojo.EamWarehouseAsset; +import com.yyy.system.entity.dto.EamWarehouseAssetDto; +import java.util.List; +import java.util.Map; + +/** + * 库存信息表(EamWarehouseAsset)表服务接口 + * @author Fangy + * @date 2024-05-08 14:00:19 + */ + +public interface EamWarehouseAssetService extends IService { + List query(EamWarehouseAssetDto eamWarehouseAssetDto); + + boolean add(List list); + + boolean reduceVerify(List list); + + boolean reduce(List list); +} diff --git a/system/src/main/java/com/yyy/system/service/FlFormItemService.java b/system/src/main/java/com/yyy/system/service/FlFormItemService.java new file mode 100644 index 0000000..41a0e36 --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/FlFormItemService.java @@ -0,0 +1,38 @@ +package com.yyy.system.service; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yyy.system.entity.dto.FlFormItemCalendarDto; +import com.yyy.system.entity.dto.WorkReportQueryDto; +import com.yyy.system.entity.pojo.FlFormItem; +import com.yyy.system.entity.dto.FlFormItemDto; +import com.yyy.system.entity.vo.EamBigScreenVo; +import com.yyy.system.entity.vo.WorkReportVo; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.text.ParseException; +import java.util.List; + +/** + * 流程实例对象(FlFormItem)表服务接口 + * @author Fangy + * @date 2024-04-30 11:25:57 + */ + +public interface FlFormItemService extends IService { + List query(FlFormItemDto flFormItemDto); + + boolean update(FlFormItemDto flFormItemDto); + + List calendar(FlFormItemCalendarDto dto) throws ParseException; + + WorkReportVo report(WorkReportQueryDto dto); + + /** + * 富文本转word 加图片处理 + * @param content --- 富文本内容 + * @param fileName --- 文件名称 + */ + void h52word(String content, String fileName, HttpServletRequest request, HttpServletResponse response); + + void bigScreenData(EamBigScreenVo vo); +} diff --git a/system/src/main/java/com/yyy/system/service/FlFormService.java b/system/src/main/java/com/yyy/system/service/FlFormService.java new file mode 100644 index 0000000..3bc2f0f --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/FlFormService.java @@ -0,0 +1,19 @@ +package com.yyy.system.service; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yyy.system.entity.pojo.FlForm; +import com.yyy.system.entity.dto.FlFormDto; +import java.util.List; + +/** + * 流程表单对象(FlForm)表服务接口 + * @author Fangy + * @date 2024-04-23 12:22:45 + */ + +public interface FlFormService extends IService { + List query(FlFormDto flFormDto); + + FlForm selectByDeployId(String deploymentId); + + FlForm selectByKey(String key); +} diff --git a/system/src/main/java/com/yyy/system/service/FlListenerService.java b/system/src/main/java/com/yyy/system/service/FlListenerService.java new file mode 100644 index 0000000..ab96adc --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/FlListenerService.java @@ -0,0 +1,15 @@ +package com.yyy.system.service; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yyy.system.entity.pojo.FlListener; +import com.yyy.system.entity.dto.FlListenerDto; +import java.util.List; + +/** + * 流程监听对象(FlListener)表服务接口 + * @author Fangy + * @date 2024-04-23 12:22:45 + */ + +public interface FlListenerService extends IService { + List query(FlListenerDto flListenerDto); +} diff --git a/system/src/main/java/com/yyy/system/service/SysConfigService.java b/system/src/main/java/com/yyy/system/service/SysConfigService.java new file mode 100644 index 0000000..f8ff468 --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/SysConfigService.java @@ -0,0 +1,15 @@ +package com.yyy.system.service; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yyy.system.entity.pojo.SysConfig; +import com.yyy.system.entity.dto.SysConfigDto; +import java.util.List; + +/** + * 参数配置表(SysConfig)表服务接口 + * @author Fangy + * @date 2024-11-01 11:41:13 + */ + +public interface SysConfigService extends IService { + List query(SysConfigDto sysConfigDto); +} diff --git a/system/src/main/java/com/yyy/system/service/SysDictDataService.java b/system/src/main/java/com/yyy/system/service/SysDictDataService.java new file mode 100644 index 0000000..fce7d40 --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/SysDictDataService.java @@ -0,0 +1,27 @@ +package com.yyy.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yyy.system.entity.pojo.SysDictData; +import com.yyy.system.entity.dto.SysDictDataDto; + +import java.util.List; + +/** + * 字典数据表(SysDictData)表服务接口 + * + * @author Fangy + * @date 2024-09-05 16:51:24 + */ + +public interface SysDictDataService extends IService { + List query(SysDictDataDto sysDictDataDto); + + /** + * 根据字典类型和字典键值查询字典数据信息 + * + * @param dictType 字典类型 + * @param dictValue 字典键值 + * @return 字典标签 + */ + public String selectDictLabel(String dictType, String dictValue); +} diff --git a/system/src/main/java/com/yyy/system/service/SysDictTypeService.java b/system/src/main/java/com/yyy/system/service/SysDictTypeService.java new file mode 100644 index 0000000..35612b5 --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/SysDictTypeService.java @@ -0,0 +1,15 @@ +package com.yyy.system.service; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yyy.system.entity.pojo.SysDictType; +import com.yyy.system.entity.dto.SysDictTypeDto; +import java.util.List; + +/** + * 字典类型表(SysDictType)表服务接口 + * @author Fangy + * @date 2024-09-05 16:40:30 + */ + +public interface SysDictTypeService extends IService { + List query(SysDictTypeDto sysDictTypeDto); +} diff --git a/system/src/main/java/com/yyy/system/service/SysFormLogService.java b/system/src/main/java/com/yyy/system/service/SysFormLogService.java new file mode 100644 index 0000000..1257be3 --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/SysFormLogService.java @@ -0,0 +1,15 @@ +package com.yyy.system.service; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yyy.system.entity.pojo.SysFormLog; +import com.yyy.system.entity.dto.SysFormLogQuarryDto; +import java.util.List; + +/** + * 表单记录(SysFormLog)表服务接口 + * @author Fangy + * @date 2024-10-17 15:40:06 + */ + +public interface SysFormLogService extends IService { + List query(SysFormLogQuarryDto sysFormLogQuarryDto); +} diff --git a/system/src/main/java/com/yyy/system/service/SysFormTempService.java b/system/src/main/java/com/yyy/system/service/SysFormTempService.java new file mode 100644 index 0000000..db1f948 --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/SysFormTempService.java @@ -0,0 +1,15 @@ +package com.yyy.system.service; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yyy.system.entity.pojo.SysFormTemp; +import com.yyy.system.entity.dto.SysFormTempDto; +import java.util.List; + +/** + * 表单文档模板信息管理(SysFormTemp)表服务接口 + * @author Fangy + * @date 2024-09-18 11:39:00 + */ + +public interface SysFormTempService extends IService { + List query(SysFormTempDto sysFormTempDto); +} diff --git a/system/src/main/java/com/yyy/system/service/SysLogService.java b/system/src/main/java/com/yyy/system/service/SysLogService.java new file mode 100644 index 0000000..a4954d5 --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/SysLogService.java @@ -0,0 +1,15 @@ +package com.yyy.system.service; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yyy.system.entity.pojo.SysLog; +import com.yyy.system.entity.dto.SysLogDto; +import java.util.List; + +/** + * 系统日志信息表(SysLog)表服务接口 + * @author Fangy + * @date 2024-09-24 15:57:56 + */ + +public interface SysLogService extends IService { + List query(SysLogDto sysLogDto); +} diff --git a/system/src/main/java/com/yyy/system/service/UmsMenuService.java b/system/src/main/java/com/yyy/system/service/UmsMenuService.java new file mode 100644 index 0000000..4195fe7 --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/UmsMenuService.java @@ -0,0 +1,27 @@ +package com.yyy.system.service; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yyy.common.core.domain.dto.UmsMenuDto; +import com.yyy.common.core.domain.entity.UmsMenu; + +import java.util.List; +import java.util.Set; + +/** + * 菜单表(UmsMenu)表服务接口 + * @author Fangy + * @date 2024-03-25 15:50:12 + */ + +public interface UmsMenuService extends IService { + /** + * 根据用户ID查询权限 + * + * @param userId 用户ID + * @return 权限列表 + */ + Set selectPermsByUserId(Long userId); + + List query(UmsMenuDto umsMenuDto); + + List selectPermsByRoleId(Long roleId); +} diff --git a/system/src/main/java/com/yyy/system/service/UmsOrganizationService.java b/system/src/main/java/com/yyy/system/service/UmsOrganizationService.java new file mode 100644 index 0000000..9a88c65 --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/UmsOrganizationService.java @@ -0,0 +1,13 @@ +package com.yyy.system.service; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yyy.common.core.domain.entity.UmsOrganization; + +/** + * 组织信息表(UmsOrganization)表服务接口 + * @author Fangy + * @date 2024-04-03 09:47:08 + */ + +public interface UmsOrganizationService extends IService { + UmsOrganization getByUid(Long userId); +} diff --git a/system/src/main/java/com/yyy/system/service/UmsRoleMenuService.java b/system/src/main/java/com/yyy/system/service/UmsRoleMenuService.java new file mode 100644 index 0000000..39c2a4c --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/UmsRoleMenuService.java @@ -0,0 +1,12 @@ +package com.yyy.system.service; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yyy.common.core.domain.entity.UmsRoleMenu; + +/** + * 角色权限关联表(UmsRoleMenu)表服务接口 + * @author Fangy + * @date 2024-04-12 20:46:30 + */ + +public interface UmsRoleMenuService extends IService { +} diff --git a/system/src/main/java/com/yyy/system/service/UmsRoleService.java b/system/src/main/java/com/yyy/system/service/UmsRoleService.java new file mode 100644 index 0000000..bd0cb15 --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/UmsRoleService.java @@ -0,0 +1,33 @@ +package com.yyy.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yyy.common.core.domain.dto.UmsRoleDto; +import com.yyy.common.core.domain.entity.UmsRole; + +import java.util.List; +import java.util.Set; + +/** + * 角色表(UmsRole)表服务接口 + * + * @author Fangy + * @date 2024-03-25 15:50:12 + */ + +public interface UmsRoleService extends IService { + /** + * 根据用户ID查询角色列表 + * + * @param userId 用户ID + * @return 权限列表 + */ + Set selectRoleKeys(Long userId); + + List query(UmsRoleDto umsRoleDto); + + Long selectLatestPrimaryKey(); + + boolean bindMenu(Long roleId, List menuIds); + + UmsRole getById(Long id); +} diff --git a/system/src/main/java/com/yyy/system/service/UmsUserService.java b/system/src/main/java/com/yyy/system/service/UmsUserService.java new file mode 100644 index 0000000..e82d06f --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/UmsUserService.java @@ -0,0 +1,55 @@ +package com.yyy.system.service; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yyy.common.core.domain.dto.UmsUserAddDto; +import com.yyy.common.core.domain.dto.UmsUserQueryDto; +import com.yyy.common.core.domain.entity.UmsUser; + +import java.util.List; + +/** + * 用户表(UmsUser)表服务接口 + * @author Fangy + * @date 2024-03-22 17:31:34 + */ + +public interface UmsUserService extends IService { + /** + * 校验用户登录账号是否唯一 + */ + boolean checkLoginNameUnique(Long userId, String loginName); + + /** + * 校验手机号码是否唯一 + */ + boolean checkPhoneUnique(Long userId, String phone); + + /** + * 校验email是否唯一 + */ + boolean checkEmailUnique(Long userId, String email); + + /** + * 分页查询数据 + */ + List list(UmsUserQueryDto umsUserDto); + + UmsUser getById(Long id); + + List listByIds(List ids); + + boolean update(UmsUserAddDto umsUserAddDto, Long updateUser); + + boolean bindPost(Long userId, Long postId); + + boolean unbindPost(Long id); + + boolean unbindPost(List userIds); + + boolean bindRole(Long userId, Long roleId); + + boolean unbindRole(List userIds); + + boolean unbindRole(Long id); + + Long selectLatestPrimaryKey(); +} diff --git a/system/src/main/java/com/yyy/system/service/WordExportService.java b/system/src/main/java/com/yyy/system/service/WordExportService.java new file mode 100644 index 0000000..76aa0b8 --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/WordExportService.java @@ -0,0 +1,25 @@ +package com.yyy.system.service; + +import com.yyy.common.form.FieldData; +import com.yyy.common.utils.poi.FormData; +import com.yyy.system.entity.word.form.RepairForm; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Map; + +public interface WordExportService { + + boolean generateCharts(FormData data, String title, HttpServletResponse response); + + boolean generateCharts(RepairForm data, String title); + + boolean generateCharts(String templatePath, String title, String formKey, String formName, List list, HttpServletResponse response); + + boolean generateChartMap(String templatePath, String title, String formKey, Map> map, HttpServletResponse response); + + boolean generatePDF(FormData data, String title, HttpServletResponse response); + + boolean generatePDF(String templatePath, String title, String formKey, String formName, List list, HttpServletResponse response); + +} diff --git a/system/src/main/java/com/yyy/system/service/impl/DevicePlanServiceImpl.java b/system/src/main/java/com/yyy/system/service/impl/DevicePlanServiceImpl.java new file mode 100644 index 0000000..1268732 --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/impl/DevicePlanServiceImpl.java @@ -0,0 +1,272 @@ +package com.yyy.system.service.impl; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.yyy.common.constant.Constants; +import com.yyy.common.constant.ScheduleConstants; +import com.yyy.common.core.domain.Result; +import com.yyy.common.core.domain.ResultCode; +import com.yyy.common.core.text.Convert; +import com.yyy.common.enums.JobTypeEnum; +import com.yyy.common.enums.PlanCycleTypeEnum; +import com.yyy.common.exception.job.TaskException; +import com.yyy.common.utils.common.DateUtils; +import com.yyy.common.utils.common.StringUtils; +import com.yyy.quartz.domain.SysJob; +import com.yyy.quartz.service.ISysJobService; +import com.yyy.quartz.util.CronUtils; +import com.yyy.quartz.util.ScheduleUtils; +import com.yyy.system.entity.dto.DevicePlanAddDto; +import com.yyy.system.entity.dto.DevicePlanQueryDto; +import com.yyy.system.service.DevicePlanService; +import org.quartz.SchedulerException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +@Service +public class DevicePlanServiceImpl implements DevicePlanService { + @Autowired + private ISysJobService jobService; + + @Override + public List selectList(DevicePlanQueryDto dto) { + SysJob job = new SysJob(); + job.setJobGroup(dto.getPlanType() != null ? dto.getPlanType().getJobGroup() : null); + job.setJobName(dto.getName()); + job.setStatus(dto.getStatus()); + Integer teamId = dto.getTeamId(); + return jobService.selectJobList(job).stream() + // 将 SysJob 的 config 字段解析为 DevicePlanAddDto 对象,并设置 jobId + .map(item -> { + DevicePlanAddDto plan = JSONObject.parseObject(item.getConfig(), DevicePlanAddDto.class); + plan.setJobId(item.getJobId()); + plan.setStatus(item.getStatus()); + Date nextExecuteTime = CronUtils.getNextExecution(item.getCronExpression()); + plan.setNextExecuteTime(nextExecuteTime != null ? DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, nextExecuteTime) : ""); + return plan; + }) + // 过滤符合 teamId 条件的 DevicePlanAddDto 对象 + .filter(plan -> teamId == null || teamId == 0 || teamId.equals(plan.getTeamId())) + .collect(Collectors.toList()); + } + + @Override + public List selectByIds(List idList) { + if (idList == null || idList.size() == 0) { + return new ArrayList(); + } + return jobService.selectJobByIds(idList).stream() + .map(item -> { + DevicePlanAddDto plan = JSONObject.parseObject(item.getConfig(), DevicePlanAddDto.class); + plan.setJobId(item.getJobId()); + return plan; + }) + .collect(Collectors.toList()); + } + + @Override + public Result insert(DevicePlanAddDto dto) throws SchedulerException, TaskException { + String cron = getCron(dto); + dto.setCount(dto.getAssetIdList() != null ? dto.getAssetIdList().size() : 0); + //dto.setNextExecuteTime(DateUtils.dateTime(CronUtils.getNextExecution(cron))); + + String config = JSONObject.toJSONString(dto); + SysJob job = new SysJob(); + job.setJobName(dto.getName()); + job.setJobGroup(dto.getPlanType().getJobGroup()); + job.setInvokeTarget(JobTypeEnum.INSPECTION.getInvokeTarget(dto.getPlanType(), config)); + job.setCronExpression(cron); + job.setMisfirePolicy(dto.getMisfirePolicy()); + job.setConcurrent(dto.getConcurrent()); + job.setStatus(dto.getStatus() == null ? ScheduleConstants.Status.NORMAL.getValue() : dto.getStatus()); + job.setCreateUser(dto.getCreateUser()); + job.setRemark(dto.getRemark()); + job.setConfig(config); + // jobId为空 + + String errorMsg = valid(job); + if (StringUtils.isNotEmpty(errorMsg)) { + return new Result(ResultCode.operate_failure.getCode(), errorMsg); + } + return jobService.insertJob(job) > 0 ? Result.SUCCESS : Result.FAILURE; + } + + @Override + public Result update(DevicePlanAddDto dto) throws SchedulerException, TaskException { + String errorMsg; + if (dto.getJobId() == null || dto.getJobId() <= 0) { + errorMsg = "计划ID不能为空"; + return new Result(ResultCode.operate_failure.getCode(), errorMsg); + } + + String cron = getCron(dto); + dto.setCount(dto.getAssetIdList() != null ? dto.getAssetIdList().size() : 0); + //dto.setNextExecuteTime(DateUtils.dateTime(CronUtils.getNextExecution(cron))); + + String config = JSONObject.toJSONString(dto); + SysJob job = new SysJob(); + job.setJobId(dto.getJobId()); + job.setJobName(dto.getName()); + job.setJobGroup(dto.getPlanType().getJobGroup()); + job.setInvokeTarget(JobTypeEnum.INSPECTION.getInvokeTarget(dto.getPlanType(), config)); + job.setCronExpression(cron); + job.setMisfirePolicy(dto.getMisfirePolicy()); + job.setConcurrent(dto.getConcurrent()); + job.setStatus(dto.getStatus() == null ? ScheduleConstants.Status.NORMAL.getValue() : dto.getStatus()); + job.setCreateUser(dto.getCreateUser()); + job.setRemark(dto.getRemark()); + job.setConfig(config); + errorMsg = valid(job); + if (StringUtils.isNotEmpty(errorMsg)) { + return new Result(ResultCode.operate_failure.getCode(), errorMsg); + } + return jobService.updateJob(job) > 0 ? Result.SUCCESS : Result.FAILURE; + } + + @Override + public Result delete(DevicePlanAddDto dto) throws SchedulerException { + if (dto.getJobId() == null || dto.getJobId() <= 0 || dto.getPlanType() == null) { + return new Result(ResultCode.operate_failure.getCode(), "计划Id或者计划类型不能为空"); + } + SysJob job = new SysJob(); + job.setJobId(dto.getJobId()); + job.setJobGroup(dto.getPlanType().getJobGroup()); + return jobService.deleteJob(job) > 0 ? Result.SUCCESS : Result.FAILURE; + } + + @Override + public Result deleteByIds(String ids) throws SchedulerException { + if (StringUtils.isEmpty(ids)) { + return new Result(ResultCode.operate_failure.getCode(), "计划Id不能为空"); + } + Long[] idArray = Convert.toLongArray(ids); + if (idArray == null || idArray.length == 0) { + return new Result(ResultCode.operate_failure.getCode(), "计划Id类型不能为空"); + } + jobService.deleteJobByIds(ids); + return Result.SUCCESS; + } + + @Override + public Result changeStatus(DevicePlanAddDto dto) throws SchedulerException { + if (dto.getJobId() == null || dto.getJobId() <= 0 || dto.getStatus() == null) { + return new Result(ResultCode.operate_failure.getCode(), "计划Id不能为空/状态不能为空"); + } + SysJob newJob = jobService.selectJobById(dto.getJobId()); + newJob.setStatus(dto.getStatus()); + return jobService.changeStatus(newJob) > 0 ? Result.SUCCESS : Result.FAILURE; + } + + private String valid(SysJob job) { + if (!CronUtils.isValid(job.getCronExpression())) { + return "新增任务'" + job.getJobName() + "'失败,Cron表达式不正确"; + } else if (StringUtils.containsIgnoreCase(job.getInvokeTarget(), Constants.LOOKUP_RMI)) { + return "新增任务'" + job.getJobName() + "'失败,目标字符串不允许'rmi'调用"; + } else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), new String[]{Constants.LOOKUP_LDAP, Constants.LOOKUP_LDAPS})) { + return "新增任务'" + job.getJobName() + "'失败,目标字符串不允许'ldap(s)'调用"; + } else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), new String[]{Constants.HTTP, Constants.HTTPS})) { + return "新增任务'" + job.getJobName() + "'失败,目标字符串不允许'http(s)'调用"; + } else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), Constants.JOB_ERROR_STR)) { + return "新增任务'" + job.getJobName() + "'失败,目标字符串存在违规"; + } else if (!ScheduleUtils.whiteList(job.getInvokeTarget())) { + return "新增任务'" + job.getJobName() + "'失败,目标字符串不在白名单内"; + } + return null; + } + + /** + * 获取 cron 表达式 + * todo 待验证 day:不能同时跳过周末时和选间隔天数(1/3/5 2/4)。 week:不能跳过周末、周间隔不生效。 month:不能跳过周末 + * + * @param dto + * @return + */ + private static String getCron(DevicePlanAddDto dto) { + SimpleDateFormat sdf = new SimpleDateFormat("ss mm HH"); + + String timePart = sdf.format(dto.getActualStartTime()); + String cronExpression = null; + + Calendar calendar = Calendar.getInstance(); + calendar.setTime(dto.getActualStartTime()); + int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK); + int interval = dto.getInterval() + 1; + + switch (dto.getCycleType()) { + case day: + // 每天执行 跳过周末时天数间隔不生效 + if (dto.isSkipWeekend()) { + if (interval == 1) { + cronExpression = String.format("%s ? * MON-FRI", timePart); + } else if (interval == 2) { + //星期一,三,五 或者 二,四 + if (dayOfWeek / 2 == 1) { + cronExpression = String.format("%s ? * TUE,THU", timePart); + } else { + cronExpression = String.format("%s ? * MON,WED,FRI", timePart); + } + } else if (interval == 3) { + //星期一,四 或者 二,五 + if (dayOfWeek == 1 || dayOfWeek == 4) { + cronExpression = String.format("%s ? * MON,THU", timePart); + } else { + cronExpression = String.format("%s ? * TUE,FRI", timePart); + } + } else if (interval == 4) { + //星期一,五 + cronExpression = String.format("%s ? * MON,FRI", timePart); + } else { + //dto.getJobStartTime()的星期几 + cronExpression = String.format("%s ? * %s", timePart, getDayOfWeekString(dayOfWeek)); + } + } else { + cronExpression = String.format("%s 1/%d * ?", timePart, interval); + } + break; + case week: + cronExpression = String.format("%s ? * %s", timePart, getDayOfWeekString(dayOfWeek)); + break; + case month: + Calendar cal = Calendar.getInstance(); + cal.setTime(dto.getActualStartTime()); + int dayOfMonth = cal.get(Calendar.DAY_OF_MONTH); + cronExpression = String.format("%s %d */%d ?", timePart, dayOfMonth, interval); + break; + case once: + SimpleDateFormat sdfOnce = new SimpleDateFormat("ss mm HH dd MM ? yyyy"); + cronExpression = sdfOnce.format(dto.getActualStartTime()); + break; + } + + return cronExpression; + } + + private static String getDayOfWeekString(int dayOfWeek) { + switch (dayOfWeek) { + case Calendar.SUNDAY: + return "SUN"; + case Calendar.MONDAY: + return "MON"; + case Calendar.TUESDAY: + return "TUE"; + case Calendar.WEDNESDAY: + return "WED"; + case Calendar.THURSDAY: + return "THU"; + case Calendar.FRIDAY: + return "FRI"; + case Calendar.SATURDAY: + return "SAT"; + default: + return ""; + } + } + +} diff --git a/system/src/main/java/com/yyy/system/service/impl/EamAssetLogServiceImpl.java b/system/src/main/java/com/yyy/system/service/impl/EamAssetLogServiceImpl.java new file mode 100644 index 0000000..0c444d7 --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/impl/EamAssetLogServiceImpl.java @@ -0,0 +1,58 @@ +package com.yyy.system.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yyy.common.enums.DetectTypeEnum; +import com.yyy.common.utils.bean.BeanUtils; +import com.yyy.common.utils.common.StringUtils; +import com.yyy.system.mapper.EamAssetLogMapper; +import com.yyy.system.entity.pojo.EamAssetLog; +import com.yyy.system.service.EamAssetLogService; +import com.yyy.system.entity.dto.EamAssetLogDto; + +import java.util.List; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * 资产操作日志(EamAssetLog)表服务实现类 + * + * @author Fangy + * @date 2024-04-09 10:23:38 + */ +@Service +public class EamAssetLogServiceImpl extends ServiceImpl implements EamAssetLogService { + /** + * logger:日志文件 + */ + private static final Logger logger = LoggerFactory.getLogger(EamAssetLogServiceImpl.class); + + @Autowired + private EamAssetLogMapper eamAssetLogMapper; + + @Override + public List query(EamAssetLogDto eamAssetLogDto) { + EamAssetLog eamAssetLog = new EamAssetLog(); + BeanUtils.copyProperties(eamAssetLogDto, eamAssetLog); + return eamAssetLogMapper.query(eamAssetLog); + } + + @Override + public List queryAsset(EamAssetLogDto eamAssetLogDto) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq(StringUtils.isNotBlank(eamAssetLogDto.getBusinessId()), "business_id", eamAssetLogDto.getBusinessId()) + .notIn("operation_type", DetectTypeEnum.deviceInfos()) + .like(StringUtils.isNotBlank(eamAssetLogDto.getOperationType()), "operation_type", eamAssetLogDto.getOperationType()) + .like(StringUtils.isNotBlank(eamAssetLogDto.getOperationNotes()), "operation_notes", eamAssetLogDto.getOperationNotes()) + .eq(eamAssetLogDto.getAssetId() != null, "asset_id", eamAssetLogDto.getAssetId()); + return eamAssetLogMapper.selectList(queryWrapper); + } + + @Override + public boolean add(String businessId, DetectTypeEnum type, String notes, Long assetId, Long createUser) { + return eamAssetLogMapper.insert(EamAssetLog.builder().businessId(businessId).operationType(type.getInfo()).operationNotes(notes).assetId(assetId).createUser(createUser).build()) > 0; + } +} diff --git a/system/src/main/java/com/yyy/system/service/impl/EamAssetServiceImpl.java b/system/src/main/java/com/yyy/system/service/impl/EamAssetServiceImpl.java new file mode 100644 index 0000000..a876990 --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/impl/EamAssetServiceImpl.java @@ -0,0 +1,636 @@ +package com.yyy.system.service.impl; + +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yyy.common.enums.AssetStatusEnum; +import com.yyy.common.enums.EncodingEum; +import com.yyy.common.utils.common.DateUtils; +import com.yyy.common.utils.common.StringUtils; +import com.yyy.common.utils.tree.TreeBuilderUtil; +import com.yyy.common.utils.tree.TreeNode; +import com.yyy.system.entity.dto.*; +import com.yyy.system.entity.excel.EamAssetExcel; +import com.yyy.system.entity.pojo.EamAsset; +import com.yyy.system.entity.pojo.*; +import com.yyy.system.entity.vo.*; +import com.yyy.system.mapper.*; +import com.yyy.system.service.EamAssetService; +import com.yyy.common.utils.bean.BeanUtils; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.time.LocalDateTime; +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import com.yyy.system.service.EamBasicCategoryService; +import com.yyy.system.service.EamBusinessBorrowService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; + +import javax.annotation.Resource; + +/** + * 资产信息表(EamAsset)表服务实现类 + * + * @author Fangy + * @date 2024-04-09 13:47:49 + */ +@Service +public class EamAssetServiceImpl extends ServiceImpl implements EamAssetService { + /** + * logger:日志文件 + */ + private static final Logger logger = LoggerFactory.getLogger(EamAssetServiceImpl.class); + + @Autowired + private EamAssetMapper eamAssetMapper; + + @Autowired + private EamWarehouseInventoryMapper eamWarehouseInventoryMapper; + + @Autowired + private EamBusinessBorrowService borrowService; + + @Resource + private EamBasicCategoryService eamBasicCategoryService; + + + @Override + public List query(EamAssetQueryDto eamAssetQueryDto) { + EamAsset eamAsset = new EamAsset(); + BeanUtils.copyProperties(eamAssetQueryDto, eamAsset); + return eamAssetMapper.query(eamAsset); + } + + @Override + public int count(EamAssetQueryDto eamAssetQueryDto) { + EamAsset eamAsset = new EamAsset(); + BeanUtils.copyProperties(eamAssetQueryDto, eamAsset); + return eamAssetMapper.count(eamAsset); + } + + @Override + public boolean delete(List ids) { + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.set("is_deleted", 1).set("update_time", DateUtils.getNowDate()).in("asset_id", ids); + return eamAssetMapper.update(null, updateWrapper) > 0; + } + + @Override + public EamAsset getById(Long id) { + return eamAssetMapper.joinById(id); + } + + @Override + public List listByIds(List idList) { + return eamAssetMapper.joinByIds(idList); + } + + @Override + public List listBySNList(List SNList) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.in("serial_number", SNList).eq("is_deleted", 0); + return eamAssetMapper.selectList(queryWrapper); + } + + @Override + public Long selectLatestPrimaryKey() { + EamAsset eamAsset = eamAssetMapper.selectOne(new QueryWrapper().orderByDesc("asset_id").last("limit 1")); + if (eamAsset != null) { + return eamAsset.getAssetId(); + } + return 1L; + } + + @Override + public List maintenance(String time) { + return eamAssetMapper.maintenance(time); + } + + @Override + public List stocktaking(EamStocktakingJob stocktakingJob) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + + if (stocktakingJob.getStocktakingStartDate() != null && stocktakingJob.getStocktakingEndDate() != null) { + queryWrapper.between("create_time", stocktakingJob.getStocktakingStartDate(), stocktakingJob.getStocktakingEndDate()); + } else if (stocktakingJob.getStocktakingStartDate() != null) { + queryWrapper.ge("create_time", stocktakingJob.getStocktakingStartDate()); + } else if (stocktakingJob.getStocktakingEndDate() != null) { + queryWrapper.le("create_time", stocktakingJob.getStocktakingEndDate()); + } + + queryWrapper.eq(stocktakingJob.getAssetStatus() != null, "status", stocktakingJob.getAssetStatus()) + .eq(stocktakingJob.getOwnCompanyId() != null, "own_company_id", stocktakingJob.getOwnCompanyId()) + .eq(stocktakingJob.getUseOrganizationId() != null, "use_organization_id", stocktakingJob.getUseOrganizationId()) + .eq(stocktakingJob.getUseUserId() != null, "use_user_id", stocktakingJob.getUseUserId()) + .eq(stocktakingJob.getCategoryId() != null, "category_id", stocktakingJob.getCategoryId()) + .eq(stocktakingJob.getPositionId() != null, "position_id", stocktakingJob.getPositionId()); + + // 仓库信息 +// .eq(stocktakingJob.getWarehouseId() != null, "warehouse_id", stocktakingJob.getWarehouseId()) + return eamAssetMapper.selectList(queryWrapper); + } + + @Override + public boolean sparePartsAdd(EamSparePartsDto eamSparePartsDto) { + eamAssetMapper.sparePartsAdd(eamSparePartsDto); + return true; + } + + + @Override + public List sparePartsList(Long assetId) { + return eamAssetMapper.sparePartsList(assetId); + } + + @Override + public boolean sparePartsDel(EamSparePartsDto eamSparePartsDto) { + eamAssetMapper.sparePartsDel(eamSparePartsDto); + return true; + } + + @Override + public List queryWarehouseInventory(EamWarehouseInventoryDto eamWarehouseInventoryDto) { + EamWarehouseInventory eamWarehouseInventory = new EamWarehouseInventory(); + BeanUtils.copyProperties(eamWarehouseInventoryDto, eamWarehouseInventory); + return eamWarehouseInventoryMapper.query(eamWarehouseInventory); + } + + @Override + public List queryWarehouseInventoryByIds(List eamWarehouseAssetDtoList) { + List eamWarehouseInventoryList = new ArrayList<>(); + eamWarehouseAssetDtoList.forEach(eamWarehouseAssetDto -> { + EamWarehouseInventory e = eamWarehouseInventoryMapper.queryHistory(eamWarehouseAssetDto); + if (e != null) { + eamWarehouseInventoryList.add(e); + } + }); + return eamWarehouseInventoryList; + } + + @Override + public List queryWarehouseInventoryStorage(EamWarehouseInventoryDto eamWarehouseInventoryDto) { + EamWarehouseInventory eamWarehouseInventory = new EamWarehouseInventory(); + BeanUtils.copyProperties(eamWarehouseInventoryDto, eamWarehouseInventory); + return eamWarehouseInventoryMapper.queryWarehouseInventoryStorage(eamWarehouseInventory); + } + + @Override + public List excelToPojo(List list) { + List result = new ArrayList<>(); + list.forEach(x -> { + EamAsset e = new EamAsset(); + BeanUtils.copyProperties(x, e); + if (e.getAssetCode() == null) { + e.setAssetCode(EncodingEum.ASSET.getBusinessId()); + } + e.setOwnCompanyId(1L); + result.add(e); + }); + return result; + } + + @Override + public EamHomeVo homeData() { + String currentTime = DateUtils.getTime(); + String currentDate = DateUtils.getDate(); + + // 维护预警总数 + int maintenanceWarningTotal = eamAssetMapper.maintenance(currentTime).size(); + int maintenanceWarningTotalPrevious = eamAssetMapper.maintenance(currentDate).size(); + + // 借用预警总数 + int borrowWarningTotal = calculateBorrowWarningTotal(3); + int borrowWarningTotalPrevious = calculateBorrowWarningTotal(4); + + // 获取所有资产列表 + List assetList = eamAssetMapper.query(new EamAsset()); + + // 生成各类图表 + List assetStatusChart = generateAssetStatusChart(assetList); + List assetPositionChart = generateAssetPositionChart(assetList); + List assetOwnChart = generateAssetOwnChart(assetList); + List assetUseChart = generateAssetUseChart(assetList); + List assetCategoryChart = generateAssetCategoryChartWithTree(assetList); + + // 库存安全预警总数 + int inventorySecurityWarningTotal = calculateInventorySecurityWarningTotal(); + + // 库存图表 + List assetInventoryChart = generateAssetInventoryChart(); + + // 最近添加的资产 + List recentlyAddedAssets = EamAssetVo.ToVo( + eamAssetMapper.selectList(new QueryWrapper() + .orderByDesc("create_time") + .last("limit 10")) + ); + + return EamHomeVo.builder() + .assetTotal(buildAssetTotalVo(currentDate, currentTime)) + .borrowWarning(EamTotalVo.builder() + .total(borrowWarningTotal) + .change(borrowWarningTotal - borrowWarningTotalPrevious) + .name("借用预警") + .build()) + .maintenanceWarning(EamTotalVo.builder() + .total(maintenanceWarningTotal) + .change(maintenanceWarningTotal - maintenanceWarningTotalPrevious) + .name("维保到期预警") + .build()) + .inventorySecurityWarning(EamTotalVo.builder() + .total(inventorySecurityWarningTotal) + .change(null) + .name("库存安全预警") + .build()) + .assetStatusChart(assetStatusChart) + .assetPositionChart(assetPositionChart) + .assetCategoryChart(assetCategoryChart) + .assetInventoryChart(assetInventoryChart) + .assetOwnChart(assetOwnChart) + .assetUseChart(assetUseChart) + .recentlyAddedAssets(recentlyAddedAssets) + .build(); + } + + @Override + public void bigScreenData(EamBigScreenVo vo) { + List assetList = eamAssetMapper.query(new EamAsset()); + + // 生成资产状态图表 + List assetStatusChart = generateAssetStatusChart(assetList); + + // 生成资产位置图表 + List assetPositionChart = generateAssetPositionChart(assetList); + + // 生成资产类别图表及资产价值统计 + List assetCategoryChart = new ArrayList<>(); + List assetCostChart = new ArrayList<>(); + try { + List categoryList = eamBasicCategoryService.query(new EamBasicCategoryDto()); + List> treeList = TreeBuilderUtil.buildTree(categoryList); + assetCategoryChart = generateAssetCategoryChart(assetList, assetCategoryChart, treeList); + assetCostChart = generateAssetCostChart(assetList,treeList); + } catch (Exception e) { + logger.error("数据大屏-价值统计-资产类型 异常信息:{}", e.getMessage(), e); + } + + // 生成资产变动图表 + List assetChangeChart = generateAssetChangeChart(assetList); + + // 生成库存安全预警消息 + List MSGList = generateInventoryWarnings(); + + // 生成维保到期和借用超期预警消息 + MSGList.addAll(generateMaintenanceWarnings()); + MSGList.addAll(generateBorrowWarnings()); + + // 设置到 Vo + vo.setAssetCategoryChart(assetCategoryChart); + vo.setAssetStatusChart(assetStatusChart); + vo.setAssetCostStatistics(assetCostChart); + vo.setAssetChangeChart(assetChangeChart); + vo.setAssetTotal(assetList.size()); + vo.setAssetPositionChart(assetPositionChart); + vo.setMessages(vo.getMessages() != null ? + Stream.concat(vo.getMessages().stream(), MSGList.stream()).collect(Collectors.toList()) : + MSGList); + } + + // 生成资产状态图表 + private List generateAssetStatusChart(List assetList) { + return assetList.stream() + .collect(Collectors.groupingBy( + e -> AssetStatusEnum.getInfoByCode(e.getStatus()), + Collectors.counting() + )) + .entrySet().stream() + .map(entry -> new EamChartVo(entry.getValue().intValue(), entry.getKey())) + .collect(Collectors.toList()); + } + + // 生成资产位置图表 + private List generateAssetPositionChart(List assetList) { + return assetList.stream() + .filter(e -> e.get_position() != null && StringUtils.isNotBlank(e.get_position().getName())) + .collect(Collectors.groupingBy( + e -> e.get_position().getName(), + Collectors.counting() + )) + .entrySet().stream() + .map(entry -> new EamChartVo(entry.getValue().intValue(), entry.getKey())) + .collect(Collectors.toList()); + } + + // 生成资产类别图表 + private List generateAssetCategoryChart(List assetList, List assetCategoryChart, List> treeList) { + return assetList.stream() + .filter(e -> e.getCategoryId() != null) + .collect(Collectors.groupingBy( + e -> getRootName(treeList, e.getCategoryId()), + Collectors.counting() + )) + .entrySet().stream() + .map(entry -> new EamChartVo(entry.getValue().intValue(), entry.getKey())) + .collect(Collectors.toList()); + } + + // 获取根名称 + private String getRootName(List> treeList, Long categoryId) { + return treeList.stream() + .filter(x -> x.getId().equals(categoryId)) + .map(TreeNode::getRootName) + .findFirst() + .orElse("其他"); + } + + // 生成资产价值统计图表 + private List generateAssetCostChart(List assetList, List> treeList) { + double assetCost = 0d; + double deviceCost = 0d; + double otherCost = 0d; + + for (EamAsset asset : assetList) { + if (asset.getCategoryId() == null || asset.getTotalAmountPrice() == null || + asset.getCategoryId() == 0 || asset.getTotalAmountPrice() == 0d) { + continue; + } + + TreeNode treeNode = treeList.stream() + .filter(x -> x.getId().equals(asset.getCategoryId())) + .findFirst() + .orElse(null); + + if (treeNode != null) { + switch (treeNode.getRootId()) { + case "1": + assetCost += asset.getTotalAmountPrice(); + break; + case "2": + deviceCost += asset.getTotalAmountPrice(); + break; + default: + otherCost += asset.getTotalAmountPrice(); + } + } + } + + List assetCostChart = new ArrayList<>(); + assetCostChart.add(createCostStatistic("资产价值", assetCost)); + assetCostChart.add(createCostStatistic("生产设备", deviceCost)); + assetCostChart.add(createCostStatistic("其他资产", otherCost)); + + return assetCostChart; + } + + // 创建资产价值统计项 + private EamStatisticsVo createCostStatistic(String name, double cost) { + String costStr = cost > 100000 ? (cost / 10000) + "万" : cost + "元"; + return EamStatisticsVo.builder() + .name(name) + .content(costStr) + .build(); + } + + // 生成资产变动图表 + private List generateAssetChangeChart(List assetList) { + Date sixMonthsAgo = DateUtils.addMonths(new Date(), -6); + DateFormat dateFormat = new SimpleDateFormat(DateUtils.YYYY_MM); + + return assetList.stream() + .filter(e -> e.getCreateTime().after(sixMonthsAgo)) + .collect(Collectors.groupingBy( + e -> dateFormat.format(e.getCreateTime()), + Collectors.counting() + )) + .entrySet().stream() + .map(entry -> EamChartVo.builder() + .name(entry.getKey()) + .total(entry.getValue().intValue()) + .build()) + .collect(Collectors.toList()); + } + + // 生成库存安全预警消息 + private List generateInventoryWarnings() { + List warnings = new ArrayList<>(); + List warehouseInventoryList = queryWarehouseInventory(new EamWarehouseInventoryDto()); + + warehouseInventoryList.forEach(e -> { + if (e.getLowerLimit() != null && e.getCount() != null) { + if (e.getCount() <= e.getLowerLimit()) { + warnings.add(EamStatisticsVo.builder() + .name("库存安全预警") + .content(e.getName() + "-库存不足") + .build()); + } else if (e.getSafetyLimit() != null && e.getCount() <= e.getSafetyLimit()) { + warnings.add(EamStatisticsVo.builder() + .name("库存安全预警") + .content(e.getName() + "-安库预警") + .build()); + } + } + if (e.getCount() != null && e.getSafetyLimit() != null && e.getUpperLimit() != null + && e.getCount() > e.getUpperLimit()) { + warnings.add(EamStatisticsVo.builder() + .name("库存安全预警") + .content(e.getName() + "-库存超量") + .build()); + } + }); + + return warnings; + } + + // 生成维保到期预警消息 + private List generateMaintenanceWarnings() { + return eamAssetMapper.maintenance(DateUtils.getTime()).stream() + .map(e -> EamStatisticsVo.builder() + .name("维保到期预警") + .content(e.getName() + "-维保即将到期") + .build()) + .collect(Collectors.toList()); + } + + // 生成借用超期预警消息 + private List generateBorrowWarnings() { + return borrowService.list(new QueryWrapper<>()).stream() + .filter(borrow -> borrow.getIsDeleted().equals(0) + && CollectionUtils.isNotEmpty(JSON.parseArray(borrow.getAssetIdList())) + && borrow.getReturnTime().before(DateUtils.toDate(LocalDateTime.now().plusDays(3)))) + .flatMap(borrow -> { + List assetIds = JSON.parseArray(borrow.getAssetIdList(), EamWarehouseAssetDto.class).stream() + .map(EamWarehouseAssetDto::getAssetId) + .distinct() + .collect(Collectors.toList()); + return listByIds(assetIds).stream() + .filter(asset -> asset.getStatus().equals(AssetStatusEnum.BORROW.getCode())) + .map(asset -> EamWarningBorrowVo.ToVo(asset, borrow.getBusinessId(), borrow.getReturnTime())); + }) + .map(vo -> EamStatisticsVo.builder() + .name("借用超期预警") + .content(vo.getName() + "-借用超时") + .build()) + .collect(Collectors.toList()); + } + + + + /** + * 计算借用预警总数,根据提前天数不同 + */ + private int calculateBorrowWarningTotal(int daysAhead) { + Date targetDate = DateUtils.toDate(LocalDateTime.now().plusDays(daysAhead)); + return borrowService.list(new QueryWrapper<>()).stream() + .filter(borrow -> borrow.getIsDeleted().equals(0) + && CollectionUtils.isNotEmpty(JSON.parseArray(borrow.getAssetIdList())) + && borrow.getReturnTime().before(targetDate)) + .flatMap(borrow -> getBorrowWarningVoStream(borrow)) + .collect(Collectors.toList()).size(); + } + + /** + * 获取借用预警的流 + */ + private Stream getBorrowWarningVoStream(EamBusinessBorrow borrow) { + List assetIds = JSON.parseArray(borrow.getAssetIdList(), EamWarehouseAssetDto.class).stream() + .map(EamWarehouseAssetDto::getAssetId) + .distinct() + .collect(Collectors.toList()); + return listByIds(assetIds).stream() + .filter(asset -> asset.getStatus().equals(AssetStatusEnum.BORROW.getCode())) + .map(asset -> EamWarningBorrowVo.ToVo(asset, borrow.getBusinessId(), borrow.getReturnTime())); + } + + /** + * 构建资产总数VO + */ + private EamTotalVo buildAssetTotalVo(String currentDate, String currentTime) { + int total = eamAssetMapper.selectCount(new QueryWrapper().eq("is_deleted", 0)).intValue(); + int change = eamAssetMapper.selectCount(new QueryWrapper() + .eq("is_deleted", 0) + .between("create_time", currentDate, currentTime)).intValue() + - eamAssetMapper.selectCount(new QueryWrapper() + .eq("is_deleted", 1) + .between("update_time", currentDate, currentTime)).intValue(); + return EamTotalVo.builder() + .total(total) + .change(change) + .name("资产总数") + .build(); + } + + /** + * 生成资产所有者图表 + */ + private List generateAssetOwnChart(List assetList) { + return assetList.stream() + .filter(e -> e.get_ownCompany() != null && StringUtils.isNotBlank(e.get_ownCompany().getOrganizationName())) + .collect(Collectors.groupingBy( + e -> e.get_ownCompany().getOrganizationName(), + Collectors.counting() + )) + .entrySet().stream() + .map(entry -> new EamChartVo(entry.getValue().intValue(), entry.getKey())) + .collect(Collectors.toList()); + } + + /** + * 生成资产使用组织图表 + */ + private List generateAssetUseChart(List assetList) { + return assetList.stream() + .filter(e -> e.get_useOrganization() != null && StringUtils.isNotBlank(e.get_useOrganization().getOrganizationName())) + .collect(Collectors.groupingBy( + e -> e.get_useOrganization().getOrganizationName(), + Collectors.counting() + )) + .entrySet().stream() + .map(entry -> new EamChartVo(entry.getValue().intValue(), entry.getKey())) + .collect(Collectors.toList()); + } + + /** + * 生成资产类别图表,包含树形结构 + */ + private List generateAssetCategoryChartWithTree(List assetList) { + List assetCategoryChart = new ArrayList<>(); + try { + List categoryList = eamBasicCategoryService.query(new EamBasicCategoryDto()); + List> treeList = TreeBuilderUtil.buildTree(categoryList); + assetCategoryChart = assetList.stream() + .filter(e -> e.getCategoryId() != null) + .collect(Collectors.groupingBy( + e -> getRootName(treeList, e.getCategoryId()), + Collectors.counting() + )) + .entrySet().stream() + .map(entry -> new EamChartVo(entry.getValue().intValue(), entry.getKey())) + .collect(Collectors.toList()); + } catch (Exception e) { + logger.error("首页-资产类型统计 异常信息:{}", e.getMessage(), e); + } + return assetCategoryChart; + } + + /** + * 计算库存安全预警总数 + */ + private int calculateInventorySecurityWarningTotal() { + List warehouseInventoryList = queryWarehouseInventory(new EamWarehouseInventoryDto()); + + long lowerLimitCount = warehouseInventoryList.stream() + .filter(e -> e.getLowerLimit() != null && e.getCount() != null && e.getCount() <= e.getLowerLimit()) + .count(); + + long upperLimitCount = warehouseInventoryList.stream() + .filter(e -> e.getUpperLimit() != null && e.getCount() != null && e.getCount() > e.getUpperLimit()) + .count(); + + long safetyLimitCount = warehouseInventoryList.stream() + .filter(e -> e.getLowerLimit() != null && e.getSafetyLimit() != null + && e.getCount() != null + && e.getCount() > e.getLowerLimit() + && e.getCount() <= e.getSafetyLimit()) + .count(); + + return (int) (lowerLimitCount + upperLimitCount + safetyLimitCount); + } + + /** + * 生成库存图表 + */ + private List generateAssetInventoryChart() { + List warehouseInventoryList = queryWarehouseInventory(new EamWarehouseInventoryDto()); + + long lowerLimitCount = warehouseInventoryList.stream() + .filter(e -> e.getLowerLimit() != null && e.getCount() != null && e.getCount() <= e.getLowerLimit()) + .count(); + + long upperLimitCount = warehouseInventoryList.stream() + .filter(e -> e.getUpperLimit() != null && e.getCount() != null && e.getCount() > e.getUpperLimit()) + .count(); + + long safetyLimitCount = warehouseInventoryList.stream() + .filter(e -> e.getLowerLimit() != null && e.getSafetyLimit() != null + && e.getCount() != null + && e.getCount() > e.getLowerLimit() + && e.getCount() <= e.getSafetyLimit()) + .count(); + + List assetInventoryChart = new ArrayList<>(); + assetInventoryChart.add(EamChartVo.builder().name("不足").total(Math.toIntExact(lowerLimitCount)).build()); + assetInventoryChart.add(EamChartVo.builder().name("超量").total(Math.toIntExact(upperLimitCount)).build()); + assetInventoryChart.add(EamChartVo.builder().name("安库预警").total(Math.toIntExact(safetyLimitCount)).build()); + + return assetInventoryChart; + } + +} diff --git a/system/src/main/java/com/yyy/system/service/impl/EamBasicCategoryServiceImpl.java b/system/src/main/java/com/yyy/system/service/impl/EamBasicCategoryServiceImpl.java new file mode 100644 index 0000000..8ee6026 --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/impl/EamBasicCategoryServiceImpl.java @@ -0,0 +1,38 @@ +package com.yyy.system.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yyy.common.utils.bean.BeanUtils; +import com.yyy.system.mapper.EamBasicCategoryMapper; +import com.yyy.system.entity.pojo.EamBasicCategory; +import com.yyy.system.service.EamBasicCategoryService; +import com.yyy.system.entity.dto.EamBasicCategoryDto; + +import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * 资产分类信息表(EamBasicCategory)表服务实现类 + * + * @author Fangy + * @date 2024-04-08 14:33:13 + */ +@Service +public class EamBasicCategoryServiceImpl extends ServiceImpl implements EamBasicCategoryService { + /** + * logger:日志文件 + */ + private static final Logger logger = LoggerFactory.getLogger(EamBasicCategoryServiceImpl.class); + + @Autowired + private EamBasicCategoryMapper eamBasicCategoryMapper; + + @Override + public List query(EamBasicCategoryDto eamBasicCategoryDto) { + EamBasicCategory eamBasicCategory = new EamBasicCategory(); + BeanUtils.copyProperties(eamBasicCategoryDto, eamBasicCategory); + return eamBasicCategoryMapper.query(eamBasicCategory); + } +} diff --git a/system/src/main/java/com/yyy/system/service/impl/EamBasicFinancialCategoryServiceImpl.java b/system/src/main/java/com/yyy/system/service/impl/EamBasicFinancialCategoryServiceImpl.java new file mode 100644 index 0000000..51ce00a --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/impl/EamBasicFinancialCategoryServiceImpl.java @@ -0,0 +1,35 @@ +package com.yyy.system.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yyy.system.mapper.EamBasicFinancialCategoryMapper; +import com.yyy.system.entity.pojo.EamBasicFinancialCategory; +import com.yyy.system.mapper.EamBasicFinancialCategoryMapper; +import com.yyy.system.service.EamBasicFinancialCategoryService; +import com.yyy.system.entity.dto.EamBasicFinancialCategoryDto; +import com.yyy.common.utils.bean.BeanUtils; +import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * 财务分类信息表(EamBasicFinancialCategory)表服务实现类 + * @author Fangy + * @date 2024-05-11 14:38:13 + */ +@Service +public class EamBasicFinancialCategoryServiceImpl extends ServiceImpl implements EamBasicFinancialCategoryService { + /** logger:日志文件 */ + private static final Logger logger = LoggerFactory.getLogger(EamBasicFinancialCategoryServiceImpl.class); + + @Autowired + private EamBasicFinancialCategoryMapper eamBasicFinancialCategoryMapper; + + @Override + public List query(EamBasicFinancialCategoryDto eamBasicFinancialCategoryDto) { + EamBasicFinancialCategory eamBasicFinancialCategory = new EamBasicFinancialCategory(); + BeanUtils.copyProperties(eamBasicFinancialCategoryDto, eamBasicFinancialCategory); + return eamBasicFinancialCategoryMapper.query(eamBasicFinancialCategory); + } +} diff --git a/system/src/main/java/com/yyy/system/service/impl/EamBasicMaintenanceVendorServiceImpl.java b/system/src/main/java/com/yyy/system/service/impl/EamBasicMaintenanceVendorServiceImpl.java new file mode 100644 index 0000000..37e7d19 --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/impl/EamBasicMaintenanceVendorServiceImpl.java @@ -0,0 +1,35 @@ +package com.yyy.system.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yyy.system.mapper.EamBasicMaintenanceVendorMapper; +import com.yyy.system.entity.pojo.EamBasicMaintenanceVendor; +import com.yyy.system.mapper.EamBasicMaintenanceVendorMapper; +import com.yyy.system.service.EamBasicMaintenanceVendorService; +import com.yyy.system.entity.dto.EamBasicMaintenanceVendorDto; +import com.yyy.common.utils.bean.BeanUtils; +import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * 维保商(EamBasicMaintenanceVendor)表服务实现类 + * @author Fangy + * @date 2024-04-09 12:52:28 + */ +@Service +public class EamBasicMaintenanceVendorServiceImpl extends ServiceImpl implements EamBasicMaintenanceVendorService { + /** logger:日志文件 */ + private static final Logger logger = LoggerFactory.getLogger(EamBasicMaintenanceVendorServiceImpl.class); + + @Autowired + private EamBasicMaintenanceVendorMapper eamBasicMaintenanceVendorMapper; + + @Override + public List query(EamBasicMaintenanceVendorDto eamBasicMaintenanceVendorDto) { + EamBasicMaintenanceVendor eamBasicMaintenanceVendor = new EamBasicMaintenanceVendor(); + BeanUtils.copyProperties(eamBasicMaintenanceVendorDto, eamBasicMaintenanceVendor); + return eamBasicMaintenanceVendorMapper.query(eamBasicMaintenanceVendor); + } +} diff --git a/system/src/main/java/com/yyy/system/service/impl/EamBasicManufacturersVendorServiceImpl.java b/system/src/main/java/com/yyy/system/service/impl/EamBasicManufacturersVendorServiceImpl.java new file mode 100644 index 0000000..03499bc --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/impl/EamBasicManufacturersVendorServiceImpl.java @@ -0,0 +1,40 @@ +package com.yyy.system.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yyy.system.mapper.EamBasicManufacturersVendorMapper; +import com.yyy.system.entity.pojo.EamBasicManufacturersVendor; +import com.yyy.system.mapper.EamBasicManufacturersVendorMapper; +import com.yyy.system.service.EamBasicManufacturersVendorService; +import com.yyy.system.entity.dto.EamBasicManufacturersVendorDto; +import com.yyy.common.utils.bean.BeanUtils; + +import java.util.List; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * 生产商(EamBasicManufacturersVendor)表服务实现类 + * + * @author Fangy + * @date 2024-04-09 12:45:34 + */ +@Service +public class EamBasicManufacturersVendorServiceImpl extends ServiceImpl implements EamBasicManufacturersVendorService { + /** + * logger:日志文件 + */ + private static final Logger logger = LoggerFactory.getLogger(EamBasicManufacturersVendorServiceImpl.class); + + @Autowired + private EamBasicManufacturersVendorMapper eamBasicManufacturersVendorMapper; + + @Override + public List query(EamBasicManufacturersVendorDto eamBasicManufacturersVendorDto) { + EamBasicManufacturersVendor eamBasicManufacturersVendor = new EamBasicManufacturersVendor(); + BeanUtils.copyProperties(eamBasicManufacturersVendorDto, eamBasicManufacturersVendor); + return eamBasicManufacturersVendorMapper.query(eamBasicManufacturersVendor); + } +} diff --git a/system/src/main/java/com/yyy/system/service/impl/EamBasicPositionServiceImpl.java b/system/src/main/java/com/yyy/system/service/impl/EamBasicPositionServiceImpl.java new file mode 100644 index 0000000..1ee9616 --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/impl/EamBasicPositionServiceImpl.java @@ -0,0 +1,35 @@ +package com.yyy.system.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yyy.system.mapper.EamBasicPositionMapper; +import com.yyy.system.entity.pojo.EamBasicPosition; +import com.yyy.system.mapper.EamBasicPositionMapper; +import com.yyy.system.service.EamBasicPositionService; +import com.yyy.system.entity.dto.EamBasicPositionDto; +import com.yyy.common.utils.bean.BeanUtils; +import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * 存放位置信息表(EamBasicPosition)表服务实现类 + * @author Fangy + * @date 2024-04-09 12:52:28 + */ +@Service +public class EamBasicPositionServiceImpl extends ServiceImpl implements EamBasicPositionService { + /** logger:日志文件 */ + private static final Logger logger = LoggerFactory.getLogger(EamBasicPositionServiceImpl.class); + + @Autowired + private EamBasicPositionMapper eamBasicPositionMapper; + + @Override + public List query(EamBasicPositionDto eamBasicPositionDto) { + EamBasicPosition eamBasicPosition = new EamBasicPosition(); + BeanUtils.copyProperties(eamBasicPositionDto, eamBasicPosition); + return eamBasicPositionMapper.query(eamBasicPosition); + } +} diff --git a/system/src/main/java/com/yyy/system/service/impl/EamBasicSupplierVendorServiceImpl.java b/system/src/main/java/com/yyy/system/service/impl/EamBasicSupplierVendorServiceImpl.java new file mode 100644 index 0000000..847a57c --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/impl/EamBasicSupplierVendorServiceImpl.java @@ -0,0 +1,39 @@ +package com.yyy.system.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yyy.common.utils.bean.BeanUtils; +import com.yyy.system.mapper.EamBasicSupplierVendorMapper; +import com.yyy.system.entity.pojo.EamBasicSupplierVendor; +import com.yyy.system.service.EamBasicSupplierVendorService; +import com.yyy.system.entity.dto.EamBasicSupplierVendorDto; + +import java.util.List; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * 供应商(EamBasicSupplierVendor)表服务实现类 + * + * @author Fangy + * @date 2024-04-09 10:56:09 + */ +@Service +public class EamBasicSupplierVendorServiceImpl extends ServiceImpl implements EamBasicSupplierVendorService { + /** + * logger:日志文件 + */ + private static final Logger logger = LoggerFactory.getLogger(EamBasicSupplierVendorServiceImpl.class); + + @Autowired + private EamBasicSupplierVendorMapper eamBasicSupplierVendorMapper; + + @Override + public List query(EamBasicSupplierVendorDto eamBasicSupplierVendorDto) { + EamBasicSupplierVendor eamBasicSupplierVendor = new EamBasicSupplierVendor(); + BeanUtils.copyProperties(eamBasicSupplierVendorDto, eamBasicSupplierVendor); + return eamBasicSupplierVendorMapper.query(eamBasicSupplierVendor); + } +} diff --git a/system/src/main/java/com/yyy/system/service/impl/EamBasicTeamServiceImpl.java b/system/src/main/java/com/yyy/system/service/impl/EamBasicTeamServiceImpl.java new file mode 100644 index 0000000..1289db7 --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/impl/EamBasicTeamServiceImpl.java @@ -0,0 +1,35 @@ +package com.yyy.system.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yyy.system.mapper.EamBasicTeamMapper; +import com.yyy.system.entity.pojo.EamBasicTeam; +import com.yyy.system.mapper.EamBasicTeamMapper; +import com.yyy.system.service.EamBasicTeamService; +import com.yyy.system.entity.dto.EamBasicTeamDto; +import com.yyy.common.utils.bean.BeanUtils; +import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * 班组信息管理(EamBasicTeam)表服务实现类 + * @author Fangy + * @date 2024-09-18 14:57:08 + */ +@Service +public class EamBasicTeamServiceImpl extends ServiceImpl implements EamBasicTeamService { + /** logger:日志文件 */ + private static final Logger logger = LoggerFactory.getLogger(EamBasicTeamServiceImpl.class); + + @Autowired + private EamBasicTeamMapper eamBasicTeamMapper; + + @Override + public List query(EamBasicTeamDto eamBasicTeamDto) { + EamBasicTeam eamBasicTeam = new EamBasicTeam(); + BeanUtils.copyProperties(eamBasicTeamDto, eamBasicTeam); + return eamBasicTeamMapper.query(eamBasicTeam); + } +} diff --git a/system/src/main/java/com/yyy/system/service/impl/EamBasicWarehouseServiceImpl.java b/system/src/main/java/com/yyy/system/service/impl/EamBasicWarehouseServiceImpl.java new file mode 100644 index 0000000..0d4cf53 --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/impl/EamBasicWarehouseServiceImpl.java @@ -0,0 +1,35 @@ +package com.yyy.system.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yyy.system.mapper.EamBasicWarehouseMapper; +import com.yyy.system.entity.pojo.EamBasicWarehouse; +import com.yyy.system.mapper.EamBasicWarehouseMapper; +import com.yyy.system.service.EamBasicWarehouseService; +import com.yyy.system.entity.dto.EamBasicWarehouseDto; +import com.yyy.common.utils.bean.BeanUtils; +import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * 仓库信息表(EamBasicWarehouse)表服务实现类 + * @author Fangy + * @date 2024-04-09 13:16:58 + */ +@Service +public class EamBasicWarehouseServiceImpl extends ServiceImpl implements EamBasicWarehouseService { + /** logger:日志文件 */ + private static final Logger logger = LoggerFactory.getLogger(EamBasicWarehouseServiceImpl.class); + + @Autowired + private EamBasicWarehouseMapper eamBasicWarehouseMapper; + + @Override + public List query(EamBasicWarehouseDto eamBasicWarehouseDto) { + EamBasicWarehouse eamBasicWarehouse = new EamBasicWarehouse(); + BeanUtils.copyProperties(eamBasicWarehouseDto, eamBasicWarehouse); + return eamBasicWarehouseMapper.query(eamBasicWarehouse); + } +} diff --git a/system/src/main/java/com/yyy/system/service/impl/EamBusinessAllocateServiceImpl.java b/system/src/main/java/com/yyy/system/service/impl/EamBusinessAllocateServiceImpl.java new file mode 100644 index 0000000..d76a9da --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/impl/EamBusinessAllocateServiceImpl.java @@ -0,0 +1,72 @@ +package com.yyy.system.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yyy.common.core.domain.entity.UmsUser; +import com.yyy.common.enums.BusinessStatusEnum; +import com.yyy.system.entity.pojo.EamBasicWarehouse; +import com.yyy.system.mapper.EamBasicWarehouseMapper; +import com.yyy.system.mapper.EamBusinessAllocateMapper; +import com.yyy.system.entity.pojo.EamBusinessAllocate; +import com.yyy.system.mapper.UmsUserMapper; +import com.yyy.system.service.EamBusinessAllocateService; +import com.yyy.system.entity.dto.EamBusinessAllocateDto; +import com.yyy.common.utils.bean.BeanUtils; + +import java.util.List; +import java.util.stream.Collectors; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * 调拨信息表(EamBusinessAllocate)表服务实现类 + * + * @author Fangy + * @date 2024-04-11 16:16:13 + */ +@Service +public class EamBusinessAllocateServiceImpl extends ServiceImpl implements EamBusinessAllocateService { + /** + * logger:日志文件 + */ + private static final Logger logger = LoggerFactory.getLogger(EamBusinessAllocateServiceImpl.class); + + @Autowired + private EamBusinessAllocateMapper eamBusinessAllocateMapper; + + @Autowired + private UmsUserMapper userMapper; + + @Autowired + private EamBasicWarehouseMapper warehouseMapper; + + @Override + public List query(EamBusinessAllocateDto eamBusinessAllocateDto) { + EamBusinessAllocate eamBusinessAllocate = new EamBusinessAllocate(); + BeanUtils.copyProperties(eamBusinessAllocateDto, eamBusinessAllocate); + return eamBusinessAllocateMapper.query(eamBusinessAllocate).stream().map(this::joinInfo).collect(Collectors.toList()); + } + + @Override + public EamBusinessAllocate getById(Long id) { + return joinInfo(eamBusinessAllocateMapper.selectById(id)); + } + + @Override + public boolean isCompleted(Long id) { + return eamBusinessAllocateMapper.selectById(id).getStatus().equals(BusinessStatusEnum.COMPLETED.getCode()); + } + + private EamBusinessAllocate joinInfo(EamBusinessAllocate eamBusinessAllocate) { + UmsUser applicant = userMapper.selectById(eamBusinessAllocate.getApplicant()); + EamBasicWarehouse inWarehouse = warehouseMapper.selectById(eamBusinessAllocate.getInWarehouseId()); + EamBasicWarehouse outWarehouse = warehouseMapper.selectById(eamBusinessAllocate.getOutWarehouseId()); + + eamBusinessAllocate.set_applicant(applicant != null ? UmsUser.builder().userId(applicant.getUserId()).userName(applicant.getUserName()).build() : null); + eamBusinessAllocate.set_inWarehouse(inWarehouse != null ? EamBasicWarehouse.builder().warehouseId(inWarehouse.getWarehouseId()).name(inWarehouse.getName()).build() : null); + eamBusinessAllocate.set_outWarehouse(outWarehouse != null ? EamBasicWarehouse.builder().warehouseId(outWarehouse.getWarehouseId()).name(outWarehouse.getName()).build() : null); + return eamBusinessAllocate; + } +} diff --git a/system/src/main/java/com/yyy/system/service/impl/EamBusinessBorrowServiceImpl.java b/system/src/main/java/com/yyy/system/service/impl/EamBusinessBorrowServiceImpl.java new file mode 100644 index 0000000..fdd14b2 --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/impl/EamBusinessBorrowServiceImpl.java @@ -0,0 +1,66 @@ +package com.yyy.system.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yyy.common.core.domain.entity.UmsUser; +import com.yyy.common.enums.BusinessStatusEnum; +import com.yyy.system.mapper.*; +import com.yyy.system.entity.pojo.EamBusinessBorrow; +import com.yyy.system.mapper.EamBusinessBorrowMapper; +import com.yyy.system.service.EamBusinessBorrowService; +import com.yyy.system.entity.dto.EamBusinessBorrowDto; +import com.yyy.common.utils.bean.BeanUtils; + +import java.util.List; +import java.util.stream.Collectors; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * 借用信息表(EamBusinessBorrow)表服务实现类 + * + * @author Fangy + * @date 2024-04-10 17:26:36 + */ +@Service +public class EamBusinessBorrowServiceImpl extends ServiceImpl implements EamBusinessBorrowService { + /** + * logger:日志文件 + */ + private static final Logger logger = LoggerFactory.getLogger(EamBusinessBorrowServiceImpl.class); + + @Autowired + private EamBusinessBorrowMapper eamBusinessBorrowMapper; + + @Autowired + private UmsUserMapper userMapper; + + + @Override + public List query(EamBusinessBorrowDto eamBusinessBorrowDto) { + EamBusinessBorrow eamBusinessBorrow = new EamBusinessBorrow(); + BeanUtils.copyProperties(eamBusinessBorrowDto, eamBusinessBorrow); + return eamBusinessBorrowMapper.query(eamBusinessBorrow).stream().map(this::joinInfo).collect(Collectors.toList()); + } + + @Override + public EamBusinessBorrow getById(Long id) { + return joinInfo(eamBusinessBorrowMapper.selectById(id)); + } + + @Override + public boolean isCompleted(Long id) { + return eamBusinessBorrowMapper.selectById(id).getStatus().equals(BusinessStatusEnum.COMPLETED.getCode()); + } + + private EamBusinessBorrow joinInfo(EamBusinessBorrow e) { + UmsUser useUser = userMapper.selectById(e.getUseUserId()); + UmsUser applicant = userMapper.selectById(e.getApplicant()); + + e.set_useUser(useUser != null ? UmsUser.builder().userId(useUser.getUserId()).userName(useUser.getUserName()).build() : null); + e.set_applicant(applicant != null ? UmsUser.builder().userId(applicant.getUserId()).userName(applicant.getUserName()).build() : null); + return e; + } +} diff --git a/system/src/main/java/com/yyy/system/service/impl/EamBusinessCollectionServiceImpl.java b/system/src/main/java/com/yyy/system/service/impl/EamBusinessCollectionServiceImpl.java new file mode 100644 index 0000000..10e34cf --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/impl/EamBusinessCollectionServiceImpl.java @@ -0,0 +1,103 @@ +package com.yyy.system.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yyy.common.core.domain.entity.UmsOrganization; +import com.yyy.common.core.domain.entity.UmsUser; +import com.yyy.common.enums.BusinessStatusEnum; +import com.yyy.common.enums.EncodingEum; +import com.yyy.common.utils.common.DateUtils; +import com.yyy.system.entity.pojo.EamBasicPosition; +import com.yyy.system.mapper.*; +import com.yyy.system.entity.pojo.EamBusinessCollection; +import com.yyy.system.mapper.EamBusinessCollectionMapper; +import com.yyy.system.service.EamBusinessCollectionService; +import com.yyy.system.entity.dto.EamBusinessCollectionDto; +import com.yyy.common.utils.bean.BeanUtils; + +import java.util.*; +import java.util.stream.Collectors; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; + + +/** + * 资产领用信息表(EamBusinessCollection)表服务实现类 + * + * @author Fangy + * @date 2024-04-12 11:48:09 + */ +@Service +public class EamBusinessCollectionServiceImpl extends ServiceImpl implements EamBusinessCollectionService { + /** + * logger:日志文件 + */ + private static final Logger logger = LoggerFactory.getLogger(EamBusinessCollectionServiceImpl.class); + + @Autowired + private EamBusinessCollectionMapper eamBusinessCollectionMapper; + + @Autowired + private UmsUserMapper userMapper; + + @Autowired + private UmsOrganizationMapper organizationMapper; + + @Autowired + private EamBasicPositionMapper positionMapper; + + @Override + public List query(EamBusinessCollectionDto eamBusinessCollectionDto) { + EamBusinessCollection eamBusinessCollection = new EamBusinessCollection(); + BeanUtils.copyProperties(eamBusinessCollectionDto, eamBusinessCollection); + return eamBusinessCollectionMapper.query(eamBusinessCollection).stream().map(this::joinInfo).collect(Collectors.toList()); + } + + @Override + public EamBusinessCollection getById(Long id) { + return joinInfo(eamBusinessCollectionMapper.selectById(id)); + } + + @Override + public boolean isCompleted(Long id) { + return eamBusinessCollectionMapper.selectById(id).getStatus().equals(BusinessStatusEnum.COMPLETED.getCode()); + } + + @Override + public void formLink(Map variables) { + Long useOrganizationId = 1L; + if (variables.containsKey("INITIATOR")) { + useOrganizationId = organizationMapper.getByUid((Long) variables.get("INITIATOR")).getOrganizationId(); + } + + eamBusinessCollectionMapper.insert(EamBusinessCollection.builder() + .businessId(EncodingEum.COLLECTION.getBusinessId()) + .name(variables.containsKey("title") ? (String) variables.get("title") : "物品领用申请") + .applicant(variables.containsKey("INITIATOR") ? (Long) variables.get("INITIATOR") : null) + .assetIdList(variables.containsKey("assetIdList") ? (String) variables.get("assetIdList") : "[]") + .businessGeneratedDate(variables.containsKey("businessDate") ? DateUtils.parseDate((String) variables.get("businessDate"),"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'") : new Date()) + .notes(variables.containsKey("notes") ? (String) variables.get("notes") : null) + .createUser(variables.containsKey("INITIATOR") ? (Long) variables.get("INITIATOR") : null) + .status(BusinessStatusEnum.APPROVED.getCode()) + .useOrganizationId(useOrganizationId) + .useUserId(variables.containsKey("INITIATOR") ? (Long) variables.get("INITIATOR") : null) + .build()); + + } + + private EamBusinessCollection joinInfo(EamBusinessCollection e) { + UmsOrganization useOrganization = organizationMapper.selectById(e.getUseOrganizationId()); + UmsUser useUser = userMapper.selectById(e.getUseUserId()); + UmsUser applicant = userMapper.selectById(e.getApplicant()); + EamBasicPosition position = positionMapper.selectById(e.getPositionId()); + + e.set_useOrganization(useOrganization != null ? UmsOrganization.builder().organizationId(useOrganization.getOrganizationId()).organizationName(useOrganization.getOrganizationName()).build() : null); + e.set_useUser(useUser != null ? UmsUser.builder().userId(useUser.getUserId()).userName(useUser.getUserName()).build() : null); + e.set_applicant(applicant != null ? UmsUser.builder().userId(applicant.getUserId()).userName(applicant.getUserName()).build() : null); + e.set_position(position != null ? EamBasicPosition.builder().positionId(position.getPositionId()).name(position.getName()).build() : null); + return e; + } + +} diff --git a/system/src/main/java/com/yyy/system/service/impl/EamBusinessOutboundServiceImpl.java b/system/src/main/java/com/yyy/system/service/impl/EamBusinessOutboundServiceImpl.java new file mode 100644 index 0000000..69dcbb1 --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/impl/EamBusinessOutboundServiceImpl.java @@ -0,0 +1,77 @@ +package com.yyy.system.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yyy.common.core.domain.entity.UmsOrganization; +import com.yyy.common.core.domain.entity.UmsUser; +import com.yyy.common.enums.BusinessStatusEnum; +import com.yyy.system.entity.pojo.EamBasicWarehouse; +import com.yyy.system.mapper.*; +import com.yyy.system.entity.pojo.EamBusinessOutbound; +import com.yyy.system.mapper.EamBusinessOutboundMapper; +import com.yyy.system.service.EamBusinessOutboundService; +import com.yyy.system.entity.dto.EamBusinessOutboundDto; +import com.yyy.common.utils.bean.BeanUtils; + +import java.util.List; +import java.util.stream.Collectors; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * 出库信息表(EamBusinessOutbound)表服务实现类 + * + * @author Fangy + * @date 2024-04-10 17:26:37 + */ +@Service +public class EamBusinessOutboundServiceImpl extends ServiceImpl implements EamBusinessOutboundService { + /** + * logger:日志文件 + */ + private static final Logger logger = LoggerFactory.getLogger(EamBusinessOutboundServiceImpl.class); + + @Autowired + private EamBusinessOutboundMapper eamBusinessOutboundMapper; + + @Autowired + private EamBasicWarehouseMapper warehouseMapper; + + @Autowired + private UmsUserMapper userMapper; + + @Autowired + private UmsOrganizationMapper organizationMapper; + + @Override + public List query(EamBusinessOutboundDto eamBusinessOutboundDto) { + EamBusinessOutbound eamBusinessOutbound = new EamBusinessOutbound(); + BeanUtils.copyProperties(eamBusinessOutboundDto, eamBusinessOutbound); + return eamBusinessOutboundMapper.query(eamBusinessOutbound).stream().map(this::joinInfo).collect(Collectors.toList()); + } + + @Override + public EamBusinessOutbound getById(Long id) { + return joinInfo(eamBusinessOutboundMapper.selectById(id)); + } + + @Override + public boolean isCompleted(Long id) { + return eamBusinessOutboundMapper.selectById(id).getStatus().equals(BusinessStatusEnum.COMPLETED.getCode()); + } + + private EamBusinessOutbound joinInfo(EamBusinessOutbound eamBusinessOutbound) { + EamBasicWarehouse warehouse = warehouseMapper.selectById(eamBusinessOutbound.getWarehouseId()); + UmsOrganization ownCompany = organizationMapper.selectById(eamBusinessOutbound.getOwnCompanyId()); + UmsOrganization useOrganization = organizationMapper.selectById(eamBusinessOutbound.getUseOrganizationId()); + UmsUser useUser = userMapper.selectById(eamBusinessOutbound.getUseUserId()); + + eamBusinessOutbound.set_warehouse(warehouse != null ? EamBasicWarehouse.builder().warehouseId(warehouse.getWarehouseId()).name(warehouse.getName()).build() : null); + eamBusinessOutbound.set_ownCompany(ownCompany != null ? UmsOrganization.builder().organizationId(ownCompany.getOrganizationId()).organizationName(ownCompany.getOrganizationName()).build() : null); + eamBusinessOutbound.set_useOrganization(useOrganization != null ? UmsOrganization.builder().organizationId(useOrganization.getOrganizationId()).organizationName(useOrganization.getOrganizationName()).build() : null); + eamBusinessOutbound.set_useUser(useUser != null ? UmsUser.builder().userId(useUser.getUserId()).userName(useUser.getUserName()).build() : null); + return eamBusinessOutbound; + } +} diff --git a/system/src/main/java/com/yyy/system/service/impl/EamBusinessRegistrationServiceImpl.java b/system/src/main/java/com/yyy/system/service/impl/EamBusinessRegistrationServiceImpl.java new file mode 100644 index 0000000..c54d475 --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/impl/EamBusinessRegistrationServiceImpl.java @@ -0,0 +1,52 @@ +package com.yyy.system.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yyy.common.enums.BusinessStatusEnum; +import com.yyy.system.mapper.EamBusinessRegistrationMapper; +import com.yyy.system.entity.pojo.EamBusinessRegistration; +import com.yyy.system.service.EamBusinessRegistrationService; +import com.yyy.system.entity.dto.EamBusinessRegistrationDto; +import com.yyy.common.utils.bean.BeanUtils; + +import java.util.List; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * 资产登记信息表(EamBusinessRegistration)表服务实现类 + * + * @author Fangy + * @date 2024-04-10 13:17:47 + */ +@Service +public class EamBusinessRegistrationServiceImpl extends ServiceImpl implements EamBusinessRegistrationService { + /** + * logger:日志文件 + */ + private static final Logger logger = LoggerFactory.getLogger(EamBusinessRegistrationServiceImpl.class); + + @Autowired + private EamBusinessRegistrationMapper eamBusinessRegistrationMapper; + + @Override + public List query(EamBusinessRegistrationDto eamBusinessRegistrationDto) { + EamBusinessRegistration eamBusinessRegistration = new EamBusinessRegistration(); + BeanUtils.copyProperties(eamBusinessRegistrationDto, eamBusinessRegistration); + return eamBusinessRegistrationMapper.query(eamBusinessRegistration); + } + + @Override + public List query(List assetIdList) { + return eamBusinessRegistrationMapper.selectList(new QueryWrapper().in("asset_id", assetIdList)); + } + + @Override + public boolean update(List idList, BusinessStatusEnum status) { + return eamBusinessRegistrationMapper.update(null, new UpdateWrapper().in("asset_id", idList).set("status",status.getCode())) > 0; + } +} diff --git a/system/src/main/java/com/yyy/system/service/impl/EamBusinessRetirementServiceImpl.java b/system/src/main/java/com/yyy/system/service/impl/EamBusinessRetirementServiceImpl.java new file mode 100644 index 0000000..898d9fc --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/impl/EamBusinessRetirementServiceImpl.java @@ -0,0 +1,88 @@ +package com.yyy.system.service.impl; + +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yyy.common.core.domain.entity.UmsUser; +import com.yyy.common.enums.BusinessStatusEnum; +import com.yyy.common.enums.EncodingEum; +import com.yyy.common.enums.ScrapTypeEnum; +import com.yyy.common.utils.common.DateUtils; +import com.yyy.system.entity.dto.EamWarehouseAssetDto; +import com.yyy.system.mapper.EamBusinessRetirementMapper; +import com.yyy.system.entity.pojo.EamBusinessRetirement; +import com.yyy.system.mapper.UmsUserMapper; +import com.yyy.system.service.EamBusinessRetirementService; +import com.yyy.system.entity.dto.EamBusinessRetirementDto; +import com.yyy.common.utils.bean.BeanUtils; + +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * 资产报废(EamBusinessRetirement)表服务实现类 + * + * @author Fangy + * @date 2024-05-10 10:44:18 + */ +@Service +public class EamBusinessRetirementServiceImpl extends ServiceImpl implements EamBusinessRetirementService { + /** + * logger:日志文件 + */ + private static final Logger logger = LoggerFactory.getLogger(EamBusinessRetirementServiceImpl.class); + + @Autowired + private EamBusinessRetirementMapper eamBusinessRetirementMapper; + + @Autowired + private UmsUserMapper userMapper; + + @Override + public List query(EamBusinessRetirementDto eamBusinessRetirementDto) { + EamBusinessRetirement eamBusinessRetirement = new EamBusinessRetirement(); + BeanUtils.copyProperties(eamBusinessRetirementDto, eamBusinessRetirement); + return eamBusinessRetirementMapper.query(eamBusinessRetirement).stream().map(this::joinInfo).collect(Collectors.toList()); + } + + @Override + public EamBusinessRetirement getById(Long id) { + return joinInfo(eamBusinessRetirementMapper.selectById(id)); + } + + @Override + public boolean isCompleted(Long id) { + return eamBusinessRetirementMapper.selectById(id).getStatus().equals(BusinessStatusEnum.COMPLETED.getCode()); + } + + @Override + public void formLink(Map variables) { + + eamBusinessRetirementMapper.insert(EamBusinessRetirement.builder() + .name(variables.containsKey("title") ? (String) variables.get("title") : "资产设备报废") + .applicant(variables.containsKey("INITIATOR") ? (Long) variables.get("INITIATOR") : null) + .businessGeneratedDate(variables.containsKey("scrapTime") ? DateUtils.parseDate((String) variables.get("scrapTime"),"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'") : new Date()) + .notes(variables.containsKey("notes") ? (String) variables.get("notes") : null) + .attach(variables.containsKey("attach") ? (String) variables.get("attach") : null) + .expeditedStatus(variables.containsKey("urgency") && (variables.get("urgency")).equals(2) ? 1 : 0) + .type(variables.containsKey("scrapType") ? ScrapTypeEnum.getInfoByCode((Integer) variables.get("scrapType")) : null) + .assetIdList(variables.containsKey("assetIdList") ? (String) variables.get("assetIdList") : "[]") + .businessId(EncodingEum.RETIREMENT.getBusinessId()) + .createUser(variables.containsKey("INITIATOR") ? (Long) variables.get("INITIATOR") : null) + .status(BusinessStatusEnum.APPROVED.getCode()) + .build()); + } + + private EamBusinessRetirement joinInfo(EamBusinessRetirement e) { + UmsUser applicant = userMapper.selectById(e.getApplicant()); + e.set_applicant(applicant != null ? UmsUser.builder().userId(applicant.getUserId()).userName(applicant.getUserName()).build() : null); + return e; + } + +} diff --git a/system/src/main/java/com/yyy/system/service/impl/EamBusinessReturnInventoryServiceImpl.java b/system/src/main/java/com/yyy/system/service/impl/EamBusinessReturnInventoryServiceImpl.java new file mode 100644 index 0000000..db0f01a --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/impl/EamBusinessReturnInventoryServiceImpl.java @@ -0,0 +1,81 @@ +package com.yyy.system.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yyy.common.core.domain.entity.UmsOrganization; +import com.yyy.common.core.domain.entity.UmsUser; +import com.yyy.common.enums.BusinessStatusEnum; +import com.yyy.system.entity.pojo.EamBasicPosition; +import com.yyy.system.entity.pojo.EamBasicWarehouse; +import com.yyy.system.mapper.*; +import com.yyy.system.entity.pojo.EamBusinessReturnInventory; +import com.yyy.system.mapper.EamBusinessReturnInventoryMapper; +import com.yyy.system.service.EamBusinessReturnInventoryService; +import com.yyy.system.entity.dto.EamBusinessReturnInventoryDto; +import com.yyy.common.utils.bean.BeanUtils; + +import java.util.List; +import java.util.stream.Collectors; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * 退库信息表(EamBusinessReturnInventory)表服务实现类 + * + * @author Fangy + * @date 2024-04-12 11:10:55 + */ +@Service +public class EamBusinessReturnInventoryServiceImpl extends ServiceImpl implements EamBusinessReturnInventoryService { + /** + * logger:日志文件 + */ + private static final Logger logger = LoggerFactory.getLogger(EamBusinessReturnInventoryServiceImpl.class); + + @Autowired + private EamBusinessReturnInventoryMapper eamBusinessReturnInventoryMapper; + + @Autowired + private EamBasicWarehouseMapper warehouseMapper; + + @Autowired + private EamBasicPositionMapper positionMapper; + + @Autowired + private UmsUserMapper umsUserMapper; + + @Autowired + private UmsOrganizationMapper umsOrganizationMapper; + + @Override + public List query(EamBusinessReturnInventoryDto eamBusinessReturnInventoryDto) { + EamBusinessReturnInventory eamBusinessReturnInventory = new EamBusinessReturnInventory(); + BeanUtils.copyProperties(eamBusinessReturnInventoryDto, eamBusinessReturnInventory); + return eamBusinessReturnInventoryMapper.query(eamBusinessReturnInventory).stream().map(this::joinInfo).collect(Collectors.toList()); + } + + @Override + public EamBusinessReturnInventory getById(Long id) { + return joinInfo(eamBusinessReturnInventoryMapper.selectById(id)); + } + + @Override + public boolean isCompleted(Long id) { + return eamBusinessReturnInventoryMapper.selectById(id).getStatus().equals(BusinessStatusEnum.COMPLETED.getCode()); + } + + private EamBusinessReturnInventory joinInfo(EamBusinessReturnInventory eamBusinessReturnInventory) { + EamBasicWarehouse warehouse = warehouseMapper.selectById(eamBusinessReturnInventory.getWarehouseId()); + UmsUser applicant = umsUserMapper.selectById(eamBusinessReturnInventory.getApplicant()); + UmsOrganization useOrganization = umsOrganizationMapper.selectById(eamBusinessReturnInventory.getUseOrganizationId()); + EamBasicPosition position = positionMapper.selectById(eamBusinessReturnInventory.getPositionId()); + + eamBusinessReturnInventory.set_applicant(applicant != null ? UmsUser.builder().userId(applicant.getUserId()).userName(applicant.getUserName()).build() : null); + eamBusinessReturnInventory.set_warehouse(warehouse != null ? EamBasicWarehouse.builder().warehouseId(warehouse.getWarehouseId()).name(warehouse.getName()).build() : null); + eamBusinessReturnInventory.set_useOrganization(useOrganization != null ? UmsOrganization.builder().organizationId(useOrganization.getOrganizationId()).organizationName(useOrganization.getOrganizationName()).build() : null); + eamBusinessReturnInventory.set_position(position!=null?EamBasicPosition.builder().positionId(position.getPositionId()).name(position.getName()).build() : null); + return eamBusinessReturnInventory; + } +} diff --git a/system/src/main/java/com/yyy/system/service/impl/EamBusinessReturnServiceImpl.java b/system/src/main/java/com/yyy/system/service/impl/EamBusinessReturnServiceImpl.java new file mode 100644 index 0000000..2461cc0 --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/impl/EamBusinessReturnServiceImpl.java @@ -0,0 +1,74 @@ +package com.yyy.system.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yyy.common.core.domain.entity.UmsUser; +import com.yyy.common.enums.BusinessStatusEnum; +import com.yyy.system.entity.pojo.EamBasicPosition; +import com.yyy.system.mapper.EamBasicPositionMapper; +import com.yyy.system.mapper.EamBusinessReturnMapper; +import com.yyy.system.entity.pojo.EamBusinessReturn; +import com.yyy.system.mapper.UmsUserMapper; +import com.yyy.system.service.EamBusinessReturnService; +import com.yyy.system.entity.dto.EamBusinessReturnDto; +import com.yyy.common.utils.bean.BeanUtils; + +import java.util.List; +import java.util.stream.Collectors; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * 归还信息表(EamBusinessReturn)表服务实现类 + * + * @author Fangy + * @date 2024-04-10 17:26:46 + */ +@Service +public class EamBusinessReturnServiceImpl extends ServiceImpl implements EamBusinessReturnService { + /** + * logger:日志文件 + */ + private static final Logger logger = LoggerFactory.getLogger(EamBusinessReturnServiceImpl.class); + + @Autowired + private EamBusinessReturnMapper eamBusinessReturnMapper; + + @Autowired + private UmsUserMapper userMapper; + + @Autowired + private EamBasicPositionMapper positionMapper; + + @Override + public List query(EamBusinessReturnDto eamBusinessReturnDto) { + EamBusinessReturn eamBusinessReturn = new EamBusinessReturn(); + BeanUtils.copyProperties(eamBusinessReturnDto, eamBusinessReturn); + return eamBusinessReturnMapper.query(eamBusinessReturn).stream().map(this::joinInfo).collect(Collectors.toList()); + } + + @Override + public EamBusinessReturn getById(Long id) { + return joinInfo(eamBusinessReturnMapper.selectById(id)); + } + + @Override + public boolean isCompleted(Long id) { + return eamBusinessReturnMapper.selectById(id).getStatus().equals(BusinessStatusEnum.COMPLETED.getCode()); + } + + private EamBusinessReturn joinInfo(EamBusinessReturn e) { + UmsUser applicant = userMapper.selectById(e.getApplicant()); + UmsUser manager = userMapper.selectById(e.getManager()); + UmsUser useUser = userMapper.selectById(e.getUseUserId()); + EamBasicPosition position = positionMapper.selectById(e.getPositionId()); + + e.set_useUser(useUser != null ? UmsUser.builder().userId(useUser.getUserId()).userName(useUser.getUserName()).build() : null); + e.set_applicant(applicant != null ? UmsUser.builder().userId(applicant.getUserId()).userName(applicant.getUserName()).build() : null); + e.set_manager(manager != null ? UmsUser.builder().userId(manager.getUserId()).userName(manager.getUserName()).build() : null); + e.set_position(position != null ? EamBasicPosition.builder().positionId(position.getPositionId()).name(position.getName()).build() : null); + return e; + } +} diff --git a/system/src/main/java/com/yyy/system/service/impl/EamBusinessServiceImpl.java b/system/src/main/java/com/yyy/system/service/impl/EamBusinessServiceImpl.java new file mode 100644 index 0000000..c09d873 --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/impl/EamBusinessServiceImpl.java @@ -0,0 +1,223 @@ +package com.yyy.system.service.impl; + +import com.yyy.common.enums.DetectTypeEnum; +import com.yyy.common.utils.bean.BeanUtils; +import com.yyy.system.entity.dto.*; +import com.yyy.system.entity.pojo.*; +import com.yyy.system.entity.vo.EamBusinessVo; +import com.yyy.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +/** + * 借用信息表(EamBusinessBorrow)表服务实现类 + * + * @author Fangy + * @date 2024-04-10 17:26:36 + */ +@Service +public class EamBusinessServiceImpl implements EamBusinessService { + /** + * logger:日志文件 + */ + private static final Logger logger = LoggerFactory.getLogger(EamBusinessServiceImpl.class); + + @Resource + private EamBusinessAllocateService eamBusinessAllocateService; + + @Resource + private EamBusinessBorrowService eamBusinessBorrowService; + + @Resource + private EamBusinessCollectionService eamBusinessCollectionService; + + @Resource + private EamBusinessOutboundService eamBusinessOutboundService; + + @Resource + private EamBusinessRetirementService eamBusinessRetirementService; + + @Resource + private EamBusinessReturnService eamBusinessReturnService; + + @Resource + private EamBusinessReturnInventoryService eamBusinessReturnInventoryService; + + @Resource + private EamBusinessStorageService eamBusinessStorageService; + + @Resource + private EamBusinessTransferService eamBusinessTransferService; + + @Override + public List query(EamBusinessDto dto) { + if (dto.getType() != null) { + switch (dto.getType()) { + case ALLOCATE: + return queryAllocate(dto); + case BORROW: + return queryBorrow(dto); + case COLLECTION: + return queryCollection(dto); + case OUTBOUND: + return queryOutbound(dto); + case RETIREMENT: + return queryRetirement(dto); + case RETURN_INVENTORY: + return queryReturnInventory(dto); + case RETURN: + return queryReturn(dto); + case STORAGE: + return queryStorage(dto); + case TRANSFER: + return queryTransfer(dto); + default: + return new ArrayList<>(); + } + } else { + // type 为空时,默认查询所有类型的数据 + List list = new ArrayList<>(); + list.addAll(queryAllocate(dto)); + list.addAll(queryBorrow(dto)); + list.addAll(queryCollection(dto)); + list.addAll(queryOutbound(dto)); + list.addAll(queryRetirement(dto)); + list.addAll(queryReturnInventory(dto)); + list.addAll(queryReturn(dto)); + list.addAll(queryTransfer(dto)); + list.addAll(queryStorage(dto)); + return list; + } + } + + List queryAllocate(EamBusinessDto dto) { + EamBusinessAllocateDto eamBusinessAllocateDto = new EamBusinessAllocateDto(); + BeanUtils.copyProperties(dto, eamBusinessAllocateDto); + List list = eamBusinessAllocateService.query(eamBusinessAllocateDto); + return list.stream().map(e -> { + EamBusinessVo vo = new EamBusinessVo(); + BeanUtils.copyProperties(e, vo); + vo.setType(DetectTypeEnum.ALLOCATE); + String applicantName = Optional.ofNullable(e.get_applicant()).map(applicant -> applicant.getUserName()).orElse("Unknown"); + vo.setApplicant(applicantName); + return vo; + }).collect(Collectors.toList()); + } + + List queryBorrow(EamBusinessDto dto) { + EamBusinessBorrowDto _dto = new EamBusinessBorrowDto(); + BeanUtils.copyProperties(dto, _dto); + List list = eamBusinessBorrowService.query(_dto); + return list.stream().map(e -> { + EamBusinessVo vo = new EamBusinessVo(); + BeanUtils.copyProperties(e, vo); + vo.setType(DetectTypeEnum.BORROW); + String applicantName = Optional.ofNullable(e.get_applicant()).map(applicant -> applicant.getUserName()).orElse("Unknown"); + vo.setApplicant(applicantName); + return vo; + }).collect(Collectors.toList()); + } + + List queryCollection(EamBusinessDto dto) { + EamBusinessCollectionDto _dto = new EamBusinessCollectionDto(); + BeanUtils.copyProperties(dto, _dto); + List list = eamBusinessCollectionService.query(_dto); + return list.stream().map(e -> { + EamBusinessVo vo = new EamBusinessVo(); + BeanUtils.copyProperties(e, vo); + vo.setType(DetectTypeEnum.COLLECTION); + String applicantName = Optional.ofNullable(e.get_applicant()).map(applicant -> applicant.getUserName()).orElse("Unknown"); + vo.setApplicant(applicantName); + return vo; + }).collect(Collectors.toList()); + } + + List queryOutbound(EamBusinessDto dto) { + EamBusinessOutboundDto _dto = new EamBusinessOutboundDto(); + BeanUtils.copyProperties(dto, _dto); + List list = eamBusinessOutboundService.query(_dto); + return list.stream().map(e -> { + EamBusinessVo vo = new EamBusinessVo(); + BeanUtils.copyProperties(e, vo); + vo.setType(DetectTypeEnum.OUTBOUND); + String applicantName = Optional.ofNullable(e.get_useUser()).map(applicant -> applicant.getUserName()).orElse("Unknown"); + vo.setApplicant(applicantName); + return vo; + }).collect(Collectors.toList()); + } + + List queryRetirement(EamBusinessDto dto) { + EamBusinessRetirementDto _dto = new EamBusinessRetirementDto(); + BeanUtils.copyProperties(dto, _dto); + List list = eamBusinessRetirementService.query(_dto); + return list.stream().map(e -> { + EamBusinessVo vo = new EamBusinessVo(); + BeanUtils.copyProperties(e, vo); + vo.setType(DetectTypeEnum.RETIREMENT); + String applicantName = Optional.ofNullable(e.get_applicant()).map(applicant -> applicant.getUserName()).orElse("Unknown"); + vo.setApplicant(applicantName); + return vo; + }).collect(Collectors.toList()); + } + + List queryReturnInventory(EamBusinessDto dto) { + EamBusinessReturnInventoryDto _dto = new EamBusinessReturnInventoryDto(); + BeanUtils.copyProperties(dto, _dto); + List list = eamBusinessReturnInventoryService.query(_dto); + return list.stream().map(e -> { + EamBusinessVo vo = new EamBusinessVo(); + BeanUtils.copyProperties(e, vo); + vo.setType(DetectTypeEnum.RETURN_INVENTORY); + String applicantName = Optional.ofNullable(e.get_applicant()).map(applicant -> applicant.getUserName()).orElse("Unknown"); + vo.setApplicant(applicantName); + return vo; + }).collect(Collectors.toList()); + } + + List queryReturn(EamBusinessDto dto) { + EamBusinessReturnDto _dto = new EamBusinessReturnDto(); + BeanUtils.copyProperties(dto, _dto); + List list = eamBusinessReturnService.query(_dto); + return eamBusinessReturnService.query(_dto).stream().map(e -> { + EamBusinessVo vo = new EamBusinessVo(); + BeanUtils.copyProperties(e, vo); + vo.setType(DetectTypeEnum.RETURN); + String applicantName = Optional.ofNullable(e.get_applicant()).map(applicant -> applicant.getUserName()).orElse("Unknown"); + vo.setApplicant(applicantName); + return vo; + }).collect(Collectors.toList()); + } + + List queryStorage(EamBusinessDto dto) { + EamBusinessStorageDto _dto = new EamBusinessStorageDto(); + BeanUtils.copyProperties(dto, _dto); + List list = eamBusinessStorageService.query(_dto); + return list.stream().map(e -> { + EamBusinessVo vo = new EamBusinessVo(); + BeanUtils.copyProperties(e, vo); + vo.setType(DetectTypeEnum.STORAGE); + String applicantName = Optional.ofNullable(e.get_manager()).map(applicant -> applicant.getUserName()).orElse("Unknown"); + return vo; + }).collect(Collectors.toList()); + } + + List queryTransfer(EamBusinessDto dto) { + EamBusinessTransferDto _dto = new EamBusinessTransferDto(); + BeanUtils.copyProperties(dto, _dto); + List list = eamBusinessTransferService.query(_dto); + return list.stream().map(e -> { + EamBusinessVo vo = new EamBusinessVo(); + BeanUtils.copyProperties(e, vo); + vo.setType(DetectTypeEnum.TRANSFER); + String applicantName = Optional.ofNullable(e.get_useUser()).map(applicant -> applicant.getUserName()).orElse("Unknown"); + return vo; + }).collect(Collectors.toList()); + } +} diff --git a/system/src/main/java/com/yyy/system/service/impl/EamBusinessStorageServiceImpl.java b/system/src/main/java/com/yyy/system/service/impl/EamBusinessStorageServiceImpl.java new file mode 100644 index 0000000..39d082c --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/impl/EamBusinessStorageServiceImpl.java @@ -0,0 +1,81 @@ +package com.yyy.system.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yyy.common.core.domain.entity.UmsUser; +import com.yyy.common.enums.BusinessStatusEnum; +import com.yyy.system.entity.pojo.EamBasicPosition; +import com.yyy.system.entity.pojo.EamBasicSupplierVendor; +import com.yyy.system.entity.pojo.EamBasicWarehouse; +import com.yyy.system.mapper.*; +import com.yyy.system.entity.pojo.EamBusinessStorage; +import com.yyy.system.mapper.EamBusinessStorageMapper; +import com.yyy.system.service.EamBusinessStorageService; +import com.yyy.system.entity.dto.EamBusinessStorageDto; +import com.yyy.common.utils.bean.BeanUtils; + +import java.util.List; +import java.util.stream.Collectors; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * 入库信息表(EamBusinessStorage)表服务实现类 + * + * @author Fangy + * @date 2024-04-10 17:26:46 + */ +@Service +public class EamBusinessStorageServiceImpl extends ServiceImpl implements EamBusinessStorageService { + /** + * logger:日志文件 + */ + private static final Logger logger = LoggerFactory.getLogger(EamBusinessStorageServiceImpl.class); + + @Autowired + private EamBusinessStorageMapper eamBusinessStorageMapper; + + @Autowired + private EamBasicWarehouseMapper warehouseMapper; + + @Autowired + private EamBasicPositionMapper positionMapper; + + @Autowired + private EamBasicSupplierVendorMapper supplierVendorMapper; + + @Autowired + private UmsUserMapper umsUserMapper; + + @Override + public List query(EamBusinessStorageDto eamBusinessStorageDto) { + EamBusinessStorage eamBusinessStorage = new EamBusinessStorage(); + BeanUtils.copyProperties(eamBusinessStorageDto, eamBusinessStorage); + return eamBusinessStorageMapper.query(eamBusinessStorage).stream().map(this::joinInfo).collect(Collectors.toList()); + } + + @Override + public EamBusinessStorage getById(Long id) { + return joinInfo(eamBusinessStorageMapper.selectById(id)); + } + + @Override + public boolean isCompleted(Long id) { + return eamBusinessStorageMapper.selectById(id).getStatus().equals(BusinessStatusEnum.COMPLETED.getCode()); + } + + private EamBusinessStorage joinInfo(EamBusinessStorage eamBusinessStorage) { + UmsUser manager = umsUserMapper.selectById(eamBusinessStorage.getManager()); + EamBasicWarehouse warehouse = warehouseMapper.selectById(eamBusinessStorage.getWarehouseId()); + EamBasicPosition position = positionMapper.selectById(eamBusinessStorage.getPositionId()); + EamBasicSupplierVendor supplierVendor = supplierVendorMapper.selectById(eamBusinessStorage.getSupplierVendorId()); + + eamBusinessStorage.set_manager(manager != null ? UmsUser.builder().userId(manager.getUserId()).userName(manager.getUserName()).build() : null); + eamBusinessStorage.set_position(position != null ? EamBasicPosition.builder().positionId(position.getPositionId()).name(position.getName()).build() : null); + eamBusinessStorage.set_supplierVendor(supplierVendor != null ? EamBasicSupplierVendor.builder().supplierVendorId(supplierVendor.getSupplierVendorId()).name(supplierVendor.getName()).build() : null); + eamBusinessStorage.set_warehouse(warehouse != null ? EamBasicWarehouse.builder().warehouseId(warehouse.getWarehouseId()).name(warehouse.getName()).build() : null); + return eamBusinessStorage; + } +} diff --git a/system/src/main/java/com/yyy/system/service/impl/EamBusinessTransferServiceImpl.java b/system/src/main/java/com/yyy/system/service/impl/EamBusinessTransferServiceImpl.java new file mode 100644 index 0000000..abbd8b7 --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/impl/EamBusinessTransferServiceImpl.java @@ -0,0 +1,99 @@ +package com.yyy.system.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yyy.common.core.domain.entity.UmsOrganization; +import com.yyy.common.core.domain.entity.UmsUser; +import com.yyy.common.enums.BusinessStatusEnum; +import com.yyy.common.enums.EncodingEum; +import com.yyy.system.entity.pojo.EamBasicPosition; +import com.yyy.system.mapper.*; +import com.yyy.system.entity.pojo.EamBusinessTransfer; +import com.yyy.system.mapper.EamBusinessTransferMapper; +import com.yyy.system.service.EamBusinessTransferService; +import com.yyy.system.entity.dto.EamBusinessTransferDto; +import com.yyy.common.utils.bean.BeanUtils; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * 资产转移信息表(EamBusinessTransfer)表服务实现类 + * + * @author Fangy + * @date 2024-04-10 17:26:47 + */ +@Service +public class EamBusinessTransferServiceImpl extends ServiceImpl implements EamBusinessTransferService { + /** + * logger:日志文件 + */ + private static final Logger logger = LoggerFactory.getLogger(EamBusinessTransferServiceImpl.class); + + @Autowired + private EamBusinessTransferMapper eamBusinessTransferMapper; + + @Autowired + private UmsOrganizationMapper organizationMapper; + + @Autowired + private UmsUserMapper userMapper; + + @Autowired + private EamBasicPositionMapper positionMapper; + + + @Override + public List query(EamBusinessTransferDto eamBusinessTransferDto) { + EamBusinessTransfer eamBusinessTransfer = new EamBusinessTransfer(); + BeanUtils.copyProperties(eamBusinessTransferDto, eamBusinessTransfer); + return eamBusinessTransferMapper.query(eamBusinessTransfer).stream().map(this::joinInfo).collect(Collectors.toList()); + } + + @Override + public EamBusinessTransfer getById(Long id) { + return joinInfo(eamBusinessTransferMapper.selectById(id)); + } + + @Override + public boolean isCompleted(Long id) { + return eamBusinessTransferMapper.selectById(id).getStatus().equals(BusinessStatusEnum.COMPLETED.getCode()); + } + + @Override + public void formLink(Map variables) { + eamBusinessTransferMapper.insert(EamBusinessTransfer.builder() + .businessId(EncodingEum.TRANSFER.getBusinessId()) + .name(variables.containsKey("title") ? (String) variables.get("title") : "员工资产交接") + .assetIdList(variables.containsKey("assetIdList") ? (String) variables.get("assetIdList") : "[]") + .notes(variables.containsKey("content") ? (String) variables.get("content") : null) + .attach((variables.containsKey("img") ? (String) variables.get("img") : null)) + .createUser(variables.containsKey("INITIATOR") ? (Long) variables.get("INITIATOR") : null) + .status(BusinessStatusEnum.APPROVED.getCode()) + .outUseOrganizationId(variables.containsKey("applyDepartmentId") ? (Long) variables.get("applyDepartmentId") : null) + .inUseOrganizationId(variables.containsKey("handoverDepartmentId") ? (Long) variables.get("handoverDepartmentId") : null) + .useUserId(variables.containsKey("INITIATOR") ? (Long) variables.get("INITIATOR") : null) + .managerId(variables.containsKey("handoverUserId") ? (Long) variables.get("handoverUserId") : null) + .build()); + } + + private EamBusinessTransfer joinInfo(EamBusinessTransfer e) { + UmsOrganization outUseOrganization = organizationMapper.selectById(e.getOutUseOrganizationId()); + UmsOrganization inUseOrganization = organizationMapper.selectById(e.getInUseOrganizationId()); + UmsUser manager = userMapper.selectById(e.getManagerId()); + UmsUser useUser = userMapper.selectById(e.getUseUserId()); + EamBasicPosition position = positionMapper.selectById(e.getPositionId()); + + e.set_outUseOrganization(outUseOrganization != null ? UmsOrganization.builder().organizationId(outUseOrganization.getOrganizationId()).organizationName(outUseOrganization.getOrganizationName()).build() : null); + e.set_inUseOrganization(inUseOrganization != null ? UmsOrganization.builder().organizationId(inUseOrganization.getOrganizationId()).organizationName(inUseOrganization.getOrganizationName()).build() : null); + e.set_useUser(useUser != null ? UmsUser.builder().userId(useUser.getUserId()).userName(useUser.getUserName()).build() : null); + e.set_manager(manager != null ? UmsUser.builder().userId(manager.getUserId()).userName(manager.getUserName()).build() : null); + e.set_position(position != null ? EamBasicPosition.builder().positionId(position.getPositionId()).name(position.getName()).build() : null); + return e; + } +} diff --git a/system/src/main/java/com/yyy/system/service/impl/EamRepairFaultServiceImpl.java b/system/src/main/java/com/yyy/system/service/impl/EamRepairFaultServiceImpl.java new file mode 100644 index 0000000..18f8bee --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/impl/EamRepairFaultServiceImpl.java @@ -0,0 +1,60 @@ +package com.yyy.system.service.impl; + +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yyy.common.enums.BusinessStatusEnum; +import com.yyy.system.entity.dto.EamWarehouseAssetDto; +import com.yyy.system.mapper.EamRepairFaultMapper; +import com.yyy.system.entity.pojo.EamRepairFault; +import com.yyy.system.service.EamRepairFaultService; +import com.yyy.system.entity.dto.EamRepairFaultDto; +import com.yyy.common.utils.bean.BeanUtils; + +import java.util.List; +import java.util.Map; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * 故障信息表(EamRepairFault)表服务实现类 + * + * @author Fangy + * @date 2024-04-12 15:41:31 + */ +@Service +public class EamRepairFaultServiceImpl extends ServiceImpl implements EamRepairFaultService { + /** + * logger:日志文件 + */ + private static final Logger logger = LoggerFactory.getLogger(EamRepairFaultServiceImpl.class); + + @Autowired + private EamRepairFaultMapper eamRepairFaultMapper; + + @Override + public List query(EamRepairFaultDto eamRepairFaultDto) { + EamRepairFault eamRepairFault = new EamRepairFault(); + BeanUtils.copyProperties(eamRepairFaultDto, eamRepairFault); + return eamRepairFaultMapper.query(eamRepairFault); + } + + @Override + public boolean isCompleted(Long id) { + return eamRepairFaultMapper.selectById(id).getStatus().equals(BusinessStatusEnum.COMPLETED.getCode()); + } + + @Override + public void formLink(Map variables) { + eamRepairFaultMapper.insert(EamRepairFault.builder() + .name(variables.containsKey("title") ? (String) variables.get("title") : "员工资产报修") + .img(variables.containsKey("img") ? (String) variables.get("img") : null) + .notes(variables.containsKey("notes") ? (String) variables.get("notes") : null) + .assetIdList(variables.containsKey("assetIdList") ? JSON.toJSONString(JSON.parseArray((String) variables.get("assetIdList"), EamWarehouseAssetDto.class)) : "[]") + .createUser(variables.containsKey("INITIATOR") ? (Long) variables.get("INITIATOR") : null) + .status(BusinessStatusEnum.APPROVED.getCode()) + .build()); + } +} diff --git a/system/src/main/java/com/yyy/system/service/impl/EamRepairServiceImpl.java b/system/src/main/java/com/yyy/system/service/impl/EamRepairServiceImpl.java new file mode 100644 index 0000000..5a5dc08 --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/impl/EamRepairServiceImpl.java @@ -0,0 +1,95 @@ +package com.yyy.system.service.impl; + +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yyy.common.enums.BusinessStatusEnum; +import com.yyy.common.enums.EncodingEum; +import com.yyy.common.utils.common.DateUtils; +import com.yyy.system.entity.dto.EamWarehouseAssetDto; +import com.yyy.system.entity.pojo.EamRepairType; +import com.yyy.system.mapper.EamRepairMapper; +import com.yyy.system.entity.pojo.EamRepair; +import com.yyy.system.mapper.EamRepairTypeMapper; +import com.yyy.system.service.EamRepairService; +import com.yyy.system.entity.dto.EamRepairDto; +import com.yyy.common.utils.bean.BeanUtils; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * 维修登记信息表(EamRepair)表服务实现类 + * + * @author Fangy + * @date 2024-04-12 15:00:38 + */ +@Service +public class EamRepairServiceImpl extends ServiceImpl implements EamRepairService { + /** + * logger:日志文件 + */ + private static final Logger logger = LoggerFactory.getLogger(EamRepairServiceImpl.class); + + @Autowired + private EamRepairMapper eamRepairMapper; + + @Autowired + private EamRepairTypeMapper repairTypeMapper; + + @Override + public List query(EamRepairDto eamRepairDto) { + EamRepair eamRepair = new EamRepair(); + BeanUtils.copyProperties(eamRepairDto, eamRepair); + return eamRepairMapper.query(eamRepair).stream().map(this::joinInfo).collect(Collectors.toList()); + } + + @Override + public EamRepair getById(Long id) { + return joinInfo(eamRepairMapper.selectById(id)); + } + + @Override + public List getByAssetId(Long id) { + return eamRepairMapper.selectList(new QueryWrapper<>()).stream() + .filter(eamRepair -> { + List idList = JSON.parseArray(eamRepair.getAssetIdList(), EamWarehouseAssetDto.class).stream().map(EamWarehouseAssetDto::getAssetId).distinct().collect(Collectors.toList()); + return idList.contains(id); + }) + .map(this::joinInfo) + .collect(Collectors.toList()); + } + + @Override + public boolean isCompleted(Long id) { + return eamRepairMapper.selectById(id).getStatus().equals(BusinessStatusEnum.COMPLETED.getCode()); + } + + @Override + public void formLink(Map variables) { + eamRepairMapper.insert(EamRepair.builder() + .businessId(EncodingEum.REPAIR.getBusinessId()) + .name(variables.containsKey("title") ? (String) variables.get("title") : "设备报修申请") + .assetIdList(variables.containsKey("assetIdList") ? (String) variables.get("assetIdList") : "[]") + .notes(variables.containsKey("content") ? (String) variables.get("content") : null) + .attach((variables.containsKey("img") ? (String) variables.get("img") : null)) + .plannedDate(variables.containsKey("planCompleteTime") ? DateUtils.parseDate((String) variables.get("planCompleteTime"),"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'") : null) + .createUser(variables.containsKey("INITIATOR") ? (Long) variables.get("INITIATOR") : null) + .status(BusinessStatusEnum.APPROVED.getCode()) + .build()); + } + + private EamRepair joinInfo(EamRepair e) { + EamRepairType type = repairTypeMapper.selectById(e.getRepairTypeId()); + e.set_repairType(type != null ? EamRepairType.builder().repairTypeId(type.getRepairTypeId()).name(type.getName()).build() : null); + return e; + } +} diff --git a/system/src/main/java/com/yyy/system/service/impl/EamRepairTypeServiceImpl.java b/system/src/main/java/com/yyy/system/service/impl/EamRepairTypeServiceImpl.java new file mode 100644 index 0000000..345b4f0 --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/impl/EamRepairTypeServiceImpl.java @@ -0,0 +1,35 @@ +package com.yyy.system.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yyy.system.mapper.EamRepairTypeMapper; +import com.yyy.system.entity.pojo.EamRepairType; +import com.yyy.system.mapper.EamRepairTypeMapper; +import com.yyy.system.service.EamRepairTypeService; +import com.yyy.system.entity.dto.EamRepairTypeDto; +import com.yyy.common.utils.bean.BeanUtils; +import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * 保养计划(维修类型)表(EamRepairType)表服务实现类 + * @author Fangy + * @date 2024-04-12 15:00:40 + */ +@Service +public class EamRepairTypeServiceImpl extends ServiceImpl implements EamRepairTypeService { + /** logger:日志文件 */ + private static final Logger logger = LoggerFactory.getLogger(EamRepairTypeServiceImpl.class); + + @Autowired + private EamRepairTypeMapper eamRepairTypeMapper; + + @Override + public List query(EamRepairTypeDto eamRepairTypeDto) { + EamRepairType eamRepairType = new EamRepairType(); + BeanUtils.copyProperties(eamRepairTypeDto, eamRepairType); + return eamRepairTypeMapper.query(eamRepairType); + } +} diff --git a/system/src/main/java/com/yyy/system/service/impl/EamStocktakingDetailsServiceImpl.java b/system/src/main/java/com/yyy/system/service/impl/EamStocktakingDetailsServiceImpl.java new file mode 100644 index 0000000..3bca034 --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/impl/EamStocktakingDetailsServiceImpl.java @@ -0,0 +1,56 @@ +package com.yyy.system.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yyy.system.entity.pojo.EamAsset; +import com.yyy.system.mapper.EamAssetMapper; +import com.yyy.system.mapper.EamStocktakingDetailsMapper; +import com.yyy.system.entity.pojo.EamStocktakingDetails; +import com.yyy.system.service.EamStocktakingDetailsService; +import com.yyy.system.entity.dto.EamStocktakingDetailsDto; +import com.yyy.common.utils.bean.BeanUtils; + +import java.util.List; +import java.util.stream.Collectors; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * 盘点明细(EamStocktakingDetails)表服务实现类 + * + * @author Fangy + * @date 2024-04-12 14:50:46 + */ +@Service +public class EamStocktakingDetailsServiceImpl extends ServiceImpl implements EamStocktakingDetailsService { + /** + * logger:日志文件 + */ + private static final Logger logger = LoggerFactory.getLogger(EamStocktakingDetailsServiceImpl.class); + + @Autowired + private EamStocktakingDetailsMapper eamStocktakingDetailsMapper; + + @Autowired + private EamAssetMapper assetMapper; + + @Override + public List query(EamStocktakingDetailsDto eamStocktakingDetailsDto) { + EamStocktakingDetails eamStocktakingDetails = new EamStocktakingDetails(); + BeanUtils.copyProperties(eamStocktakingDetailsDto, eamStocktakingDetails); + return eamStocktakingDetailsMapper.query(eamStocktakingDetails).stream().map(this::joinInfo).collect(Collectors.toList()); + } + + @Override + public EamStocktakingDetails getById(Long id) { + return joinInfo(eamStocktakingDetailsMapper.selectById(id)); + } + + private EamStocktakingDetails joinInfo(EamStocktakingDetails e) { + EamAsset asset = assetMapper.selectById(e.getAssetId()); + e.set_asset(asset != null ? asset : null); + return e; + } +} diff --git a/system/src/main/java/com/yyy/system/service/impl/EamStocktakingJobServiceImpl.java b/system/src/main/java/com/yyy/system/service/impl/EamStocktakingJobServiceImpl.java new file mode 100644 index 0000000..9731f3f --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/impl/EamStocktakingJobServiceImpl.java @@ -0,0 +1,80 @@ +package com.yyy.system.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yyy.common.core.domain.entity.UmsOrganization; +import com.yyy.common.core.domain.entity.UmsUser; +import com.yyy.system.entity.pojo.*; +import com.yyy.system.mapper.*; +import com.yyy.system.mapper.EamStocktakingJobMapper; +import com.yyy.system.service.EamStocktakingJobService; +import com.yyy.system.entity.dto.EamStocktakingJobDto; +import com.yyy.common.utils.bean.BeanUtils; +import java.util.List; +import java.util.stream.Collectors; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * 盘点任务表(EamStocktakingJob)表服务实现类 + * @author Fangy + * @date 2024-04-12 14:50:46 + */ +@Service +public class EamStocktakingJobServiceImpl extends ServiceImpl implements EamStocktakingJobService { + /** logger:日志文件 */ + private static final Logger logger = LoggerFactory.getLogger(EamStocktakingJobServiceImpl.class); + + @Autowired + private EamStocktakingJobMapper eamStocktakingJobMapper; + + @Autowired + private EamBasicCategoryMapper categoryMapper; + + @Autowired + private EamBasicPositionMapper positionMapper; + + @Autowired + private EamBasicWarehouseMapper warehouseMapper; + + @Autowired + private UmsUserMapper userMapper; + + @Autowired + private UmsOrganizationMapper organizationMapper; + + @Override + public List query(EamStocktakingJobDto eamStocktakingJobDto) { + EamStocktakingJob eamStocktakingJob = new EamStocktakingJob(); + BeanUtils.copyProperties(eamStocktakingJobDto, eamStocktakingJob); + return eamStocktakingJobMapper.query(eamStocktakingJob).stream().map(this::joinInfo).collect(Collectors.toList()); + } + + @Override + public EamStocktakingJob getById(Long id) { + return joinInfo(eamStocktakingJobMapper.selectById(id)); + } + + private EamStocktakingJob joinInfo(EamStocktakingJob e) { + UmsUser head = userMapper.selectById(e.getHead()); + UmsUser stocktakingUser = userMapper.selectById(e.getStocktakingUserId()); + UmsOrganization ownCompany = organizationMapper.selectById(e.getOwnCompanyId()); + UmsOrganization useOrganization = organizationMapper.selectById(e.getUseOrganizationId()); + UmsUser umsUser = userMapper.selectById(e.getUseUserId()); + EamBasicCategory eamBasicCategory = categoryMapper.selectById(e.getCategoryId()); + EamBasicPosition eamBasicPosition = positionMapper.selectById(e.getPositionId()); + EamBasicWarehouse warehouse = warehouseMapper.selectById(e.getWarehouseId()); + + e.set_head(head!=null? UmsUser.builder().userId(head.getUserId()).userName(head.getUserName()).build():null); + e.set_stocktakingUser(stocktakingUser!=null? UmsUser.builder().userId(stocktakingUser.getUserId()).userName(stocktakingUser.getUserName()).build():null); + e.set_warehouse(warehouse!=null?EamBasicWarehouse.builder().warehouseId(warehouse.getWarehouseId()).name(warehouse.getName()).build() : null); + e.set_category(eamBasicCategory != null ? EamBasicCategory.builder().categoryId(eamBasicCategory.getCategoryId()).categoryName(eamBasicCategory.getCategoryName()).build() : null); + e.set_position(eamBasicPosition != null ? EamBasicPosition.builder().positionId(eamBasicPosition.getPositionId()).name(eamBasicPosition.getName()).build() : null); + e.set_ownCompany(ownCompany != null ? UmsOrganization.builder().organizationId(ownCompany.getOrganizationId()).organizationName(ownCompany.getOrganizationName()).build() : null); + e.set_useOrganization(useOrganization != null ? UmsOrganization.builder().organizationId(useOrganization.getOrganizationId()).organizationName(useOrganization.getOrganizationName()).build() : null); + e.set_useUser(umsUser != null ? UmsUser.builder().userId(umsUser.getUserId()).userName(umsUser.getUserName()).build() : null); + return e; + } +} diff --git a/system/src/main/java/com/yyy/system/service/impl/EamStocktakingPlanServiceImpl.java b/system/src/main/java/com/yyy/system/service/impl/EamStocktakingPlanServiceImpl.java new file mode 100644 index 0000000..a83d500 --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/impl/EamStocktakingPlanServiceImpl.java @@ -0,0 +1,81 @@ +package com.yyy.system.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yyy.common.core.domain.entity.UmsOrganization; +import com.yyy.common.core.domain.entity.UmsUser; +import com.yyy.system.entity.pojo.*; +import com.yyy.system.mapper.*; +import com.yyy.system.mapper.EamStocktakingPlanMapper; +import com.yyy.system.service.EamStocktakingPlanService; +import com.yyy.system.entity.dto.EamStocktakingPlanDto; +import com.yyy.common.utils.bean.BeanUtils; +import java.util.List; +import java.util.stream.Collectors; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * 盘点计划信息(EamStocktakingPlan)表服务实现类 + * @author Fangy + * @date 2024-04-12 14:50:46 + */ +@Service +public class EamStocktakingPlanServiceImpl extends ServiceImpl implements EamStocktakingPlanService { + /** logger:日志文件 */ + private static final Logger logger = LoggerFactory.getLogger(EamStocktakingPlanServiceImpl.class); + + @Autowired + private EamStocktakingPlanMapper eamStocktakingPlanMapper; + + @Autowired + private EamBasicCategoryMapper categoryMapper; + + @Autowired + private EamBasicPositionMapper positionMapper; + + @Autowired + private EamBasicWarehouseMapper warehouseMapper; + + @Autowired + private UmsUserMapper userMapper; + + @Autowired + private UmsOrganizationMapper organizationMapper; + + + @Override + public List query(EamStocktakingPlanDto eamStocktakingPlanDto) { + EamStocktakingPlan eamStocktakingPlan = new EamStocktakingPlan(); + BeanUtils.copyProperties(eamStocktakingPlanDto, eamStocktakingPlan); + return eamStocktakingPlanMapper.query(eamStocktakingPlan).stream().map(this::joinInfo).collect(Collectors.toList()); + } + + @Override + public EamStocktakingPlan getById(Long id) { + return joinInfo(eamStocktakingPlanMapper.selectById(id)); + } + + private EamStocktakingPlan joinInfo(EamStocktakingPlan e) { + UmsUser head = userMapper.selectById(e.getHead()); + UmsUser stocktakingUser = userMapper.selectById(e.getStocktakingUserId()); + UmsOrganization ownCompany = organizationMapper.selectById(e.getOwnCompanyId()); + UmsOrganization useOrganization = organizationMapper.selectById(e.getUseOrganizationId()); + UmsUser umsUser = userMapper.selectById(e.getUseUserId()); + EamBasicCategory eamBasicCategory = categoryMapper.selectById(e.getCategoryId()); + EamBasicPosition eamBasicPosition = positionMapper.selectById(e.getPositionId()); + EamBasicWarehouse warehouse = warehouseMapper.selectById(e.getWarehouseId()); + + e.set_head(head!=null? UmsUser.builder().userId(head.getUserId()).userName(head.getUserName()).build():null); + e.set_stocktakingUser(stocktakingUser!=null? UmsUser.builder().userId(stocktakingUser.getUserId()).userName(stocktakingUser.getUserName()).build():null); + e.set_warehouse(warehouse!=null?EamBasicWarehouse.builder().warehouseId(warehouse.getWarehouseId()).name(warehouse.getName()).build() : null); + e.set_category(eamBasicCategory != null ? EamBasicCategory.builder().categoryId(eamBasicCategory.getCategoryId()).categoryName(eamBasicCategory.getCategoryName()).build() : null); + e.set_position(eamBasicPosition != null ? EamBasicPosition.builder().positionId(eamBasicPosition.getPositionId()).name(eamBasicPosition.getName()).build() : null); + e.set_ownCompany(ownCompany != null ? UmsOrganization.builder().organizationId(ownCompany.getOrganizationId()).organizationName(ownCompany.getOrganizationName()).build() : null); + e.set_useOrganization(useOrganization != null ? UmsOrganization.builder().organizationId(useOrganization.getOrganizationId()).organizationName(useOrganization.getOrganizationName()).build() : null); + e.set_useUser(umsUser != null ? UmsUser.builder().userId(umsUser.getUserId()).userName(umsUser.getUserName()).build() : null); + return e; + } +} diff --git a/system/src/main/java/com/yyy/system/service/impl/EamWarehouseAssetServiceImpl.java b/system/src/main/java/com/yyy/system/service/impl/EamWarehouseAssetServiceImpl.java new file mode 100644 index 0000000..1a5e05f --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/impl/EamWarehouseAssetServiceImpl.java @@ -0,0 +1,100 @@ +package com.yyy.system.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yyy.system.mapper.EamWarehouseAssetMapper; +import com.yyy.system.entity.pojo.EamWarehouseAsset; +import com.yyy.system.mapper.EamWarehouseAssetMapper; +import com.yyy.system.service.EamWarehouseAssetService; +import com.yyy.system.entity.dto.EamWarehouseAssetDto; +import com.yyy.common.utils.bean.BeanUtils; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * 库存信息表(EamWarehouseAsset)表服务实现类 + * + * @author Fangy + * @date 2024-05-08 14:00:19 + */ +@Service +public class EamWarehouseAssetServiceImpl extends ServiceImpl implements EamWarehouseAssetService { + /** + * logger:日志文件 + */ + private static final Logger logger = LoggerFactory.getLogger(EamWarehouseAssetServiceImpl.class); + + @Autowired + private EamWarehouseAssetMapper eamWarehouseAssetMapper; + + @Override + public List query(EamWarehouseAssetDto eamWarehouseAssetDto) { + EamWarehouseAsset eamWarehouseAsset = new EamWarehouseAsset(); + BeanUtils.copyProperties(eamWarehouseAssetDto, eamWarehouseAsset); + return eamWarehouseAssetMapper.query(eamWarehouseAsset); + } + + @Override + public boolean add(List list) { + list.forEach(dto -> { + Long warehouseId = dto.getWarehouseId(); + Integer count = dto.getCount(); + + if (warehouseId != null && count != null) { + EamWarehouseAsset asset = EamWarehouseAsset.builder() + .warehouseId(warehouseId) + .assetId(dto.getAssetId()) + .count(count) + .build(); + + if (eamWarehouseAssetMapper.selectCount(new QueryWrapper() + .eq("warehouse_id", warehouseId) + .eq("asset_id", asset.getAssetId())) > 0) { + eamWarehouseAssetMapper.storage(asset); + } else { + eamWarehouseAssetMapper.insert(asset); + } + } + }); + return true; + } + + @Override + public boolean reduceVerify(List list) { + for (EamWarehouseAssetDto dto : list) { + if (dto.getAssetId() == null || dto.getWarehouseId() == null || dto.getCount() == null) { + return false; + } + EamWarehouseAsset asset = eamWarehouseAssetMapper.selectOne(new QueryWrapper() + .eq("warehouse_id", dto.getWarehouseId()) + .eq("asset_id", dto.getAssetId())); + if (asset == null || asset.getCount() < dto.getCount()) { + return false; + } + } + return true; + } + + @Override + public boolean reduce(List list) { + list.forEach(dto -> { + if (dto.getWarehouseId() != null && dto.getCount() != null) { + eamWarehouseAssetMapper.outbound(EamWarehouseAsset.builder() + .warehouseId(dto.getWarehouseId()) + .assetId(dto.getAssetId()) + .count(dto.getCount()) + .build()); + } + }); + return true; + } +} diff --git a/system/src/main/java/com/yyy/system/service/impl/FlFormItemServiceImpl.java b/system/src/main/java/com/yyy/system/service/impl/FlFormItemServiceImpl.java new file mode 100644 index 0000000..0d957db --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/impl/FlFormItemServiceImpl.java @@ -0,0 +1,230 @@ +package com.yyy.system.service.impl; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yyy.common.core.domain.entity.UmsUser; +import com.yyy.common.enums.DetectTypeEnum; +import com.yyy.common.enums.PlanTypeEnum; +import com.yyy.common.utils.common.DateUtils; +import com.yyy.common.utils.common.ServletUtils; +import com.yyy.common.utils.common.StringUtils; +import com.yyy.common.utils.file.ImageUtils; +import com.yyy.common.utils.poi.RichTextUtils; +import com.yyy.common.utils.security.JwtUtils; +import com.yyy.system.entity.bo.JobDefect; +import com.yyy.system.entity.dto.FlFormItemCalendarDto; +import com.yyy.system.entity.dto.WorkReportQueryDto; +import com.yyy.system.entity.vo.*; +import com.yyy.system.mapper.FlFormItemMapper; +import com.yyy.system.entity.pojo.FlFormItem; +import com.yyy.system.service.FlFormItemService; +import com.yyy.system.entity.dto.FlFormItemDto; +import com.yyy.common.utils.bean.BeanUtils; + +import java.awt.image.BufferedImage; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.stream.Collectors; + +import com.yyy.system.service.UmsUserService; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * 流程实例对象(FlFormItem)表服务实现类 + * + * @author Fangy + * @date 2024-04-30 11:25:57 + */ +@Service +public class FlFormItemServiceImpl extends ServiceImpl implements FlFormItemService { + /** + * logger:日志文件 + */ + private static final Logger logger = LoggerFactory.getLogger(FlFormItemServiceImpl.class); + + @Autowired + private FlFormItemMapper flFormItemMapper; + + @Autowired + private JwtUtils jwtUtils; + + @Resource + private UmsUserService umsUserService; + + @Override + public List query(FlFormItemDto flFormItemDto) { + FlFormItem flFormItem = new FlFormItem(); + BeanUtils.copyProperties(flFormItemDto, flFormItem); + return flFormItemMapper.query(flFormItem); + } + + @Override + public boolean update(FlFormItemDto flFormItemDto) { + if (flFormItemDto.getProcInsId() != null && flFormItemDto.getTaskId() != null) { + return flFormItemMapper.update(null, new UpdateWrapper().eq("proc_ins_id", flFormItemDto.getProcInsId()).set("task_id", flFormItemDto.getTaskId()).set("status", flFormItemDto.getStatus())) > 0; + } + if (flFormItemDto.getProcInsId() != null) { + return flFormItemMapper.update(null, new UpdateWrapper().eq("proc_ins_id", flFormItemDto.getProcInsId()).set("status", flFormItemDto.getStatus())) > 0; + } + return false; + } + + @Override + public List calendar(FlFormItemCalendarDto dto) throws ParseException { + QueryWrapper queryWrapper = new QueryWrapper<>(); + + // 如果月份为空,则设置为当前月份 + if (dto.getMonth() == null) { + dto.setMonth(new Date()); + } + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM"); + String yearMonth = sdf.format(dto.getMonth()); + Date startDate = sdf.parse(yearMonth); // yyyy-MM-01 00:00:00 + Date endDate = DateUtils.addMonths(startDate, 1); // 下个月的第一天 + + queryWrapper.like(StringUtils.isNotBlank(dto.getName()), "name", dto.getName()) + .eq(StringUtils.isNotBlank(dto.getJobType()), "form_key", PlanTypeEnum.getByJobGroup(dto.getJobType()).getCode()) + .eq(dto.getStatus() != null && dto.getStatus() >= 0, "status", dto.getStatus()) + .eq(StringUtils.isNotBlank(dto.getCreateType()) && dto.getCreateType().equals("手动创建"), "create_type", "手动创建") + .ne(StringUtils.isNotBlank(dto.getCreateType()) && dto.getCreateType().equals("计划创建"), "create_type", "手动创建") + .between("create_time", startDate, endDate); + + return flFormItemMapper.selectList(queryWrapper); + } + + @Override + public WorkReportVo report(WorkReportQueryDto dto) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.in(dto.getFormKeys() != null && dto.getFormKeys().size() > 0, "form_key", dto.getFormKeys()) + .between(dto.getStartDate() != null && dto.getEndDate() != null, "create_time", dto.getStartDate(), dto.getEndDate()); + List list = flFormItemMapper.selectList(queryWrapper); + + Long uid = Long.parseLong(jwtUtils.parseToken(ServletUtils.getRequest().getHeader("Authorization")).get("uid")); + UmsUser user = umsUserService.getById(uid); + List taskList = list.stream().map(item -> { + JSONObject jsonObject = JSONObject.parseObject(item.getContents()); + int deviceTotal = 0; + int deviceComplete = 0; + if (jsonObject.containsKey("defects")) { + List defects = JSONObject.parseArray(jsonObject.getString("defects"), JobDefect.class); + if (defects != null && defects.size() > 0) { + deviceTotal = defects.size(); + deviceComplete = (int) defects.stream().filter(defect -> defect.getDefectStatus() == 1).count(); + } + } + return WorkReportData.builder() + .formKey(item.getFormKey()) + .taskTypeName(PlanTypeEnum.getInfo(item.getFormKey())) + .taskName(item.getName()) + .deviceTotal(deviceTotal) + .deviceComplete(deviceComplete) + .status(item.getStatus()) + .createTime(item.getCreateTime()).build(); + }).collect(Collectors.toList()); + + return WorkReportVo.builder() + .userName(user != null ? user.getUserName() : null) + .reportType(dto.getReportType()) + .organizationName(user != null ? user.get_umsOrganization() != null ? user.get_umsOrganization().getOrganizationName() : null : null) + .startDate(dto.getStartDate()) + .endDate(dto.getEndDate()) + .taskList(taskList) + .build(); + } + + @Override + public void h52word(String content, String fileName, HttpServletRequest request, HttpServletResponse response) { + try { + StringBuilder sb = new StringBuilder(content); + String tmpContent = sb.toString(); + + // 获取img图片标签 + // 1.Jsoup解析html + Document document = Jsoup.parse(tmpContent); + // 获取所有img图片标签 + Elements imgs = document.getElementsByTag("img"); + int index = 0; + List imgBase64List = new ArrayList<>(); + for (Element element : imgs) { + imgBase64List.add(element.attr("src")); + // 处理特殊符号 + String attrData = element.attr("src"); + // base64编码后可能包含 + 特殊字符,所以需要转义 + attrData = attrData.replaceAll("\\+", "\\\\+"); + tmpContent = tmpContent.replaceAll(attrData, "{{image_src" + index + "}}"); + index++; + } + // 缩放图片大小,然后重新base64编码后替换到富文本内容里面导出word + index = 0; + String[] prefixStr = {"data:image/png;base64,", "data:image/jpeg;base64,"}; // base64编码前缀 + String prefix = null; // base64编码前缀 + + for (String base64 : imgBase64List) { + if (StringUtils.isNotBlank(base64)) { + for (String str : prefixStr) { + base64 = base64.replaceAll(str, ""); + prefix = str; + } + // 缩小图片 + BufferedImage bufferedImage = ImageUtils.bytesToBufferedImage(ImageUtils.base64ToByte(base64)); + if (bufferedImage == null) { + tmpContent = tmpContent.replaceAll("\\{\\{image_src" + index + "}}", ""); + } else { + int height = bufferedImage.getHeight(); + int width = bufferedImage.getWidth(); + // 如果图片宽度大于650,图片缩放 + System.out.println("----" + width + "-----" + height); + if (width > 650) { + //高度等比缩放 + height = (int) (height * 650.0 / width); + BufferedImage imgZoom = ImageUtils.resizeImage(bufferedImage, 650, height); + String imageToBase64 = ImageUtils.imageToBase64(ImageUtils.imageToBytes(imgZoom)); + tmpContent = tmpContent.replaceAll("\\{\\{image_src" + index + "}}", prefix + imageToBase64); + } else { + tmpContent = tmpContent.replaceAll("\\{\\{image_src" + index + "}}", prefix + base64); + } + } + } else { + tmpContent = tmpContent.replaceAll("\\{\\{image_src" + index + "}}", ""); + } + index++; + } + // 执行导出操作 + RichTextUtils.exportHtmlToWord(request, response, tmpContent, fileName); + } catch (Exception e) { + log.error("=========================富文本生成word失败:" + e.getMessage(), e); + } + } + + @Override + public void bigScreenData(EamBigScreenVo vo) { + List list = flFormItemMapper.query(new FlFormItem()); + List deviceKeys = DetectTypeEnum.deviceKeys(); + int deviceTotal = list.stream().filter(item -> deviceKeys.contains(item.getFormKey())).collect(Collectors.toList()).size(); + + List flowCountStatistics = new ArrayList<>(); + flowCountStatistics.add(EamStatisticsVo.builder().name("流程数量").content((list.size()-deviceTotal) + "条").build()); + flowCountStatistics.add(EamStatisticsVo.builder().name("任务数量").content(deviceTotal + "条").build()); + + List flowTypeChart = list.stream().filter(e -> e.getFormKey() != null).collect(Collectors.groupingBy(e -> e.getFormKey(), Collectors.counting())) + .entrySet().stream().map(entry -> new EamChartVo(entry.getValue().intValue(), DetectTypeEnum.getByCode(entry.getKey()).getInfo())).collect(Collectors.toList()); + + vo.setFlowCountStatistics(flowCountStatistics); + vo.setFlowTypeChart(flowTypeChart); + } +} diff --git a/system/src/main/java/com/yyy/system/service/impl/FlFormServiceImpl.java b/system/src/main/java/com/yyy/system/service/impl/FlFormServiceImpl.java new file mode 100644 index 0000000..7e39845 --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/impl/FlFormServiceImpl.java @@ -0,0 +1,74 @@ +package com.yyy.system.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yyy.common.utils.common.CacheUtils; +import com.yyy.system.mapper.FlFormMapper; +import com.yyy.system.entity.pojo.FlForm; +import com.yyy.system.service.FlFormService; +import com.yyy.system.entity.dto.FlFormDto; +import com.yyy.common.utils.bean.BeanUtils; + +import java.util.ArrayList; +import java.util.List; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; + +import javax.annotation.PostConstruct; + +/** + * 流程表单对象(FlForm)表服务实现类 + * + * @author Fangy + * @date 2024-04-23 12:22:45 + */ +@Service +public class FlFormServiceImpl extends ServiceImpl implements FlFormService { + /** + * logger:日志文件 + */ + private static final Logger logger = LoggerFactory.getLogger(FlFormServiceImpl.class); + + @Autowired + private FlFormMapper flFormMapper; + + @PostConstruct + public void init() { + FlForm flForm = new FlForm(); + List flForms = flFormMapper.query(flForm); + + List assetKeys = new ArrayList<>(); + List deviceKeys = new ArrayList<>(); + flForms.forEach(e -> { + CacheUtils.put("form_config", e.getFormKey(), e.getConfig()); + if (e.getType().equals("资管流程")){ + assetKeys.add(e.getFormKey()); + }else if (e.getType().equals("设备流程")){ + deviceKeys.add(e.getFormKey()); + } + }); + CacheUtils.put("pro_def_key_list", "asset", assetKeys); + CacheUtils.put("pro_def_key_list", "device", deviceKeys); + } + + @Override + public List query(FlFormDto flFormDto) { + FlForm flForm = new FlForm(); + BeanUtils.copyProperties(flFormDto, flForm); + List flForms = flFormMapper.query(flForm); + return flForms; + } + + @Override + public FlForm selectByDeployId(String deployId) { + return flFormMapper.selectOne(new QueryWrapper().eq("deploy_id", deployId)); + } + + @Override + public FlForm selectByKey(String key) { + return flFormMapper.selectOne(new QueryWrapper().eq("form_key", key)); + } +} diff --git a/system/src/main/java/com/yyy/system/service/impl/FlListenerServiceImpl.java b/system/src/main/java/com/yyy/system/service/impl/FlListenerServiceImpl.java new file mode 100644 index 0000000..b6b09a6 --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/impl/FlListenerServiceImpl.java @@ -0,0 +1,35 @@ +package com.yyy.system.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yyy.system.mapper.FlListenerMapper; +import com.yyy.system.entity.pojo.FlListener; +import com.yyy.system.mapper.FlListenerMapper; +import com.yyy.system.service.FlListenerService; +import com.yyy.system.entity.dto.FlListenerDto; +import com.yyy.common.utils.bean.BeanUtils; +import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * 流程监听对象(FlListener)表服务实现类 + * @author Fangy + * @date 2024-04-23 12:22:45 + */ +@Service +public class FlListenerServiceImpl extends ServiceImpl implements FlListenerService { + /** logger:日志文件 */ + private static final Logger logger = LoggerFactory.getLogger(FlListenerServiceImpl.class); + + @Autowired + private FlListenerMapper flListenerMapper; + + @Override + public List query(FlListenerDto flListenerDto) { + FlListener flListener = new FlListener(); + BeanUtils.copyProperties(flListenerDto, flListener); + return flListenerMapper.query(flListener); + } +} diff --git a/system/src/main/java/com/yyy/system/service/impl/SysConfigServiceImpl.java b/system/src/main/java/com/yyy/system/service/impl/SysConfigServiceImpl.java new file mode 100644 index 0000000..6403318 --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/impl/SysConfigServiceImpl.java @@ -0,0 +1,35 @@ +package com.yyy.system.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yyy.system.mapper.SysConfigMapper; +import com.yyy.system.entity.pojo.SysConfig; +import com.yyy.system.mapper.SysConfigMapper; +import com.yyy.system.service.SysConfigService; +import com.yyy.system.entity.dto.SysConfigDto; +import com.yyy.common.utils.bean.BeanUtils; +import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * 参数配置表(SysConfig)表服务实现类 + * @author Fangy + * @date 2024-11-01 11:41:13 + */ +@Service +public class SysConfigServiceImpl extends ServiceImpl implements SysConfigService { + /** logger:日志文件 */ + private static final Logger logger = LoggerFactory.getLogger(SysConfigServiceImpl.class); + + @Autowired + private SysConfigMapper sysConfigMapper; + + @Override + public List query(SysConfigDto sysConfigDto) { + SysConfig sysConfig = new SysConfig(); + BeanUtils.copyProperties(sysConfigDto, sysConfig); + return sysConfigMapper.query(sysConfig); + } +} diff --git a/system/src/main/java/com/yyy/system/service/impl/SysDictDataServiceImpl.java b/system/src/main/java/com/yyy/system/service/impl/SysDictDataServiceImpl.java new file mode 100644 index 0000000..44894e4 --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/impl/SysDictDataServiceImpl.java @@ -0,0 +1,49 @@ +package com.yyy.system.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yyy.system.mapper.SysDictDataMapper; +import com.yyy.system.entity.pojo.SysDictData; +import com.yyy.system.service.SysDictDataService; +import com.yyy.system.entity.dto.SysDictDataDto; +import com.yyy.common.utils.bean.BeanUtils; + +import java.util.List; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * 字典数据表(SysDictData)表服务实现类 + * + * @author Fangy + * @date 2024-09-05 16:51:24 + */ +@Service +public class SysDictDataServiceImpl extends ServiceImpl implements SysDictDataService { + /** + * logger:日志文件 + */ + private static final Logger logger = LoggerFactory.getLogger(SysDictDataServiceImpl.class); + + @Autowired + private SysDictDataMapper sysDictDataMapper; + + @Override + public List query(SysDictDataDto sysDictDataDto) { + SysDictData sysDictData = new SysDictData(); + BeanUtils.copyProperties(sysDictDataDto, sysDictData); + return sysDictDataMapper.query(sysDictData); + } + + @Override + public String selectDictLabel(String dictType, String dictValue) { + SysDictData sysDictData = sysDictDataMapper.selectOne(new QueryWrapper().eq("dict_type", dictType).eq("dict_value", dictValue)); + if (sysDictData != null) { + return sysDictData.getDictLabel(); + } + return null; + } +} diff --git a/system/src/main/java/com/yyy/system/service/impl/SysDictTypeServiceImpl.java b/system/src/main/java/com/yyy/system/service/impl/SysDictTypeServiceImpl.java new file mode 100644 index 0000000..170efe1 --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/impl/SysDictTypeServiceImpl.java @@ -0,0 +1,35 @@ +package com.yyy.system.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yyy.system.mapper.SysDictTypeMapper; +import com.yyy.system.entity.pojo.SysDictType; +import com.yyy.system.mapper.SysDictTypeMapper; +import com.yyy.system.service.SysDictTypeService; +import com.yyy.system.entity.dto.SysDictTypeDto; +import com.yyy.common.utils.bean.BeanUtils; +import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * 字典类型表(SysDictType)表服务实现类 + * @author Fangy + * @date 2024-09-05 16:40:30 + */ +@Service +public class SysDictTypeServiceImpl extends ServiceImpl implements SysDictTypeService { + /** logger:日志文件 */ + private static final Logger logger = LoggerFactory.getLogger(SysDictTypeServiceImpl.class); + + @Autowired + private SysDictTypeMapper sysDictTypeMapper; + + @Override + public List query(SysDictTypeDto sysDictTypeDto) { + SysDictType sysDictType = new SysDictType(); + BeanUtils.copyProperties(sysDictTypeDto, sysDictType); + return sysDictTypeMapper.query(sysDictType); + } +} diff --git a/system/src/main/java/com/yyy/system/service/impl/SysFormLogServiceImpl.java b/system/src/main/java/com/yyy/system/service/impl/SysFormLogServiceImpl.java new file mode 100644 index 0000000..b030577 --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/impl/SysFormLogServiceImpl.java @@ -0,0 +1,34 @@ +package com.yyy.system.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yyy.system.mapper.SysFormLogMapper; +import com.yyy.system.entity.pojo.SysFormLog; +import com.yyy.system.service.SysFormLogService; +import com.yyy.system.entity.dto.SysFormLogQuarryDto; +import com.yyy.common.utils.bean.BeanUtils; +import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * 表单记录(SysFormLog)表服务实现类 + * @author Fangy + * @date 2024-10-17 15:40:06 + */ +@Service +public class SysFormLogServiceImpl extends ServiceImpl implements SysFormLogService { + /** logger:日志文件 */ + private static final Logger logger = LoggerFactory.getLogger(SysFormLogServiceImpl.class); + + @Autowired + private SysFormLogMapper sysFormLogMapper; + + @Override + public List query(SysFormLogQuarryDto sysFormLogQuarryDto) { + SysFormLog sysFormLog = new SysFormLog(); + BeanUtils.copyProperties(sysFormLogQuarryDto, sysFormLog); + return sysFormLogMapper.query(sysFormLog); + } +} diff --git a/system/src/main/java/com/yyy/system/service/impl/SysFormTempServiceImpl.java b/system/src/main/java/com/yyy/system/service/impl/SysFormTempServiceImpl.java new file mode 100644 index 0000000..068f066 --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/impl/SysFormTempServiceImpl.java @@ -0,0 +1,35 @@ +package com.yyy.system.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yyy.system.mapper.SysFormTempMapper; +import com.yyy.system.entity.pojo.SysFormTemp; +import com.yyy.system.mapper.SysFormTempMapper; +import com.yyy.system.service.SysFormTempService; +import com.yyy.system.entity.dto.SysFormTempDto; +import com.yyy.common.utils.bean.BeanUtils; +import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * 表单文档模板信息管理(SysFormTemp)表服务实现类 + * @author Fangy + * @date 2024-09-18 11:39:00 + */ +@Service +public class SysFormTempServiceImpl extends ServiceImpl implements SysFormTempService { + /** logger:日志文件 */ + private static final Logger logger = LoggerFactory.getLogger(SysFormTempServiceImpl.class); + + @Autowired + private SysFormTempMapper sysFormTempMapper; + + @Override + public List query(SysFormTempDto sysFormTempDto) { + SysFormTemp sysFormTemp = new SysFormTemp(); + BeanUtils.copyProperties(sysFormTempDto, sysFormTemp); + return sysFormTempMapper.query(sysFormTemp); + } +} diff --git a/system/src/main/java/com/yyy/system/service/impl/SysLogServiceImpl.java b/system/src/main/java/com/yyy/system/service/impl/SysLogServiceImpl.java new file mode 100644 index 0000000..7b5ce91 --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/impl/SysLogServiceImpl.java @@ -0,0 +1,35 @@ +package com.yyy.system.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yyy.system.mapper.SysLogMapper; +import com.yyy.system.entity.pojo.SysLog; +import com.yyy.system.mapper.SysLogMapper; +import com.yyy.system.service.SysLogService; +import com.yyy.system.entity.dto.SysLogDto; +import com.yyy.common.utils.bean.BeanUtils; +import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * 系统日志信息表(SysLog)表服务实现类 + * @author Fangy + * @date 2024-09-24 15:57:56 + */ +@Service +public class SysLogServiceImpl extends ServiceImpl implements SysLogService { + /** logger:日志文件 */ + private static final Logger logger = LoggerFactory.getLogger(SysLogServiceImpl.class); + + @Autowired + private SysLogMapper sysLogMapper; + + @Override + public List query(SysLogDto sysLogDto) { + SysLog sysLog = new SysLog(); + BeanUtils.copyProperties(sysLogDto, sysLog); + return sysLogMapper.query(sysLog); + } +} diff --git a/system/src/main/java/com/yyy/system/service/impl/UmsMenuServiceImpl.java b/system/src/main/java/com/yyy/system/service/impl/UmsMenuServiceImpl.java new file mode 100644 index 0000000..598279e --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/impl/UmsMenuServiceImpl.java @@ -0,0 +1,62 @@ +package com.yyy.system.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yyy.common.core.domain.dto.UmsMenuDto; +import com.yyy.common.utils.common.StringUtils; +import com.yyy.system.mapper.UmsMenuMapper; +import com.yyy.common.core.domain.entity.UmsMenu; +import com.yyy.system.service.UmsMenuService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * 菜单表(UmsMenu)表服务实现类 + * + * @author Fangy + * @date 2024-03-25 15:50:12 + */ +@Service +public class UmsMenuServiceImpl extends ServiceImpl implements UmsMenuService { + /** + * logger:日志文件 + */ + private static final Logger logger = LoggerFactory.getLogger(UmsMenuServiceImpl.class); + + @Autowired + private UmsMenuMapper umsMenuMapper; + + @Override + public Set selectPermsByUserId(Long userId) { + List perms = umsMenuMapper.selectPermsByUserId(userId); + Set permsSet = new HashSet<>(); + for (String perm : perms) { + if (StringUtils.isNotEmpty(perm)) { + permsSet.addAll(Arrays.asList(perm.trim().split(","))); + } + } + return permsSet; + } + + @Override + public List query(UmsMenuDto umsMenuDto) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq(StringUtils.isNotBlank(umsMenuDto.getMenuName()), "menu_name", umsMenuDto.getMenuName()) + .eq(umsMenuDto.getParentId() != null && umsMenuDto.getParentId() != 0, "parent_id", umsMenuDto.getParentId()) + .eq(StringUtils.isNotBlank(umsMenuDto.getMenuType()), "menu_type", umsMenuDto.getMenuType()) + .eq(StringUtils.isNotBlank(umsMenuDto.getPermission()), "permission", umsMenuDto.getPermission()); + return umsMenuMapper.selectList(queryWrapper); + } + + @Override + public List selectPermsByRoleId(Long roleId) { + return umsMenuMapper.selectPermsByRoleId(roleId); + } +} diff --git a/system/src/main/java/com/yyy/system/service/impl/UmsOrganizationServiceImpl.java b/system/src/main/java/com/yyy/system/service/impl/UmsOrganizationServiceImpl.java new file mode 100644 index 0000000..5eaae23 --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/impl/UmsOrganizationServiceImpl.java @@ -0,0 +1,29 @@ +package com.yyy.system.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yyy.system.mapper.UmsOrganizationMapper; +import com.yyy.common.core.domain.entity.UmsOrganization; +import com.yyy.system.service.UmsOrganizationService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * 组织信息表(UmsOrganization)表服务实现类 + * @author Fangy + * @date 2024-04-03 09:47:08 + */ +@Service +public class UmsOrganizationServiceImpl extends ServiceImpl implements UmsOrganizationService { + /** logger:日志文件 */ + private static final Logger logger = LoggerFactory.getLogger(UmsOrganizationServiceImpl.class); + + @Autowired + private UmsOrganizationMapper umsOrganizationMapper; + + @Override + public UmsOrganization getByUid(Long id) { + return umsOrganizationMapper.getByUid(id); + } +} diff --git a/system/src/main/java/com/yyy/system/service/impl/UmsRoleMenuServiceImpl.java b/system/src/main/java/com/yyy/system/service/impl/UmsRoleMenuServiceImpl.java new file mode 100644 index 0000000..3141650 --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/impl/UmsRoleMenuServiceImpl.java @@ -0,0 +1,25 @@ +package com.yyy.system.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yyy.system.mapper.UmsRoleMenuMapper; +import com.yyy.common.core.domain.entity.UmsRoleMenu; +import com.yyy.system.service.UmsRoleMenuService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * 角色权限关联表(UmsRoleMenu)表服务实现类 + * @author Fangy + * @date 2024-04-12 20:46:30 + */ +@Service +public class UmsRoleMenuServiceImpl extends ServiceImpl implements UmsRoleMenuService { + /** logger:日志文件 */ + private static final Logger logger = LoggerFactory.getLogger(UmsRoleMenuServiceImpl.class); + + @Autowired + private UmsRoleMenuMapper umsRoleMenuMapper; + +} diff --git a/system/src/main/java/com/yyy/system/service/impl/UmsRoleServiceImpl.java b/system/src/main/java/com/yyy/system/service/impl/UmsRoleServiceImpl.java new file mode 100644 index 0000000..64e4ef3 --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/impl/UmsRoleServiceImpl.java @@ -0,0 +1,89 @@ +package com.yyy.system.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yyy.common.core.domain.dto.UmsRoleDto; +import com.yyy.common.core.domain.entity.UmsMenu; +import com.yyy.common.core.domain.entity.UmsRole; +import com.yyy.common.utils.common.StringUtils; +import com.yyy.common.core.domain.entity.UmsRoleMenu; +import com.yyy.system.mapper.UmsRoleMapper; +import com.yyy.system.service.UmsMenuService; +import com.yyy.system.service.UmsRoleMenuService; +import com.yyy.system.service.UmsRoleService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 角色表(UmsRole)表服务实现类 + * @author Fangy + * @date 2024-03-25 15:50:12 + */ +@Service +public class UmsRoleServiceImpl extends ServiceImpl implements UmsRoleService { + /** logger:日志文件 */ + private static final Logger logger = LoggerFactory.getLogger(UmsRoleServiceImpl.class); + + @Autowired + private UmsRoleMapper umsRoleMapper; + + @Autowired + private UmsRoleMenuService umsRoleMenuService; + + @Autowired + private UmsMenuService menuService; + + @Override + public Set selectRoleKeys(Long userId) { + List perms = umsRoleMapper.selectRolesByUserId(userId); + Set permsSet = new HashSet<>(); + for (UmsRole perm : perms) + { + if (StringUtils.isNotNull(perm)) + { + permsSet.addAll(Arrays.asList(perm.getRoleKey().trim().split(","))); + } + } + return permsSet; + } + + @Override + public List query(UmsRoleDto umsRoleDto) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq(StringUtils.isNotBlank(umsRoleDto.getRoleKey()),"role_key",umsRoleDto.getRoleKey()) + .eq(StringUtils.isNotBlank(umsRoleDto.getRoleName()),"role_name",umsRoleDto.getRoleName()) + .eq(StringUtils.isNotBlank(umsRoleDto.getStatus()),"status",umsRoleDto.getStatus()); + return umsRoleMapper.selectList(queryWrapper).stream().map(this::joinInfo).collect(Collectors.toList()); + } + + @Override + public Long selectLatestPrimaryKey() { + return umsRoleMapper.selectOne(new QueryWrapper().orderByDesc("create_time").last("limit 1")).getRoleId(); + } + + @Override + public boolean bindMenu(Long roleId, List menuIds) { + Map map= new HashMap<>(); + map.put("role_id",roleId); + umsRoleMenuService.removeByMap(map); + List list = new ArrayList<>(); + menuIds.forEach(e->{list.add(UmsRoleMenu.builder().roleId(roleId).menuId(e).build());}); + return umsRoleMenuService.saveBatch(list); + } + + @Override + public UmsRole getById(Long id) { + return joinInfo(umsRoleMapper.selectById(id)); + } + + private UmsRole joinInfo(UmsRole role){ + List menus = menuService.selectPermsByRoleId(role.getRoleId()); + role.set_menus(menus); + return role; + } +} diff --git a/system/src/main/java/com/yyy/system/service/impl/UmsUserServiceImpl.java b/system/src/main/java/com/yyy/system/service/impl/UmsUserServiceImpl.java new file mode 100644 index 0000000..826124c --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/impl/UmsUserServiceImpl.java @@ -0,0 +1,187 @@ +package com.yyy.system.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yyy.common.core.domain.dto.UmsUserAddDto; +import com.yyy.common.core.domain.dto.UmsUserQueryDto; +import com.yyy.common.core.domain.entity.*; +import com.yyy.common.utils.common.MD5Utils; +import com.yyy.common.utils.common.StringUtils; +import com.yyy.system.mapper.*; +import com.yyy.system.service.UmsUserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 用户表(UmsUser)表服务实现类 + * + * @author Fangy + * @date 2024-03-22 17:31:35 + */ +@Service +public class UmsUserServiceImpl extends ServiceImpl implements UmsUserService { + /** + * logger:日志文件 + */ + private static final Logger logger = LoggerFactory.getLogger(UmsUserServiceImpl.class); + + @Autowired + private UmsUserMapper userMapper; + + @Autowired + private UmsOrganizationMapper umsOrganizationMapper; + + @Autowired + private UmsRoleMapper umsRoleMapper; + + @Autowired + private UmsUserOrganizationMapper umsUserOrganizationMapper; + + @Autowired + private UmsUserRoleMapper umsUserRoleMapper; + + + @Override + public boolean checkLoginNameUnique(Long userId, String loginName) { + List userList = userMapper.selectList(new QueryWrapper().eq("login_name", loginName).eq("is_deleted", 0)); + return userList.isEmpty() || (userId != null && userList.size() == 1 && userList.get(0).getUserId().equals(userId)) ? true : false; + } + + @Override + public boolean checkPhoneUnique(Long userId, String phone) { + List userList = userMapper.selectList(new QueryWrapper().eq("phone", phone).eq("is_deleted", 0)); + return userList.isEmpty() || (userId != null && userList.size() == 1 && userList.get(0).getUserId().equals(userId)) ? true : false; + } + + @Override + public boolean checkEmailUnique(Long userId, String email) { + List userList = userMapper.selectList(new QueryWrapper().eq("email", email).eq("is_deleted", 0)); + return userList.isEmpty() || (userId != null && userList.size() == 1 && userList.get(0).getUserId().equals(userId)) ? true : false; + } + + @Override + public List list(UmsUserQueryDto umsUserDto) { + if (!umsUserDto.isTree()) { + return userMapper.query(umsUserDto); + } else if (umsUserDto.getOrganizationId() != null) { + List umsOrganizationList = umsOrganizationMapper.selectList(new QueryWrapper<>()); + List result = new ArrayList<>(); + findOrganizationsByRootId(umsOrganizationList, umsUserDto.getOrganizationId()).forEach(e -> { + umsUserDto.setOrganizationId(e.getOrganizationId()); + result.addAll(userMapper.query(umsUserDto)); + }); + return result.stream().map(this::joinInfo).collect(Collectors.toList()); + } else { + return null; + } + } + + @Override + public UmsUser getById(Long id) { + return joinInfo(userMapper.selectById(id)); + } + + @Override + public List listByIds(List ids) { + return userMapper.selectBatchIds(ids).stream().map(this::joinInfo).collect(Collectors.toList()); + } + + @Override + public boolean update(UmsUserAddDto umsUserAddDto, Long updateUser) { + UpdateWrapper umsUserUpdateWrapper = new UpdateWrapper<>(); + String salt = MD5Utils.randomSalt(); + umsUserUpdateWrapper.eq("user_id", umsUserAddDto.getUserId()) + .set(StringUtils.isNotBlank(umsUserAddDto.getLoginName()), "login_name", umsUserAddDto.getLoginName()) + .set(StringUtils.isNotBlank(umsUserAddDto.getUserName()), "user_name", umsUserAddDto.getUserName()) + .set(StringUtils.isNotBlank(umsUserAddDto.getEmail()), "email", umsUserAddDto.getEmail()) + .set(StringUtils.isNotBlank(umsUserAddDto.getPhone()), "phone", umsUserAddDto.getPhone()) + .set(StringUtils.isNotBlank(umsUserAddDto.getStatus()), "status", umsUserAddDto.getStatus()) + .set(StringUtils.isNotBlank(umsUserAddDto.getPassword()), "password", MD5Utils.inputPassToDBPass(umsUserAddDto.getPassword(), salt)) + .set(StringUtils.isNotBlank(umsUserAddDto.getPassword()), "salt", salt) + .set(StringUtils.isNotBlank(umsUserAddDto.getSex()), "sex", umsUserAddDto.getSex()) + .set(StringUtils.isNotBlank(umsUserAddDto.getAvatar()), "avatar", umsUserAddDto.getAvatar()) + .set("update_user", updateUser); + return userMapper.update(null, umsUserUpdateWrapper) > 0; + } + + @Override + public boolean bindPost(Long userId, Long postId) { + return umsUserOrganizationMapper.insert(UmsUserOrganization.builder().userId(userId).organizationId(postId).build()) > 0; + } + + @Override + public boolean unbindPost(Long id) { + return umsUserOrganizationMapper.delete(new QueryWrapper().eq("user_id", id)) > 0; + } + + @Override + public boolean unbindPost(List userIds) { + return umsUserOrganizationMapper.delete(new QueryWrapper().in("user_id", userIds)) > 0; + } + + @Override + public boolean bindRole(Long userId, Long roleId) { + return umsUserRoleMapper.insert(UmsUserRole.builder().userId(userId).roleId(roleId).build()) > 0; + } + + @Override + public boolean unbindRole(List userIds) { + return umsUserRoleMapper.delete(new QueryWrapper().in("user_id", userIds)) > 0; + } + + @Override + public boolean unbindRole(Long id) { + return umsUserRoleMapper.delete(new QueryWrapper().eq("user_id", id)) > 0; + } + + @Override + public Long selectLatestPrimaryKey() { + return userMapper.selectOne(new QueryWrapper().orderByDesc("user_id").last("limit 1")).getUserId(); + } + + private UmsUser joinInfo(UmsUser user) { + if (user == null) { + return null; + } + UmsOrganization organization = umsOrganizationMapper.getByUid(user.getUserId()); + UmsRole role = umsRoleMapper.selectRolesByUserId(user.getUserId()).stream().findAny().orElse(null); + user.set_umsOrganization(organization != null ? UmsOrganization.builder().organizationId(organization.getOrganizationId()).organizationName(organization.getOrganizationName()).build() : null); + user.set_umsRole(role != null ? UmsRole.builder().roleId(role.getRoleId()).roleName(role.getRoleName()).build() : null); + return user; + } + + public List findOrganizationsByRootId(List umsOrganizationList, Long rootId) { + List result = new ArrayList<>(); + // 找到 organizationId 为 rootId 的组织对象 + UmsOrganization rootOrganization = umsOrganizationList.stream() + .filter(org -> org.getOrganizationId().equals(rootId)) + .findFirst() + .orElse(null); + + if (rootOrganization != null) { + result.add(rootOrganization); + findChildrenOrganizations(umsOrganizationList, rootOrganization.getOrganizationId(), result); + } + + return result; + } + + private void findChildrenOrganizations(List umsOrganizationList, Long parentId, List result) { + List children = umsOrganizationList.stream() + .filter(org -> org.getParentId() != null && org.getParentId().equals(parentId)) + .collect(Collectors.toList()); + + for (UmsOrganization child : children) { + result.add(child); + findChildrenOrganizations(umsOrganizationList, child.getOrganizationId(), result); + } + } + +} diff --git a/system/src/main/java/com/yyy/system/service/impl/WordExportServiceImpl.java b/system/src/main/java/com/yyy/system/service/impl/WordExportServiceImpl.java new file mode 100644 index 0000000..a724008 --- /dev/null +++ b/system/src/main/java/com/yyy/system/service/impl/WordExportServiceImpl.java @@ -0,0 +1,265 @@ +package com.yyy.system.service.impl; + +import com.yyy.common.core.domain.Result; +import com.yyy.common.core.domain.ResultCode; +import com.yyy.common.enums.WordContentTypeEnum; +import com.yyy.common.enums.WordPluginsTypeEnum; +import com.yyy.common.form.FieldData; +import com.yyy.common.utils.common.DateUtils; +import com.yyy.common.utils.file.FileTypeUtils; +import com.yyy.common.utils.poi.FormData; +import com.yyy.common.utils.poi.FormMetaData; +import com.yyy.common.utils.poi.FormExportUtils; +import com.yyy.system.entity.dto.WorkReportGenerateDto; +import com.yyy.system.entity.word.form.RepairForm; +import com.yyy.system.service.WordExportService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.core.io.ClassPathResource; +import org.springframework.core.io.FileSystemResource; +import org.springframework.stereotype.Service; +import org.springframework.util.StreamUtils; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +@Service +public class WordExportServiceImpl implements WordExportService { + private static final Logger logger = LoggerFactory.getLogger(WordExportServiceImpl.class); + + @Override + public boolean generateCharts(FormData data, String title, HttpServletResponse response) { + FormExportUtils formExportUtils = new FormExportUtils<>(FormData.class); + File templateFile = new FileSystemResource(data.getTemplatePath()).getFile(); + List dataList = data.getFormValue(); + dataList.add(FormMetaData.builder().key("businessId").name("编号").value(data.getFormKey()).contentType(WordContentTypeEnum.TEXT).pluginsType(WordPluginsTypeEnum.Default).build()); + dataList.add(FormMetaData.builder().key("title").name("标题").value(data.getFormName()).contentType(WordContentTypeEnum.TEXT).pluginsType(WordPluginsTypeEnum.Default).build()); + try { + formExportUtils.export(response, templateFile, data.getFormValue(), title); + return true; + } catch (Exception e) { + logger.error("导出文件失败", e); + return false; + } + } + + @Override + public boolean generatePDF(FormData data, String title, HttpServletResponse response) { + FormExportUtils formExportUtils = new FormExportUtils<>(FormData.class); + File templateFile = new FileSystemResource(data.getTemplatePath()).getFile(); + List dataList = data.getFormValue(); + dataList.add(FormMetaData.builder().key("businessId").name("编号").value(data.getFormKey()).contentType(WordContentTypeEnum.TEXT).pluginsType(WordPluginsTypeEnum.Default).build()); + dataList.add(FormMetaData.builder().key("title").name("标题").value(data.getFormName()).contentType(WordContentTypeEnum.TEXT).pluginsType(WordPluginsTypeEnum.Default).build()); + try { + formExportUtils.exportPDF(response, templateFile, data.getFormValue(), title); + return true; + } catch (Exception e) { + logger.error("导出文件失败:" + e.getMessage(), e); + return false; + } + } + + @Override + public boolean generateCharts(RepairForm data, String title) { + if (FileTypeUtils.getFileType(data.getTemplatePath()).equals("docx")) { + FormExportUtils formExportUtils = new FormExportUtils<>(RepairForm.class); + File templateFile = new FileSystemResource(data.getTemplatePath()).getFile(); + formExportUtils.exportWord(templateFile, data, title); + return true; + } + return false; + } + + @Override + public boolean generateCharts(String templatePath, String title, String formKey, String formName, List list, HttpServletResponse response) { + FormData formData = new FormData(); + formData.setFormKey(formKey); + formData.setFormName(formName); + formData.setTemplatePath(templatePath); + + String fileType = FileTypeUtils.getFileType(templatePath); + if (fileType == null) { + return false; + } + formData.setFormValue(list.stream().map(item -> buildFormMetaData(item, fileType)).collect(Collectors.toList())); + return generateCharts(formData, title, response); + } + + @Override + public boolean generateChartMap(String templatePath, String title, String formKey, Map> map, HttpServletResponse response) { + String fileType = FileTypeUtils.getFileType(templatePath); + if (fileType == null) { + logger.error("Unsupported file type for templatePath: {}", templatePath); + return false; + } + + switch (fileType.toLowerCase()) { + case "docx": + return generateDocxZip(templatePath, title, map, response); + case "xls": + case "xlsx": + // TODO: 实现 Excel 文件的生成逻辑 + logger.warn("Excel file generation not implemented yet."); + break; + default: + logger.error("Unsupported file type: {}", fileType); + } + return false; + } + + @Override + public boolean generatePDF(String templatePath, String title, String formKey, String formName, List list, HttpServletResponse response) { + FormData formData = new FormData(); + formData.setFormKey(formKey); + formData.setFormName(formName); + formData.setTemplatePath(templatePath); + + String fileType = FileTypeUtils.getFileType(templatePath); + if (fileType == null) { + return false; + } + List formValue = list.stream() + .map(item -> buildFormMetaData(item, fileType)) + .collect(Collectors.toList()); + formData.setFormValue(formValue); + if ("doc".equals(fileType) || "docx".equals(fileType)) { + generatePDF(formData, title, response); + } else if ("xls".equals(fileType) || "xlsx".equals(fileType)) { + generateCharts(formData, title, response); + } + return true; + } + + + private FormMetaData buildFormMetaData(FieldData item, String fileType) { + WordContentTypeEnum contentType = WordContentTypeEnum.TEXT; + WordPluginsTypeEnum pluginsType = WordPluginsTypeEnum.Default; + + switch (item.getType()) { + case RADIO: + if ("doc".equals(fileType) || "docx".equals(fileType)) { + contentType = WordContentTypeEnum.SECTION; + } else if ("xls".equals(fileType) || "xlsx".equals(fileType)) { + // todo: xlsx表格 单选 不支持? + } + break; + case LIST: + if ("doc".equals(fileType) || "docx".equals(fileType)) { + contentType = WordContentTypeEnum.LoopRowTable; + pluginsType = WordPluginsTypeEnum.LoopRowTable; + } else if ("xls".equals(fileType) || "xlsx".equals(fileType)) { + contentType = WordContentTypeEnum.ExcelList; + } + break; + // 可以根据需要添加更多类型的处理 + default: + // 处理默认或其他类型 + break; + } + + return FormMetaData.builder() + .key(item.getKey()) + .name(item.getName()) + .value(item.getValue()) + .contentType(contentType) + .pluginsType(pluginsType) + .sort(item.getSort()) + .build(); + } + + /** + * 生成包含多个 DOCX 文件的 ZIP 并写入响应 + */ + private boolean generateDocxZip(String templatePath, String title, + Map> dataMap, + HttpServletResponse response) { + response.setContentType("application/zip"); + String zipFileName = title + ".zip"; + try { + String encodedFileName = URLEncoder.encode(zipFileName, StandardCharsets.UTF_8.toString()) + .replaceAll("\\+", "%20"); + response.setHeader("Content-Disposition", "attachment; filename*=UTF-8''" + encodedFileName); + + // 使用 try-with-resources 确保 ZipOutputStream 被正确关闭 + try (ZipOutputStream zos = new ZipOutputStream(response.getOutputStream())) { + File templateFile = new FileSystemResource(templatePath).getFile(); + if (!templateFile.exists() || !templateFile.isFile()) { + throw new FileNotFoundException("模板文件未找到: " + templatePath); + } + FormExportUtils formExportUtils = new FormExportUtils<>(FormData.class); + + for (Map.Entry> entry : dataMap.entrySet()) { + String key = entry.getKey(); + List fieldDataList = entry.getValue(); + + String fileName = key + ".docx"; + List formMetaDataList = fieldDataList.stream() + .map(item -> buildFormMetaData(item, "docx")) + .collect(Collectors.toList()); + + // 临时存储生成的 DOCX 文件内容 + try (ByteArrayOutputStream byteOutStream = new ByteArrayOutputStream()) { + formExportUtils.export(byteOutStream, templateFile, formMetaDataList, title); + byteOutStream.flush(); + + byte[] docxBytes = byteOutStream.toByteArray(); + + // 创建新的 ZIP 条目并写入内容 + ZipEntry zipEntry = new ZipEntry(fileName); + zos.putNextEntry(zipEntry); + zos.write(docxBytes); + zos.closeEntry(); + } catch (IOException e) { + logger.error("Error generating DOCX for key {}: {}", key, e.getMessage(), e); + // 可以选择是否继续生成其他文件或中断 + throw e; // 这里选择抛出异常以中断整个过程 + } + } + zos.finish(); + zos.flush(); + return true; + } + + } catch (IOException e) { + logger.error("Error generating ZIP file: {}", e.getMessage(), e); + try { + response.reset(); + response.setContentType("application/json"); + response.setStatus(ResultCode.system_error.getCode()); + try (PrintWriter writer = response.getWriter()) { + Result result = new Result(ResultCode.system_error, "生成失败:" + e.getMessage()); + writer.write(result.toString()); + writer.flush(); + } + } catch (IOException ex) { + logger.error("Error sending error response: {}", ex.getMessage(), ex); + } + return false; + } + } + +// @Override +// public boolean generateWorkReport(WorkReportGenerateDto dto, HttpServletResponse response) { +// FormData formData = new FormData(); +// formData.setFormKey(""); +// formData.setFormName(""); +// formData.setTemplatePath("E:/data/test.docx"); +// List list = new ArrayList<>(); +// list.add(FormMetaData.builder().key("startDate").name("开始时间").value(DateUtils.parseDateToStr("yyyy-MM-dd", dto.getStartDate())).contentType(WordContentTypeEnum.TEXT).pluginsType(WordPluginsTypeEnum.Default).sort(0).build()); +// list.add(FormMetaData.builder().key("endDate").name("结束时间").value(DateUtils.parseDateToStr("yyyy-MM-dd", dto.getEndDate())).contentType(WordContentTypeEnum.TEXT).pluginsType(WordPluginsTypeEnum.Default).sort(0).build()); +// list.add(FormMetaData.builder().key("workOverview").name("当期工作概述").value(dto.getWorkOverview()).contentType(WordContentTypeEnum.TEXT).pluginsType(WordPluginsTypeEnum.Default).sort(0).build()); +// list.add(FormMetaData.builder().key("workPlan").name("工作计划").value(dto.getWorkPlan()).contentType(WordContentTypeEnum.TEXT).pluginsType(WordPluginsTypeEnum.Default).sort(0).build()); +// +// +// formData.setFormValue(list.stream().map(item -> buildFormMetaData(item, fileType)).collect(Collectors.toList())); +// return generateCharts(formData, title, response); +// } +} diff --git a/system/src/main/resources/mapper/EamAssetLogMapper.xml b/system/src/main/resources/mapper/EamAssetLogMapper.xml new file mode 100644 index 0000000..81609b6 --- /dev/null +++ b/system/src/main/resources/mapper/EamAssetLogMapper.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + id + , create_user, create_time, update_user, update_time, is_deleted, business_id, operation_type, operation_notes, asset_id + + + + + + diff --git a/system/src/main/resources/mapper/EamAssetMapper.xml b/system/src/main/resources/mapper/EamAssetMapper.xml new file mode 100644 index 0000000..3dcbd6a --- /dev/null +++ b/system/src/main/resources/mapper/EamAssetMapper.xml @@ -0,0 +1,563 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + asset_id + , asset_code, name, category_id, warehouse_id, own_company_id, status, use_organization_id, source_id, manager, supplier_vendor_id, manufacturers_vendor_id, model, serial_number, use_user_id, purpose, position_id, unit, position_detail, notes, attachment, maintenance_vendor, contactor, maintenance_start_date, maintenance_status, contact, maintenance_end_date, responsible_person, maintenance_type, suggest_maintenance_type, maintenance_notes, maintenance_attachment, financial_category_id, expense_item, total_amount_price, customer_info, tax_amount_rate, register_date, financial_option, nav_price, residuals_rate, financial_notes, financial_attachment, create_user, create_time, update_user, update_time, is_deleted, ext_info, img, user_manual, maintenance_manual + + + + a + . + asset_id + , a.asset_code, a.name, a.category_id, a.warehouse_id, a.own_company_id, a.status, a.use_organization_id, a.source_id, a.manager, a.supplier_vendor_id, a.manufacturers_vendor_id, a.model, a.serial_number, a.use_user_id, a.purpose, a.position_id, a.unit, a.position_detail, a.notes, a.attachment, a.maintenance_vendor, a.contactor, a.maintenance_start_date, a.maintenance_status, a.contact, a.maintenance_end_date, a.responsible_person, a.maintenance_type, a.suggest_maintenance_type, a.maintenance_notes, a.maintenance_attachment, a.financial_category_id, a.expense_item, a.total_amount_price, a.customer_info, a.tax_amount_rate, a.register_date, a.financial_option, a.nav_price, a.residuals_rate, a.financial_notes, a.financial_attachment, a.create_user, a.create_time, a.update_user, a.update_time, a.is_deleted,a.ext_info,a.img,a.user_manual, a.maintenance_manual, + c.category_id, c.category_name, c.upper_limit, c.lower_limit, c.safety_limit, + o1.organization_id as own_company_id, o1.organization_name as own_company_name, + o2.organization_id as use_organization_id, o2.organization_name as use_organization_name, + u1.user_id as manager, u1.user_name as manager_name, + manufacturers.manufacturers_vendor_id, manufacturers.name as manufacturers_name, + u2.user_id as use_user_id, u2.user_name as use_user_name, + p.position_id, p.name as position_name, + maintenance.maintenance_vendor_id, maintenance.name as maintenance_name, + supplier.supplier_vendor_id, supplier.name as supplier_name, + fc.financial_category_id, fc.financial_category_name, fc.use_terms + + + + + + + + + + + + + + + INSERT INTO eam_asset_spare_parts (asset_id, spare_parts_id) + VALUES (#{assetId}, #{sparePartsId}); + + + + + + DELETE + FROM eam_asset_spare_parts + WHERE asst_id = #{assetId} + and spare_parts_id = #{sparePartsId}); + + diff --git a/system/src/main/resources/mapper/EamBasicCategoryMapper.xml b/system/src/main/resources/mapper/EamBasicCategoryMapper.xml new file mode 100644 index 0000000..5dd7212 --- /dev/null +++ b/system/src/main/resources/mapper/EamBasicCategoryMapper.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + category_id + , category_name, depth, parent_id, upper_limit, lower_limit, safety_limit, create_user, create_time, update_user, update_time, is_deleted, asset_ext_temp + + + + + + diff --git a/system/src/main/resources/mapper/EamBasicFinancialCategoryMapper.xml b/system/src/main/resources/mapper/EamBasicFinancialCategoryMapper.xml new file mode 100644 index 0000000..cf77e48 --- /dev/null +++ b/system/src/main/resources/mapper/EamBasicFinancialCategoryMapper.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + financial_category_id + , financial_category_name, depth, parent_id, use_terms, notes, create_user, create_time, update_user, update_time, is_deleted + + + + + + diff --git a/system/src/main/resources/mapper/EamBasicMaintenanceVendorMapper.xml b/system/src/main/resources/mapper/EamBasicMaintenanceVendorMapper.xml new file mode 100644 index 0000000..6203c74 --- /dev/null +++ b/system/src/main/resources/mapper/EamBasicMaintenanceVendorMapper.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + maintenance_vendor_id + , name, code, uscc, after_sales_contactor, after_sales_contact, business_contactor, business_contact, address, notes, create_user, create_time, update_user, update_time, is_deleted + + + + + + diff --git a/system/src/main/resources/mapper/EamBasicManufacturersVendorMapper.xml b/system/src/main/resources/mapper/EamBasicManufacturersVendorMapper.xml new file mode 100644 index 0000000..b5b0089 --- /dev/null +++ b/system/src/main/resources/mapper/EamBasicManufacturersVendorMapper.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + manufacturers_vendor_id + , name, code, address, notes, create_user, create_time, update_user, update_time, is_deleted + + + + + + diff --git a/system/src/main/resources/mapper/EamBasicPositionMapper.xml b/system/src/main/resources/mapper/EamBasicPositionMapper.xml new file mode 100644 index 0000000..205a281 --- /dev/null +++ b/system/src/main/resources/mapper/EamBasicPositionMapper.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + position_id, name, depth, parent_id, create_user, create_time, update_user, update_time, is_deleted + + + + + + diff --git a/system/src/main/resources/mapper/EamBasicSupplierVendorMapper.xml b/system/src/main/resources/mapper/EamBasicSupplierVendorMapper.xml new file mode 100644 index 0000000..587b12d --- /dev/null +++ b/system/src/main/resources/mapper/EamBasicSupplierVendorMapper.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + supplier_vendor_id, name, code, uscc, after_sales_contactor, after_sales_contact, business_contactor, business_contact, address, notes, create_user, create_time, update_user, update_time, is_deleted + + + + + + diff --git a/system/src/main/resources/mapper/EamBasicTeamMapper.xml b/system/src/main/resources/mapper/EamBasicTeamMapper.xml new file mode 100644 index 0000000..b7d7f85 --- /dev/null +++ b/system/src/main/resources/mapper/EamBasicTeamMapper.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + t.team_id + , t.team_key, t.team_name, t.status, t.value, t.create_user, t.create_time, t.update_user, t.update_time, t.remark + , u.user_name as create_user_name + + + + + + diff --git a/system/src/main/resources/mapper/EamBasicWarehouseMapper.xml b/system/src/main/resources/mapper/EamBasicWarehouseMapper.xml new file mode 100644 index 0000000..91c92ec --- /dev/null +++ b/system/src/main/resources/mapper/EamBasicWarehouseMapper.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + warehouse_id, create_user, create_time, update_user, update_time, is_deleted, name, status + + + + + + diff --git a/system/src/main/resources/mapper/EamBusinessAllocateMapper.xml b/system/src/main/resources/mapper/EamBusinessAllocateMapper.xml new file mode 100644 index 0000000..ccc247e --- /dev/null +++ b/system/src/main/resources/mapper/EamBusinessAllocateMapper.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + id + , business_id, name, applicant, asset_id_List, business_generated_date, notes, attach, status, create_user, create_time, update_user, update_time, is_deleted, out_warehouse_id, in_warehouse_id + + + + + + diff --git a/system/src/main/resources/mapper/EamBusinessBorrowMapper.xml b/system/src/main/resources/mapper/EamBusinessBorrowMapper.xml new file mode 100644 index 0000000..ca91c53 --- /dev/null +++ b/system/src/main/resources/mapper/EamBusinessBorrowMapper.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + id + , business_id, name, applicant, asset_id_List, business_generated_date, notes, attach, status, create_user, create_time, update_user, update_time, is_deleted, use_user_id, return_time + + + + + + diff --git a/system/src/main/resources/mapper/EamBusinessCollectionMapper.xml b/system/src/main/resources/mapper/EamBusinessCollectionMapper.xml new file mode 100644 index 0000000..1d663c4 --- /dev/null +++ b/system/src/main/resources/mapper/EamBusinessCollectionMapper.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + id + , business_id, name, applicant, asset_id_List, business_generated_date, notes, attach, status, create_user, create_time, update_user, update_time, is_deleted, use_organization_id, position_id, use_user_id, position_detail + + + + + + diff --git a/system/src/main/resources/mapper/EamBusinessOutboundMapper.xml b/system/src/main/resources/mapper/EamBusinessOutboundMapper.xml new file mode 100644 index 0000000..3ba21de --- /dev/null +++ b/system/src/main/resources/mapper/EamBusinessOutboundMapper.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + id + , business_id, name, warehouse_id, asset_id_List, business_generated_date, notes, attach, status, create_user, create_time, update_user, update_time, is_deleted, own_company_id, use_organization_id, use_user_id, position_detail + + + + + + diff --git a/system/src/main/resources/mapper/EamBusinessRegistrationMapper.xml b/system/src/main/resources/mapper/EamBusinessRegistrationMapper.xml new file mode 100644 index 0000000..5575be0 --- /dev/null +++ b/system/src/main/resources/mapper/EamBusinessRegistrationMapper.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + id + , business_id, name, applicant, status, asset_id, config, create_user, create_time, update_user, update_time, is_deleted + + + + + + diff --git a/system/src/main/resources/mapper/EamBusinessRetirementMapper.xml b/system/src/main/resources/mapper/EamBusinessRetirementMapper.xml new file mode 100644 index 0000000..c6409c2 --- /dev/null +++ b/system/src/main/resources/mapper/EamBusinessRetirementMapper.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + id + , business_id, name, applicant, asset_id_List, business_generated_date, notes, attach, status, create_user, create_time, update_user, update_time, is_deleted, type, expedited_status, is_retirement, is_clean + + + + + + diff --git a/system/src/main/resources/mapper/EamBusinessReturnInventoryMapper.xml b/system/src/main/resources/mapper/EamBusinessReturnInventoryMapper.xml new file mode 100644 index 0000000..42f7cad --- /dev/null +++ b/system/src/main/resources/mapper/EamBusinessReturnInventoryMapper.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + id + , business_id, name, applicant, asset_id_List, business_generated_date, notes, attach, status, create_user, create_time, update_user, update_time, is_deleted, use_organization_id, position_id, position_detail, warehouse_id + + + + + + diff --git a/system/src/main/resources/mapper/EamBusinessReturnMapper.xml b/system/src/main/resources/mapper/EamBusinessReturnMapper.xml new file mode 100644 index 0000000..982bcd8 --- /dev/null +++ b/system/src/main/resources/mapper/EamBusinessReturnMapper.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + id + , business_id, name, applicant, asset_id_List, business_generated_date, notes, attach, status, create_user, create_time, update_user, update_time, is_deleted, position_id, position_detail, manager, use_user_id + + + + + + diff --git a/system/src/main/resources/mapper/EamBusinessStorageMapper.xml b/system/src/main/resources/mapper/EamBusinessStorageMapper.xml new file mode 100644 index 0000000..374f11b --- /dev/null +++ b/system/src/main/resources/mapper/EamBusinessStorageMapper.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + id + , business_id, name, warehouse_id, asset_id_List, business_generated_date, notes, attach, status, create_user, create_time, update_user, update_time, is_deleted, manager, position_id, supplier_vendor_id + + + + + + diff --git a/system/src/main/resources/mapper/EamBusinessTransferMapper.xml b/system/src/main/resources/mapper/EamBusinessTransferMapper.xml new file mode 100644 index 0000000..6f832f9 --- /dev/null +++ b/system/src/main/resources/mapper/EamBusinessTransferMapper.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id + , business_id, name, asset_id_List, business_generated_date, notes, attach, status, create_user, create_time, update_user, update_time, is_deleted, out_use_organization_id, in_use_organization_id, manager_id, use_user_id, position_id, position_detail + + + + + + diff --git a/system/src/main/resources/mapper/EamRepairFaultMapper.xml b/system/src/main/resources/mapper/EamRepairFaultMapper.xml new file mode 100644 index 0000000..16ffee1 --- /dev/null +++ b/system/src/main/resources/mapper/EamRepairFaultMapper.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + fault_id + , name, img, asset_id_List, attach, notes, status, create_user, create_time, update_user, update_time, is_deleted + + + + + + diff --git a/system/src/main/resources/mapper/EamRepairMapper.xml b/system/src/main/resources/mapper/EamRepairMapper.xml new file mode 100644 index 0000000..162c175 --- /dev/null +++ b/system/src/main/resources/mapper/EamRepairMapper.xml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + id + , business_id, name, asset_id_List, notes, attach, status, create_user, create_time, update_user, update_time, is_deleted, planned_date, repair_type_id + + + + + + diff --git a/system/src/main/resources/mapper/EamRepairTypeMapper.xml b/system/src/main/resources/mapper/EamRepairTypeMapper.xml new file mode 100644 index 0000000..79bf48d --- /dev/null +++ b/system/src/main/resources/mapper/EamRepairTypeMapper.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + repair_type_id + , name, config, notes, create_user, create_time, update_user, update_time, is_deleted + + + + + + diff --git a/system/src/main/resources/mapper/EamStocktakingDetailsMapper.xml b/system/src/main/resources/mapper/EamStocktakingDetailsMapper.xml new file mode 100644 index 0000000..eea6cb8 --- /dev/null +++ b/system/src/main/resources/mapper/EamStocktakingDetailsMapper.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + id + , stocktaking_job_id, asset_id, status, img, attachment, notes, create_user, create_time, update_user, update_time, is_deleted + + + + + + diff --git a/system/src/main/resources/mapper/EamStocktakingJobMapper.xml b/system/src/main/resources/mapper/EamStocktakingJobMapper.xml new file mode 100644 index 0000000..834852c --- /dev/null +++ b/system/src/main/resources/mapper/EamStocktakingJobMapper.xml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + stocktaking_job_id + , name, head, full_stocktaking, stocktaking_user_id, stocktaking_start_date, stocktaking_end_date, asset_status, own_company_id, use_organization_id, use_user_id, category_id, position_id, warehouse_id, status, notes, create_user, create_time, update_user, update_time, is_deleted + + + + + + diff --git a/system/src/main/resources/mapper/EamStocktakingPlanMapper.xml b/system/src/main/resources/mapper/EamStocktakingPlanMapper.xml new file mode 100644 index 0000000..ec57a5f --- /dev/null +++ b/system/src/main/resources/mapper/EamStocktakingPlanMapper.xml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + stocktaking_plan_id + , name, head, full_stocktaking, stocktaking_user_id, stocktaking_start_date, stocktaking_end_date, asset_status, own_company_id, use_organization_id, use_user_id, category_id, position_id, warehouse_id, status, notes, create_user, create_time, update_user, update_time, is_deleted + + + + + + diff --git a/system/src/main/resources/mapper/EamWarehouseAssetMapper.xml b/system/src/main/resources/mapper/EamWarehouseAssetMapper.xml new file mode 100644 index 0000000..6496b50 --- /dev/null +++ b/system/src/main/resources/mapper/EamWarehouseAssetMapper.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + warehouse_id + , asset_id, count + + + + + + + + UPDATE eam_warehouse_asset + SET count = count + #{count} + WHERE warehouse_id = #{warehouseId} AND asset_id = #{assetId} + + + + + UPDATE eam_warehouse_asset + SET count = count - #{count} + WHERE warehouse_id = #{warehouseId} AND asset_id = #{assetId} AND count >= #{count} + + + diff --git a/system/src/main/resources/mapper/EamWarehouseInventoryMapper.xml b/system/src/main/resources/mapper/EamWarehouseInventoryMapper.xml new file mode 100644 index 0000000..be4593b --- /dev/null +++ b/system/src/main/resources/mapper/EamWarehouseInventoryMapper.xml @@ -0,0 +1,125 @@ + + + + + + + + + + + diff --git a/system/src/main/resources/mapper/FlFormItemMapper.xml b/system/src/main/resources/mapper/FlFormItemMapper.xml new file mode 100644 index 0000000..4c3b0a1 --- /dev/null +++ b/system/src/main/resources/mapper/FlFormItemMapper.xml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + id + , name, form_key, proc_ins_id, task_id, contents, logs, status, is_deleted, create_user, create_time, update_user, update_time, create_type + + + + + + diff --git a/system/src/main/resources/mapper/FlFormMapper.xml b/system/src/main/resources/mapper/FlFormMapper.xml new file mode 100644 index 0000000..d0d0fdf --- /dev/null +++ b/system/src/main/resources/mapper/FlFormMapper.xml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + form_id + , form_key, type, name, pc_icon, mobile_icon, config, deploy_id, status, remark, is_deleted, create_user, create_time, update_user, update_time + + + + + + diff --git a/system/src/main/resources/mapper/FlListenerMapper.xml b/system/src/main/resources/mapper/FlListenerMapper.xml new file mode 100644 index 0000000..def1a16 --- /dev/null +++ b/system/src/main/resources/mapper/FlListenerMapper.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + id + , name, type, event_type, value_type, value, status, is_deleted, create_user, create_time, update_user, update_time + + + + + + diff --git a/system/src/main/resources/mapper/SysConfigMapper.xml b/system/src/main/resources/mapper/SysConfigMapper.xml new file mode 100644 index 0000000..61aef5a --- /dev/null +++ b/system/src/main/resources/mapper/SysConfigMapper.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + config_id, config_name, config_key, config_value, create_user, create_time, update_user, update_time, remark + + + + + + diff --git a/system/src/main/resources/mapper/SysDictDataMapper.xml b/system/src/main/resources/mapper/SysDictDataMapper.xml new file mode 100644 index 0000000..3de9112 --- /dev/null +++ b/system/src/main/resources/mapper/SysDictDataMapper.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + dict_code + , dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_user, create_time, update_user, update_time, remark + + + + + + diff --git a/system/src/main/resources/mapper/SysDictTypeMapper.xml b/system/src/main/resources/mapper/SysDictTypeMapper.xml new file mode 100644 index 0000000..5ff2b35 --- /dev/null +++ b/system/src/main/resources/mapper/SysDictTypeMapper.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + dict_id + , dict_name, dict_type, status, create_user, create_time, update_user, update_time, remark + + + + + + diff --git a/system/src/main/resources/mapper/SysFormLogMapper.xml b/system/src/main/resources/mapper/SysFormLogMapper.xml new file mode 100644 index 0000000..3b15d2c --- /dev/null +++ b/system/src/main/resources/mapper/SysFormLogMapper.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + fl.form_log_id, fl.form_temp_id, fl.form_key, fl.form_type, fl.form_name, fl.form_value, fl.create_user, fl.create_time, fl.update_user, fl.update_time + , ft.form_name as form_temp_name + + + + + + diff --git a/system/src/main/resources/mapper/SysFormTempMapper.xml b/system/src/main/resources/mapper/SysFormTempMapper.xml new file mode 100644 index 0000000..6431936 --- /dev/null +++ b/system/src/main/resources/mapper/SysFormTempMapper.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + f.form_temp_id + , f.form_key, f.form_type, f.form_name, f.form_status, f.form_value, f.template_path, f.create_user, f.create_time, f.update_user, f.update_time + , u.user_name as create_user_name + + + + + + diff --git a/system/src/main/resources/mapper/SysLogMapper.xml b/system/src/main/resources/mapper/SysLogMapper.xml new file mode 100644 index 0000000..fa6d960 --- /dev/null +++ b/system/src/main/resources/mapper/SysLogMapper.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + log_id, log_type, log_content, create_time + + + + + + diff --git a/system/src/main/resources/mapper/UmsMenuMapper.xml b/system/src/main/resources/mapper/UmsMenuMapper.xml new file mode 100644 index 0000000..b47a113 --- /dev/null +++ b/system/src/main/resources/mapper/UmsMenuMapper.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + m.menu_id, m.menu_name, m.parent_id, m.sort, m.url, m.menu_type, m.visible, m.permission, m.icon, m.create_user, m.create_time, m.update_user, m.update_time, m.is_deleted, m.remark + + + + + + + diff --git a/system/src/main/resources/mapper/UmsOrganizationMapper.xml b/system/src/main/resources/mapper/UmsOrganizationMapper.xml new file mode 100644 index 0000000..47e3e48 --- /dev/null +++ b/system/src/main/resources/mapper/UmsOrganizationMapper.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + o.organization_id, o.organization_name, o.organization_type, o.order_num, o.parent_id, o.depth, o.status, o.is_deleted, o.create_user, o.create_time, o.update_user, o.update_time + + + + + + + diff --git a/system/src/main/resources/mapper/UmsRoleMapper.xml b/system/src/main/resources/mapper/UmsRoleMapper.xml new file mode 100644 index 0000000..700cc95 --- /dev/null +++ b/system/src/main/resources/mapper/UmsRoleMapper.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.status, r.is_deleted, r.create_user, r.create_time, r.update_user, r.update_time, r.remark + + + + + + + diff --git a/system/src/main/resources/mapper/UmsRoleMenuMapper.xml b/system/src/main/resources/mapper/UmsRoleMenuMapper.xml new file mode 100644 index 0000000..0792f4b --- /dev/null +++ b/system/src/main/resources/mapper/UmsRoleMenuMapper.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + role_id, menu_id + + + diff --git a/system/src/main/resources/mapper/UmsUserMapper.xml b/system/src/main/resources/mapper/UmsUserMapper.xml new file mode 100644 index 0000000..0a44657 --- /dev/null +++ b/system/src/main/resources/mapper/UmsUserMapper.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + u + . + user_id + , u.login_name, u.user_name, u.email, u.phone, u.password, u.salt, u.status, u.is_deleted, u.login_ip, u.login_date, u.pwd_update_date, u.create_user, u.create_time, u.update_user, u.update_time, u.remark, u.sex, u.avatar + ,r.role_id,r.role_name + ,o.organization_id,o.organization_name + + + + diff --git a/system/src/main/resources/mapper/UmsUserOrganizationMapper.xml b/system/src/main/resources/mapper/UmsUserOrganizationMapper.xml new file mode 100644 index 0000000..c7d092c --- /dev/null +++ b/system/src/main/resources/mapper/UmsUserOrganizationMapper.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + organization_id + , user_id + + + + + + diff --git a/system/src/main/resources/mapper/UmsUserRoleMapper.xml b/system/src/main/resources/mapper/UmsUserRoleMapper.xml new file mode 100644 index 0000000..36d69db --- /dev/null +++ b/system/src/main/resources/mapper/UmsUserRoleMapper.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + user_id + , role_id + + + + + + diff --git a/system/src/main/resources/mapper/flowable/FlowDeployMapper.xml b/system/src/main/resources/mapper/flowable/FlowDeployMapper.xml new file mode 100644 index 0000000..a1ebb9a --- /dev/null +++ b/system/src/main/resources/mapper/flowable/FlowDeployMapper.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/system/src/main/resources/test.bpmn20.xml b/system/src/main/resources/test.bpmn20.xml new file mode 100644 index 0000000..25a6a00 --- /dev/null +++ b/system/src/main/resources/test.bpmn20.xml @@ -0,0 +1,81 @@ + + + + + Flow_15qlxla + + + + static + [] + + + Flow_15qlxla + Flow_16o67ow + + + + + static + [] + + + Flow_16o67ow + Flow_0okjfqd + + + + + static + [] + + static + + Flow_0okjfqd + Flow_16k84fz + + + + Flow_16k84fz + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/system/src/main/resources/员工资产交接.bpmn20.xml b/system/src/main/resources/员工资产交接.bpmn20.xml new file mode 100644 index 0000000..70b3632 --- /dev/null +++ b/system/src/main/resources/员工资产交接.bpmn20.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/system/src/main/resources/员工资产报修.bpmn20.xml b/system/src/main/resources/员工资产报修.bpmn20.xml new file mode 100644 index 0000000..187cd05 --- /dev/null +++ b/system/src/main/resources/员工资产报修.bpmn20.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/system/src/main/resources/员工资产报失.bpmn20.xml b/system/src/main/resources/员工资产报失.bpmn20.xml new file mode 100644 index 0000000..04c9561 --- /dev/null +++ b/system/src/main/resources/员工资产报失.bpmn20.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/system/src/main/resources/员工资产申请.bpmn20.xml b/system/src/main/resources/员工资产申请.bpmn20.xml new file mode 100644 index 0000000..b0b4bee --- /dev/null +++ b/system/src/main/resources/员工资产申请.bpmn20.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/system/src/main/resources/物品领用申请.bpmn20.xml b/system/src/main/resources/物品领用申请.bpmn20.xml new file mode 100644 index 0000000..96392bc --- /dev/null +++ b/system/src/main/resources/物品领用申请.bpmn20.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/system/src/main/resources/设备保养任务.bpmn20.xml b/system/src/main/resources/设备保养任务.bpmn20.xml new file mode 100644 index 0000000..609c2a7 --- /dev/null +++ b/system/src/main/resources/设备保养任务.bpmn20.xml @@ -0,0 +1,81 @@ + + + + + Flow_15qlxla + + + + static + [] + + + Flow_15qlxla + Flow_16o67ow + + + + + static + [] + + + Flow_16o67ow + Flow_0okjfqd + + + + + static + [] + + static + + Flow_0okjfqd + Flow_16k84fz + + + + Flow_16k84fz + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/system/src/main/resources/设备巡检任务.bpmn20.xml b/system/src/main/resources/设备巡检任务.bpmn20.xml new file mode 100644 index 0000000..8bf28f9 --- /dev/null +++ b/system/src/main/resources/设备巡检任务.bpmn20.xml @@ -0,0 +1,81 @@ + + + + + Flow_15qlxla + + + + static + [] + + + Flow_15qlxla + Flow_16o67ow + + + + + static + [] + + + Flow_16o67ow + Flow_0okjfqd + + + + + static + [] + + static + + Flow_0okjfqd + Flow_16k84fz + + + + Flow_16k84fz + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/system/src/main/resources/设备报修维修.bpmn20.xml b/system/src/main/resources/设备报修维修.bpmn20.xml new file mode 100644 index 0000000..fa79b1b --- /dev/null +++ b/system/src/main/resources/设备报修维修.bpmn20.xml @@ -0,0 +1,81 @@ + + + + + Flow_15qlxla + + + + static + [] + + + Flow_15qlxla + Flow_16o67ow + + + + + static + [] + + + Flow_16o67ow + Flow_0okjfqd + + + + + static + [] + + static + + Flow_0okjfqd + Flow_16k84fz + + + + Flow_16k84fz + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/system/src/main/resources/设备盘点任务.bpmn20.xml b/system/src/main/resources/设备盘点任务.bpmn20.xml new file mode 100644 index 0000000..236dc9b --- /dev/null +++ b/system/src/main/resources/设备盘点任务.bpmn20.xml @@ -0,0 +1,81 @@ + + + + + Flow_15qlxla + + + + static + [] + + + Flow_15qlxla + Flow_16o67ow + + + + + static + [] + + + Flow_16o67ow + Flow_0okjfqd + + + + + static + [] + + static + + Flow_0okjfqd + Flow_16k84fz + + + + Flow_16k84fz + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/system/src/main/resources/资产设备报废.bpmn20.xml b/system/src/main/resources/资产设备报废.bpmn20.xml new file mode 100644 index 0000000..568c469 --- /dev/null +++ b/system/src/main/resources/资产设备报废.bpmn20.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/system/src/main/resources/资产采购申请.bpmn20.xml b/system/src/main/resources/资产采购申请.bpmn20.xml new file mode 100644 index 0000000..15fd897 --- /dev/null +++ b/system/src/main/resources/资产采购申请.bpmn20.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +