From cf1bb1d7f0b51954458a376732264b0112259555 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=AD=A3=E5=9B=BD?= <438926402@qq.com> Date: Mon, 17 Nov 2025 10:14:17 +0800 Subject: [PATCH] =?UTF-8?q?2025-01-08=E7=A8=BB=E8=8A=B1=E9=A6=99=E4=B8=BB?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=B9=B3=E5=8F=B0=E5=88=9D=E5=A7=8B=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- v5/apps-customize/pom.xml | 61 + .../apps/qrCodeForm/QrCodeFormPluginApi.java | 45 + .../QrCodeFormPluginInitializer.java | 22 + .../apps/qrCodeForm/constant/Constants.java | 15 + .../constant/QrCodeFormConstants.java | 32 + .../qrCodeForm/constant/SupportTypeEnum.java | 31 + .../controller/QrCodeFormController.java | 113 ++ .../qrCodeForm/manager/QrCodeFormManager.java | 18 + .../manager/QrCodeFormManagerImpl.java | 160 +++ .../qrCodeForm/sso/WechatQRHandShake.java | 141 ++ .../qrCodeForm/util/InitQrCodeFormUitl.java | 118 ++ .../apps/qrCodeForm/util/LoginUtil.java | 72 + .../bo/DataFetchType.java | 6 + .../bo/DataMappingStrategy.java | 161 +++ .../DataMappingStrategyController.java | 10 + .../service/DataMappingStrategyService.java | 12 + .../OrganizationPluginApi.java | 44 + .../bo/ReceiveOrgMemberResponse.java | 56 + .../bo/ThirdCustomerBo.java | 348 +++++ .../src_mainorganization/bo/ThirdDeptBo.java | 470 ++++++ .../src_mainorganization/bo/ThirdLevelBo.java | 120 ++ .../bo/ThirdMemberBo.java | 958 +++++++++++++ .../src_mainorganization/bo/ThirdPostBo.java | 187 +++ .../src_mainorganization/bo/TreeNodeBo.java | 33 + .../constans/SyncConstants.java | 75 + ...BusinessStructureMemberInfoController.java | 119 ++ ...BusinessStructureMemberListController.java | 152 ++ .../BusinessStructureTreeController.java | 35 + .../BusinessStructureUnitTreeController.java | 197 +++ .../OrganizationFieldCtrlController.java | 79 + .../src_mainorganization/dao/IArchiveDao.java | 38 + .../src_mainorganization/dao/IOrgRoleDao.java | 8 + .../dao/ISrcAccountDao.java | 23 + .../dao/ISrcDepartmentDao.java | 22 + .../src_mainorganization/dao/ISrcEnumDao.java | 9 + .../dao/ISrcFormTableDao.java | 9 + .../dao/ISrcLevelDao.java | 8 + .../dao/ISrcMemberDao.java | 46 + .../src_mainorganization/dao/ISrcPostDao.java | 8 + .../src_mainorganization/dao/ISyncDdDao.java | 54 + .../src_mainorganization/dao/ISyncFvDao.java | 42 + .../dao/ISyncQixuexingDao.java | 9 + .../dao/impl/ArchiveDaoImpl.java | 430 ++++++ .../dao/impl/OrgRoleDaoImpl.java | 45 + .../dao/impl/SrcAccountDaoImpl.java | 196 +++ .../dao/impl/SrcDepartmentDaoImpl.java | 198 +++ .../dao/impl/SrcEnumDaoImpl.java | 74 + .../dao/impl/SrcFormTableDaoImpl.java | 42 + .../dao/impl/SrcLevelDaoImpl.java | 43 + .../dao/impl/SrcMemberDaoImpl.java | 652 +++++++++ .../dao/impl/SrcPostDaoImpl.java | 43 + .../dao/impl/SyncDdDaoImpl.java | 463 ++++++ .../dao/impl/SyncFvDaoImpl.java | 672 +++++++++ .../dao/impl/SyncQixuexingDaoImpl.java | 40 + .../fieldCtrl/SynchronizationRepushBtn.java | 98 ++ .../src_mainorganization/node/TestNode.java | 134 ++ .../quartz/OrganizationQuartz.java | 96 ++ .../quartz/QixuexingOrganizationQuartz.java | 89 ++ .../server/InitializeDingdingSyncServer.java | 224 +++ .../OrganizationOrgDingdingSyncServer.java | 1272 +++++++++++++++++ .../server/OrganizationOrgFlowSyncServer.java | 505 +++++++ .../OrganizationOrgGroupSyncServer.java | 747 ++++++++++ .../OrganizationOrgQixuexingSyncServer.java | 708 +++++++++ .../server/OrganizationOrgSyncServer.java | 273 ++++ .../service/IReceiveOrgDepartmentService.java | 36 + .../service/IReceiveOrgMemberService.java | 42 + .../service/IReceiveSrcCustomerService.java | 20 + .../service/ISrcMemberFormTableService.java | 18 + .../impl/ReceiveOrgDepartmentServiceImpl.java | 483 +++++++ .../impl/ReceiveOrgMemberServiceImpl.java | 995 +++++++++++++ .../impl/ReceiveSrcCustomerServiceImpl.java | 61 + .../impl/SrcMemberFormTableServiceImpl.java | 139 ++ .../sync/OrganizationOrgSyncApi.java | 268 ++++ .../util/DingdingProtUtil.java | 317 ++++ .../src_mainorganization/util/ExcelUtils.java | 64 + .../util/FormExportUtil.java | 107 ++ .../util/LearnTokenUtil.java | 107 ++ .../src_mainorganization/util/ParamUtil.java | 37 + .../src_mainorganization/util/ProtUtil.java | 296 ++++ .../util/QixuexingPortUtil.java | 302 ++++ .../dao/IQuartFormTableDao.java | 13 + .../dao/impl/QuartFormTableDao.java | 74 + .../ReceiveFVFlowPluginApi.java | 45 + .../config/RfvfPluginConfigProvider.java | 17 + .../constans/ReceiveFVFlowConstans.java | 32 + .../dao/IReceiveFVFlowDao.java | 19 + .../dao/impl/ReceiveFVFlowDaoImpl.java | 112 ++ .../handler/AbnormalResignationHandler.java | 194 +++ .../handler/AccessionApprovalHandler.java | 336 +++++ .../handler/AccountCloseHandler.java | 112 ++ .../handler/AccountOpenHandler.java | 159 +++ .../ApplicationRegistrationHandler.java | 122 ++ .../handler/BatchCloseDeptHandler.java | 66 + .../handler/BatchCreateDeptHandler.java | 65 + .../handler/BatchDeptTransferHandler.java | 66 + .../handler/ChangePersonInfoHandler.java | 159 +++ .../handler/CusAccountAssignHandler.java | 232 +++ .../handler/CusCreateAccountHandler.java | 253 ++++ .../handler/CusFreezeHandler.java | 75 + .../handler/CusInfoChangeHandler.java | 245 ++++ .../handler/CusRelationMaintainHandler.java | 32 + .../handler/CusRevokedHandler.java | 279 ++++ .../handler/CusUnfreezeHandler.java | 76 + .../handler/CustomerDocUpdateHandler.java | 11 + .../handler/EmploymentApprovalHandler.java | 82 ++ .../handler/FlowDataSyncHandler.java | 90 ++ .../handler/NormalResignationHandler.java | 188 +++ .../handler/OrgMemberUpdateHandler.java | 10 + .../handler/PersonnelDocUpdateHandler.java | 11 + .../RegularizationFlowApprovalHandler.java | 81 ++ .../handler/TalentDocUpdateHandler.java | 11 + .../handler/TransferApprovalHandler.java | 167 +++ .../indexinterface/StepTask.java | 6 + .../org/OrgManagerDirectFacade.java | 75 + .../service/IReceiveFVFlowService.java | 16 + .../service/impl/ReceiveFVFlowService.java | 98 ++ .../src_receiveFVFlow/util/ClauseFactor.java | 19 + .../src_receiveFVFlow/util/DeptGetUtils.java | 40 + .../src_receiveFVFlow/util/EnumMapUtils.java | 91 ++ .../src_receiveFVFlow/util/FileUtils.java | 101 ++ .../src_receiveFVFlow/util/FormColumn.java | 24 + .../util/FormDataOperator.java | 525 +++++++ .../util/FormExportUtil.java | 84 ++ .../src_receiveFVFlow/util/FormFieldType.java | 7 + .../src_receiveFVFlow/util/FormFieldVo.java | 22 + .../util/FormUpdateField.java | 57 + .../util/FormWhereCondition.java | 121 ++ .../src_receiveFVFlow/util/HttpClient.java | 420 ++++++ .../util/WeaverJsonUtils.java | 143 ++ .../vo/ReceiveFVFlowResponse.java | 56 + .../resources/QuartFormTableResource.java | 75 + .../resources/ReceiveFVFlowDataResource.java | 70 + .../SaveAndUpdateDepartmentResource.java | 105 ++ .../SaveAndUpdateMemberMainResource.java | 145 ++ .../resources/SrcCustomerMainResource.java | 69 + .../resources/SrcMemberFormTableResource.java | 66 + .../main/resources/needless_check_login.xml | 322 +++++ .../needless_check_login_recheck.xml | 426 ++++++ .../cfgHome/plugin/qrCodeForm/pluginCfg.xml | 6 + .../spring/spring-qrCodeForm-controller.xml | 6 + .../spring/spring-qrCodeForm-manager.xml | 13 + .../spring/spring-qrCodeForm-plugin.xml | 8 + .../plugin/src_mainorganization/pluginCfg.xml | 6 + .../spring/spring-controller.xml | 10 + .../spring/spring-dao.xml | 16 + .../spring/spring-fieldCtrl.xml | 5 + .../spring/spring-node.xml | 5 + .../spring/spring-quartz.xml | 6 + .../spring/spring-server.xml | 11 + .../spring/spring-service.xml | 9 + .../src_mainorganization/spring/spring.xml | 6 + .../plugin/src_quartformtable/pluginCfg.xml | 6 + .../src_quartformtable/spring/spring-dao.xml | 5 + .../plugin/src_receiveFVFlow/pluginCfg.xml | 6 + .../src_receiveFVFlow/spring/spring-dao.xml | 8 + .../spring/spring-service.xml | 14 + .../cfgHome/plugin/src_test/pluginCfg.xml | 6 + .../plugin/src_test/spring/spring-node.xml | 5 + .../jsp/plugin/qrCodeForm/qrCodeFormIndex.jsp | 249 ++++ .../css/formQueryBtn.css | 27 + .../css/img/icon16.png | Bin 0 -> 103273 bytes .../css/setCondition.css | 13 + .../css/setTemplate.css | 87 ++ .../js/LodopFuncs.js | 188 +++ .../js/setTemplate.js | 99 ++ .../js/synchronization.js | 275 ++++ .../cap4/form/utils/qrcodeform/index.js | 13 + .../businessStructureTree.jsp | 275 ++++ .../cap4/form/utils/qrcodeform/index.js | 11 + 169 files changed, 22513 insertions(+) create mode 100644 v5/apps-customize/pom.xml create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/QrCodeFormPluginApi.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/QrCodeFormPluginInitializer.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/constant/Constants.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/constant/QrCodeFormConstants.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/constant/SupportTypeEnum.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/controller/QrCodeFormController.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/manager/QrCodeFormManager.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/manager/QrCodeFormManagerImpl.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/sso/WechatQRHandShake.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/util/InitQrCodeFormUitl.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/util/LoginUtil.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_commondatamapping/bo/DataFetchType.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_commondatamapping/bo/DataMappingStrategy.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_commondatamapping/controller/DataMappingStrategyController.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_commondatamapping/service/DataMappingStrategyService.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/OrganizationPluginApi.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/bo/ReceiveOrgMemberResponse.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/bo/ThirdCustomerBo.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/bo/ThirdDeptBo.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/bo/ThirdLevelBo.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/bo/ThirdMemberBo.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/bo/ThirdPostBo.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/bo/TreeNodeBo.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/constans/SyncConstants.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/controller/BusinessStructureMemberInfoController.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/controller/BusinessStructureMemberListController.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/controller/BusinessStructureTreeController.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/controller/BusinessStructureUnitTreeController.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/controller/OrganizationFieldCtrlController.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/IArchiveDao.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/IOrgRoleDao.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/ISrcAccountDao.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/ISrcDepartmentDao.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/ISrcEnumDao.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/ISrcFormTableDao.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/ISrcLevelDao.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/ISrcMemberDao.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/ISrcPostDao.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/ISyncDdDao.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/ISyncFvDao.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/ISyncQixuexingDao.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/impl/ArchiveDaoImpl.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/impl/OrgRoleDaoImpl.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/impl/SrcAccountDaoImpl.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/impl/SrcDepartmentDaoImpl.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/impl/SrcEnumDaoImpl.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/impl/SrcFormTableDaoImpl.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/impl/SrcLevelDaoImpl.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/impl/SrcMemberDaoImpl.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/impl/SrcPostDaoImpl.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/impl/SyncDdDaoImpl.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/impl/SyncFvDaoImpl.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/impl/SyncQixuexingDaoImpl.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/fieldCtrl/SynchronizationRepushBtn.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/node/TestNode.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/quartz/OrganizationQuartz.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/quartz/QixuexingOrganizationQuartz.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/server/InitializeDingdingSyncServer.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/server/OrganizationOrgDingdingSyncServer.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/server/OrganizationOrgFlowSyncServer.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/server/OrganizationOrgGroupSyncServer.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/server/OrganizationOrgQixuexingSyncServer.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/server/OrganizationOrgSyncServer.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/service/IReceiveOrgDepartmentService.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/service/IReceiveOrgMemberService.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/service/IReceiveSrcCustomerService.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/service/ISrcMemberFormTableService.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/service/impl/ReceiveOrgDepartmentServiceImpl.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/service/impl/ReceiveOrgMemberServiceImpl.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/service/impl/ReceiveSrcCustomerServiceImpl.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/service/impl/SrcMemberFormTableServiceImpl.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/sync/OrganizationOrgSyncApi.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/util/DingdingProtUtil.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/util/ExcelUtils.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/util/FormExportUtil.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/util/LearnTokenUtil.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/util/ParamUtil.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/util/ProtUtil.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/util/QixuexingPortUtil.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_quartformtable/dao/IQuartFormTableDao.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_quartformtable/dao/impl/QuartFormTableDao.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/ReceiveFVFlowPluginApi.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/config/RfvfPluginConfigProvider.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/constans/ReceiveFVFlowConstans.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/dao/IReceiveFVFlowDao.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/dao/impl/ReceiveFVFlowDaoImpl.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/AbnormalResignationHandler.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/AccessionApprovalHandler.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/AccountCloseHandler.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/AccountOpenHandler.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/ApplicationRegistrationHandler.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/BatchCloseDeptHandler.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/BatchCreateDeptHandler.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/BatchDeptTransferHandler.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/ChangePersonInfoHandler.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/CusAccountAssignHandler.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/CusCreateAccountHandler.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/CusFreezeHandler.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/CusInfoChangeHandler.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/CusRelationMaintainHandler.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/CusRevokedHandler.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/CusUnfreezeHandler.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/CustomerDocUpdateHandler.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/EmploymentApprovalHandler.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/FlowDataSyncHandler.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/NormalResignationHandler.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/OrgMemberUpdateHandler.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/PersonnelDocUpdateHandler.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/RegularizationFlowApprovalHandler.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/TalentDocUpdateHandler.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/TransferApprovalHandler.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/indexinterface/StepTask.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/org/OrgManagerDirectFacade.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/service/IReceiveFVFlowService.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/service/impl/ReceiveFVFlowService.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/util/ClauseFactor.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/util/DeptGetUtils.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/util/EnumMapUtils.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/util/FileUtils.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/util/FormColumn.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/util/FormDataOperator.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/util/FormExportUtil.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/util/FormFieldType.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/util/FormFieldVo.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/util/FormUpdateField.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/util/FormWhereCondition.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/util/HttpClient.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/util/WeaverJsonUtils.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/vo/ReceiveFVFlowResponse.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/ctp/rest/resources/QuartFormTableResource.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/ctp/rest/resources/ReceiveFVFlowDataResource.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/ctp/rest/resources/SaveAndUpdateDepartmentResource.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/ctp/rest/resources/SaveAndUpdateMemberMainResource.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/ctp/rest/resources/SrcCustomerMainResource.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/ctp/rest/resources/SrcMemberFormTableResource.java create mode 100644 v5/apps-customize/src/main/resources/needless_check_login.xml create mode 100644 v5/apps-customize/src/main/resources/needless_check_login_recheck.xml create mode 100644 v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/qrCodeForm/pluginCfg.xml create mode 100644 v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/qrCodeForm/spring/spring-qrCodeForm-controller.xml create mode 100644 v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/qrCodeForm/spring/spring-qrCodeForm-manager.xml create mode 100644 v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/qrCodeForm/spring/spring-qrCodeForm-plugin.xml create mode 100644 v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_mainorganization/pluginCfg.xml create mode 100644 v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_mainorganization/spring/spring-controller.xml create mode 100644 v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_mainorganization/spring/spring-dao.xml create mode 100644 v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_mainorganization/spring/spring-fieldCtrl.xml create mode 100644 v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_mainorganization/spring/spring-node.xml create mode 100644 v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_mainorganization/spring/spring-quartz.xml create mode 100644 v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_mainorganization/spring/spring-server.xml create mode 100644 v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_mainorganization/spring/spring-service.xml create mode 100644 v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_mainorganization/spring/spring.xml create mode 100644 v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_quartformtable/pluginCfg.xml create mode 100644 v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_quartformtable/spring/spring-dao.xml create mode 100644 v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_receiveFVFlow/pluginCfg.xml create mode 100644 v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_receiveFVFlow/spring/spring-dao.xml create mode 100644 v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_receiveFVFlow/spring/spring-service.xml create mode 100644 v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_test/pluginCfg.xml create mode 100644 v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_test/spring/spring-node.xml create mode 100644 v5/apps-customize/src/main/webapp/WEB-INF/jsp/plugin/qrCodeForm/qrCodeFormIndex.jsp create mode 100644 v5/apps-customize/src/main/webapp/apps_res/cap/customCtrlResources/synchronizationBtnResources/css/formQueryBtn.css create mode 100644 v5/apps-customize/src/main/webapp/apps_res/cap/customCtrlResources/synchronizationBtnResources/css/img/icon16.png create mode 100644 v5/apps-customize/src/main/webapp/apps_res/cap/customCtrlResources/synchronizationBtnResources/css/setCondition.css create mode 100644 v5/apps-customize/src/main/webapp/apps_res/cap/customCtrlResources/synchronizationBtnResources/css/setTemplate.css create mode 100644 v5/apps-customize/src/main/webapp/apps_res/cap/customCtrlResources/synchronizationBtnResources/js/LodopFuncs.js create mode 100644 v5/apps-customize/src/main/webapp/apps_res/cap/customCtrlResources/synchronizationBtnResources/js/setTemplate.js create mode 100644 v5/apps-customize/src/main/webapp/apps_res/cap/customCtrlResources/synchronizationBtnResources/js/synchronization.js create mode 100644 v5/apps-customize/src/main/webapp/common/capextend/cap4/form/utils/qrcodeform/index.js create mode 100644 v5/apps-customize/src/main/webapp/jsp/apps/src_mainorganization/businessStructureTree.jsp create mode 100644 v5/apps-customize/src/main/webapp/m3/apps/v5/capextend/cap4/form/utils/qrcodeform/index.js diff --git a/v5/apps-customize/pom.xml b/v5/apps-customize/pom.xml new file mode 100644 index 0000000..05e2716 --- /dev/null +++ b/v5/apps-customize/pom.xml @@ -0,0 +1,61 @@ + + + + + com.seeyon + apps-root + 5371630367615140082-standard-V8.1SP2-release_20220812-SNAPSHOT + + + 4.0.0 + + apps-customize + ${apps.version} + + + + org.apache.maven.plugins + maven-compiler-plugin + + 8 + 8 + + + + + + + + + + + + open.seeyon.3rd + hutool + 5.5.7 + system + ${basedir}/src/main/webapp/WEB-INF/lib/hutool-all-5.5.7.jar + + + open.seeyon.3rd + seeyon-extend + 3.0 + system + ${basedir}/src/main/webapp/WEB-INF/lib/seeyon-extend-v3.0.jar + + + + + + + + + + + + + + + + diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/QrCodeFormPluginApi.java b/v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/QrCodeFormPluginApi.java new file mode 100644 index 0000000..14c7768 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/QrCodeFormPluginApi.java @@ -0,0 +1,45 @@ +package com.seeyon.apps.qrCodeForm; + +import com.seeyon.apps.common.plugin.api.APluginInfoApi; +import com.seeyon.apps.common.plugin.vo.ConfigVo; +import com.seeyon.apps.qrCodeForm.constant.QrCodeFormConstants; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: FanGaowei + * @Date: 2022/8/11 + */ +public class QrCodeFormPluginApi extends APluginInfoApi { + + @Override + public String getPluginId() { + return QrCodeFormConstants.getPluginId(); + } + + @Override + public String getCreateUser() { + return "致威互联"; + } + + @Override + public String getDescription() { + return "微信扫码制单"; + } + + @Override + public ConfigVo getDefaultConfig() { + ConfigVo configVo = new ConfigVo(); + for (QrCodeFormConstants value : QrCodeFormConstants.values()) { + if(value != QrCodeFormConstants.plugin) { + configVo.getDevParams().put(value.name(), value.getDefaultValue()); + configVo.getProdParams().put(value.name(), value.getDefaultValue()); + configVo.getParamMap().put(value.name(), value.getDescription()); + } + } + return configVo; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/QrCodeFormPluginInitializer.java b/v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/QrCodeFormPluginInitializer.java new file mode 100644 index 0000000..82d52b3 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/QrCodeFormPluginInitializer.java @@ -0,0 +1,22 @@ +package com.seeyon.apps.qrCodeForm; + +import cn.hutool.log.Log; +import com.seeyon.apps.qrCodeForm.util.InitQrCodeFormUitl; +import com.seeyon.ctp.common.AbstractSystemInitializer; +import com.seeyon.ctp.common.exceptions.BusinessException; + +public class QrCodeFormPluginInitializer extends AbstractSystemInitializer { + private static Log log = Log.get(QrCodeFormPluginInitializer.class); + + public QrCodeFormPluginInitializer() { + } + + public void destroy() { + log.info("◆二维码扫码填单插件销毁成功!"); + } + + public void initialize() { + InitQrCodeFormUitl.initMenu(); + log.info("◆二维码扫码填单插件初始化成功!"); + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/constant/Constants.java b/v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/constant/Constants.java new file mode 100644 index 0000000..d065422 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/constant/Constants.java @@ -0,0 +1,15 @@ +package com.seeyon.apps.qrCodeForm.constant; + +import com.seeyon.ctp.common.AppContext; + +public class Constants { + + //模拟移动端登录认证方式 + public static final String _REDIRECTURI = "/qrCodeForm.do?method=newMain&html="; + //流程表单跳转地址 + public static final String FLOW_URL = "/seeyon/m3/apps/v5/collaboration/html/newCollaboration.html?qc=ext&templateId="; + //无流程表单跳转地址 + public static final String UNFLOW_URL = "/seeyon/m3/apps/v5/cap4/htmls/native/form/index.html?"; + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/constant/QrCodeFormConstants.java b/v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/constant/QrCodeFormConstants.java new file mode 100644 index 0000000..7415d9c --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/constant/QrCodeFormConstants.java @@ -0,0 +1,32 @@ +package com.seeyon.apps.qrCodeForm.constant; + +public enum QrCodeFormConstants { + + plugin("qrCodeForm","插件ID"), + oaAddress("https://oa.dhx.com.cn", "OA地址"), + qwAppId("", "企微APPID"), + restId("qrcode", "rest账号"), + restPwd("f39f8102-1c7f-423c-8e6c-57e1d19b9a6f", "rest密码"), + qrcode_loginname("hr", "发起人账号"); + + QrCodeFormConstants(String defaultValue, String description) { + this.defaultValue = defaultValue; + this.description = description; + } + + private String defaultValue; + private String description; + + public String getDefaultValue() { + return defaultValue; + } + + public String getDescription() { + return description; + } + + public static String getPluginId() { + return plugin.defaultValue; + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/constant/SupportTypeEnum.java b/v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/constant/SupportTypeEnum.java new file mode 100644 index 0000000..6051998 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/constant/SupportTypeEnum.java @@ -0,0 +1,31 @@ +package com.seeyon.apps.qrCodeForm.constant; + +import com.seeyon.ctp.common.code.EnumsCode; +import com.seeyon.ctp.common.i18n.ResourceUtil; + +public enum SupportTypeEnum implements EnumsCode { + ALL(0, "全部"), + FLOW(1, "仅支持流程表单"), + UNFLOW(2, "仅支持无流程表单"); + + private int key; + private String text; + + private SupportTypeEnum(int key, String text) { + this.key = key; + this.text = text; + } + + public String getValue() { + return String.valueOf(this.key); + } + + public int getKey() { + return this.key; + } + + public String getText() { + return ResourceUtil.getString(this.text); + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/controller/QrCodeFormController.java b/v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/controller/QrCodeFormController.java new file mode 100644 index 0000000..29a9b70 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/controller/QrCodeFormController.java @@ -0,0 +1,113 @@ +package com.seeyon.apps.qrCodeForm.controller; + +import cn.hutool.log.Log; +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.qrCodeForm.constant.QrCodeFormConstants; +import com.seeyon.apps.qrCodeForm.manager.QrCodeFormManager; +import com.seeyon.apps.qrCodeForm.util.LoginUtil; +import com.seeyon.apps.weixin.util.SecurityCertUtil; +import com.seeyon.apps.weixin.util.WeixinUtil; +import com.seeyon.ctp.common.SystemEnvironment; +import com.seeyon.ctp.common.constants.ProductEditionEnum; +import com.seeyon.ctp.common.controller.BaseController; +import com.seeyon.ctp.common.flag.SysFlag; +import com.seeyon.ctp.common.formula.FormulaUtil; +import com.seeyon.ctp.common.log.CtpLogFactory; +import com.seeyon.ctp.organization.bo.V3xOrgMember; +import com.seeyon.ctp.organization.manager.OrgManager; +import com.seeyon.ctp.util.Strings; +import com.seeyon.ctp.util.annotation.Inject; + +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.net.URLDecoder; +import java.net.URLEncoder; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class QrCodeFormController extends BaseController { + private static Log log = Log.get(QrCodeFormController.class); + @Inject + private QrCodeFormManager qrCodeFormManager; + @Inject + private OrgManager orgManager; + @Inject + private ICstConfigApi cstConfigApi; + + public ModelAndView index(HttpServletRequest request, HttpServletResponse response) { + log.info("访问二维码生成页面!"); + ModelAndView mav = new ModelAndView("plugin/qrCodeForm/qrCodeFormIndex"); + Map map = new HashMap(); + map.put("bizType", "1"); + map.put("type", "owner-authed-biz"); + map.put("businessType", 0); + map.put("activeTab", "mineapp"); + List> bizList = qrCodeFormManager.listBusiness(map); + mav.addObject("bizList", bizList); + return mav; + } + +// https://oa.dhx.com.cn/seeyon/qrCodeForm.do?method=newMain&type=1 + public ModelAndView newMain(HttpServletRequest request, HttpServletResponse response) throws Exception { + ModelAndView mav = new ModelAndView("/wechat/collaborationContent"); + String html = ""; + String type = request.getParameter("type"); + if(Strings.isNotBlank(type)) { + //获取集成平台中url1的连接地址;/seeyon/m3/apps/v5/collaboration/html/newCollaboration.html?qc=ext&templateId=-2617827166221087111 + //可以通过配置完成地址的获取 + html = cstConfigApi.getConfig(QrCodeFormConstants.getPluginId(), "url" + type); + } + if(Strings.isBlank(html)) { + html = URLDecoder.decode(request.getParameter("html"), "UTF-8"); + } +// String loginName = qrCodeFormManager.getLoginMember(code); + /** + * 客开改动,固定登录名 + */ + //String loginName = (String) FormulaUtil.getVar("qrcode_loginname"); + String loginName = cstConfigApi.getConfig(QrCodeFormConstants.getPluginId(), QrCodeFormConstants.qrcode_loginname.name()); + log.info("登录认证获取loginName为:" + loginName); + if(Strings.isEmpty(loginName)){ +// mav.addObject("msg", "未获取到人员信息!")b; +// return mav; + loginName = "seeyon"; + } + + V3xOrgMember member = orgManager.getMemberByLoginName(loginName); + if(member == null){ + mav.addObject("msg", "人员不存在!"); + return mav; + } + SecurityCertUtil.login(request, loginName); + + Map map = LoginUtil.getToken(String.valueOf(member.getId()), member.getLoginName(), request, response); + String success = String.valueOf(map.get("success")); + if (success != null && "false".equals(success)) { +// String message = map.get("message").toString(); +// if (message.contains("User not found")) { +// mav.addObject("msg", ResourceUtil.getString("wxt.user.binding.miss") +// + "," + ResourceUtil.getString("wxt.user.name") + wechatUser.getXtUserName() + +// "," + ResourceUtil.getString("wxt.dingding.user.id") + wechatUser.getXtUserId()); +// } else { +// } + mav.addObject("msg", (String) map.get("message")); + return mav; + } + + String token = (String) map.get("id"); + String suffix = (String) SysFlag.mobileEditionSuffix.getFlag(); + String edition = ProductEditionEnum.getCurrentProductEditionEnum().getValue(); + String v5timestamp = WeixinUtil.getV5Timestamp(); + String address = cstConfigApi.getConfig(QrCodeFormConstants.getPluginId(), QrCodeFormConstants.oaAddress.name()); + if (Strings.isNotBlank(html)) { + String url = address + "" + SystemEnvironment.getContextPath() + "/H5/collaboration/index.html?token=" + token + "&edition=" + edition + "&suffix=" + suffix + "&v5timestamp=" + v5timestamp + "&loginName=" + member.getLoginName() + "&html=" + URLEncoder.encode(html, "UTF-8") + "&isAccount=&accountid=" + member.getOrgAccountId() + "&appid="; + return new ModelAndView("redirect:" + url); + } else { + return new ModelAndView("redirect:" + address + "" + SystemEnvironment.getContextPath() + "/H5/collaboration/index.html?token=" + token + "&edition=" + edition + "&suffix=" + suffix + "&v5timestamp=" + v5timestamp + "&loginName=" + member.getLoginName() + "&html=&isAccount=&accountid=" + member.getOrgAccountId()); + } + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/manager/QrCodeFormManager.java b/v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/manager/QrCodeFormManager.java new file mode 100644 index 0000000..06f5211 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/manager/QrCodeFormManager.java @@ -0,0 +1,18 @@ +package com.seeyon.apps.qrCodeForm.manager; + +import com.seeyon.cap4.form.modules.business.FormAppBO; +import com.seeyon.ctp.util.annotation.AjaxAccess; + +import java.io.UnsupportedEncodingException; +import java.util.List; +import java.util.Map; + +public interface QrCodeFormManager { + @AjaxAccess + List> listBusiness(Map params); + + @AjaxAccess + List listFormApp(Map params); + + Map qrCodeFormUrl(Map params) throws UnsupportedEncodingException; +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/manager/QrCodeFormManagerImpl.java b/v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/manager/QrCodeFormManagerImpl.java new file mode 100644 index 0000000..945c9a6 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/manager/QrCodeFormManagerImpl.java @@ -0,0 +1,160 @@ +package com.seeyon.apps.qrCodeForm.manager; + +import cn.hutool.log.Log; +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.qrCodeForm.constant.Constants; +import com.seeyon.apps.qrCodeForm.constant.QrCodeFormConstants; +import com.seeyon.apps.qrCodeForm.constant.SupportTypeEnum; +import com.seeyon.apps.weixin.manager.WechatUserManager; +import com.seeyon.apps.weixin.po.WechatUser; +import com.seeyon.cap4.form.api.FormApi4Cap4; +import com.seeyon.cap4.form.modules.business.BusinessSourceTypeManager; +import com.seeyon.cap4.form.modules.business.FormAppBO; +import com.seeyon.cap4.form.util.BizUtil; +import com.seeyon.cap4.form.util.Enums; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.SystemEnvironment; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.common.log.CtpLogFactory; +import com.seeyon.ctp.organization.bo.V3xOrgMember; +import com.seeyon.ctp.organization.manager.OrgManager; +import com.seeyon.ctp.util.FlipInfo; +import com.seeyon.ctp.util.HttpClientUtil; +import com.seeyon.ctp.util.ParamUtil; +import com.seeyon.ctp.util.Strings; +import com.seeyon.ctp.util.annotation.AjaxAccess; +import com.seeyon.ctp.util.annotation.Inject; + +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class QrCodeFormManagerImpl implements QrCodeFormManager { + + private static Log log = Log.get(QrCodeFormManagerImpl.class); + + @Inject + private FormApi4Cap4 formApi4Cap4; + @Inject + private OrgManager orgManager; + @Inject + private ICstConfigApi cstConfigApi; + @Inject + public WechatUserManager wechatUserManager; + + + /** + * 获取应用包数据 + * + * @param params + * @return + */ + @Override + @AjaxAccess + public List> listBusiness(Map params) { + List> listMap = new ArrayList>(); + try { + FlipInfo fi = new FlipInfo(1, -1); + Map resultMap = formApi4Cap4.listBusiness(fi, params); + if (Strings.isNotEmpty(fi.getData())) { + listMap = fi.getData(); + } + } catch (BusinessException e) { + e.printStackTrace(); + } + return listMap; + } + + /** + * 获取所有的应用下的模板 + * + * @param params + * @return + */ + @AjaxAccess + @Override + public List listFormApp(Map params) { + List returnList = new ArrayList<>(); + String type = ParamUtil.getString(params, "type"); + String bizConfigId = ParamUtil.getString(params, "bizConfigId"); + BusinessSourceTypeManager sourceType = BizUtil.getSourceTypeById(type); + Long bizConfigL = 0L; + if (Strings.isNotBlank(bizConfigId)) { + bizConfigL = Long.parseLong(bizConfigId); + } + try { + List allList = sourceType.getFormAppBOList(AppContext.getCurrentUser(), "", "", false, bizConfigL); + if (Strings.isNotEmpty(allList)) { + returnList = allList.stream().filter(a -> !"PARENT".equals(a.getSourctTypeName())).collect(Collectors.toList()); + } + } catch (BusinessException e) { + log.error("获取所有模板异常", e); + } + return returnList; + } + + @Override + @AjaxAccess + public Map qrCodeFormUrl(Map params) throws UnsupportedEncodingException { + Map result = new HashMap<>(); + Integer sourceType = ParamUtil.getInt(params, "sourceType"); + //String fillUrl = Constants._URLTPL.replaceAll("\\{corpId}", Constants._CORPID); + String fillUrl; + String _redirecturi = Constants._REDIRECTURI; + if (sourceType == Enums.SourceType.SOURCE_TYPE_FLOWTEMPLATE.getKey()) { + String templateId = ParamUtil.getString(params, "templateId"); + String tourl = Constants.FLOW_URL + templateId; + try { +// fillUrl = fillUrl + URLEncoder.encode( + String address = cstConfigApi.getConfig(QrCodeFormConstants.getPluginId(), QrCodeFormConstants.oaAddress.name());; + fillUrl = address + SystemEnvironment.getContextPath() + _redirecturi; + fillUrl += URLEncoder.encode(tourl, "UTF-8"); +// "http://172.16.30.123:8081"+ SystemEnvironment.getContextPath() + _redirecturi + tourl, "UTF-8" +// ) + Constants._FIXURL; + result.put("fillUrl", fillUrl); + return result; + } catch (UnsupportedEncodingException e) { + log.error("地址处理异常", e); + } + } else if (sourceType == Enums.SourceType.SOURCE_TYPE_INFOMANAGE.getKey()) { + String formType = ParamUtil.getString(params, "formType"); + String type = ParamUtil.getString(params, "type"); + String title = ParamUtil.getString(params, "title"); + String moduleId = ParamUtil.getString(params, "moduleId"); + String formTemplateId = ParamUtil.getString(params, "formTemplateId"); + String moduleType = ParamUtil.getString(params, "moduleType"); + String operateType = ParamUtil.getString(params, "operateType"); + String rightId = ParamUtil.getString(params, "rightId"); + //http://127.0.0.1/seeyon/qrCodeForm.do?method=newMain&html=/seeyon/m3/apps/v5/cap4/htmls/native/form/index.html?cusType=true&formTemplateId=-4624141853295951831&moduleId=-4624141853295951831&moduleType=42&formType=main&type=new&operateType=0&rightId=-1 + String tourl = Constants.UNFLOW_URL + "cusType=true" + + "&formTemplateId=" + formTemplateId + + "&moduleId=" + moduleId + + "&moduleType=" + moduleType + + "&formType=" + formType + + "&type=" + type + + "&rightId=" + rightId + + "&operateType=" + operateType; + try { +// fillUrl = fillUrl + URLEncoder.encode( + String address = cstConfigApi.getConfig(QrCodeFormConstants.getPluginId(), QrCodeFormConstants.oaAddress.name()); + fillUrl = address + SystemEnvironment.getContextPath() + _redirecturi; + + fillUrl += URLEncoder.encode(tourl, "UTF-8"); +// "http://172.16.30.123:80"+ SystemEnvironment.getContextPath() + _redirecturi + tourl, "UTF-8" +// ) + Constants._FIXURL; + log.info("生成地址为:" + fillUrl); + result.put("fillUrl", fillUrl); + return result; + } catch (UnsupportedEncodingException e) { + log.error("地址处理异常", e); + } + } + return result; + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/sso/WechatQRHandShake.java b/v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/sso/WechatQRHandShake.java new file mode 100644 index 0000000..6f793e7 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/sso/WechatQRHandShake.java @@ -0,0 +1,141 @@ +package com.seeyon.apps.qrCodeForm.sso; + +import cn.hutool.log.Log; +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.weixin.manager.WechatUserManager; +import com.seeyon.apps.weixin.po.WechatUser; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.log.CtpLogFactory; +import com.seeyon.ctp.organization.bo.V3xOrgMember; +import com.seeyon.ctp.organization.manager.OrgManager; +import com.seeyon.ctp.portal.sso.SSOLoginContext; +import com.seeyon.ctp.portal.sso.SSOLoginHandshakeAbstract; +import com.seeyon.ctp.util.HttpClientUtil; +import com.seeyon.ctp.util.Strings; +import com.seeyon.ctp.util.annotation.Inject; +import org.springframework.beans.factory.annotation.Autowired; + +import javax.servlet.http.HttpServletRequest; +import java.util.List; + +/** + * @author + * @title: WechatQRHandShake + * @description: 企业微信扫码发起单据 + * @date 2021/11/30 9:47 + */ +public class WechatQRHandShake extends SSOLoginHandshakeAbstract { + + private static final Log log = Log.get(WechatQRHandShake.class); + //企业微信appid + public static final String _CORPID = AppContext.getSystemProperty("qrCodeForm.corpid"); + //企业微信corpsecret + public static final String _corpsecret = AppContext.getSystemProperty("qrCodeForm.corpsecret"); + //验证方式 + public static final String handshakeType = AppContext.getSystemProperty("qrCodeForm.handshakeType"); + + @Inject + public WechatUserManager wechatUserManager; + @Autowired + private OrgManager orgManager; + @Override + public String handshake(String s) { + log.info("--进入企业微信回调接口!"); + HttpServletRequest request = AppContext.getRawRequest(); + String code =request.getParameter("code"); + + String corpid =_CORPID; + String corpsecret =_corpsecret; + + log.info("获取access接口url:https://qyapi.weixin.qq.com/cgi-bin/gettoken?"+"corpid="+corpid+"&corpsecret="+corpsecret); + String access = null; + try { + access = HttpClientUtil.getContent("https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid="+corpid+"&corpsecret="+corpsecret); + log.info("获取access接口返回:"+access); + if(access==null || access.equals("")){ + log.error("--未获取到access!"); + return null; + } + + JSONObject jsonObject = JSONObject.parseObject(access); + if(jsonObject==null){ + log.error("--未获取到access的jsonObject!"); + return null; + } + + String accessToken = (String)jsonObject.get("access_token"); + if(accessToken==null || accessToken.equals("")){ + log.error("--未获取到accessToken!"); + return null; + } + + log.info("--获取访问用户身份接口url:https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?"+"access_token=" + accessToken + "&code=" + code); + String user = HttpClientUtil.getContent("https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?access_token=" + accessToken + "&code=" + code); + log.info("--获取访问用户身份接口返回值:" + user); + if(user==null || user.equals("")){ + log.error("--未获取到user!"); + return null; + } + + JSONObject userJson = JSONObject.parseObject(user); + if(userJson==null){ + log.error("--未获取到user的jsonObject!"); + return null; + } + + String userid = userJson.getString("UserId"); + if(userid==null || userid.equals("")){ + log.error("--未获取到userid!"); + return null; + } + String Loginname = null; +// if("1".equals(handshakeType)){//使用标准模块的微信绑定 + if(false){ //企业微信、微协同绑定等信息存储在微协同云服务中,废弃逻辑 + WechatUser wechatUser =wechatUserManager.getWechatUserByUserIdAndcorpId(userid,corpid); + Loginname=wechatUser.getXtLoginName(); + }else {//自定义如何根据微信得用户id获取OA的用户 + log.info("--获取成员接口url:https://qyapi.weixin.qq.com/cgi-bin/user/get?"+"access_token=" + accessToken + "&userid=" + userid); + String member = HttpClientUtil.getContent("https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token=" + accessToken + "&userid=" + userid); + log.info("获取成员接口返回值:" + member); + if(member==null || member.equals("")){ + log.error("--未获取到member!"); + return null; + } + + JSONObject memberJson = JSONObject.parseObject(member); + if(userJson==null){ + log.error("--未获取到member的jsonObject!"); + return null; + } + + String mobile = memberJson.getString("mobile"); + if(mobile==null || mobile.equals("")){ + log.error("--未获取到mobile!"); + return null; + } + List memberList=orgManager.getMemberListByMobile(mobile,null); + Loginname = memberList!=null?memberList.get(0).getLoginName():null; + } + if(Loginname ==null || Loginname.equals("")){ + log.error("--未获取到loginName!"); + return null; + } + return Loginname; + + } catch (Exception e) { + log.error("获取微信验证失败",e); + } + + return null; + } + + @Override + public void logoutNotify(String s) { + + } + + @Override + public String getToUrl(HttpServletRequest req, SSOLoginContext ssoLoginContext, String ticket) { + return req.getParameter("tourl"); + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/util/InitQrCodeFormUitl.java b/v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/util/InitQrCodeFormUitl.java new file mode 100644 index 0000000..0ab83e9 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/util/InitQrCodeFormUitl.java @@ -0,0 +1,118 @@ +package com.seeyon.apps.qrCodeForm.util; + +import cn.hutool.log.Log; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.privilege.bo.PrivMenuBO; +import com.seeyon.ctp.privilege.enums.PrivMenuTypeEnums; +import com.seeyon.ctp.privilege.manager.PrivilegeMenuManager; +import com.seeyon.ctp.privilege.po.PrivMenu; +import com.seeyon.ctp.util.DBAgent; +import com.seeyon.ctp.util.DateUtil; + + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; + +public class InitQrCodeFormUitl { +// private static Log log = LogFactory.getLog(InitQrCodeFormUitl.class); + private static Log log = Log.get(InitQrCodeFormUitl.class); + private static PrivilegeMenuManager privilegeMenuManager = (PrivilegeMenuManager) AppContext.getBean("privilegeMenuManager"); + + public static void initMenu() { + try { + List listmenu = new ArrayList(); + + StringBuffer queryString = new StringBuffer(" FROM "); + queryString.append(PrivMenu.class.getSimpleName()).append(" where ") + .append(" path = '711' "); + + listmenu = DBAgent.find(queryString.toString()); + if (listmenu == null || listmenu.size() < 1) { + creatFileImportMenu();//创建菜单资源 + } + log.info("模板二维码菜单完成"); + + } catch (Exception e) { + log.error("模板二维码菜单失败", e); + } + + } + + /** + * 配置菜单 + * + * @return + * @throws BusinessException + */ + private static void creatFileImportMenu() { + try { + List menus = new ArrayList(); + PrivMenu configmenu = new PrivMenu(); + configmenu.setNewId(); + configmenu.setName("模板二维码"); + configmenu.setIcon("conferencearrangemen.png"); + configmenu.setSortid(1); + configmenu.setPath("711"); + configmenu.setExt1("0"); + configmenu.setExt2("1"); + configmenu.setExt3(""); + configmenu.setExt4(1); + configmenu.setExt7(configmenu.getName()); + configmenu.setExt8(""); + configmenu.setExt9(""); + configmenu.setExt10(""); + configmenu.setExt11(""); + configmenu.setExt12(0); + configmenu.setExt13(0); + configmenu.setExt14(0); + configmenu.setExt15(0); + configmenu.setExt16(0); + Date nowDate = new Date(); + configmenu.setCreatedate(nowDate); + configmenu.setUpdatedate(nowDate); + configmenu.setType(PrivMenuTypeEnums.systemPresetMenu.getKey()); + configmenu.setParentId(0L); + menus.add(configmenu); + + PrivMenu syncConfig = new PrivMenu();//二维码生成 + syncConfig.setNewId(); + syncConfig.setName("二维码生成"); + syncConfig.setIcon("b_menu_thridpartyspace.png"); + syncConfig.setTarget("mainfrm"); + syncConfig.setSortid(1); + syncConfig.setPath("711001"); + syncConfig.setExt1("0"); + syncConfig.setExt2("2"); + syncConfig.setExt3(""); + syncConfig.setExt4(1); + syncConfig.setExt7(syncConfig.getName()); + syncConfig.setExt8("0"); + syncConfig.setExt9("0"); + syncConfig.setExt10("0"); + syncConfig.setExt11("1"); + syncConfig.setExt19(2L); + syncConfig.setEnterResource(1); + syncConfig.setResourceNavurl("/qrCodeForm.do?method=index"); + syncConfig.setResourceCode("qrCodeForm"); + syncConfig.setResourceModuleid("none"); + syncConfig.setCreatedate(nowDate); + syncConfig.setUpdatedate(nowDate); + syncConfig.setUpdateuserid(1L); + syncConfig.setShow(true); + syncConfig.setControl(true); + syncConfig.setType(PrivMenuTypeEnums.systemPresetMenu.getKey()); + syncConfig.setParentId(configmenu.getId()); + menus.add(syncConfig); + + DBAgent.saveAll(menus); + } catch (Exception e) { + log.error("组织机构同步菜单异常", e); + } + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/util/LoginUtil.java b/v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/util/LoginUtil.java new file mode 100644 index 0000000..c7f1df3 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/util/LoginUtil.java @@ -0,0 +1,72 @@ +package com.seeyon.apps.qrCodeForm.util; + +import cn.hutool.cache.CacheUtil; +import cn.hutool.cache.impl.TimedCache; +import cn.hutool.log.Log; +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.common.plugin.vo.ConfigVo; +import com.seeyon.apps.qrCodeForm.constant.QrCodeFormConstants; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.constants.Constants; +import com.seeyon.ctp.rest.util.TokenUtil; +import com.seeyon.ctp.services.UserToken; +import com.seeyon.ctp.util.Strings; +import com.seeyon.ctp.util.TextEncoder; + + + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.HashMap; +import java.util.Map; + +public class LoginUtil { + private static Log log = Log.get(LoginUtil.class); + + private static ICstConfigApi cstConfigApi = (ICstConfigApi) AppContext.getBean("cstConfigApi"); + + private static TimedCache tokenCache = CacheUtil.newTimedCache(14 * 60 * 1000); + + //rest信息 +// public static final String restName = AppContext.getSystemProperty("qrCodeForm.restName"); +// public static final String restPassword = AppContext.getSystemProperty("qrCodeForm.restPassword"); + + + /** + * 获取token + * + * @param loginName 登录名 + * @return + */ + public static Map getToken(String memberId, String loginName, HttpServletRequest request, HttpServletResponse response) { + Map map = new HashMap(); + String tokenId = tokenCache.get(memberId); + if(null != tokenId) { + map.put("id", tokenId); + map.put("success", true); + return map; + } + try { + ConfigVo config = cstConfigApi.getConfig(QrCodeFormConstants.getPluginId()); + String userName = config.getParamVal(QrCodeFormConstants.restId.name()); + String password = config.getParamVal(QrCodeFormConstants.restPwd.name()); + password = TextEncoder.decode(password); + Long userId = null; + if (Strings.isNotBlank(memberId)) { + userId = Long.parseLong(memberId); + } + UserToken token = TokenUtil._getToken(userName, password, userId, loginName, null, Constants.login_useragent_from.wechat.name(), request, response); + if (token != null) { + map.put("success", true); + map.put("id", token.getId()); + tokenCache.put(memberId, token.getId()); + } + } catch (Exception e) { + log.error("", e); + map.put("success", false); + map.put("message", e.getMessage()); + } + return map; + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_commondatamapping/bo/DataFetchType.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_commondatamapping/bo/DataFetchType.java new file mode 100644 index 0000000..7950620 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_commondatamapping/bo/DataFetchType.java @@ -0,0 +1,6 @@ +package com.seeyon.apps.src_commondatamapping.bo; + +public enum DataFetchType { + DATABASE, + HTTP +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_commondatamapping/bo/DataMappingStrategy.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_commondatamapping/bo/DataMappingStrategy.java new file mode 100644 index 0000000..f50856f --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_commondatamapping/bo/DataMappingStrategy.java @@ -0,0 +1,161 @@ +package com.seeyon.apps.src_commondatamapping.bo; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +public class DataMappingStrategy { + private Long id; //策略ID + private String strategyName; //策略名称 + private String strategyGroup; //策略组名称 + private Long groupId; //策略组ID + private String oaFormNo; //oa表单编号 + private String sourceMainTable; //源数据主表名 + private List sourceSubTable; //源数据从表名 + private String httpReqUrl; //请求地址 + private Map reqHeads; //请求头 + private Map reqParams; //请求参数 + private Map mainFormMappingList; //主表映射 + private Map subFormMappingList; //从表字段映射关系 + private DataFetchType dataFetchType; //源数据获取类型 + private Date createTime; + private String dataBaseUrl; + private String dataBaseUserName; + private String dataBasePwd; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getStrategyName() { + return strategyName; + } + + public void setStrategyName(String strategyName) { + this.strategyName = strategyName; + } + + public Long getGroupId() { + return groupId; + } + + public void setGroupId(Long groupId) { + this.groupId = groupId; + } + + public String getOaFormNo() { + return oaFormNo; + } + + public void setOaFormNo(String oaFormNo) { + this.oaFormNo = oaFormNo; + } + + public String getSourceMainTable() { + return sourceMainTable; + } + + public void setSourceMainTable(String sourceMainTable) { + this.sourceMainTable = sourceMainTable; + } + + public List getSourceSubTable() { + return sourceSubTable; + } + + public void setSourceSubTable(List sourceSubTable) { + this.sourceSubTable = sourceSubTable; + } + + public String getHttpReqUrl() { + return httpReqUrl; + } + + public void setHttpReqUrl(String httpReqUrl) { + this.httpReqUrl = httpReqUrl; + } + + public Map getReqHeads() { + return reqHeads; + } + + public void setReqHeads(Map reqHeads) { + this.reqHeads = reqHeads; + } + + public Map getReqParams() { + return reqParams; + } + + public void setReqParams(Map reqParams) { + this.reqParams = reqParams; + } + + public Map getMainFormMappingList() { + return mainFormMappingList; + } + + public void setMainFormMappingList(Map mainFormMappingList) { + this.mainFormMappingList = mainFormMappingList; + } + + public Map getSubFormMappingList() { + return subFormMappingList; + } + + public void setSubFormMappingList(Map subFormMappingList) { + this.subFormMappingList = subFormMappingList; + } + + public DataFetchType getDataFetchType() { + return dataFetchType; + } + + public void setDataFetchType(DataFetchType dataFetchType) { + this.dataFetchType = dataFetchType; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public String getDataBaseUrl() { + return dataBaseUrl; + } + + public void setDataBaseUrl(String dataBaseUrl) { + this.dataBaseUrl = dataBaseUrl; + } + + public String getDataBaseUserName() { + return dataBaseUserName; + } + + public void setDataBaseUserName(String dataBaseUserName) { + this.dataBaseUserName = dataBaseUserName; + } + + public String getDataBasePwd() { + return dataBasePwd; + } + + public void setDataBasePwd(String dataBasePwd) { + this.dataBasePwd = dataBasePwd; + } + + public String getStrategyGroup() { + return strategyGroup; + } + + public void setStrategyGroup(String strategyGroup) { + this.strategyGroup = strategyGroup; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_commondatamapping/controller/DataMappingStrategyController.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_commondatamapping/controller/DataMappingStrategyController.java new file mode 100644 index 0000000..4a40004 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_commondatamapping/controller/DataMappingStrategyController.java @@ -0,0 +1,10 @@ +package com.seeyon.apps.src_commondatamapping.controller; + +import com.seeyon.apps.src_commondatamapping.bo.DataMappingStrategy; + +public class DataMappingStrategyController { + + public void createStrategy(DataMappingStrategy strategy) { + + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_commondatamapping/service/DataMappingStrategyService.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_commondatamapping/service/DataMappingStrategyService.java new file mode 100644 index 0000000..fb945ec --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_commondatamapping/service/DataMappingStrategyService.java @@ -0,0 +1,12 @@ +package com.seeyon.apps.src_commondatamapping.service; + +import com.seeyon.apps.src_commondatamapping.bo.DataMappingStrategy; + +public class DataMappingStrategyService { + public void createStrategy(DataMappingStrategy strategy) { + if(strategy.getGroupId() == null && strategy.getStrategyGroup() != null) { + //如果不存在策略组则进行创建 + } + //保存策略 + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/OrganizationPluginApi.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/OrganizationPluginApi.java new file mode 100644 index 0000000..9f03173 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/OrganizationPluginApi.java @@ -0,0 +1,44 @@ +package com.seeyon.apps.src_mainorganization; + +import com.seeyon.apps.src_mainorganization.constans.SyncConstants; +import com.seeyon.apps.common.plugin.api.APluginInfoApi; +import com.seeyon.apps.common.plugin.vo.ConfigVo; + +public class OrganizationPluginApi extends APluginInfoApi { + public OrganizationPluginApi() { + } + + public String getPluginId() { + System.out.println(SyncConstants.getPluginId()); + return SyncConstants.getPluginId(); + } + + public String getCreateUser() { + return "橙阳科技"; + } + + public String getDescription() { + return "主数据组织架构集成管理"; + } + + public boolean syncOrg() { + return true; + } + + public ConfigVo getDefaultConfig() { + ConfigVo configVo = new ConfigVo(); + SyncConstants[] var2 = SyncConstants.values(); + int var3 = var2.length; + + for(int var4 = 0; var4 < var3; ++var4) { + SyncConstants value = var2[var4]; + if (value != SyncConstants.plugin) { + configVo.getDevParams().put(value.name(), value.getDefaultValue()); + configVo.getProdParams().put(value.name(), value.getDefaultValue()); + configVo.getParamMap().put(value.name(), value.getDescription()); + } + } + + return configVo; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/bo/ReceiveOrgMemberResponse.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/bo/ReceiveOrgMemberResponse.java new file mode 100644 index 0000000..e2a31e2 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/bo/ReceiveOrgMemberResponse.java @@ -0,0 +1,56 @@ +package com.seeyon.apps.src_mainorganization.bo; + +import com.alibaba.fastjson.JSONObject; + +public class ReceiveOrgMemberResponse { + + private boolean success; + private int status; + private String msg; + private String data; + public ReceiveOrgMemberResponse() {} + public ReceiveOrgMemberResponse(JSONObject object) { + + this.status = object.getString("status").equals("1")?1:2; + this.success = (1 == status); + this.msg = object.getString("msg"); + this.data = object.getString("data"); + } + + public boolean isSuccess() { + return success; + } + + public ReceiveOrgMemberResponse setSuccess(boolean success) { + this.success = success; + return this; + } + + public int getStatus() { + return status; + } + + public ReceiveOrgMemberResponse setStatus(int status) { + this.status = status; + return this; + } + + public String getMsg() { + return msg; + } + + public ReceiveOrgMemberResponse setMsg(String msg) { + this.msg = msg; + return this; + } + + public String getData() { + return data; + } + + public ReceiveOrgMemberResponse setData(String data) { + this.data = data; + return this; + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/bo/ThirdCustomerBo.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/bo/ThirdCustomerBo.java new file mode 100644 index 0000000..567c235 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/bo/ThirdCustomerBo.java @@ -0,0 +1,348 @@ +package com.seeyon.apps.src_mainorganization.bo; + +import com.alibaba.fastjson.JSONObject; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.ctpenumnew.manager.EnumManager; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.common.po.ctpenumnew.CtpEnumItem; +import com.seeyon.ctp.organization.bo.V3xOrgAccount; +import com.seeyon.ctp.organization.bo.V3xOrgDepartment; +import com.seeyon.ctp.organization.manager.OrgManager; + +import java.util.Map; + +public class ThirdCustomerBo { + + private String id;//数据唯一值ID + private String customerCode;//客户编码 + private String customerName;//客户名称 + private String customerNature;//客户性质 + private String customerNatureValue;//客户性质值 + private String customerProvince;//所属省份 + private String customerProvinceValue;//所属省份值 + private String state;//状态 + private String stateValue;//状态值 + private String area;//所属区域 + private long areaId;//所属区域 + private String marketizationCompany;//市场化公司 + private String market;//销售市场 + private String creditCode;//统一社会信用代码 + private String registeredCapital;//注册资本 + private String legalPerson;//法人代表人 + private String legalPersonId;//法人身份证号 + private String legalPersonTelnumber;//法人电话 + private String contactSite;//联系地址 + private String consigneeSite;//收货地址 + private String postalCode;//邮政编码 + private String consigneeName1;//第一收货人 + private String consigneeTelnumber1;//第一收货人地址 + private String consigneeName2;//第二收货人 + private String consigneeTelnumber2;//第二收货人地址 + + + private EnumManager enumManagerNew; + public void setEnumManagerNew(EnumManager enumManagerNew) { + this.enumManagerNew = enumManagerNew; + } + public EnumManager getEnumManagerNew() { + if (enumManagerNew == null) {enumManagerNew = (EnumManager) AppContext.getBean("enumManagerNew");}return enumManagerNew; + } + + private OrgManager orgManager; + public void setOrgManager(OrgManager orgManager) { + this.orgManager = orgManager; + } + public OrgManager getOrgManager() { + if (orgManager == null) {orgManager = (OrgManager) AppContext.getBean("orgManager");}return orgManager; + } + + + public ThirdCustomerBo(Map customerMap) throws BusinessException { + this.id = customerMap.get("id")==null ? "":customerMap.get("id").toString(); + this.customerCode = customerMap.get("customer_code")==null ? "":customerMap.get("customer_code").toString(); + this.customerName = customerMap.get("customer_name")==null ? "":customerMap.get("customer_name").toString(); + if(customerMap.get("customer_nature")!=null ){ + String customerNatureId = customerMap.get("customer_nature").toString(); + CtpEnumItem customerNatureEnum = getEnumManagerNew().getCtpEnumItem(Long.parseLong(customerNatureId)); + this.customerNature = customerNatureEnum.getShowvalue(); + this.customerNatureValue = customerNatureEnum.getEnumvalue(); + }else{ + this.customerNature = ""; + this.customerNatureValue = ""; + } + if(customerMap.get("customer_province")!=null ){ + String customerProvinceId = customerMap.get("customer_province").toString(); + CtpEnumItem customerProvinceEnum = getEnumManagerNew().getCtpEnumItem(Long.parseLong(customerProvinceId)); + this.customerProvince = customerProvinceEnum.getShowvalue(); + this.customerProvinceValue = customerProvinceEnum.getEnumvalue(); + }else{ + this.customerProvince = ""; + this.customerProvinceValue = ""; + } + if(customerMap.get("state")!=null ){ + String stateId = customerMap.get("state").toString(); + CtpEnumItem stateEnum = getEnumManagerNew().getCtpEnumItem(Long.parseLong(stateId)); + this.state = stateEnum.getShowvalue(); + this.stateValue = stateEnum.getEnumvalue(); + }else{ + this.state = ""; + this.stateValue = ""; + } + if(customerMap.get("area")!=null ){ + String areaId = customerMap.get("area").toString(); + V3xOrgDepartment department = getOrgManager().getDepartmentById(Long.parseLong(areaId)); + this.area = department.getName(); + this.areaId = department.getId(); + }else{ + this.area = ""; + this.areaId = 0l; + } + if(customerMap.get("marketization_company")!=null ){ + String marketizationCompanyId = customerMap.get("marketization_company").toString(); + V3xOrgAccount account = getOrgManager().getAccountById(Long.parseLong(marketizationCompanyId)); + this.marketizationCompany = account.getName(); + }else{ + this.marketizationCompany = ""; + } + this.market = customerMap.get("market")==null ? "":customerMap.get("market").toString(); + this.creditCode = customerMap.get("credit_code")==null ? "":customerMap.get("credit_code").toString(); + this.registeredCapital = customerMap.get("registered_capital")==null ? "":customerMap.get("registered_capital").toString(); + this.legalPerson = customerMap.get("legal_person")==null ? "":customerMap.get("legal_person").toString(); + this.legalPersonId = customerMap.get("legal_person_id")==null ? "":customerMap.get("legal_person_id").toString(); + this.legalPersonTelnumber = customerMap.get("legal_person_telnumber")==null ? "":customerMap.get("legal_person_telnumber").toString(); + this.contactSite = customerMap.get("contact_site")==null ? "":customerMap.get("contact_site").toString(); + this.consigneeSite = customerMap.get("consignee_site")==null ? "":customerMap.get("consignee_site").toString(); + this.postalCode = customerMap.get("postal_code")==null ? "":customerMap.get("postal_code").toString(); + this.consigneeName1 = customerMap.get("consignee_name1")==null ? "":customerMap.get("consignee_name1").toString(); + this.consigneeTelnumber1 = customerMap.get("consignee_telnumber1")==null ? "":customerMap.get("consignee_telnumber1").toString(); + this.consigneeName2 = customerMap.get("consignee_name2")==null ? "":customerMap.get("consignee_name2").toString(); + this.consigneeTelnumber2 = customerMap.get("consignee_telnumber2")==null ? "":customerMap.get("consignee_telnumber2").toString(); + } + + + public JSONObject toCustomerJSON(){ + JSONObject jsonObject = new JSONObject(); + jsonObject.put("id",this.id); + jsonObject.put("customerCode",this.customerCode); + jsonObject.put("customerName",this.customerName); + jsonObject.put("customerNatureValue",this.customerNatureValue); + jsonObject.put("customerProvince",this.customerProvince); + jsonObject.put("customerProvinceValue",this.customerProvinceValue); + jsonObject.put("state",this.state); + jsonObject.put("stateValue",this.stateValue); + jsonObject.put("area",this.area); + jsonObject.put("areaId",this.areaId); + jsonObject.put("marketizationCompany",this.marketizationCompany); + jsonObject.put("creditCode",this.creditCode); + jsonObject.put("registeredCapital",this.registeredCapital); + jsonObject.put("legalPerson",this.legalPerson); + jsonObject.put("legalPersonId",this.legalPersonId); + jsonObject.put("legalPersonTelnumber",this.legalPersonTelnumber); + jsonObject.put("contactSite",this.contactSite); + jsonObject.put("consigneeSite",this.consigneeSite); + jsonObject.put("postalCode",this.postalCode); + jsonObject.put("consigneeName1",this.consigneeName1); + jsonObject.put("consigneeTelnumber1",this.consigneeTelnumber1); + jsonObject.put("consigneeName2",this.consigneeName2); + jsonObject.put("consigneeTelnumber2",this.consigneeTelnumber2); + return jsonObject; + } + + + + public String getId(){return id;} + + public void setId(String id){this.id = id ;} + + public String getCustomerCode() { + return customerCode; + } + + public void setCustomerCode(String customerCode) { + this.customerCode = customerCode; + } + + public String getCustomerName() { + return customerName; + } + + public void setCustomerName(String customerName) { + this.customerName = customerName; + } + + public String getCustomerNature() { + return customerNature; + } + + public void setCustomerNature(String customerNature) { + this.customerNature = customerNature; + } + + public String getCustomerNatureValue() { + return customerNatureValue; + } + + public void setCustomerNatureValue(String customerNatureValue) { + this.customerNatureValue = customerNatureValue; + } + + public String getCustomerProvince() { + return customerProvince; + } + + public void setCustomerProvince(String customerProvince) { + this.customerProvince = customerProvince; + } + + public String getCustomerProvinceValue() { + return customerProvinceValue; + } + + public void setCustomerProvinceValue(String customerProvinceValue) { + this.customerProvinceValue = customerProvinceValue; + } + + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } + + public String getStateValue() { + return stateValue; + } + + public void setStateValue(String stateValue) { + this.stateValue = stateValue; + } + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public long getAreaId() { + return areaId; + } + + public void setAreaId(long areaId) { + this.areaId = areaId; + } + + public String getMarketizationCompany() { + return marketizationCompany; + } + + public void setMarketizationCompany(String marketizationCompany) { + this.marketizationCompany = marketizationCompany; + } + + public String getMarket() { + return market; + } + + public void setMarket(String market) { + this.market = market; + } + + public String getCreditCode() { + return creditCode; + } + + public void setCreditCode(String creditCode) { + this.creditCode = creditCode; + } + + public String getRegisteredCapital() { + return registeredCapital; + } + + public void setRegisteredCapital(String registeredCapital) { + this.registeredCapital = registeredCapital; + } + + public String getLegalPerson() { + return legalPerson; + } + + public void setLegalPerson(String legalPerson) { + this.legalPerson = legalPerson; + } + + public String getLegalPersonId() { + return legalPersonId; + } + + public void setLegalPersonId(String legalPersonId) { + this.legalPersonId = legalPersonId; + } + + public String getLegalPersonTelnumber() { + return legalPersonTelnumber; + } + + public void setLegalPersonTelnumber(String legalPersonTelnumber) { + this.legalPersonTelnumber = legalPersonTelnumber; + } + + public String getContactSite() { + return contactSite; + } + + public void setContactSite(String contactSite) { + this.contactSite = contactSite; + } + + public String getConsigneeSite() { + return consigneeSite; + } + + public void setConsigneeSite(String consigneeSite) { + this.consigneeSite = consigneeSite; + } + + public String getPostalCode() { + return postalCode; + } + + public void setPostalCode(String postalCode) { + this.postalCode = postalCode; + } + + public String getConsigneeName1() { + return consigneeName1; + } + + public void setConsigneeName1(String consigneeName1) { + this.consigneeName1 = consigneeName1; + } + + public String getConsigneeTelnumber1() { + return consigneeTelnumber1; + } + + public void setConsigneeTelnumber1(String consigneeTelnumber1) { + this.consigneeTelnumber1 = consigneeTelnumber1; + } + + public String getConsigneeName2() { + return consigneeName2; + } + + public void setConsigneeName2(String consigneeName2) { + this.consigneeName2 = consigneeName2; + } + + public String getConsigneeTelnumber2() { + return consigneeTelnumber2; + } + + public void setConsigneeTelnumber2(String consigneeTelnumber2) { + this.consigneeTelnumber2 = consigneeTelnumber2; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/bo/ThirdDeptBo.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/bo/ThirdDeptBo.java new file mode 100644 index 0000000..acf782a --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/bo/ThirdDeptBo.java @@ -0,0 +1,470 @@ +package com.seeyon.apps.src_mainorganization.bo; + +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.src_mainorganization.dao.ISrcAccountDao; +import com.seeyon.apps.src_mainorganization.dao.ISrcDepartmentDao; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.organization.OrgConstants; +import com.seeyon.ctp.organization.bo.*; + +import java.util.Map; + +public class ThirdDeptBo { + + private ISrcDepartmentDao srcDepartmentDao; + public void setSrcDepartmentDao(ISrcDepartmentDao ordinaryDao) { + this.srcDepartmentDao = srcDepartmentDao; + } + public ISrcDepartmentDao getSrcDepartmentDao() { + if (this.srcDepartmentDao == null) { + this.srcDepartmentDao = ((ISrcDepartmentDao)AppContext.getBean("srcDepartmentDao")); + } + return srcDepartmentDao; + } + + private ISrcAccountDao srcAccountDao; + public void setSrcAccountDao(ISrcAccountDao srcAccountDao) { + this.srcAccountDao = srcAccountDao; + } + public ISrcAccountDao getSrcAccountDao() { + if (this.srcAccountDao == null) { + this.srcAccountDao = ((ISrcAccountDao)AppContext.getBean("srcAccountDao")); + } + return srcAccountDao; + } + + private long orgAccountId; + private long id; + private String name; + private String code; + private String sortId; + private String shortName; + private boolean isDeleted; + private boolean enabled; + private String externalType; + private String status; + private String description; + private String path; + private String secondName; + private String isInternal; + private boolean isGroup; + private OrgConstants.UnitType type; + private long superior; + private String superiorName; + private String createrId; + private String entityType; + private int state; + + public ThirdDeptBo(V3xOrgAccount v3xOrgAccount) { + this.id = v3xOrgAccount.getId(); +// this.orgAccountId = Long.parseLong(companyId); + this.orgAccountId = v3xOrgAccount.getOrgAccountId(); + this.name = v3xOrgAccount.getName(); + this.code = v3xOrgAccount.getCode(); + this.sortId = v3xOrgAccount.getSortId() + ""; + this.shortName = v3xOrgAccount.getShortName(); + this.isDeleted = v3xOrgAccount.getIsDeleted(); + this.enabled = v3xOrgAccount.getEnabled(); + this.externalType = v3xOrgAccount.getEntityType(); + this.status = v3xOrgAccount.getStatus() + ""; + this.path = v3xOrgAccount.getPath(); + this.description = v3xOrgAccount.getDescription(); + this.secondName = v3xOrgAccount.getSecondName(); + this.isGroup = v3xOrgAccount.getIsGroup(); + this.type = v3xOrgAccount.getType(); + this.superior = v3xOrgAccount.getSuperior(); + this.superiorName = v3xOrgAccount.getSuperiorName(); + this.entityType = v3xOrgAccount.getEntityType(); + } + + public ThirdDeptBo(V3xOrgDepartment v3xOrgDepartment) { + this.id = v3xOrgDepartment.getId(); +// this.orgAccountId = Long.parseLong(companyId); + this.orgAccountId = v3xOrgDepartment.getOrgAccountId(); + this.name = v3xOrgDepartment.getName(); + this.code = v3xOrgDepartment.getCode(); + this.sortId = v3xOrgDepartment.getSortId() + ""; + this.shortName = v3xOrgDepartment.getShortName(); + this.isDeleted = v3xOrgDepartment.getIsDeleted(); + this.enabled = v3xOrgDepartment.getEnabled(); + this.externalType = v3xOrgDepartment.getEntityType(); + this.status = v3xOrgDepartment.getStatus() + ""; + this.description = v3xOrgDepartment.getDescription(); + this.secondName = v3xOrgDepartment.getSecondName(); + this.isGroup = v3xOrgDepartment.getIsGroup(); + this.type = v3xOrgDepartment.getType(); + this.superior = v3xOrgDepartment.getSuperior(); + this.superiorName = v3xOrgDepartment.getSuperiorName(); + this.entityType = v3xOrgDepartment.getEntityType(); + } + + public long getOrgAccountId() { + return this.orgAccountId; + } + + public void setOrgAccountId(long orgAccountId) { + this.orgAccountId = orgAccountId; + } + + public long getId() { + return this.id; + } + + public void setId(long id) { + this.id = id; + } + + public String getName() { + return this.name; + } + + public void setName(String name) { + this.name = name; + } + + public String getCode() { + return this.code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getSortId() { + return this.sortId; + } + + public void setSortId(String sortId) { + this.sortId = sortId; + } + + public String getShortName() { + return this.shortName; + } + + public void setShortName(String shortName) { + this.shortName = shortName; + } + + public boolean getIsDeleted() { + return this.isDeleted; + } + + public void setIsDeleted(boolean isDeleted) { + this.isDeleted = isDeleted; + } + + public boolean getEnabled() { + return this.enabled; + } + + public void setEnabled(boolean enabled) { + this.enabled = enabled; + } + + public String getExternalType() { + return this.externalType; + } + + public void setExternalType(String externalType) { + this.externalType = externalType; + } + + public String getStatus() { + return this.status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getDescription() { + return this.description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getPath() { + return this.path; + } + + public void setPath(String path) { + this.path = path; + } + + public String getSecondName() { + return this.secondName; + } + + public void setSecondName(String secondName) { + this.secondName = secondName; + } + + public String getIsInternal() { + return this.isInternal; + } + + public void setIsInternal(String isInternal) { + this.isInternal = isInternal; + } + + public boolean getIsGroup() { + return this.isGroup; + } + + public void setIsGroup(boolean isGroup) { + this.isGroup = isGroup; + } + + public OrgConstants.UnitType getType() { + return this.type; + } + + public void setType(OrgConstants.UnitType type) { + this.type = type; + } + + public long getSuperior() { + return this.superior; + } + + public void setSuperior(long superior) { + this.superior = superior; + } + + public String getSuperiorName() { + return this.superiorName; + } + + public void setSuperiorName(String superiorName) { + this.superiorName = superiorName; + } + + public String getCreaterId() { + return this.createrId; + } + + public void setCreaterId(String createrId) { + this.createrId = createrId; + } + + public String getEntityType() { + return this.entityType; + } + + public void setEntityType(String entityType) { + this.entityType = entityType; + } + + public ThirdDeptBo() { + } + + @Override + public String toString() { + return "ThirdDeptBo{" + + "orgAccountId=" + orgAccountId + + ", id=" + id + + ", name='" + name + '\'' + + ", code='" + code + '\'' + + ", sortId='" + sortId + '\'' + + ", shortName='" + shortName + '\'' + + ", isDeleted=" + isDeleted + + ", enabled=" + enabled + + ", externalType='" + externalType + '\'' + + ", status='" + status + '\'' + + ", description='" + description + '\'' + + ", path='" + path + '\'' + + ", secondName='" + secondName + '\'' + + ", isInternal='" + isInternal + '\'' + + ", isGroup=" + isGroup + + ", type=" + type + + ", superior=" + superior + + ", superiorName='" + superiorName + '\'' + + ", createrId='" + createrId + '\'' + + ", entityType='" + entityType + '\'' + + ", state=" + state + + '}'; + } + + +// { +// "id":"单位ID", +// "name":"单位名称", +// "code":"单位编码", +// "type":"类型", +// "isEnabled":"是否启用", +// "path":"单位路径", +// "superior":"上级单位ID", +// "superiorName":"上级单位名称", +// "orgAccountId":"所属单位ID", +// "orgAccountName":"所属单位名称" +// } +// 创建法人架构单位信息 + public JSONObject financeAccount (V3xOrgAccount v3xOrgAccount ) throws BusinessException { + JSONObject orgAccount = new JSONObject(); + orgAccount.put("id",v3xOrgAccount.getId()); + orgAccount.put("name",v3xOrgAccount.getName()); + orgAccount.put("code",v3xOrgAccount.getCode()); + orgAccount.put("type","Account"); +// 查询人员所在单位对象 + orgAccount.put("orgAccountId",v3xOrgAccount.getId()); + orgAccount.put("orgAccountName",v3xOrgAccount.getName()); + + orgAccount.put("isEnabled",v3xOrgAccount.getEnabled()); + orgAccount.put("sortId",v3xOrgAccount.getSortId()); + + String accountPath = v3xOrgAccount.getPath(); + orgAccount.put("path",accountPath); + String superAccountPath = accountPath.substring(0,accountPath.length()-4); + if("0000".equals(superAccountPath)){ +// 当前是一级部门设置上级ID时设置为1 + orgAccount.put("superior","1"); + orgAccount.put("superiorName","集团"); + }else{ + Map superAccount = getSrcAccountDao().getAccountByPath(superAccountPath); + orgAccount.put("superior",superAccount.get("id")); + orgAccount.put("superiorName",superAccount.get("name")); + } + return orgAccount; + } + +// 创建法人架构单位信息 + public JSONObject defaultRootDirectory () { + JSONObject orgAccount = new JSONObject(); + orgAccount.put("id","1"); + orgAccount.put("name","稻花香"); + orgAccount.put("code",""); + orgAccount.put("type","Account"); +// 查询人员所在单位对象 + orgAccount.put("orgAccountId","1"); + orgAccount.put("orgAccountName","daohuaxiang"); + orgAccount.put("isEnabled",true); + orgAccount.put("sortId","1"); + orgAccount.put("path","0000"); + orgAccount.put("superior",""); + return orgAccount; + } + + /** + * 创建特殊单位json对象 + * @param v3xOrgAccount + * @param path + * @param superAccount + * @return + */ + public JSONObject specialAccount(V3xOrgAccount v3xOrgAccount,String path,V3xOrgAccount superAccount){ + JSONObject orgAccount = new JSONObject(); + orgAccount.put("id",v3xOrgAccount.getId()); + orgAccount.put("name",v3xOrgAccount.getName()); + orgAccount.put("code",v3xOrgAccount.getCode()); + orgAccount.put("type","Account"); +// 查询人员所在单位对象 + orgAccount.put("orgAccountId",v3xOrgAccount.getId()); + orgAccount.put("orgAccountName",v3xOrgAccount.getName()); + + orgAccount.put("isEnabled",v3xOrgAccount.getEnabled()); + orgAccount.put("sortId",v3xOrgAccount.getSortId()); + + orgAccount.put("path",path); + orgAccount.put("superior",superAccount.getId()); + orgAccount.put("superiorName",superAccount.getName()); + return orgAccount; + } + + + // { +// "id":"部门ID", +// "name":"部门名称", +// "code":"部门编码", +// "type":"类型", +// "isEnabled":"是否启用", +// "path":"部门路径", +// "superior":"上级单位或者部门ID", +// "superiorName":"上级单位或者部门名称", +// "orgAccountId":"所属单位ID", +// "orgAccountName":"所属单位名称" +// } +// 创建法人架构部门信息 + public JSONObject financeDepartment (V3xOrgDepartment v3xOrgDepartment) throws BusinessException { + JSONObject orgDepartment = new JSONObject(); +// 设置部门基本信息 + orgDepartment.put("id",v3xOrgDepartment.getId()); + orgDepartment.put("name",v3xOrgDepartment.getName()); + orgDepartment.put("code",v3xOrgDepartment.getCode()); + orgDepartment.put("type","Department"); +// 部门是否启用 + orgDepartment.put("isEnabled",v3xOrgDepartment.getEnabled()); + orgDepartment.put("sortId",v3xOrgDepartment.getSortId()); +// 部门所属单位 + long orgAccountId = v3xOrgDepartment.getOrgAccountId(); + Map account = getSrcAccountDao().getAccountById(orgAccountId+""); + orgDepartment.put("orgAccountId",account.get("id")); + orgDepartment.put("orgAccountName",account.get("name")); +// 设置部门路径 + String departmentPath = v3xOrgDepartment.getPath(); + orgDepartment.put("path",departmentPath); +// 判断上级部门是否为单位,如果为单位则直接使用单位信息,如果不为单位则查询上级部门信息 + String superDepartmentPath = departmentPath.substring(0,departmentPath.length()-4); + System.out.println("当前部门所属单位层级为"+account.get("path")+"上级层级为"+superDepartmentPath); + if(account.get("path").toString().equals(superDepartmentPath)){ + orgDepartment.put("superior",account.get("id")); + orgDepartment.put("superiorName",account.get("name")); + }else{ + Map superDepartment = getSrcDepartmentDao().getDepartmentByPath(superDepartmentPath); + System.out.println(superDepartment); + orgDepartment.put("superior",superDepartment.get("id")); + orgDepartment.put("superiorName",superDepartment.get("name")); + } + + return orgDepartment; + } + + + /** + * 创建特殊单位json对象 + * @param v3xOrgDepartment + * @param path + * @return + */ + public JSONObject specialDepartment (V3xOrgDepartment v3xOrgDepartment,String path) throws BusinessException { + JSONObject orgDepartment = new JSONObject(); +// 设置部门基本信息 + orgDepartment.put("id",v3xOrgDepartment.getId()); + orgDepartment.put("name",v3xOrgDepartment.getName()); + orgDepartment.put("code",v3xOrgDepartment.getCode()); + orgDepartment.put("type","Department"); +// 部门是否启用 + orgDepartment.put("isEnabled",v3xOrgDepartment.getEnabled()); + orgDepartment.put("sortId",v3xOrgDepartment.getSortId()); +// 部门所属单位 + long orgAccountId = v3xOrgDepartment.getOrgAccountId(); + Map account = getSrcAccountDao().getAccountById(orgAccountId+""); + orgDepartment.put("orgAccountId",account.get("id")); + orgDepartment.put("orgAccountName",account.get("name")); +// 设置部门路径 + String departmentPath = v3xOrgDepartment.getPath(); + int replaceLength = path.length(); + String result = path + departmentPath.substring(replaceLength); + orgDepartment.put("path",result); +// 判断上级部门是否为单位,如果为单位则直接使用单位信息,如果不为单位则查询上级部门信息 + String superDepartmentPath = departmentPath.substring(0,departmentPath.length()-4); + System.out.println("当前部门所属单位层级为"+account.get("path")+"上级层级为"+superDepartmentPath); + if(account.get("path").toString().equals(superDepartmentPath)){ + orgDepartment.put("superior",account.get("id")); + orgDepartment.put("superiorName",account.get("name")); + }else{ + Map superDepartment = getSrcDepartmentDao().getDepartmentByPath(superDepartmentPath); + System.out.println(superDepartment); + orgDepartment.put("superior",superDepartment.get("id")); + orgDepartment.put("superiorName",superDepartment.get("name")); + } + + return orgDepartment; + } + + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/bo/ThirdLevelBo.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/bo/ThirdLevelBo.java new file mode 100644 index 0000000..4e85787 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/bo/ThirdLevelBo.java @@ -0,0 +1,120 @@ +package com.seeyon.apps.src_mainorganization.bo; + +import com.seeyon.ctp.organization.bo.V3xOrgLevel; + +public class ThirdLevelBo { + + private long id; + private String name; + private String code; + private long orgAccountId; + private String description; + private long sortId; + private boolean isDeleted; + private boolean enabled; + private int status; + + public ThirdLevelBo(){ + + } + + public ThirdLevelBo(V3xOrgLevel v3xOrgLevel){ + this.id = v3xOrgLevel.getId(); + this.name = v3xOrgLevel.getName(); + this.code = v3xOrgLevel.getCode(); + this.orgAccountId = v3xOrgLevel.getOrgAccountId(); + this.description = v3xOrgLevel.getDescription(); + this.sortId = v3xOrgLevel.getSortId(); + this.isDeleted = v3xOrgLevel.getIsDeleted(); + this.enabled = v3xOrgLevel.getEnabled(); + this.status = v3xOrgLevel.getStatus(); + } + + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public long getOrgAccountId() { + return orgAccountId; + } + + public void setOrgAccountId(long orgAccountId) { + this.orgAccountId = orgAccountId; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public long getSortId() { + return sortId; + } + + public void setSortId(long sortId) { + this.sortId = sortId; + } + + public boolean getIsDeleted() { + return isDeleted; + } + + public void setDeleted(boolean deleted) { + isDeleted = deleted; + } + + public boolean getEnabled() { + return enabled; + } + + public void setEnabled(boolean enabled) { + this.enabled = enabled; + } + + public int getStatus() { + return status; + } + + public void setStatus(int status) { + this.status = status; + } + + @Override + public String toString() { + return "ThirdLevelBo{" + + "id=" + id + + ", name='" + name + '\'' + + ", code='" + code + '\'' + + ", orgAccountId=" + orgAccountId + + ", description='" + description + '\'' + + ", sortId=" + sortId + + ", isDeleted=" + isDeleted + + ", enabled=" + enabled + + ", status=" + status + + '}'; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/bo/ThirdMemberBo.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/bo/ThirdMemberBo.java new file mode 100644 index 0000000..7c21afc --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/bo/ThirdMemberBo.java @@ -0,0 +1,958 @@ +package com.seeyon.apps.src_mainorganization.bo; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.src_mainorganization.dao.ISyncFvDao; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.ctpenumnew.manager.EnumManager; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.common.po.ctpenumnew.CtpEnumItem; +import com.seeyon.ctp.organization.bo.*; +import com.seeyon.ctp.organization.manager.OrgManager; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; + +public class ThirdMemberBo { + + private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + private OrgManager orgManager; + public void setOrgManager(OrgManager orgManager) { + this.orgManager = orgManager; + } + public OrgManager getOrgManager() { + if (orgManager == null) { + orgManager = (OrgManager) AppContext.getBean("orgManager"); + } + return orgManager; + } + + private ISyncFvDao syncFvDao; + public void setSyncFvDao(ISyncFvDao syncFvDao) { + this.syncFvDao = syncFvDao; + } + public ISyncFvDao getSyncFvDao() { + if (syncFvDao == null) { + syncFvDao = (ISyncFvDao) AppContext.getBean("syncFvDao"); + } + return syncFvDao; + } + + private EnumManager enumManagerNew; + public void setEnumManagerNew(EnumManager enumManagerNew) { + this.enumManagerNew = enumManagerNew; + } + public EnumManager getEnumManagerNew() { + if (enumManagerNew == null) { + enumManagerNew = (EnumManager) AppContext.getBean("enumManagerNew"); + } + return enumManagerNew; + } + + private long orgAccountId; + private long id; + private String name; + private String code; + private long deptId; + private long postId; + private long levelId; + private String loginName; + private int state; + private boolean isDeleted; + private boolean enabled; + private int type; + private JSONArray secondPosts; + private String securityLevel; + private int gender; + private String birthday; + private String sortId; + private String hiredate; + private String telNumber; + + public int getGender() { + return gender; + } + + public void setGender(int gender) {gender = gender;} + + public String getBirthday() { + return birthday; + } + + public void setBirthday(String birthday) {birthday = birthday;} + + public String getSortId() { + return sortId; + } + + public void setSortId(String sortId) {sortId = sortId;} + + public String getHiredate() { + return hiredate; + } + + public void setHiredate(String hiredate) {hiredate = hiredate;} + + public String getTelNumber() { + return telNumber; + } + + public void setTelNumber(String telNumber) {telNumber = telNumber;} + + public boolean isDeleted() { + return isDeleted; + } + + public void setDeleted(boolean deleted) { + isDeleted = deleted; + } + + public boolean isEnabled() { + return enabled; + } + + public void setEnabled(boolean enabled) { + this.enabled = enabled; + } + + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } + + public JSONArray getSecondPosts() { + return secondPosts; + } + + public void setSecondPosts(JSONArray secondPosts) { + this.secondPosts = secondPosts; + } + + public long getOrgAccountId() { + return orgAccountId; + } + + public void setOrgAccountId(long orgAccountId) { + this.orgAccountId = orgAccountId; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public long getDeptId() { + return deptId; + } + + public void setDeptId(long deptId) { + this.deptId = deptId; + } + + public long getPostId() { + return postId; + } + + public void setPostId(long postId) { + this.postId = postId; + } + + public long getLevelId() { + return levelId; + } + + public void setLevelId(long levelId) { + this.levelId = levelId; + } + + public int getState() { + return state; + } + + public void setState(int state) { + this.state = state; + } + + public String getSecurityLevel(){ return securityLevel;} + + public void setSecurityLevel(String securityLevel){this.securityLevel = securityLevel;} + + public ThirdMemberBo() { + } + + public void setLoginName(String loginName){ + this.loginName = loginName; + } + + public String getLoginName(){ + return loginName; + } + + public ThirdMemberBo(V3xOrgMember v3xOrgMember,List memberPosts) throws BusinessException { + this.id = v3xOrgMember.getId(); + this.orgAccountId = v3xOrgMember.getOrgAccountId(); + V3xOrgAccount v3xOrgAccount = getOrgManager().getAccountById(orgAccountId); + String accountName = v3xOrgAccount.getName(); + this.name = v3xOrgMember.getName(); + this.code = v3xOrgMember.getCode(); + this.deptId = v3xOrgMember.getOrgDepartmentId(); + V3xOrgDepartment v3xOrgDepartment = getOrgManager().getDepartmentById(deptId); + String deptName = v3xOrgDepartment.getName(); + this.postId = v3xOrgMember.getOrgPostId(); + V3xOrgPost v3xOrgPost = getOrgManager().getPostById(postId); + String postName = v3xOrgPost.getName(); + if("知与行".equals(accountName)){ + if("财务部".equals(deptName)){ + this.securityLevel = "10"; + }else{ + this.securityLevel = "9"; + } + }else{ + if("市场部".equals(deptName)&& "销售人员".equals(postName)){ + this.securityLevel = "8"; + }else if ("销售部".equals(deptName) && "客户".equals(postName)){ + this.securityLevel = "0"; + }else if ("财务部".equals(deptName) && "商务专员".equals(postName)){ + this.securityLevel = "10"; + }else if ("综合办".equals(deptName) && "销售公司负责人".equals(postName)){ + this.securityLevel = "10"; + }else{ +// 其他情况提供1的安全级别 + this.securityLevel = "1"; + } + } +// long memberPostId = v3xOrgMember.getOrgPostId(); +// String banchmarkPostId = getSyncFvDao().queryBanchmarkPostIdByPostId(memberPostId + ""); + this.levelId = v3xOrgMember.getOrgLevelId(); + this.loginName = v3xOrgMember.getLoginName(); + this.state = v3xOrgMember.getState(); + this.isDeleted = v3xOrgMember.getIsDeleted(); + this.enabled = v3xOrgMember.getEnabled(); + this.type = v3xOrgMember.getType(); + this.sortId = v3xOrgMember.getSortId().toString(); + this.gender = v3xOrgMember.getGender(); + Date birthdayDate = v3xOrgMember.getBirthday(); + if(birthdayDate!=null){ + this.birthday = sdf.format(birthdayDate); + } + Date hiredateTime = v3xOrgMember.getHiredate(); + if(hiredateTime!=null){ + this.hiredate = sdf.format(hiredateTime); + } + this.telNumber = v3xOrgMember.getTelNumber(); + JSONArray newSecondPosts = new JSONArray(); + if (memberPosts.size() > 0) { + System.out.println("副岗个数"+memberPosts.size()); + for (int nu = 0; nu < memberPosts.size(); nu++) { + JSONObject newSecondPost = new JSONObject(); + MemberPost secondPost = memberPosts.get(nu); + System.out.println("第"+nu+"个副岗"+secondPost.getPostId()); + newSecondPost.put("postId", secondPost.getPostId()); + newSecondPost.put("orgAccountId", secondPost.getOrgAccountId()); + newSecondPost.put("deptId", secondPost.getDepId()); + newSecondPost.put("memberId", secondPost.getMemberId()); + newSecondPosts.add(newSecondPost); + } + } + this.secondPosts = newSecondPosts; + } + + public ThirdMemberBo(V3xOrgMember v3xOrgMember,String type) throws BusinessException { + this.id = v3xOrgMember.getId(); + this.orgAccountId = v3xOrgMember.getOrgAccountId(); + this.name = v3xOrgMember.getName(); + this.code = v3xOrgMember.getCode(); + this.deptId = v3xOrgMember.getOrgDepartmentId(); + V3xOrgDepartment v3xOrgDepartment = getOrgManager().getDepartmentById(deptId); + String deptName = v3xOrgDepartment.getName(); + if(deptName.contains("财务") || deptName.contains("综合办")){ + this.securityLevel = "10"; + }else if (deptName.contains("市场部")){ + this.securityLevel = "8"; + }else{ + this.securityLevel = "0"; + } + long memberPostId = v3xOrgMember.getOrgPostId(); + String banchmarkPostId = getSyncFvDao().queryBanchmarkPostIdByPostId(memberPostId + ""); + this.postId = Long.parseLong(banchmarkPostId); + this.levelId = v3xOrgMember.getOrgLevelId(); + this.loginName = v3xOrgMember.getLoginName(); + if(v3xOrgMember.getState()==2){ + this.state = 5; + }else{ + this.state = 1; + } +// 离职state定义为5 + this.isDeleted = v3xOrgMember.getIsDeleted(); + this.enabled = v3xOrgMember.getEnabled(); + this.type = v3xOrgMember.getType(); + this.gender = v3xOrgMember.getGender(); + Date birthdayDate = v3xOrgMember.getBirthday(); + if(birthdayDate!=null){ + this.birthday = sdf.format(birthdayDate); + } + Date hiredateTime = v3xOrgMember.getHiredate(); + if(hiredateTime!=null){ + this.hiredate = sdf.format(hiredateTime); + } + this.telNumber = v3xOrgMember.getTelNumber(); + JSONArray newSecondPosts = new JSONArray(); + List secondPosts = v3xOrgMember.getSecond_post(); + if (secondPosts.size() > 0) { + for (int nu = 0; nu < secondPosts.size(); nu++) { + JSONObject newSecondPost = new JSONObject(); + MemberPost secondPost = secondPosts.get(nu); + newSecondPost.put("postId", secondPost.getPostId()); + newSecondPost.put("orgAccountId", secondPost.getOrgAccountId()); + newSecondPost.put("deptId", secondPost.getDepId()); + newSecondPost.put("memberId", secondPost.getMemberId()); + newSecondPosts.add(newSecondPost); + } + } + this.secondPosts = newSecondPosts; + } + + @Override + public String toString() { + return "ThirdMemberBo{" + + ", orgAccountId=" + orgAccountId + + ", id=" + id + + ", name='" + name + '\'' + + ", code='" + code + '\'' + + ", deptId=" + deptId + + ", postId=" + postId + + ", levelId=" + levelId + + ", loginName='" + loginName + '\'' + + ", state=" + state + + ", isDeleted=" + isDeleted + + ", enabled=" + enabled + + ", type=" + type + + ", gender=" + gender + + ", birthday=" + birthday + + ", sortId=" + sortId + + ", hiredate=" + hiredate + + ", telNumber=" + telNumber + + ", secondPosts=" + secondPosts + + ", securityLevel='" + securityLevel + '\'' + + '}'; + } + + +// { +// * "id":"人员ID", +// * "name":"人员名称", +// * "code":""人员编码, +// * "orgAccountId":"单位ID", +// * "orgAccountName":"单位名称", +// * "orgDepartmentId":"部门ID", +// * "orgDepartmentName":"部门名称", +// * "isEnabled":"是否启用", +// * "telNumber":"手机号", +// * "loginName":"登录名", +// * "orgPostId":"岗位ID", +// * "orgPostName":"岗位名称", +// * "orgLevelId":"职务级别ID", +// * "orgLevelName":"职务级别名称", +// * "birthday":"出生日期", +// * "gender":"性别",-1未指定,1男,2女 +// * "hiredate":"入职时间" +// * } +// 法人架构人员封装 + public JSONObject financeMember (V3xOrgMember v3xOrgMember ) throws BusinessException { + JSONObject member = new JSONObject(); + member.put("id",v3xOrgMember.getId()); + member.put("name",v3xOrgMember.getName()); + member.put("code",v3xOrgMember.getCode()); +// 查询人员所在单位对象 + V3xOrgAccount v3xOrgAccount = getOrgManager().getAccountById(v3xOrgMember.getOrgAccountId()); + member.put("orgAccountId",""); + member.put("orgAccountName",""); + if(v3xOrgAccount!=null){ + member.put("orgAccountId",v3xOrgAccount.getId()); + member.put("orgAccountName",v3xOrgAccount.getName()); + } + V3xOrgDepartment v3xOrgDepartment = getOrgManager().getDepartmentById(v3xOrgMember.getOrgDepartmentId()); + member.put("orgDepartmentId",""); + member.put("orgDepartmentName",""); + if(v3xOrgDepartment!=null){ + member.put("orgDepartmentId",v3xOrgDepartment.getId()); + member.put("orgDepartmentName",v3xOrgDepartment.getName()); + } + V3xOrgPost v3xOrgPost = getOrgManager().getPostById(v3xOrgMember.getOrgPostId()); + member.put("orgPostId",""); + member.put("orgPostName",""); + if(v3xOrgPost!=null){ + member.put("orgPostId",v3xOrgPost.getId()); + member.put("orgPostName",v3xOrgPost.getName()); + } + V3xOrgLevel v3xOrgLevel = getOrgManager().getLevelById(v3xOrgMember.getOrgLevelId()); + member.put("orgLevelId",""); + member.put("orgLevelName",""); + if(v3xOrgLevel!=null){ + member.put("orgLevelId",v3xOrgLevel.getId()); + member.put("orgLevelName",v3xOrgLevel.getName()); + } + member.put("isEnabled",v3xOrgMember.getEnabled()); + member.put("telNumber",v3xOrgMember.getTelNumber()); + member.put("loginName",v3xOrgMember.getLoginName()); + member.put("birthday",""); + if(v3xOrgMember.getBirthday() != null){ + member.put("birthday",sdf.format(v3xOrgMember.getBirthday())); + } + member.put("hiredate",""); + if(v3xOrgMember.getHiredate() != null){ + member.put("hiredate",sdf.format(v3xOrgMember.getHiredate())); + } + member.put("gender",v3xOrgMember.getGender()); + return member; + } + + +// { +// * "id":"人员ID", +// * "name":"人员名称", +// * "code":""人员编码, +// * "orgAccountId":"单位ID", +// * "orgAccountName":"单位名称", +// * "orgDepartmentId":"部门ID", +// * "companyId":"公司ID", +// * "companyName":"公司名称", +// * "orgDepartmentName":"部门名称", +// * "isEnabled":"是否启用", +// * "telNumber":"手机号", +// * "loginName":"登录名", +// * "orgPostId":"岗位ID", +// * "orgPostName":"岗位名称", +// * "orgLevelId":"职务级别ID", +// * "orgLevelName":"职务级别名称", +// * "birthday":"出生日期", +// * "gender":"性别",-1未指定,1男,2女 +// * "hiredate":"入职时间" +// * } +// 业务架构人员封装 + public JSONObject operationMember (V3xOrgMember v3xOrgMember) throws BusinessException { + JSONObject member = new JSONObject(); + member.put("id",v3xOrgMember.getId()); + member.put("name",v3xOrgMember.getName()); + member.put("code",v3xOrgMember.getCode()); +// 查询人员所在单位对象 + V3xOrgAccount v3xOrgAccount = getOrgManager().getAccountById(v3xOrgMember.getOrgAccountId()); + member.put("orgAccountId",""); + member.put("orgAccountName",""); + if(v3xOrgAccount!=null){ + member.put("orgAccountId",v3xOrgAccount.getId()); + member.put("orgAccountName",v3xOrgAccount.getName()); + } + V3xOrgDepartment v3xOrgDepartment = getOrgManager().getDepartmentById(v3xOrgMember.getOrgDepartmentId()); + member.put("orgDepartmentId",""); + member.put("orgDepartmentName",""); + if(v3xOrgDepartment!=null){ + member.put("orgDepartmentId",v3xOrgDepartment.getId()); + member.put("orgDepartmentName",v3xOrgDepartment.getName()); + } + V3xOrgPost v3xOrgPost = getOrgManager().getPostById(v3xOrgMember.getOrgPostId()); + member.put("orgPostId",""); + member.put("orgPostName",""); + if(v3xOrgPost!=null){ + member.put("orgPostId",v3xOrgPost.getId()); + member.put("orgPostName",v3xOrgPost.getName()); + } + V3xOrgLevel v3xOrgLevel = getOrgManager().getLevelById(v3xOrgMember.getOrgLevelId()); + member.put("orgLevelId",""); + member.put("orgLevelName",""); + if(v3xOrgLevel!=null){ + member.put("orgLevelId",v3xOrgLevel.getId()); + member.put("orgLevelName",v3xOrgLevel.getName()); + } + member.put("isEnabled",v3xOrgMember.getEnabled()); + member.put("telNumber",v3xOrgMember.getTelNumber()); + member.put("loginName",v3xOrgMember.getLoginName()); + member.put("birthday",""); + if(v3xOrgMember.getBirthday() != null){ + member.put("birthday",sdf.format(v3xOrgMember.getBirthday())); + } + member.put("hiredate",""); + if(v3xOrgMember.getHiredate() != null){ + member.put("hiredate",sdf.format(v3xOrgMember.getHiredate())); + } + member.put("gender",v3xOrgMember.getGender()); + member.put("companyCode",""); + member.put("companyName",""); + member.put("companyCredit",""); + return member; + } + + + // { +// * "id":"人员ID", +// * "name":"人员名称", +// * "code":""人员编码, +// * "orgAccountId":"单位ID", +// * "orgAccountName":"单位名称", +// * "orgDepartmentId":"部门ID", +// * "companyId":"公司ID", +// * "companyName":"公司名称", +// * "orgDepartmentName":"部门名称", +// * "isEnabled":"是否启用", +// * "telNumber":"手机号", +// * "loginName":"登录名", +// * "orgPostId":"岗位ID", +// * "orgPostName":"岗位名称", +// * "orgLevelId":"职务级别ID", +// * "orgLevelName":"职务级别名称", +// * "birthday":"出生日期", +// * "gender":"性别",-1未指定,1男,2女 +// * "hiredate":"入职时间" +// * } +// 档案表人员封装 + public JSONObject operationMember (Map fileMember) throws BusinessException { + JSONObject member = new JSONObject(); + member.put("id",fileMember.get("id")); + member.put("name",fileMember.get("name")); + member.put("code",fileMember.get("code")); +// 查询人员所在单位对 + member.put("orgAccountId",""); + member.put("orgAccountName",""); + if(fileMember.get("org_account_id")!=null){ + V3xOrgAccount v3xOrgAccount = getOrgManager().getAccountById(Long.parseLong(fileMember.get("org_account_id").toString())); + if(v3xOrgAccount!=null){ + member.put("orgAccountId",v3xOrgAccount.getId()); + member.put("orgAccountName",v3xOrgAccount.getName()); + } + } + member.put("orgDepartmentId",""); + member.put("orgDepartmentName",""); + if(fileMember.get("org_department_id")!=null){ + V3xOrgDepartment v3xOrgDepartment = getOrgManager().getDepartmentById(Long.parseLong(fileMember.get("org_department_id").toString())); + if(v3xOrgDepartment!=null){ + member.put("orgDepartmentId",v3xOrgDepartment.getId()); + member.put("orgDepartmentName",v3xOrgDepartment.getName()); + } + } + member.put("orgPostId",""); + member.put("orgPostName",""); + if(fileMember.get("org_post_id")!=null){ + V3xOrgPost v3xOrgPost = getOrgManager().getPostById(Long.parseLong(fileMember.get("org_post_id").toString())); + if(v3xOrgPost!=null){ + member.put("orgPostId",v3xOrgPost.getId()); + member.put("orgPostName",v3xOrgPost.getName()); + } + } + member.put("orgLevelId",""); + member.put("orgLevelName",""); + if(fileMember.get("org_level_id")!=null){ + V3xOrgLevel v3xOrgLevel = getOrgManager().getLevelById(Long.parseLong(fileMember.get("org_level_id").toString()) ); + if(v3xOrgLevel!=null){ + member.put("orgLevelId",v3xOrgLevel.getId()); + member.put("orgLevelName",v3xOrgLevel.getName()); + } + } + +// member.put("isEnabled",fileMember.get("is_enable")); + String memberState = fileMember.get("is_enable").toString(); + CtpEnumItem memberStateEnum = getEnumManagerNew().getEnumItem(Long.parseLong(memberState)); + if("在职,试用,待岗".contains(memberStateEnum.getShowvalue())){ + member.put("isEnabled",true); + }else{ + member.put("isEnabled",false); + } + member.put("telNumber",fileMember.get("telnumber")); + member.put("loginName",fileMember.get("login_name")); + member.put("birthday",""); + if(fileMember.get("birthday") != null){ + member.put("birthday",sdf.format(fileMember.get("birthday"))); + } + member.put("hiredate",""); + if(fileMember.get("hiredate") != null){ + member.put("hiredate",sdf.format(fileMember.get("hiredate"))); + } + if(fileMember.get("gender")==null){ + member.put("gender","-1"); + }else{ + String genderId = fileMember.get("gender").toString(); + CtpEnumItem genderEnum = getEnumManagerNew().getEnumItem(Long.parseLong(genderId)); + if("0".equals(genderEnum.getEnumvalue())){ + member.put("gender","1"); + }else if("1".equals(genderEnum.getEnumvalue())){ + member.put("gender","2"); + }else{ + member.put("gender","-1"); + } + } +// member.put("gender",fileMember.get("gender")); + member.put("companyCode",""); + member.put("companyName",""); + member.put("companyCredit",""); + return member; + } + +// { +// * "id":"人员ID", +// * "name":"人员名称", +// * "code":""人员编码, +// * "orgAccountId":"单位ID", +// * "orgAccountName":"单位名称", +// * "orgDepartmentId":"部门ID", +// * "companyId":"公司ID", +// * "companyName":"公司名称", +// * "orgDepartmentName":"部门名称", +// * "isEnabled":"是否启用", +// * "telNumber":"手机号", +// * "loginName":"登录名", +// * "orgPostId":"岗位ID", +// * "orgPostName":"岗位名称", +// * "orgLevelId":"职务级别ID", +// * "orgLevelName":"职务级别名称", +// * "birthday":"出生日期", +// * "gender":"性别",-1未指定,1男,2女 +// * "hiredate":"入职时间" +// * } +// 业务架构业代人员封装 + public JSONObject operationServiceAgentMember(Map serviceAgentMember) throws BusinessException { + JSONObject member = new JSONObject(); + member.put("id",serviceAgentMember.get("member_id")); + member.put("name",serviceAgentMember.get("member_name")); + member.put("code",serviceAgentMember.get("member_code")); + member.put("companyCode",""); + member.put("companyName",""); + member.put("companyCredit",""); +// 查询人员所在单位对象 + member.put("orgAccountId",""); + member.put("orgAccountName",""); + member.put("orgDepartmentId",""); + member.put("orgDepartmentName",""); + if(serviceAgentMember.get("department_id")!=null){ + V3xOrgDepartment v3xOrgDepartment = getOrgManager().getDepartmentById(Long.parseLong(serviceAgentMember.get("department_id").toString())); + member.put("orgDepartmentId",v3xOrgDepartment.getId()); + member.put("orgDepartmentName",v3xOrgDepartment.getName()); + + V3xOrgAccount v3xOrgAccount = getOrgManager().getAccountById(v3xOrgDepartment.getOrgAccountId()); + if(v3xOrgAccount!=null){ + member.put("orgAccountId",v3xOrgAccount.getId()); + member.put("orgAccountName",v3xOrgAccount.getName()); + } + } + member.put("orgPostId",""); + member.put("orgPostName",""); + if(serviceAgentMember.get("yd_post_id")!=null){ + String ydPostId = serviceAgentMember.get("yd_post_id").toString(); + V3xOrgPost ydPost = orgManager.getPostById(Long.parseLong(ydPostId)); + member.put("orgPostId",ydPost.getId().toString()); + member.put("orgPostName",ydPost.getName()); + } + member.put("orgLevelId",""); + member.put("orgLevelName","业代"); + String memberState = serviceAgentMember.get("is_enabled").toString(); + CtpEnumItem memberStateEnum = getEnumManagerNew().getEnumItem(Long.parseLong(memberState)); + if("在职,试用,待岗".contains(memberStateEnum.getShowvalue())){ + member.put("isEnabled",true); + }else{ + member.put("isEnabled",false); + } + member.put("telNumber",serviceAgentMember.get("telnember")); + member.put("loginName",serviceAgentMember.get("telnember")); + member.put("birthday",""); + if(serviceAgentMember.get("birthday") != null){ + if (serviceAgentMember.get("birthday") instanceof Date) { + Date birthday = (Date) serviceAgentMember.get("birthday"); + member.put("birthday",sdf.format(birthday)); + } + } + member.put("hiredate",""); + if(serviceAgentMember.get("gender")==null){ + member.put("gender","-1"); + }else{ + String genderId = serviceAgentMember.get("gender").toString(); + CtpEnumItem genderEnum = getEnumManagerNew().getEnumItem(Long.parseLong(genderId)); + if("0".equals(genderEnum.getEnumvalue())){ + member.put("gender","1"); + }else if("1".equals(genderEnum.getEnumvalue())){ + member.put("gender","2"); + }else{ + member.put("gender","-1"); + } + } + return member; + } + + + public JSONObject operationMarketingMember (V3xOrgMember v3xOrgMember,Map clientTable) throws BusinessException { + JSONObject member = new JSONObject(); + member.put("id",v3xOrgMember.getId()); + member.put("name",v3xOrgMember.getName()); + member.put("code",v3xOrgMember.getCode()); + // 默认营销门户 + member.put("orgAccountId","-9194677677107822293"); + member.put("orgAccountName","营销门户"); +// 添加部门信息 + if(clientTable.get("area_dept")!=null){ + V3xOrgDepartment v3xOrgDepartment = getOrgManager().getDepartmentById(Long.parseLong(clientTable.get("area_dept").toString())); + member.put("orgDepartmentId",v3xOrgDepartment.getId()); + member.put("orgDepartmentName",v3xOrgDepartment.getName()); + } + long postId = v3xOrgMember.getOrgPostId(); + V3xOrgPost v3xOrgPost = orgManager.getPostById(postId); + if(v3xOrgPost!=null){ + member.put("orgPostId",v3xOrgPost.getId()); + member.put("orgPostName",v3xOrgPost.getName()); + } + long levelId = v3xOrgMember.getOrgLevelId(); + V3xOrgLevel v3xOrgLevel = orgManager.getLevelById(levelId); + if(v3xOrgLevel!=null){ + member.put("orgLevelId",v3xOrgLevel.getId()); + member.put("orgLevelName",v3xOrgLevel.getName()); + } + + member.put("isEnabled",v3xOrgMember.getEnabled()); + member.put("telNumber",v3xOrgMember.getTelNumber()); + member.put("loginName",v3xOrgMember.getLoginName()); + member.put("birthday",""); + if(v3xOrgMember.getBirthday() != null){ + member.put("birthday",sdf.format(v3xOrgMember.getBirthday())); + } + member.put("hiredate",""); + if(v3xOrgMember.getHiredate() != null){ + member.put("hiredate",sdf.format(v3xOrgMember.getHiredate())); + } + member.put("gender",v3xOrgMember.getGender()); + return member; + } + + public JSONObject operationMarketingFHMember (V3xOrgMember v3xOrgMember,Map clientTable) throws BusinessException { + JSONObject member = new JSONObject(); + member.put("id",clientTable.get("member_id")); +// member.put("id",v3xOrgMember.getId()); + member.put("name",v3xOrgMember.getName()); + member.put("code",v3xOrgMember.getCode()); + // 默认营销门户 + member.put("orgAccountId","-9194677677107822293"); + member.put("orgAccountName","营销门户"); +// 添加部门信息 + if(clientTable.get("area_dept")!=null){ + V3xOrgDepartment v3xOrgDepartment = getOrgManager().getDepartmentById(Long.parseLong(clientTable.get("area_dept").toString())); + member.put("orgDepartmentId",v3xOrgDepartment.getId()); + member.put("orgDepartmentName",v3xOrgDepartment.getName()); + } + long postId = v3xOrgMember.getOrgPostId(); + V3xOrgPost v3xOrgPost = orgManager.getPostById(postId); + if(v3xOrgPost!=null){ + member.put("orgPostId",v3xOrgPost.getId()); + member.put("orgPostName",v3xOrgPost.getName()); + } + long levelId = v3xOrgMember.getOrgLevelId(); + V3xOrgLevel v3xOrgLevel = orgManager.getLevelById(levelId); + if(v3xOrgLevel!=null){ + member.put("orgLevelId",v3xOrgLevel.getId()); + member.put("orgLevelName",v3xOrgLevel.getName()); + } + + member.put("isEnabled",v3xOrgMember.getEnabled()); + member.put("telNumber",clientTable.get("telnumber")); + member.put("loginName",v3xOrgMember.getLoginName()); + member.put("birthday",""); + if(v3xOrgMember.getBirthday() != null){ + member.put("birthday",sdf.format(v3xOrgMember.getBirthday())); + } + member.put("hiredate",""); + if(v3xOrgMember.getHiredate() != null){ + member.put("hiredate",sdf.format(v3xOrgMember.getHiredate())); + } + member.put("gender",v3xOrgMember.getGender()); + return member; + } + + + // { +// * "id":"人员ID", +// * "name":"人员名称", +// * "code":""人员编码, +// * "orgAccountId":"单位ID", +// * "orgAccountName":"单位名称", +// * "orgDepartmentId":"部门ID", +// * "orgDepartmentName":"部门名称", +// * "isEnabled":"是否启用", +// * "telNumber":"手机号", +// * "loginName":"登录名", +// * "orgPostId":"岗位ID", +// * "orgPostName":"岗位名称", +// * "orgLevelId":"职务级别ID", +// * "orgLevelName":"职务级别名称", +// * "birthday":"出生日期", +// * "companyCode":"客户编码", +// * "companyName":"客户名称", +// * "companyCredit":"客户统一社会信用代码", +// * "gender":"性别",-1未指定,1男,2女, +// * "hiredate":"入职时间" +// * } +// 业务架构客户人员封装 + public JSONObject operationClientMember (V3xOrgMember v3xOrgMember,Map clientTable) throws BusinessException { + JSONObject member = new JSONObject(); +// member.put("id",clientTable.get("id")); + member.put("id",v3xOrgMember.getId()); + member.put("name",v3xOrgMember.getName()); + member.put("code",v3xOrgMember.getCode()); + // 查询人员所在单位对象 +// V3xOrgAccount v3xOrgAccount = getOrgManager().getAccountById(v3xOrgMember.getOrgAccountId()); + member.put("orgAccountId","-9194677677107822293"); + member.put("orgAccountName","营销门户"); +// if(v3xOrgAccount!=null){ +// member.put("orgAccountId",v3xOrgAccount.getId()); +// member.put("orgAccountName",v3xOrgAccount.getName()); +// } + // 客户老板所在客户信息 + if(clientTable.size()>1){ +// 客户编码 + member.put("companyCode",""); + if(clientTable.get("client_code")!=null){member.put("companyCode",clientTable.get("client_code"));} +// 客户名称 + member.put("companyName",""); + if(clientTable.get("client_name")!=null){member.put("companyName",clientTable.get("client_name"));} +// 客户统一社会信用代码 + member.put("companyCredit",""); + if(clientTable.get("credit_identifier")!=null){member.put("companyCredit",clientTable.get("credit_identifier"));} + + member.put("orgDepartmentId",""); + member.put("orgDepartmentName",""); + if(clientTable!=null){ + if(clientTable.get("area")!=null){ + V3xOrgDepartment companyDepartment = getOrgManager().getDepartmentById(Long.parseLong(clientTable.get("area").toString())); + if(companyDepartment!=null){ + member.put("orgDepartmentId",companyDepartment.getId()); + member.put("orgDepartmentName",companyDepartment.getName()); + } + } + } + }else{ + member.put("companyCode",""); + member.put("companyName",""); + member.put("companyCredit",""); + member.put("orgDepartmentId",""); + member.put("orgDepartmentName",""); + } + long postId = v3xOrgMember.getOrgPostId(); + V3xOrgPost v3xOrgPost = orgManager.getPostById(postId); + if(v3xOrgPost!=null){ + member.put("orgPostId",v3xOrgPost.getId()); + member.put("orgPostName",v3xOrgPost.getName()); + } + long levelId = v3xOrgMember.getOrgLevelId(); + V3xOrgLevel v3xOrgLevel = orgManager.getLevelById(levelId); + if(v3xOrgLevel!=null){ + member.put("orgLevelId",v3xOrgLevel.getId()); + member.put("orgLevelName",v3xOrgLevel.getName()); + } + + member.put("isEnabled",v3xOrgMember.getEnabled()); + member.put("telNumber",v3xOrgMember.getTelNumber()); + member.put("loginName",v3xOrgMember.getLoginName()); + member.put("birthday",""); + if(v3xOrgMember.getBirthday() != null){ + member.put("birthday",sdf.format(v3xOrgMember.getBirthday())); + } + member.put("hiredate",""); + if(v3xOrgMember.getHiredate() != null){ + member.put("hiredate",sdf.format(v3xOrgMember.getHiredate())); + } + member.put("gender",v3xOrgMember.getGender()); + return member; + } + + public JSONObject operationClientFHMember (V3xOrgMember v3xOrgMember,Map clientTable) throws BusinessException { + JSONObject member = new JSONObject(); + member.put("id",clientTable.get("id")); +// member.put("id",v3xOrgMember.getId()); + member.put("name",v3xOrgMember.getName()); + member.put("code",v3xOrgMember.getCode()); + // 查询人员所在单位对象 +// V3xOrgAccount v3xOrgAccount = getOrgManager().getAccountById(v3xOrgMember.getOrgAccountId()); + member.put("orgAccountId","-9194677677107822293"); + member.put("orgAccountName","营销门户"); +// if(v3xOrgAccount!=null){ +// member.put("orgAccountId",v3xOrgAccount.getId()); +// member.put("orgAccountName",v3xOrgAccount.getName()); +// } + // 客户老板所在客户信息 + if(clientTable.size()>1){ +// 客户编码 + member.put("companyCode",""); + if(clientTable.get("client_code")!=null){member.put("companyCode",clientTable.get("client_code"));} +// 客户名称 + member.put("companyName",""); + if(clientTable.get("client_name")!=null){member.put("companyName",clientTable.get("client_name"));} +// 客户统一社会信用代码 + member.put("companyCredit",""); + if(clientTable.get("credit_identifier")!=null){member.put("companyCredit",clientTable.get("credit_identifier"));} + + member.put("orgDepartmentId",""); + member.put("orgDepartmentName",""); + if(clientTable!=null){ + if(clientTable.get("area")!=null){ + V3xOrgDepartment companyDepartment = getOrgManager().getDepartmentById(Long.parseLong(clientTable.get("area").toString())); + if(companyDepartment!=null){ + member.put("orgDepartmentId",companyDepartment.getId()); + member.put("orgDepartmentName",companyDepartment.getName()); + } + } + } + }else{ + member.put("companyCode",""); + member.put("companyName",""); + member.put("companyCredit",""); + member.put("orgDepartmentId",""); + member.put("orgDepartmentName",""); + } + long postId = v3xOrgMember.getOrgPostId(); + V3xOrgPost v3xOrgPost = orgManager.getPostById(postId); + if(v3xOrgPost!=null){ + member.put("orgPostId",v3xOrgPost.getId()); + member.put("orgPostName",v3xOrgPost.getName()); + } + long levelId = v3xOrgMember.getOrgLevelId(); + V3xOrgLevel v3xOrgLevel = orgManager.getLevelById(levelId); + if(v3xOrgLevel!=null){ + member.put("orgLevelId",v3xOrgLevel.getId()); + member.put("orgLevelName",v3xOrgLevel.getName()); + } + + member.put("isEnabled",v3xOrgMember.getEnabled()); + member.put("telNumber",clientTable.get("telnumber")); + member.put("loginName",v3xOrgMember.getLoginName()); + member.put("birthday",""); + if(v3xOrgMember.getBirthday() != null){ + member.put("birthday",sdf.format(v3xOrgMember.getBirthday())); + } + member.put("hiredate",""); + if(v3xOrgMember.getHiredate() != null){ + member.put("hiredate",sdf.format(v3xOrgMember.getHiredate())); + } + member.put("gender",v3xOrgMember.getGender()); + return member; + } + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/bo/ThirdPostBo.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/bo/ThirdPostBo.java new file mode 100644 index 0000000..566779f --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/bo/ThirdPostBo.java @@ -0,0 +1,187 @@ +package com.seeyon.apps.src_mainorganization.bo; + +import com.seeyon.ctp.organization.OrgConstants; +import com.seeyon.ctp.organization.bo.V3xOrgAccount; +import com.seeyon.ctp.organization.bo.V3xOrgDepartment; +import com.seeyon.ctp.organization.bo.V3xOrgPost; + +public class ThirdPostBo { + private long orgAccountId; + private long id; + private String name; + private String code; + private boolean isDeleted; + private boolean enabled; + private String shortName; + private long sortId; + private int status; + private String description; + private long typeId; + private boolean valid; + private String entityType; + + + public ThirdPostBo(String companyId, V3xOrgPost v3xOrgPost) { + this.id = v3xOrgPost.getId(); + this.orgAccountId = Long.parseLong(companyId); + this.name = v3xOrgPost.getName(); + this.code = v3xOrgPost.getCode(); + this.shortName = v3xOrgPost.getName(); + } + + public ThirdPostBo(V3xOrgPost v3xOrgPost) { + this.id = v3xOrgPost.getId(); + this.orgAccountId = v3xOrgPost.getOrgAccountId(); + this.name = v3xOrgPost.getName(); + this.code = v3xOrgPost.getCode(); + this.shortName = v3xOrgPost.getName(); + this.isDeleted = v3xOrgPost.getIsDeleted(); + this.enabled = v3xOrgPost.getEnabled(); + this.sortId = v3xOrgPost.getSortId(); + this.status = v3xOrgPost.getStatus(); + this.description = v3xOrgPost.getDescription(); + this.typeId = v3xOrgPost.getTypeId(); + this.entityType = v3xOrgPost.getEntityType(); + + } + + + + public long getOrgAccountId() { + return this.orgAccountId; + } + + public void setOrgAccountId(long orgAccountId) { + this.orgAccountId = orgAccountId; + } + + public long getId() { + return this.id; + } + + public void setId(long id) { + this.id = id; + } + + public String getName() { + return this.name; + } + + public void setName(String name) { + this.name = name; + } + + public String getCode() { + return this.code; + } + + public void setCode(String code) { + this.code = code; + } + + public boolean getIsDeleted() { + return this.isDeleted; + } + + public void setIsDeleted(boolean isDeleted) { + this.isDeleted = isDeleted; + } + + public boolean getEnabled() { + return this.enabled; + } + + public void setEnabled(boolean enabled) { + this.enabled = enabled; + } + + public boolean isDeleted() { + return isDeleted; + } + + public void setDeleted(boolean deleted) { + isDeleted = deleted; + } + + public boolean isEnabled() { + return enabled; + } + + public String getShortName() { + return shortName; + } + + public void setShortName(String shortName) { + this.shortName = shortName; + } + + public long getSortId() { + return sortId; + } + + public void setSortId(long sortId) { + this.sortId = sortId; + } + + public int getStatus() { + return status; + } + + public void setStatus(int status) { + this.status = status; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public long getTypeId() { + return typeId; + } + + public void setTypeId(long typeId) { + this.typeId = typeId; + } + + public boolean isValid() { + return valid; + } + + public void setValid(boolean valid) { + this.valid = valid; + } + + public String getEntityType() { + return entityType; + } + + public void setEntityType(String entityType) { + this.entityType = entityType; + } + + public ThirdPostBo() { + } + + @Override + public String toString() { + return "ThirdPostBo{" + + "orgAccountId=" + orgAccountId + + ", id=" + id + + ", name='" + name + '\'' + + ", code='" + code + '\'' + + ", isDeleted=" + isDeleted + + ", enabled=" + enabled + + ", shortName='" + shortName + '\'' + + ", sortId=" + sortId + + ", status=" + status + + ", description='" + description + '\'' + + ", typeId=" + typeId + + ", valid=" + valid + + ", entityType='" + entityType + '\'' + + '}'; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/bo/TreeNodeBo.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/bo/TreeNodeBo.java new file mode 100644 index 0000000..44773d5 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/bo/TreeNodeBo.java @@ -0,0 +1,33 @@ +package com.seeyon.apps.src_mainorganization.bo; + +import java.util.ArrayList; +import java.util.List; + +public class TreeNodeBo { + + private String name; + private String id; + private boolean open = false; + private String iconSkin; + private List children = new ArrayList<>(); + + // 构造方法 + public TreeNodeBo(String name, String id, String iconSkin) { + this.name = name; + this.id = id; + this.iconSkin = iconSkin; + } + + // getter和setter方法 + public String getName() { return name; } + public void setName(String name) { this.name = name; } + public String getId() { return id; } + public void setId(String id) { this.id = id; } + public boolean isOpen() { return open; } + public void setOpen(boolean open) { this.open = open; } + public String getIconSkin() { return iconSkin; } + public void setIconSkin(String iconSkin) { this.iconSkin = iconSkin; } + public List getChildren() { return children; } + public void setChildren(List children) { this.children = children; } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/constans/SyncConstants.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/constans/SyncConstants.java new file mode 100644 index 0000000..9ed028a --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/constans/SyncConstants.java @@ -0,0 +1,75 @@ +package com.seeyon.apps.src_mainorganization.constans; + +public enum SyncConstants { + plugin("src_mainorganization", "插件ID"), + isServiceBroker("是", "是否同步业代人员"), + companyId("-1730833917365171641", "companyId"), + excludeAccount("湖北省知与行人力资源管理有限公司,8559604892185870467", "客户下排除单位信息"), + dingdingAppKey("ding2h5fhqmiszfs2jwr", "dingdingAppKey"), + dingdingAppSecret("P3rbbjtK-cM6s_bm94CrxxZl4Xiy6uFMK0qv4gCdiDdcO2Qklc3r75J3r_nEBnEm", "dingdingAppSecret"), + dingdingAgentId("3317276581", "dingdingAgentId"), + dingdingAppId("93a002bc-e1f2-4edd-af38-555f478c4491", "dingdingAppId"), + dingdingGetDept("https://oapi.dingtalk.com/topapi/v2/department/get", "查询钉钉部门URL"), + dingdingLog("DDTBJL","钉钉同步记录"), + dingdingLogloginName("demo","钉钉同步记录创建人"), + qxxLog("QXXTBJL","企学星同步记录"), + qxxUrl("http://10.0.1.92:7356","企学星URL"), + qxxGetToken("/hklearn/openapi/v1/oauth/getToken?","企学星获取tokenURL"), + qxxCorpid("1984970261379821568","企学星Corpid"), + qxxCorpsecret("dazktisoj29d3qyoeske1sxreo7gxlo8d7amfdg0gi85ku0tanjat3vb34i0243e","企学星Corpsecret"), + qxxSaveOrg("/hklearn/openapi/v1/data/org/save","企学星保存部门URL"), + qxxDeleteOrg("/hklearn/openapi/v1/data/org/delete","企学星删除部门URL"), + qxxSelectOrg("/hklearn/openapi/v1/data/org/select","企学星查询部门URL"), + qxxSaveUser("/hklearn/openapi/v1/data/user/save","企学星保存用户URL"), + flowLoginName("demo1", "流程平台登录用户"), + flowRestPassword("1cd9ffb0-39ee-4690-8773-e183f233b3b9", "流程平台rest密码"), + flowRestUserName("flowdata", "流程平台rest用户"), + flowurl("http://10.0.1.56", "流程平台地址"), + groupLoginName("BDGLY", "集团协同平台登录用户"), + groupRestPassword("f1c4e761-d60b-47ff-a5ff-5953f2b9c9e0", "集团协同平台rest密码"), + groupRestUserName("beian", "集团协同平台rest用户"), + groupurl("https://oa.dhx.com.cn", "集团协同地址"), + localLoginName("demo1", "本地环境登录用户"), + localRestPassword("751f86d5-2e4c-4fe0-9a90-50d568359a1f", "本地环境rest密码"), + localRestUserName("sys", "本地环境rest用户"), + localurl("http://127.0.0.1", "本地环境地址"), + syncUrl("http://ip:port", "同步地址"), + getTokenUrl("/seeyon/rest/token/","获取token路径"), + getAccountUrl("/seeyon/rest/orgAccount/","根据ID查询单位信息路径"), + addOrUpdateAccountUrl("/seeyon/rest/orgAccount","根据ID新增或修改单位信息路径"), + getDeptUrl("/seeyon/rest/orgDepartment/","根据ID查询部门信息路径"), + addOrUpdateDeptUrl("/seeyon/rest/orgDepartment","根据ID新增或修改部门信息路径"), + getPostUrl("/seeyon/rest/orgPost/","根据ID查询岗位信息路径"), + addOrUpdatePostUrl("/seeyon/rest/orgPost","根据ID新增或修改岗位信息路径"), + getLevelUrl("/seeyon/rest/orgLevel/","根据ID查询职务级别信息路径"), + addOrUpdateLevelUrl("/seeyon/rest/orgLevel","根据ID新增或修改职务级别信息路径"), + getMemberUrl("/seeyon/rest/orgMember/","根据ID查询人员信息路径"), + addOrUpdateMemberUrl("/seeyon/rest/orgMember","根据ID新增或修改人员信息路径"), + addMemberUrl("/seeyon/rest/orgMember/saveMemberMain","根据ID新增人员信息路径"), + updateMemberUrl("/seeyon/rest/orgMember/updateMemberMain","根据ID修改人员信息路径"), + getDepartmentmanagerinfoUrl("/seeyon/rest/orgDepartment/departmentmanagerinfo/","根据部门ID查看部门角色"), + updateDepartmentmanagerinfoUrl("/seeyon/rest/orgDepartment/departmentmanagerinfo","根据部门ID修改部门角色"), + url("http://ip:port", "同步地址"), + customerServiceBlacklist("流程平台", "客户服务平台同步黑名单"), + recordUrl("/seeyon/cap4/businessTemplateController.do?method=formContent&type=browse&rightId=5763781100389681074.1730454067325587255_-6583821842800687659.2925077446933826142_2648590641453223755.-1311747989662252464_2465382193758949243.-7764150748768613564&formTemplateId=-3215088232567389128&viewConditionId=&conditionIdDeal=&columnId=-3215088232567389128&moduleType=42&isUnFlowDrawer=true&needUpdate=1&tplId=850010&btnId=&_v=1757387714948&moduleId=","人员档案表跳转地址"); + + private String defaultValue; + private String description; + + private SyncConstants(String defaultValue, String description) { + this.defaultValue = defaultValue; + this.description = description; + } + + public String getDefaultValue() { + return this.defaultValue; + } + + public String getDescription() { + return this.description; + } + + public static String getPluginId() { + return plugin.defaultValue; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/controller/BusinessStructureMemberInfoController.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/controller/BusinessStructureMemberInfoController.java new file mode 100644 index 0000000..5923785 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/controller/BusinessStructureMemberInfoController.java @@ -0,0 +1,119 @@ +package com.seeyon.apps.src_mainorganization.controller; + +import cn.hutool.log.Log; +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.common.plugin.vo.ConfigVo; +import com.seeyon.apps.src_mainorganization.constans.SyncConstants; +import com.seeyon.apps.src_mainorganization.dao.ISrcMemberDao; +import com.seeyon.ctp.common.controller.BaseController; +import org.springframework.web.servlet.ModelAndView; + +import javax.inject.Inject; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.BufferedReader; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +public class BusinessStructureMemberInfoController extends BaseController { + + private static Log log = Log.get(BusinessStructureMemberInfoController.class); + + @Inject + private ICstConfigApi cstConfigApi; + @Inject + private ISrcMemberDao srcMemberDao; + + public String getPluginId() { + return SyncConstants.getPluginId(); + } + + + public ModelAndView index(HttpServletRequest request, HttpServletResponse response)throws Exception{ + log.info("进入业务架构模型人员数据展示"); + ConfigVo configVo = this.cstConfigApi.getConfig(this.getPluginId()); + // 设置请求字符编码(必须在获取参数前设置) + request.setCharacterEncoding("UTF-8"); + // 设置响应字符编码 + response.setCharacterEncoding("UTF-8"); + response.setContentType("application/json;charset=UTF-8"); + StringBuilder sb = new StringBuilder(); + try (BufferedReader reader = request.getReader()) { + String line; + while ((line = reader.readLine()) != null) { + sb.append(line); + } + } catch (IOException e) { + e.printStackTrace(); + } + String jsonData = sb.toString(); + JSONObject json = JSONObject.parseObject(jsonData); +// 获取根据单位或者部门ID获取单位或者部门下人员信息 + String memberId = json.getString("memberId"); + String memberType = json.getString("memberType"); + Map memberMap = new HashMap<>(); +// id--人员ID +// NAME--人员名称 +// CODE--人员编号 +// ext_attr_1 AS phone--人员手机号 +// a.NAME AS account_name--所属单位名称 +// NAME AS department_name--部门名称 +// p.NAME AS post_name--岗位名称 +// NAME AS level_name--职务级别名称 +// 补充字段:登录账号,身份证号,合同主体,用工单位,市场化公司单位、市场化公司部门、人员档案跳转连接 + switch (memberType){ + case "account":{ +// 处理集团单位查询人员信息 + memberMap = srcMemberDao.getMemberDataByMemberId(memberId); + break; + } + case "yd":{ +// 处理业代人员信息 + memberMap = srcMemberDao.getYDMemberDataByMemberId(memberId); + break; + } + case "kh":{ +// 处理客户单位下人员信息 + memberMap = srcMemberDao.getKHMemberDataByMemberId(memberId); + break; + } + default: + log.info("数据异常,请在人员类型中导入account,yd,kh字段"); + } +// memberMap = srcMemberDao.getMemberDataByMemberId(memberId); + +// 设置档案表跳转连接 + if(memberMap.get("record_id") == null){ + memberMap.put("recordUrl",""); + }else{ + String recordId = memberMap.get("record_id").toString(); + String recordUrl = configVo.getParamVal(SyncConstants.recordUrl.name()); + memberMap.put("recordUrl",recordUrl+recordId); + log.info("跳转人员档案地址"+recordUrl+recordId); + } + JSONObject res = new JSONObject(); + res.put("code","200"); +// res.put("data",errorAccountValue+","+errorDepartmentValue+","+errorMemberValue+","+errorServiceBrokerValue+","+errorClientMemberValue); + memberMap.replaceAll((key, value) -> value == null ? "" : value); + res.put("member",memberMap); + render(response, res.toString()); + return null; + } + + /** + * 给前台渲染json数据 + * @param response + * @param text + */ + private void render(HttpServletResponse response, String text) { + response.setContentType("application/json;charset=UTF-8"); + try { + response.setContentLength(text.getBytes("UTF-8").length); + response.getWriter().write(text); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/controller/BusinessStructureMemberListController.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/controller/BusinessStructureMemberListController.java new file mode 100644 index 0000000..14dae76 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/controller/BusinessStructureMemberListController.java @@ -0,0 +1,152 @@ +package com.seeyon.apps.src_mainorganization.controller; + +import cn.hutool.log.Log; +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.src_mainorganization.constans.SyncConstants; +import com.seeyon.apps.src_mainorganization.dao.ISrcMemberDao; +import com.seeyon.ctp.common.controller.BaseController; +import com.seeyon.ctp.organization.bo.V3xOrgDepartment; +import com.seeyon.ctp.organization.manager.OrgManager; +import org.springframework.web.servlet.ModelAndView; + +import javax.inject.Inject; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.BufferedReader; +import java.io.IOException; +import java.util.*; + +public class BusinessStructureMemberListController extends BaseController { + + private static Log log = Log.get(BusinessStructureMemberListController.class); + + @Inject + private ICstConfigApi cstConfigApi; + @Inject + private ISrcMemberDao srcMemberDao; + @Inject + private OrgManager orgManager; + + public String getPluginId() { + return SyncConstants.getPluginId(); + } + + public ModelAndView index(HttpServletRequest request, HttpServletResponse response)throws Exception{ + log.info("进入业务架构模型人员列表数据获取展示"); + // 设置请求字符编码(必须在获取参数前设置) + request.setCharacterEncoding("UTF-8"); + // 设置响应字符编码 + response.setCharacterEncoding("UTF-8"); + response.setContentType("application/json;charset=UTF-8"); + StringBuilder sb = new StringBuilder(); + try (BufferedReader reader = request.getReader()) { + String line; + while ((line = reader.readLine()) != null) { + sb.append(line); + } + } catch (IOException e) { + e.printStackTrace(); + } + String jsonData = sb.toString(); + JSONObject json = JSONObject.parseObject(jsonData); +// 获取根据单位或者部门ID获取单位或者部门下人员信息 + String paramType = json.getString("nodeType"); + List> members = new ArrayList<>(); + String nodeId = json.getString("nodeId"); + if("treeAccount".equals(paramType)){ + if("-9194677677107822293".equals(nodeId)){ +// 营销门户下的人员需要查询,人员档案,组织架构人员,客户人员等人员集合 +// 查询组织架构人员 + List> bmmembers = srcMemberDao.getMemberByAccountId(nodeId); + if(bmmembers.size()>0){ + members.addAll(bmmembers); + } + if(members!=null){ + log.info("人员人数"+members.size()); + } +// 查询业代人员 + List> ydmembers = srcMemberDao.getYDMemberAll(); + if(ydmembers.size()>0){ + members.addAll(ydmembers); + } + if(ydmembers!=null){ + log.info("业代人员人数"+ydmembers.size()); + } +// 查询客户单位下人员 + List> khmembers = srcMemberDao.getKHMemberAll(); + if(khmembers.size()>0){ + members.addAll(khmembers); + } + if(khmembers!=null){ + log.info("客户单位下人员人数"+khmembers.size()); + } + }else{ + members = srcMemberDao.getMemberByAccountId(nodeId); + if(members!=null){ + log.info("单位人员人数"+members.size()); + } + } + }else if ("department".equals(paramType)){ +// 是否为营销门户下部门 + V3xOrgDepartment orgDepartment = orgManager.getDepartmentById(Long.parseLong(nodeId)); + + if(orgDepartment!=null){ + if("-9194677677107822293".equals(orgDepartment.getOrgAccountId().toString())){ +// 是营销门户下部门 + List> bmmembers = srcMemberDao.getMemberByDepartmentId(nodeId); + if(bmmembers.size()>0){ + members.addAll(bmmembers); + } + if(members!=null){ + log.info("部门人员人数"+members.size()); + } +// 查询业代人员 + List> ydmembers = srcMemberDao.getYDMemberByDepartment(nodeId); + if(ydmembers.size()>0){ + members.addAll(ydmembers); + } + if(ydmembers!=null){ + log.info("部门业代人员人数"+ydmembers.size()); + } +// 查询客户单位下人员 + List> khmembers = srcMemberDao.getKHMemberByDepartment(nodeId); + if(khmembers.size()>0){ + members.addAll(khmembers); + } + if(khmembers!=null){ + log.info("部门客户人员人数"+khmembers.size()); + } + }else{ + members = srcMemberDao.getMemberByDepartmentId(nodeId); + if(members!=null){ + log.info("部门人员人数"+members.size()); + } + } + } + }else{ + log.info("数据类型异常,请检查参数"+json); + } + JSONObject res = new JSONObject(); + res.put("code","200"); +// res.put("data",errorAccountValue+","+errorDepartmentValue+","+errorMemberValue+","+errorServiceBrokerValue+","+errorClientMemberValue); + res.put("members",members); + render(response, res.toString()); + return null; + } + + /** + * 给前台渲染json数据 + * @param response + * @param text + */ + private void render(HttpServletResponse response, String text) { + response.setContentType("application/json;charset=UTF-8"); + try { + response.setContentLength(text.getBytes("UTF-8").length); + response.getWriter().write(text); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/controller/BusinessStructureTreeController.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/controller/BusinessStructureTreeController.java new file mode 100644 index 0000000..320edb9 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/controller/BusinessStructureTreeController.java @@ -0,0 +1,35 @@ +package com.seeyon.apps.src_mainorganization.controller; + + +import cn.hutool.log.Log; +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.src_mainorganization.constans.SyncConstants; +import com.seeyon.ctp.common.controller.BaseController; + +import org.springframework.web.servlet.ModelAndView; + +import javax.inject.Inject; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + + +public class BusinessStructureTreeController extends BaseController { + + private static Log log = Log.get(BusinessStructureTreeController.class); + + @Inject + private ICstConfigApi cstConfigApi; + + public String getPluginId() { + return SyncConstants.getPluginId(); + } + + + @Override + public ModelAndView index(HttpServletRequest request, HttpServletResponse response)throws Exception{ + log.info("进入业务架构模型展示"); + ModelAndView mv = new ModelAndView("apps/src_mainorganization/businessStructureTree"); + return mv; + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/controller/BusinessStructureUnitTreeController.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/controller/BusinessStructureUnitTreeController.java new file mode 100644 index 0000000..ce9856d --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/controller/BusinessStructureUnitTreeController.java @@ -0,0 +1,197 @@ +package com.seeyon.apps.src_mainorganization.controller; + +import cn.hutool.log.Log; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.src_mainorganization.bo.TreeNodeBo; +import com.seeyon.apps.src_mainorganization.constans.SyncConstants; +import com.seeyon.apps.src_mainorganization.dao.ISrcAccountDao; +import com.seeyon.apps.src_mainorganization.dao.ISrcDepartmentDao; +import com.seeyon.ctp.common.controller.BaseController; +import org.springframework.web.servlet.ModelAndView; + +import javax.inject.Inject; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.*; +import java.util.stream.Collectors; + +public class BusinessStructureUnitTreeController extends BaseController { + + private static Log log = Log.get(BusinessStructureUnitTreeController.class); + + @Inject + private ICstConfigApi cstConfigApi; + @Inject + private ISrcAccountDao srcAccountDao; + @Inject + private ISrcDepartmentDao srcDepartmentDao; + + public String getPluginId() { + return SyncConstants.getPluginId(); + } + + + public ModelAndView index(HttpServletRequest request, HttpServletResponse response)throws Exception{ + log.info("进入业务架构模型展示"); + +// 获取组织机构中所有的单位和部门 + List> maps = new ArrayList<>(); + Map indexMap = new HashMap<>(); + indexMap.put("id","1"); + indexMap.put("name","集团"); + indexMap.put("code",""); + indexMap.put("path","0000"); + indexMap.put("is_enable","1"); + indexMap.put("type","Account"); + maps.add(indexMap); + List> accountMaps = srcAccountDao.getAllAccounts(); + maps.addAll(accountMaps); + + List> departmentMaps = srcDepartmentDao.getAllDepartments(); + maps.addAll(departmentMaps); + + List> result = convertAndFilter(maps); + + String zNodes1 = buildTreeJson(result); + System.out.println(zNodes1); + JSONObject res = new JSONObject(); + res.put("code","200"); +// res.put("data",errorAccountValue+","+errorDepartmentValue+","+errorMemberValue+","+errorServiceBrokerValue+","+errorClientMemberValue); + res.put("data",JSONObject.parseObject(zNodes1)); + render(response, res.toString()); + return null; + } + + /** + * 给前台渲染json数据 + * @param response + * @param text + */ + private void render(HttpServletResponse response, String text) { + response.setContentType("application/json;charset=UTF-8"); + try { + response.setContentLength(text.getBytes("UTF-8").length); + response.getWriter().write(text); + } catch (IOException e) { + e.printStackTrace(); + } + } + + /** + * 构建数据树并转换为JSON + * @param dataList 原始数据列表,每个Map包含"id"、"name"、"type"、"path"键 + * @return 生成的JSON字符串 + */ + public static String buildTreeJson(List> dataList) { + // 按路径长度排序,确保父节点先处理 + dataList.sort(Comparator.comparingInt(m -> m.get("path").length())); + + // 存储路径到节点的映射,用于快速查找父节点 + Map pathNodeMap = new HashMap<>(); + + // 根节点 + TreeNodeBo root = null; + + for (Map data : dataList) { + String id = data.get("id"); + String name = data.get("name"); + String type = data.get("type"); + String path = data.get("path"); + + // 根据类型设置iconSkin + String iconSkin = "Account".equals(type) ? "treeAccount" : "department"; + + // 创建当前节点 + TreeNodeBo currentNode = new TreeNodeBo(name, id, iconSkin); + + // 如果是根节点(路径为"0000") + if ("0000".equals(path)) { + root = currentNode; + root.setOpen(true); // 根节点默认展开 + pathNodeMap.put(path, root); + continue; + } + + // 解析父路径(当前路径长度减4) + int parentPathLength = path.length() - 4; + if (parentPathLength < 4) { + continue; // 路径长度不合法,跳过 + } + + String parentPath = path.substring(0, parentPathLength); + TreeNodeBo parentNode = pathNodeMap.get(parentPath); + + if (parentNode != null) { + parentNode.getChildren().add(currentNode); + pathNodeMap.put(path, currentNode); + } + } + + // 转换为JSON并返回 + return JSON.toJSONString(root); + } + + public List> convertAndFilter(List> originalList) { + return originalList.stream() + // 过滤掉 is_enable 为 0 的记录 + .filter(this::isRecordEnabled) + // 处理 path 字段的特殊逻辑 + .filter(this::filterByPathPattern) + // 转换并过滤键 + .map(this::convertAndProcessMap) + .collect(Collectors.toList()); + } + + // 检查记录是否启用 (is_enable 不为 0) + private boolean isRecordEnabled(Map map) { + Object isEnable = map.get("is_enable"); + return isEnable == null || !"0".equals(isEnable.toString()); + } + + // 根据 path 字段进行过滤 + private boolean filterByPathPattern(Map map) { + Object pathObj = map.get("path"); + if (pathObj == null) { + return true; // 没有 path 字段则保留 + } + + String path = pathObj.toString(); + // 以 000000170012 开头 - 保留 + if (path.startsWith("000000170012")) { + return true; + } + // 以 00000017 开头 - 过滤掉 + return !path.startsWith("00000017"); + } + + // 转换 Map 并处理特定字段 + private Map convertAndProcessMap(Map originalMap) { + Map newMap = new HashMap<>(); + + originalMap.forEach((key, value) -> { + // 跳过 orgAccountId 键 + if ("orgAccountId".equals(key)) { + return; + } + + // 处理 path 字段的特殊情况 + if ("path".equals(key) && value != null) { + String pathValue = value.toString(); + if (pathValue.startsWith("000000170012")) { + newMap.put(key, "000000110999"+pathValue.substring(12)); // 调整值 + return; + } + } + + // 普通字段转换 + newMap.put(key, value == null ? null : value.toString()); + }); + + return newMap; + } + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/controller/OrganizationFieldCtrlController.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/controller/OrganizationFieldCtrlController.java new file mode 100644 index 0000000..a84a360 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/controller/OrganizationFieldCtrlController.java @@ -0,0 +1,79 @@ +package com.seeyon.apps.src_mainorganization.controller; + + +import cn.hutool.log.Log; +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.common.plugin.vo.ConfigVo; +import com.seeyon.apps.src_mainorganization.constans.SyncConstants; +import com.seeyon.apps.src_mainorganization.server.OrganizationOrgDingdingSyncServer; +import com.seeyon.ctp.common.controller.BaseController; +import com.seeyon.ctp.util.annotation.NeedlessCheckLogin; +import org.springframework.web.servlet.ModelAndView; + +import javax.inject.Inject; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +public class OrganizationFieldCtrlController extends BaseController { + + private static Log log = Log.get(OrganizationFieldCtrlController.class); + + @Inject + private ICstConfigApi cstConfigApi; + @Inject + private OrganizationOrgDingdingSyncServer organizationOrgDingdingSyncServer; + + public String getPluginId() { + return SyncConstants.getPluginId(); + } + + @NeedlessCheckLogin + public ModelAndView index(HttpServletRequest request, HttpServletResponse response)throws Exception{ + log.info("进入组织架构同步ajax方法"); + ConfigVo configVo = this.cstConfigApi.getConfig(this.getPluginId()); +// 设置返回值对象 + request.setCharacterEncoding("UTF-8"); + response.setCharacterEncoding("UTF-8"); + +// 进行钉钉单位同步操作 + String errorAccountValue = organizationOrgDingdingSyncServer.dingdingSyncAllAccounts(); +// 进行钉钉部门同步操作 + String errorDepartmentValue = organizationOrgDingdingSyncServer.dingdingSyncAllDepartments(); +// 进行钉钉人员同步操作 + String errorMemberValue = organizationOrgDingdingSyncServer.dingdingSyncAllMembers(); +// 进行钉钉业代人员同步操作isServiceBroker + String isServiceBroker = configVo.getParamVal(SyncConstants.isServiceBroker.name()); + String errorServiceBrokerValue = ""; + if("是".equals(isServiceBroker)||"Y".equals(isServiceBroker)||"y".equals(isServiceBroker)){ +// 进行业代人员同步 + errorServiceBrokerValue = organizationOrgDingdingSyncServer.dingdingSyncAllServiceBrokers(); + } +// 进行客户单位下人员同步 + String errorClientMemberValue = organizationOrgDingdingSyncServer.dingdingSyncAllClientMembers(); + JSONObject res = new JSONObject(); + res.put("code","200"); + res.put("data",errorAccountValue+","+errorDepartmentValue+","+errorMemberValue+","+errorServiceBrokerValue+","+errorClientMemberValue); +// res.put("data",","+","+","+errorServiceBrokerValue+","+errorClientMemberValue); + + render(response, res.toString()); + return null; + } + + + /** + * 给前台渲染json数据 + * @param response + * @param text + */ + private void render(HttpServletResponse response, String text) { + response.setContentType("application/json;charset=UTF-8"); + try { + response.setContentLength(text.getBytes("UTF-8").length); + response.getWriter().write(text); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/IArchiveDao.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/IArchiveDao.java new file mode 100644 index 0000000..b6eefa3 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/IArchiveDao.java @@ -0,0 +1,38 @@ +package com.seeyon.apps.src_mainorganization.dao; + +import com.alibaba.fastjson.JSONArray; + +import java.sql.SQLException; +import java.util.List; +import java.util.Map; + +public interface IArchiveDao { + + public List updateArchiveByCode(JSONArray var1) throws SQLException; + + public List> getIncrementDataByModifyDate(String startDate); + + public Map getMemberArchiveById(long memberId); + + public Map getMemberArchiveByMemberId(long memberId); + + public Map getMemberArchiveByClientMemberId(long clientMemberId); + + public List getPostBlackList(); + + public List getMemberWhiteList(); + + public List> getServiceBrokers(String startDate); + + public List> getServiceBrokers(); + + public List> getClientMembersByModifyDate(String startDate); + + public List> getAllCustomer(); + + public Map findMemberByFormmainId (String formmainId); + + public List> findMemberOtherData(); + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/IOrgRoleDao.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/IOrgRoleDao.java new file mode 100644 index 0000000..f18a445 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/IOrgRoleDao.java @@ -0,0 +1,8 @@ +package com.seeyon.apps.src_mainorganization.dao; + +import java.sql.SQLException; +import java.util.List; + +public interface IOrgRoleDao { + List getRoleIdById(String var1) throws SQLException; +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/ISrcAccountDao.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/ISrcAccountDao.java new file mode 100644 index 0000000..d4934ae --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/ISrcAccountDao.java @@ -0,0 +1,23 @@ +package com.seeyon.apps.src_mainorganization.dao; + + +import java.sql.SQLException; +import java.util.List; +import java.util.Map; + +public interface ISrcAccountDao { + + public String getAccountId(String orgAccount) throws SQLException; + + public List getSubordinateAccountByPath(String accountPath); + + public Map getAccountById(String accountId); + + public Map getAccountByPath(String accountPath); + + public List> getIncrementAccountByUpdateTime(String startDate); + + public List> getAllAccounts(); + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/ISrcDepartmentDao.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/ISrcDepartmentDao.java new file mode 100644 index 0000000..e502142 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/ISrcDepartmentDao.java @@ -0,0 +1,22 @@ +package com.seeyon.apps.src_mainorganization.dao; + + +import java.util.List; +import java.util.Map; + +public interface ISrcDepartmentDao { + + public List getSubordinateDepartmentByPath(String accountPath); + + public Map getDepartmentByPath(String path); + + public List> getIncrementDepartmentByUpdateTime(String startDate); + + public List> getAllDepartments (); + + public List getDepartmentBySuperPath(String accountPath); + + public String getSuperUnitIdByPath(String path); + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/ISrcEnumDao.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/ISrcEnumDao.java new file mode 100644 index 0000000..c97a7b6 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/ISrcEnumDao.java @@ -0,0 +1,9 @@ +package com.seeyon.apps.src_mainorganization.dao; + +public interface ISrcEnumDao { + + public String getEnumByExtAttr(String extAttrName); + + public String getEnumItemByRefEnumIdValue(String refEnumId,String enumValue); + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/ISrcFormTableDao.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/ISrcFormTableDao.java new file mode 100644 index 0000000..b161abd --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/ISrcFormTableDao.java @@ -0,0 +1,9 @@ +package com.seeyon.apps.src_mainorganization.dao; + +import java.util.List; + +public interface ISrcFormTableDao { + + public List getMemberDifferenceIds(); + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/ISrcLevelDao.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/ISrcLevelDao.java new file mode 100644 index 0000000..b0d8a4b --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/ISrcLevelDao.java @@ -0,0 +1,8 @@ +package com.seeyon.apps.src_mainorganization.dao; + +public interface ISrcLevelDao { + + public String getLevelIdByAccountLevel(long oldLevelId, long orgAccountId); + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/ISrcMemberDao.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/ISrcMemberDao.java new file mode 100644 index 0000000..47f3578 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/ISrcMemberDao.java @@ -0,0 +1,46 @@ +package com.seeyon.apps.src_mainorganization.dao; + +import java.util.List; +import java.util.Map; + +public interface ISrcMemberDao { + + public String getMemberMaxSortId(); + + public List> queryMembers(String orgAccount,String orgDepartment,String startDate,String endDate); + + public List> queryFormMembers(String orgAccount,String orgDepartment,String startDate,String endDate); + + public List> queryServiceAgentMembers (String startDate,String endDate); + + public List> queryCustomerMembers(); + + public Map queryClientByName(String clientName); + + public List> getAllMembers(); + + public List> getMembersByStartDate(String startDate); + + public List> getAllClientMembers(); + + public Map getMemberById(String memberId); + +// 根据部门ID获取部门下人员列表 + public List> getMemberByDepartmentId(String departmentId); +// 根据单位ID获取单位下所有人员列表 + public List> getMemberByAccountId(String accountId); +// 根据人员ID查询人员详细信息,业务架构树专用 + public Map getMemberDataByMemberId(String memberId); + // 根据人员ID查询人员详细信息,业务架构树专用 + public Map getYDMemberDataByMemberId(String memberId); + // 根据人员ID查询人员详细信息,业务架构树专用 + public Map getKHMemberDataByMemberId(String memberId); +// 查询所有业代人员 + public List> getYDMemberAll(); +// 查询所有客户单位下人员 + public List> getKHMemberAll(); +// 根据部门ID查询业代人员 + public List> getYDMemberByDepartment(String departmentId); +// 根据部门ID查询客户单位下人员 + public List> getKHMemberByDepartment(String departmentId); +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/ISrcPostDao.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/ISrcPostDao.java new file mode 100644 index 0000000..8de26f3 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/ISrcPostDao.java @@ -0,0 +1,8 @@ +package com.seeyon.apps.src_mainorganization.dao; + +public interface ISrcPostDao { + + public String getPostIdByAccountPost(long oldPostId,long orgAccountId); + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/ISyncDdDao.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/ISyncDdDao.java new file mode 100644 index 0000000..8f432fe --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/ISyncDdDao.java @@ -0,0 +1,54 @@ +package com.seeyon.apps.src_mainorganization.dao; + +import java.util.List; +import java.util.Map; + +public interface ISyncDdDao { + + //临时-查询钉钉单位绑定信息全量 + public List getAccountsBinding(); + public Map getAccountBindingByDdAccount(String ddAccountId); + public Map getDepartmentBindingByDdDepartment(String ddDepartmentId); + public List getDepartmentsBinding(); + public List getMemberByMobile(String mobile); + + + + + + // 查询钉钉单位绑定信息 + public Map getAccountBinding(String orgAccountId); + +// 新增钉钉单位绑定信息 + public int saveAccountBinding(String accountId,String accountName,String ddAccountId ,String ddAccountName); + +// 根据单位ID修改钉钉单位绑定信息 + public int updateAccountBinding(String accountId,String accountName,String ddAccountId ,String ddAccountName); + +// 查询钉钉部门绑定信息 + public Map getDepartmentBinding(String orgDepartmentId); + +// 新增钉钉部门绑定信息 + public int saveDepartmentBinding(String departmentId,String departmentName ,String ddDepartmentId ,String ddDepartmentName); + +// 根据部门ID修改钉钉部门绑定信息 + public int updateDepartmentBinding(String departmentId,String departmentName ,String ddDepartmentId ,String ddDepartmentName); + +// 根据部门ID删除钉钉部门绑定信息 + public int deleteDepartmentBinding(String departmentId); + +// 查询钉钉人员绑定信息 + public Map getMemberBinding(String orgMemberId); + + // 新增钉钉人员绑定信息 + public int saveMemberBinding(String memberId,String membertName ,String ddMemberId ,String ddMemberName,String telnumber); + + // 根据人员ID修改钉钉人员绑定信息 + public int updateMemberBinding(String membertId,String memberName ,String ddMemberId ,String ddMemberName ,String telnumber); + +// 根据人员ID删除钉钉人员绑定信息 + public int deleteMemberBinding(String memberId); + + public Map getMaxSynchronizationDate(); + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/ISyncFvDao.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/ISyncFvDao.java new file mode 100644 index 0000000..e71adc4 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/ISyncFvDao.java @@ -0,0 +1,42 @@ +package com.seeyon.apps.src_mainorganization.dao; + +import com.seeyon.apps.src_mainorganization.bo.ThirdDeptBo; +import com.seeyon.apps.src_mainorganization.bo.ThirdMemberBo; +import com.seeyon.ctp.organization.bo.V3xOrgPost; + +import java.sql.SQLException; +import java.util.Map; + +public interface ISyncFvDao { + + public boolean queryUnitById(String unitId); + + public int addUnit(ThirdDeptBo thirdDept) ; + + public int updateUnit(ThirdDeptBo thirdDept); + + public boolean queryDeptById(String deptId); + + public int addDept(ThirdDeptBo thirdDept) throws SQLException; + + public int updateDept(ThirdDeptBo thirdDept); + + public Map queryMemberArchiveByMemberId(String memberId); + + public Map queryMemberHelpByMemberId(String memberId); + + public int updateMember(ThirdMemberBo thirdMember,Map memeberMap); + + public int addMember(ThirdMemberBo thirdMember,Map memeberMap); + + public boolean queryPostById(String postId); + + public String queryBanchmarkPostIdByPostId(String postId); + + public int updatePost(V3xOrgPost v3xOrgPost); + + public int addPost(V3xOrgPost v3xOrgPost); + + public String isMemberTypeById(String memberId); + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/ISyncQixuexingDao.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/ISyncQixuexingDao.java new file mode 100644 index 0000000..316d3ae --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/ISyncQixuexingDao.java @@ -0,0 +1,9 @@ +package com.seeyon.apps.src_mainorganization.dao; + +import java.util.Map; + +public interface ISyncQixuexingDao { + + public Map getMaxSynchronizationDate(); + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/impl/ArchiveDaoImpl.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/impl/ArchiveDaoImpl.java new file mode 100644 index 0000000..fcee849 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/impl/ArchiveDaoImpl.java @@ -0,0 +1,430 @@ +package com.seeyon.apps.src_mainorganization.dao.impl; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.src_mainorganization.dao.IArchiveDao; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.util.JDBCAgent; + +import java.sql.Connection; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.*; + +public class ArchiveDaoImpl implements IArchiveDao { + + String updateArchiveByCode = "update formmain_0181 set "; + String getIncrementDataByModifyDate = "select field0007 as member_id,field0190 as area_id,field0016 as phone_number from formmain_0210 where modify_date >= ?"; + String getClientMembersByModifyDate = "select f.field0007 as id ,m.name ,f.field0190 as dept_id,f.field0016 as telnumber ,a.id account_id from formmain_0210 f left join org_member m on f.field0007 = m.id left join org_unit d on f.field0190 = d.id left join org_unit a on d.org_account_id = a.id where modify_date >= ? and field0007 in (select id from org_member where org_account_id in ( select id from org_unit where path like '00000017________'))"; + String getMemberArchiveById = "select id as member_id,field0016 as telnumber,field0190 as area_dept from formmain_0210 where field0007 = ?"; + String getMemberArchiveByMemberId = "SELECT id,field0068 AS account_id,field0069 AS department_id,field0030 AS post_id,field0097 AS level_id,field0007 as member_id,field0070 AS code,field0192 AS name,field0013 AS member_no,field0110 AS sex,field0016 AS telnumber,field0047 AS member_state,field0049 AS board_date,field0190 AS area_dept FROM formmain_0210 WHERE field0007=?"; + String getMemberArchiveByClientMemberId = "SELECT id,field0068 AS account_id,field0069 AS department_id,field0030 AS post_id,field0097 AS level_id,field0007 as member_id,field0070 AS code,field0192 AS name,field0013 AS member_no,field0110 AS sex,field0016 AS telnumber,field0047 AS member_state,field0049 AS board_date,field0190 AS area_dept FROM formmain_0210 WHERE field0007=?"; + String getServiceBrokersBystartDate = "select id,field0049 as hiredate,field0047 as state,field0190 as dept_id,field0195 as post_id, field0192 as name ,field0110 as sex,field0010 as birthdate, field0016 as telnumber,field0013 AS member_no from formmain_0210 where field0066 = (select id from ctp_enum_item where ref_enumid = (select id from ctp_enum where enumname = '人员分类' ) and showvalue = 'C类') and field0111 = (select id from ctp_enum_item where ref_enumid = (select id from ctp_enum where enumname = '营销人员类别' ) and showvalue = '业代') and modify_date >= ?"; + String getServiceBrokers = "select id,field0049 as hiredate,field0047 as state,field0190 as dept_id,field0195 as post_id, field0192 as name ,field0110 as sex,field0010 as birthdate, field0016 as telnumber,field0013 AS member_no from formmain_0210 where field0066 = (select id from ctp_enum_item where ref_enumid = (select id from ctp_enum where enumname = '人员分类' ) and showvalue = 'C类') and field0111 = (select id from ctp_enum_item where ref_enumid = (select id from ctp_enum where enumname = '营销人员类别' ) and showvalue = '业代')"; + String getAllCustomer = "SELECT id,field0001 AS customer_code,field0002 AS customer_name,field0003 AS customer_nature,field0005 AS customer_province,field0007 AS state,field0067 AS area,field0068 AS marketization_company,field0008 AS market,field0011 AS credit_code,field0013 AS registered_capital,field0014 AS legal_person,field0033 AS legal_person_id,field0032 AS legal_person_telnumber,field0016 AS contact_site,field0017 AS consignee_site,field0031 AS postal_code,field0018 AS consignee_name1,field0030 AS consignee_telnumber1,field0019 AS consignee_name2,field0029 AS consignee_telnumber2 FROM formmain_0208"; + String findMemberByFormmainId = "select f.id,f.field0192 name ,f.field0070 code,f.field0068 org_account_id,f.field0069 org_department_id,f.field0030 org_post_id,f.field0097 org_level_id,f.field0047 is_enable , f.field0016 as telnumber ,f.field0016 login_name, f.field0010 birthday ,field0049 hiredate ,f.field0110 gender from formmain_0210 f where f.id = ?"; + String findMemberOtherData = "select id,field0192 name,field0070 code,field0068 org_account_id,field0069 org_department_id,field0030 org_post_id,field0097 org_level_id,field0047 is_enable,field0016 telnumber,field0016 login_name,field0010 birthday,field0049 hiredate,field0110 gender from formmain_0210 f where f.field0007 is null and id not in (select id from formmain_0210 where field0066 = (select id from ctp_enum_item where ref_enumid = (select id from ctp_enum where enumname = '人员分类' ) and showvalue = 'C类') and field0111 = (select id from ctp_enum_item where ref_enumid = (select id from ctp_enum where enumname = '营销人员类别' ) and showvalue = '业代'))"; + + String getPostBlackList = "select field0005 from formmain_0758 f left join ctp_enum_item e on f.field0003 = e.id where e.enumvalue in ('1','3','5','6') "; + String getMemberWhiteList ="select field0005 from formmain_0759 f left join ctp_enum_item e on f.field0003 = e.id where e.enumvalue in ('1','3','5','6') "; + +// String getPostBlackList = "select field0005 from formmain_0746 f left join ctp_enum_item e on f.field0003 = e.id where e.enumvalue in ('1','3','5','6') "; +// String getMemberWhiteList ="select field0005 from formmain_0747 f left join ctp_enum_item e on f.field0003 = e.id where e.enumvalue in ('1','3','5','6') "; + + + public List updateArchiveByCode(JSONArray datas) throws SQLException { + int issum; + JDBCAgent agent = new JDBCAgent(); + List res = new ArrayList(); + Connection connection = JDBCAgent.getRawConnection(); + connection.setAutoCommit(false); + Statement statement = connection.createStatement(); + try { + int num = 0; + for(int i = 0; i < datas.size(); ++i) { + StringBuilder sql = new StringBuilder(this.updateArchiveByCode); + JSONObject data = datas.getJSONObject(i); + String code = data.getString("code"); + JSONObject faields = data.getJSONObject("data"); + Set keySet = faields.keySet(); + Iterator var14 = keySet.iterator(); + + while(var14.hasNext()) { + String key = (String)var14.next(); + sql.append(key + "= '" + faields.getString(key) + "' ,"); + } + sql = new StringBuilder(sql.substring(0, sql.length() - 1)); + sql.append(" where field0046 = '" + code + "'"); + issum = statement.executeUpdate(sql.toString()); + if (issum > 0) { + ++num; + } else { + res.add(code); + } + } + if (num != datas.size()) { + connection.rollback(); + } else { + connection.commit(); + } + } catch (Exception var21) { + var21.printStackTrace(); + + try { + if (connection != null) { + connection.rollback(); + } + } catch (SQLException var20) { + var20.printStackTrace(); + } + } finally { + if (agent != null) { + agent.close(); + } + } + return res; + } + +// select * from formmain_0210 where modify_date >= ? + @Override + public List> getIncrementDataByModifyDate (String startDate){ + JDBCAgent agent = new JDBCAgent(); + List> res = new ArrayList<>(); + try { + StringBuilder sql = new StringBuilder(this.getIncrementDataByModifyDate); + List p = new ArrayList(); + p.add(startDate); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + + for(int i = 0; i < list.size(); ++i) { + if (list.size() != 0) { + Map map = (Map)list.get(i); + res.add(map); + } + } + } catch (BusinessException var13) { + var13.printStackTrace(); + } catch (SQLException var14) { + var14.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return res; + } + + @Override + public Map getMemberArchiveById(long memberId){ + JDBCAgent agent = new JDBCAgent(); + Map res = new HashMap<>(); + try { + StringBuilder sql = new StringBuilder(this.getMemberArchiveById); + List p = new ArrayList(); + p.add(memberId); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + for(int i = 0; i < list.size(); ++i) { + if (list.size() != 0) { + res = (Map)list.get(i); + } + } + } catch (BusinessException var13) { + var13.printStackTrace(); + } catch (SQLException var14) { + var14.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return res; + } + + @Override + public Map getMemberArchiveByMemberId(long memberId){ + JDBCAgent agent = new JDBCAgent(); + Map res = new HashMap<>(); + try { + StringBuilder sql = new StringBuilder(this.getMemberArchiveByMemberId); + List p = new ArrayList(); + p.add(memberId); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + for(int i = 0; i < list.size(); ++i) { + if (list.size() != 0) { + res = (Map)list.get(i); + } + } + } catch (BusinessException var13) { + var13.printStackTrace(); + } catch (SQLException var14) { + var14.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return res; + } + + @Override + public MapgetMemberArchiveByClientMemberId(long clientMemberId){ + JDBCAgent agent = new JDBCAgent(); + Map res = new HashMap<>(); + try { + StringBuilder sql = new StringBuilder(this.getMemberArchiveByClientMemberId); + List p = new ArrayList(); + p.add(clientMemberId); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + for(int i = 0; i < list.size(); ++i) { + if (list.size() != 0) { + res = (Map)list.get(i); + } + } + } catch (BusinessException var13) { + var13.printStackTrace(); + } catch (SQLException var14) { + var14.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return res; + } + + @Override + public List getPostBlackList(){ + JDBCAgent agent = new JDBCAgent(); + List res = new ArrayList<>(); + try { + StringBuilder sql = new StringBuilder(this.getPostBlackList); + List p = new ArrayList(); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + for(int i = 0; i < list.size(); ++i) { + if (list.size() != 0) { + Map map = (Map)list.get(i); + String posts = map.get("field0005").toString(); + for(String postId:posts.split(",")){ + res.add(postId); + } + } + } + } catch (BusinessException var13) { + var13.printStackTrace(); + } catch (SQLException var14) { + var14.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return res; + } + + @Override + public List getMemberWhiteList(){ + JDBCAgent agent = new JDBCAgent(); + List res = new ArrayList<>(); + try { + StringBuilder sql = new StringBuilder(this.getMemberWhiteList); + List p = new ArrayList(); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + + for(int i = 0; i < list.size(); ++i) { + if (list.size() != 0) { + Map map = (Map)list.get(i); + String members = map.get("field0005").toString(); + for (String memberId: members.split(",")) { + res.add(memberId); + } + } + } + } catch (BusinessException var13) { + var13.printStackTrace(); + } catch (SQLException var14) { + var14.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return res; + } + +// select field0047 as state,field0069 as dept_id,field0030 as post_id, field0192 as name ,field0110 as sex,field0010 as birthdate, field0016 as telnumter from formmain_0210 where field0066 = (select id from ctp_enum_item where ref_enumid = (select id from ctp_enum where enumname = '人员分类' ) and showvalue = 'C类') and field0080 = (select id from ctp_enum_item where ref_enumid = (select id from ctp_enum where enumname = '营销人员类别' ) and showvalue = '业代') and modify_date >= ? + @Override + public List> getServiceBrokers (String startDate){ + JDBCAgent agent = new JDBCAgent(); + List> res = new ArrayList<>(); + try { + StringBuilder sql = new StringBuilder(this.getServiceBrokersBystartDate); + List p = new ArrayList(); + p.add(startDate); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + + for(int i = 0; i < list.size(); ++i) { + if (list.size() != 0) { + Map map = (Map)list.get(i); + res.add(map); + } + } + } catch (BusinessException var13) { + var13.printStackTrace(); + } catch (SQLException var14) { + var14.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return res; + } + +// select field0047 as state,field0069 as dept_id,field0030 as post_id, field0192 as name ,field0110 as sex,field0010 as birthdate, field0016 as telnumter from formmain_0210 where field0066 = (select id from ctp_enum_item where ref_enumid = (select id from ctp_enum where enumname = '人员分类' ) and showvalue = 'C类') and field0080 = (select id from ctp_enum_item where ref_enumid = (select id from ctp_enum where enumname = '营销人员类别' ) and showvalue = '业代') and modify_date >= ? + @Override + public List> getServiceBrokers (){ + JDBCAgent agent = new JDBCAgent(); + List> res = new ArrayList<>(); + try { + StringBuilder sql = new StringBuilder(this.getServiceBrokers); + List p = new ArrayList(); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + + for(int i = 0; i < list.size(); ++i) { + if (list.size() != 0) { + Map map = (Map)list.get(i); + res.add(map); + } + } + } catch (BusinessException var13) { + var13.printStackTrace(); + } catch (SQLException var14) { + var14.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return res; + } + + @Override + public List> getClientMembersByModifyDate(String startDate){ + JDBCAgent agent = new JDBCAgent(); + List> res = new ArrayList<>(); + try { + StringBuilder sql = new StringBuilder(this.getClientMembersByModifyDate); + List p = new ArrayList(); + p.add(startDate); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + + for(int i = 0; i < list.size(); ++i) { + if (list.size() != 0) { + Map map = (Map)list.get(i); + res.add(map); + } + } + } catch (BusinessException var13) { + var13.printStackTrace(); + } catch (SQLException var14) { + var14.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return res; + } + + @Override + public List> getAllCustomer(){ + JDBCAgent agent = new JDBCAgent(); + List> res = new ArrayList<>(); + try { + StringBuilder sql = new StringBuilder(this.getAllCustomer); + List p = new ArrayList(); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + for(int i = 0; i < list.size(); ++i) { + if (list.size() != 0) { + Map map = (Map)list.get(i); + res.add(map); + } + } + } catch (BusinessException var13) { + var13.printStackTrace(); + } catch (SQLException var14) { + var14.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return res; + } + + @Override + public Map findMemberByFormmainId(String formmainId){ + JDBCAgent agent = new JDBCAgent(); + Map res = new HashMap<>(); + try { + StringBuilder sql = new StringBuilder(this.findMemberByFormmainId); + List p = new ArrayList(); + p.add(formmainId); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + + for(int i = 0; i < list.size(); ++i) { + if (list.size() != 0) { + res = (Map)list.get(i); + } + } + } catch (BusinessException var13) { + var13.printStackTrace(); + } catch (SQLException var14) { + var14.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return res; + } + + @Override + public List> findMemberOtherData(){ + JDBCAgent agent = new JDBCAgent(); + List> res = new ArrayList<>(); + try { + StringBuilder sql = new StringBuilder(this.findMemberOtherData); + List p = new ArrayList(); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + for(int i = 0; i < list.size(); ++i) { + if (list.size() != 0) { + Map map = (Map)list.get(i); + res.add(map); + } + } + } catch (BusinessException var13) { + var13.printStackTrace(); + } catch (SQLException var14) { + var14.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return res; + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/impl/OrgRoleDaoImpl.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/impl/OrgRoleDaoImpl.java new file mode 100644 index 0000000..a59ad1b --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/impl/OrgRoleDaoImpl.java @@ -0,0 +1,45 @@ +package com.seeyon.apps.src_mainorganization.dao.impl; + +import com.seeyon.apps.src_mainorganization.dao.IOrgRoleDao; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.util.JDBCAgent; + +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class OrgRoleDaoImpl implements IOrgRoleDao { + String getRoleIdById = "select id from org_role where id = ?"; + + public OrgRoleDaoImpl() { + } + + public List getRoleIdById(String id) throws SQLException { + JDBCAgent agent = new JDBCAgent(); + ArrayList ids = new ArrayList(); + try { + StringBuilder sql = new StringBuilder(this.getRoleIdById); + List p = new ArrayList(); + p.add(id); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + + for(int i = 0; i < list.size(); ++i) { + if (list.size() != 0) { + String resid = ((Map)list.get(i)).get("id").toString(); + ids.add(resid); + } + } + } catch (BusinessException var13) { + var13.printStackTrace(); + } catch (SQLException var14) { + var14.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return ids; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/impl/SrcAccountDaoImpl.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/impl/SrcAccountDaoImpl.java new file mode 100644 index 0000000..f6a85b3 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/impl/SrcAccountDaoImpl.java @@ -0,0 +1,196 @@ +package com.seeyon.apps.src_mainorganization.dao.impl; + +import com.seeyon.apps.src_mainorganization.dao.ISrcAccountDao; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.util.JDBCAgent; + +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.regex.Pattern; + +public class SrcAccountDaoImpl implements ISrcAccountDao { + + String getAccountId = "select id from org_unit where (id = ? or name = ?)"; + String getSubordinateAccountByPath = "select id from org_unit where type = 'Account' and path like '${path}____'"; + String getAccountById = "select id,name,code,path from org_unit where type = 'Account' and id = ?"; + String getAccountByPath = "select id,name,code,path from org_unit where type = 'Account' and path = ?"; + String getIncrementAccountByModifyDate = "select id,name,code,path,is_enable,sort_id from org_unit where type = 'Account' and id <> -1730833917365171641 and (path not like '00000017%' or name = '湖北省知与行人力资源管理有限公司' ) and is_enable = 1 and update_time >= ?"; + String getAllAccounts = "select id,name,code,path,is_enable,type,sort_id from org_unit where type = 'Account' and id <> -1730833917365171641 and (path not like '00000017%' or name = '湖北省知与行人力资源管理有限公司' ) and is_enable = 1 order by SORT_ID"; + +// select id from org_unit where (id = ? or name = ?) + @Override + public String getAccountId(String orgAccount) throws SQLException { + JDBCAgent agent = new JDBCAgent(); + String accountId = ""; + try { + StringBuilder sql = new StringBuilder(this.getAccountId); + List p = new ArrayList(); + p.add(orgAccount); + p.add(orgAccount); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + for(int i = 0; i < list.size(); ++i) { + if (list.size() != 0) { + accountId = ((Map)list.get(i)).get("id").toString(); + } + } + } catch (BusinessException var13) { + var13.printStackTrace(); + } catch (SQLException var14) { + var14.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return accountId; + } + +// select id from org_unit where type = 'Account' and path like '${path}____' + @Override + public List getSubordinateAccountByPath(String accountPath){ + JDBCAgent agent = new JDBCAgent(); + List accountIds = new ArrayList<>(); + try { + String str = this.getSubordinateAccountByPath.replaceAll(Pattern.quote("${path}"),accountPath); + StringBuilder sql = new StringBuilder(str); + List p = new ArrayList(); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + for(int i = 0; i < list.size(); ++i) { + if (list.size() != 0) { + accountIds.add(list.get(i).get("id").toString()); + } + } + } catch (BusinessException var13) { + var13.printStackTrace(); + } catch (SQLException var14) { + var14.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return accountIds; + } + + + // select id,name,code,path from org_unit where type = 'Account' and id = ? + @Override + public Map getAccountById(String accountId){ + JDBCAgent agent = new JDBCAgent(); + Map account = new HashMap<>(); + try { + StringBuilder sql = new StringBuilder(this.getAccountById); + List p = new ArrayList(); + p.add(accountId); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + for(int i = 0; i < list.size(); ++i) { + if (list.size() != 0) { + account = list.get(0); + } + } + } catch (BusinessException var13) { + var13.printStackTrace(); + } catch (SQLException var14) { + var14.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return account; + } + + + // select id from org_unit where (id = ? or name = ?) + @Override + public Map getAccountByPath(String accountPath){ + JDBCAgent agent = new JDBCAgent(); + Map account = new HashMap<>(); + try { + StringBuilder sql = new StringBuilder(this.getAccountByPath); + List p = new ArrayList(); + p.add(accountPath); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + for(int i = 0; i < list.size(); ++i) { + if (list.size() != 0) { + account = list.get(0); + } + } + } catch (BusinessException var13) { + var13.printStackTrace(); + } catch (SQLException var14) { + var14.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return account; + } + +// select id from org_unit where type = 'Account' and update_time >= '2025-06-06' + @Override + public List> getIncrementAccountByUpdateTime (String startDate){ + JDBCAgent agent = new JDBCAgent(); + List> res = new ArrayList<>(); + try { + StringBuilder sql = new StringBuilder(this.getIncrementAccountByModifyDate); + List p = new ArrayList(); + p.add(startDate); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + + for(int i = 0; i < list.size(); ++i) { + if (list.size() != 0) { + Map map = (Map)list.get(i); + res.add(map); + } + } + } catch (BusinessException var13) { + var13.printStackTrace(); + } catch (SQLException var14) { + var14.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return res; + } + + + @Override + public List> getAllAccounts(){ + JDBCAgent agent = new JDBCAgent(); + List> res = new ArrayList<>(); + try { + StringBuilder sql = new StringBuilder(this.getAllAccounts); + List p = new ArrayList(); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + for(int i = 0; i < list.size(); ++i) { + if (list.size() != 0) { + Map map = (Map)list.get(i); + res.add(map); + } + } + } catch (BusinessException var13) { + var13.printStackTrace(); + } catch (SQLException var14) { + var14.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return res; + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/impl/SrcDepartmentDaoImpl.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/impl/SrcDepartmentDaoImpl.java new file mode 100644 index 0000000..8d26aba --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/impl/SrcDepartmentDaoImpl.java @@ -0,0 +1,198 @@ +package com.seeyon.apps.src_mainorganization.dao.impl; + +import com.seeyon.apps.src_mainorganization.dao.ISrcDepartmentDao; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.util.JDBCAgent; + +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.regex.Pattern; + +public class SrcDepartmentDaoImpl implements ISrcDepartmentDao { + + + String getSubordinateDepartmentByPath = "select id from org_unit where type = 'Department' and path like '${path}____'"; + String getDepartmentByPath = "select name,code,path,id from org_unit where type = 'Department' and path like ?"; + String getIncrementDepartmentByUpdateTime = "select id,code,name,path,is_enable,org_account_id,sort_id from org_unit where type = 'Department' and update_time >= ?"; + String getAllDepatrment = "select id,code,name,path,is_enable,org_account_id,sort_id from org_unit where type = 'Department' and path not like '00000017%' and is_enable = 1 and org_account_id <> -1730833917365171641 order by SORT_ID"; + String getDepartmentBySuperPath = "select id from org_unit where type = 'Department' and path like '${path}%'"; + String getSuperUnitIdByPath = "select id from org_unit where path = ? and IS_ENABLE = '1'"; + +// select id from org_unit where type = 'Department' and path like '${path}____' + @Override + public List getSubordinateDepartmentByPath(String accountPath){ + JDBCAgent agent = new JDBCAgent(); + List departmentIds = new ArrayList<>(); + try { + String str = this.getSubordinateDepartmentByPath.replaceAll(Pattern.quote("${path}"),accountPath); + StringBuilder sql = new StringBuilder(str); + List p = new ArrayList(); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + for(int i = 0; i < list.size(); ++i) { + if (list.size() != 0) { + departmentIds.add(list.get(i).get("id").toString()); + } + } + } catch (BusinessException var13) { + var13.printStackTrace(); + } catch (SQLException var14) { + var14.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return departmentIds; + } + +// select name,code,path,id from org_unit where type = 'Department' and path like ? + @Override + public Map getDepartmentByPath(String path){ + JDBCAgent agent = new JDBCAgent(); + Map department = new HashMap<>(); + try { + StringBuilder sql = new StringBuilder(getDepartmentByPath); + List p = new ArrayList(); + p.add(path); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + for(int i = 0; i < list.size(); ++i) { + if (list.size() != 0) { + department = list.get(i); + } + } + } catch (BusinessException var13) { + var13.printStackTrace(); + } catch (SQLException var14) { + var14.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return department; + } + + + +// select id from org_unit where type = 'Account' and update_time >= '2025-06-06' + @Override + public List> getIncrementDepartmentByUpdateTime (String startDate){ + JDBCAgent agent = new JDBCAgent(); + List> res = new ArrayList<>(); + try { + StringBuilder sql = new StringBuilder(this.getIncrementDepartmentByUpdateTime); + List p = new ArrayList(); + p.add(startDate); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + + for(int i = 0; i < list.size(); ++i) { + if (list.size() != 0) { + Map map = (Map)list.get(i); + res.add(map); + } + } + } catch (BusinessException var13) { + var13.printStackTrace(); + } catch (SQLException var14) { + var14.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return res; + } + + + // select id,name,code,path,is_enable from org_unit where type = 'Account' + @Override + public List> getAllDepartments (){ + JDBCAgent agent = new JDBCAgent(); + List> res = new ArrayList<>(); + try { + StringBuilder sql = new StringBuilder(this.getAllDepatrment); + List p = new ArrayList(); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + for(int i = 0; i < list.size(); ++i) { + if (list.size() != 0) { + Map map = (Map)list.get(i); + res.add(map); + } + } + } catch (BusinessException var13) { + var13.printStackTrace(); + } catch (SQLException var14) { + var14.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return res; + } + + // select id from org_unit where type = 'Department' and path like '${path}%' + @Override + public List getDepartmentBySuperPath(String accountPath){ + JDBCAgent agent = new JDBCAgent(); + List departmentIds = new ArrayList<>(); + try { + String str = this.getSubordinateDepartmentByPath.replaceAll(Pattern.quote("${path}"),accountPath); + StringBuilder sql = new StringBuilder(str); + List p = new ArrayList(); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + for(int i = 0; i < list.size(); ++i) { + if (list.size() != 0) { + departmentIds.add(list.get(i).get("id").toString()); + } + } + } catch (BusinessException var13) { + var13.printStackTrace(); + } catch (SQLException var14) { + var14.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return departmentIds; + } + +// select id from org_unit where path = ? and IS_ENABLE = '1' + public String getSuperUnitIdByPath(String path){ + JDBCAgent agent = new JDBCAgent(); + String departmentId = ""; + try { + StringBuilder sql = new StringBuilder(getSuperUnitIdByPath); + List p = new ArrayList(); + p.add(path); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + for(int i = 0; i < list.size(); ++i) { + if (list.size() != 0) { + departmentId = list.get(i).get("id").toString(); + } + } + } catch (BusinessException var13) { + var13.printStackTrace(); + } catch (SQLException var14) { + var14.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return departmentId; + } + + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/impl/SrcEnumDaoImpl.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/impl/SrcEnumDaoImpl.java new file mode 100644 index 0000000..6c8f9a5 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/impl/SrcEnumDaoImpl.java @@ -0,0 +1,74 @@ +package com.seeyon.apps.src_mainorganization.dao.impl; + +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.src_mainorganization.dao.ISrcEnumDao; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.util.JDBCAgent; + +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class SrcEnumDaoImpl implements ISrcEnumDao { + + private String getEnumByExtAttr = "select label,name,alias,column_rule from ctp_metadata_column where name = ?"; + private String getEnumItemByRefEnumIdValue = "select id,ref_enumid,showvalue,enumvalue from ctp_enum_item where ref_enumid = ? and enumvalue = ?"; + + @Override + public String getEnumByExtAttr(String extAttrName) { + JDBCAgent agent = new JDBCAgent(); + String enumId = ""; + try { + StringBuilder sql = new StringBuilder(this.getEnumByExtAttr); + List p = new ArrayList(); + p.add(extAttrName); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + if(list.size()>0){ + Map map = (Map) list.get(0); + String columnRule = map.get("column_rule").toString(); + JSONObject column = JSONObject.parseObject(columnRule); + enumId = column.getString("codeId"); + } + } catch (BusinessException var13) { + var13.printStackTrace(); + } catch (SQLException var14) { + var14.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return enumId; + } + + @Override + public String getEnumItemByRefEnumIdValue(String refEnumId,String enumValue) { + JDBCAgent agent = new JDBCAgent(); + String enumItemId = ""; + try { + StringBuilder sql = new StringBuilder(this.getEnumItemByRefEnumIdValue); + List p = new ArrayList(); + p.add(refEnumId); + p.add(enumValue); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + if(list.size()>0){ + enumItemId = list.get(0).get("id").toString(); + } + } catch (BusinessException var13) { + var13.printStackTrace(); + } catch (SQLException var14) { + var14.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return enumItemId; + } + + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/impl/SrcFormTableDaoImpl.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/impl/SrcFormTableDaoImpl.java new file mode 100644 index 0000000..d113196 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/impl/SrcFormTableDaoImpl.java @@ -0,0 +1,42 @@ +package com.seeyon.apps.src_mainorganization.dao.impl; + +import com.seeyon.apps.src_mainorganization.dao.ISrcFormTableDao; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.util.JDBCAgent; + +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class SrcFormTableDaoImpl implements ISrcFormTableDao { + + private String getMemberDifferenceIds = " SELECT m.* FROM org_member m LEFT JOIN formmain_0210 f ON m.id=f.field0007 WHERE f.id IS NULL AND m.IS_ENABLE=1 AND m.IS_DELETEd=0 and m.org_account_id not in( -1730833917365171641,3695237350552978435) and m.id not in (-7983617918136007951,527060303679013620)"; + + @Override + public List getMemberDifferenceIds (){ + JDBCAgent agent = new JDBCAgent(); + List res = new ArrayList<>(); + try { + StringBuilder sql = new StringBuilder(this.getMemberDifferenceIds); + List p = new ArrayList(); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + for(int i = 0; i < list.size(); ++i) { + if (list.size() != 0) { + String id = list.get(i).get("id").toString(); + res.add(id); + } + } + } catch (BusinessException var13) { + var13.printStackTrace(); + } catch (SQLException var14) { + var14.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return res; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/impl/SrcLevelDaoImpl.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/impl/SrcLevelDaoImpl.java new file mode 100644 index 0000000..b729104 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/impl/SrcLevelDaoImpl.java @@ -0,0 +1,43 @@ +package com.seeyon.apps.src_mainorganization.dao.impl; + + +import com.seeyon.apps.src_mainorganization.dao.ISrcLevelDao; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.util.JDBCAgent; + +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class SrcLevelDaoImpl implements ISrcLevelDao { + + private String getLevelIdByAccountLevel = "select id from org_level where name = (select name from org_level where id = ?) and org_account_id = ?"; + + @Override + public String getLevelIdByAccountLevel(long oldLevelId, long orgAccountId) { + JDBCAgent agent = new JDBCAgent(); + String levelId = ""; + try { + StringBuilder sql = new StringBuilder(getLevelIdByAccountLevel); + List p = new ArrayList(); + p.add(oldLevelId); + p.add(orgAccountId); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + if (list.size() != 0) { + Map map = list.get(0); + levelId = map.get("id").toString(); + } + } catch (BusinessException var13) { + var13.printStackTrace(); + } catch (SQLException var14) { + var14.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return levelId; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/impl/SrcMemberDaoImpl.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/impl/SrcMemberDaoImpl.java new file mode 100644 index 0000000..c0c1db0 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/impl/SrcMemberDaoImpl.java @@ -0,0 +1,652 @@ +package com.seeyon.apps.src_mainorganization.dao.impl; + +import com.seeyon.apps.src_mainorganization.dao.ISrcMemberDao; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.util.JDBCAgent; +import www.seeyon.com.utils.StringUtil; + +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class SrcMemberDaoImpl implements ISrcMemberDao { + + private String getMemberMaxSortId = "select max(sort_id) as max_sort_id from org_member "; + private String queryMembers = " select m.id,m.name,m.code from org_member m left join org_unit a on m.org_account_id = a.id where (m.org_account_id = ? or a.name = ?) "; + private String queryFormMembers = " select m.id,m.field0192 name,m.field0070 code from formmain_0210 m left join org_unit a on m.field0068 = a.id where (m.field0068 = ? or a.name = ?) "; + private String queryServiceAgentMembers = "SELECT id AS member_id,field0068 AS account_id,field0190 AS department_id,field0030 AS post_id,field0097 AS level_id,field0070 AS member_code,field0192 AS member_name,field0110 AS gender,field0010 AS birthday,field0047 AS is_enabled,field0016 AS telnember,field0195 AS yd_post_id,\"\" AS hiredate FROM formmain_0210 WHERE field0066=( SELECT id FROM ctp_enum_item WHERE showvalue='C类') AND field0111=( SELECT id FROM ctp_enum_item WHERE showvalue='业代')"; + private String queryCustomerMembers = "select * from formmain_0208 "; + private String queryClientByName = "select field0001 as client_code,field0002 as client_name,field0067 as area,field0007 as state,field0011 as credit_identifier,field0062 as deputy_manager from formmain_0208 where field0002 = ?"; + private String getAllMembers = "select id,name,code,is_enable,org_account_id,org_post_id,org_department_id from org_member "; + private String getMembersByStartDate = "select id,name,code,is_enable,org_account_id,org_post_id,org_department_id from org_member where update_time>=?"; + private String getAllClientMembers = "select id,name,code,is_enable,org_account_id,org_post_id,org_department_id from org_member where org_account_id in ( select id from org_unit where path like '00000017%' and type = 'Account')"; + private String getMemberById = "select id,name,code,is_enable,org_account_id,org_post_id,org_department_id from org_member where id = ?"; + private String getMemberByDepartmentId = "select id,name,code,is_enable,org_account_id,org_post_id,org_department_id,'account' type from org_member where org_department_id = ? and is_enable = 1 order by SORT_ID"; + private String getMemberByAccountId = "select id,name,code,is_enable,org_account_id,org_post_id,org_department_id,'account' type from org_member where org_account_id = ? and is_enable = 1 order by SORT_ID"; + +// select max(sort_id) as max_sort_id from org_member + @Override + public String getMemberMaxSortId() { + JDBCAgent agent = new JDBCAgent(); + String sortId = ""; + try { + StringBuilder sql = new StringBuilder(this.getMemberMaxSortId); + List p = new ArrayList(); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + if(list.size()>0){ + Map map = (Map) list.get(0); + sortId = map.get("max_sort_id").toString(); + } + } catch (BusinessException var13) { + var13.printStackTrace(); + } catch (SQLException var14) { + var14.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return sortId; + } + +// select id,name,code from org_member where (org_account_id = ? or arg_account_id = ?) + @Override + public List> queryMembers(String orgAccount,String orgDepartment,String startDate,String endDate) { + JDBCAgent agent = new JDBCAgent(); + List> res = new ArrayList(); + try { + StringBuilder sql = new StringBuilder(this.queryMembers); + List p = new ArrayList(); + p.add(orgAccount); + p.add(orgAccount); + if(StringUtil.isNotEmpty(orgDepartment)){ + sql.append(" and (m.org_department_id = '"+orgDepartment+"' or m.org_department_id in (select id from org_unit where name = '"+orgDepartment+"'))"); + } + if(StringUtil.isNotEmpty(startDate)){ + sql.append(" and m.update_time >= '" + startDate +"'"); + } + if(StringUtil.isNotEmpty(endDate)){ + sql.append(" and m.update_time <= '"+ endDate +"'"); + } + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + if (list.size() != 0) { + for(int i = 0; i < list.size(); ++i) { + Map map = (Map)list.get(i); + res.add(map); + } + } + } catch (BusinessException var13) { + var13.printStackTrace(); + } catch (SQLException var14) { + var14.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return res; + } + + // select id,name,code from formmain_0210 where (org_account_id = ? or arg_account_id = ?) + @Override + public List> queryFormMembers(String orgAccount,String orgDepartment,String startDate,String endDate) { + JDBCAgent agent = new JDBCAgent(); + List> res = new ArrayList(); + try { + StringBuilder sql = new StringBuilder(this.queryFormMembers); + List p = new ArrayList(); + p.add(orgAccount); + p.add(orgAccount); + if(StringUtil.isNotEmpty(orgDepartment)){ + sql.append(" and (m.field0069 = '"+orgDepartment+"' or m.field0069 in (select id from org_unit where name = '"+orgDepartment+"'))"); + } + if(StringUtil.isNotEmpty(startDate)){ + sql.append(" and m.modify_date >= '" + startDate +"'"); + } + if(StringUtil.isNotEmpty(endDate)){ + sql.append(" and m.modify_date <= '"+ endDate +"'"); + } + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + if (list.size() != 0) { + for(int i = 0; i < list.size(); ++i) { + Map map = (Map)list.get(i); + res.add(map); + } + } + } catch (BusinessException var13) { + var13.printStackTrace(); + } catch (SQLException var14) { + var14.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return res; + } + +// select * from formmain_0210 where field0066 = (select id from ctp_enum_item where showvalue = 'C类') and field0111 = (select id from ctp_enum_item where showvalue = '业代') + @Override + public List> queryServiceAgentMembers (String startDate,String endDate){ + JDBCAgent agent = new JDBCAgent(); + List> res = new ArrayList(); + try { + StringBuilder sql = new StringBuilder(this.queryServiceAgentMembers); + if(StringUtil.isNotEmpty(startDate)){ + sql.append(" and m.modify_date >= '" + startDate +"'"); + } + if(StringUtil.isNotEmpty(endDate)){ + sql.append(" and m.modify_date <= '"+ endDate +"'"); + } + List p = new ArrayList(); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + if (list.size() != 0) { + for(int i = 0; i < list.size(); ++i) { + Map map = (Map)list.get(i); + res.add(map); + } + } + } catch (BusinessException var13) { + var13.printStackTrace(); + } catch (SQLException var14) { + var14.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return res; + } + +// select * from formmain_0208 + @Override + public List> queryCustomerMembers(){ + JDBCAgent agent = new JDBCAgent(); + List> res = new ArrayList(); + try { + StringBuilder sql = new StringBuilder(this.queryCustomerMembers); + List p = new ArrayList(); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + if (list.size() != 0) { + for(int i = 0; i < list.size(); ++i) { + Map map = (Map)list.get(i); + res.add(map); + } + } + } catch (BusinessException var13) { + var13.printStackTrace(); + } catch (SQLException var14) { + var14.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return res; + } + +// select * from formmain_0208 where field0002 = ? + @Override + public Map queryClientByName (String clientName){ + JDBCAgent agent = new JDBCAgent(); + Map res = new HashMap<>(); + try { + StringBuilder sql = new StringBuilder(this.queryClientByName); + List p = new ArrayList(); + p.add(clientName); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + if (list.size() != 0) { + for(int i = 0; i < list.size(); ++i) { + res = (Map)list.get(i); + } + } + } catch (BusinessException var13) { + var13.printStackTrace(); + } catch (SQLException var14) { + var14.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return res; + } + + // select * from org_member where field0002 = ? + @Override + public List> getMembersByStartDate (String startDate){ + JDBCAgent agent = new JDBCAgent(); + List> res = new ArrayList(); + try { + StringBuilder sql = new StringBuilder(this.getMembersByStartDate); + List p = new ArrayList(); + p.add(startDate); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + if (list.size() != 0) { + for(int i = 0; i < list.size(); ++i) { + Map map = (Map)list.get(i); + res.add(map); + } + } + } catch (BusinessException var13) { + var13.printStackTrace(); + } catch (SQLException var14) { + var14.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + if(res.size()==0){ + return null; + } + return res; + } + + @Override + public List> getAllMembers (){ + JDBCAgent agent = new JDBCAgent(); + List> res = new ArrayList(); + try { + StringBuilder sql = new StringBuilder(this.getAllMembers); + List p = new ArrayList(); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + if (list.size() != 0) { + for(int i = 0; i < list.size(); ++i) { + Map map = (Map)list.get(i); + res.add(map); + } + } + } catch (BusinessException var13) { + var13.printStackTrace(); + } catch (SQLException var14) { + var14.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + if(res.size()==0){ + return null; + } + return res; + } + + @Override + public List> getAllClientMembers(){ + JDBCAgent agent = new JDBCAgent(); + List> res = new ArrayList(); + try { + StringBuilder sql = new StringBuilder(this.getAllClientMembers); + List p = new ArrayList(); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + if (list.size() != 0) { + for(int i = 0; i < list.size(); i++) { + Map map = (Map)list.get(i); + res.add(map); + } + } + } catch (BusinessException var13) { + var13.printStackTrace(); + } catch (SQLException var14) { + var14.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + if(res.size()==0){ + return null; + } + return res; + } + +// select id,name,code,is_enable,org_account_id,org_post_id,org_department_id from org_member where is_enable = 1 and id = ? + public Map getMemberById(String memberId){ + JDBCAgent agent = new JDBCAgent(); + Map res = new HashMap<>(); + try { + StringBuilder sql = new StringBuilder(this.getMemberById); + List p = new ArrayList(); + p.add(memberId); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + if (list.size() != 0) { + for(int i = 0; i < list.size(); i++) { + res = (Map)list.get(i); + } + } + } catch (BusinessException var13) { + var13.printStackTrace(); + } catch (SQLException var14) { + var14.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + if(res.size()==0){ + return null; + } + return res; + } + + // 根据部门ID获取部门下人员列表 + public List> getMemberByDepartmentId(String departmentId){ + JDBCAgent agent = new JDBCAgent(); + List> res = new ArrayList(); + try { + StringBuilder sql = new StringBuilder(this.getMemberByDepartmentId); + List p = new ArrayList(); + p.add(departmentId); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + if (list.size() != 0) { + for(int i = 0; i < list.size(); i++) { + Map map = (Map)list.get(i); + res.add(map); + } + } + } catch (BusinessException var13) { + var13.printStackTrace(); + } catch (SQLException var14) { + var14.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } +// if(res.size()==0){ +// return null; +// } + return res; + } + + + + // 根据单位ID获取单位下所有人员列表 + public List> getMemberByAccountId(String accountId){ + JDBCAgent agent = new JDBCAgent(); + List> res = new ArrayList(); + try { + StringBuilder sql = new StringBuilder(this.getMemberByAccountId); + List p = new ArrayList(); + p.add(accountId); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + if (list.size() != 0) { + for(int i = 0; i < list.size(); i++) { + Map map = (Map)list.get(i); + res.add(map); + } + } + } catch (BusinessException var13) { + var13.printStackTrace(); + } catch (SQLException var14) { + var14.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } +// if(res.size()==0){ +// return null; +// } + return res; + } + + private String getMemberDataByMemberId = "SELECT m.id,m.NAME,m.CODE,m.ext_attr_1 phone,a.NAME account_name,d.NAME department_name,p.NAME post_name,l.NAME level_name,pr.login_name,f.field0013 member_no,ht.NAME htzt_name,yg.NAME ygzt_name,f.id record_id,'' bazaar_account,'' bazaar_department " + + "FROM org_member m LEFT JOIN org_principal pr ON m.id=pr.member_id " + + "LEFT JOIN formmain_0210 f ON m.id=f.field0007 " + + "LEFT JOIN org_unit ht ON f.field0187=ht.id " + + "LEFT JOIN org_unit yg ON f.field0188=yg.id " + + "LEFT JOIN org_unit a ON m.org_account_id=a.id " + + "LEFT JOIN org_unit d ON m.org_department_id=d.id " + + "LEFT JOIN org_post p ON m.org_post_id=p.id " + + "LEFT JOIN org_level l ON m.org_level_id=l.id WHERE m.id=? order by m.SORT_ID"; + @Override + public Map getMemberDataByMemberId(String memberId){ + JDBCAgent agent = new JDBCAgent(); + Map res = new HashMap<>(); + try { + StringBuilder sql = new StringBuilder(this.getMemberDataByMemberId); + List p = new ArrayList(); + p.add(memberId); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + if (list.size() != 0) { + for(int i = 0; i < list.size(); i++) { + res = (Map)list.get(i); + } + } + } catch (BusinessException var13) { + var13.printStackTrace(); + } catch (SQLException var14) { + var14.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } +// if(res.size()==0){ +// return null; +// } + return res; + } + + String getYDMemberDataByMemberId = "SELECT f.id,f.field0192 NAME,f.field0070 CODE,f.field0016 phone,'营销门户' account_name,d.NAME department_name,p.NAME post_name,l.NAME level_name,'' login_name,f.field0013 member_no,ht.NAME htzt_name,yg.NAME ygzt_name,'' bazaar_account,'' bazaar_department,f.id record_id " + + "FROM formmain_0210 f LEFT JOIN org_unit d ON f.field0190=d.id " + + "LEFT JOIN org_post p ON f.field0195=p.id " + + "LEFT JOIN org_level l ON f.field0097=l.id " + + "LEFT JOIN org_unit ht ON f.field0187=ht.id " + + "LEFT JOIN org_unit yg ON f.field0188=yg.id WHERE f.id=?"; + @Override + public Map getYDMemberDataByMemberId(String memberId){ + JDBCAgent agent = new JDBCAgent(); + Map res = new HashMap<>(); + try { + StringBuilder sql = new StringBuilder(this.getYDMemberDataByMemberId); + List p = new ArrayList(); + p.add(memberId); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + if (list.size() != 0) { + for(int i = 0; i < list.size(); i++) { + res = (Map)list.get(i); + } + } + } catch (BusinessException var13) { + var13.printStackTrace(); + } catch (SQLException var14) { + var14.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } +// if(res.size()==0){ +// return null; +// } + return res; + } + + String getKHMemberDataByMemberId = "SELECT m.id,m.NAME,m.CODE,m.ext_attr_1 phone,a.NAME account_name,d.NAME department_name,ba.NAME bazaar_account,bd.NAME bazaar_department,p.NAME post_name,l.NAME level_name,pr.login_name,f.field0013 member_no,ht.NAME htzt_name,yg.NAME ygzt_name,f.id record_id " + + "FROM org_member m LEFT JOIN org_principal pr ON m.id=pr.member_id " + + "LEFT JOIN formmain_0210 f ON m.id=f.field0007 " + + "LEFT JOIN org_unit ht ON f.field0187=ht.id " + + "LEFT JOIN org_unit yg ON f.field0188=yg.id " + + "LEFT JOIN org_unit ba ON m.org_account_id=ba.id " + + "LEFT JOIN org_unit bd ON m.org_department_id=bd.id " + + "LEFT JOIN org_post p ON m.org_post_id=p.id " + + "LEFT JOIN org_level l ON m.org_level_id=l.id " + + "LEFT JOIN org_unit d ON f.field0190=d.id " + + "LEFT JOIN org_unit a ON d.org_account_id=a.id WHERE m.id=? order by m.SORT_ID"; + @Override + public Map getKHMemberDataByMemberId(String memberId){ + JDBCAgent agent = new JDBCAgent(); + Map res = new HashMap<>(); + try { + StringBuilder sql = new StringBuilder(this.getKHMemberDataByMemberId); + List p = new ArrayList(); + p.add(memberId); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + if (list.size() != 0) { + for(int i = 0; i < list.size(); i++) { + res = (Map)list.get(i); + } + } + } catch (BusinessException var13) { + var13.printStackTrace(); + } catch (SQLException var14) { + var14.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } +// if(res.size()==0){ +// return null; +// } + return res; + } + + private String getYDMemberAll = "select f.id,f.field0192 name,f.field0016 code,'1' is_enable,d.org_account_id,f.field0195 org_post_id,f.field0190 org_department_id,'yd' as type from formmain_0210 f left join org_unit d on f.field0190 = d.id where field0066 = -7849337715231929638 and field0111 = -5762677149653253400 and field0047 in (-8568095563672566586,-3249508753302796027,-2492846603920586137)"; + @Override + public List> getYDMemberAll(){ + JDBCAgent agent = new JDBCAgent(); + List> res = new ArrayList<>(); + try { + StringBuilder sql = new StringBuilder(this.getYDMemberAll); + List p = new ArrayList(); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + if (list.size() != 0) { + for(int i = 0; i < list.size(); i++) { + Map map = (Map)list.get(i); + res.add(map); + } + } + } catch (BusinessException var13) { + var13.printStackTrace(); + } catch (SQLException var14) { + var14.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } +// if(res.size()==0){ +// return null; +// } + return res; + } + + private String getKHMemberAll = "select m.id,m.name,m.code,m.is_enable,fd.org_account_id,m.org_post_id,fd.id org_department_id ,'kh' as type from org_member m left join org_unit a on m.org_account_id = a.id left join formmain_0210 f on m.id = f.field0007 left join org_unit fd on fd.id = f.field0190 where a.path like '00000017%' and m.IS_ENABLE = 1 and f.field0190 is not null order by m.SORT_ID"; + @Override + public List> getKHMemberAll(){ + JDBCAgent agent = new JDBCAgent(); + List> res = new ArrayList<>(); + try { + StringBuilder sql = new StringBuilder(this.getKHMemberAll); + List p = new ArrayList(); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + if (list.size() != 0) { + for(int i = 0; i < list.size(); i++) { + Map map = (Map)list.get(i); + res.add(map); + } + } + } catch (BusinessException var13) { + var13.printStackTrace(); + } catch (SQLException var14) { + var14.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } +// if(res.size()==0){ +// return null; +// } + return res; + } + + private String getYDMemberByDepartment = "select f.id,f.field0192 name,f.field0016 code,'1' is_enable,d.org_account_id,f.field0195 org_post_id,f.field0190 org_department_id ,'yd'as type from formmain_0210 f left join org_unit d on f.field0190 = d.id where field0066 = -7849337715231929638 and field0111 = -5762677149653253400 and field0047 in (-8568095563672566586,-3249508753302796027,-2492846603920586137) and f.field0190 = ?"; + @Override + public List> getYDMemberByDepartment(String departmentId){ + JDBCAgent agent = new JDBCAgent(); + List> res = new ArrayList<>(); + try { + StringBuilder sql = new StringBuilder(this.getYDMemberByDepartment); + List p = new ArrayList(); + p.add(departmentId); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + if (list.size() != 0) { + for(int i = 0; i < list.size(); i++) { + Map map = (Map)list.get(i); + res.add(map); + } + } + } catch (BusinessException var13) { + var13.printStackTrace(); + } catch (SQLException var14) { + var14.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } +// if(res.size()==0){ +// return null; +// } + return res; + } + + private String getKHMemberByDepartment = "select m.id,m.name,m.code,m.is_enable,fd.org_account_id,m.org_post_id,fd.id org_department_id,'kh' as type from org_member m left join org_unit a on m.org_account_id = a.id left join formmain_0210 f on m.id = f.field0007 left join org_unit fd on fd.id = f.field0190 where a.path like '00000017%' and m.IS_ENABLE = 1 and f.field0190 is not null and fd.id = ? order by m.SORT_ID"; + @Override + public List> getKHMemberByDepartment(String departmentId){ + JDBCAgent agent = new JDBCAgent(); + List> res = new ArrayList<>(); + try { + StringBuilder sql = new StringBuilder(this.getKHMemberByDepartment); + List p = new ArrayList(); + p.add(departmentId); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + if (list.size() != 0) { + for(int i = 0; i < list.size(); i++) { + Map map = (Map)list.get(i); + res.add(map); + } + } + } catch (BusinessException var13) { + var13.printStackTrace(); + } catch (SQLException var14) { + var14.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } +// if(res.size()==0){ +// return null; +// } + return res; + } + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/impl/SrcPostDaoImpl.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/impl/SrcPostDaoImpl.java new file mode 100644 index 0000000..96b3678 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/impl/SrcPostDaoImpl.java @@ -0,0 +1,43 @@ +package com.seeyon.apps.src_mainorganization.dao.impl; + + +import com.seeyon.apps.src_mainorganization.dao.ISrcPostDao; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.util.JDBCAgent; + +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class SrcPostDaoImpl implements ISrcPostDao { + + private String getPostIdByAccountPost = "select source_id from org_relationship where TYPE = 'Banchmark_Post' and objective0_id = (select objective0_id from org_relationship where TYPE = 'Banchmark_Post' and source_id = ?) and org_account_id = ?"; + + @Override + public String getPostIdByAccountPost(long oldPostId, long orgAccountId) { + JDBCAgent agent = new JDBCAgent(); + String postId = ""; + try { + StringBuilder sql = new StringBuilder(getPostIdByAccountPost); + List p = new ArrayList(); + p.add(oldPostId); + p.add(orgAccountId); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + if (list.size() != 0) { + Map map = list.get(0); + postId = map.get("source_id").toString(); + } + } catch (BusinessException var13) { + var13.printStackTrace(); + } catch (SQLException var14) { + var14.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return postId; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/impl/SyncDdDaoImpl.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/impl/SyncDdDaoImpl.java new file mode 100644 index 0000000..00bcdff --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/impl/SyncDdDaoImpl.java @@ -0,0 +1,463 @@ +package com.seeyon.apps.src_mainorganization.dao.impl; + +import com.seeyon.apps.src_mainorganization.dao.ISyncDdDao; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.util.JDBCAgent; + +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class SyncDdDaoImpl implements ISyncDdDao { + + private String getAccountBinding = "select org_account_id,org_account_name,dd_account_id,dd_account_name from src_dingding_unit where org_account_id = ?"; + private String saveAccountBinding = "INSERT INTO src_dingding_unit (org_account_id, org_account_name, dd_account_id, dd_account_name) VALUES (?, ?, ?, ?)"; + private String updateAccountBinding = "update src_dingding_unit set dd_account_id = ? , dd_account_name = ? where org_account_id = ?"; + private String getDepartmentBinding = "select org_department_id,org_department_name,dd_department_id,dd_department_name from src_dingding_dept where org_department_id = ?"; + private String saveDepartmentBinding = "INSERT INTO src_dingding_dept (org_department_id, org_department_name, dd_department_id, dd_department_name) VALUES (?, ?, ?, ?)"; + private String updateDepartmentBinding = "update src_dingding_dept set dd_department_id = ? , dd_department_name = ? where org_department_id = ?"; + private String deleteDepartmentBinding = "delete from src_dingding_dept where org_department_id = ?"; + private String getMemberBinding = "select org_member_id,org_member_name,dd_member_id,dd_member_name,dd_member_telnumber from src_dingding_member where org_member_id = ? "; + private String saveMemberBinding = "INSERT INTO src_dingding_member (org_member_id, org_member_name, dd_member_id, dd_member_name,dd_member_telnumber) VALUES (?, ?, ?, ?, ?)"; + private String updateMemberBinding = "update src_dingding_member set dd_member_id = ? , dd_member_name = ? ,dd_member_telnumber = ? where org_member_id = ? and dd_member_telnumber = ?"; + private String deleteMemberBinding = "delete from src_dingding_member where org_member_id = ?"; + private String getMaxSynchronizationDate = "select max(create_date) as max_create_date from cst_quartz_log where PARENTID = (select id from CST_QUARTZ where bean_id = 'organizationQuartz') and message not like '%任务执行异常%' and message not like '%上次的任务还在运行中%'"; + +// select org_account_id,org_account_name,dd_account_id,dd_account_name from src_dingding_unit where org_account_id = ? + @Override + public Map getAccountBinding(String orgAccountId) { + JDBCAgent agent = new JDBCAgent(); + Map res = new HashMap<>(); + try { + StringBuilder sql = new StringBuilder(getAccountBinding); + List p = new ArrayList(); + p.add(orgAccountId); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + if(list.size()>0){ + res = list.get(0); + } + } catch (BusinessException var13) { + var13.printStackTrace(); + } catch (SQLException var14) { + var14.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return res; + } + +// INSERT INTO src_dingding_unit (org_account_id, org_account_name, dd_account_id, dd_account_name) VALUES (?, ?, ?, ?) + @Override + public int saveAccountBinding(String accountId, String accountName, String ddAccountId, String ddAccountName) { + int i = 0 ; + JDBCAgent agent = new JDBCAgent(); + try { + StringBuilder sql = new StringBuilder(saveAccountBinding); + List p = new ArrayList(); + p.add(accountId); + p.add(accountName); + p.add(ddAccountId); + p.add(ddAccountName); + i=agent.execute(sql.toString(), p); + } catch (BusinessException e) { + e.printStackTrace(); + } catch (SQLException e) { + e.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return i; + } + +// update src_dingding_unit set dd_account_id = ? , dd_account_name = ? where org_account_id = ? + @Override + public int updateAccountBinding(String accountId, String accountName, String ddAccountId, String ddAccountName) { + int i = 0 ; + JDBCAgent agent = new JDBCAgent(); + try { + StringBuilder sql = new StringBuilder(updateAccountBinding); + List p = new ArrayList(); + p.add(ddAccountId); + p.add(ddAccountName); + p.add(accountId); + i=agent.execute(sql.toString(), p); + } catch (BusinessException e) { + e.printStackTrace(); + } catch (SQLException e) { + e.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return i; + } + +// select org_department_id,org_department_name,dd_department_id,dd_department_name from src_dingding_dept where org_department_id = ? + @Override + public Map getDepartmentBinding(String orgDepartmentId) { + JDBCAgent agent = new JDBCAgent(); + Map res = new HashMap<>(); + try { + StringBuilder sql = new StringBuilder(getDepartmentBinding); + List p = new ArrayList(); + p.add(orgDepartmentId); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + if(list.size()>0){ + res = list.get(0); + } + } catch (BusinessException var13) { + var13.printStackTrace(); + } catch (SQLException var14) { + var14.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return res; + } + +// INSERT INTO src_dingding_dept (org_department_id, org_department_name, dd_department_id, dd_department_name) VALUES (?, ?, ?, ?) + @Override + public int saveDepartmentBinding(String departmentId, String departmentName, String ddDepartmentId, String ddDepartmentName) { + int i = 0 ; + JDBCAgent agent = new JDBCAgent(); + try { + StringBuilder sql = new StringBuilder(saveDepartmentBinding); + List p = new ArrayList(); + p.add(departmentId); + p.add(departmentName); + p.add(ddDepartmentId); + p.add(ddDepartmentName); + i=agent.execute(sql.toString(), p); + } catch (BusinessException e) { + e.printStackTrace(); + } catch (SQLException e) { + e.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return i; + } + + // update src_dingding_dept set dd_department_id = ? , dd_department_name = ? where org_department_id = ? + @Override + public int updateDepartmentBinding(String departmentId, String departmentName, String ddDepartmentId, String ddDepartmentName) { + int i = 0 ; + JDBCAgent agent = new JDBCAgent(); + try { + StringBuilder sql = new StringBuilder(updateDepartmentBinding); + List p = new ArrayList(); + p.add(ddDepartmentId); + p.add(ddDepartmentName); + p.add(departmentId); + i=agent.execute(sql.toString(), p); + } catch (BusinessException e) { + e.printStackTrace(); + } catch (SQLException e) { + e.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return i; + } + +// delete from src_dingding_dept where org_department_id = ? + @Override + public int deleteDepartmentBinding(String departmentId){ + int i = 0 ; + JDBCAgent agent = new JDBCAgent(); + try { + StringBuilder sql = new StringBuilder(deleteDepartmentBinding); + List p = new ArrayList(); + p.add(departmentId); + i=agent.execute(sql.toString(), p); + } catch (BusinessException e) { + e.printStackTrace(); + } catch (SQLException e) { + e.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return i; + } + +// select org_member_id,org_member_name,dd_member_id,dd_member_name,dd_member_telnumber from src_dingding_member where org_member_id = ? + @Override + public Map getMemberBinding(String orgMemberId ) { + JDBCAgent agent = new JDBCAgent(); + Map res = new HashMap<>(); + try { + StringBuilder sql = new StringBuilder(getMemberBinding); + List p = new ArrayList(); + p.add(orgMemberId); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + if(list.size()>0){ + res = list.get(0); + } + } catch (BusinessException var13) { + var13.printStackTrace(); + } catch (SQLException var14) { + var14.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return res; + } + +// INSERT INTO src_dingding_member (org_member_id, org_member_name, dd_member_id, dd_member_name, dd_member_telnumber) VALUES (?, ?, ?, ?,?) + @Override + public int saveMemberBinding(String memberId, String membertName, String ddMemberId, String ddMemberName,String telnumber) { + int i = 0 ; + JDBCAgent agent = new JDBCAgent(); + try { + StringBuilder sql = new StringBuilder(saveMemberBinding); + List p = new ArrayList(); + p.add(memberId); + p.add(membertName); + p.add(ddMemberId); + p.add(ddMemberName); + p.add(telnumber); + i=agent.execute(sql.toString(), p); + } catch (BusinessException e) { + e.printStackTrace(); + } catch (SQLException e) { + e.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return i; + } + +// update src_dingding_member set dd_member_id = ? , dd_member_name = ? ,dd_member_telnumber where org_member_id = ? + @Override + public int updateMemberBinding(String memberId, String memberName, String ddMemberId, String ddMemberName ,String telnumber) { + int i = 0 ; + JDBCAgent agent = new JDBCAgent(); + try { + StringBuilder sql = new StringBuilder(updateMemberBinding); + List p = new ArrayList(); + p.add(ddMemberId); + p.add(ddMemberName); + p.add(telnumber); + p.add(memberId); + p.add(telnumber); + i=agent.execute(sql.toString(), p); + } catch (BusinessException e) { + e.printStackTrace(); + } catch (SQLException e) { + e.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return i; + } + +// delete from src_dingding_member where org_member_id = ? + @Override + public int deleteMemberBinding(String memberId){ + int i = 0 ; + JDBCAgent agent = new JDBCAgent(); + try { + StringBuilder sql = new StringBuilder(deleteMemberBinding); + List p = new ArrayList(); + p.add(memberId); + i=agent.execute(sql.toString(), p); + } catch (BusinessException e) { + e.printStackTrace(); + } catch (SQLException e) { + e.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return i; + } + +// "select max(create_date) as max_create_date from cst_quartz_log where PARENTID = (select id from CST_QUARTZ where bean_id = 'organizationQuartz') and message not like '%任务执行异常%' and message not like '%上次的任务还在运行中%'" + public Map getMaxSynchronizationDate (){ + JDBCAgent agent = new JDBCAgent(); + Map res = new HashMap<>(); + try { + StringBuilder sql = new StringBuilder(getMaxSynchronizationDate); + List p = new ArrayList(); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + if(list.size()>0){ + res = list.get(0); + } + } catch (BusinessException var13) { + var13.printStackTrace(); + } catch (SQLException var14) { + var14.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return res; + } + + + + + + + + + private String getAccountsBinding = "select org_account_id,org_account_name,dd_account_id,dd_account_name from src_dingding_unit "; + @Override + public List getAccountsBinding(){ + JDBCAgent agent = new JDBCAgent(); + List res = new ArrayList<>(); + try { + StringBuilder sql = new StringBuilder(getAccountsBinding); + List p = new ArrayList(); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + for(int i = 0 ; i < list.size(); i++){ + res.add(Long.parseLong(list.get(i).get("dd_account_id").toString())); + } + } catch (BusinessException var13) { + var13.printStackTrace(); + } catch (SQLException var14) { + var14.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return res; + } + + private String getDepartmentsBinding = "select org_department_id,org_department_name,dd_department_id,dd_department_name from src_dingding_dept "; + @Override + public List getDepartmentsBinding(){ + JDBCAgent agent = new JDBCAgent(); + List res = new ArrayList<>(); + try { + StringBuilder sql = new StringBuilder(getDepartmentsBinding); + List p = new ArrayList(); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + for(int i = 0 ; i < list.size(); i++){ + res.add(Long.parseLong(list.get(i).get("dd_department_id").toString())); + } + } catch (BusinessException var13) { + var13.printStackTrace(); + } catch (SQLException var14) { + var14.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return res; + } + + private String getMemberByMobile = "select id from org_member where ext_attr_1 = ? and IS_ENABLE = 1"; + @Override + public List getMemberByMobile(String mobile){ + JDBCAgent agent = new JDBCAgent(); + List res = new ArrayList<>(); + try { + StringBuilder sql = new StringBuilder(getMemberByMobile); + List p = new ArrayList(); + p.add(mobile); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + for(int i = 0 ; i < list.size(); i++){ + res.add(Long.parseLong(list.get(i).get("id").toString())); + } + } catch (BusinessException var13) { + var13.printStackTrace(); + } catch (SQLException var14) { + var14.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return res; + } + + + + + private String getAccountBindingByDdAccount = "select org_account_id,org_account_name,dd_account_id,dd_account_name from src_dingding_unit where dd_account_id = ?"; + @Override + public Map getAccountBindingByDdAccount(String ddAccountId){ + JDBCAgent agent = new JDBCAgent(); + Map res = new HashMap<>(); + try { + StringBuilder sql = new StringBuilder(getAccountBindingByDdAccount); + List p = new ArrayList(); + p.add(ddAccountId); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + if(list.size()>0){ + res = list.get(0); + } + } catch (BusinessException var13) { + var13.printStackTrace(); + } catch (SQLException var14) { + var14.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return res; + } + + private String getDepartmentBindingByDdDepartment = "select org_department_id,org_department_name,dd_department_id,dd_department_name from src_dingding_dept where dd_department_id = ?"; + @Override + public Map getDepartmentBindingByDdDepartment(String ddDepartmentId){ + JDBCAgent agent = new JDBCAgent(); + Map res = new HashMap<>(); + try { + StringBuilder sql = new StringBuilder(getDepartmentBindingByDdDepartment); + List p = new ArrayList(); + p.add(ddDepartmentId); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + if(list.size()>0){ + res = list.get(0); + } + } catch (BusinessException var13) { + var13.printStackTrace(); + } catch (SQLException var14) { + var14.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return res; + } + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/impl/SyncFvDaoImpl.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/impl/SyncFvDaoImpl.java new file mode 100644 index 0000000..9adff8d --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/impl/SyncFvDaoImpl.java @@ -0,0 +1,672 @@ +package com.seeyon.apps.src_mainorganization.dao.impl; + +import com.seeyon.apps.src_mainorganization.bo.ThirdDeptBo; +import com.seeyon.apps.src_mainorganization.bo.ThirdMemberBo; +import com.seeyon.apps.src_mainorganization.dao.ISyncFvDao; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.organization.bo.V3xOrgPost; +import com.seeyon.ctp.util.JDBCAgent; +import www.seeyon.com.utils.StringUtil; + +import java.sql.SQLException; +import java.text.SimpleDateFormat; +import java.util.*; + +public class SyncFvDaoImpl implements ISyncFvDao { + + private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + + private String queryUnitById = "select * from src_sync_fvunit where id = ?"; + private String queryDeptById = "select * from src_sync_fvdept where id = ?"; + private String queryMemberHelpByMemberId = "select * from src_sync_fvmember where id = ?"; + private String queryPostById = "select * from src_sync_fvpost where id = ?"; + private String queryBanchmarkPostIdByPostId = "select objective0_id from org_relationship where TYPE = 'Banchmark_Post' and source_id = ?"; + +// 测试环境 +// private String queryMemberArchiveByMemberId = "select field0016 as phone,field0068 as member_account_id,field0069 as member_dept_id,field0030 as member_post_id,field0070 as member_code,field0007 as member_name,field0110 as member_sex_id from formmain_0199 where field0007 = ?"; + +// 正式环境 + private String queryMemberArchiveByMemberId = "select field0016 as phone,field0068 as member_account_id,field0069 as member_dept_id,field0030 as member_post_id,field0070 as member_code,field0007 as member_name,field0110 as member_sex_id from formmain_0210 where field0007 = ?"; + private String isMemberTypeById = "select field0007 as member_id,field0066 as member_type from formmain_0210 where field0007 = ?"; + + + + @Override + public boolean queryUnitById(String unitId) { + JDBCAgent agent = new JDBCAgent(); + boolean bool = false; + try { + StringBuilder sql = new StringBuilder(queryUnitById); + List p = new ArrayList(); + p.add(unitId); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + if (list.size() != 0) { + bool = true; + } + } catch (BusinessException var13) { + var13.printStackTrace(); + } catch (SQLException var14) { + var14.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return bool; + } + + + @Override + public int addUnit(ThirdDeptBo thirdDept) { + int i = 0 ; + JDBCAgent agent = new JDBCAgent(); + try { + StringBuilder insertsql = new StringBuilder("INSERT INTO src_sync_fvunit "); + StringBuilder valuesql = new StringBuilder("value "); + insertsql.append("("); + valuesql.append("("); + if(thirdDept.getId() != -1){ + insertsql.append("id,org_account_id,outkey,"); + valuesql.append("'"+thirdDept.getId()+"','"+thirdDept.getOrgAccountId()+"','"+thirdDept.getId()+"',"); + } + if(StringUtil.isNotEmpty(thirdDept.getName())){ + insertsql.append("account_name,"); + valuesql.append("'"+thirdDept.getName()+"',"); + } + if(StringUtil.isNotEmpty(thirdDept.getCode())){ + insertsql.append("account_code,"); + valuesql.append("'"+thirdDept.getCode()+"',"); + } + if(StringUtil.isNotEmpty(thirdDept.getSortId())){ + insertsql.append("sortid,"); + valuesql.append("'"+thirdDept.getSortId()+"',"); + } + if(StringUtil.isNotEmpty(thirdDept.getShortName())){ + insertsql.append("shortname,"); + valuesql.append("'"+thirdDept.getShortName()+"',"); + } + if(StringUtil.isNotEmpty(thirdDept.getSuperior()+"")){ + insertsql.append("super_account_id,"); + valuesql.append("'"+thirdDept.getSuperior()+"',"); + } + if(!thirdDept.getEnabled()){ + insertsql.append("account_state,"); + valuesql.append("'0',"); + }else{ + if(thirdDept.getIsDeleted()){ + insertsql.append("account_state,"); + valuesql.append("'0',"); + }else{ + insertsql.append("account_state,"); + valuesql.append("'1',"); + } + } + insertsql.append("update_time,"); + valuesql.append("'"+sdf.format(new Date())+"',"); + insertsql = new StringBuilder(insertsql.substring(0, insertsql.length() - 1)).append(")"); + valuesql = new StringBuilder(valuesql.substring(0,valuesql.length()-1)).append(")"); + + i=agent.execute(insertsql.toString()+valuesql.toString()); + } catch (BusinessException e) { + e.printStackTrace(); + } catch (SQLException e) { + e.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return i; + } + + @Override + public int updateUnit(ThirdDeptBo thirdDept) { + int i = 0 ; + JDBCAgent agent = new JDBCAgent(); + try { + StringBuilder insertsql = new StringBuilder("update src_sync_fvunit set "); + if(StringUtil.isNotEmpty(thirdDept.getName())){ + //单位名称 + insertsql.append("account_name = '").append(thirdDept.getName()).append("',"); + } + if(StringUtil.isNotEmpty(thirdDept.getCode())){ + //单位编码 + insertsql.append("account_code = '").append(thirdDept.getCode()).append("',"); + } + if(StringUtil.isNotEmpty(thirdDept.getSortId())){ + //序号 + insertsql.append("sortid = '").append(thirdDept.getSortId()).append("',"); + } + if(StringUtil.isNotEmpty(thirdDept.getShortName())){ + //单位简称 + insertsql.append("shortname = '").append(thirdDept.getShortName()).append("',"); + } + if(StringUtil.isNotEmpty(thirdDept.getSuperior()+"")){ + //上级单位ID + insertsql.append("super_account_id = '").append(thirdDept.getSuperior()).append("',"); + } + if(!thirdDept.getEnabled()){ + insertsql.append("account_state = '0',"); + }else{ + if(thirdDept.getIsDeleted()){ + insertsql.append("account_state = '0',"); + }else{ + insertsql.append("account_state = '1',"); + } + } + insertsql.append("update_time = ").append("'"+sdf.format(new Date())+"'").append(","); + insertsql = new StringBuilder(insertsql.substring(0, insertsql.length() - 1)) + .append(" where id = ").append(thirdDept.getId()); + + i=agent.execute(insertsql.toString()); + } catch (BusinessException e) { + e.printStackTrace(); + } catch (SQLException e) { + e.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return i; + } + + + @Override + public boolean queryDeptById(String deptId) { + JDBCAgent agent = new JDBCAgent(); + boolean bool = false; + try { + StringBuilder sql = new StringBuilder(queryDeptById); + List p = new ArrayList(); + p.add(deptId); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + if (list.size() != 0) { + bool = true; + } + } catch (BusinessException var13) { + var13.printStackTrace(); + } catch (SQLException var14) { + var14.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return bool; + } + + @Override + public int addDept(ThirdDeptBo thirdDept) { + int i = 0 ; + JDBCAgent agent = new JDBCAgent(); + try { + StringBuilder insertsql = new StringBuilder("INSERT INTO src_sync_fvdept "); + StringBuilder valuesql = new StringBuilder("value "); + insertsql.append("("); + valuesql.append("("); + if(thirdDept.getId() != -1){ +// 部门ID + insertsql.append("id,outkey,"); + valuesql.append("'"+thirdDept.getId()+"','"+thirdDept.getId()+"',"); + } + if(thirdDept.getOrgAccountId() != -1){ +// 所属单位ID + insertsql.append("org_account_id,"); + valuesql.append("'"+thirdDept.getOrgAccountId()+"',"); + } + if(StringUtil.isNotEmpty(thirdDept.getName())){ +// 部门名称 + insertsql.append("dept_name,"); + valuesql.append("'"+thirdDept.getName()+"',"); + } + if(StringUtil.isNotEmpty(thirdDept.getCode())){ +// 部门编码 + insertsql.append("dept_code,"); + valuesql.append("'"+thirdDept.getCode()+"',"); + } + if(StringUtil.isNotEmpty(thirdDept.getSortId())){ +// 排序号 + insertsql.append("sortid,"); + valuesql.append("'"+thirdDept.getSortId()+"',"); + } + if(StringUtil.isNotEmpty(thirdDept.getShortName())){ +// 部门简称 + insertsql.append("shortname,"); + valuesql.append("'"+thirdDept.getShortName()+"',"); + } + if(thirdDept.getSuperior() != -1){ +// 上级部门ID + insertsql.append("super_dept_id,"); + valuesql.append("'"+thirdDept.getSuperior()+"',"); + } + if(!thirdDept.getEnabled()){ + insertsql.append("dept_state,"); + valuesql.append("'1',"); + }else{ + if(thirdDept.getIsDeleted()){ + insertsql.append("dept_state,"); + valuesql.append("'1',"); + }else{ + insertsql.append("dept_state,"); + valuesql.append("'0',"); + } + } + insertsql.append("update_time,"); + valuesql.append("'"+sdf.format(new Date())+"',"); + insertsql = new StringBuilder(insertsql.substring(0, insertsql.length() - 1)).append(")"); + valuesql = new StringBuilder(valuesql.substring(0,valuesql.length()-1)).append(")"); + + i=agent.execute(insertsql.toString()+valuesql.toString()); + } catch (BusinessException e) { + e.printStackTrace(); + } catch (SQLException e) { + e.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return i; + } + + @Override + public int updateDept(ThirdDeptBo thirdDept) { + int i = 0 ; + JDBCAgent agent = new JDBCAgent(); + try { + StringBuilder insertsql = new StringBuilder("update src_sync_fvdept set "); + if(thirdDept.getOrgAccountId() != -1){ + insertsql.append("org_account_id = '").append(thirdDept.getOrgAccountId()).append("',"); + } + if(StringUtil.isNotEmpty(thirdDept.getName())){ + insertsql.append("dept_name = '").append(thirdDept.getName()).append("',"); + } + if(StringUtil.isNotEmpty(thirdDept.getCode())){ + insertsql.append("dept_code = '").append(thirdDept.getCode()).append("',"); + } + if(StringUtil.isNotEmpty(thirdDept.getSortId())){ + insertsql.append("sortid = '").append(thirdDept.getSortId()).append("',"); + } + if(StringUtil.isNotEmpty(thirdDept.getShortName())){ + insertsql.append("shortname = '").append(thirdDept.getShortName()).append("',"); + } + if(thirdDept.getSuperior() != -1){ + insertsql.append("super_dept_id = '").append(thirdDept.getSuperior()).append("',"); + } + if(!thirdDept.getEnabled()){ + insertsql.append("dept_state = '1',"); + }else{ + if(thirdDept.getIsDeleted()){ + insertsql.append("dept_state = '1',"); + }else{ + insertsql.append("dept_state = '0',"); + } + } + insertsql.append("update_time = ").append("'"+sdf.format(new Date())+"'").append(","); + insertsql = new StringBuilder(insertsql.substring(0, insertsql.length() - 1)) + .append(" where id = '").append(thirdDept.getId()+"'"); + + i=agent.execute(insertsql.toString()); + } catch (BusinessException e) { + e.printStackTrace(); + } catch (SQLException e) { + e.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return i; + } + + @Override + public Map queryMemberArchiveByMemberId(String memberId) { + JDBCAgent agent = new JDBCAgent(); + Map res = new HashMap<>(); + try { + StringBuilder sql = new StringBuilder(queryMemberArchiveByMemberId); + List p = new ArrayList(); + p.add(memberId); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + if (list.size() != 0) { + res = list.get(0); + } + } catch (BusinessException var13) { + var13.printStackTrace(); + } catch (SQLException var14) { + var14.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return res; + } + + + @Override + public Map queryMemberHelpByMemberId(String memberId) { + JDBCAgent agent = new JDBCAgent(); + Map res = new HashMap<>(); + try { + StringBuilder sql = new StringBuilder(queryMemberHelpByMemberId); + List p = new ArrayList(); + p.add(memberId); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + if (list.size() != 0) { + res = list.get(0); + } + } catch (BusinessException var13) { + var13.printStackTrace(); + } catch (SQLException var14) { + var14.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return res; + } + + @Override + public int updateMember(ThirdMemberBo thirdMember,Map memeberMap) { + int i = 0 ; + JDBCAgent agent = new JDBCAgent(); + try { + StringBuilder insertsql = new StringBuilder("update src_sync_fvmember set "); + if(thirdMember.getOrgAccountId() != -1){ + insertsql.append("org_account_id = ").append(thirdMember.getOrgAccountId()).append(","); + } + if(StringUtil.isNotEmpty(thirdMember.getName())){ + insertsql.append("member_name = '").append(thirdMember.getName()).append("',"); + } + if(StringUtil.isNotEmpty(thirdMember.getCode())){ + insertsql.append("member_code = '").append(thirdMember.getCode()).append("',"); + } + if(StringUtil.isNotEmpty(thirdMember.getLoginName())){ + insertsql.append("login_name = '").append(thirdMember.getLoginName()).append("',"); + } + if(StringUtil.isNotEmpty(thirdMember.getOrgAccountId()+"")){ + insertsql.append("org_account_id = '").append(thirdMember.getOrgAccountId()).append("',"); + } + if(StringUtil.isNotEmpty(thirdMember.getDeptId()+"")){ + insertsql.append("org_dept_id = '").append(thirdMember.getDeptId()).append("',"); + } + if(StringUtil.isNotEmpty(thirdMember.getPostId()+"")){ + insertsql.append("org_post_id = '").append(thirdMember.getPostId()).append("',"); + } + if(StringUtil.isNotEmpty(memeberMap.get("phone")+"")){ + insertsql.append("phone = '").append(memeberMap.get("phone")).append("',"); + } + if(StringUtil.isNotEmpty(thirdMember.getSecurityLevel()+"")){ + insertsql.append("security_level = '").append(thirdMember.getSecurityLevel()).append("',"); + } + if(StringUtil.isNotEmpty(thirdMember.getState()+"")){ + insertsql.append("state = '").append(thirdMember.getState()).append("',"); + } + + insertsql.append("update_time = ").append("'"+sdf.format(new Date())+"'").append(","); + insertsql.append("office_location = ").append("'default'").append(","); + insertsql = new StringBuilder(insertsql.substring(0, insertsql.length() - 1)) + .append(" where id = ").append(thirdMember.getId()); + + i=agent.execute(insertsql.toString()); + } catch (BusinessException e) { + e.printStackTrace(); + } catch (SQLException e) { + e.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return i; + } + + + @Override + public int addMember(ThirdMemberBo thirdMember ,Map memeberMap) { + int i = 0 ; + JDBCAgent agent = new JDBCAgent(); + try { + StringBuilder insertsql = new StringBuilder("INSERT INTO src_sync_fvmember "); + StringBuilder valuesql = new StringBuilder("value "); + insertsql.append("("); + valuesql.append("("); + if(thirdMember.getId() != -1){ +// 部门ID + insertsql.append("id,outkey,"); + valuesql.append("'"+thirdMember.getId()+"','"+thirdMember.getId()+"',"); + } + if(thirdMember.getOrgAccountId() != -1){ +// 所属单位ID + insertsql.append("org_account_id,"); + valuesql.append("'"+thirdMember.getOrgAccountId()+"',"); + } + if(StringUtil.isNotEmpty(thirdMember.getName())){ +// 人员名称 + insertsql.append("member_name,"); + valuesql.append("'"+thirdMember.getName()+"',"); + } + if(StringUtil.isNotEmpty(thirdMember.getCode())){ +// 人员编码 + insertsql.append("member_code,"); + valuesql.append("'"+thirdMember.getCode()+"',"); + } + if(StringUtil.isNotEmpty(thirdMember.getLoginName())){ +// 登录名 + insertsql.append("login_name,"); + valuesql.append("'"+thirdMember.getLoginName()+"',"); + } + + if(StringUtil.isNotEmpty(thirdMember.getDeptId()+"")){ +// 部门编码 + insertsql.append("org_dept_id,"); + valuesql.append("'"+thirdMember.getDeptId()+"',"); + } + if(StringUtil.isNotEmpty(thirdMember.getPostId()+"")){ +// 岗位编码 + insertsql.append("org_post_id,"); + valuesql.append("'"+thirdMember.getPostId()+"',"); + } + if(StringUtil.isNotEmpty(memeberMap.get("phone")+"")){ +// 手机号 + insertsql.append("phone,"); + valuesql.append("'"+memeberMap.get("phone")+"',"); + } + if(StringUtil.isNotEmpty(thirdMember.getSecurityLevel()+"")){ +// 手机号 + insertsql.append("security_level,"); + valuesql.append("'"+thirdMember.getSecurityLevel()+"',"); + } + if(StringUtil.isNotEmpty(thirdMember.getState()+"")){ +// 人员状态 + insertsql.append("state,"); + valuesql.append("'"+thirdMember.getState()+"',"); + } + insertsql.append("update_time,office_location,"); + valuesql.append("'"+sdf.format(new Date())+"','default',"); + insertsql = new StringBuilder(insertsql.substring(0, insertsql.length() - 1)).append(")"); + valuesql = new StringBuilder(valuesql.substring(0,valuesql.length()-1)).append(")"); + + i=agent.execute(insertsql.toString()+valuesql.toString()); + } catch (BusinessException e) { + e.printStackTrace(); + } catch (SQLException e) { + e.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return i; + } + + @Override + public boolean queryPostById(String postId) { + JDBCAgent agent = new JDBCAgent(); + boolean bool = false; + try { + StringBuilder sql = new StringBuilder(queryPostById); + List p = new ArrayList(); + p.add(postId); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + if (list.size() != 0) { + bool = true; + } + } catch (BusinessException var13) { + var13.printStackTrace(); + } catch (SQLException var14) { + var14.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return bool; + } + + @Override + public String queryBanchmarkPostIdByPostId(String postId) { + JDBCAgent agent = new JDBCAgent(); + String banchmarkPostId = ""; + try { + StringBuilder sql = new StringBuilder(queryBanchmarkPostIdByPostId); + List p = new ArrayList(); + p.add(postId); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + if (list.size() != 0) { + Map map = list.get(0); + banchmarkPostId = map.get("objective0_id").toString(); + } + } catch (BusinessException var13) { + var13.printStackTrace(); + } catch (SQLException var14) { + var14.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return banchmarkPostId; + } + + @Override + public int updatePost(V3xOrgPost v3xOrgPost) { + int i = 0 ; + JDBCAgent agent = new JDBCAgent(); + try { + StringBuilder insertsql = new StringBuilder("update src_sync_fvpost set "); + if(v3xOrgPost.getOrgAccountId() != -1){ + insertsql.append("org_account_id = '").append(v3xOrgPost.getOrgAccountId()).append("',"); + } + if(StringUtil.isNotEmpty(v3xOrgPost.getName())){ + insertsql.append("post_name = '").append(v3xOrgPost.getName()).append("',"); + } + if(StringUtil.isNotEmpty(v3xOrgPost.getCode())){ + insertsql.append("post_code = '").append(v3xOrgPost.getCode()).append("',"); + } + if(StringUtil.isNotEmpty(v3xOrgPost.getName())){ + insertsql.append("shortname = '").append(v3xOrgPost.getName()).append("',"); + } + insertsql.append("update_time = ").append("'"+sdf.format(new Date())+"'").append(","); + insertsql = new StringBuilder(insertsql.substring(0, insertsql.length() - 1)) + .append(" where id = '").append(v3xOrgPost.getId()+"'"); + + i=agent.execute(insertsql.toString()); + } catch (BusinessException e) { + e.printStackTrace(); + } catch (SQLException e) { + e.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return i; + } + + + @Override + public int addPost(V3xOrgPost v3xOrgPost) { + int i = 0 ; + JDBCAgent agent = new JDBCAgent(); + try { + StringBuilder insertsql = new StringBuilder("INSERT INTO src_sync_fvpost "); + StringBuilder valuesql = new StringBuilder("value "); + insertsql.append("("); + valuesql.append("("); + if(v3xOrgPost.getId() != -1){ +// 部门ID + insertsql.append("id,outkey,"); + valuesql.append("'"+v3xOrgPost.getId()+"','"+v3xOrgPost.getId()+"',"); + } + if(v3xOrgPost.getOrgAccountId() != -1){ +// 所属单位ID + insertsql.append("org_account_id,"); + valuesql.append("'"+v3xOrgPost.getOrgAccountId()+"',"); + } + if(StringUtil.isNotEmpty(v3xOrgPost.getName())){ +// 部门名称 + insertsql.append("post_name,shortname,"); + valuesql.append("'"+v3xOrgPost.getName()+"','"+v3xOrgPost.getName()+"',"); + } + if(StringUtil.isNotEmpty(v3xOrgPost.getCode())){ +// 部门编码 + insertsql.append("post_code,"); + valuesql.append("'"+v3xOrgPost.getCode()+"',"); + } + insertsql.append("update_time,"); + valuesql.append("'"+sdf.format(new Date())+"',"); + insertsql = new StringBuilder(insertsql.substring(0, insertsql.length() - 1)).append(")"); + valuesql = new StringBuilder(valuesql.substring(0,valuesql.length()-1)).append(")"); + + i=agent.execute(insertsql.toString()+valuesql.toString()); + } catch (BusinessException e) { + e.printStackTrace(); + } catch (SQLException e) { + e.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return i; + } + + + public String isMemberTypeById(String memberId){ + JDBCAgent agent = new JDBCAgent(); + String memberType = ""; + try { + StringBuilder sql = new StringBuilder(isMemberTypeById); + List p = new ArrayList(); + p.add(memberId); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + if (list.size() != 0) { + Map map = list.get(0); + memberType = map.get("member_type").toString(); + } + } catch (BusinessException var13) { + var13.printStackTrace(); + } catch (SQLException var14) { + var14.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return memberType; + } + + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/impl/SyncQixuexingDaoImpl.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/impl/SyncQixuexingDaoImpl.java new file mode 100644 index 0000000..626c23b --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/dao/impl/SyncQixuexingDaoImpl.java @@ -0,0 +1,40 @@ +package com.seeyon.apps.src_mainorganization.dao.impl; + +import com.seeyon.apps.src_mainorganization.dao.ISyncQixuexingDao; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.util.JDBCAgent; + +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class SyncQixuexingDaoImpl implements ISyncQixuexingDao { + + private String getMaxSynchronizationDate = "select max(create_date) as max_create_date from cst_quartz_log where PARENTID = (select id from CST_QUARTZ where bean_id = 'organizationQuartz') and message not like '%任务执行异常%' and message not like '%上次的任务还在运行中%'"; + + @Override + public Map getMaxSynchronizationDate() { + JDBCAgent agent = new JDBCAgent(); + Map res = new HashMap<>(); + try { + StringBuilder sql = new StringBuilder(getMaxSynchronizationDate); + List p = new ArrayList(); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + if(list.size()>0){ + res = list.get(0); + } + } catch (BusinessException var13) { + var13.printStackTrace(); + } catch (SQLException var14) { + var14.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return res; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/fieldCtrl/SynchronizationRepushBtn.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/fieldCtrl/SynchronizationRepushBtn.java new file mode 100644 index 0000000..d8abccf --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/fieldCtrl/SynchronizationRepushBtn.java @@ -0,0 +1,98 @@ +package com.seeyon.apps.src_mainorganization.fieldCtrl; + +import java.util.Map; + +import com.seeyon.cap4.form.bean.FormBean; +import com.seeyon.cap4.form.bean.FormSaveAsBean; +import com.seeyon.cap4.form.bean.button.CommonBtn; +import com.seeyon.cap4.form.modules.importandexport.BusinessDataBean; +import com.seeyon.cap4.form.util.Enums; + +/** + * @author kkdo + *
重新推送
+ */ +public class SynchronizationRepushBtn extends CommonBtn { + + @Override + public void init() { + this.setPluginId("synchronizationBtn");//设置插件或者组件id,和pluginCfg.xml中的id一致 + this.setIcon("cap-icon-synchronization-button"); + } + + @Override + public boolean canUse(Enums.FormType formType) { + return true; + } + + @Override + public String getKey() { + return "8381906109546975519";//给按钮设置一个key,可以随便取 + } + + @Override + public String getNameSpace() { + return "customBtn_" + this.getKey(); + } + + @Override + public String getText() { + return "组织架构同步按钮";//设置按钮名称 + } + + /* + /** + * 获取PC端自定义控件运行态资源注入信息 + * jsUri:定义PC端表单运行态加载第三方JavaScript的路径 + * cssUri:定义PC端表单运行态加载第三方CSS的路径 + * initMethod:定义PC端表单运行态第三方js入口方法名称 + * + * @return + */ + @Override + public String getPCInjectionInfo() { + return "{\"path\":\"apps_res/cap/customCtrlResources/synchronizationBtnResources/\",\"jsUri\":\"js/synchronization.js\",\"initMethod\":\"init\",\"nameSpace\":\"" + + this.getNameSpace() + "\"}"; + } + + @Override + public String getMBInjectionInfo() { + return null; + } + + /** + * 导出的扩展接口,应用绑定自定义按钮用,有需要的重写该方法 + * + * @param formBean 当前表单 + * @param businessDataBean 导出中间对象,如果有附件,可以放到对象中的unifiedExportAttachment中 + * @param resultMap 按鈕json + */ + @Override + public void getJson4Export(FormBean formBean, String customParam, BusinessDataBean businessDataBean, + Map resultMap) { + + } + + /** + * 在业务导入完之后,应用绑定自定义按钮的处理接口 + * @param formBean + * @param customParam + * @param businessDataBean + * @param btnInfoMap + */ + @Override + public void importInfoAfterBizImport(FormBean formBean, String customParam, BusinessDataBean businessDataBean, + Map btnInfoMap) { + + } + + /** + * 表单另存为应用绑定自定义按钮另存为接口,各个应用绑定自定义按钮需要处理自己的逻辑 + * @param formSaveAsBean + * @param formBean + * @param btnInfoMap + */ + public void otherSave(FormSaveAsBean formSaveAsBean, FormBean formBean, Map btnInfoMap) { + + } +} \ No newline at end of file diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/node/TestNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/node/TestNode.java new file mode 100644 index 0000000..a56bf70 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/node/TestNode.java @@ -0,0 +1,134 @@ +package com.seeyon.apps.src_mainorganization.node; + + +import cn.hutool.log.Log; +import com.alibaba.fastjson.JSONObject; +import com.aspose.words.FieldData; +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.common.plugin.vo.ConfigVo; +import com.seeyon.apps.common.workflow.constants.WorkFlowType; +import com.seeyon.apps.common.workflow.node.ACommonSuperNode; +import com.seeyon.apps.ext.workflow.vo.FieldDataVo; +import com.seeyon.apps.ext.workflow.vo.FormDataVo; +import com.seeyon.apps.ext.workflow.vo.SuperNodeContext; +import com.seeyon.cap4.form.bean.FormDataMasterBean; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.common.filemanager.manager.AttachmentManager; +import com.seeyon.ctp.common.filemanager.manager.FileManager; +import com.seeyon.ctp.common.po.filemanager.V3XFile; +import com.seeyon.ctp.organization.bo.V3xOrgMember; +import com.seeyon.ctp.organization.manager.OrgManager; + +import javax.inject.Inject; +import java.io.File; +import java.util.List; + + +public class TestNode extends ACommonSuperNode { + + private static Log log = Log.get(TestNode.class); + + protected ICstConfigApi cstConfigApi = (ICstConfigApi) AppContext.getBean("cstConfigApi"); + + @Inject + private OrgManager orgManager; + @Inject + private AttachmentManager attachmentManager; + @Inject + private FileManager fileManager; + + @Override + public String getFormParse() { + return "json"; + } + + @Override + public WorkFlowType[] getTypes() { + return new WorkFlowType[] {WorkFlowType.superNode}; + } + + + public ConfigVo getConfig() { + return cstConfigApi.getConfig(getPluginId()); + } + +// context.setRequest(request); +// context.setUrl(url); +// context.setResponse(response); +// context.success("推送BIP成功:" + bipResponse.getMsg(), false); + +// context.setErrMsg(bipResponse.getMsg()); +// context.setException(true); +// context.back("推送BIP失败:" + bipResponse.getMsg()); + + @Override + public String getPluginId() { + return null; + } + + @Override + public SuperNodeContext proceed(String request, FormDataVo formDataVo, FormDataMasterBean formDataMasterBean) throws Exception { + SuperNodeContext context = new SuperNodeContext(); + FieldDataVo fieldDataVo = formDataVo.getFieldData("上传附件1"); + List fileUrlList = attachmentManager.getBySubReference(Long.parseLong(fieldDataVo.getStringValue())); + String fileNames = ""; + for(Long fileUrl : fileUrlList){ + try { +// File file = fileManager.getFile(fileUrl); + V3XFile file = fileManager.getV3XFile(fileUrl); + fileNames = fileNames+file.getFilename()+";"; + } catch (BusinessException e) { + e.printStackTrace(); + } + } + System.out.println(fileNames); + System.out.println(fieldDataVo.getDbValue() != null); + String dbValue = fieldDataVo.getDbValue().toString(); + System.out.println("档案表调整人员信息获取参数为:"+dbValue+fieldDataVo.getStringValue()+fieldDataVo.getDisplay()); + long memberId = Long.parseLong(dbValue); + V3xOrgMember v3xOrgMember = orgManager.getMemberById(memberId); +// 设置人员数据值 + System.out.println(v3xOrgMember.getId()); + System.out.println(); +// 获取流程表单中的对照名称 + JSONObject requestjson = JSONObject.parseObject(request); +// 根据对照名称查询对应的模板参数 +// List params = QysAffairDao.getFlowContrast(requestjson.getString("param")); + context.setNeedSave(true); +// if(params.size()!=1){ +// context.setResponse("参数设置异常,请检查请求参数是否存在且唯一"); +// context.setErrMsg("参数设置异常,请检查请求参数是否存在且唯一"); +// context.back("生成文件失败:参数设置异常,请检查请求参数是否存在且唯一"); +// return context; +// } +// 获取模板参数 +// String param = params.get(0); +// 根据模板参数生成表单参数 + FieldDataVo f = formDataVo.getFieldData(""); +// 调用模板生成文件接口 + +// 设置签署任务 + +// 设置签章位置 + +// 进行静默签署 + +// 签署完成后下载文件到表单中 + + + return context; + } + + @Override + public String getNodeId() { + return "QysTemplateSignNode"; + } + + @Override + public String getNodeName() { + return "模板文件签署超级节点"; + } + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/quartz/OrganizationQuartz.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/quartz/OrganizationQuartz.java new file mode 100644 index 0000000..841822d --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/quartz/OrganizationQuartz.java @@ -0,0 +1,96 @@ +package com.seeyon.apps.src_mainorganization.quartz; + +import cn.hutool.log.Log; +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.common.plugin.vo.ConfigVo; +import com.seeyon.apps.ext.quartz.AbstractQuartzTask; +import com.seeyon.apps.src_mainorganization.constans.SyncConstants; +import com.seeyon.apps.src_mainorganization.dao.ISyncDdDao; +import com.seeyon.apps.src_mainorganization.server.InitializeDingdingSyncServer; +import com.seeyon.apps.src_mainorganization.server.OrganizationOrgDingdingSyncServer; +import com.seeyon.ctp.common.AppContext; + +import javax.inject.Inject; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Map; + +public class OrganizationQuartz extends AbstractQuartzTask { + + private static Log log = Log.get(OrganizationQuartz.class); + + @Override + public String getName() { + return "钉钉通讯录同步定时任务"; + } + + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + @Inject + private ISyncDdDao syncDdDao; + @Inject + private OrganizationOrgDingdingSyncServer organizationOrgDingdingSyncServer; + @Inject + private InitializeDingdingSyncServer initializeDingdingSyncServer; + + protected ICstConfigApi cstConfigApi = (ICstConfigApi) AppContext.getBean("cstConfigApi"); + public String getPluginId() {return SyncConstants.getPluginId();} + public ConfigVo getOrganizationOrgConfig() {return cstConfigApi.getConfig(getPluginId());} + + @Override + public String taskRun(String s) throws Exception { + if("initialize".equals(s)){ + log.info("进行钉钉初始化操作"); + Map errorMapAccount = initializeDingdingSyncServer.initializeDingdingAccount(); + log.info("单位添加完成,部门添加开始"); + Map errorMapDepartment = initializeDingdingSyncServer.initializeDingdingDepartment(); + log.info("部门添加完成,人员添加开始"); + Map errorMapMember = initializeDingdingSyncServer.initializeDingdingMember(); + log.info("人员添加完成"); + return "初始化完成"; + } + log.info("进入钉钉通讯录同步定时任务,参数为:"+s); + ConfigVo configVo = this.cstConfigApi.getConfig(this.getPluginId()); + String res = ""; +// 查询上一次同步时间 + Map maxSynchronizationDate = syncDdDao.getMaxSynchronizationDate(); + Date startDate = (Date) maxSynchronizationDate.get("max_create_date"); +// 如果当前调用定时任务时未进行同步,则直接查询全量数据进行同步 + String isServiceBroker = configVo.getParamVal(SyncConstants.isServiceBroker.name()); + if(startDate==null){ +// 进行钉钉单位同步操作 + String errorAccountValue = organizationOrgDingdingSyncServer.dingdingSyncAllAccounts(); +// 进行钉钉部门同步操作 + String errorDepartmentValue = organizationOrgDingdingSyncServer.dingdingSyncAllDepartments(); +// 进行钉钉人员同步操作 + String errorMemberValue = organizationOrgDingdingSyncServer.dingdingSyncAllMembers(); +// 进行钉钉业代人员同步 + String errorServiceBroker = ""; + if("是".equals(isServiceBroker)||"Y".equals(isServiceBroker)||"y".equals(isServiceBroker)){ + errorServiceBroker = organizationOrgDingdingSyncServer.dingdingSyncAllServiceBrokers(); + } +// 进行客户单位下人员同步 + String errorClientMemberValue = organizationOrgDingdingSyncServer.dingdingSyncAllClientMembers(); + res = errorAccountValue+","+errorDepartmentValue+","+errorMemberValue+","+errorServiceBroker+","+errorClientMemberValue; + }else{ +// 通过时间查询最新的修改数据并且同步到钉钉。 + String accountRes = organizationOrgDingdingSyncServer.dingdingSyncBatchAccount(simpleDateFormat.format(startDate)); + String departmrntRes = organizationOrgDingdingSyncServer.dingdingSyncBatchDepartment(simpleDateFormat.format(startDate)); + String memberRes = organizationOrgDingdingSyncServer.dingdingSyncBatchMember(simpleDateFormat.format(startDate)); + String serviceBrokerRes = ""; + if("是".equals(isServiceBroker)||"Y".equals(isServiceBroker)||"y".equals(isServiceBroker)){ + serviceBrokerRes = organizationOrgDingdingSyncServer.dingdingSyncServiceBroker(simpleDateFormat.format(startDate)); + } + String clientMemberRes = organizationOrgDingdingSyncServer.dingdingSyncBatchClientMember(simpleDateFormat.format(startDate)); + res = accountRes+","+departmrntRes+","+memberRes+","+serviceBrokerRes+","+clientMemberRes; + } + int i = 0 ; + for(String str :res.split(",")){ + for(String str1s : str.split(";")){ + log.info(str1s); + i++; + } + } + return "同步完成,失败"+i; + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/quartz/QixuexingOrganizationQuartz.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/quartz/QixuexingOrganizationQuartz.java new file mode 100644 index 0000000..3fd1f9f --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/quartz/QixuexingOrganizationQuartz.java @@ -0,0 +1,89 @@ +package com.seeyon.apps.src_mainorganization.quartz; + +import cn.hutool.log.Log; +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.common.plugin.vo.ConfigVo; +import com.seeyon.apps.ext.quartz.AbstractQuartzTask; +import com.seeyon.apps.src_mainorganization.constans.SyncConstants; +import com.seeyon.apps.src_mainorganization.dao.ISyncQixuexingDao; +import com.seeyon.apps.src_mainorganization.server.OrganizationOrgQixuexingSyncServer; +import com.seeyon.ctp.common.AppContext; + +import javax.inject.Inject; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Map; + +public class QixuexingOrganizationQuartz extends AbstractQuartzTask { + + private static Log log = Log.get(QixuexingOrganizationQuartz.class); + + @Override + public String getName() { + return "企学星组织架构同步定时任务"; + } + + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + @Inject + private ISyncQixuexingDao syncQixuexingDao; + @Inject + private OrganizationOrgQixuexingSyncServer organizationOrgQixuexingSyncServer; + + protected ICstConfigApi cstConfigApi = (ICstConfigApi) AppContext.getBean("cstConfigApi"); + public String getPluginId() {return SyncConstants.getPluginId();} + public ConfigVo getOrganizationOrgConfig() {return cstConfigApi.getConfig(getPluginId());} + + @Override + public String taskRun(String s) throws Exception { + log.info("进入企学星组织架构同步定时任务,参数为:"+s); + ConfigVo configVo = this.cstConfigApi.getConfig(this.getPluginId()); + String res = ""; +// 查询上一次同步时间 + Map maxSynchronizationDate = syncQixuexingDao.getMaxSynchronizationDate(); + Date startDate = (Date) maxSynchronizationDate.get("max_create_date"); +// 如果当前调用定时任务时未进行同步,则直接查询全量数据进行同步 + String isServiceBroker = configVo.getParamVal(SyncConstants.isServiceBroker.name()); + if(startDate==null){ +// 进行企学星单位同步操作 + String errorAccountValue = organizationOrgQixuexingSyncServer.qixuexingSyncAllAccounts(); +// 进行企学星部门同步操作 + String errorDepartmentValue = organizationOrgQixuexingSyncServer.qixuexingSyncAllDepartments(); +// 进行企学星岗位同步操作 +// String errorPostValue = organizationOrgQixuexingSyncServer.qixuexingSyncAllPosts(); +// 进行企学星职务级别同步操作 +// String errorLevelValue = organizationOrgQixuexingSyncServer.qixuexingSyncAllLevels(); +// 进行企学星人员同步操作 + String errorMemberValue = organizationOrgQixuexingSyncServer.qixuexingSyncAllMembers(); +// 进行企学星业代人员同步 + String errorServiceBroker = ""; + if("是".equals(isServiceBroker)||"Y".equals(isServiceBroker)||"y".equals(isServiceBroker)){ + errorServiceBroker = organizationOrgQixuexingSyncServer.qixuexingSyncAllServiceBrokers(); + } +// 进行客户单位下人员同步 + String errorClientMemberValue = organizationOrgQixuexingSyncServer.qixuexingSyncAllClientMembers(); + res = errorAccountValue+","+errorDepartmentValue+","+errorMemberValue+","+errorServiceBroker+","+errorClientMemberValue; + }else{ +// 通过时间查询最新的修改数据并且同步到钉钉。 + String accountRes = organizationOrgQixuexingSyncServer.qixuexingSyncBatchAccount(simpleDateFormat.format(startDate)); + String departmrntRes = organizationOrgQixuexingSyncServer.qixuexingSyncBatchDepartment(simpleDateFormat.format(startDate)); +// String postRes = organizationOrgQixuexingSyncServer.qixuexingSyncBatchPost(simpleDateFormat.format(startDate)); +// String levelRes = organizationOrgQixuexingSyncServer.qixuexingSyncBatchLevel(simpleDateFormat.format(startDate)); + String memberRes = organizationOrgQixuexingSyncServer.qixuexingSyncBatchMember(simpleDateFormat.format(startDate)); + String serviceBrokerRes = ""; + if("是".equals(isServiceBroker)||"Y".equals(isServiceBroker)||"y".equals(isServiceBroker)){ + serviceBrokerRes = organizationOrgQixuexingSyncServer.qixuexingSyncServiceBroker(simpleDateFormat.format(startDate)); + } + String clientMemberRes = organizationOrgQixuexingSyncServer.qixuexingSyncClientMember(simpleDateFormat.format(startDate)); + res = accountRes+","+departmrntRes+","+memberRes+","+serviceBrokerRes+","+clientMemberRes; + } + int i = 0 ; + for(String str :res.split(",")){ + for(String str1s : str.split(";")){ + log.info(str1s); + i++; + } + } + return "同步完成,失败"+i; + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/server/InitializeDingdingSyncServer.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/server/InitializeDingdingSyncServer.java new file mode 100644 index 0000000..78e6973 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/server/InitializeDingdingSyncServer.java @@ -0,0 +1,224 @@ +package com.seeyon.apps.src_mainorganization.server; + +import cn.hutool.log.Log; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.common.plugin.vo.ConfigVo; +import com.seeyon.apps.src_mainorganization.constans.SyncConstants; + +import com.seeyon.apps.src_mainorganization.dao.ISyncDdDao; +import com.seeyon.apps.src_mainorganization.util.DingdingProtUtil; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.organization.bo.V3xOrgAccount; +import com.seeyon.ctp.organization.bo.V3xOrgDepartment; +import com.seeyon.ctp.organization.bo.V3xOrgMember; +import com.seeyon.ctp.organization.manager.OrgManager; +import com.taobao.api.ApiException; + +import javax.inject.Inject; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class InitializeDingdingSyncServer { + + private static Log log = Log.get(InitializeDingdingSyncServer.class); + + @Inject + private ICstConfigApi cstConfigApi; + @Inject + private OrgManager orgManager; + @Inject + private ISyncDdDao syncDdDao; + + public String getPluginId() { + return SyncConstants.getPluginId(); + } + +// 进行钉钉单位信息关系绑定初始化 + public Map initializeDingdingAccount() throws ApiException, BusinessException { + Map errorMap = new HashMap<>(); + ConfigVo configVo = this.cstConfigApi.getConfig(this.getPluginId()); + String dingdingAppKey = configVo.getParamVal(SyncConstants.dingdingAppKey.name()); + String dingdingAppSecret = configVo.getParamVal(SyncConstants.dingdingAppSecret.name()); + String accessToken = DingdingProtUtil.getToken(dingdingAppKey,dingdingAppSecret); +// 根据钉钉中的层级信息与OA中的单位信息添加初始化绑定 +// 设置根目录信息 + List superDepartments = new ArrayList<>(); + superDepartments.add(1l); +// 设置根目录,查询钉钉等目录下面的所有部门 + while(superDepartments.size()!=0){ + List departmentIds = new ArrayList<>(); + departmentIds.addAll(superDepartments); + superDepartments.clear(); + for (long superDepartment: departmentIds) { +// 调用钉钉接口查询下级部门信息 + String subordinateDepartment = DingdingProtUtil.departmentListsubid(superDepartment,accessToken); + JSONObject subordinateDepartmentJson = JSONObject.parseObject(subordinateDepartment); + if("0".equals(subordinateDepartmentJson.getString("errcode"))){ + JSONObject subordinateDepartmentResult = subordinateDepartmentJson.getJSONObject("result"); + JSONArray subordinateDepartmentIdList = subordinateDepartmentResult.getJSONArray("dept_id_list"); +// 遍历查询到的部门ID信息 + for(int i = 0 ; i < subordinateDepartmentIdList.size() ; i++){ +// 根据ID查询钉钉中的部门信息 + long subordinateDepartmentId = subordinateDepartmentIdList.getLong(i); + String departmentGet = DingdingProtUtil.departmentGet(subordinateDepartmentId,accessToken); + JSONObject departmentGetJson = JSONObject.parseObject(departmentGet); + if("0".equals(departmentGetJson.getString("errcode"))){ + JSONObject departmentGetResult = departmentGetJson.getJSONObject("result"); + V3xOrgAccount v3xOrgAccount; + if(superDepartment==1L && "稻花香集团".equals(departmentGetResult.getString("name"))){ +// 一级部门存在特殊情况,当前是一级部门时名称为稻花香集团绑定主数据平台一级单位 + v3xOrgAccount = orgManager.getAccountByName("主数据平台"); + }else{ +// 判断当前获取的钉钉部门是否为单位 + v3xOrgAccount = orgManager.getAccountByName(departmentGetResult.getString("name")); + } + if(v3xOrgAccount!=null){ +// 添加到临时储存,为下一个循环的请求参数 + superDepartments.add(subordinateDepartmentId); +// 当前查询单位在钉钉中存在,添加绑定关系表 + int saveAccountBindingnum = syncDdDao.saveAccountBinding(v3xOrgAccount.getId()+"",v3xOrgAccount.getName(),departmentGetResult.getString("dept_id"),departmentGetResult.getString("name")); + if(saveAccountBindingnum>0){ +// log.info("添加成功"+v3xOrgAccount.getName()); + }else{ + log.info("添加单位失败"+v3xOrgAccount.getId()+v3xOrgAccount.getName()); + } + } + }else{ + log.info("钉钉单位参数查询失败"+subordinateDepartmentId+departmentGetJson); + } + } + } + } + } + return errorMap; + } + + // 进行钉钉部门信息关系绑定初始化 + public Map initializeDingdingDepartment() throws ApiException, BusinessException { + Map errorMap = new HashMap<>(); + ConfigVo configVo = this.cstConfigApi.getConfig(this.getPluginId()); + String dingdingAppKey = configVo.getParamVal(SyncConstants.dingdingAppKey.name()); + String dingdingAppSecret = configVo.getParamVal(SyncConstants.dingdingAppSecret.name()); + String accessToken = DingdingProtUtil.getToken(dingdingAppKey,dingdingAppSecret); +// 根据钉钉中的层级信息与OA中的单位信息添加初始化绑定 +// 查询单位列表 + List superDepartments = syncDdDao.getAccountsBinding(); + while(superDepartments.size()!=0){ +// 创建临时储存列表 + List departmentIds = new ArrayList<>(); +// 临时储存复制 + departmentIds.addAll(superDepartments); +// 清空上级储存内容 + superDepartments.clear(); + for (long superDepartmentId: departmentIds) { +// 调用钉钉接口查询下级部门信息 + String subordinateDepartment = DingdingProtUtil.departmentListsubid(superDepartmentId,accessToken); + JSONObject subordinateDepartmentJson = JSONObject.parseObject(subordinateDepartment); + if("0".equals(subordinateDepartmentJson.getString("errcode"))){ + JSONObject subordinateDepartmentResult = subordinateDepartmentJson.getJSONObject("result"); + JSONArray subordinateDepartmentIdList = subordinateDepartmentResult.getJSONArray("dept_id_list"); +// 遍历查询到的部门ID信息 + for(int i = 0 ; i < subordinateDepartmentIdList.size() ; i++){ +// 根据ID查询钉钉中的部门信息 + long subordinateDepartmentId = subordinateDepartmentIdList.getLong(i); + String departmentGet = DingdingProtUtil.departmentGet(subordinateDepartmentId,accessToken); + JSONObject departmentGetJson = JSONObject.parseObject(departmentGet); + if("0".equals(departmentGetJson.getString("errcode"))){ + JSONObject departmentGetResult = departmentGetJson.getJSONObject("result"); + Map superAccountMap = syncDdDao.getAccountBindingByDdAccount(superDepartmentId+""); + Map superDepartmentMap = syncDdDao.getDepartmentBindingByDdDepartment(superDepartmentId+""); +// 判断当前获取的钉钉部门是否为指定部门 + List v3xOrgDepartments = new ArrayList<>(); + if(superAccountMap.size()>0){ + v3xOrgDepartments = orgManager.getChildDeptsByAccountId(Long.parseLong(superAccountMap.get("org_account_id").toString()),true); + }if(superDepartmentMap.size()>0){ + v3xOrgDepartments = orgManager.getChildDepartments(Long.parseLong(superDepartmentMap.get("org_department_id").toString()),true); + } +// 循环匹配子集部门信息 + for(int n = 0 ; n 0){ +// log.info("添加成功"+saveAccountBindingnum); + }else{ + log.info("添加部门失败"+department.getId()+department.getName()); + } + } + } + }else{ + log.info("钉钉部门参数查询失败"+subordinateDepartmentId+departmentGetJson); + } + } + } + } + + } + return errorMap; + } + + // 进行钉钉人员信息关系绑定初始化 + public Map initializeDingdingMember() throws ApiException, BusinessException { + Map errorMap = new HashMap<>(); + ConfigVo configVo = this.cstConfigApi.getConfig(this.getPluginId()); + String dingdingAppKey = configVo.getParamVal(SyncConstants.dingdingAppKey.name()); + String dingdingAppSecret = configVo.getParamVal(SyncConstants.dingdingAppSecret.name()); + String accessToken = DingdingProtUtil.getToken(dingdingAppKey,dingdingAppSecret); +// 根据部门绑定信息查询部门下人员信息,并添加绑定信息 +// 查询绑定关系中的所有的部门 + List superDepartments = syncDdDao.getDepartmentsBinding(); +// 遍历当前部门,在钉钉中查询各部门下的人员 + for (Long superDepartmentId: superDepartments) { + String userListId = DingdingProtUtil.userListId(superDepartmentId,accessToken); + JSONObject userListIdJson = JSONObject.parseObject(userListId); + if("0".equals(userListIdJson.getString("errcode"))){ + JSONObject userListIdResult = userListIdJson.getJSONObject("result"); + JSONArray userListIdList = userListIdResult.getJSONArray("userid_list"); + for(int i = 0 ; i < userListIdList.size() ; i++){ + String dingdingUserId = userListIdList.getString(i); + String userGet = DingdingProtUtil.userGet(dingdingUserId,accessToken); + JSONObject userGetJson = JSONObject.parseObject(userGet); + if("0".equals(userGetJson.getString("errcode"))){ + JSONObject userGetResult = userGetJson.getJSONObject("result"); +// 根据钉钉人员信息查询OA中的人员信息,通过手机号匹配信息 + String userMobile = userGetResult.getString("mobile"); + String userName = userGetResult.getString("name"); +// 根据根据手机号查询OA系统中人员ID信息 + List memberIds = syncDdDao.getMemberByMobile(userMobile); + + if(memberIds.size()>1){ + log.info(userMobile+userName+"在系统中存在多个同手机号人员,跳过绑定,请手动添加:钉钉ID"+userGetResult.getString("userid")); + }else if (memberIds.size()==0){ + log.info(userMobile+userName+"在系统中未查询到使用此手机号人员,跳过处理。请检查:钉钉ID"+userGetResult.getString("userid")); + }else{ + V3xOrgMember v3xOrgMember = orgManager.getMemberById(memberIds.get(0)); + int saveMemberBindingNum = syncDdDao.saveMemberBinding(v3xOrgMember.getId().toString(),v3xOrgMember.getName(),userGetResult.getString("userid"),userName,userMobile); + if(saveMemberBindingNum>0){ +// log.info(userMobile+userName+"添加成功"+saveMemberBindingNum); + }else{ + log.info(userMobile+userName+"添加人员失败"+saveMemberBindingNum); + } + } + }else{ + log.info("钉钉人员参数查询失败"+dingdingUserId+userGetJson); + } + } + } + } + return errorMap; + } + + + + + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/server/OrganizationOrgDingdingSyncServer.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/server/OrganizationOrgDingdingSyncServer.java new file mode 100644 index 0000000..4bde8dd --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/server/OrganizationOrgDingdingSyncServer.java @@ -0,0 +1,1272 @@ +package com.seeyon.apps.src_mainorganization.server; + +import cn.hutool.log.Log; +import com.alibaba.fastjson.JSONObject; +import com.dingtalk.api.request.OapiV2DepartmentCreateRequest; +import com.dingtalk.api.request.OapiV2DepartmentUpdateRequest; +import com.dingtalk.api.request.OapiV2UserCreateRequest; +import com.dingtalk.api.request.OapiV2UserUpdateRequest; +import com.seeyon.apps.addressbook.manager.AddressBookCustomerFieldInfoManager; +import com.seeyon.apps.addressbook.po.AddressBook; +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.common.plugin.vo.ConfigVo; +import com.seeyon.apps.src_mainorganization.constans.SyncConstants; +import com.seeyon.apps.src_mainorganization.dao.*; +import com.seeyon.apps.src_mainorganization.util.DingdingProtUtil; +import com.seeyon.apps.src_mainorganization.util.FormExportUtil; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.ctpenumnew.manager.EnumManager; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.common.po.ctpenumnew.CtpEnumItem; +import com.seeyon.ctp.organization.bo.V3xOrgAccount; +import com.seeyon.ctp.organization.bo.V3xOrgDepartment; +import com.seeyon.ctp.organization.manager.OrgManager; +import com.seeyon.ctp.services.ServiceException; +import com.seeyon.v3x.services.form.FormFactory; +import com.seeyon.v3x.services.form.bean.FormExport; +import com.seeyon.v3x.services.form.bean.ValueExport; +import com.taobao.api.ApiException; +import jodd.util.StringUtil; + +import javax.inject.Inject; +import java.text.SimpleDateFormat; +import java.util.*; + +public class OrganizationOrgDingdingSyncServer { + + private static Log log = Log.get(OrganizationOrgDingdingSyncServer.class); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + FormExportUtil formExportUtil = new FormExportUtil(); + @Inject + private ICstConfigApi cstConfigApi; + @Inject + private OrgManager orgManager; + @Inject + private ISyncDdDao syncDdDao; + @Inject + private ISrcAccountDao srcAccountDao; + @Inject + private ISrcDepartmentDao srcDepartmentDao; + @Inject + private ISrcMemberDao srcMemberDao; + @Inject + private IArchiveDao archiveDao; + @Inject + private AddressBookCustomerFieldInfoManager addressBookCustomerFieldInfoManager; + @Inject + private FormFactory formFactory; + + private EnumManager enumManagerNew; + public void setEnumManagerNew(EnumManager enumManagerNew) {this.enumManagerNew = enumManagerNew;} + public EnumManager getEnumManagerNew() { + if (enumManagerNew == null) {enumManagerNew = (EnumManager) AppContext.getBean("enumManagerNew");} + return enumManagerNew; + } + + public String getPluginId() { + return SyncConstants.getPluginId(); + } + + public String dingdingSyncAllAccounts() throws BusinessException, ApiException, ServiceException { + String res = ""; +// 查询所有单位信息 + List> allAccounts = srcAccountDao.getAllAccounts(); + // 根据列表查询生成列表部门对象 + Map errorMap = dingdingSyncBatchAccountMap(allAccounts); + log.info("单位异常数"+errorMap.size()); + for (Map.Entry entry : errorMap.entrySet()) { + String value = entry.getValue(); + res= res+value+";"; + } + return res; + } + +// 通过最新修改时间查询变化单位数据,将变化的数据保存到钉钉中 + public String dingdingSyncBatchAccount (String startDate) throws BusinessException, ApiException, ServiceException { + String res = ""; +// 根据上一次同步时间获取最新修改的单位信息 + List> incrementAccounts = srcAccountDao.getIncrementAccountByUpdateTime(startDate); +// 根据列表查询生成列表部门对象 + Map errorMap = dingdingSyncBatchAccountMap(incrementAccounts); + log.info("单位异常数"+errorMap.size()); + for (Map.Entry entry : errorMap.entrySet()) { + String value = entry.getValue(); + res= res+value+";"; + } + return res ; + } + +// 钉钉单位同步,单位列表 +// id,name,code,path,is_enable + public Map dingdingSyncBatchAccountMap(List> list) throws ApiException, BusinessException, ServiceException { + ConfigVo configVo = this.cstConfigApi.getConfig(this.getPluginId()); + + Map errorMap = new HashMap<>(); + String excludeAccount = configVo.getParamVal(SyncConstants.excludeAccount.name()); + String dingdingAppKey = configVo.getParamVal(SyncConstants.dingdingAppKey.name()); + String dingdingAppSecret = configVo.getParamVal(SyncConstants.dingdingAppSecret.name()); + String accessToken = DingdingProtUtil.getToken(dingdingAppKey,dingdingAppSecret); + log.info("钉钉token"+accessToken+"遍历单位信息个数"+list.size()); + for(Map accountMap : list){ + Map from = new HashMap(); + from.put("同步类型", "单位"); + from.put("同步时间", sdf.format(new Date())); + from.put("同步对象", accountMap.get("name").toString()); + if(!accountMap.get("path").toString().startsWith("00000017") || excludeAccount.contains(accountMap.get("id").toString())){ +// Map excelDataMap = new HashMap<>(); + log.info(accountMap.get("name")+ "" + accountMap.get("code") + accountMap.get("id")); +// 同步单位单位信息,同步流程平台,检查流程平台是否存在 + long accountId = Long.parseLong(accountMap.get("id").toString()); + String accountName = accountMap.get("name").toString(); +// 根据OA单位ID查询绑定关系表中是否存在 + Map map = syncDdDao.getAccountBinding(accountId+""); + accountMap.put("dd_account_id",map.get("dd_account_id")); +// 判断当前部门是否存在绑定关系 + if(map.size()>0){ + if("1".equals(accountMap.get("is_enable")!=null?accountMap.get("is_enable").toString():null)){ +// 封装当前环境单位数据,调用部门修改接口,修改钉钉部门信息 + OapiV2DepartmentUpdateRequest req = new OapiV2DepartmentUpdateRequest(); +// 部门ID + req.setDeptId(Long.parseLong(map.get("dd_account_id").toString())); +// 获取单位路径 + String accountPath = accountMap.get("path").toString(); + if(excludeAccount.contains(accountMap.get("id")+"")){ + V3xOrgAccount superiorAccount = orgManager.getAccountByPath("00000011"); +// 根据上级单位ID查询绑定关系表中的钉钉部门ID + Map superiorAccountMap = syncDdDao.getAccountBinding(superiorAccount.getId()+""); + if(superiorAccountMap.size()<0){ +// 未查询到上级单位绑定关系,同步钉钉失败, + errorMap.put(accountId+"","钉钉同步单位失败:"+accountName+"未查询到上级单位绑定关系,同步钉钉失败"); + continue; + } +// 上级部门 + req.setParentId(Long.parseLong(superiorAccountMap.get("dd_account_id").toString())); + }else{ + accountPath = accountPath.substring(0,accountPath.length()-4); + if("0000".equals(accountPath)){ +// 上级单位为根部门 + req.setParentId(1L); + }else{ + V3xOrgAccount superiorAccount = orgManager.getAccountByPath(accountPath); +// 根据上级单位ID查询绑定关系表中的钉钉部门ID + Map superiorAccountMap = syncDdDao.getAccountBinding(superiorAccount.getId()+""); + if(superiorAccountMap.size()<0){ +// 未查询到上级单位绑定关系,同步钉钉失败, + errorMap.put(accountId+"","钉钉同步单位失败:"+accountName+"未查询到上级单位绑定关系,同步钉钉失败"); + continue; + } +// 上级部门 + req.setParentId(Long.parseLong(superiorAccountMap.get("dd_account_id").toString())); + } + } +// 部门名称 + req.setName(accountName); +// 部门唯一标识 + req.setSourceIdentifier(accountId+""); +// 通讯录语言 + req.setLanguage("zh_CN"); +// 部门主管人员列表 +// req.setDeptManagerUseridList("manager200"); + String departmentUpdate = DingdingProtUtil.departmentUpdate(req,accessToken); + JSONObject departmentUpdateJson = JSONObject.parseObject(departmentUpdate); +// 更新绑定关系数据 + if("0".equals(departmentUpdateJson.getString("errcode"))){ + from.put("是否成功", "成功"); + from.put("同步结果", "钉钉修改同步成功"); +// 修改部门成功,修改绑定关系数据 + int ii = syncDdDao.updateAccountBinding(accountId+"",accountName,map.get("dd_account_id").toString(),accountMap.get("name").toString()); + }else{ + from.put("是否成功", "失败"); + from.put("同步结果", accountName+departmentUpdateJson.getString("errmsg")); +// 调用钉钉接口失败 + errorMap.put(accountId+"","钉钉修改同步单位失败:"+accountName+departmentUpdateJson.getString("errmsg")); + } + FormExport formExport = new FormExport(); + from.put("同步动作", "修改"); + from.put("主要信息", accountMap.toString()); + List valueExports = formExportUtil.setFormValue(from); + formExport.setValues(valueExports); + formFactory.importBusinessFormData(configVo.getParamVal(SyncConstants.dingdingLogloginName.name()), + configVo.getParamVal(SyncConstants.dingdingLog.name()), + formExport, new String[] {}); + }else{ + log.info(accountMap.toString()+"当前单位状态为停用状态,执行钉钉部门删除操作"); + String departmentDelete = DingdingProtUtil.departmentDelete(Long.parseLong(map.get("dd_account_id").toString()),accessToken); + JSONObject departmentDeleteJson = JSONObject.parseObject(departmentDelete); +// 更新绑定关系数据 + if("0".equals(departmentDeleteJson.getString("errcode"))){ + from.put("是否成功", "成功"); + from.put("同步结果", "钉钉删除同步成功"); +// 删除部门成功,修改绑定关系数据 + int ii = syncDdDao.deleteDepartmentBinding(accountId+""); + }else{ + from.put("是否成功", "失败"); + from.put("同步结果", accountName+departmentDeleteJson.getString("errmsg")); +// 调用钉钉接口失败 + errorMap.put(accountId+"","钉钉删除同步部门失败:"+accountName+departmentDeleteJson.getString("errmsg")); + } + FormExport formExport = new FormExport(); + from.put("同步动作", "删除"); + from.put("主要信息", accountMap.toString()); + List valueExports = formExportUtil.setFormValue(from); + formExport.setValues(valueExports); + formFactory.importBusinessFormData(configVo.getParamVal(SyncConstants.dingdingLogloginName.name()), + configVo.getParamVal(SyncConstants.dingdingLog.name()), + formExport, new String[] {}); + } + }else{ +// 封装当前单位数据,调用部门新增接口,新增钉钉部门信息 + OapiV2DepartmentCreateRequest req = new OapiV2DepartmentCreateRequest(); +// 获取单位路径 + String accountPath = accountMap.get("path").toString(); + if(excludeAccount.contains(accountId+"")){ + V3xOrgAccount superiorAccount = orgManager.getAccountByPath("00000011"); +// 根据上级单位ID查询绑定关系表中的钉钉部门ID + Map superiorAccountMap = syncDdDao.getAccountBinding(superiorAccount.getId()+""); + if(superiorAccountMap.size()<0){ +// 未查询到上级单位绑定关系,同步钉钉失败, + errorMap.put(accountId+"","钉钉同步单位失败:"+accountName+"未查询到上级单位绑定关系,同步钉钉失败"); + continue; + } +// 上级部门 + req.setParentId(Long.parseLong(superiorAccountMap.get("dd_account_id").toString())); + }else{ + accountPath = accountPath.substring(0,accountPath.length()-4); + if("0000".equals(accountPath)){ +// 上级单位为根部门 + req.setParentId(1L); + }else{ + V3xOrgAccount superiorAccount = orgManager.getAccountByPath(accountPath); +// 根据上级单位ID查询绑定关系表中的钉钉部门ID + Map superiorAccountMap = syncDdDao.getAccountBinding(superiorAccount.getId()+""); + if(superiorAccountMap.size()==0){ +// 未查询到上级单位绑定关系,同步钉钉失败, + errorMap.put(accountId+"","钉钉同步单位失败:"+accountName+"未查询到上级单位绑定关系,同步钉钉失败"); + continue; + } +// 上级部门 + req.setParentId(Long.parseLong(superiorAccountMap.get("dd_account_id").toString())); + } + } +// 部门名称,调用接口时去掉特殊字符 + accountName = accountName.replace("-", ""); + req.setName(accountName); +// 外部绑定ID + req.setSourceIdentifier(accountId+""); + String departmentCreate = DingdingProtUtil.departmentCreate(req,accessToken); + JSONObject departmentCreateJson = JSONObject.parseObject(departmentCreate); + if("0".equals(departmentCreateJson.getString("errcode"))){ + from.put("是否成功", "成功"); + from.put("同步结果", "钉钉新增同步成功"); +// 新增部门成功,新增绑定关系数据 + String ddAccoungId = departmentCreateJson.getJSONObject("result").getString("dept_id"); + int ii = syncDdDao.saveAccountBinding(accountId+"",accountName,ddAccoungId,accountName); + }else{ + from.put("是否成功", "失败"); + from.put("同步结果", accountName+departmentCreateJson.getString("errmsg")); + // 调用钉钉接口失败 + errorMap.put(accountId+"","钉钉同步单位失败:"+accountName+departmentCreateJson.getString("errmsg")); + } + FormExport formExport = new FormExport(); + from.put("同步动作", "新增"); + from.put("主要信息", accountMap.toString()); + List valueExports = formExportUtil.setFormValue(from); + formExport.setValues(valueExports); + formFactory.importBusinessFormData(configVo.getParamVal(SyncConstants.dingdingLogloginName.name()), + configVo.getParamVal(SyncConstants.dingdingLog.name()), + formExport, new String[] {}); + } + } + } + return errorMap; + } + + public String dingdingSyncAllDepartments() throws BusinessException, ApiException, ServiceException { + String res = ""; +// 根据上一次同步时间获取最新修改的单位信息 + List> incrementDepartments = srcDepartmentDao.getAllDepartments(); +// 根据列表查询生成列表部门对象 + Map errorMap = dingdingSyncBatchDeptMap(incrementDepartments); + log.info("部门异常数"+errorMap.size()); + for (Map.Entry entry : errorMap.entrySet()) { + String value = entry.getValue(); + res= res+value+";"; + } + return res ; + + } + + // 通过最新修改时间查询变化部门数据,将变化的数据保存到钉钉中 + public String dingdingSyncBatchDepartment (String startDate) throws BusinessException, ApiException, ServiceException { + String res = ""; +// 根据上一次同步时间获取最新修改的单位信息 + List> incrementDepartments = srcDepartmentDao.getIncrementDepartmentByUpdateTime(startDate); +// 根据列表查询生成列表部门对象 + Map errorMap = dingdingSyncBatchDeptMap(incrementDepartments); + log.info("部门异常数"+errorMap.size()); + for (Map.Entry entry : errorMap.entrySet()) { + String value = entry.getValue(); + res= res+value+";"; + } + return res ; + } + + // 钉钉单部门同步 +// id,code,name,path,is_enable + public Map dingdingSyncBatchDeptMap (List> list) throws ApiException, BusinessException, ServiceException { + ConfigVo configVo = this.cstConfigApi.getConfig(this.getPluginId()); + + Map errorMap = new HashMap<>(); + String dingdingAppKey = configVo.getParamVal(SyncConstants.dingdingAppKey.name()); + String dingdingAppSecret = configVo.getParamVal(SyncConstants.dingdingAppSecret.name()); + String accessToken = DingdingProtUtil.getToken(dingdingAppKey,dingdingAppSecret); + for(Map departmentMap : list){ + long departmentId = Long.parseLong(departmentMap.get("id").toString()); +// 根据当前部门信息查询部门自定义信息项 + AddressBook addressBook = addressBookCustomerFieldInfoManager.getByMemberId(departmentId); + if("1".equals(departmentMap.get("is_enable")!=null?departmentMap.get("is_enable").toString():null)){ +// 判断自定义项是否为空 + if(addressBook!=null){ +// 获取自定义查询项信息 + String xt = addressBook.getExtAttr31(); + if(StringUtil.isNotEmpty(xt) && !"-1".equals(xt)){ +// 获取自定义查询项数据 + CtpEnumItem ctpEnumItem = getEnumManagerNew().getCtpEnumItem(Long.parseLong(xt)); + String xtValue = ctpEnumItem.getValue(); + if("1".equals(xtValue)||"3".equals(xtValue)||"5".equals(xtValue)||"6".equals(xtValue)){ +// 当前部门自定义数据项中存在钉钉 + errorMap.putAll(departmentSynchronization(departmentMap,true,accessToken)); + }else{ +// 当前部门重定义数据项中不存在钉钉 + errorMap.putAll(departmentSynchronization(departmentMap,false,accessToken)); + } + }else{ +// 当前部门同步系统自定义查询项数据为空 + errorMap.putAll(departmentSynchronization(departmentMap,false,accessToken)); + } + }else{ +// 当前部门自定义查询项数据为空 + errorMap.putAll(departmentSynchronization(departmentMap,false,accessToken)); + } + }else{ +// 当前部门状态为停用状态 + errorMap.putAll(departmentSynchronization(departmentMap,false,accessToken)); + } + } + return errorMap; + } + + public Map excelDepartmentSynchronization(Map excelDataMap,Map departmentMap,boolean state) throws ApiException, BusinessException { +// 当前人员所在单位在钉钉绑定表中存在。 + Map departmentBinding = syncDdDao.getDepartmentBinding(departmentMap.get("id")+""); +// 查询上级部门信息 + String path = departmentMap.get("path").toString(); + String superPath = path.substring(0,path.length()-4); + String superDepartmentId = srcDepartmentDao.getSuperUnitIdByPath(superPath); + V3xOrgDepartment v3xOrgDepartment = orgManager.getDepartmentById(Long.parseLong(departmentMap.get("id")+"")); + V3xOrgAccount v3xOrgAccount = orgManager.getAccountById(v3xOrgDepartment.getOrgAccountId()); + excelDataMap.put("accountId",v3xOrgAccount.getId().toString()); + excelDataMap.put("accountName",v3xOrgAccount.getName()); + + if(departmentBinding.size()>0){ +// 判断当前同步状态 + if(state){ +// 部门ID + excelDataMap.put("dddeptId",departmentBinding.get("dd_department_id")!=null?departmentBinding.get("dd_department_id").toString():""); + if(superDepartmentId.equals(departmentMap.get("org_account_id")!=null?departmentMap.get("org_account_id").toString():null)){ +// 获取上级部门ID,如果当前部门是一级部门那么上级部门ID则查询所在单位ID。 + Map accountBinding = syncDdDao.getAccountBinding(departmentMap.get("org_account_id")+""); + log.info("上级部门与所属单位相同,在OA中是一级部门,取单位绑定中的钉钉ID"+accountBinding.get("dd_account_id")); + excelDataMap.put("ddsuperdeptId",accountBinding.get("dd_account_id")!=null?accountBinding.get("dd_account_id").toString():""); + excelDataMap.put("ddsuperdeptName",accountBinding.get("dd_account_name")!=null?accountBinding.get("dd_account_name").toString():""); + } else{ +// 如果当前部门不是一级部门,则直接获取上级部门ID查询钉钉绑定 + Map superDepartmentBinding = syncDdDao.getDepartmentBinding(superDepartmentId); + if(superDepartmentBinding.size()<0){ + return excelDataMap; + } + log.info("根据上级部门ID查询钉钉部门绑定表中的信息获取钉钉ID"+superDepartmentBinding.get("dd_department_id").toString()); + excelDataMap.put("ddsuperdeptId",superDepartmentBinding.get("dd_department_id")!=null?superDepartmentBinding.get("dd_department_id").toString():""); + excelDataMap.put("ddsuperdeptName",superDepartmentBinding.get("dd_department_name")!=null?superDepartmentBinding.get("dd_department_name").toString():""); + } +// 排序号 +// req.setOrder(10L); +// 部门名称 + excelDataMap.put("deptName",departmentMap.get("name")!=null?departmentMap.get("name").toString():""); +// 部门唯一标识 + excelDataMap.put("sourcedeptId",departmentMap.get("id")!=null?departmentMap.get("id").toString():""); + } + }else{ + if(state){ + log.info(superDepartmentId+"=="+departmentMap.get("org_account_id")); + if(superDepartmentId.equals(departmentMap.get("org_account_id")!=null?departmentMap.get("org_account_id").toString():"")){ +// 获取上级部门ID,如果当前部门是一级部门那么上级部门ID则查询所在单位ID。 + Map accountBinding = syncDdDao.getAccountBinding(departmentMap.get("org_account_id").toString()); + log.info("上级部门与所属单位相同,在OA中是一级部门,取单位绑定中的钉钉ID"+accountBinding.get("dd_account_id")); + excelDataMap.put("ddsuperdeptId",accountBinding.get("dd_account_id")!=null?accountBinding.get("dd_account_id").toString():""); + excelDataMap.put("ddsuperdeptName",accountBinding.get("dd_account_name")!=null?accountBinding.get("dd_account_name").toString():""); + } else{ +// 如果当前部门不是一级部门,则直接获取上级部门ID查询钉钉绑定\ + Map superDepartmentBinding = syncDdDao.getDepartmentBinding(superDepartmentId); + log.info("当前部门信息为"+departmentMap.get("id")+departmentMap.get("name")+"上级部门id为"+superDepartmentId); + if(superDepartmentBinding.size()==0){ +// 未查询到上级单部门绑定关系,同步钉钉失败, + return excelDataMap; + } + log.info(superDepartmentBinding+"根据上级部门ID查询钉钉部门绑定表中的信息获取钉钉ID"+superDepartmentBinding.get("dd_department_id")); + excelDataMap.put("ddsuperdeptId",superDepartmentBinding.get("dd_department_id")!=null?superDepartmentBinding.get("dd_department_id").toString():""); + excelDataMap.put("ddsuperdeptName",superDepartmentBinding.get("dd_department_name")!=null?superDepartmentBinding.get("dd_department_name").toString():""); + } +// 部门名称 + excelDataMap.put("deptName",departmentMap.get("name").toString()); +// 外部绑定ID + excelDataMap.put("sourcedeptId",departmentMap.get("id").toString()); + } + } + return excelDataMap; + } + + + public Map departmentSynchronization(Map departmentMap,boolean state,String accessToken) throws ApiException, ServiceException { + ConfigVo configVo = this.cstConfigApi.getConfig(this.getPluginId()); + FormExport formExport = new FormExport(); + Map from = new HashMap(); + from.put("同步类型", "部门"); + from.put("同步时间", sdf.format(new Date())); + from.put("同步对象", departmentMap.get("name").toString()); + + + Map errorMap = new HashMap<>(); + log.info("查询当前部门是否在钉钉绑定表中是否存在"); +// 当前人员所在单位在钉钉绑定表中存在。 + System.out.println(departmentMap); + Map departmentBinding = syncDdDao.getDepartmentBinding(departmentMap.get("id")+""); + departmentMap.put("dd_department_id",departmentBinding.get("dd_department_id")); + from.put("主要信息", departmentMap.toString()); +// 查询上级部门信息 + String path = departmentMap.get("path").toString(); + String superPath = path.substring(0,path.length()-4); + String superDepartmentId = srcDepartmentDao.getSuperUnitIdByPath(superPath); + if(departmentBinding.size()>0){ +// 判断当前同步状态 + if(state){ +// 部门信息在绑定表中存在调用钉钉修改接口 + OapiV2DepartmentUpdateRequest req = new OapiV2DepartmentUpdateRequest(); +// 部门ID + req.setDeptId(Long.parseLong(departmentBinding.get("dd_department_id").toString())); + + if(superDepartmentId.equals(departmentMap.get("org_account_id")!=null?departmentMap.get("org_account_id").toString():null)){ +// 获取上级部门ID,如果当前部门是一级部门那么上级部门ID则查询所在单位ID。 + Map accountBinding = syncDdDao.getAccountBinding(departmentMap.get("org_account_id")+""); + log.info("上级部门与所属单位相同,在OA中是一级部门,取单位绑定中的钉钉ID"+accountBinding.get("dd_account_id")); + req.setParentId(Long.parseLong(accountBinding.get("dd_account_id").toString())); + } else{ +// 如果当前部门不是一级部门,则直接获取上级部门ID查询钉钉绑定 + Map superDepartmentBinding = syncDdDao.getDepartmentBinding(superDepartmentId); + if(superDepartmentBinding.size()<0){ +// 未查询到上级单位绑定关系,同步钉钉失败, + errorMap.put(departmentMap.get("id").toString(),"钉钉同步单位失败:"+departmentMap.get("name")+"未查询到上级部门绑定关系,同步钉钉失败"); + return errorMap; + } + log.info("根据上级部门ID查询钉钉部门绑定表中的信息获取钉钉ID"+superDepartmentBinding.get("dd_department_id")); + req.setParentId(Long.parseLong(superDepartmentBinding.get("dd_department_id").toString())); + } +// 部门名称 + req.setName(departmentMap.get("name").toString()); +// 部门唯一标识 + req.setSourceIdentifier(departmentMap.get("id").toString()); +// 通讯录语言 + req.setLanguage("zh_CN"); + String departmentUpdate = DingdingProtUtil.departmentUpdate(req,accessToken); + JSONObject departmentUpdateJson = JSONObject.parseObject(departmentUpdate); +// 更新绑定关系数据(不可直接更新绑定关系) + if("0".equals(departmentUpdateJson.getString("errcode"))){ + from.put("是否成功", "成功"); + from.put("同步结果", "钉钉修改同步成功"); + + }else{ + from.put("是否成功", "失败"); + from.put("同步结果", departmentMap.get("name").toString()+departmentUpdateJson.getString("errmsg")); +// 调用钉钉接口失败 + errorMap.put(departmentMap.get("id").toString(),"钉钉同步部门失败:"+departmentMap.get("name").toString()+departmentUpdateJson.getString("errmsg")); + } + from.put("同步动作", "修改"); + }else{ +// 部门信息在绑定表中不存在调用钉钉删除接口 + log.info(departmentMap.toString()+"部门信息在绑定表中不存在调用钉钉删除接口"); + String departmentDelete = DingdingProtUtil.departmentDelete(Long.parseLong(departmentBinding.get("dd_department_id").toString()),accessToken); + JSONObject departmentDeleteJson = JSONObject.parseObject(departmentDelete); +// 更新绑定关系数据 + if("0".equals(departmentDeleteJson.getString("errcode"))){ + from.put("是否成功", "成功"); + from.put("同步结果", "钉钉删除同步成功"); +// 删除部门成功,修改绑定关系数据 + int ii = syncDdDao.deleteDepartmentBinding(departmentMap.get("id").toString()); + log.info("删除绑定关系"+ii); + }else{ + from.put("是否成功", "失败"); + from.put("同步结果", departmentMap.get("name").toString()+departmentDeleteJson.getString("errmsg")); +// 调用钉钉接口失败 + errorMap.put(departmentMap.get("id").toString(),"钉钉同步部门失败:"+departmentMap.get("name").toString()+departmentDeleteJson.getString("errmsg")); + } + from.put("同步动作", "删除"); + } + }else{ + if(state){ +// 部门信息在绑定表中存在调用钉钉新增接口 + log.info("当前部门在绑定关系中不存在"); + OapiV2DepartmentCreateRequest req = new OapiV2DepartmentCreateRequest(); + log.info(superDepartmentId+"=="+departmentMap.get("org_account_id")); + if(superDepartmentId.equals(departmentMap.get("org_account_id")!=null?departmentMap.get("org_account_id").toString():null)){ +// 获取上级部门ID,如果当前部门是一级部门那么上级部门ID则查询所在单位ID。 + Map accountBinding = syncDdDao.getAccountBinding(departmentMap.get("org_account_id").toString()); + log.info("上级部门与所属单位相同,在OA中是一级部门,取单位绑定中的钉钉ID"+accountBinding.get("dd_account_id")); + req.setParentId(Long.parseLong(accountBinding.get("dd_account_id").toString())); + } else{ +// 如果当前部门不是一级部门,则直接获取上级部门ID查询钉钉绑定\ + Map superDepartmentBinding = syncDdDao.getDepartmentBinding(superDepartmentId); + log.info("当前部门信息为"+departmentMap.get("id")+departmentMap.get("name")+"上级部门id为"+superDepartmentId); + if(superDepartmentBinding.size()==0){ +// 未查询到上级单部门绑定关系,同步钉钉失败, + errorMap.put(departmentMap.get("id").toString(),"钉钉同步单位失败:"+departmentMap.get("name")+"未查询到上级部门绑定关系,同步钉钉失败"); + return errorMap; + } + log.info(superDepartmentBinding+"根据上级部门ID查询钉钉部门绑定表中的信息获取钉钉ID"+superDepartmentBinding.get("dd_department_id")); + req.setParentId(Long.parseLong(superDepartmentBinding.get("dd_department_id").toString())); + } +// 部门名称 + String departmentName = departmentMap.get("name").toString().replace("-", ""); + req.setName(departmentName); +// 外部绑定ID + req.setSourceIdentifier(departmentMap.get("id")+""); + String departmentCreate = DingdingProtUtil.departmentCreate(req,accessToken); + JSONObject departmentCreateJson = JSONObject.parseObject(departmentCreate); + if("0".equals(departmentCreateJson.getString("errcode"))){ + from.put("是否成功", "成功"); + from.put("同步结果", "钉钉新建同步成功"); +// 新增部门成功,新增绑定关系数据 + String ddDepartmentId = departmentCreateJson.getJSONObject("result").getString("dept_id"); + int ii = syncDdDao.saveDepartmentBinding(departmentMap.get("id").toString(),departmentMap.get("name").toString(),ddDepartmentId,departmentMap.get("name").toString()); + log.info("新增绑定关系"+ii); + }else{ + from.put("是否成功", "失败"); + from.put("同步结果", departmentMap.get("name").toString()+departmentCreateJson.getString("errmsg")); +// 调用钉钉接口失败 + errorMap.put(departmentMap.get("id").toString()+"","钉钉同步部门失败:"+departmentMap.get("name").toString()+departmentCreateJson.getString("errmsg")); + } + from.put("同步动作", "新增"); + } + } + List valueExports = formExportUtil.setFormValue(from); + formExport.setValues(valueExports); + if(StringUtil.isNotEmpty(from.get("同步动作"))){ + formFactory.importBusinessFormData(configVo.getParamVal(SyncConstants.dingdingLogloginName.name()), + configVo.getParamVal(SyncConstants.dingdingLog.name()), + formExport, new String[] {}); + } + return errorMap; + } + + public String dingdingSyncAllMembers() throws BusinessException, ApiException, ServiceException { + String res = ""; +// 根据上一次同步时间获取最新修改的单位信息 + List> incrementMembers = srcMemberDao.getAllMembers(); +// 根据列表查询生成列表部门对象 + Map errorMap = dingdingSyncBatchMemberMap(incrementMembers); + log.info("人员异常数"+errorMap.size()); + for (Map.Entry entry : errorMap.entrySet()) { + String value = entry.getValue(); + res= res+value+";"; + } + return res ; + } + + // 通过人员列表ID查询人员对象列表 + public List> memberMaptoV3xOrgMember(List> incrementMembers) { + List> orgMembers = new ArrayList<>(); + for(Map incrementMember :incrementMembers){ + if(incrementMember.get("member_id")!=null){ + String memberId = incrementMember.get("member_id").toString(); +// 此方法无法查询已经离职人员信息 + + Map v3xOrgMember = srcMemberDao.getMemberById(memberId); + orgMembers.add(v3xOrgMember); + } + } + return orgMembers; + } + + + // 通过最新修改时间查询变化人员数据,将变化的数据保存到钉钉中 + public String dingdingSyncBatchMember (String startDate) throws BusinessException, ApiException, ServiceException { + String res = ""; +// 根据上一次同步时间获取最新修改的单位信息 + List> incrementMembers = archiveDao.getIncrementDataByModifyDate(startDate); +// 根据列表查询生成列表部门对象 + List> orgMembers = memberMaptoV3xOrgMember(incrementMembers); + Map errorMap = dingdingSyncBatchMemberMap(orgMembers); + log.info("人员异常数"+errorMap.size()); + for (Map.Entry entry : errorMap.entrySet()) { + String value = entry.getValue(); + res= res+value+";"; + } + return res ; + } + + public Map dingdingSyncBatchMemberMap (List> list) throws ApiException, BusinessException, ServiceException { + ConfigVo configVo = this.cstConfigApi.getConfig(this.getPluginId()); + Map errorMap = new HashMap<>(); +// 获取钉钉基础数据 + String dingdingAppKey = configVo.getParamVal(SyncConstants.dingdingAppKey.name()); + String dingdingAppSecret = configVo.getParamVal(SyncConstants.dingdingAppSecret.name()); + String accessToken = DingdingProtUtil.getToken(dingdingAppKey,dingdingAppSecret); +// 查询岗位黑名单 + List postBlackList = archiveDao.getPostBlackList(); + String postBlackString = ""; + for (String postBlack:postBlackList) { + postBlackString =postBlackString+ postBlack+ ","; + } + List postBlackStringList = Arrays.asList(postBlackString.split(",")); +// 查询人员白名单 + List memberWhiteList = archiveDao.getMemberWhiteList(); + String memberWhiteString = ""; + for (String memberWhite:memberWhiteList) { + memberWhiteString = memberWhiteString+ memberWhite+ ","; + } + List memberWhiteStringList = Arrays.asList(memberWhiteString.split(",")); +// int nnn = 0; + for(Map memberMap : list){ +// 遍历所有人员信息 + System.out.println( memberMap ); + if("1".equals(memberMap.get("is_enable")!=null?memberMap.get("is_enable").toString():null)){ + long departmentId = Long.parseLong(memberMap.get("org_department_id").toString()); +// 根据人员所在部门信息,查询部门对象 + V3xOrgDepartment orgDepartment = orgManager.getDepartmentById(departmentId); + if(orgDepartment==null){ + log.info(memberMap.get("name")+"查询部门为空,跳过处理"); + errorMap.put(memberMap.get("name").toString(),memberMap.get("name")+"查询部门为空,跳过处理"); + continue; + } +// 根据部门ID,查询部门主数据对象 + AddressBook departmentAddressBook = addressBookCustomerFieldInfoManager.getByMemberId(orgDepartment.getId()); +// 根据同步系统枚举字段 + if(departmentAddressBook!=null){ +// 获取部门同步系统自定义参数 + String xt = departmentAddressBook.getExtAttr31(); + if(StringUtil.isNotEmpty(xt) && !"-1".equals(xt)){ +// 获取部门同步系统数据值 + CtpEnumItem xtEnum = getEnumManagerNew().getCtpEnumItem(Long.parseLong(xt)); + String xtValue = xtEnum.getEnumvalue(); + if("1".equals(xtValue)||"3".equals(xtValue)||"5".equals(xtValue)||"6".equals(xtValue)){ +// 如果同步则检索岗位信息是否出现在黑名单 + if(memberMap.get("org_post_id")!=null){ + if(postBlackStringList.contains(memberMap.get("org_post_id").toString())){ +// 如果岗位在黑名单中则检索人员白名单 + if(memberWhiteStringList.contains(memberMap.get("id").toString())){ +// 如果人员在白名单中则设置新增逻辑 + errorMap.putAll(memberSynchronization(memberMap,true,accessToken)); + }else{ +// 如果人员不在白名单中则设置删除逻辑 + errorMap.putAll(memberSynchronization(memberMap,false,accessToken)); + } + }else{ +// 如果岗位不在黑名单中,设置新增逻辑。 + errorMap.putAll(memberSynchronization(memberMap,true,accessToken)); + } + }else{ + errorMap.putAll(memberSynchronization(memberMap,false,accessToken)); + } + }else{ +// 如果人员不在白名单中则设置删除逻辑 + errorMap.putAll(memberSynchronization(memberMap,false,accessToken)); + } + }else{ + errorMap.putAll(memberSynchronization(memberMap,false,accessToken)); + } + }else{ + errorMap.putAll(memberSynchronization(memberMap,false,accessToken)); + } + }else{ + errorMap.putAll(memberSynchronization(memberMap,false,accessToken)); + } + + } + return errorMap; + } + + public Map memberSynchronization(Map v3xOrgMember,boolean state,String accessToken) throws ApiException, ServiceException { + ConfigVo configVo = this.cstConfigApi.getConfig(this.getPluginId()); + FormExport formExport = new FormExport(); + Map from = new HashMap(); + from.put("同步类型", "人员"); + from.put("同步时间", sdf.format(new Date())); + from.put("同步对象", v3xOrgMember.get("name").toString()); + from.put("主要信息", v3xOrgMember.toString()); + + Map errorMap = new HashMap<>(); + Map memberMap = new HashMap<>(); + long accountId = Long.parseLong(v3xOrgMember.get("org_account_id").toString()); + Map accountBinding = syncDdDao.getAccountBinding(accountId+""); + if(accountBinding.size()==0){ + log.info("当前修改人员所在单位不在钉钉绑定表中跳过处理"); + errorMap.put(v3xOrgMember.get("id").toString(),v3xOrgMember.get("name").toString()+"当前修改人员所在单位不在钉钉绑定表中跳过处理"); + }else{ + Map memberArchiveMap = archiveDao.getMemberArchiveById(Long.parseLong(v3xOrgMember.get("id").toString())); + if(memberArchiveMap.get("telnumber") == null){ + errorMap.put(v3xOrgMember.get("id").toString(),"当前人员未维护手机号,同步失败。"); + return errorMap; + } + String telnumber = memberArchiveMap.get("telnumber").toString(); + log.info("查询当前人员是否在钉钉绑定表中是否存在"+telnumber); +// 当前人员所在单位在钉钉绑定表中存在。 + Map memberBinding = syncDdDao.getMemberBinding(v3xOrgMember.get("id").toString()); + v3xOrgMember.put("dd_member_id",memberBinding.get("dd_member_id")); + System.out.println(v3xOrgMember); + if(memberBinding.size()>0){ + if(state){ + if(telnumber.equals(memberBinding.get("dd_member_telnumber")!=null?memberBinding.get("dd_member_telnumber").toString():null)){ +// 手机号相同,执行修改 + log.info("当前人员在钉钉人员绑定表中存在,执行人员修改方法,修改钉钉中的人员信息,修改钉钉绑定关系"); + Map deptMap = syncDdDao.getDepartmentBinding(v3xOrgMember.get("org_department_id").toString()); + if(deptMap!=null){ +// 根据当前人员获取当前部门,并且通过部门ID获取钉钉部门ID + memberMap.put("deptId",deptMap.get("dd_department_id").toString()); + memberMap.put("telNumber",telnumber); +// 查询当前人员是否已经存在 + String ddMember = DingdingProtUtil.userGet(v3xOrgMember.get("dd_member_id")+"" ,accessToken); + JSONObject ddMemberJson = JSONObject.parseObject(ddMember); + String errcode = ddMemberJson.getString("errcode"); +// String userid = ddMemberJson.getJSONObject("result").getString("userid"); + if("0".equals(errcode)){ +// 封装人员修改参数,执行人员修改方法 + OapiV2UserUpdateRequest req = DingdingProtUtil.getMemberUpdateParam(v3xOrgMember,memberMap); + String memberUpdate = DingdingProtUtil.memberUpdate(req,accessToken); + JSONObject memberUpdateJson = JSONObject.parseObject(memberUpdate); + if("0".equals(memberUpdateJson.getString("errcode"))){ + from.put("是否成功", "成功"); + from.put("同步结果","钉钉修改同步成功"); + }else{ + from.put("是否成功", "失败"); + from.put("同步结果",v3xOrgMember.get("name").toString()+memberUpdateJson.getString("errmsg")); +// 调用钉钉接口失败 + errorMap.put(v3xOrgMember.get("id").toString(),"钉钉同步人员失败:"+v3xOrgMember.get("name").toString()+memberUpdateJson.getString("errmsg")); + } + from.put("同步动作","修改"); + }else{ +// 调用工具类钉钉人员新建对象 + OapiV2UserCreateRequest req = DingdingProtUtil.getMemberCreateParam(v3xOrgMember,memberMap); + String memberCreate = DingdingProtUtil.memberCreate(req,accessToken); + JSONObject memberCreateJson = JSONObject.parseObject(memberCreate); +// 绑定关系已存在只用判断是否执行新增 + if("0".equals(memberCreateJson.getString("errcode")) ){ + from.put("是否成功", "成功"); + from.put("同步结果","钉钉新增同步成功"); + }else if ("40103".equals(memberCreateJson.getString("errcode"))){ + from.put("是否成功", "成功"); + from.put("同步结果",memberCreateJson.getString("errmsg")); + }else{ + from.put("是否成功", "失败"); + from.put("同步结果",v3xOrgMember.get("name").toString()+memberCreateJson.getString("errmsg")); +// 调用钉钉接口失败 + errorMap.put(v3xOrgMember.get("id").toString(),"钉钉添加人员失败:"+v3xOrgMember.get("name").toString()+memberCreateJson.getString("errmsg")); + } + from.put("同步动作","新增"); + } + }else{ + from.put("是否成功", "失败"); + from.put("同步结果","钉钉部门未同步成功,请先进行部门同步"); + from.put("同步动作","修改"); + } + }else{ + log.info("当前人员在钉钉人员绑定表不存在,执行人员新增方法,新增钉钉中的人员信息,新增钉钉绑定关系"); + Map deptMap = syncDdDao.getDepartmentBinding(v3xOrgMember.get("org_department_id").toString()); + if(deptMap!=null){ +// 根据当前人员获取当前部门,并且通过部门ID获取钉钉部门ID + memberMap.put("deptId",deptMap.get("dd_department_id").toString()); + memberMap.put("telNumber",telnumber); +// 调用工具类钉钉人员新建对象 + OapiV2UserCreateRequest req = DingdingProtUtil.getMemberCreateParam(v3xOrgMember,memberMap); + String memberCreate = DingdingProtUtil.memberCreate(req,accessToken); + JSONObject memberCreateJson = JSONObject.parseObject(memberCreate); + if("0".equals(memberCreateJson.getString("errcode")) ){ + from.put("是否成功", "成功"); + from.put("同步结果","钉钉新增同步成功"); +// 新增人员成功,新增绑定关系数据 + String ddMemberId = memberCreateJson.getJSONObject("result").getString("userid"); + int ii = syncDdDao.saveMemberBinding(v3xOrgMember.get("id").toString(),v3xOrgMember.get("name").toString(),ddMemberId,v3xOrgMember.get("name").toString(),telnumber); + }else if ("40103".equals(memberCreateJson.getString("errcode"))){ + from.put("是否成功", "成功"); + from.put("同步结果",memberCreateJson.getString("errmsg")); + int ii = syncDdDao.saveMemberBinding(v3xOrgMember.get("id").toString(),v3xOrgMember.get("name").toString(),v3xOrgMember.get("id").toString(),v3xOrgMember.get("name").toString(),telnumber); + }else{ + from.put("是否成功", "失败"); + from.put("同步结果",v3xOrgMember.get("name").toString()+memberCreateJson.getString("errmsg")); +// 调用钉钉接口失败 + errorMap.put(v3xOrgMember.get("id").toString(),"钉钉添加人员失败:"+v3xOrgMember.get("name").toString()+memberCreateJson.getString("errmsg")); + } + from.put("同步动作","新增"); + }else{ + from.put("是否成功", "失败"); + from.put("同步结果","钉钉部门未同步成功,请先进行部门同步"); + from.put("同步动作","新增"); + } + } + }else{ + log.info(v3xOrgMember.toString()+"当前人员在钉钉人员绑定表中存在,当前人员已经停用执行删除操作"); +// 当前人员已经停用执行人员删除方法 + String memberDelete =DingdingProtUtil.memberDelete(memberBinding.get("dd_member_id").toString(),accessToken); + JSONObject memberDeleteJson = JSONObject.parseObject(memberDelete); + if("0".equals(memberDeleteJson.getString("errcode"))){ + from.put("是否成功", "成功"); + from.put("同步结果","钉钉删除同步成功"); + }else{ + from.put("是否成功", "失败"); + from.put("同步结果",v3xOrgMember.get("name").toString()+memberDeleteJson.getString("errmsg")); +// 调用钉钉接口失败 + errorMap.put(v3xOrgMember.get("id").toString(),"钉钉人员同步失败"+v3xOrgMember.get("name").toString()+memberDeleteJson.getString("errmsg")); + } + int ii = syncDdDao.deleteMemberBinding(v3xOrgMember.get("id").toString()); + from.put("同步动作","删除"); + } + }else{ + if(state){ + log.info("当前人员在钉钉人员绑定表不存在,执行人员新增方法,新增钉钉中的人员信息,新增钉钉绑定关系"); + Map deptMap = syncDdDao.getDepartmentBinding(v3xOrgMember.get("org_department_id").toString()); + if(deptMap!=null){} +// 根据当前人员获取当前部门,并且通过部门ID获取钉钉部门ID + memberMap.put("deptId",deptMap.get("dd_department_id").toString()); + memberMap.put("telNumber",telnumber); + log.info("当前人员所在部门对应钉钉的部门ID"+deptMap); +// 调用工具类钉钉人员新建对象 + OapiV2UserCreateRequest req = DingdingProtUtil.getMemberCreateParam(v3xOrgMember,memberMap); + String memberCreate = DingdingProtUtil.memberCreate(req,accessToken); + JSONObject memberCreateJson = JSONObject.parseObject(memberCreate); + if("0".equals(memberCreateJson.getString("errcode")) ){ + from.put("是否成功", "成功"); + from.put("同步结果","钉钉新增同步成功"); +// 新增人员成功,新增绑定关系数据 + String ddMemberId = memberCreateJson.getJSONObject("result").getString("userid"); + System.out.println(v3xOrgMember); + int ii = syncDdDao.saveMemberBinding(v3xOrgMember.get("id").toString(),v3xOrgMember.get("name").toString(),ddMemberId,v3xOrgMember.get("name").toString(),telnumber); + }else if ("40103".equals(memberCreateJson.getString("errcode"))){ + from.put("是否成功", "成功"); + from.put("同步结果",memberCreateJson.getString("errmsg")); + int ii = syncDdDao.saveMemberBinding(v3xOrgMember.get("id").toString(),v3xOrgMember.get("name").toString(),v3xOrgMember.get("id").toString(),v3xOrgMember.get("name").toString(),telnumber); + }else{ + from.put("是否成功", "失败"); + from.put("同步结果",v3xOrgMember.get("name").toString()+memberCreateJson.getString("errmsg")); +// 调用钉钉接口失败 + errorMap.put(v3xOrgMember.get("id").toString(),"钉钉同步人员失败:"+v3xOrgMember.get("name").toString()+memberCreateJson.getString("errmsg")); + } + from.put("同步动作","新增"); + }else{ + log.info(state+""+memberBinding+v3xOrgMember); + } + } + } + List valueExports = formExportUtil.setFormValue(from); + formExport.setValues(valueExports); + if(StringUtil.isNotEmpty(from.get("同步动作"))){ + formFactory.importBusinessFormData(configVo.getParamVal(SyncConstants.dingdingLogloginName.name()), + configVo.getParamVal(SyncConstants.dingdingLog.name()), + formExport, new String[] {}); + } + return errorMap; + } + + public String dingdingSyncAllServiceBrokers() throws BusinessException, ApiException, ServiceException { + String res = ""; +// 根据上一次同步时间获取最新修改的单位信息 + List> serviceBrokers = archiveDao.getServiceBrokers(); +// 根据列表查询生成列表部门对象 + Map errorMap = dingdingSyncServiceBroker(serviceBrokers); + log.info("业代异常数"+errorMap.size()); + for (Map.Entry entry : errorMap.entrySet()) { + String value = entry.getValue(); + res= res+value+";"; + } + return res ; + } + + // 钉钉业代人员同步 + public Map dingdingSyncServiceBroker (List> list) throws ApiException, BusinessException, ServiceException { + ConfigVo configVo = this.cstConfigApi.getConfig(this.getPluginId()); + Map errorMap = new HashMap<>(); + +// 获取钉钉基础数据 + String dingdingAppKey = configVo.getParamVal(SyncConstants.dingdingAppKey.name()); + String dingdingAppSecret = configVo.getParamVal(SyncConstants.dingdingAppSecret.name()); + String accessToken = DingdingProtUtil.getToken(dingdingAppKey,dingdingAppSecret); + +// 查询岗位黑名单 + List postBlackList = archiveDao.getPostBlackList(); + String postBlackString = ""; + for (String postBlack:postBlackList) { + postBlackString =postBlackString+ postBlack+ ","; + } + List postBlackStringList = Arrays.asList(postBlackString.split(",")); +// 查询人员白名单 + List memberWhiteList = archiveDao.getMemberWhiteList(); + String memberWhiteString = ""; + for (String memberWhite:memberWhiteList) { + memberWhiteString = memberWhiteString+ memberWhite+ ","; + } + List memberWhiteStringList = Arrays.asList(memberWhiteString.split(",")); + for(int i = 0 ; i < list.size() ; i++){ +// 遍历所有人员信息 + Map serviceBroker = list.get(i); + long departmentId; + if(serviceBroker.get("dept_id")!=null){ + departmentId = Long.parseLong(serviceBroker.get("dept_id").toString()); + V3xOrgDepartment orgDepartment = orgManager.getDepartmentById(departmentId); + if(orgDepartment==null){ + log.info(serviceBroker.get("name")+"查询部门为空,跳过处理"); + errorMap.put(serviceBroker.get("id")+"",serviceBroker.get("name")+"查询部门为空,跳过处理"); + continue; + } + serviceBroker.put("account_id","-9194677677107822293");//设置固定值营销门户ID +// 根据部门ID,查询部门主数据对象 + AddressBook departmentAddressBook = addressBookCustomerFieldInfoManager.getByMemberId(orgDepartment.getId()); +// 根据同步系统枚举字段 + if(departmentAddressBook!=null){ +// 获取部门同步系统自定义参数 + String xt = departmentAddressBook.getExtAttr31(); + if(StringUtil.isNotEmpty(xt) && !"-1".equals(xt)){ +// 获取部门同步系统数据值 + CtpEnumItem xtEnum = getEnumManagerNew().getCtpEnumItem(Long.parseLong(xt)); + String xtValue = xtEnum.getEnumvalue(); + if("1".equals(xtValue)||"3".equals(xtValue)||"5".equals(xtValue)||"6".equals(xtValue)){ + // 如果同步则检索岗位信息是否出现在黑名单 + if(postBlackStringList.contains(serviceBroker.get("post_id"))){ + errorMap.putAll(serviceBrokerSynchronization(serviceBroker,false,accessToken)); + }else{ +// 如果岗位不在黑名单中,设置新增逻辑。 + errorMap.putAll(serviceBrokerSynchronization(serviceBroker,true,accessToken)); + } + }else{ +// 如果人员不在白名单中则设置删除逻辑 + errorMap.putAll(serviceBrokerSynchronization(serviceBroker,false,accessToken)); + } + }else{ + errorMap.putAll(serviceBrokerSynchronization(serviceBroker,false,accessToken)); + } + }else{ + errorMap.putAll(serviceBrokerSynchronization(serviceBroker,false,accessToken)); + } + }else{ + log.info("当前人员档案中所属部门为空跳过处理"+serviceBroker.get("name")); + } + } + + return errorMap; + } + + public String dingdingSyncServiceBroker(String startDate) throws BusinessException, ApiException, ServiceException { + String res = ""; +// 根据上一次同步时间获取最新修改的单位信息 + List> serviceBrokers = archiveDao.getServiceBrokers(startDate); +// 根据列表查询生成列表部门对象 + Map errorMap = dingdingSyncServiceBroker(serviceBrokers); + log.info("业代异常数"+errorMap.size()); + for (Map.Entry entry : errorMap.entrySet()) { + String value = entry.getValue(); + res= res+value+";"; + } + return res ; + } + + public Map serviceBrokerSynchronization (Map serviceBroker ,boolean state,String accessToken) throws ApiException, ServiceException { + ConfigVo configVo = this.cstConfigApi.getConfig(this.getPluginId()); + FormExport formExport = new FormExport(); + Map from = new HashMap(); + from.put("同步类型", "业代/客户人员"); + from.put("同步时间", sdf.format(new Date())); + from.put("同步对象", serviceBroker.get("name").toString()); + from.put("主要信息", serviceBroker.toString()); + + Map errorMap = new HashMap<>(); + Map memberMap = new HashMap<>(); + if(serviceBroker.get("account_id")!=null){ + Map accountBinding = syncDdDao.getAccountBinding(serviceBroker.get("account_id").toString()); + if(accountBinding.size()==0){ + log.info("当前修改人员所在单位不在钉钉绑定表中跳过处理"); + errorMap.put(serviceBroker.get("id")+"",serviceBroker.get("name")+"当前修改人员所在单位不在钉钉绑定表中跳过处理"); + }else{ + if(serviceBroker.get("telnumber") == null){ + errorMap.put(serviceBroker.get("id")+"",serviceBroker.get("name")+"当前人员未维护手机号,同步失败。"); + return errorMap; + } + String telnumber = serviceBroker.get("telnumber").toString(); + log.info("查询当前人员是否在钉钉绑定表中是否存在"); +// 当前人员所在单位在钉钉绑定表中存在。 + Map memberBinding = syncDdDao.getMemberBinding(serviceBroker.get("id")+""); + serviceBroker.put("dd_member_id",memberBinding.get("dd_member_id")); + System.out.println("memberBinding.size()"+memberBinding.size()); + if(memberBinding.size()>0){ + if(state){ + if(telnumber.equals(memberBinding.get("dd_member_telnumber")!=null?memberBinding.get("dd_member_telnumber").toString():null)){ +// 手机号相同,执行修改 + log.info("当前人员在钉钉人员绑定表中存在,执行人员修改方法,修改钉钉中的人员信息,修改钉钉绑定关系"); + Map deptMap = syncDdDao.getDepartmentBinding(serviceBroker.get("dept_id").toString()); + if(deptMap!=null){ +// 首先查询一下当前人员在钉钉中存在如果存在则执行修改方法,如果不存在则执行新增方法 + String ddMember = DingdingProtUtil.userGet(serviceBroker.get("dd_member_id")+"",accessToken); + JSONObject ddMemberJson = JSONObject.parseObject(ddMember); +// String userid = ddMemberJson.getJSONObject("result").getString("userid"); + String errcode = ddMemberJson.getString("errcode"); +// 根据当前人员获取当前部门,并且通过部门ID获取钉钉部门ID + memberMap.put("deptId",deptMap.get("dd_department_id").toString()); + memberMap.put("telNumber",telnumber); + if("0".equals(errcode)){ +// 封装人员修改参数,执行人员修改方法 + OapiV2UserUpdateRequest req = DingdingProtUtil.getMemberUpdateParam(serviceBroker,memberMap); + String memberUpdate = DingdingProtUtil.memberUpdate(req,accessToken); + JSONObject memberUpdateJson = JSONObject.parseObject(memberUpdate); + if("0".equals(memberUpdateJson.getString("errcode"))){ + from.put("是否成功", "成功"); + from.put("同步结果","钉钉修改同步成功"); + }else{ + from.put("是否成功", "失败"); + from.put("同步结果",serviceBroker.get("name").toString()+memberUpdateJson.getString("errmsg")); +// 调用钉钉接口失败 + errorMap.put(serviceBroker.get("id")+"","钉钉同步人员失败:"+serviceBroker.get("name").toString()+memberUpdateJson.getString("errmsg")); + } + from.put("同步动作","修改"); + }else{ +// 调用工具类钉钉人员新建对象 + OapiV2UserCreateRequest req = DingdingProtUtil.getMemberCreateParam(serviceBroker,memberMap); + String memberCreate = DingdingProtUtil.memberCreate(req,accessToken); + JSONObject memberCreateJson = JSONObject.parseObject(memberCreate); + if("0".equals(memberCreateJson.getString("errcode")) ){ + from.put("是否成功", "成功"); + from.put("同步结果","钉钉新增同步成功"); + }else if ("40103".equals(memberCreateJson.getString("errcode"))){ + from.put("是否成功", "成功"); + from.put("同步结果",memberCreateJson.getString("errmsg")); + }else{ + from.put("是否成功", "失败"); + from.put("同步结果",serviceBroker.get("name")+memberCreateJson.getString("errmsg")); +// 调用钉钉接口失败 + errorMap.put(serviceBroker.get("id")+"","钉钉同步人员失败:"+serviceBroker.get("name")+memberCreateJson.getString("errmsg")); + } + from.put("同步动作","新增"); + } + }else{ + from.put("是否成功", "失败"); + from.put("同步结果","钉钉部门未同步成功,请先进行部门同步"); + from.put("同步动作","修改"); + } + }else{ + log.info("当前人员在钉钉人员绑定表不存在,执行人员新增方法,新增钉钉中的人员信息,新增钉钉绑定关系"); + Map deptMap = syncDdDao.getDepartmentBinding(serviceBroker.get("dept_id")+""); + if(deptMap!=null){ +// 根据当前人员获取当前部门,并且通过部门ID获取钉钉部门ID + memberMap.put("deptId",deptMap.get("dd_department_id").toString()); + memberMap.put("telNumber",telnumber); +// 调用工具类钉钉人员新建对象 + OapiV2UserCreateRequest req = DingdingProtUtil.getMemberCreateParam(serviceBroker,memberMap); + String memberCreate = DingdingProtUtil.memberCreate(req,accessToken); + JSONObject memberCreateJson = JSONObject.parseObject(memberCreate); + if("0".equals(memberCreateJson.getString("errcode")) ){ + from.put("是否成功", "成功"); + from.put("同步结果","钉钉新增同步成功"); +// 新增人员成功,新增绑定关系数据 + String ddMemberId = memberCreateJson.getJSONObject("result").getString("userid"); + int ii = syncDdDao.saveMemberBinding(serviceBroker.get("id")+"",serviceBroker.get("name").toString(),ddMemberId,serviceBroker.get("name").toString(),telnumber); + }else if ("40103".equals(memberCreateJson.getString("errcode"))){ + from.put("是否成功", "成功"); + from.put("同步结果",memberCreateJson.getString("errmsg")); + int ii = syncDdDao.saveMemberBinding(serviceBroker.get("id")+"",serviceBroker.get("name").toString(),serviceBroker.get("id")+"",serviceBroker.get("name").toString(),telnumber); + }else{ + from.put("是否成功", "失败"); + from.put("同步结果",serviceBroker.get("name")+memberCreateJson.getString("errmsg")); +// 调用钉钉接口失败 + errorMap.put(serviceBroker.get("id")+"","钉钉同步人员失败:"+serviceBroker.get("name")+memberCreateJson.getString("errmsg")); + } + from.put("同步动作","新增"); + }else{ + from.put("是否成功", "失败"); + from.put("同步结果","钉钉部门未同步成功,请先进行部门同步"); + from.put("同步动作","新增"); + } + } + }else{ + log.info(serviceBroker.toString()+"当前人员在钉钉人员绑定表中存在,当前人员已经停用执行删除造作"); +// 当前人员已经停用执行人员删除方法 + String memberDelete =DingdingProtUtil.memberDelete(memberBinding.get("dd_member_id").toString(),accessToken); + JSONObject memberDeleteJson = JSONObject.parseObject(memberDelete); + if("0".equals(memberDeleteJson.getString("errcode"))){ + from.put("是否成功", "成功"); + from.put("同步结果","钉钉删除同步成功"); + int ii = syncDdDao.deleteMemberBinding(serviceBroker.get("id")+""); + }else{ + from.put("是否成功", "失败"); + from.put("同步结果",serviceBroker.get("name")+memberDeleteJson.getString("errmsg")); + int ii = syncDdDao.deleteMemberBinding(serviceBroker.get("id")+""); +// 调用钉钉接口失败 + errorMap.put(serviceBroker.get("id")+"","钉钉人员同步失败"+serviceBroker.get("name")+memberDeleteJson.getString("errmsg")); + } + from.put("同步动作","删除"); + } + }else{ + if(state){ + log.info("当前人员在钉钉人员绑定表不存在,执行人员新增方法,新增钉钉中的人员信息,新增钉钉绑定关系"); + Map deptMap = syncDdDao.getDepartmentBinding(serviceBroker.get("dept_id")+""); + if(deptMap!=null){ +// 根据当前人员获取当前部门,并且通过部门ID获取钉钉部门ID + if(deptMap.size()==0){ + log.info(serviceBroker.get("name").toString()+"当前人员所在部门在绑定表不存在,跳过同步处理"); + from.put("是否成功", "失败"); + from.put("同步结果",serviceBroker.get("name").toString()+"当前人员所在部门在绑定表不存在,跳过同步处理"); + }else{ + memberMap.put("deptId",deptMap.get("dd_department_id").toString()); + memberMap.put("telNumber",telnumber); +// 调用工具类钉钉人员新建对象 + OapiV2UserCreateRequest req = DingdingProtUtil.getMemberCreateParam(serviceBroker,memberMap); + String memberCreate = DingdingProtUtil.memberCreate(req,accessToken); + JSONObject memberCreateJson = JSONObject.parseObject(memberCreate); + if("0".equals(memberCreateJson.getString("errcode")) ){ + from.put("是否成功", "成功"); + from.put("同步结果","钉钉新增同步成功"); +// 新增人员成功,新增绑定关系数据 + String ddMemberId = memberCreateJson.getJSONObject("result").getString("userid"); + int ii = syncDdDao.saveMemberBinding(serviceBroker.get("id")+"",serviceBroker.get("name").toString(),ddMemberId,serviceBroker.get("name").toString(),telnumber); + }else if ("40103".equals(memberCreateJson.getString("errcode"))){ + from.put("是否成功", "成功"); + from.put("同步结果",memberCreateJson.getString("errmsg")); + int ii = syncDdDao.saveMemberBinding(serviceBroker.get("id")+"",serviceBroker.get("name").toString(),serviceBroker.get("id")+"",serviceBroker.get("name").toString(),telnumber); + }else{ + from.put("是否成功", "成功"); + from.put("同步结果",serviceBroker.get("name")+memberCreateJson.getString("errmsg")); +// 调用钉钉接口失败 + errorMap.put(serviceBroker.get("id")+"","钉钉同步人员失败:"+serviceBroker.get("name")+memberCreateJson.getString("errmsg")); + } + from.put("同步动作","新增"); + } + }else{ + from.put("是否成功", "失败"); + from.put("同步结果","钉钉部门未同步成功,请先进行部门同步"); + from.put("同步动作","新增"); + } + }else{ + log.info(state+""+memberBinding+serviceBroker); + } + } + } + }else{ + log.info(serviceBroker.get("name")+"所在单位为空不进行同步"); + errorMap.put(serviceBroker.get("id").toString(),serviceBroker.get("name")+"所在单位为空不进行同步"); + } + List valueExports = formExportUtil.setFormValue(from); + formExport.setValues(valueExports); + if(StringUtil.isNotEmpty(from.get("同步动作"))){ + formFactory.importBusinessFormData(configVo.getParamVal(SyncConstants.dingdingLogloginName.name()), + configVo.getParamVal(SyncConstants.dingdingLog.name()), + formExport, new String[] {}); + } + return errorMap; + } + + public String dingdingSyncAllClientMembers() throws BusinessException, ApiException, ServiceException { + String res = ""; +// 根据上一次同步时间获取最新修改的单位信息 + List> incrementMembers = srcMemberDao.getAllClientMembers(); +// 根据列表查询生成列表部门对象 + Map errorMap = dingdingSyncBatchClientMemberMap(incrementMembers); + log.info("客户异常数"+errorMap.size()); + for (Map.Entry entry : errorMap.entrySet()) { + String value = entry.getValue(); + res= res+value+";"; + } + return res ; + } + + public String dingdingSyncBatchClientMember(String startDate) throws BusinessException, ApiException, ServiceException { + String res = ""; +// 根据上一次同步时间获取最新修改的单位信息 + List> incrementMembers = archiveDao.getClientMembersByModifyDate(startDate); +// 根据列表查询生成列表部门对象 + Map errorMap = dingdingSyncBatchClientMemberMap(incrementMembers); + log.info("客户异常数"+errorMap.size()); + for (Map.Entry entry : errorMap.entrySet()) { + String value = entry.getValue(); + res= res+value+";"; + } + return res ; + } + + public Map dingdingSyncBatchClientMemberMap (List> list) throws ApiException, BusinessException, ServiceException { + Map errorMap = new HashMap<>(); + ConfigVo configVo = this.cstConfigApi.getConfig(this.getPluginId()); +// 获取钉钉基础数据 + String dingdingAppKey = configVo.getParamVal(SyncConstants.dingdingAppKey.name()); + String dingdingAppSecret = configVo.getParamVal(SyncConstants.dingdingAppSecret.name()); + String accessToken = DingdingProtUtil.getToken(dingdingAppKey,dingdingAppSecret); +// 查询岗位黑名单 + List postBlackList = archiveDao.getPostBlackList(); + String postBlackString = ""; + for (String postBlack:postBlackList) { + postBlackString = postBlackString+ postBlack+ ","; + } + List postBlackStringList = Arrays.asList(postBlackString.split(",")); +// 查询人员白名单 + List memberWhiteList = archiveDao.getMemberWhiteList(); + String memberWhiteString = ""; + for (String memberWhite:memberWhiteList) { + memberWhiteString = memberWhiteString+ memberWhite+ ","; + } + List memberWhiteStringList = Arrays.asList(memberWhiteString.split(",")); + + for(Map memberMap: list){ + log.info( memberMap.toString() ); +// 根据当前人员获取人员档案表中的部门信息 + Map memberArchive = archiveDao.getMemberArchiveById(Long.parseLong(memberMap.get("id").toString())); + if(memberArchive.get("area_dept")==null) { + log.info(memberMap.get("name") + ":当前人员档案表中所属区域为空跳过同步"); + }else{ + V3xOrgDepartment orgDepartment = orgManager.getDepartmentById(Long.parseLong(memberArchive.get("area_dept").toString())); + if(orgDepartment==null){ + log.info(memberMap.get("name")+"查询部门为空,跳过处理"); + errorMap.put(memberMap.get("id").toString(),memberMap.get("name")+"查询部门为空,跳过处理"); + continue; + } +// 根据部门ID,查询部门主数据对象 + AddressBook departmentAddressBook = addressBookCustomerFieldInfoManager.getByMemberId(orgDepartment.getId()); +// 查询部门信息中的同步系统是否选择有钉钉 + if(departmentAddressBook!=null){ +// 获取部门同步系统自定义参数 + String xt = departmentAddressBook.getExtAttr31(); + if(StringUtil.isNotEmpty(xt) && !"-1".equals(xt)){ +// 获取部门同步系统数据值 + CtpEnumItem xtEnum = getEnumManagerNew().getCtpEnumItem(Long.parseLong(xt)); + String xtValue = xtEnum.getEnumvalue(); + if("1".equals(xtValue)||"3".equals(xtValue)||"5".equals(xtValue)||"6".equals(xtValue)){ +// 如果同步则检索岗位信息是否出现在黑名单 + if(postBlackStringList.contains(memberMap.get("org_post_id"))){ +// 判断是否在人员白名单中存在 + if(memberWhiteStringList.contains(memberMap.get("id"))){ +// 存在人员白名单,执行人员新增方法 + errorMap.putAll(serviceBrokerSynchronization(memberMap,true,accessToken)); + }else{ + errorMap.putAll(serviceBrokerSynchronization(memberMap,false,accessToken)); + } + }else{ +// 如果岗位不在黑名单中,设置新增逻辑。 + errorMap.putAll(serviceBrokerSynchronization(memberMap,true,accessToken)); + } + }else{ +// 如果人员不在白名单中则设置删除逻辑 + errorMap.putAll(serviceBrokerSynchronization(memberMap,false,accessToken)); + } + }else{ + errorMap.putAll(serviceBrokerSynchronization(memberMap,false,accessToken)); + } + }else{ + errorMap.putAll(serviceBrokerSynchronization(memberMap,false,accessToken)); + } + } + } + return errorMap; + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/server/OrganizationOrgFlowSyncServer.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/server/OrganizationOrgFlowSyncServer.java new file mode 100644 index 0000000..0acde3f --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/server/OrganizationOrgFlowSyncServer.java @@ -0,0 +1,505 @@ +package com.seeyon.apps.src_mainorganization.server; + +import cn.hutool.log.Log; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.common.plugin.vo.ConfigVo; +import com.seeyon.apps.src_mainorganization.bo.ThirdDeptBo; +import com.seeyon.apps.src_mainorganization.bo.ThirdLevelBo; +import com.seeyon.apps.src_mainorganization.bo.ThirdMemberBo; +import com.seeyon.apps.src_mainorganization.bo.ThirdPostBo; +import com.seeyon.apps.src_mainorganization.constans.SyncConstants; +import com.seeyon.apps.src_mainorganization.dao.ISyncFvDao; +import com.seeyon.apps.src_mainorganization.util.ProtUtil; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.organization.bo.*; +import com.seeyon.ctp.organization.manager.OrgManager; +import www.seeyon.com.utils.StringUtil; + +import javax.inject.Inject; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class OrganizationOrgFlowSyncServer{ + + private static Log log = Log.get(OrganizationOrgFlowSyncServer.class); + @Inject + private ICstConfigApi cstConfigApi; + @Inject + private OrgManager orgManager; + @Inject + private ISyncFvDao syncFvDao; + + public String getPluginId() { + return SyncConstants.getPluginId(); + } + + public String getToken(){ + ConfigVo configVo = this.cstConfigApi.getConfig(this.getPluginId()); + String goalTokenUrl = configVo.getParamVal(SyncConstants.flowurl.name())+ + configVo.getParamVal(SyncConstants.getTokenUrl.name())+ + configVo.getParamVal(SyncConstants.flowRestUserName.name())+"/"+ + configVo.getParamVal(SyncConstants.flowRestPassword.name()); + String loginName = configVo.getParamVal(SyncConstants.flowLoginName.name()); +// 获取目标源TOKEN + String goalToken = ProtUtil.getToken(goalTokenUrl,loginName); + log.info("调用接口查询token"+goalTokenUrl+"当前token为"+goalToken); + return goalToken; + } + + // 获取本地环境token + public String getLocalToken(){ + ConfigVo configVo = this.cstConfigApi.getConfig(this.getPluginId()); + String goalTokenUrl = configVo.getParamVal(SyncConstants.localurl.name())+ + configVo.getParamVal(SyncConstants.getTokenUrl.name())+ + configVo.getParamVal(SyncConstants.localRestUserName.name())+"/"+ + configVo.getParamVal(SyncConstants.localRestPassword.name()); + String loginName = configVo.getParamVal(SyncConstants.localLoginName.name()); +// 获取目标源TOKEN + String goalToken = ProtUtil.getToken(goalTokenUrl,loginName); + log.info("调用接口查询token"+goalTokenUrl+"当前token为"+goalToken); + return goalToken; + } + + // 流程平台单位同步 + public Map flowSyncBatchAccount (List list){ + ConfigVo configVo = this.cstConfigApi.getConfig(this.getPluginId()); + String goalToken = getToken(); + Map errorMap = new HashMap<>(); + + List thirdDeparts = list.stream().map((account) -> { + return new ThirdDeptBo( account); + }).collect(Collectors.toList()); + log.info("遍历转换后的单位参数"); + for(int i = 0; i < thirdDeparts.size(); ++i) { + ThirdDeptBo thirdDepart = thirdDeparts.get(i); + log.info(thirdDepart.getName() + thirdDepart.getCode() + thirdDepart.getId()); +// 同步单位单位信息,同步流程平台,检查流程平台是否存在 + long accountId = thirdDepart.getId(); +// 根据单位ID查询单位是否存在 + String getAccountUrl = configVo.getParamVal(SyncConstants.flowurl.name())+ + configVo.getParamVal(SyncConstants.getAccountUrl.name())+accountId+ + "?token="+ goalToken; + String account = ProtUtil.doGet(getAccountUrl); + log.info("调用接口查询当前单位是否存在当前查询url为:"+getAccountUrl); + log.info("查询结果为:"+account); +// 流程平台存在单位信息。进行单位修改 + JSONObject addOrUpdateParam = new JSONObject(); + addOrUpdateParam.put("id",accountId); + addOrUpdateParam.put("orgAccountId",accountId); + addOrUpdateParam.put("name",thirdDepart.getName()); + addOrUpdateParam.put("code",thirdDepart.getCode()); + addOrUpdateParam.put("superior",thirdDepart.getSuperior()); + addOrUpdateParam.put("status",thirdDepart.getStatus()); + addOrUpdateParam.put("isDeleted",thirdDepart.getIsDeleted()); + addOrUpdateParam.put("enabled",thirdDepart.getEnabled()); + addOrUpdateParam.put("sortId",thirdDepart.getSortId()); + addOrUpdateParam.put("shortName",thirdDepart.getShortName()); + + String addOrUpdateAccountUrl = configVo.getParamVal(SyncConstants.flowurl.name())+ + configVo.getParamVal(SyncConstants.addOrUpdateAccountUrl.name())+ + "?token="+ goalToken; + log.info("当前单位请求url:"+addOrUpdateAccountUrl); + if(StringUtil.isNotEmpty(account) && !"null".equals(account)){ + log.info("当前单位已经存在,执行put请求,请求参数为:"+addOrUpdateParam); +// String isUpdate = ProtUtil.callPutApi(addOrUpdateAccountUrl,addOrUpdateParam.toString()); + String isUpdate = ProtUtil.httpPutRaw(addOrUpdateAccountUrl,addOrUpdateParam.toString(),new HashMap(),null); + log.info("返回结果为:"+isUpdate); + JSONObject isUpdateJson = JSONObject.parseObject(isUpdate); + if(!isUpdateJson.getBoolean("success")){ + JSONArray errorMsgInfos = isUpdateJson.getJSONArray("errorMsgInfos"); + JSONObject errorMsgInfo = errorMsgInfos.getJSONObject(0); + String msgInfo = errorMsgInfo.getString("msgInfo"); + errorMap.put(accountId+"","流程平台修改单位失败:"+thirdDepart.getName()+msgInfo); + } + }else{ + JSONArray admins = new JSONArray(); + admins.add(new JSONObject()); + addOrUpdateParam.put("admin",admins); + // 流程平台不存在单位信息。进行单位新增 + log.info("当前单位不存在,执行post,请求参数为:"+addOrUpdateParam); + String isAdd = ProtUtil.doPost(addOrUpdateParam.toString(),addOrUpdateAccountUrl); + log.info("返回结果为:"+isAdd); + JSONObject isAddJson = JSONObject.parseObject(isAdd); + if(!isAddJson.getBoolean("success")){ + JSONArray errorMsgInfos = isAddJson.getJSONArray("errorMsgInfos"); + JSONObject errorMsgInfo = errorMsgInfos.getJSONObject(0); + String msgInfo = errorMsgInfo.getString("msgInfo"); + errorMap.put(accountId+"","流程平台新增单位失败:"+thirdDepart.getName()+msgInfo); + } + } + } + return errorMap; + } + + + // 流程平台部门同步 + public Map flowSyncBatchDepartment (List list) throws BusinessException { + ConfigVo configVo = this.cstConfigApi.getConfig(this.getPluginId()); + String goalToken = getToken(); + Map errorMap = new HashMap<>(); + + List thirdDeparts = list.stream().map((account) -> { + return new ThirdDeptBo( account); + }).collect(Collectors.toList()); + log.info("遍历转换后的部门参数"); + for(int i = 0; i < thirdDeparts.size(); ++i) { + ThirdDeptBo thirdDepart = thirdDeparts.get(i); + log.info(thirdDepart.getName() + thirdDepart.getCode() + thirdDepart.getId()); +// 同步单位单位信息,同步流程平台,检查流程平台是否存在 + long deptId = thirdDepart.getId(); +// 根据单位ID查询单位是否存在 + String getDeptUrl = configVo.getParamVal(SyncConstants.flowurl.name())+ + configVo.getParamVal(SyncConstants.getDeptUrl.name())+deptId+ + "?token="+ goalToken; + String dept = ProtUtil.doGet(getDeptUrl); + log.info("调用接口查询当前部门是否存在当前查询url为:"+getDeptUrl); + log.info("查询结果为:"+dept); + JSONObject addOrUpdateParam = new JSONObject(); + addOrUpdateParam.put("id",deptId); + addOrUpdateParam.put("name",thirdDepart.getName()); + addOrUpdateParam.put("code",thirdDepart.getCode()); + addOrUpdateParam.put("superior",thirdDepart.getSuperior()); + addOrUpdateParam.put("status",thirdDepart.getStatus()); + addOrUpdateParam.put("isDeleted",thirdDepart.getIsDeleted()); + addOrUpdateParam.put("enabled",thirdDepart.getEnabled()); + addOrUpdateParam.put("sortId",thirdDepart.getSortId()); + addOrUpdateParam.put("shortName",thirdDepart.getShortName()); + addOrUpdateParam.put("orgAccountId",thirdDepart.getOrgAccountId()); + if(thirdDepart.getOrgAccountId()==thirdDepart.getSuperior()){ + V3xOrgAccount superAccount = orgManager.getAccountById(thirdDepart.getSuperior()); + addOrUpdateParam.put("superiorName",superAccount.getName()); + }else{ + V3xOrgDepartment superDept = orgManager.getDepartmentById(thirdDepart.getSuperior()); + addOrUpdateParam.put("superiorName",superDept.getName()); + } + String addOrUpdateDeptUrl = configVo.getParamVal(SyncConstants.flowurl.name())+ + configVo.getParamVal(SyncConstants.addOrUpdateDeptUrl.name())+ + "?token="+ goalToken; + log.info("当前部门请求url:"+addOrUpdateDeptUrl); + if(StringUtil.isNotEmpty(dept) && !"null".equals(dept)){ +// 流程平台存在单位信息。进行单位修改 + log.info("当前部门已经存在,执行put请求,请求参数为:"+addOrUpdateParam); + String isUpdate = ProtUtil.httpPutRaw(addOrUpdateDeptUrl,addOrUpdateParam.toString(),new HashMap(),null); + log.info("返回结果为:"+isUpdate); + JSONObject isUpdateJson = JSONObject.parseObject(isUpdate); + if(!isUpdateJson.getBoolean("success")){ + JSONArray errorMsgInfos = isUpdateJson.getJSONArray("errorMsgInfos"); + JSONObject errorMsgInfo = errorMsgInfos.getJSONObject(0); + String msgInfo = errorMsgInfo.getString("msgInfo"); + errorMap.put(deptId+"","流程平台修改部门失败:"+thirdDepart.getName()+msgInfo); + } + }else{ +// 流程平台不存在部门信息。进行部门新增 + log.info("当前部门不存在,执行post,请求参数为:"+addOrUpdateParam); + String isAdd = ProtUtil.doPost(addOrUpdateParam.toString(),addOrUpdateDeptUrl); + log.info("返回结果为:"+isAdd); + JSONObject isAddJson = JSONObject.parseObject(isAdd); + if(!isAddJson.getBoolean("success")){ + JSONArray errorMsgInfos = isAddJson.getJSONArray("errorMsgInfos"); + JSONObject errorMsgInfo = errorMsgInfos.getJSONObject(0); + String msgInfo = errorMsgInfo.getString("msgInfo"); + errorMap.put(deptId+"","流程平台新增部门失败:"+thirdDepart.getName()+msgInfo); + } + } + Map errorMapRole = flowSyncBatchDepartmentRole(thirdDepart,goalToken); + errorMap.putAll(errorMapRole); + } + return errorMap; + } + +// 流程平台部门角色同步 + public Map flowSyncBatchDepartmentRole(ThirdDeptBo thirdDepart,String token) throws BusinessException { + ConfigVo configVo = this.cstConfigApi.getConfig(this.getPluginId()); + Map errorMap = new HashMap<>(); + V3xOrgDepartment v3xOrgDepartment = orgManager.getDepartmentById(thirdDepart.getId()); +// 获取当前部门的单位ID和部门ID + long deptId = v3xOrgDepartment.getId(); + long accountId = v3xOrgDepartment.getOrgAccountId(); +// 调用get获取当前部门的部门角色人员信息 + String getDepartmentmanagerinfoUrl = + configVo.getParamVal(SyncConstants.localurl.name())+configVo.getParamVal(SyncConstants.getDepartmentmanagerinfoUrl.name())+ + deptId+"/"+accountId+"?token="+getLocalToken(); + String result = ProtUtil.doGet(getDepartmentmanagerinfoUrl); + log.info("请求地址:"+getDepartmentmanagerinfoUrl); + if(StringUtil.isEmpty(result)){ + errorMap.put(deptId+"","流程平台新增部门角色变更失败:"+thirdDepart.getName()+"部门角色查询为空"); + return errorMap; + } + JSONObject resultJjson = JSONObject.parseObject(result); + JSONObject addParam = new JSONObject(); + addParam.put("orgAccountId",resultJjson.getString("orgAccountId")); + addParam.put("id",resultJjson.getString("id")); + for (String key : resultJjson.keySet()) { + if(key.startsWith("deptrole")){ + System.out.println(key+":"+resultJjson.getString(key)); + String value = resultJjson.getString(key); + if(!"{}".equals(value)){ + JSONObject deptrolejson = JSONObject.parseObject(value); + String deptrolevalue = deptrolejson.getString("value"); + addParam.put(key,deptrolevalue); + }else{ + addParam.put(key,""); + } + } + } + String updateDepartmentmanagerinfoUrl = + configVo.getParamVal(SyncConstants.flowurl.name())+ + configVo.getParamVal(SyncConstants.updateDepartmentmanagerinfoUrl.name())+ + "?token="+getToken(); + log.info(updateDepartmentmanagerinfoUrl+"请求参数:"+addParam.toString()); + String updateDeptRoleres = ProtUtil.httpPutRaw(updateDepartmentmanagerinfoUrl , addParam.toString(),new HashMap<>(),null); + if(StringUtil.isEmpty(updateDeptRoleres)){ + errorMap.put(deptId+"","流程平台新增部门角色变更失败:"+thirdDepart.getName()+"部门角色变更返回结果为空"); + return errorMap; + } + JSONObject updateDeptRoleresJson = JSONObject.parseObject(updateDeptRoleres); + return errorMap; + } + + + // 流程平台岗位同步 + public Map flowSyncBatchPost (List list){ + ConfigVo configVo = this.cstConfigApi.getConfig(this.getPluginId()); + String goalToken = getToken(); + Map errorMap = new HashMap<>(); + List thirdPosts = list.stream().map((post) -> { + return new ThirdPostBo(post); + }).collect(Collectors.toList()); + log.info("遍历转换后的岗位参数"); + for(int i = 0; i < thirdPosts.size(); ++i) { + ThirdPostBo thirdPost = thirdPosts.get(i); + log.info(thirdPost.getName() + thirdPost.getCode() + thirdPost.getId()); +// 同步单位单位信息,同步流程平台,检查流程平台是否存在 + long postId = thirdPost.getId(); +// 根据单位ID查询单位是否存在 + String getPostUrl = configVo.getParamVal(SyncConstants.flowurl.name())+ + configVo.getParamVal(SyncConstants.getPostUrl.name())+postId+ + "?token="+ goalToken; + String post = ProtUtil.doGet(getPostUrl); + log.info("调用接口查询当前部门是否存在当前查询url为:"+getPostUrl); + log.info("查询结果为:"+post); + JSONObject addOrUpdateParam = new JSONObject(); + addOrUpdateParam.put("id",postId); + addOrUpdateParam.put("name",thirdPost.getName()); + addOrUpdateParam.put("code",thirdPost.getCode()); + addOrUpdateParam.put("isDeleted",thirdPost.getIsDeleted()); + addOrUpdateParam.put("enabled",thirdPost.getEnabled()); + addOrUpdateParam.put("sortId",thirdPost.getSortId()); + addOrUpdateParam.put("orgAccountId",thirdPost.getOrgAccountId()); + addOrUpdateParam.put("status",thirdPost.getStatus()); + addOrUpdateParam.put("description",thirdPost.getDescription()); + addOrUpdateParam.put("typeId",thirdPost.getTypeId()); + addOrUpdateParam.put("valid",thirdPost.isValid()); + addOrUpdateParam.put("entityType",thirdPost.getEntityType()); + String addOrUpdatePostUrl = configVo.getParamVal(SyncConstants.flowurl.name())+ + configVo.getParamVal(SyncConstants.addOrUpdatePostUrl.name())+ + "?token="+ goalToken; + log.info("当前岗位请求url:"+addOrUpdatePostUrl); + if(StringUtil.isNotEmpty(post) && !"null".equals(post)){ +// 流程平台存在单位信息。进行单位修改 + log.info("当前岗位已经存在,执行put请求,请求参数为:"+addOrUpdateParam); + String isUpdate = ProtUtil.httpPutRaw(addOrUpdatePostUrl,addOrUpdateParam.toString(),new HashMap(),null); + log.info("返回结果为:"+isUpdate); + JSONObject isUpdateJson = JSONObject.parseObject(isUpdate); + if(!isUpdateJson.getBoolean("success")){ + JSONArray errorMsgInfos = isUpdateJson.getJSONArray("errorMsgInfos"); + JSONObject errorMsgInfo = errorMsgInfos.getJSONObject(0); + String msgInfo = errorMsgInfo.getString("msgInfo"); + errorMap.put(postId+"","流程平台修改岗位失败:"+thirdPost.getName()+msgInfo); + } + }else{ + // 流程平台不存在部门信息。进行部门新增 + log.info("当前岗位不存在,执行post,请求参数为:"+addOrUpdateParam); + String isAdd = ProtUtil.doPost(addOrUpdateParam.toString(),addOrUpdatePostUrl); + log.info("返回结果为:"+isAdd); + JSONObject isAddJson = JSONObject.parseObject(isAdd); + if(!isAddJson.getBoolean("success")){ + JSONArray errorMsgInfos = isAddJson.getJSONArray("errorMsgInfos"); + JSONObject errorMsgInfo = errorMsgInfos.getJSONObject(0); + String msgInfo = errorMsgInfo.getString("msgInfo"); + errorMap.put(postId+"","流程平台新增岗位失败:"+thirdPost.getName()+msgInfo); + } + } + } + return errorMap; + } + + // 流程平台职务级别同步 + public Map flowSyncBatchLevel(List list){ + ConfigVo configVo = this.cstConfigApi.getConfig(this.getPluginId()); + String goalToken = getToken(); + Map errorMap = new HashMap<>(); + List thirdLevels = list.stream().map((level) -> { + return new ThirdLevelBo(level); + }).collect(Collectors.toList()); + log.info("遍历转换后的岗位参数"); + for(int i = 0; i < thirdLevels.size(); ++i) { + ThirdLevelBo thirdLevel = thirdLevels.get(i); + log.info(thirdLevel.getName() + thirdLevel.getCode() + thirdLevel.getId()); +// 同步单位单位信息,同步流程平台,检查流程平台是否存在 + long levelId = thirdLevel.getId(); +// 根据单位ID查询单位是否存在 + String getLevelUrl = configVo.getParamVal(SyncConstants.flowurl.name())+ + configVo.getParamVal(SyncConstants.getLevelUrl.name())+levelId+ + "?token="+ goalToken; + String level = ProtUtil.doGet(getLevelUrl); + log.info("调用接口查询当前部门是否存在当前查询url为:"+getLevelUrl); + log.info("查询结果为:"+level); + JSONObject addOrUpdateParam = new JSONObject(); + addOrUpdateParam.put("id",levelId); + addOrUpdateParam.put("name",thirdLevel.getName()); + addOrUpdateParam.put("code",thirdLevel.getCode()); + addOrUpdateParam.put("isDeleted",thirdLevel.getIsDeleted()); + addOrUpdateParam.put("enabled",thirdLevel.getEnabled()); + addOrUpdateParam.put("sortId",thirdLevel.getSortId()); + addOrUpdateParam.put("orgAccountId",thirdLevel.getOrgAccountId()); + addOrUpdateParam.put("status",thirdLevel.getStatus()); + addOrUpdateParam.put("description",thirdLevel.getDescription()); + String addOrUpdateLevelUrl = configVo.getParamVal(SyncConstants.flowurl.name())+ + configVo.getParamVal(SyncConstants.addOrUpdateLevelUrl.name())+ + "?token="+ goalToken; + log.info("当前职务级别请求url:"+addOrUpdateLevelUrl); + if(StringUtil.isNotEmpty(level) && !"null".equals(level)){ +// 流程平台存在单位信息。进行单位修改 + log.info("当前职务级别已经存在,执行put请求,请求参数为:"+addOrUpdateParam); + String isUpdate = ProtUtil.httpPutRaw(addOrUpdateLevelUrl,addOrUpdateParam.toString(),new HashMap<>(),null); + log.info("返回结果为:"+isUpdate); + JSONObject isUpdateJson = JSONObject.parseObject(isUpdate); + if(!isUpdateJson.getBoolean("success")){ + JSONArray errorMsgInfos = isUpdateJson.getJSONArray("errorMsgInfos"); + JSONObject errorMsgInfo = errorMsgInfos.getJSONObject(0); + String msgInfo = errorMsgInfo.getString("msgInfo"); + errorMap.put(levelId+"","流程平台修改职务级别失败:"+thirdLevel.getName()+msgInfo); + } + }else{ +// 流程平台不存在部门信息。进行部门新增 + log.info("当前岗位不存在,执行post,请求参数为:"+addOrUpdateParam); + String isAdd = ProtUtil.doPost(addOrUpdateParam.toString(),addOrUpdateLevelUrl); + log.info("返回结果为:"+isAdd); + JSONObject isAddJson = JSONObject.parseObject(isAdd); + if(!isAddJson.getBoolean("success")){ + JSONArray errorMsgInfos = isAddJson.getJSONArray("errorMsgInfos"); + JSONObject errorMsgInfo = errorMsgInfos.getJSONObject(0); + String msgInfo = errorMsgInfo.getString("msgInfo"); + errorMap.put(levelId+"","流程平台新增职务级别失败:"+thirdLevel.getName()+msgInfo); + } + } + } + return errorMap; + } + + + + // 流程平台人员同步 + public Map flowSyncBatchMember (List list) throws InterruptedException { + ConfigVo configVo = this.cstConfigApi.getConfig(this.getPluginId()); +// 获取本系统参数 + String localurl = configVo.getParamVal(SyncConstants.localurl.name()); + String goalToken = getToken(); + Map errorMap = new HashMap<>(); + List thirdMembers = list.stream().map((member) -> { + ThirdMemberBo thirdMember = null; + try { +// 由于系统方法文件改用接口的方式获取人员副岗信息 +// 获取当前人员ID信息 + long memberId = member.getId(); +// 调用当前系统人员查询接口,获取人员信息对象 + String getMemberUrl = localurl+configVo.getParamVal(SyncConstants.getMemberUrl.name())+memberId+"?token="+getLocalToken(); + String res = ProtUtil.doGet(getMemberUrl); +// 解析数据 + JSONObject resJson = JSONObject.parseObject(res); +// 在当前人员信息对象中查询副岗信息列表 + JSONArray secondPosts = resJson.getJSONArray("second_post"); +// 将此信息列表封装成list对象 + List memberPostList = new ArrayList<>(); + for(int i = 0 ; i < secondPosts.size() ;i ++){ + MemberPost memberPost = new MemberPost(); + JSONObject secondPost = secondPosts.getJSONObject(i); + memberPost.setPostId(Long.parseLong(secondPost.getString("postId"))); + memberPost.setOrgAccountId(Long.parseLong(secondPost.getString("orgAccountId"))); + memberPost.setDepId(Long.parseLong(secondPost.getString("depId"))); + memberPost.setMemberId(Long.parseLong(secondPost.getString("memberId"))); + memberPostList.add(memberPost); + } +// 传递参数生成封装数据 + thirdMember = new ThirdMemberBo(member,memberPostList); + return thirdMember; + } catch (BusinessException e) { + e.printStackTrace(); + } + return thirdMember; + }).collect(Collectors.toList()); + log.info("遍历转换后的岗位参数"); + for(int i = 0; i < thirdMembers.size(); ++i) { + ThirdMemberBo thirdMember = thirdMembers.get(i); + log.info(thirdMember.getName() + thirdMember.getCode() + thirdMember.getId()); + for(int n = 0 ;n < 4 ; n++){ + Map memeberMap = syncFvDao.queryMemberArchiveByMemberId(thirdMember.getId()+""); + if(memeberMap==null) { + log.info("人员档案不存在等待5秒后再次执行" + "当前执行次数" + n + 1); + Thread.sleep(5000); + continue; + }else{ +// 同步单位单位信息,同步流程平台,检查流程平台是否存在 + long memberId = thirdMember.getId(); +// 根据单位ID查询单位是否存在 + String getMemberUrl = configVo.getParamVal(SyncConstants.flowurl.name())+ + configVo.getParamVal(SyncConstants.getMemberUrl.name())+memberId+ + "?token="+ goalToken; + String member = ProtUtil.doGet(getMemberUrl); + log.info("调用接口查询当前部门是否存在当前查询url为:"+getMemberUrl); + log.info("查询结果为:"+member); + JSONObject addOrUpdateParam = new JSONObject(); + addOrUpdateParam.put("id",memberId); + addOrUpdateParam.put("orgAccountId",thirdMember.getOrgAccountId()); + addOrUpdateParam.put("name",thirdMember.getName()); + addOrUpdateParam.put("code",thirdMember.getCode()); + addOrUpdateParam.put("orgDepartmentId",thirdMember.getDeptId()); + addOrUpdateParam.put("orgPostId",thirdMember.getPostId()); + addOrUpdateParam.put("orgLevelId",thirdMember.getLevelId()); + addOrUpdateParam.put("loginName",thirdMember.getLoginName()); + addOrUpdateParam.put("state",thirdMember.getState()); + addOrUpdateParam.put("isDeleted",thirdMember.isDeleted()); + addOrUpdateParam.put("enabled",thirdMember.isEnabled()); + addOrUpdateParam.put("type",thirdMember.getType()); + addOrUpdateParam.put("second_post",thirdMember.getSecondPosts()); + String addOrUpdateMemberUrl = configVo.getParamVal(SyncConstants.flowurl.name())+ + configVo.getParamVal(SyncConstants.addOrUpdateMemberUrl.name())+ + "?token="+ goalToken; + log.info("当前人员请求url:"+addOrUpdateMemberUrl); + if(StringUtil.isNotEmpty(member) && !"null".equals(member)){ +// 流程平台存在单位信息。进行单位修改 + log.info("当前人员已经存在,执行put请求,请求参数为:"+addOrUpdateParam); + String isUpdate = ProtUtil.httpPutRaw(addOrUpdateMemberUrl,addOrUpdateParam.toString(),new HashMap<>(),null); + log.info("返回结果为:"+isUpdate); + JSONObject isUpdateJson = JSONObject.parseObject(isUpdate); + if(!isUpdateJson.getBoolean("success")){ + JSONArray errorMsgInfos = isUpdateJson.getJSONArray("errorMsgInfos"); + JSONObject errorMsgInfo = errorMsgInfos.getJSONObject(0); + String msgInfo = errorMsgInfo.getString("msgInfo"); + errorMap.put(memberId+"","流程平台修改人员失败:"+thirdMember.getName()+msgInfo); + } + }else{ +// 流程平台不存在部门信息。进行部门新增 + log.info("当前人员不存在,执行post,请求参数为:"+addOrUpdateParam); + String isAdd = ProtUtil.doPost(addOrUpdateParam.toString(),addOrUpdateMemberUrl); + log.info("返回结果为:"+isAdd); + JSONObject isAddJson = JSONObject.parseObject(isAdd); + if(!isAddJson.getBoolean("success")){ + JSONArray errorMsgInfos = isAddJson.getJSONArray("errorMsgInfos"); + JSONObject errorMsgInfo = errorMsgInfos.getJSONObject(0); + String msgInfo = errorMsgInfo.getString("msgInfo"); + errorMap.put(memberId+"","流程平台新增人员失败:"+thirdMember.getName()+msgInfo); + } + } + } + } + } + return errorMap; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/server/OrganizationOrgGroupSyncServer.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/server/OrganizationOrgGroupSyncServer.java new file mode 100644 index 0000000..71a3a9e --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/server/OrganizationOrgGroupSyncServer.java @@ -0,0 +1,747 @@ +package com.seeyon.apps.src_mainorganization.server; + +import cn.hutool.log.Log; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.addressbook.manager.AddressBookCustomerFieldInfoManager; +import com.seeyon.apps.addressbook.po.AddressBook; +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.common.plugin.vo.ConfigVo; +import com.seeyon.apps.src_mainorganization.bo.ThirdDeptBo; +import com.seeyon.apps.src_mainorganization.bo.ThirdLevelBo; +import com.seeyon.apps.src_mainorganization.bo.ThirdMemberBo; +import com.seeyon.apps.src_mainorganization.bo.ThirdPostBo; +import com.seeyon.apps.src_mainorganization.constans.SyncConstants; +import com.seeyon.apps.src_mainorganization.dao.ISyncFvDao; +import com.seeyon.apps.src_mainorganization.util.ProtUtil; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.ctpenumnew.manager.EnumManager; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.common.po.ctpenumnew.CtpEnumItem; +import com.seeyon.ctp.organization.bo.*; +import com.seeyon.ctp.organization.manager.OrgManager; +import www.seeyon.com.utils.StringUtil; + +import javax.inject.Inject; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class OrganizationOrgGroupSyncServer { + + private static Log log = Log.get(OrganizationOrgGroupSyncServer.class); + private EnumManager enumManagerNew; + + public void setEnumManagerNew(EnumManager enumManagerNew) { + this.enumManagerNew = enumManagerNew; + } + + public EnumManager getEnumManagerNew() { + if (enumManagerNew == null) { + enumManagerNew = (EnumManager) AppContext.getBean("enumManagerNew"); + } + return enumManagerNew; + } + @Inject + private ICstConfigApi cstConfigApi; + @Inject + private OrgManager orgManager; + @Inject + private ISyncFvDao syncFvDao; + @Inject + private AddressBookCustomerFieldInfoManager addressBookCustomerFieldInfoManager; + + public String getPluginId() { + return SyncConstants.getPluginId(); + } + +//获取目标环境token + public String getToken(){ + ConfigVo configVo = this.cstConfigApi.getConfig(this.getPluginId()); + String goalTokenUrl = configVo.getParamVal(SyncConstants.groupurl.name())+ + configVo.getParamVal(SyncConstants.getTokenUrl.name())+ + configVo.getParamVal(SyncConstants.groupRestUserName.name())+"/"+ + configVo.getParamVal(SyncConstants.groupRestPassword.name()); + String loginName = configVo.getParamVal(SyncConstants.groupLoginName.name()); +// 获取目标源TOKEN + String goalToken = ProtUtil.getToken(goalTokenUrl,loginName); + log.info("调用接口查询token"+goalTokenUrl+"当前token为"+goalToken); + return goalToken; + } + +// 获取本地环境token + public String getLocalToken(){ + ConfigVo configVo = this.cstConfigApi.getConfig(this.getPluginId()); + String goalTokenUrl = configVo.getParamVal(SyncConstants.localurl.name())+ + configVo.getParamVal(SyncConstants.getTokenUrl.name())+ + configVo.getParamVal(SyncConstants.localRestUserName.name())+"/"+ + configVo.getParamVal(SyncConstants.localRestPassword.name()); + String loginName = configVo.getParamVal(SyncConstants.localLoginName.name()); +// 获取目标源TOKEN + String goalToken = ProtUtil.getToken(goalTokenUrl,loginName); + log.info("调用接口查询token"+goalTokenUrl+"当前token为"+goalToken); + return goalToken; + } + + // 集团协同平台单位同步 + public Map groupSyncBatchAccount (List list){ + ConfigVo configVo = this.cstConfigApi.getConfig(this.getPluginId()); + String goalToken = getToken(); + Map errorMap = new HashMap<>(); + log.info("执行数据筛选,只处理非客户单位下的所有单位信息"); + List thirdDeparts = list.stream().filter((account) -> { + String path = account.getPath(); + return !(path.startsWith("00000017")||path.equals("0000")||path.startsWith("00000002")); + }).map((account) -> { + return new ThirdDeptBo(account); + }).collect(Collectors.toList()); + + log.info("遍历转换后的单位参数"); + for(int i = 0; i < thirdDeparts.size(); ++i) { + ThirdDeptBo thirdDepart = thirdDeparts.get(i); + log.info(thirdDepart.getName() + thirdDepart.getCode() + thirdDepart.getId()); +// 同步单位单位信息,同步集团协同平台,检查集团协同平台是否存在 + long accountId = thirdDepart.getId(); +// 根据单位ID查询单位是否存在 + String getAccountUrl = configVo.getParamVal(SyncConstants.groupurl.name())+ + configVo.getParamVal(SyncConstants.getAccountUrl.name())+accountId+ + "?token="+ goalToken; + String account = ProtUtil.doGet(getAccountUrl); + log.info("调用接口查询当前单位是否存在当前查询url为:"+getAccountUrl); + log.info("查询结果为:"+account); +// 集团协同平台存在单位信息。进行单位修改 + JSONObject addOrUpdateParam = new JSONObject(); + addOrUpdateParam.put("id",accountId); + addOrUpdateParam.put("orgAccountId",accountId); + addOrUpdateParam.put("name",thirdDepart.getName()); + addOrUpdateParam.put("code",thirdDepart.getCode()); + addOrUpdateParam.put("superior",thirdDepart.getSuperior()); + addOrUpdateParam.put("status",thirdDepart.getStatus()); + addOrUpdateParam.put("isDeleted",thirdDepart.getIsDeleted()); + addOrUpdateParam.put("enabled",thirdDepart.getEnabled()); + addOrUpdateParam.put("sortId",thirdDepart.getSortId()); + addOrUpdateParam.put("shortName",thirdDepart.getShortName()); + + + String addOrUpdateAccountUrl = configVo.getParamVal(SyncConstants.groupurl.name())+ + configVo.getParamVal(SyncConstants.addOrUpdateAccountUrl.name())+ + "?token="+ goalToken; + log.info("当前单位请求url:"+addOrUpdateAccountUrl); + if(StringUtil.isNotEmpty(account) && !"null".equals(account)){ + log.info("当前单位已经存在,执行put请求,请求参数为:"+addOrUpdateParam); + String isUpdate = ProtUtil.httpPutRaw(addOrUpdateAccountUrl,addOrUpdateParam.toString(),new HashMap<>(),null); + log.info("返回结果为:"+isUpdate); + JSONObject isUpdateJson = JSONObject.parseObject(isUpdate); + if(StringUtil.isEmpty(isUpdateJson.getString("id"))){ + JSONArray errorMsgInfos = isUpdateJson.getJSONArray("errorMsgInfos"); + JSONObject errorMsgInfo = errorMsgInfos.getJSONObject(0); + String msgInfo = errorMsgInfo.getString("msgInfo"); + errorMap.put(accountId+"","集团协同平台修改单位失败:"+thirdDepart.getName()+msgInfo); + } + }else{ + JSONArray admins = new JSONArray(); + admins.add(new JSONObject()); + addOrUpdateParam.put("admin",admins); +// 集团协同平台不存在单位信息。进行单位新增 + log.info("当前单位不存在,执行post,请求参数为:"+addOrUpdateParam); + String isAdd = ProtUtil.doPost(addOrUpdateParam.toString(),addOrUpdateAccountUrl); + log.info("返回结果为:"+isAdd); + JSONObject isAddJson = JSONObject.parseObject(isAdd); + if(!isAddJson.getBoolean("success")){ + JSONArray errorMsgInfos = isAddJson.getJSONArray("errorMsgInfos"); + JSONObject errorMsgInfo = errorMsgInfos.getJSONObject(0); + String msgInfo = errorMsgInfo.getString("msgInfo"); + errorMap.put(accountId+"","集团协同平台新增单位失败:"+thirdDepart.getName()+msgInfo); + } + } + } + return errorMap; + } + + // 集团协同平台部门同步 + public Map groupSyncBatchDept (List list) throws BusinessException { + ConfigVo configVo = this.cstConfigApi.getConfig(this.getPluginId()); + String goalToken = getToken(); + Map errorMap = new HashMap<>(); + + log.info("执行数据筛选,只处理非客户单位下的所有单位信息"); + List thirdDeparts = list.stream().filter((dept) -> { + String path = dept.getPath(); + return !(path.startsWith("00000017")||path.startsWith("00000002")); + }).map((dept) -> { + return new ThirdDeptBo(dept); + }).collect(Collectors.toList()); + + log.info("遍历转换后的部门参数"); + for(int i = 0; i < thirdDeparts.size(); ++i) { + ThirdDeptBo thirdDepart = thirdDeparts.get(i); + log.info(thirdDepart.getName() + thirdDepart.getCode() + thirdDepart.getId()); +// 同步单位单位信息,同步集团协同平台,检查集团协同平台是否存在 + long deptId = thirdDepart.getId(); +// 根据单位ID查询单位是否存在 + String getDeptUrl = configVo.getParamVal(SyncConstants.groupurl.name())+ + configVo.getParamVal(SyncConstants.getDeptUrl.name())+deptId+ + "?token="+ goalToken; + String dept = ProtUtil.doGet(getDeptUrl); + log.info("调用接口查询当前部门是否存在当前查询url为:"+getDeptUrl); + log.info("查询结果为:"+dept); + JSONObject addOrUpdateParam = new JSONObject(); + addOrUpdateParam.put("id",deptId); + addOrUpdateParam.put("name",thirdDepart.getName()); + addOrUpdateParam.put("code",thirdDepart.getCode()); + addOrUpdateParam.put("superior",thirdDepart.getSuperior()); + addOrUpdateParam.put("status",thirdDepart.getStatus()); + addOrUpdateParam.put("isDeleted",thirdDepart.getIsDeleted()); + addOrUpdateParam.put("enabled",thirdDepart.getEnabled()); + addOrUpdateParam.put("sortId",thirdDepart.getSortId()); + addOrUpdateParam.put("shortName",thirdDepart.getShortName()); + addOrUpdateParam.put("orgAccountId",thirdDepart.getOrgAccountId()); + if(thirdDepart.getOrgAccountId()==thirdDepart.getSuperior()){ + V3xOrgAccount superAccount = orgManager.getAccountById(thirdDepart.getSuperior()); + addOrUpdateParam.put("superiorName",superAccount.getName()); + }else{ + V3xOrgDepartment superDept = orgManager.getDepartmentById(thirdDepart.getSuperior()); + addOrUpdateParam.put("superiorName",superDept.getName()); + } + String addOrUpdateDeptUrl = configVo.getParamVal(SyncConstants.groupurl.name())+ + configVo.getParamVal(SyncConstants.addOrUpdateDeptUrl.name())+ + "?token="+ goalToken; + log.info("当前部门请求url:"+addOrUpdateDeptUrl); + if(StringUtil.isNotEmpty(dept) && !"null".equals(dept)){ +// 集团协同平台存在单位信息。进行单位修改 + log.info("当前部门已经存在,执行put请求,请求参数为:"+addOrUpdateParam); + String isUpdate = ProtUtil.httpPutRaw(addOrUpdateDeptUrl,addOrUpdateParam.toString(),new HashMap(),null); + log.info("返回结果为:"+isUpdate); + JSONObject isUpdateJson = JSONObject.parseObject(isUpdate); + if(!isUpdateJson.getBoolean("success")){ + JSONArray errorMsgInfos = isUpdateJson.getJSONArray("errorMsgInfos"); + JSONObject errorMsgInfo = errorMsgInfos.getJSONObject(0); + String msgInfo = errorMsgInfo.getString("msgInfo"); + errorMap.put(deptId+"","集团协同平台修改部门失败:"+thirdDepart.getName()+msgInfo); + } + }else{ +// 集团协同平台不存在部门信息。进行部门新增 + log.info("当前部门不存在,执行post,请求参数为:"+addOrUpdateParam); + String isAdd = ProtUtil.doPost(addOrUpdateParam.toString(),addOrUpdateDeptUrl); + log.info("返回结果为:"+isAdd); + JSONObject isAddJson = JSONObject.parseObject(isAdd); + if(!isAddJson.getBoolean("success")){ + JSONArray errorMsgInfos = isAddJson.getJSONArray("errorMsgInfos"); + JSONObject errorMsgInfo = errorMsgInfos.getJSONObject(0); + String msgInfo = errorMsgInfo.getString("msgInfo"); + errorMap.put(deptId+"","集团协同平台新增部门失败:"+thirdDepart.getName()+msgInfo); + } + } + Map errorMapRole = flowSyncBatchDepartmentRole(thirdDepart); + errorMap.putAll(errorMapRole); + } + return errorMap; + } + + + // 集团接通平台部门角色同步 + public Map flowSyncBatchDepartmentRole(ThirdDeptBo thirdDepart) throws BusinessException { + ConfigVo configVo = this.cstConfigApi.getConfig(this.getPluginId()); + Map errorMap = new HashMap<>(); + V3xOrgDepartment v3xOrgDepartment = orgManager.getDepartmentById(thirdDepart.getId()); +// 获取当前部门的单位ID和部门ID + long deptId = v3xOrgDepartment.getId(); + long accountId = v3xOrgDepartment.getOrgAccountId(); +// 调用get获取当前部门的部门角色人员信息 + String getDepartmentmanagerinfoUrl = + configVo.getParamVal(SyncConstants.localurl.name())+configVo.getParamVal(SyncConstants.getDepartmentmanagerinfoUrl.name())+ + deptId+"/"+accountId+"?token="+getLocalToken(); + String result = ProtUtil.doGet(getDepartmentmanagerinfoUrl); + log.info("数据查询接口返回:"+result); + if(StringUtil.isEmpty(result)){ + errorMap.put(deptId+"","流程平台新增部门角色变更失败:"+thirdDepart.getName()+"部门角色查询为空"); + return errorMap; + } + JSONObject resultJjson = JSONObject.parseObject(result); + JSONObject addParam = new JSONObject(); + addParam.put("orgAccountId",resultJjson.getString("orgAccountId")); + addParam.put("id",resultJjson.getString("id")); + for (String key : resultJjson.keySet()) { + if(key.startsWith("deptrole")){ + String value = resultJjson.getString(key); + if(!"{}".equals(value)){ + JSONObject deptrolejson = JSONObject.parseObject(value); + String deptrolevalue = deptrolejson.getString("value"); + addParam.put(key,deptrolevalue); + }else{ + addParam.put(key,""); + } + } + } + String updateDepartmentmanagerinfoUrl = + configVo.getParamVal(SyncConstants.groupurl.name())+ + configVo.getParamVal(SyncConstants.updateDepartmentmanagerinfoUrl.name())+ + "?token="+getToken(); + String updateDeptRoleres = ProtUtil.httpPutRaw(updateDepartmentmanagerinfoUrl , addParam.toString(),new HashMap<>(),null); + log.info("请求参数"+addParam.toString()); + log.info(updateDepartmentmanagerinfoUrl+"调用修改部门角色接口返回数据:"+updateDeptRoleres); + if(StringUtil.isEmpty(updateDeptRoleres)){ + errorMap.put(deptId+"","流程平台新增部门角色变更失败:"+thirdDepart.getName()+"部门角色变更返回结果为空"); + return errorMap; + } + JSONObject updateDeptRoleresJson = JSONObject.parseObject(updateDeptRoleres); + return errorMap; + } + + + // 集团协同平台岗位同步 + public Map groupSyncBatchPost (List list){ + ConfigVo configVo = this.cstConfigApi.getConfig(this.getPluginId()); + String goalToken = getToken(); + Map errorMap = new HashMap<>(); + + log.info("执行数据筛选,只处理客户单位下的所有单位信息"); + List thirdPosts = list.stream().filter((post) -> { + long postAccountId = post.getOrgAccountId(); + String path = ""; + try { + V3xOrgAccount v3xOrgAccount = orgManager.getAccountById(postAccountId); + path = v3xOrgAccount.getPath(); + } catch (BusinessException e) { + e.printStackTrace(); + } + return !(path.startsWith("00000017")||path.equals("0000")||path.startsWith("00000002")); + }).map((post) -> { + return new ThirdPostBo(post); + }).collect(Collectors.toList()); + + log.info("遍历转换后的岗位参数"); + for(int i = 0; i < thirdPosts.size(); ++i) { + ThirdPostBo thirdPost = thirdPosts.get(i); + log.info(thirdPost.getName() + thirdPost.getCode() + thirdPost.getId()); +// 同步单位单位信息,同步集团协同平台,检查集团协同平台是否存在 + long postId = thirdPost.getId(); +// 根据单位ID查询单位是否存在 + String getPostUrl = configVo.getParamVal(SyncConstants.groupurl.name())+ + configVo.getParamVal(SyncConstants.getPostUrl.name())+postId+ + "?token="+ goalToken; + String post = ProtUtil.doGet(getPostUrl); + log.info("调用接口查询当前部门是否存在当前查询url为:"+getPostUrl); + log.info("查询结果为:"+post); + JSONObject addOrUpdateParam = new JSONObject(); + addOrUpdateParam.put("id",postId); + addOrUpdateParam.put("name",thirdPost.getName()); + addOrUpdateParam.put("code",thirdPost.getCode()); + addOrUpdateParam.put("isDeleted",thirdPost.getIsDeleted()); + addOrUpdateParam.put("enabled",thirdPost.getEnabled()); + addOrUpdateParam.put("sortId",thirdPost.getSortId()); + addOrUpdateParam.put("orgAccountId",thirdPost.getOrgAccountId()); + addOrUpdateParam.put("status",thirdPost.getStatus()); + addOrUpdateParam.put("description",thirdPost.getDescription()); + addOrUpdateParam.put("typeId",thirdPost.getTypeId()); + addOrUpdateParam.put("valid",thirdPost.isValid()); + addOrUpdateParam.put("entityType",thirdPost.getEntityType()); + String addOrUpdatePostUrl = configVo.getParamVal(SyncConstants.groupurl.name())+ + configVo.getParamVal(SyncConstants.addOrUpdatePostUrl.name())+ + "?token="+ goalToken; + log.info("当前岗位请求url:"+addOrUpdatePostUrl); + if(StringUtil.isNotEmpty(post) && !"null".equals(post)){ +// 集团协同平台存在单位信息。进行单位修改 + log.info("当前岗位已经存在,执行put请求,请求参数为:"+addOrUpdateParam); +// String isUpdate = ProtUtil.callPutApi(addOrUpdatePostUrl,addOrUpdateParam.toString()); + String isUpdate = ProtUtil.httpPutRaw(addOrUpdatePostUrl,addOrUpdateParam.toString(),new HashMap(),null); + log.info("返回结果为:"+isUpdate); + JSONObject isUpdateJson = JSONObject.parseObject(isUpdate); + if(!isUpdateJson.getBoolean("success")){ + JSONArray errorMsgInfos = isUpdateJson.getJSONArray("errorMsgInfos"); + JSONObject errorMsgInfo = errorMsgInfos.getJSONObject(0); + String msgInfo = errorMsgInfo.getString("msgInfo"); + errorMap.put(postId+"","集团协同平台修改岗位失败:"+thirdPost.getName()+msgInfo); + } + }else{ +// 集团协同平台不存在部门信息。进行部门新增 + log.info("当前岗位不存在,执行post,请求参数为:"+addOrUpdateParam); + String isAdd = ProtUtil.doPost(addOrUpdateParam.toString(),addOrUpdatePostUrl); + log.info("返回结果为:"+isAdd); + JSONObject isAddJson = JSONObject.parseObject(isAdd); + if(!isAddJson.getBoolean("success")){ + JSONArray errorMsgInfos = isAddJson.getJSONArray("errorMsgInfos"); + JSONObject errorMsgInfo = errorMsgInfos.getJSONObject(0); + String msgInfo = errorMsgInfo.getString("msgInfo"); + errorMap.put(postId+"","集团协同平台新增岗位失败:"+thirdPost.getName()+msgInfo); + } + } + } + return errorMap; + } + + // 集团协同平台职务级别同步 + public Map groupSyncBatchLevel (List list){ + ConfigVo configVo = this.cstConfigApi.getConfig(this.getPluginId()); + String goalToken = getToken(); + Map errorMap = new HashMap<>(); + + log.info("执行数据筛选,只处理非客户单位下的所有单位信息"); + List thirdLevels = list.stream().filter((level) -> { + long levelAccountId = level.getOrgAccountId(); + String path = ""; + try { + V3xOrgAccount v3xOrgAccount = orgManager.getAccountById(levelAccountId); + path = v3xOrgAccount.getPath(); + } catch (BusinessException e) { + e.printStackTrace(); + } + return !(path.startsWith("00000017")||path.equals("0000")||path.startsWith("00000002")); + }).map((level) -> { + return new ThirdLevelBo(level); + }).collect(Collectors.toList()); + + log.info("遍历转换后的岗位参数"); + for(int i = 0; i < thirdLevels.size(); ++i) { + ThirdLevelBo thirdLevel = thirdLevels.get(i); + log.info(thirdLevel.getName() + thirdLevel.getCode() + thirdLevel.getId()); +// 同步单位单位信息,同步集团协同平台,检查集团协同平台是否存在 + long levelId = thirdLevel.getId(); +// 根据单位ID查询单位是否存在 + String getLevelUrl = configVo.getParamVal(SyncConstants.groupurl.name())+ + configVo.getParamVal(SyncConstants.getLevelUrl.name())+levelId+ + "?token="+ goalToken; + String level = ProtUtil.doGet(getLevelUrl); + log.info("调用接口查询当前部门是否存在当前查询url为:"+getLevelUrl); + log.info("查询结果为:"+level); + JSONObject addOrUpdateParam = new JSONObject(); + addOrUpdateParam.put("id",levelId); + addOrUpdateParam.put("name",thirdLevel.getName()); + addOrUpdateParam.put("code",thirdLevel.getCode()); + addOrUpdateParam.put("isDeleted",thirdLevel.getIsDeleted()); + addOrUpdateParam.put("enabled",thirdLevel.getEnabled()); + addOrUpdateParam.put("sortId",thirdLevel.getSortId()); + addOrUpdateParam.put("orgAccountId",thirdLevel.getOrgAccountId()); + addOrUpdateParam.put("status",thirdLevel.getStatus()); + addOrUpdateParam.put("description",thirdLevel.getDescription()); + String addOrUpdateLevelUrl = configVo.getParamVal(SyncConstants.groupurl.name())+ + configVo.getParamVal(SyncConstants.addOrUpdateLevelUrl.name())+ + "?token="+ goalToken; + log.info("当前职务级别请求url:"+addOrUpdateLevelUrl); + if(StringUtil.isNotEmpty(level) && !"null".equals(level)){ +// 集团协同平台存在单位信息。进行单位修改 + log.info("当前职务级别已经存在,执行put请求,请求参数为:"+addOrUpdateParam); + String isUpdate = ProtUtil.httpPutRaw(addOrUpdateLevelUrl,addOrUpdateParam.toString(),new HashMap<>(),null); + log.info("返回结果为:"+isUpdate); + JSONObject isUpdateJson = JSONObject.parseObject(isUpdate); + if(!isUpdateJson.getBoolean("success")){ + JSONArray errorMsgInfos = isUpdateJson.getJSONArray("errorMsgInfos"); + JSONObject errorMsgInfo = errorMsgInfos.getJSONObject(0); + String msgInfo = errorMsgInfo.getString("msgInfo"); + errorMap.put(levelId+"","集团协同平台修改职务级别失败:"+thirdLevel.getName()+msgInfo); + } + }else{ + // 集团协同平台不存在部门信息。进行部门新增 + log.info("当前岗位不存在,执行post,请求参数为:"+addOrUpdateParam); + String isAdd = ProtUtil.doPost(addOrUpdateParam.toString(),addOrUpdateLevelUrl); + log.info("返回结果为:"+isAdd); + JSONObject isAddJson = JSONObject.parseObject(isAdd); + if(!isAddJson.getBoolean("success")){ + JSONArray errorMsgInfos = isAddJson.getJSONArray("errorMsgInfos"); + JSONObject errorMsgInfo = errorMsgInfos.getJSONObject(0); + String msgInfo = errorMsgInfo.getString("msgInfo"); + errorMap.put(levelId+"","集团协同平台新增职务级别失败:"+thirdLevel.getName()+msgInfo); + } + } + } + return errorMap; + } + + // 集团协同平台人员同步 + public Map groupSyncBatchMember (List list) throws BusinessException, InterruptedException { + ConfigVo configVo = this.cstConfigApi.getConfig(this.getPluginId()); + String goalToken = getToken(); + Map errorMap = new HashMap<>(); +// 获取本系统参数 + String localurl = configVo.getParamVal(SyncConstants.localurl.name()); + + List thirdMembers = (List)list.stream().filter((member) ->{ + String path = ""; + try { + long memeberAccountId = member.getOrgAccountId(); + V3xOrgAccount memberAccount = orgManager.getAccountById(memeberAccountId); + path = memberAccount.getPath(); + } catch (BusinessException e) { + e.printStackTrace(); + } + return !(path.startsWith("00000017")||path.equals("0000")||path.startsWith("00000002")); + }).map((member) -> { + ThirdMemberBo thirdMember = null; + try { +// 由于系统方法文件改用接口的方式获取人员副岗信息 +// 获取当前人员ID信息 + long memberId = member.getId(); +// 调用当前系统人员查询接口,获取人员信息对象 + String getMemberUrl = localurl+configVo.getParamVal(SyncConstants.getMemberUrl.name())+memberId+"?token="+getLocalToken(); + String res = ProtUtil.doGet(getMemberUrl); +// 解析数据 + JSONObject resJson = JSONObject.parseObject(res); +// 在当前人员信息对象中查询副岗信息列表 + JSONArray secondPosts = resJson.getJSONArray("second_post"); +// 将此信息列表封装成list对象 + List memberPostList = new ArrayList<>(); + for(int i = 0 ; i < secondPosts.size() ;i ++){ + MemberPost memberPost = new MemberPost(); + JSONObject secondPost = secondPosts.getJSONObject(i); + memberPost.setPostId(Long.parseLong(secondPost.getString("postId"))); + memberPost.setOrgAccountId(Long.parseLong(secondPost.getString("orgAccountId"))); + memberPost.setDepId(Long.parseLong(secondPost.getString("depId"))); + memberPost.setMemberId(Long.parseLong(secondPost.getString("memberId"))); + memberPostList.add(memberPost); + } +// 传递参数生成封装数据 + thirdMember = new ThirdMemberBo(member,memberPostList); + return thirdMember; + } catch (BusinessException e) { + e.printStackTrace(); + } + return thirdMember; + }).collect(Collectors.toList()); + + for(int i = 0; i < thirdMembers.size(); ++i) { + ThirdMemberBo thirdMember = thirdMembers.get(i); + log.info(thirdMember.getName() + thirdMember.getCode() + thirdMember.getId()); +// 同步单位单位信息,同步集团协同平台,检查集团协同平台是否存在 + long memberId = thirdMember.getId(); + for(int n = 0 ;n < 5 ; n++){ + Map memeberMap = syncFvDao.queryMemberArchiveByMemberId(thirdMember.getId()+""); + if(memeberMap==null){ + log.info("人员档案不存在等待5秒后再次执行"+"当前执行次数"+n+1); + Thread.sleep(1000); + continue; + }else { + String getMemberUrl = configVo.getParamVal(SyncConstants.groupurl.name())+ + configVo.getParamVal(SyncConstants.getMemberUrl.name())+memberId+ + "?token="+ goalToken; + String member = ProtUtil.doGet(getMemberUrl); + JSONObject memberJson = JSONObject.parseObject(member); + log.info("调用接口查询当前人员是否存在当前查询url为:"+getMemberUrl); + log.info("查询结果为:"+member); + JSONObject addOrUpdateParam = new JSONObject(); + addOrUpdateParam.put("id",memberId); + addOrUpdateParam.put("orgAccountId",thirdMember.getOrgAccountId()); + addOrUpdateParam.put("name",thirdMember.getName()); + addOrUpdateParam.put("code",thirdMember.getCode()); + addOrUpdateParam.put("orgDepartmentId",thirdMember.getDeptId()); + addOrUpdateParam.put("orgPostId",thirdMember.getPostId()); + addOrUpdateParam.put("orgLevelId",thirdMember.getLevelId()); + addOrUpdateParam.put("loginName",thirdMember.getLoginName()); + addOrUpdateParam.put("state",thirdMember.getState()); + addOrUpdateParam.put("isDeleted",thirdMember.isDeleted()); + addOrUpdateParam.put("enabled",thirdMember.isEnabled()); + addOrUpdateParam.put("type",thirdMember.getType()); + addOrUpdateParam.put("gender",thirdMember.getGender()); + addOrUpdateParam.put("birthday",thirdMember.getBirthday()); + addOrUpdateParam.put("hiredate",thirdMember.getHiredate()); + addOrUpdateParam.put("sortId",thirdMember.getSortId()); + addOrUpdateParam.put("telNumber",thirdMember.getTelNumber()); + addOrUpdateParam.put("second_post",thirdMember.getSecondPosts()); + System.out.println("开始获取副岗信息"+thirdMember.getSecondPosts()); + //集团协同平台存在单位信息。进行单位修改 + AddressBook addressBook = addressBookCustomerFieldInfoManager.getByMemberId(memberId); + if(addressBook != null){ + addOrUpdateParam = setAddRessBooks(addOrUpdateParam,addressBook); + } + if(StringUtil.isNotEmpty(member) && !"null".equals(member)){ +// 判断当前人员登录名是否相同 + JSONObject memberJSON = JSONObject.parseObject(member); + + if(StringUtil.isNotEmpty(thirdMember.getLoginName())){ + if(thirdMember.getLoginName().equals(memberJSON.getString("loginName"))){ + addOrUpdateParam.remove("loginName"); + } + } + log.info("当前人员已经存在,执行请求,请求参数为:"+addOrUpdateParam); + String updateMemberUrl = configVo.getParamVal(SyncConstants.groupurl.name())+ + configVo.getParamVal(SyncConstants.updateMemberUrl.name())+ + "?token="+ goalToken; + log.info("当前人员请求url:"+updateMemberUrl); + + String isUpdate = ProtUtil.doPost(addOrUpdateParam.toString(),updateMemberUrl); + log.info("返回结果为:"+isUpdate); + JSONObject isUpdateJson = JSONObject.parseObject(isUpdate); + if(isUpdateJson.getInteger("code") !=0){ + String message = isUpdateJson.getString("message"); + errorMap.put(memberId+"","集团协同平台修改人员失败:"+thirdMember.getName()+message); + } + }else{ +// 集团协同平台不存在部门信息。进行部门新增 + log.info("当前人员不存在,执行post,请求参数为:"+addOrUpdateParam); + String addMemberUrl = configVo.getParamVal(SyncConstants.groupurl.name())+ + configVo.getParamVal(SyncConstants.addMemberUrl.name())+ + "?token="+ goalToken; + log.info("当前人员请求url:"+addMemberUrl); + String isAdd = ProtUtil.doPost(addOrUpdateParam.toString(),addMemberUrl); + log.info("返回结果为:"+isAdd); + JSONObject isAddJson = JSONObject.parseObject(isAdd); + if(isAddJson.getInteger("code")!=0){ + String message = isAddJson.getString("message"); + errorMap.put(memberId+"","集团协同平台新增人员失败:"+thirdMember.getName()+message); + } + } + } + } + } + return errorMap; + } + + private JSONObject setAddRessBooks(JSONObject addOrUpdateParam,AddressBook addressBook) throws BusinessException { + if(StringUtil.isNotEmpty(addressBook.getExtAttr1())){ + addOrUpdateParam.put("EXT_ATTR_1",addressBook.getExtAttr1()); + }if(StringUtil.isNotEmpty(addressBook.getExtAttr2())){ + addOrUpdateParam.put("EXT_ATTR_2",addressBook.getExtAttr2()); + }if(StringUtil.isNotEmpty(addressBook.getExtAttr3())){ + addOrUpdateParam.put("EXT_ATTR_3",addressBook.getExtAttr3()); + }if(StringUtil.isNotEmpty(addressBook.getExtAttr4())){ + addOrUpdateParam.put("EXT_ATTR_4",addressBook.getExtAttr4()); + }if(StringUtil.isNotEmpty(addressBook.getExtAttr5())){ + addOrUpdateParam.put("EXT_ATTR_5",addressBook.getExtAttr5()); + }if(StringUtil.isNotEmpty(addressBook.getExtAttr6())){ + addOrUpdateParam.put("EXT_ATTR_6",addressBook.getExtAttr6()); + }if(StringUtil.isNotEmpty(addressBook.getExtAttr7())){ + addOrUpdateParam.put("EXT_ATTR_7",addressBook.getExtAttr7()); + }if(StringUtil.isNotEmpty(addressBook.getExtAttr8())){ + addOrUpdateParam.put("EXT_ATTR_8",addressBook.getExtAttr8()); + }if(StringUtil.isNotEmpty(addressBook.getExtAttr9())){ + addOrUpdateParam.put("EXT_ATTR_9",addressBook.getExtAttr9()); + }if(StringUtil.isNotEmpty(addressBook.getExtAttr10())){ + addOrUpdateParam.put("EXT_ATTR_10",addressBook.getExtAttr10()); + }if(addressBook.getExtAttr11()==null){ + addOrUpdateParam.put("EXT_ATTR_11",addressBook.getExtAttr11()); + }if(addressBook.getExtAttr12()==null){ + addOrUpdateParam.put("EXT_ATTR_12",addressBook.getExtAttr12()); + }if(addressBook.getExtAttr13()==null){ + addOrUpdateParam.put("EXT_ATTR_13",addressBook.getExtAttr13()); + }if(addressBook.getExtAttr14()==null){ + addOrUpdateParam.put("EXT_ATTR_14",addressBook.getExtAttr14()); + }if(addressBook.getExtAttr15()==null){ + addOrUpdateParam.put("EXT_ATTR_15",addressBook.getExtAttr15()); + }if(addressBook.getExtAttr16()==null){ + addOrUpdateParam.put("EXT_ATTR_16",addressBook.getExtAttr16()); + }if(addressBook.getExtAttr17()==null){ + addOrUpdateParam.put("EXT_ATTR_17",addressBook.getExtAttr17()); + }if(addressBook.getExtAttr18()==null){ + addOrUpdateParam.put("EXT_ATTR_18",addressBook.getExtAttr18()); + }if(addressBook.getExtAttr19()==null){ + addOrUpdateParam.put("EXT_ATTR_19",addressBook.getExtAttr19()); + }if(addressBook.getExtAttr20()==null){ + addOrUpdateParam.put("EXT_ATTR_20",addressBook.getExtAttr20()); + }if(addressBook.getExtAttr21()==null) { + addOrUpdateParam.put("EXT_ATTR_21", addressBook.getExtAttr21()); + }if(addressBook.getExtAttr22()==null){ + addOrUpdateParam.put("EXT_ATTR_22",addressBook.getExtAttr22()); + }if(addressBook.getExtAttr23()==null){ + addOrUpdateParam.put("EXT_ATTR_23",addressBook.getExtAttr23()); + }if(addressBook.getExtAttr24()==null){ + addOrUpdateParam.put("EXT_ATTR_24",addressBook.getExtAttr24()); + }if(addressBook.getExtAttr25()==null){ + addOrUpdateParam.put("EXT_ATTR_25",addressBook.getExtAttr25()); + }if(addressBook.getExtAttr26()==null){ + addOrUpdateParam.put("EXT_ATTR_26",addressBook.getExtAttr26()); + }if(addressBook.getExtAttr27()==null){ + addOrUpdateParam.put("EXT_ATTR_27",addressBook.getExtAttr27()); + }if(addressBook.getExtAttr28()==null){ + addOrUpdateParam.put("EXT_ATTR_28",addressBook.getExtAttr28()); + }if(addressBook.getExtAttr29()==null){ + addOrUpdateParam.put("EXT_ATTR_29",addressBook.getExtAttr29()); + }if(addressBook.getExtAttr30()==null){ + addOrUpdateParam.put("EXT_ATTR_30",addressBook.getExtAttr30()); + }if(StringUtil.isNotEmpty(addressBook.getExtAttr31())){ + CtpEnumItem extAttr31Enum = getEnumManagerNew().getCtpEnumItem(Long.parseLong(addressBook.getExtAttr31())); + if(extAttr31Enum!=null){ + addOrUpdateParam.put("EXT_ATTR_31",extAttr31Enum.getValue()); + } + }if(StringUtil.isNotEmpty(addressBook.getExtAttr32())){ + CtpEnumItem extAttr32Enum = getEnumManagerNew().getCtpEnumItem(Long.parseLong(addressBook.getExtAttr32())); + if(extAttr32Enum!=null){ + addOrUpdateParam.put("EXT_ATTR_32",extAttr32Enum.getValue()); + } + }if(StringUtil.isNotEmpty(addressBook.getExtAttr33())){ + CtpEnumItem extAttr33Enum = getEnumManagerNew().getCtpEnumItem(Long.parseLong(addressBook.getExtAttr33())); + if(extAttr33Enum!=null){ + addOrUpdateParam.put("EXT_ATTR_33",extAttr33Enum.getValue()); + } + }if(StringUtil.isNotEmpty(addressBook.getExtAttr34())){ + CtpEnumItem extAttr34Enum = getEnumManagerNew().getCtpEnumItem(Long.parseLong(addressBook.getExtAttr34())); + if(extAttr34Enum !=null){ + addOrUpdateParam.put("EXT_ATTR_34",extAttr34Enum.getValue()); + } + }if(StringUtil.isNotEmpty(addressBook.getExtAttr35())){ + CtpEnumItem extAttr35Enum = getEnumManagerNew().getCtpEnumItem(Long.parseLong(addressBook.getExtAttr35())); + if(extAttr35Enum!=null){ + addOrUpdateParam.put("EXT_ATTR_35",extAttr35Enum.getValue()); + } + }if(StringUtil.isNotEmpty(addressBook.getExtAttr36())){ + CtpEnumItem extAttr36Enum = getEnumManagerNew().getCtpEnumItem(Long.parseLong(addressBook.getExtAttr36())); + if(extAttr36Enum!=null){ + addOrUpdateParam.put("EXT_ATTR_36",extAttr36Enum.getValue()); + } + }if(StringUtil.isNotEmpty(addressBook.getExtAttr37())){ + CtpEnumItem extAttr37Enum = getEnumManagerNew().getCtpEnumItem(Long.parseLong(addressBook.getExtAttr37())); + if(extAttr37Enum!=null){ + addOrUpdateParam.put("EXT_ATTR_37",extAttr37Enum.getValue()); + } + }if(StringUtil.isNotEmpty(addressBook.getExtAttr38())){ + CtpEnumItem extAttr38Enum = getEnumManagerNew().getCtpEnumItem(Long.parseLong(addressBook.getExtAttr38())); + if(extAttr38Enum!=null){ + addOrUpdateParam.put("EXT_ATTR_38",extAttr38Enum.getValue()); + } + }if(StringUtil.isNotEmpty(addressBook.getExtAttr39())){ + CtpEnumItem extAttr39Enum = getEnumManagerNew().getCtpEnumItem(Long.parseLong(addressBook.getExtAttr39())); + if(extAttr39Enum!=null){ + addOrUpdateParam.put("EXT_ATTR_39",extAttr39Enum.getValue()); + } + }if(StringUtil.isNotEmpty(addressBook.getExtAttr40())){ + CtpEnumItem extAttr40Enum = getEnumManagerNew().getCtpEnumItem(Long.parseLong(addressBook.getExtAttr40())); + if(extAttr40Enum!=null){ + addOrUpdateParam.put("EXT_ATTR_40",extAttr40Enum.getValue()); + } + }if(StringUtil.isNotEmpty(addressBook.getExtAttr41())&&!"0".equals(addressBook.getExtAttr41())){ + addOrUpdateParam.put("EXT_ATTR_41",addressBook.getExtAttr41()); + }if(StringUtil.isNotEmpty(addressBook.getExtAttr42())&&!"0".equals(addressBook.getExtAttr42())){ + addOrUpdateParam.put("EXT_ATTR_42",addressBook.getExtAttr42()); + }if(StringUtil.isNotEmpty(addressBook.getExtAttr43())&&!"0".equals(addressBook.getExtAttr43())){ + addOrUpdateParam.put("EXT_ATTR_43",addressBook.getExtAttr43()); + }if(StringUtil.isNotEmpty(addressBook.getExtAttr44())&&!"0".equals(addressBook.getExtAttr44())){ + addOrUpdateParam.put("EXT_ATTR_44",addressBook.getExtAttr44()); + }if(StringUtil.isNotEmpty(addressBook.getExtAttr45())&&!"0".equals(addressBook.getExtAttr45())){ + addOrUpdateParam.put("EXT_ATTR_45",addressBook.getExtAttr45()); + }if(StringUtil.isNotEmpty(addressBook.getExtAttr46())&&!"0".equals(addressBook.getExtAttr46())){ + addOrUpdateParam.put("EXT_ATTR_46",addressBook.getExtAttr46()); + }if(StringUtil.isNotEmpty(addressBook.getExtAttr47())&&!"0".equals(addressBook.getExtAttr47())){ + addOrUpdateParam.put("EXT_ATTR_47",addressBook.getExtAttr47()); + }if(StringUtil.isNotEmpty(addressBook.getExtAttr48())&&!"0".equals(addressBook.getExtAttr48())){ + addOrUpdateParam.put("EXT_ATTR_48",addressBook.getExtAttr48()); + }if(StringUtil.isNotEmpty(addressBook.getExtAttr49())&&!"0".equals(addressBook.getExtAttr49())){ + addOrUpdateParam.put("EXT_ATTR_49",addressBook.getExtAttr49()); + }if(StringUtil.isNotEmpty(addressBook.getExtAttr50())&&!"0".equals(addressBook.getExtAttr50())){ + addOrUpdateParam.put("EXT_ATTR_50",addressBook.getExtAttr50()); + }if(StringUtil.isNotEmpty(addressBook.getExtAttr51())&&!"0".equals(addressBook.getExtAttr51())){ + addOrUpdateParam.put("EXT_ATTR_51",addressBook.getExtAttr51()); + }if(StringUtil.isNotEmpty(addressBook.getExtAttr52())&&!"0".equals(addressBook.getExtAttr52())){ + addOrUpdateParam.put("EXT_ATTR_52",addressBook.getExtAttr52()); + }if(StringUtil.isNotEmpty(addressBook.getExtAttr53())&&!"0".equals(addressBook.getExtAttr53())){ + addOrUpdateParam.put("EXT_ATTR_53",addressBook.getExtAttr53()); + }if(StringUtil.isNotEmpty(addressBook.getExtAttr54())&&!"0".equals(addressBook.getExtAttr54())){ + addOrUpdateParam.put("EXT_ATTR_54",addressBook.getExtAttr54()); + }if(StringUtil.isNotEmpty(addressBook.getExtAttr55())&&!"0".equals(addressBook.getExtAttr55())){ + addOrUpdateParam.put("EXT_ATTR_55",addressBook.getExtAttr55()); + }if(StringUtil.isNotEmpty(addressBook.getExtAttr56())&&!"0".equals(addressBook.getExtAttr56())){ + addOrUpdateParam.put("EXT_ATTR_56",addressBook.getExtAttr56()); + }if(StringUtil.isNotEmpty(addressBook.getExtAttr57())&&!"0".equals(addressBook.getExtAttr57())){ + addOrUpdateParam.put("EXT_ATTR_57",addressBook.getExtAttr57()); + }if(StringUtil.isNotEmpty(addressBook.getExtAttr58())&&!"0".equals(addressBook.getExtAttr58())){ + addOrUpdateParam.put("EXT_ATTR_58",addressBook.getExtAttr58()); + }if(StringUtil.isNotEmpty(addressBook.getExtAttr59())&&!"0".equals(addressBook.getExtAttr59())){ + addOrUpdateParam.put("EXT_ATTR_59",addressBook.getExtAttr59()); + }if(StringUtil.isNotEmpty(addressBook.getExtAttr60())&&!"0".equals(addressBook.getExtAttr60())){ + addOrUpdateParam.put("EXT_ATTR_60",addressBook.getExtAttr60()); + } + + return addOrUpdateParam; + } + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/server/OrganizationOrgQixuexingSyncServer.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/server/OrganizationOrgQixuexingSyncServer.java new file mode 100644 index 0000000..08bff22 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/server/OrganizationOrgQixuexingSyncServer.java @@ -0,0 +1,708 @@ +package com.seeyon.apps.src_mainorganization.server; + +import cn.hutool.log.Log; +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.common.plugin.vo.ConfigVo; +import com.seeyon.apps.src_mainorganization.constans.SyncConstants; +import com.seeyon.apps.src_mainorganization.dao.*; +import com.seeyon.apps.src_mainorganization.util.FormExportUtil; +import com.seeyon.apps.src_mainorganization.util.QixuexingPortUtil; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.ctpenumnew.manager.EnumManager; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.common.po.ctpenumnew.CtpEnumItem; +import com.seeyon.ctp.services.ServiceException; +import com.seeyon.v3x.services.form.FormFactory; +import com.seeyon.v3x.services.form.bean.FormExport; +import com.seeyon.v3x.services.form.bean.ValueExport; +import www.seeyon.com.utils.StringUtil; + +import javax.inject.Inject; +import java.text.SimpleDateFormat; +import java.util.*; + +public class OrganizationOrgQixuexingSyncServer { + + private static Log log = Log.get(OrganizationOrgQixuexingSyncServer.class); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + FormExportUtil formExportUtil = new FormExportUtil(); + + @Inject + private ICstConfigApi cstConfigApi; + @Inject + private ISrcAccountDao srcAccountDao; + @Inject + private ISrcDepartmentDao srcDepartmentDao; + @Inject + private ISrcMemberDao srcMemberDao; + @Inject + private IArchiveDao archiveDao; + @Inject + private FormFactory formFactory; + + private EnumManager enumManagerNew; + public void setEnumManagerNew(EnumManager enumManagerNew) {this.enumManagerNew = enumManagerNew;} + public EnumManager getEnumManagerNew() { + if (enumManagerNew == null) {enumManagerNew = (EnumManager) AppContext.getBean("enumManagerNew");} + return enumManagerNew; + } + + public String getPluginId() { + return SyncConstants.getPluginId(); + } + + //企学星单位信息全量同步 + public String qixuexingSyncAllAccounts (){ + String res = ""; +// 查询所有单位信息 + Map errorMap = null; + try { + List> allAccounts = srcAccountDao.getAllAccounts(); + // 根据列表查询生成列表部门对象 + errorMap = qixuexingSyncBatchAccountMap(allAccounts); + } catch (ServiceException e) { + e.printStackTrace(); + } + log.info("单位异常数"+errorMap.size()); + for (Map.Entry entry : errorMap.entrySet()) { + String value = entry.getValue(); + res= res+value+";"; + } + return res; + } + + //企学星单位信息增量同步 + public String qixuexingSyncBatchAccount(String startDate){ + String res = ""; +// 根据列表查询生成列表部门对象 + Map errorMap = null; + try { +// 根据上一次同步时间获取最新修改的单位信息 + List> incrementAccounts = srcAccountDao.getIncrementAccountByUpdateTime(startDate); + errorMap = qixuexingSyncBatchAccountMap(incrementAccounts); + } catch (ServiceException e) { + e.printStackTrace(); + } + log.info("单位异常数"+errorMap.size()); + for (Map.Entry entry : errorMap.entrySet()) { + String value = entry.getValue(); + res= res+value+";"; + } + return res ; + } + + //企学星单位同步,单位列表,单位同步为部门 + public Map qixuexingSyncBatchAccountMap(List> list) throws ServiceException { + ConfigVo configVo = this.cstConfigApi.getConfig(this.getPluginId()); +// 设置返回值参数 + Map errorMap = new HashMap<>(); +// 获取需要特殊处理的单位信息 + String excludeAccount = configVo.getParamVal(SyncConstants.excludeAccount.name()); +// 遍历所有单位信息 + for(Map accountMap : list){ + String accountId = accountMap.get("id").toString(); + String accountName = accountMap.get("name").toString(); + Map from = new HashMap(); +// 设置日志保存数据 + from.put("同步类型", "单位"); + from.put("同步时间", sdf.format(new Date())); + from.put("同步对象", accountMap.get("name").toString()); +// 判断是否为业务架构存在的单位信息 + if(!accountMap.get("path").toString().startsWith("00000017") || excludeAccount.contains(accountId)) { + log.info(accountName + accountMap.get("code") + accountId); + if ("1".equals(accountMap.get("is_enable") != null ? accountMap.get("is_enable").toString() : null)) { +// 查询上级信息 + String path = accountMap.get("path").toString(); + String subPath = path.substring(0,path.length()-4); + Map sub = srcAccountDao.getAccountByPath(subPath); + String subId = sub.get("id").toString(); + if(!"-1730833917365171641".equals(subId)){ + JSONObject select = QixuexingPortUtil.qixuexingSelectOrg(configVo,subId); + String selectCode = select.getString("code"); +// 如果上级不存在则跳过当前单位信息 + if(!"0".equals(selectCode)){ + errorMap.put(accountId+"","企学星同步单位失败:未查询到有效上级信息"+accountName); + continue; + }else{ + String selectData = select.getString("data"); + if(selectData.length()==0){ + errorMap.put(accountId+"","企学星同步单位失败:未查询到有效上级信息"+accountName); + continue; + } + } + } +// 封装当前环境单位数据,调用部门保存接口,保存企学星部门信息 + JSONObject jsonObject = QixuexingPortUtil.qixuexingSaveOrg(configVo,accountMap,subId); + String resCode = jsonObject.getString("code"); + if("0".equals(resCode)){ +// 保存成功 + from.put("是否成功", "成功"); + from.put("同步结果", "企学星单位保存同步成功"); + }else{ +// 保存失败 + from.put("是否成功", "失败"); + from.put("同步结果", "企学星单位保存同步失败"+jsonObject.getString("message")); + } + FormExport formExport = new FormExport(); + from.put("同步动作", "保存"); + from.put("主要信息", accountMap.toString()); + List valueExports = formExportUtil.setFormValue(from); + formExport.setValues(valueExports); + //同步记录创建人和钉钉日志创建人共用 + formFactory.importBusinessFormData(configVo.getParamVal(SyncConstants.dingdingLogloginName.name()), + configVo.getParamVal(SyncConstants.qxxLog.name()), + formExport, new String[]{}); + } else { + JSONObject jsonObject = QixuexingPortUtil.qixuexingDeleteOrg(configVo,accountId); + String resCode = jsonObject.getString("code"); + if("0".equals(resCode)){ +// 删除成功 + from.put("是否成功", "成功"); + from.put("同步结果", "企学星单位删除同步成功"); + }else{ +// 删除失败 + from.put("是否成功", "失败"); + from.put("同步结果", "企学星单位删除同步失败"+jsonObject.getString("message")); + errorMap.put(accountId+"","企学星同步单位失败:"+jsonObject.getString("message")); + } + FormExport formExport = new FormExport(); + from.put("同步动作", "删除"); + from.put("主要信息", accountMap.toString()); + List valueExports = formExportUtil.setFormValue(from); + formExport.setValues(valueExports); + //同步记录创建人和钉钉日志创建人共用 + formFactory.importBusinessFormData(configVo.getParamVal(SyncConstants.dingdingLogloginName.name()), + configVo.getParamVal(SyncConstants.qxxLog.name()), + formExport, new String[]{}); + } + } + } + return errorMap; + } + + //企学星部门信息全量同步 + public String qixuexingSyncAllDepartments () { + String res = ""; +// 根据列表查询生成列表部门对象 + Map errorMap = null; + try { +// 根据上一次同步时间获取最新修改的单位信息 + List> incrementDepartments = srcDepartmentDao.getAllDepartments(); + errorMap = qixuexingSyncBatchDeptMap(incrementDepartments); + } catch (ServiceException e) { + e.printStackTrace(); + } + log.info("部门异常数"+errorMap.size()); + for (Map.Entry entry : errorMap.entrySet()) { + String value = entry.getValue(); + res= res+value+";"; + } + return res ; + } + + //企学星部门信息增量同步 + public String qixuexingSyncBatchDepartment(String startDate){ + String res = ""; +// 根据列表查询生成列表部门对象 + Map errorMap = null; + try { +// 根据上一次同步时间获取最新修改的单位信息 + List> incrementDepartments = srcDepartmentDao.getIncrementDepartmentByUpdateTime(startDate); + errorMap = qixuexingSyncBatchDeptMap(incrementDepartments); + } catch (ServiceException e) { + e.printStackTrace(); + } + log.info("部门异常数"+errorMap.size()); + for (Map.Entry entry : errorMap.entrySet()) { + String value = entry.getValue(); + res= res+value+";"; + } + return res ; + } + + //企学星部门信息同步,部门列表 id,code,name,path,is_enable,org_account_id,sort_id + public Map qixuexingSyncBatchDeptMap(List> list) throws ServiceException { + ConfigVo configVo = this.cstConfigApi.getConfig(this.getPluginId()); + Map errorMap = new HashMap<>(); + for(Map departmentMap : list){ + Map from = new HashMap(); + String departmentId = departmentMap.get("id").toString(); + String departmentName = departmentMap.get("name").toString(); +// 设置日志保存数据 + from.put("同步类型", "部门"); + from.put("同步时间", sdf.format(new Date())); + from.put("同步对象", departmentName); + + if("1".equals(departmentMap.get("is_enable")!=null?departmentMap.get("is_enable").toString():null)){ +// 查询上级信息 + String path = departmentMap.get("path").toString(); + String subPath = path.substring(0,path.length()-4); + Map sub = srcDepartmentDao.getDepartmentByPath(subPath); + String subId = sub.get("id").toString(); + JSONObject select = QixuexingPortUtil.qixuexingSelectOrg(configVo,subId); + String selectCode = select.getString("code"); +// 如果上级不存在则跳过当前单位信息 + if(!"0".equals(selectCode)){ + errorMap.put(departmentId+"","企学星同步部门失败:未查询到有效上级信息"+departmentName); + continue; + }else{ + String selectData = select.getString("data"); + if(selectData.length()==0){ + errorMap.put(departmentId+"","企学星同步部门失败:未查询到有效上级信息"+departmentName); + continue; + } + } +// 封装当前环境单位数据,调用部门保存接口,保存企学星部门信息 + JSONObject jsonObject = QixuexingPortUtil.qixuexingSaveOrg(configVo,departmentMap,subId); + String resCode = jsonObject.getString("code"); + if("0".equals(resCode)){ +// 保存成功 + from.put("是否成功", "成功"); + from.put("同步结果", "企学星部门保存同步成功"); + }else{ +// 保存失败 + from.put("是否成功", "失败"); + from.put("同步结果", "企学星部门保存同步失败"+jsonObject.getString("message")); + errorMap.put(departmentId+"","企学星部门保存同步失败"+jsonObject.getString("message")); + } + FormExport formExport = new FormExport(); + from.put("同步动作", "保存"); + from.put("主要信息", departmentMap.toString()); + List valueExports = formExportUtil.setFormValue(from); + formExport.setValues(valueExports); + //同步记录创建人和钉钉日志创建人共用 + formFactory.importBusinessFormData(configVo.getParamVal(SyncConstants.dingdingLogloginName.name()), + configVo.getParamVal(SyncConstants.qxxLog.name()), + formExport, new String[]{}); + }else{ +// 部门停用删除企学星部门 + JSONObject jsonObject = QixuexingPortUtil.qixuexingDeleteOrg(configVo,departmentId); + String resCode = jsonObject.getString("code"); + if("0".equals(resCode)){ +// 删除成功 + from.put("是否成功", "成功"); + from.put("同步结果", "企学星部门删除同步成功"); + }else{ +// 删除失败 + from.put("是否成功", "失败"); + from.put("同步结果", "企学星部门删除同步失败"+jsonObject.getString("message")); + errorMap.put(departmentId+"","企学星同步部门失败:"+jsonObject.getString("message")); + } + FormExport formExport = new FormExport(); + from.put("同步动作", "删除"); + from.put("主要信息", departmentMap.toString()); + List valueExports = formExportUtil.setFormValue(from); + formExport.setValues(valueExports); + //同步记录创建人和钉钉日志创建人共用 + formFactory.importBusinessFormData(configVo.getParamVal(SyncConstants.dingdingLogloginName.name()), + configVo.getParamVal(SyncConstants.qxxLog.name()), + formExport, new String[]{}); + } + } + return errorMap; + } + + public String qixuexingSyncAllMembers(){ + String res = ""; +// 根据列表查询生成列表部门对象 + Map errorMap = null; + try { +// 根据上一次同步时间获取最新修改的单位信息 + List> incrementMembers = srcMemberDao.getAllMembers(); + List> orgMembers = v3xOrgMembertoMemberMap(incrementMembers); + errorMap = qinxuexingSyncBatchMemberMap(orgMembers); + } catch (BusinessException e) { + e.printStackTrace(); + } catch (ServiceException e) { + e.printStackTrace(); + } + log.info("人员异常数"+errorMap.size()); + for (Map.Entry entry : errorMap.entrySet()) { + String value = entry.getValue(); + res= res+value+";"; + } + return res ; + } + + public String qixuexingSyncBatchMember(String startDate){ + String res = ""; +// 根据列表查询生成列表部门对象 + Map errorMap = null; + try { +// 根据上一次同步时间获取最新修改的单位信息 + List> incrementMembers = srcMemberDao.getMembersByStartDate(startDate); + List> orgMembers = v3xOrgMembertoMemberMap(incrementMembers); + errorMap = qinxuexingSyncBatchMemberMap(orgMembers); + } catch (BusinessException e) { + e.printStackTrace(); + } catch (ServiceException e) { + e.printStackTrace(); + } + log.info("人员异常数"+errorMap.size()); + for (Map.Entry entry : errorMap.entrySet()) { + String value = entry.getValue(); + res= res+value+";"; + } + return res ; + } + +// 通过人员列表ID查询人员对象列表 + public List> v3xOrgMembertoMemberMap(List> incrementMembers) { + List> orgMembers = new ArrayList<>(); + ConfigVo configVo = this.cstConfigApi.getConfig(this.getPluginId()); + for(Map incrementMember :incrementMembers){ + if(incrementMember.get("id")!=null){ + String departmentId = incrementMember.get("org_department_id").toString(); + JSONObject select = QixuexingPortUtil.qixuexingSelectOrg(configVo,departmentId); + String selectCode = select.getString("code"); +// 如果上级不存在则跳过当前单位信息 + if(!"0".equals(selectCode)){ + continue; + }else{ + String selectData = select.getString("data"); + if(selectData.length()==0){ + continue; + } + } + String memberId = incrementMember.get("id").toString(); +// 此方法无法查询已经离职人员信息 + Map memberMap = archiveDao.getMemberArchiveByMemberId(Long.parseLong(memberId)); + orgMembers.add(memberMap); + } + } + return orgMembers; + } + + public Map qinxuexingSyncBatchMemberMap(List> list) throws BusinessException, ServiceException { + ConfigVo configVo = this.cstConfigApi.getConfig(this.getPluginId()); + Map errorMap = new HashMap<>(); + for(Map memberMap : list){ + Map from = new HashMap(); + String memberId = memberMap.get("id").toString(); + String memberName = memberMap.get("name").toString(); +// 设置日志保存数据 + from.put("同步类型", "人员"); + from.put("同步时间", sdf.format(new Date())); + from.put("同步对象", memberName); + String memberState = memberMap.get("member_state").toString(); + CtpEnumItem stateEnum = getEnumManagerNew().getCtpEnumItem(Long.parseLong(memberState)); + if("1".equals(stateEnum.getValue()) || "0".equals(stateEnum.getValue())){ +// 封装当前环境单位数据,调用部门保存接口,保存企学星部门信息 + String memberSex = memberMap.get("sex") !=null ?memberMap.get("sex").toString():""; + CtpEnumItem sexEnum ; + if(StringUtil.isNotEmpty(memberSex)){ + sexEnum = getEnumManagerNew().getCtpEnumItem(Long.parseLong(memberSex)); + memberMap.put("member_sex",sexEnum.getShowvalue()); + } + memberMap.put("member_status","1"); + JSONObject jsonObject = QixuexingPortUtil.qixuexingSaveUser(configVo,memberMap); + String resCode = jsonObject.getString("code"); + if("0".equals(resCode)){ +// 保存成功 + from.put("是否成功", "成功"); + from.put("同步结果", "企学星用户保存同步成功"); + }else{ +// 保存失败 + from.put("是否成功", "失败"); + from.put("同步结果", "企学星用户保存同步失败"+jsonObject.getString("message")); + errorMap.put(memberId+"","企学星用户保存同步失败"+jsonObject.getString("message")); + } + FormExport formExport = new FormExport(); + from.put("同步动作", "保存"); + from.put("主要信息", memberMap.toString()); + List valueExports = formExportUtil.setFormValue(from); + formExport.setValues(valueExports); + //同步记录创建人和钉钉日志创建人共用 + formFactory.importBusinessFormData(configVo.getParamVal(SyncConstants.dingdingLogloginName.name()), + configVo.getParamVal(SyncConstants.qxxLog.name()), + formExport, new String[]{}); + }else{ +// 部门停用删除企学星部门 + JSONObject jsonObject = QixuexingPortUtil.qixuexingDeleteUser(configVo,memberId); + String resCode = jsonObject.getString("code"); + if("0".equals(resCode)){ +// 删除成功 + from.put("是否成功", "成功"); + from.put("同步结果", "企学星用户删除同步成功"); + }else{ +// 删除失败 + from.put("是否成功", "失败"); + from.put("同步结果", "企学星用户删除同步失败"+jsonObject.getString("message")); + errorMap.put(memberId+"","企学星用户部门失败:"+jsonObject.getString("message")); + } + FormExport formExport = new FormExport(); + from.put("同步动作", "删除"); + from.put("主要信息", memberMap.toString()); + List valueExports = formExportUtil.setFormValue(from); + formExport.setValues(valueExports); + //同步记录创建人和钉钉日志创建人共用 + formFactory.importBusinessFormData(configVo.getParamVal(SyncConstants.dingdingLogloginName.name()), + configVo.getParamVal(SyncConstants.qxxLog.name()), + formExport, new String[]{}); + } + } + return errorMap; + } + + public String qixuexingSyncAllServiceBrokers(){ + String res = ""; +// 根据列表查询生成列表部门对象 + Map errorMap = null; + try { +// 根据上一次同步时间获取最新修改的单位信息 + List> serviceBrokers = archiveDao.getServiceBrokers(); + errorMap = qinxuexingSyncBatchServiceBroker(serviceBrokers); + } catch (BusinessException e) { + e.printStackTrace(); + } catch (ServiceException e) { + e.printStackTrace(); + } + log.info("业代异常数"+errorMap.size()); + for (Map.Entry entry : errorMap.entrySet()) { + String value = entry.getValue(); + res= res+value+";"; + } + return res ; + } + + public String qixuexingSyncServiceBroker(String startDate){ + String res = ""; +// 根据列表查询生成列表部门对象 + Map errorMap = null; + try { +// 根据上一次同步时间获取最新修改的单位信息 + List> serviceBrokers = archiveDao.getServiceBrokers(startDate); + errorMap = qinxuexingSyncBatchServiceBroker(serviceBrokers); + } catch (BusinessException e) { + e.printStackTrace(); + } catch (ServiceException e) { + e.printStackTrace(); + } + log.info("业代异常数"+errorMap.size()); + for (Map.Entry entry : errorMap.entrySet()) { + String value = entry.getValue(); + res= res+value+";"; + } + return res ; + } + + public Map qinxuexingSyncBatchServiceBroker(List> list) throws BusinessException, ServiceException { + ConfigVo configVo = this.cstConfigApi.getConfig(this.getPluginId()); + Map errorMap = new HashMap<>(); + for(Map serviceBrokerMap : list){ + Map from = new HashMap(); + String serviceBrokerId = serviceBrokerMap.get("id").toString(); + String serviceBrokerName = serviceBrokerMap.get("name").toString(); +// 设置日志保存数据 + from.put("同步类型", "业代/客户"); + from.put("同步时间", sdf.format(new Date())); + from.put("同步对象", serviceBrokerName); + String serviceBrokerState = serviceBrokerMap.get("state").toString(); + CtpEnumItem stateEnum = getEnumManagerNew().getCtpEnumItem(Long.parseLong(serviceBrokerState)); + if("1".equals(stateEnum.getValue()) || "0".equals(stateEnum.getValue())){ +// 封装当前环境单位数据,调用部门保存接口,保存企学星部门信息 + String memberSex = serviceBrokerMap.get("sex") !=null ?serviceBrokerMap.get("sex").toString():""; + CtpEnumItem sexEnum ; + if(StringUtil.isNotEmpty(memberSex)){ + sexEnum = getEnumManagerNew().getCtpEnumItem(Long.parseLong(memberSex)); + serviceBrokerMap.put("member_sex",sexEnum.getShowvalue()); + } + serviceBrokerMap.put("member_status","1"); + JSONObject jsonObject = QixuexingPortUtil.qixuexingSaveUserServiceBroker(configVo,serviceBrokerMap); + String resCode = jsonObject.getString("code"); + if("0".equals(resCode)){ +// 保存成功 + from.put("是否成功", "成功"); + from.put("同步结果", "企学星业代用户保存同步成功"); + }else{ +// 保存失败 + from.put("是否成功", "失败"); + from.put("同步结果", "企学星业代用户保存同步失败"+jsonObject.getString("message")); + errorMap.put(serviceBrokerId+"","企学星业代用户保存同步失败"+jsonObject.getString("message")); + } + FormExport formExport = new FormExport(); + from.put("同步动作", "保存"); + from.put("主要信息", serviceBrokerMap.toString()); + List valueExports = formExportUtil.setFormValue(from); + formExport.setValues(valueExports); + //同步记录创建人和钉钉日志创建人共用 + formFactory.importBusinessFormData(configVo.getParamVal(SyncConstants.dingdingLogloginName.name()), + configVo.getParamVal(SyncConstants.qxxLog.name()), + formExport, new String[]{}); + }else{ +// 部门停用删除企学星部门 + JSONObject jsonObject = QixuexingPortUtil.qixuexingDeleteUserServiceBroker(configVo,serviceBrokerId); + String resCode = jsonObject.getString("code"); + if("0".equals(resCode)){ +// 删除成功 + from.put("是否成功", "成功"); + from.put("同步结果", "企学星业代用户删除同步成功"); + }else{ +// 删除失败 + from.put("是否成功", "失败"); + from.put("同步结果", "企学星业代用户删除同步失败"+jsonObject.getString("message")); + errorMap.put(serviceBrokerId+"","企学星业代用户部门失败:"+jsonObject.getString("message")); + } + FormExport formExport = new FormExport(); + from.put("同步动作", "删除"); + from.put("主要信息", serviceBrokerMap.toString()); + List valueExports = formExportUtil.setFormValue(from); + formExport.setValues(valueExports); + //同步记录创建人和钉钉日志创建人共用 + formFactory.importBusinessFormData(configVo.getParamVal(SyncConstants.dingdingLogloginName.name()), + configVo.getParamVal(SyncConstants.qxxLog.name()), + formExport, new String[]{}); + } + } + return errorMap; + } + + public String qixuexingSyncAllClientMembers(){ + String res = ""; +// 根据列表查询生成列表部门对象 + Map errorMap = null; + try { +// 根据上一次同步时间获取最新修改的单位信息 + List> incrementMembers = srcMemberDao.getAllClientMembers(); + List> orgMembers = clientMembertoMemberMap(incrementMembers); + errorMap = qixuexingSyncBatchClientMember(orgMembers); + } catch (BusinessException e) { + e.printStackTrace(); + } catch (ServiceException e) { + e.printStackTrace(); + } + log.info("客户异常数"+errorMap.size()); + for (Map.Entry entry : errorMap.entrySet()) { + String value = entry.getValue(); + res= res+value+";"; + } + return res ; + } + + public String qixuexingSyncClientMember(String startDate){ + String res = ""; +// 根据列表查询生成列表部门对象 + Map errorMap = null; + try { +// 根据上一次同步时间获取最新修改的单位信息 + List> incrementMembers = archiveDao.getClientMembersByModifyDate(startDate); + List> orgMembers = clientMembertoMemberMap(incrementMembers); + errorMap = qixuexingSyncBatchClientMember(orgMembers); + } catch (BusinessException e) { + e.printStackTrace(); + } catch (ServiceException e) { + e.printStackTrace(); + } + log.info("客户异常数"+errorMap.size()); + for (Map.Entry entry : errorMap.entrySet()) { + String value = entry.getValue(); + res= res+value+";"; + } + return res ; + } + + public List> clientMembertoMemberMap(List> incrementMembers){ + List> orgMembers = new ArrayList<>(); +// ConfigVo configVo = this.cstConfigApi.getConfig(this.getPluginId()); + for(Map incrementMember :incrementMembers){ + if(incrementMember.get("id")!=null){ + String clientMemberId = incrementMember.get("id").toString(); +// 此方法无法查询已经离职人员信息 + Map memberMap = archiveDao.getMemberArchiveByClientMemberId(Long.parseLong(clientMemberId)); + orgMembers.add(memberMap); + } + } + return orgMembers; + } + + public Map qixuexingSyncBatchClientMember(List> list) throws BusinessException, ServiceException { + ConfigVo configVo = this.cstConfigApi.getConfig(this.getPluginId()); + Map errorMap = new HashMap<>(); + for(Map clientMemberMap : list){ + Map from = new HashMap(); + String clientMemberId = clientMemberMap.get("id").toString(); + String clientMemberName = clientMemberMap.get("name").toString(); +// 设置日志保存数据 + from.put("同步类型", "业代/客户"); + from.put("同步时间", sdf.format(new Date())); + from.put("同步对象", clientMemberName); + String memberState = clientMemberMap.get("member_state").toString(); + CtpEnumItem stateEnum = getEnumManagerNew().getCtpEnumItem(Long.parseLong(memberState)); + if("1".equals(stateEnum.getValue()) || "0".equals(stateEnum.getValue())){ +// 封装当前环境单位数据,调用部门保存接口,保存企学星部门信息 + String memberSex = clientMemberMap.get("sex") !=null ?clientMemberMap.get("sex").toString():""; + CtpEnumItem sexEnum ; + if(StringUtil.isNotEmpty(memberSex)){ + sexEnum = getEnumManagerNew().getCtpEnumItem(Long.parseLong(memberSex)); + clientMemberMap.put("member_sex",sexEnum.getShowvalue()); + } + clientMemberMap.put("member_status","1"); + JSONObject jsonObject = QixuexingPortUtil.qixuexingSaveUserClientMember(configVo,clientMemberMap); + String resCode = jsonObject.getString("code"); + if("0".equals(resCode)){ +// 保存成功 + from.put("是否成功", "成功"); + from.put("同步结果", "企学星客户用户保存同步成功"); + }else{ +// 保存失败 + from.put("是否成功", "失败"); + from.put("同步结果", "企学星客户用户保存同步失败"+jsonObject.getString("message")); + errorMap.put(clientMemberId+"","企学星客户用户保存同步失败"+jsonObject.getString("message")); + } + FormExport formExport = new FormExport(); + from.put("同步动作", "保存"); + from.put("主要信息", clientMemberMap.toString()); + List valueExports = formExportUtil.setFormValue(from); + formExport.setValues(valueExports); + //同步记录创建人和钉钉日志创建人共用 + formFactory.importBusinessFormData(configVo.getParamVal(SyncConstants.dingdingLogloginName.name()), + configVo.getParamVal(SyncConstants.qxxLog.name()), + formExport, new String[]{}); + }else{ +// 部门停用删除企学星部门 + JSONObject jsonObject = QixuexingPortUtil.qixuexingDeleteUserClientMember(configVo,clientMemberId); + String resCode = jsonObject.getString("code"); + if("0".equals(resCode)){ +// 删除成功 + from.put("是否成功", "成功"); + from.put("同步结果", "企学星客户用户删除同步成功"); + }else{ +// 删除失败 + from.put("是否成功", "失败"); + from.put("同步结果", "企学星客户用户删除同步失败"+jsonObject.getString("message")); + errorMap.put(clientMemberId+"","企学星客户用户部门失败:"+jsonObject.getString("message")); + } + FormExport formExport = new FormExport(); + from.put("同步动作", "删除"); + from.put("主要信息", clientMemberMap.toString()); + List valueExports = formExportUtil.setFormValue(from); + formExport.setValues(valueExports); + //同步记录创建人和钉钉日志创建人共用 + formFactory.importBusinessFormData(configVo.getParamVal(SyncConstants.dingdingLogloginName.name()), + configVo.getParamVal(SyncConstants.qxxLog.name()), + formExport, new String[]{}); + } + } + return errorMap; + } + +// public String qixuexingSyncAllPosts () { +// return null; +// } +// +// public String qixuexingSyncAllLevels () { +// +// return null; +// } + +// public String qixuexingSyncBatchPost(String startDate){ +// +// return null; +// } +// +// public String qixuexingSyncBatchLevel(String startDate){ +// +// return null; +// } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/server/OrganizationOrgSyncServer.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/server/OrganizationOrgSyncServer.java new file mode 100644 index 0000000..6dcffc7 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/server/OrganizationOrgSyncServer.java @@ -0,0 +1,273 @@ +package com.seeyon.apps.src_mainorganization.server; + + +import cn.hutool.log.Log; +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.common.plugin.vo.ConfigVo; +import com.seeyon.apps.src_mainorganization.bo.ThirdDeptBo; +import com.seeyon.apps.src_mainorganization.bo.ThirdMemberBo; +import com.seeyon.apps.src_mainorganization.bo.ThirdPostBo; +import com.seeyon.apps.src_mainorganization.constans.SyncConstants; +import com.seeyon.apps.src_mainorganization.dao.ISyncFvDao; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.organization.bo.*; +import com.seeyon.ctp.organization.manager.OrgManager; +import org.apache.commons.lang.StringUtils; + +import javax.inject.Inject; +import java.sql.SQLException; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class OrganizationOrgSyncServer { + + private static Log log = Log.get(OrganizationOrgSyncServer.class); + @Inject + private ICstConfigApi cstConfigApi; + @Inject + private OrgManager orgManager; + @Inject + private ISyncFvDao syncFvDao; + + public String getPluginId() { + return SyncConstants.getPluginId(); + } + +// 客户服务平台单位同步 + public Map fvSyncBatchAccount(List list){ + Map errorMap = new HashMap<>(); + ConfigVo configVo = this.cstConfigApi.getConfig(this.getPluginId()); + log.info("执行数据筛选,只处理客户单位下的所有单位信息"); + List thirdDeparts = list.stream().filter((account) -> { + String path = account.getPath(); + return path.startsWith("00000017"); + }).map((account) -> { + return new ThirdDeptBo(account); + }).collect(Collectors.toList()); + log.info("遍历获取到的所有单位信息。"); + for(int i = 0; i < thirdDeparts.size(); ++i) { + ThirdDeptBo thirdDepart = thirdDeparts.get(i); + System.out.println(thirdDepart.getName() + thirdDepart.getCode() + thirdDepart.getId()); + log.info(thirdDepart.getName()+thirdDepart.getCode()+thirdDepart.getId()); +// 同步单位单位信息,通过中间库同步单位信息。客户服务平台同步操作 + boolean bool = syncFvDao.queryUnitById(thirdDepart.getId()+""); + log.info("调用接口查询是否存在中间库数据"+bool); + if(bool){ +// 当前修改单位存在,执行变更方法 + int updateUnitNum = syncFvDao.updateUnit(thirdDepart); + log.info("执行修改方法当前修改结果为"+updateUnitNum+"当前修改参数为"+thirdDepart); + if(updateUnitNum==0){ + System.out.println("修改失败"+thirdDepart.getName()+thirdDepart.getId()); + errorMap.put(thirdDepart.getId()+"","客户服务平台修改单位失败:"+thirdDepart.getName()); + } + }else{ +// 当前修改单位不存在,执行新增方法 + int addUnitNum = syncFvDao.addUnit(thirdDepart); + log.info("执行新增方法当前新增结果为"+addUnitNum+"当前新增数据为"+thirdDepart); + if(addUnitNum==0){ + System.out.println("添加失败"+thirdDepart.getName()+thirdDepart.getId()); + errorMap.put(thirdDepart.getId()+"","客户服务平台新增单位失败:"+thirdDepart.getName()); + } + } + } + return errorMap; + } + +// 客户服务平台部门同步 + public Map fvSyncBatchDepartment(List list) throws SQLException { + Map errorMap = new HashMap<>(); + ConfigVo configVo = this.cstConfigApi.getConfig(this.getPluginId()); +//通过路径筛选出需要同步人部门数据 + log.info("执行数据筛选,只处理客户单位下的所有部门信息同步"); + List thirdDeparts = list.stream().filter((department) ->{ + String path = department.getPath(); + return path.startsWith("00000017"); + }).map((department) -> { + return new ThirdDeptBo( department); + }).collect(Collectors.toList()); + log.info("遍历筛选后的所有部门信息"); + for(int i = 0 ; i < thirdDeparts.size() ; i++){ + ThirdDeptBo thirdDepart = thirdDeparts.get(i); + log.info(thirdDepart.getName() + thirdDepart.getCode() + thirdDepart.getId()); +// 同步单位单位信息,通过中间库同步单位信息。客户服务平台同步操作 + boolean bool = syncFvDao.queryDeptById(thirdDepart.getId()+""); + log.info("查询当前部门是否在中间库存在"+bool); + if(bool){ +// 当前修改单位存在,执行变更方法 + int updateDeptNum = syncFvDao.updateDept(thirdDepart); + log.info("执行修改方法当前修改结果为"+updateDeptNum+"当前修改参数为"+thirdDepart); + if(updateDeptNum==0){ + System.out.println("修改失败"+thirdDepart.getName()+thirdDepart.getId()); + errorMap.put(thirdDepart.getId()+"","客户服务平台修改部门失败:"+thirdDepart.getName()+"("+thirdDepart.getId()+")"); + } + }else{ +// 当前修改单位不存在,执行新增方法 + int addDeptNum = syncFvDao.addDept(thirdDepart); + log.info("执行新增方法当前新增结果为"+addDeptNum+"当前新增数据为"+thirdDepart); + if(addDeptNum==0){ + System.out.println("添加失败"+thirdDepart.getName()+thirdDepart.getId()); + errorMap.put(thirdDepart.getId()+"","客户服务平台新增部门失败:"+thirdDepart.getName()+"("+thirdDepart.getId()+")"); + } + } + } + return errorMap; + } + +// 客户服务平台岗位同步 + public Map fvSyncBatchPost(List list){ + Map errorMap = new HashMap<>(); + ConfigVo configVo = this.cstConfigApi.getConfig(this.getPluginId()); + String companyId = configVo.getParamVal(SyncConstants.companyId.name()); +// 通过路径筛选出需要同步人部门数据 + log.info("执行数据筛选,只处理客户单位下的所有岗位信息同步"); + List thirdPosts = list.stream().filter((post) ->{ + String path = ""; + try { + long postAccountId = post.getOrgAccountId(); + V3xOrgAccount memberAccount = orgManager.getAccountById(postAccountId); + path = memberAccount.getPath(); + } catch (BusinessException e) { + e.printStackTrace(); + } + return path.startsWith("00000017"); + }).map((post) -> { + return new ThirdPostBo(companyId, post); + }).collect(Collectors.toList()); + log.info("遍历筛选后的所有岗位信息"); + for(int i = 0 ; i < thirdPosts.size() ; i++){ + try { + ThirdPostBo thirdPost = thirdPosts.get(i); + log.info(thirdPost.getName() + thirdPost.getCode() + thirdPost.getId()); +// 通过当前修改岗位信息查看是否存在基准岗位信息 + String banchmarkPostId = syncFvDao.queryBanchmarkPostIdByPostId(thirdPost.getId()+""); + log.info("根据当前岗位信息查询基准岗位ID"+banchmarkPostId+"判断当前当前岗位是否存在基准刚"); +// 存在基准岗位信息根据岗位信息查询基准岗位信息 + if(StringUtils.isNotEmpty(banchmarkPostId)){ +// 根据基准岗位ID查询中间表岗位信息是否存在 + boolean bool = syncFvDao.queryPostById(banchmarkPostId); + log.info("查询当前岗位是否在中间库存在"+bool); +// 根据基准岗位ID查询基准岗位信息 + V3xOrgPost v3xOrgPost = orgManager.getPostById(Long.parseLong(banchmarkPostId)); + if(bool){ +// 中间表岗位信息存在则执行修改方法,修改中间表岗位信息 + int updatePostNum = syncFvDao.updatePost(v3xOrgPost); + log.info("执行修改方法当前修改结果为"+updatePostNum+"当前修改参数为"+v3xOrgPost); + if(updatePostNum==0){ + System.out.println("修改失败"+v3xOrgPost.getName()+v3xOrgPost.getId()); + errorMap.put(v3xOrgPost.getId()+"","客户服务平台修改岗位失败:"+v3xOrgPost.getName()+"("+v3xOrgPost.getId()+")"); + } + }else{ +// 中间表岗位信息不存在则执行新增方法,增加中间表岗位信息 + int addPostNum = syncFvDao.addPost(v3xOrgPost); + log.info("执行新增方法当前新增结果为"+addPostNum+"当前新增数据为"+v3xOrgPost); + if(addPostNum==0){ + System.out.println("添加失败"+v3xOrgPost.getName()+v3xOrgPost.getId()); + errorMap.put(v3xOrgPost.getId()+"","客户服务平台新增岗位失败:"+v3xOrgPost.getName()+"("+v3xOrgPost.getId()+")"); + } + } + } + } catch (BusinessException e) { + e.printStackTrace(); + } + } + return errorMap; + } + +// 客户服务平台人员同步 + public Map fvSyncBatchMember(List list) throws InterruptedException, BusinessException { + Map errorMap = new HashMap<>(); + ConfigVo configVo = this.cstConfigApi.getConfig(this.getPluginId()); +// 循环遍历人员列表 + log.info("执行数据筛选,只处理客户单位下有的所人员信息同步"); + List thirdMembers = (List)list.stream().filter((member) ->{ + String path = ""; + try { + long memeberAccountId = member.getOrgAccountId(); + V3xOrgAccount memberAccount = orgManager.getAccountById(memeberAccountId); + path = memberAccount.getPath(); + } catch (BusinessException e) { + e.printStackTrace(); + } + return path.startsWith("00000017"); + }).map((member) -> { + ThirdMemberBo thirdMember = null; + try { + thirdMember = new ThirdMemberBo(member,"fv"); + return thirdMember; + } catch (BusinessException e) { + e.printStackTrace(); + } + return thirdMember; + }).collect(Collectors.toList()); + log.info("遍历筛选后所有的人员信息"); +// 判断筛选后的人员是都存在于不同步目录中(不同步目录显示为组织架构名称) + String customerServiceBlacklist = configVo.getParamVal(SyncConstants.customerServiceBlacklist.name()); + List customerServiceBlacklistList = Arrays.stream(customerServiceBlacklist.split("[,,]")) + .map(String::trim) // 去除每个元素的前后空格 + .collect(Collectors.toList()); + for(int i = 0 ; i < thirdMembers.size(); i++){ + ThirdMemberBo thirdMember = thirdMembers.get(i); +// 判断当前人员名称是否在黑名单列表中存在 + if(customerServiceBlacklistList.contains(thirdMember.getName())){ +// 如果包含此元素,则跳过当前人员同步 + log.info("当前人员信息在客户服务平台同步黑名单中存在,跳过处理"+thirdMember.getName()); + continue; + } +// 循环三次查询三次是否存在当前人员档案 + log.info("根据当前人员信息查询人员档案是否存在"); + for(int n = 0 ;n < 4 ; n++){ + Map memeberMap = syncFvDao.queryMemberArchiveByMemberId(thirdMember.getId()+""); + if(memeberMap==null){ + log.info("人员档案不存在等待5秒后再次执行"+"当前执行次数"+n+1); + Thread.sleep(5000); + continue; + }else{ +// 查询当前岗位是否为商务专员 + long accountPostId = thirdMember.getPostId(); + V3xOrgPost accountPost = orgManager.getPostById(accountPostId); + if("商务专员".equals(accountPost.getName())||"商家人员".equals(accountPost.getName())){ + errorMap.put(thirdMember.getId()+"","客户服务平台新增人员跳过:"+thirdMember.getName()+"("+thirdMember.getId()+")岗位为商务专员和商家人员跳过当前人员同步"); + continue; + } + long postId = thirdMember.getPostId(); + V3xOrgPost v3xOrgPost = orgManager.getPostById(postId); + if("客户老板".equals(v3xOrgPost.getName())){ + memeberMap.put("phone",thirdMember.getLoginName()); + } +// 查询中间库是否存在当前修改人员数据 + Map memeberHelpMap = syncFvDao.queryMemberHelpByMemberId(thirdMember.getId()+""); + log.info("查询当前岗位是否在中间库存在"+memeberHelpMap.size()); +// 同步人员信息,通过中间库同步人员信息。客户服务平台同步操作 +// 处理查询到的人员数据 + if(memeberHelpMap.size()>0){ +// 当前修改人员存在,执行变更方法 + int updateMemberNum = syncFvDao.updateMember(thirdMember,memeberMap); + log.info("执行修改方法当前修改结果为"+updateMemberNum+"当前修改参数为"+thirdMember); + if(updateMemberNum==0){ + System.out.println("修改失败"+thirdMember.getName()+thirdMember.getId()); + errorMap.put(thirdMember.getId()+"","客户服务平台修改人员失败:"+thirdMember.getName()+"("+thirdMember.getId()+")"); + } + }else{ +// 当前修改人员不存在,执行新增方法 + int addMemberNum = syncFvDao.addMember(thirdMember,memeberMap); + log.info("执行修改方法当前修改结果为"+addMemberNum+"当前修改参数为"+thirdMember); + if(addMemberNum==0){ + System.out.println("添加失败"+thirdMember.getName()+thirdMember.getId()); + errorMap.put(thirdMember.getId()+"","客户服务平台新增人员失败:"+thirdMember.getName()+"("+thirdMember.getId()+")"); + } + } + } + } + } + return errorMap; + } + + + + + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/service/IReceiveOrgDepartmentService.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/service/IReceiveOrgDepartmentService.java new file mode 100644 index 0000000..db075e1 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/service/IReceiveOrgDepartmentService.java @@ -0,0 +1,36 @@ +package com.seeyon.apps.src_mainorganization.service; + +import com.alibaba.fastjson.JSONObject; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.seeyon.apps.src_mainorganization.bo.ReceiveOrgMemberResponse; +import com.seeyon.ctp.common.exceptions.BusinessException; + +import java.sql.SQLException; +import java.text.ParseException; + +public interface IReceiveOrgDepartmentService { + + /** + * 调用接口修改部门信息 + * @param memberParam + * @return + */ + public ReceiveOrgMemberResponse updateDepartmentMain(JSONObject memberParam) throws BusinessException, ParseException, JsonProcessingException; + + + /** + * 调用接口修改部门跨单位调动 + * @param memberParam + * @return + */ + public ReceiveOrgMemberResponse updateDepartmentSpanAccount(JSONObject memberParam) throws BusinessException, ParseException, JsonProcessingException; + + + /** + * 调用接口获取单位部门列表 + * @param deptParam + * @return + */ + public ReceiveOrgMemberResponse queryDepartmentMain (JSONObject deptParam) throws BusinessException, SQLException; + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/service/IReceiveOrgMemberService.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/service/IReceiveOrgMemberService.java new file mode 100644 index 0000000..48e343f --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/service/IReceiveOrgMemberService.java @@ -0,0 +1,42 @@ +package com.seeyon.apps.src_mainorganization.service; + +import com.alibaba.fastjson.JSONObject; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.seeyon.apps.src_mainorganization.bo.ReceiveOrgMemberResponse; +import com.seeyon.ctp.common.exceptions.BusinessException; + +import java.sql.SQLException; +import java.text.ParseException; + +public interface IReceiveOrgMemberService { + + /** + * 调用接口保存人员到组织架构平台 + * @param memberParam + * @return + */ + public ReceiveOrgMemberResponse saveMemberMain(JSONObject memberParam) throws BusinessException, ParseException, JsonProcessingException; + + /** + * 调用接口更新人员到组织架构平台 + * @param memberParam + * @return + */ + public ReceiveOrgMemberResponse updateMemberMain(JSONObject memberParam) throws BusinessException, ParseException, JsonProcessingException; + + /** + * 调用接口查询人员数据 + * @param param + * @return + */ + public ReceiveOrgMemberResponse queryMemberMain(JSONObject param) throws BusinessException, SQLException; + + + /** + * 调用接口查询人员数据 + * @param param + * @return + */ + public ReceiveOrgMemberResponse queryFHMemberMain(JSONObject param) throws BusinessException, SQLException; + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/service/IReceiveSrcCustomerService.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/service/IReceiveSrcCustomerService.java new file mode 100644 index 0000000..defc521 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/service/IReceiveSrcCustomerService.java @@ -0,0 +1,20 @@ +package com.seeyon.apps.src_mainorganization.service; + +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.src_mainorganization.bo.ReceiveOrgMemberResponse; +import com.seeyon.ctp.common.exceptions.BusinessException; + +public interface IReceiveSrcCustomerService { + + /** + * 调用接口查询客户数据 + * @param param + * @return + */ + public ReceiveOrgMemberResponse queryCustomerMain(JSONObject param) throws BusinessException; + + + + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/service/ISrcMemberFormTableService.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/service/ISrcMemberFormTableService.java new file mode 100644 index 0000000..cd3bfbc --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/service/ISrcMemberFormTableService.java @@ -0,0 +1,18 @@ +package com.seeyon.apps.src_mainorganization.service; + +import com.seeyon.apps.src_mainorganization.bo.ReceiveOrgMemberResponse; +import com.seeyon.ctp.common.exceptions.BusinessException; + +public interface ISrcMemberFormTableService { + + /** + * 调用接口查询客户数据 + * @return + */ + public ReceiveOrgMemberResponse saveMemberFormTableMain() throws BusinessException; + + + + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/service/impl/ReceiveOrgDepartmentServiceImpl.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/service/impl/ReceiveOrgDepartmentServiceImpl.java new file mode 100644 index 0000000..9414dce --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/service/impl/ReceiveOrgDepartmentServiceImpl.java @@ -0,0 +1,483 @@ +package com.seeyon.apps.src_mainorganization.service.impl; + +import cn.hutool.log.Log; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.common.plugin.vo.ConfigVo; +import com.seeyon.apps.src_mainorganization.bo.ReceiveOrgMemberResponse; +import com.seeyon.apps.src_mainorganization.bo.ThirdDeptBo; +import com.seeyon.apps.src_mainorganization.constans.SyncConstants; +import com.seeyon.apps.src_mainorganization.dao.ISrcAccountDao; +import com.seeyon.apps.src_mainorganization.dao.ISrcDepartmentDao; +import com.seeyon.apps.src_mainorganization.dao.ISrcLevelDao; +import com.seeyon.apps.src_mainorganization.dao.ISrcPostDao; +import com.seeyon.apps.src_mainorganization.service.IReceiveOrgDepartmentService; +import com.seeyon.apps.src_mainorganization.service.IReceiveOrgMemberService; +import com.seeyon.apps.src_mainorganization.util.ParamUtil; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.organization.bo.*; +import com.seeyon.ctp.organization.manager.OrgManager; +import com.seeyon.ctp.organization.manager.OrgManagerDirect; +import www.seeyon.com.utils.StringUtil; + +import javax.inject.Inject; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.*; + +public class ReceiveOrgDepartmentServiceImpl implements IReceiveOrgDepartmentService { + + private static Log log = Log.get(ReceiveOrgDepartmentServiceImpl.class); + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + public String getPluginId() { + return SyncConstants.getPluginId(); + } + + @Inject + private ICstConfigApi cstConfigApi; + @Inject + private OrgManager orgManager; + @Inject + private OrgManagerDirect orgManagerDirect; + @Inject + private ISrcAccountDao srcAccountDao; + @Inject + private ISrcDepartmentDao srcDepartmentDao; + @Inject + private ISrcPostDao srcPostDao; + @Inject + private ISrcLevelDao srcLevelDao; + @Inject + private IReceiveOrgMemberService receiveOrgMemberService; + + @Override + public ReceiveOrgMemberResponse updateDepartmentMain(JSONObject departmentParam) throws BusinessException, ParseException, JsonProcessingException { + log.info ("进入部门修改接口修改请求参数:"+departmentParam.toString()); + String departmentId = departmentParam.getString("id"); + log.info("当前修改部门ID:"+departmentId); + JSONObject jsonObject = new JSONObject(); +// List mess = new ArrayList<>(); +// 根据ID查询部门信息 + V3xOrgDepartment department = orgManager.getDepartmentById(Long.parseLong(departmentId)); + if(department == null ){ + jsonObject.put("status","2"); + jsonObject.put("msg","修改失败:未查询到对应部门信息"); + jsonObject.put("data",""); + ReceiveOrgMemberResponse receiveOrgMemberResponse = new ReceiveOrgMemberResponse(jsonObject); + return receiveOrgMemberResponse; + } +// 判断是否修改名称 + if(StringUtil.isNotEmpty(departmentParam.getString("name"))){ + department.setName(departmentParam.getString("name")); + } +// 判断是否修改编号 + if(StringUtil.isNotEmpty(departmentParam.getString("code"))){ + department.setCode(departmentParam.getString("code")); + } +// 判断组织架构信息是否修改 + if(departmentParam.getLongValue("superior")!=0){ + department.setSuperior(departmentParam.getLongValue("superior")); + } +// 判断是否修改人员状态1正常2停用 + if(StringUtil.isNotEmpty(departmentParam.getString("state"))){ + department.setStatus(departmentParam.getInteger("state")); + } +// 判断是否修改启用状态 + if(StringUtil.isNotEmpty(departmentParam.getString("enabled"))){ + department.setEnabled(departmentParam.getBooleanValue("enabled")); + } +// 判断是否修改删除状态 + if(StringUtil.isNotEmpty(departmentParam.getString("isDeleted"))){ + department.setIsDeleted(departmentParam.getBooleanValue("isDeleted")); + } + OrganizationMessage mes = orgManagerDirect.updateDepartment(department); + log.info("当前是否修改成功"+mes.isSuccess()); + if(mes.isSuccess()) { + List successMsgs = mes.getSuccessMsgs(); + OrganizationMessage.OrgMessage successMsg =successMsgs.get(0); + V3xOrgEntity v3xOrgEntity = successMsg.getEnt(); + log.info("部门修改成功"+v3xOrgEntity.getName()+":"+v3xOrgEntity.getId()); + jsonObject.put("status","1"); + jsonObject.put("msg","修改成功:"+departmentId); + // 创建ObjectMapper实例 + ObjectMapper objectMapper = new ObjectMapper(); + // 将对象转换为JSON字符串 + String json = objectMapper.writeValueAsString(v3xOrgEntity); + jsonObject.put("data",json); + }else { + log.info("部门修改失败"+mes.getErrorMsgInfos().get(0).getMsgInfo()); + jsonObject.put("status","2"); + jsonObject.put("msg","修改失败:"+mes.getErrorMsgInfos().get(0).getMsgInfo()); + jsonObject.put("data",""); + } + ReceiveOrgMemberResponse receiveOrgMemberResponse = new ReceiveOrgMemberResponse(jsonObject); + return receiveOrgMemberResponse; + } + + + @Override + public ReceiveOrgMemberResponse updateDepartmentSpanAccount(JSONObject departmentParam) throws BusinessException, ParseException, JsonProcessingException { + log.info("进入部门跨单位调动接口,请求参数:"+departmentParam.toString()); + JSONObject jsonObject = new JSONObject(); + List mess = new ArrayList<>(); +// 判断当前修改的部门是否为客户服务平台中的单位 + long orgAccountId = departmentParam.getLongValue("orgAccountId"); + V3xOrgAccount v3xOrgAccount = orgManager.getAccountById(orgAccountId); + log.info("当前修改部门所在单位为:"+v3xOrgAccount.getId()+v3xOrgAccount.getName()); + String accountPath = v3xOrgAccount.getPath(); + if(!accountPath.startsWith("00000017")){ + jsonObject.put("status","2"); + jsonObject.put("msg","修改失败:修改目标单位信息不为客户服务平台的单位,请检查请求参数"); + jsonObject.put("data",""); + ReceiveOrgMemberResponse receiveOrgMemberResponse = new ReceiveOrgMemberResponse(jsonObject); + return receiveOrgMemberResponse; + } + long departmentId = departmentParam.getLongValue("id"); + log.info("当前修改部门ID:"+departmentId); +// List mess = new ArrayList<>(); +// 根据ID查询部门信息 + V3xOrgDepartment department = orgManager.getDepartmentById(departmentId); + log.info("查询到当前ID的部门信息:"+department.getName()); + if(department == null ){ + jsonObject.put("status","2"); + jsonObject.put("msg","修改失败:未查询到对应部门信息"); + jsonObject.put("data",""); + ReceiveOrgMemberResponse receiveOrgMemberResponse = new ReceiveOrgMemberResponse(jsonObject); + return receiveOrgMemberResponse; + } + V3xOrgAccount oldOrgAccount = orgManager.getAccountById(department.getOrgAccountId()); + String oldAccountPath = oldOrgAccount.getPath(); + if(!oldAccountPath.startsWith("00000017")){ + jsonObject.put("status","2"); + jsonObject.put("msg","修改失败:修改部门的单位信息不为客户服务平台的单位,请检查请求参数"); + jsonObject.put("data",""); + ReceiveOrgMemberResponse receiveOrgMemberResponse = new ReceiveOrgMemberResponse(jsonObject); + return receiveOrgMemberResponse; + } +// 判断是否修改名称 + if(StringUtil.isNotEmpty(departmentParam.getString("name"))){ + department.setName(departmentParam.getString("name")); + } +// 判断是否修改编号 + if(StringUtil.isNotEmpty(departmentParam.getString("code"))){ + department.setCode(departmentParam.getString("code")); + } +// 判断组织架构信息是否修改 + if(departmentParam.getLongValue("superior")!=0){ + department.setSuperior(departmentParam.getLongValue("superior")); + } + if(departmentParam.getLongValue("orgAccountId")!=0){ + department.setOrgAccountId(departmentParam.getLongValue("orgAccountId")); + } +// 判断是否修改人员状态1正常2停用 + if(StringUtil.isNotEmpty(departmentParam.getString("state"))){ + department.setStatus(departmentParam.getInteger("state")); + } +// 判断是否修改启用状态 + if(StringUtil.isNotEmpty(departmentParam.getString("enabled"))){ + department.setEnabled(departmentParam.getBooleanValue("enabled")); + } +// 判断是否修改删除状态 + if(StringUtil.isNotEmpty(departmentParam.getString("isDeleted"))){ + department.setIsDeleted(departmentParam.getBooleanValue("isDeleted")); + } + OrganizationMessage mes = orgManagerDirect.updateDepartment(department); + if(mes.isSuccess()) { +// 上级部门修改成功,遍历进行下级所有部门人员信息 + mess.add(mes); + List successMsgs = mes.getSuccessMsgs(); + OrganizationMessage.OrgMessage successMsg =successMsgs.get(0); + V3xOrgEntity v3xOrgEntity = successMsg.getEnt(); + List subOrgDepartments = orgManager.getChildDepartments(department.getId(),false); + log.info("当前部门修改下存在"+subOrgDepartments.size()+"个部门"); +// 遍历查询到的所有下级部门,将单位替换成目标单位后进行保存 + for (V3xOrgDepartment subOrgDepartment : subOrgDepartments) { + subOrgDepartment.setOrgAccountId(departmentParam.getLongValue("orgAccountId")); + OrganizationMessage submes = orgManagerDirect.updateDepartment(subOrgDepartment); + log.info("子部门是否变动成功"+submes.isSuccess()+subOrgDepartment.getName()); + mess.add(submes); + } +// 查询当前部门下人员(递归查询当前部门及下级部门中的人员) + List members = orgManager.getMembersByDepartment(department.getId(),false); + log.info("查询到当前部门下存在的人员信息"+members.size()); +// 判断当前单位是否需要修改 + for (V3xOrgMember member: members) { + JSONObject subMemberJson = new JSONObject(); + subMemberJson.put("id",member.getId()); + subMemberJson.put("orgAccountId",department.getOrgAccountId()); + + long subOrgPostId = member.getOrgPostId(); + log.info("岗位ID"+subOrgPostId+"新单位id"+department.getOrgAccountId()); + String postId = srcPostDao.getPostIdByAccountPost(subOrgPostId,department.getOrgAccountId()); + subMemberJson.put("orgPostId",postId); +// 查询并设置人员职务级别信息 + long subOrgLevelId = member.getOrgLevelId(); + log.info("职务级别ID"+subOrgLevelId+"新单位id"+department.getOrgAccountId()); + String levelId = srcLevelDao.getLevelIdByAccountLevel(subOrgLevelId,department.getOrgAccountId()); + subMemberJson.put("orgLevelId",levelId); + subMemberJson.put("name",member.getName()); + ReceiveOrgMemberResponse rmr = receiveOrgMemberService.updateMemberMain(subMemberJson); + if(rmr.getStatus()!=1){ + log.info("修改失败"+rmr.getStatus()+rmr.getData()+rmr.getMsg()); + return rmr; + } + } + boolean isSuccess = true ; + String msg = ""; + for(OrganizationMessage organizationMessage : mess){ + if(!organizationMessage.isSuccess()){ + isSuccess = false; + log.info("修改失败"+mes.getErrorMsgInfos().get(0).getMsgInfo()); + msg = msg + "修改失败:"+organizationMessage.getErrorMsgInfos().get(0).getMsgInfo(); + } + } + if(!isSuccess){ + jsonObject.put("status","2"); + jsonObject.put("msg",msg); + jsonObject.put("data",""); + } + log.info("部门修改成功"+v3xOrgEntity.getName()+":"+v3xOrgEntity.getId()); + jsonObject.put("status","1"); + jsonObject.put("msg","修改成功:"+departmentId); + // 创建ObjectMapper实例 + ObjectMapper objectMapper = new ObjectMapper(); + // 将对象转换为JSON字符串 + String json = objectMapper.writeValueAsString(v3xOrgEntity); + jsonObject.put("data",json); + }else { + log.info("部门修改失败"+mes.getErrorMsgInfos().get(0).getMsgInfo()); + jsonObject.put("status","2"); + jsonObject.put("msg","修改失败:"+mes.getErrorMsgInfos().get(0).getMsgInfo()); + jsonObject.put("data",""); + } + ReceiveOrgMemberResponse receiveOrgMemberResponse = new ReceiveOrgMemberResponse(jsonObject); + return receiveOrgMemberResponse; + } + + + @Override + public ReceiveOrgMemberResponse queryDepartmentMain(JSONObject deptParam) throws BusinessException, SQLException { + log.info("进入单位部门查询接口,请求参数:"+deptParam.toString()); + ConfigVo configVo = this.cstConfigApi.getConfig(this.getPluginId()); +// 按照层级获取单位部门信息 + String type = deptParam.getString("type"); + + JSONArray accounts = new JSONArray(); +// 创建根目录(默认为稻花香) + ThirdDeptBo thirdDeptBo = new ThirdDeptBo(); + accounts.add(thirdDeptBo.defaultRootDirectory()); + if("finance".equals(type)){//法人架构 +// 判断是否还存在下级 + boolean isExistSubordinate = true; + String superAccountPath = "0000"; + List superPaths = new ArrayList<>(); + List accountPaths = new ArrayList<>(); + List deptPaths = new ArrayList<>(); + superPaths.add(superAccountPath); + accountPaths.add(superAccountPath); + while (isExistSubordinate) { + List temporaryAccountPaths = new ArrayList<>(); + List temporaryDepartmentPaths = new ArrayList<>(); + if(superPaths.size()==0){ + isExistSubordinate = false; + continue; + } +// 清理总列表 + superPaths.clear(); +// 遍历单位路径,查询单位路径下一级的所有单位和部门 + for(String accountPath:accountPaths){ +// 查询到当前路径下的所有单位,遍历后封装成为参数 + List subordinateAccounts = srcAccountDao.getSubordinateAccountByPath(accountPath); + for(String subordinateAccount :subordinateAccounts){ + V3xOrgAccount v3xOrgAccount = orgManager.getAccountById(Long.parseLong(subordinateAccount)); + JSONObject orgAccountJson = thirdDeptBo.financeAccount(v3xOrgAccount); + temporaryAccountPaths.add(v3xOrgAccount.getPath()); + superPaths.add(v3xOrgAccount.getPath()); + accounts.add(orgAccountJson); + } + // 查询当前路径下的所有部门,遍历后封装成参数 + List subordinateDeparemnets = srcDepartmentDao.getSubordinateDepartmentByPath(accountPath); + for(String subordinateDeparemnet :subordinateDeparemnets){ + V3xOrgDepartment v3xOrgDepartment = orgManager.getDepartmentById(Long.parseLong(subordinateDeparemnet)); + JSONObject orgDepartmnetJson = thirdDeptBo.financeDepartment(v3xOrgDepartment); + temporaryDepartmentPaths.add(v3xOrgDepartment.getPath()); + superPaths.add(v3xOrgDepartment.getPath()); + accounts.add(orgDepartmnetJson); + } + } +// 遍历部门路径,查询部门路径下一级的所有部门 + for (String deptPath:deptPaths){ +// 查询当前路径下的所有部门,遍历后封装成参数 + List subordinateDeparemnets = srcDepartmentDao.getSubordinateDepartmentByPath(deptPath); + for(String subordinateDeparemnet :subordinateDeparemnets){ + V3xOrgDepartment v3xOrgDepartment = orgManager.getDepartmentById(Long.parseLong(subordinateDeparemnet)); + JSONObject orgDepartmnetJson = thirdDeptBo.financeDepartment(v3xOrgDepartment); + temporaryDepartmentPaths.add(v3xOrgDepartment.getPath()); + superPaths.add(v3xOrgDepartment.getPath()); + accounts.add(orgDepartmnetJson); + } + } + accountPaths.clear(); + deptPaths.clear(); + accountPaths.addAll(temporaryAccountPaths); + accountPaths.addAll(temporaryDepartmentPaths); + } + }else if("operation".equals(type)){//业务架构 +// 判断是否还存在下级 + boolean isExistSubordinate = true; + String superAccountPath = "0000"; + List superPaths = new ArrayList<>(); + List accountPaths = new ArrayList<>(); + List deptPaths = new ArrayList<>(); + superPaths.add(superAccountPath); + accountPaths.add(superAccountPath); + while (isExistSubordinate) { + List temporaryAccountPaths = new ArrayList<>(); + List temporaryDepartmentPaths = new ArrayList<>(); + if(superPaths.size()==0){ + isExistSubordinate = false; + continue; + } +// 清理总列表 + superPaths.clear(); +// 遍历单位路径,查询单位路径下一级的所有单位和部门 + for(String accountPath:accountPaths){ +// 查询到当前路径下的所有单位,遍历后封装成为参数 + List subordinateAccounts = srcAccountDao.getSubordinateAccountByPath(accountPath); + for(String subordinateAccount :subordinateAccounts){ + V3xOrgAccount v3xOrgAccount = orgManager.getAccountById(Long.parseLong(subordinateAccount)); + if(!v3xOrgAccount.getPath().startsWith("00000017")){ + JSONObject orgAccountJson = thirdDeptBo.financeAccount(v3xOrgAccount); + temporaryAccountPaths.add(v3xOrgAccount.getPath()); + superPaths.add(v3xOrgAccount.getPath()); + accounts.add(orgAccountJson); + } + } +// 查询当前路径下的所有部门,遍历后封装成参数 + List subordinateDeparemnets = srcDepartmentDao.getSubordinateDepartmentByPath(accountPath); + for(String subordinateDeparemnet :subordinateDeparemnets){ + V3xOrgDepartment v3xOrgDepartment = orgManager.getDepartmentById(Long.parseLong(subordinateDeparemnet)); + JSONObject orgDepartmnetJson = thirdDeptBo.financeDepartment(v3xOrgDepartment); + temporaryDepartmentPaths.add(v3xOrgDepartment.getPath()); + superPaths.add(v3xOrgDepartment.getPath()); + accounts.add(orgDepartmnetJson); + } + } +// 遍历部门路径,查询部门路径下一级的所有部门 + for (String deptPath:deptPaths){ +// 查询当前路径下的所有部门,遍历后封装成参数 + List subordinateDeparemnets = srcDepartmentDao.getSubordinateDepartmentByPath(deptPath); + for(String subordinateDeparemnet :subordinateDeparemnets){ + V3xOrgDepartment v3xOrgDepartment = orgManager.getDepartmentById(Long.parseLong(subordinateDeparemnet)); + JSONObject orgDepartmnetJson = thirdDeptBo.financeDepartment(v3xOrgDepartment); + temporaryDepartmentPaths.add(v3xOrgDepartment.getPath()); + superPaths.add(v3xOrgDepartment.getPath()); + accounts.add(orgDepartmnetJson); + } + } + accountPaths.clear(); + deptPaths.clear(); + accountPaths.addAll(temporaryAccountPaths); + accountPaths.addAll(temporaryDepartmentPaths); + } +// 特殊单位处理(当前只存在知与行公司需要补充到供应商单位下) +// 查询特殊公司列表 + String excludeAccount = configVo.getParamVal(SyncConstants.excludeAccount.name()); + String[] excludeAccounts = excludeAccount.split(","); + List accountIds = new ArrayList<>(); + for (String account:excludeAccounts) { + String accountId = srcAccountDao.getAccountId(account); + accountIds.add(accountId); + } + // 使用 HashSet 去重 + Set uniqueSet = new HashSet<>(accountIds); + List uniqueAccountIds = new ArrayList<>(uniqueSet); + int i = 1 ; +// 遍历特殊公司 + for (String accountId: uniqueAccountIds) { + V3xOrgAccount v3xOrgAccount = orgManager.getAccountById(Long.parseLong(accountId)); +// 获取供应商单位信息 + V3xOrgAccount superAccount = orgManager.getAccountById(-4020778099040434485l); +// 查询供应商单位下最大路径 + String maxAccountPath = subordinateAaxAccountPath(superAccount); + String accountPath = ParamUtil.pathIncrease(maxAccountPath,i); +// 将当前部门信息添加到返回值对象中 + JSONObject accountJson = thirdDeptBo.specialAccount(v3xOrgAccount,accountPath,superAccount); + accounts.add(accountJson); +// 获取当前单位下所有部门信息 + List departmentIds = srcDepartmentDao.getDepartmentBySuperPath(v3xOrgAccount.getPath()); + for (String departmentId : departmentIds) { + V3xOrgDepartment v3xOrgDepartment = orgManager.getDepartmentById(Long.parseLong(departmentId)); + JSONObject departmentJson = thirdDeptBo.specialDepartment(v3xOrgDepartment,accountPath); + accounts.add(departmentJson); + } + i++; + } + } + + JSONObject jsonObject = new JSONObject(); + jsonObject.put("status","1"); + jsonObject.put("msg","成功"); + jsonObject.put("data",accounts); + ReceiveOrgMemberResponse receiveOrgMemberResponse = new ReceiveOrgMemberResponse(jsonObject); + return receiveOrgMemberResponse; + } + + + + private String subordinateAaxAccountPath (V3xOrgAccount v3xOrgAccount) throws BusinessException { + List subordinateAccountIds = srcAccountDao.getSubordinateAccountByPath(v3xOrgAccount.getPath()); +// 获取下级部门path最大值 + String maxPath = null; + V3xOrgAccount maxPathAccount = null; + int maxLast4Digits = Integer.MIN_VALUE; + for(String subordinateAccountId : subordinateAccountIds){ + try { + // 1. 根据ID查询账户对象 + V3xOrgAccount subordinateAccount = orgManager.getAccountById(Long.parseLong(subordinateAccountId)); + if (subordinateAccount == null || subordinateAccount.getPath() == null) { + continue; // 跳过无效账户 + } + // 2. 提取path的最后4位 + String path = subordinateAccount.getPath(); + if (path.length() < 4) { + continue; // 跳过长度不足的path + } + String last4Str = path.substring(path.length() - 4); + // 3. 转换为数字并比较 + int last4Digits = Integer.parseInt(last4Str); + if (last4Digits > maxLast4Digits) { + maxLast4Digits = last4Digits; + maxPath = path; + maxPathAccount = subordinateAccount; + } + } catch (NumberFormatException e) { + // 处理ID转换异常 + System.err.println("Invalid account ID: " + subordinateAccountId); + } catch (Exception e) { + // 其他异常处理 + System.err.println("Error processing account: " + subordinateAccountId); + e.printStackTrace(); + } + } + // 输出结果 + if (maxPathAccount != null) { + System.out.println("最大path值: " + maxPath); + System.out.println("最后四位数字: " + maxLast4Digits); + } else { + System.out.println("未找到有效的下级部门"); + } + return maxPath; + } + + + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/service/impl/ReceiveOrgMemberServiceImpl.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/service/impl/ReceiveOrgMemberServiceImpl.java new file mode 100644 index 0000000..c805954 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/service/impl/ReceiveOrgMemberServiceImpl.java @@ -0,0 +1,995 @@ +package com.seeyon.apps.src_mainorganization.service.impl; + +import cn.hutool.log.Log; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.seeyon.apps.addressbook.manager.AddressBookCustomerFieldInfoManager; +import com.seeyon.apps.addressbook.po.AddressBook; +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.common.plugin.vo.ConfigVo; +import com.seeyon.apps.src_mainorganization.bo.ReceiveOrgMemberResponse; +import com.seeyon.apps.src_mainorganization.bo.ThirdMemberBo; +import com.seeyon.apps.src_mainorganization.constans.SyncConstants; +import com.seeyon.apps.src_mainorganization.dao.IArchiveDao; +import com.seeyon.apps.src_mainorganization.dao.ISrcAccountDao; +import com.seeyon.apps.src_mainorganization.dao.ISrcEnumDao; +import com.seeyon.apps.src_mainorganization.dao.ISrcMemberDao; +import com.seeyon.apps.src_mainorganization.service.IReceiveOrgMemberService; +import com.seeyon.apps.src_mainorganization.util.ParamUtil; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.organization.OrgConstants; +import com.seeyon.ctp.organization.bo.*; +import com.seeyon.ctp.organization.manager.OrgManager; +import com.seeyon.ctp.organization.manager.OrgManagerDirect; +import www.seeyon.com.utils.StringUtil; + +import javax.inject.Inject; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; +import java.util.*; + +public class ReceiveOrgMemberServiceImpl implements IReceiveOrgMemberService { + + private static Log log = Log.get(ReceiveOrgMemberServiceImpl.class); + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + public String getPluginId() { + return SyncConstants.getPluginId(); + } + + @Inject + private ICstConfigApi cstConfigApi; + @Inject + private AddressBookCustomerFieldInfoManager addressBookCustomerFieldInfoManager; + @Inject + private ISrcEnumDao srcEnumDao; + @Inject + private ISrcMemberDao srcMemberDao; + @Inject + private ISrcAccountDao srcAccountDao; + @Inject + private OrgManagerDirect orgManagerDirect; + @Inject + private OrgManager orgManager; + @Inject + private IArchiveDao archiveDao; + + @Override + public ReceiveOrgMemberResponse saveMemberMain(JSONObject memberParam) throws BusinessException, ParseException, JsonProcessingException { + V3xOrgMember member = new V3xOrgMember(); +// 创建人员ID + if(StringUtil.isNotEmpty(memberParam.getString("id"))){ + member.setId(memberParam.getLong("id")); + }else{ + member.setIdIfNew(); + } + member.setName(memberParam.getString("name")); + member.setCode(memberParam.getString("code")); + member.setTelNumber(memberParam.getString("telNumber")); + String birthday = memberParam.getString("birthday"); + if(StringUtil.isNotEmpty(birthday)){ + member.setProperty("birthday",sdf.parse(birthday)); + } + String hiredate = memberParam.getString("hiredate"); + if(StringUtil.isNotEmpty(hiredate)){ + member.setProperty("hiredate",sdf.parse(hiredate)); + } + String gender = memberParam.getString("gender"); + member.setProperty("gender",gender); + + V3xOrgPrincipal v3xOrgPrincipal = new V3xOrgPrincipal(); + v3xOrgPrincipal.setLoginName(memberParam.getString("loginName")); + v3xOrgPrincipal.setMemberId(member.getId()); + v3xOrgPrincipal.setPassword("123456"); + member.setV3xOrgPrincipal(v3xOrgPrincipal); + + member.setOrgLevelId(memberParam.getLongValue("orgLevelId")); + member.setOrgDepartmentId(memberParam.getLongValue("orgDepartmentId")); + member.setOrgPostId(memberParam.getLongValue("orgPostId")); + member.setOrgAccountId(memberParam.getLongValue("orgAccountId")); + // 排序号 +// member.setSortId(1L); + String sortId = memberParam.getString("sortId"); + if(StringUtil.isNotEmpty(sortId)){ + member.setSortId(Long.parseLong(sortId)); + }else{ + // 查询当前环境最大排序号 + String maxSortId = srcMemberDao.getMemberMaxSortId(); + if(StringUtil.isNotEmpty(maxSortId)){ + member.setSortId(Long.parseLong(maxSortId)+1); + }else{ + member.setSortId(-1l); + } + } + AddressBook addressBook = new AddressBook(); + addressBook = setAddressBooks(addressBook,memberParam); + addressBook.setMemberId(member.getId()); + addressBook.setIdIfNew(); + addressBookCustomerFieldInfoManager.addAddressBook(addressBook); + OrganizationMessage mes = orgManagerDirect.addMember(member); + + JSONObject jsonObject = new JSONObject(); + if(mes.isSuccess()) { + List successMsgs = mes.getSuccessMsgs(); + OrganizationMessage.OrgMessage successMsg =successMsgs.get(0); + V3xOrgEntity v3xOrgEntity = successMsg.getEnt(); + // 创建ObjectMapper实例 + ObjectMapper objectMapper = new ObjectMapper(); + // 将对象转换为JSON字符串 + String json = objectMapper.writeValueAsString(v3xOrgEntity); + long memberId = v3xOrgEntity.getId(); + log.info("人员添加成功"+v3xOrgEntity.getName()+":"+v3xOrgEntity.getId()); + jsonObject.put("status","1"); + jsonObject.put("msg","创建成功:"+memberId); + jsonObject.put("data",json); + }else { + log.info("人员添加失败"+mes.getErrorMsgInfos().get(0).getMsgInfo()); + jsonObject.put("status","2"); + jsonObject.put("msg","添加失败"+mes.getErrorMsgInfos().get(0).getMsgInfo()); + jsonObject.put("data",""); + } + ReceiveOrgMemberResponse receiveOrgMemberResponse = new ReceiveOrgMemberResponse(jsonObject); + return receiveOrgMemberResponse; + } + + + @Override + public ReceiveOrgMemberResponse updateMemberMain(JSONObject memberParam) throws BusinessException, ParseException, JsonProcessingException { + String memberId = memberParam.getString("id"); +// 根据ID查询人员信息 + V3xOrgMember member = orgManager.getMemberById(Long.parseLong(memberId)); + log.info("调用修改方法查询人员信息"+member); +// 判断是否修改名称 + if(StringUtil.isNotEmpty(memberParam.getString("name"))){ + member.setName(memberParam.getString("name")); + } +// 判断是否修改编号 + if(StringUtil.isNotEmpty(memberParam.getString("code"))){ + member.setCode(memberParam.getString("code")); + } +// 判断是否修改手机号 + if(StringUtil.isNotEmpty(memberParam.getString("telNumber"))){ + member.setTelNumber(memberParam.getString("telNumber")); + } +// 判断是否修改生日 + String birthday = memberParam.getString("birthday"); + if(StringUtil.isNotEmpty(birthday)){ + member.setProperty("birthday",sdf.parse(birthday)); + } +// 判断是否修改性别 + if(StringUtil.isNotEmpty(memberParam.getString("gender"))){ + member.setProperty("gender",memberParam.getString("gender")); + } +// 判断是否修改账号 + if(StringUtil.isNotEmpty(memberParam.getString("loginName"))){ + V3xOrgPrincipal v3xOrgPrincipal = new V3xOrgPrincipal(); + v3xOrgPrincipal.setLoginName(memberParam.getString("loginName")); + v3xOrgPrincipal.setMemberId(member.getId()); + v3xOrgPrincipal.setPassword("123456"); + member.setV3xOrgPrincipal(v3xOrgPrincipal); + } +// 判断组织架构信息是否修改 + if(memberParam.getLongValue("orgLevelId")!=0){ + member.setOrgLevelId(memberParam.getLongValue("orgLevelId")); + } + if(memberParam.getLongValue("orgDepartmentId")!=0){ + member.setOrgDepartmentId(memberParam.getLongValue("orgDepartmentId")); + } + if(memberParam.getLongValue("orgPostId")!=0){ + member.setOrgPostId(memberParam.getLongValue("orgPostId")); + } + if(memberParam.getLongValue("orgAccountId")!=0){ + member.setOrgAccountId(memberParam.getLongValue("orgAccountId")); + } +// 判断是否修改人员状态 + if(StringUtil.isNotEmpty(memberParam.getString("state"))){ + member.setState(memberParam.getInteger("state")); + } +// 判断是否修改启用状态 + if(StringUtil.isNotEmpty(memberParam.getString("enabled"))){ + member.setEnabled(memberParam.getBooleanValue("enabled")); + } +// 判断是否修改删除状态 + if(StringUtil.isNotEmpty(memberParam.getString("isDeleted"))){ + log.info("对删除状态进行修改,修改值为"+memberParam.getBooleanValue("isDeleted")); + member.setIsDeleted(memberParam.getBooleanValue("isDeleted")); + } + // 排序号 +// member.setSortId(1L); + Set keys = memberParam.keySet(); + boolean hasUserKey = false; + for(String key : keys){ + if(key.contains("EXT_ATTR")){ + hasUserKey = true; + break; + } + } + + JSONArray secondPosts = memberParam.getJSONArray("second_post"); + if(secondPosts!=null){ + if(secondPosts.size()>0){ + List memberPosts = new ArrayList(); + for(int i = 0 ; i < secondPosts.size(); i++){ + JSONObject secondPost = secondPosts.getJSONObject(i); + MemberPost memberPost = new MemberPost(); + memberPost.setPostId(secondPost.getLongValue("postId")); + memberPost.setOrgAccountId(secondPost.getLongValue("orgAccountId")); + memberPost.setDepId(secondPost.getLongValue("deptId")); + memberPost.setMemberId(secondPost.getLongValue("memberId")); + memberPost.setType(OrgConstants.MemberPostType.Second); + memberPosts.add(memberPost); + } + member.setSecond_post(memberPosts); + } + } + + if(hasUserKey){ + log.info("修改值存在自定义字段,修改自定义字段值"); + AddressBook addressBook = addressBookCustomerFieldInfoManager.getByMemberId(Long.parseLong(memberId)); + addressBook = setAddressBooks(addressBook,memberParam); + addressBookCustomerFieldInfoManager.updateAddressBook(addressBook); + } + log.info("修改前检查数据"+member.getEnabled()+"/"+member.getIsDeleted()+"/"+member.getCode()+"/"+member.getLoginName()); + OrganizationMessage mes = orgManagerDirect.updateMember(member); + log.info("修改后数据"+mes.getSuccessMsgs()); + JSONObject jsonObject = new JSONObject(); + log.info(String.valueOf(mes.isSuccess())); + if(mes.isSuccess()) { + List successMsgs = mes.getSuccessMsgs(); + OrganizationMessage.OrgMessage successMsg =successMsgs.get(0); + V3xOrgEntity v3xOrgEntity = successMsg.getEnt(); + log.info("人员修改成功"+v3xOrgEntity.getName()+":"+v3xOrgEntity.getId()); + jsonObject.put("status","1"); + jsonObject.put("msg","修改成功:"+memberId); + // 创建ObjectMapper实例 + ObjectMapper objectMapper = new ObjectMapper(); + // 将对象转换为JSON字符串 + String json = objectMapper.writeValueAsString(v3xOrgEntity); + jsonObject.put("data",json); + }else { + log.info("人员修改失败"+mes.getErrorMsgInfos().get(0).getMsgInfo()); + jsonObject.put("status","2"); + jsonObject.put("msg","修改失败:"+mes.getErrorMsgInfos().get(0).getMsgInfo()); + jsonObject.put("data",""); + } + ReceiveOrgMemberResponse receiveOrgMemberResponse = new ReceiveOrgMemberResponse(jsonObject); + return receiveOrgMemberResponse; + } + + /** + * 查询人间接口 + * @param param + * { + * "type":"finance",finance法人,operation业务(必填) + * "orgAccount":"单位ID/单位名称",(必填) + * "orgDepartment":"部门ID/部门名称",(非必填,不填则默认查询单位下所有人员) + * "startDate":"2025-01-01 00:00:00",增量查询开始时间(非必填,不填则默认查询所有人员) + * "endDate":"2025-01-01 23:59"59"增量查询结束时间(非必填,不填则默认查询所有人员) + * "selfDefined":{自定义参数查询筛选。 + * "EXT_ATTR_33":"", + * "":"" + * } + * } + * @return + * { + * "id":"人员ID", + * "name":"人员名称", + * "code":""人员编码, + * "orgAccountId":"单位ID", + * "orgAccountName":"单位名称", + * "orgDepartmentId":"部门ID", + * "orgDepartmentName":"部门名称", + * "isEnabled":"是否启用", + * "telNumber":"手机号", + * "loginName":"登录名", + * "orgPostId":"岗位ID", + * "orgPostName":"岗位名称", + * "orgLevelId":"职务级别ID", + * "orgLevelName":"职务级别名称", + * "birthday":"出生日期", + * "gender":"性别",-1未指定,1男,2女 + * "hiredate":"入职时间" + * } + */ + public ReceiveOrgMemberResponse queryFHMemberMain (JSONObject param) throws SQLException, BusinessException { + log.info("查询人员参数"+param); + ConfigVo configVo = this.cstConfigApi.getConfig(this.getPluginId()); +// 客户单位下公司排除参数 + String excludeAccount = configVo.getParamVal(SyncConstants.excludeAccount.name()); + ThirdMemberBo thirdMemberBo = new ThirdMemberBo(); + String type = param.getString("type"); + String orgAccount = param.getString("orgAccount"); + String orgDepartment = param.getString("orgDepartment"); + String startDate = param.getString("startDate"); + String endDate = param.getString("endDate"); + JSONObject selfDefined = param.getJSONObject("getInvoiceTypeParam"); + JSONArray members = new JSONArray(); +// 判断单位是否允许被查询 + if("otherdata".equals(orgAccount)){ +// 进行其他异常数据的处理 + List> otherMembers = archiveDao.findMemberOtherData(); + for(Map otherMember :otherMembers){ + JSONObject jsonObject = thirdMemberBo.operationMember(otherMember); + members.add(jsonObject); + } + JSONObject res = new JSONObject(); + res.put("status","1"); + res.put("msg","成功"); + res.put("data",members); + ReceiveOrgMemberResponse receiveOrgMemberResponse = new ReceiveOrgMemberResponse(res); + return receiveOrgMemberResponse; + }else{ + String orgAccountId = srcAccountDao.getAccountId(orgAccount); + log.info("检查根据参数获取单位ID"+orgAccountId); + V3xOrgAccount paramAccount = orgManager.getAccountById(Long.parseLong(orgAccountId)); + if(paramAccount==null){ + JSONObject res = new JSONObject(); + res.put("status","1"); + res.put("msg","成功"); + res.put("data",new JSONObject()); + ReceiveOrgMemberResponse receiveOrgMemberResponse = new ReceiveOrgMemberResponse(res); + return receiveOrgMemberResponse; + }else{ + String paramAccountPath = paramAccount.getPath(); + log.info("当前单位路径为"+paramAccountPath); + if("finance".equals(type)){ +// 封装法人架构 + log.info("当前查询为法人架构"); + if(ParamUtil.isClientAccount(paramAccountPath)){ + JSONObject res = new JSONObject(); + res.put("status","1"); + res.put("msg","成功"); + res.put("data",new JSONObject()); + ReceiveOrgMemberResponse receiveOrgMemberResponse = new ReceiveOrgMemberResponse(res); + return receiveOrgMemberResponse; + } + List> memberList = srcMemberDao.queryMembers(orgAccount,orgDepartment,startDate,endDate); + log.info("根据参数查询符合要求人员"+memberList.size()); +// 根据参数查询人员ID信息 + for (Map memberMap : memberList) { +// 遍历人员ID信息,根据ID查询人员信息 + String memberId = memberMap.get("id").toString(); + V3xOrgMember v3xOrgMember = orgManager.getMemberById(Long.parseLong(memberId)); + log.info("遍历所有人员执行人员ID为"+v3xOrgMember.getId()+v3xOrgMember.getName()+v3xOrgMember.getEnabled()); + JSONObject member = thirdMemberBo.financeMember(v3xOrgMember); + members.add(member); + } + }else if ("operation".equals(type)){ + log.info("当前查询为业务架构"); +// 封装业务架构 + if(ParamUtil.isClientAccount(paramAccountPath) || (!excludeAccount.contains(orgAccount) && paramAccountPath.startsWith("00000017"))){ + log.info("查询单位为客户单位下,返回空"); + JSONObject res = new JSONObject(); + res.put("status","1"); + res.put("msg","成功"); + res.put("data",new JSONObject()); + ReceiveOrgMemberResponse receiveOrgMemberResponse = new ReceiveOrgMemberResponse(res); + return receiveOrgMemberResponse; + } +// 查询集团组织架构信息,封装JSON + List> memberList = srcMemberDao.queryFormMembers(orgAccount,orgDepartment,startDate,endDate); + log.info("根据参数查询符合要求人员"+memberList.size()); +// 根据参数查询人员ID信息 + for (Map memberMap : memberList) { +// 遍历人员ID信息,根据ID查询人员信息 +// String memberId = memberMap.get("id").toString(); +// V3xOrgMember v3xOrgMember = orgManager.getMemberById(Long.parseLong(memberId)); +// + Map member = archiveDao.findMemberByFormmainId(memberMap.get("id").toString()); +// 根据人员ID获取档案表人员信息 + log.info("遍历所有人员执行人员ID为"+member.get("id")+member.get("name")+member.get("is_enable")); + JSONObject v3xmember = thirdMemberBo.operationMember(member); +// JSONObject v3xmember = thirdMemberBo.operationMember(v3xOrgMember); + if(v3xmember.containsKey("id")){ + if(StringUtil.isNotEmpty(v3xmember.getString("id"))){ +// if(StringUtil.isNotEmpty(v3xmember.getString("orgDepartmentId"))){ + members.add(v3xmember); +// } + } + } + } +// 查询业代信息,封装成JSON + if("营销门户".equals(paramAccount.getName())){ +// 查询业代人员 + List> serviceAgentMemberList = srcMemberDao.queryServiceAgentMembers(startDate,endDate); + for(Map serviceAgentMember : serviceAgentMemberList){ +// 封装业代人员 + JSONObject member = thirdMemberBo.operationServiceAgentMember(serviceAgentMember); + if(member.containsKey("id")){ + if(StringUtil.isNotEmpty(member.getString("id"))){ +// if(StringUtil.isNotEmpty(member.getString("orgDepartmentId"))){ + members.add(member); +// } + } + } + } +// 查询客户信息,封装JSON +//// 获取当前客户名称所在部门 + V3xOrgAccount clientFirstOrderAccount = orgManager.getAccountById(-1920238237989386049l);//客户 +//// 查询客户下一层单位ID列表 + List accountIds = srcAccountDao.getSubordinateAccountByPath(clientFirstOrderAccount.getPath());//经销商列表 + for(String accountId : accountIds){ +// 获取经销商单位信息级别单位信息 + V3xOrgAccount clientAccount = orgManager.getAccountById(Long.parseLong(accountId));//经销商 +// 获取经销商单位下的经销商单位列表信息 + List clientAccountIds = srcAccountDao.getSubordinateAccountByPath(clientAccount.getPath()); + for(String clientAccountId :clientAccountIds){ +// 查询对应经销商单位下所有人员信息 + List> orgMembers = srcMemberDao.queryMembers(clientAccountId,orgDepartment,startDate,endDate); + for(Map orgMember : orgMembers){ +// 遍历人员ID信息,根据ID查询人员信息 + String memberId = orgMember.get("id").toString(); + V3xOrgMember v3xOrgMember = orgManager.getMemberById(Long.parseLong(memberId)); +// 获取人员组织机构信息后需要根据人员ID获取人员档案信息。 + Map memberArchive = archiveDao.getMemberArchiveById(v3xOrgMember.getId()); + JSONObject member = thirdMemberBo.operationMarketingFHMember(v3xOrgMember,memberArchive); + if(member.containsKey("id")){ + if(StringUtil.isNotEmpty(member.getString("id"))){ +// if(StringUtil.isNotEmpty(member.getString("orgDepartmentId"))){ + members.add(member); +// } + } + } + } +// 获取经销商单位下销售部信息 + V3xOrgAccount salesAccount = orgManager.getAccountById(Long.parseLong(clientAccountId));//26家销售公司 + List salesAccountIds = srcAccountDao.getSubordinateAccountByPath(salesAccount.getPath());//26家销售公司销售部列表 + for(String salesAccountId : salesAccountIds){ + List> salesOrgMembers = srcMemberDao.queryMembers(salesAccountId,orgDepartment,startDate,endDate);//26家销售公司销售部 + for(Map salesOrgMember : salesOrgMembers){ +// 遍历人员ID信息,根据ID查询人员信息 + String memberId = salesOrgMember.get("id").toString(); + V3xOrgMember v3xOrgMember = orgManager.getMemberById(Long.parseLong(memberId)); + Map memberArchive = archiveDao.getMemberArchiveById(v3xOrgMember.getId()); +// V3xOrgPost v3xOrgPost = orgManager.getPostById(v3xOrgMember.getOrgPostId()); +// 获取人员组织机构信息后需要根据人员ID获取人员档案信息。 + Map clientTable = new HashMap<>(); + V3xOrgDepartment dept = orgManager.getDepartmentById(v3xOrgMember.getOrgDepartmentId()); + if(dept!=null){ + clientTable = srcMemberDao.queryClientByName(dept.getName()); + } + System.out.println(clientTable+"----"+memberArchive); + clientTable.put("id",memberArchive.get("member_id")); + clientTable.put("telnumber",memberArchive.get("telnumber")); + JSONObject member = thirdMemberBo.operationClientFHMember(v3xOrgMember,clientTable); + if(member.containsKey("id")){ + if(StringUtil.isNotEmpty(member.getString("id"))){ +// if(StringUtil.isNotEmpty(member.getString("orgDepartmentId"))){ + members.add(member); +// } + } + } + } + } + } + } + } + } + log.info("总人数"+members.size()); + JSONObject res = new JSONObject(); + res.put("status","1"); + res.put("msg","成功"); + res.put("data",members); + ReceiveOrgMemberResponse receiveOrgMemberResponse = new ReceiveOrgMemberResponse(res); + return receiveOrgMemberResponse; + } + } + } + + @Override + public ReceiveOrgMemberResponse queryMemberMain(JSONObject param) throws BusinessException, SQLException { + log.info("查询人员参数"+param); + ConfigVo configVo = this.cstConfigApi.getConfig(this.getPluginId()); +// 客户单位下公司排除参数 + String excludeAccount = configVo.getParamVal(SyncConstants.excludeAccount.name()); + ThirdMemberBo thirdMemberBo = new ThirdMemberBo(); + String type = param.getString("type"); + String orgAccount = param.getString("orgAccount"); + String orgDepartment = param.getString("orgDepartment"); + String startDate = param.getString("startDate"); + String endDate = param.getString("endDate"); + JSONObject selfDefined = param.getJSONObject("getInvoiceTypeParam"); + JSONArray members = new JSONArray(); +// 判断单位是否允许被查询 + String orgAccountId = srcAccountDao.getAccountId(orgAccount); + log.info("检查根据参数获取单位ID"+orgAccountId); + V3xOrgAccount paramAccount = orgManager.getAccountById(Long.parseLong(orgAccountId)); + if(paramAccount==null){ + JSONObject res = new JSONObject(); + res.put("status","1"); + res.put("msg","成功"); + res.put("data",new JSONObject()); + ReceiveOrgMemberResponse receiveOrgMemberResponse = new ReceiveOrgMemberResponse(res); + return receiveOrgMemberResponse; + }else{ + String paramAccountPath = paramAccount.getPath(); + log.info("当前单位路径为"+paramAccountPath); + if("finance".equals(type)){ +// 封装法人架构 + log.info("当前查询为法人架构"); + if(ParamUtil.isClientAccount(paramAccountPath)){ + JSONObject res = new JSONObject(); + res.put("status","1"); + res.put("msg","成功"); + res.put("data",new JSONObject()); + ReceiveOrgMemberResponse receiveOrgMemberResponse = new ReceiveOrgMemberResponse(res); + return receiveOrgMemberResponse; + } + List> memberList = srcMemberDao.queryMembers(orgAccount,orgDepartment,startDate,endDate); + log.info("根据参数查询符合要求人员"+memberList.size()); +// 根据参数查询人员ID信息 + for (Map memberMap : memberList) { +// 遍历人员ID信息,根据ID查询人员信息 + String memberId = memberMap.get("id").toString(); + V3xOrgMember v3xOrgMember = orgManager.getMemberById(Long.parseLong(memberId)); + log.info("遍历所有人员执行人员ID为"+v3xOrgMember.getId()+v3xOrgMember.getName()+v3xOrgMember.getEnabled()); + JSONObject member = thirdMemberBo.financeMember(v3xOrgMember); + members.add(member); + } + }else if ("operation".equals(type)){ + log.info("当前查询为业务架构"); +// 封装业务架构 + if(ParamUtil.isClientAccount(paramAccountPath) || (!excludeAccount.contains(orgAccount) && paramAccountPath.startsWith("00000017"))){ + log.info("查询单位为客户单位下,返回空"); + JSONObject res = new JSONObject(); + res.put("status","1"); + res.put("msg","成功"); + res.put("data",new JSONObject()); + ReceiveOrgMemberResponse receiveOrgMemberResponse = new ReceiveOrgMemberResponse(res); + return receiveOrgMemberResponse; + } +// 查询集团组织架构信息,封装JSON + List> memberList = srcMemberDao.queryMembers(orgAccount,orgDepartment,startDate,endDate); + log.info("根据参数查询符合要求人员"+memberList.size()); +// 根据参数查询人员ID信息 + for (Map memberMap : memberList) { +// 遍历人员ID信息,根据ID查询人员信息 + String memberId = memberMap.get("id").toString(); + V3xOrgMember v3xOrgMember = orgManager.getMemberById(Long.parseLong(memberId)); + log.info("遍历所有人员执行人员ID为"+v3xOrgMember.getId()+v3xOrgMember.getName()+v3xOrgMember.getEnabled()); + JSONObject member = thirdMemberBo.operationMember(v3xOrgMember); + members.add(member); + } +// 查询业代信息,封装成JSON + if("营销门户".equals(paramAccount.getName())){ + List> serviceAgentMemberList = srcMemberDao.queryServiceAgentMembers(startDate,endDate); + log.info("查询业代人员,执行业代人员数据查询,业代数据查询数量"+serviceAgentMemberList.size()); + for(Map serviceAgentMember : serviceAgentMemberList){ + JSONObject member = thirdMemberBo.operationServiceAgentMember(serviceAgentMember); + members.add(member); + } +// 查询客户信息,封装JSON +// 获取当前客户名称所在部门 + V3xOrgAccount clientFirstOrderAccount = orgManager.getAccountById(-1920238237989386049l);//客户 +// 查询客户下一层单位ID列表 + List accountIds = srcAccountDao.getSubordinateAccountByPath(clientFirstOrderAccount.getPath());//经销商列表 + for(String accountId : accountIds){ +// 获取经销商单位信息级别单位信息 + V3xOrgAccount clientAccount = orgManager.getAccountById(Long.parseLong(accountId));//经销商 +// 获取经销商单位下的经销商单位列表信息 + List clientAccountIds = srcAccountDao.getSubordinateAccountByPath(clientAccount.getPath());//26家销售公司列表 + for(String clientAccountId :clientAccountIds){ +// 查询对应经销商单位下所有人员信息 + List> orgMembers = srcMemberDao.queryMembers(clientAccountId,orgDepartment,startDate,endDate); + for(Map orgMember : orgMembers){ +// 遍历人员ID信息,根据ID查询人员信息 + String memberId = orgMember.get("id").toString(); + V3xOrgMember v3xOrgMember = orgManager.getMemberById(Long.parseLong(memberId)); +// 获取人员组织机构信息后需要根据人员ID获取人员档案信息。 + Map memberArchive = archiveDao.getMemberArchiveById(v3xOrgMember.getId()); + JSONObject member = thirdMemberBo.operationMarketingMember(v3xOrgMember,memberArchive); + members.add(member); + } +// 获取经销商单位下销售部信息 + V3xOrgAccount salesAccount = orgManager.getAccountById(Long.parseLong(clientAccountId));//26家销售公司 + List salesAccountIds = srcAccountDao.getSubordinateAccountByPath(salesAccount.getPath());//26家销售公司销售部列表 + for(String salesAccountId : salesAccountIds){ + List> salesOrgMembers = srcMemberDao.queryMembers(salesAccountId,orgDepartment,startDate,endDate);//26家销售公司销售部 + for(Map salesOrgMember : salesOrgMembers){ +// 遍历人员ID信息,根据ID查询人员信息 + String memberId = salesOrgMember.get("id").toString(); + V3xOrgMember v3xOrgMember = orgManager.getMemberById(Long.parseLong(memberId)); +// V3xOrgPost v3xOrgPost = orgManager.getPostById(v3xOrgMember.getOrgPostId()); +// 获取人员组织机构信息后需要根据人员ID获取人员档案信息。 + Map clientTable = new HashMap<>(); + V3xOrgDepartment dept = orgManager.getDepartmentById(v3xOrgMember.getOrgDepartmentId()); + if(dept!=null){ + clientTable = srcMemberDao.queryClientByName(dept.getName()); + } + JSONObject member = thirdMemberBo.operationClientMember(v3xOrgMember,clientTable); + members.add(member); + } + } + } + } + } + } + log.info("总人数"+members.size()); + JSONObject res = new JSONObject(); + res.put("status","1"); + res.put("msg","成功"); + res.put("data",members); + ReceiveOrgMemberResponse receiveOrgMemberResponse = new ReceiveOrgMemberResponse(res); + return receiveOrgMemberResponse; + } + + } + + private AddressBook setAddressBooks(AddressBook addressBook, JSONObject memberParam) throws ParseException { + for (Map.Entry entry : memberParam.entrySet()) { + switch (entry.getKey()){ + case "EXT_ATTR_1":{ + if(entry.getValue()!=null){ + addressBook.setExtAttr1(entry.getValue().toString()); + } + break; + }case "EXT_ATTR_2":{ + if(entry.getValue()!=null){ + addressBook.setExtAttr2(entry.getValue().toString()); + } + break; + }case "EXT_ATTR_3":{ + if(entry.getValue()!=null){ + addressBook.setExtAttr3(entry.getValue().toString()); + } + break; + }case "EXT_ATTR_4":{ + if(entry.getValue()!=null){ + addressBook.setExtAttr4(entry.getValue().toString()); + } + break; + }case "EXT_ATTR_5":{ + if(entry.getValue()!=null){ + addressBook.setExtAttr5(entry.getValue().toString()); + } + break; + }case "EXT_ATTR_6":{ + if(entry.getValue()!=null){ + addressBook.setExtAttr6(entry.getValue().toString()); + } + break; + }case "EXT_ATTR_7":{ + if(entry.getValue()!=null){ + addressBook.setExtAttr7(entry.getValue().toString()); + } + break; + }case "EXT_ATTR_8":{ + if(entry.getValue()!=null){ + addressBook.setExtAttr8(entry.getValue().toString()); + } + break; + }case "EXT_ATTR_9":{ + if(entry.getValue()!=null){ + addressBook.setExtAttr9(entry.getValue().toString()); + } + break; + }case "EXT_ATTR_10":{ + if(entry.getValue()!=null){ + addressBook.setExtAttr10(entry.getValue().toString()); + } + break; + }case "EXT_ATTR_11":{ + if( entry.getValue() instanceof Double){ + addressBook.setExtAttr11(Double.parseDouble(entry.getValue().toString())); + } + break; + }case "EXT_ATTR_12":{ + if( entry.getValue() instanceof Double){ + addressBook.setExtAttr12(Double.parseDouble(entry.getValue().toString())); + } + break; + }case "EXT_ATTR_13":{ + if( entry.getValue() instanceof Double){ + addressBook.setExtAttr13(Double.parseDouble(entry.getValue().toString())); + } + break; + }case "EXT_ATTR_14":{ + if( entry.getValue() instanceof Double){ + addressBook.setExtAttr14(Double.parseDouble(entry.getValue().toString())); + } + break; + }case "EXT_ATTR_15":{ + if( entry.getValue() instanceof Double){ + addressBook.setExtAttr15(Double.parseDouble(entry.getValue().toString())); + } + break; + }case "EXT_ATTR_16":{ + if( entry.getValue() instanceof Double){ + addressBook.setExtAttr16(Double.parseDouble(entry.getValue().toString())); + } + break; + }case "EXT_ATTR_17":{ + if( entry.getValue() instanceof Double){ + addressBook.setExtAttr17(Double.parseDouble(entry.getValue().toString())); + } + break; + }case "EXT_ATTR_18":{ + if( entry.getValue() instanceof Double){ + addressBook.setExtAttr18(Double.parseDouble(entry.getValue().toString())); + } + break; + }case "EXT_ATTR_19":{ + if( entry.getValue() instanceof Double){ + addressBook.setExtAttr19(Double.parseDouble(entry.getValue().toString())); + } + break; + }case "EXT_ATTR_20":{ + if( entry.getValue() instanceof Double){ + addressBook.setExtAttr20(Double.parseDouble(entry.getValue().toString())); + } + break; + }case "EXT_ATTR_21":{ + if(entry.getValue()!=null){ + if(isValidDate(entry.getValue().toString())){ + addressBook.setExtAttr21(sdf.parse(entry.getValue().toString())); + } + } + break; + }case "EXT_ATTR_22":{ + if(entry.getValue()!=null){ + if(isValidDate(entry.getValue().toString())){ + addressBook.setExtAttr22(sdf.parse(entry.getValue().toString())); + } + } + break; + }case "EXT_ATTR_23":{ + if(entry.getValue()!=null){ + if(isValidDate(entry.getValue().toString())){ + addressBook.setExtAttr23(sdf.parse(entry.getValue().toString())); + } + } + break; + }case "EXT_ATTR_24":{ + if(entry.getValue()!=null){ + if(isValidDate(entry.getValue().toString())){ + addressBook.setExtAttr24(sdf.parse(entry.getValue().toString())); + } + } + break; + }case "EXT_ATTR_25":{ + if(entry.getValue()!=null){ + if(isValidDate(entry.getValue().toString())){ + addressBook.setExtAttr25(sdf.parse(entry.getValue().toString())); + } + } + break; + }case "EXT_ATTR_26":{ + if(entry.getValue()!=null){ + if(isValidDate(entry.getValue().toString())){ + addressBook.setExtAttr26(sdf.parse(entry.getValue().toString())); + } + } + break; + }case "EXT_ATTR_27":{ + if(entry.getValue()!=null){ + if(isValidDate(entry.getValue().toString())){ + addressBook.setExtAttr27(sdf.parse(entry.getValue().toString())); + } + } + break; + }case "EXT_ATTR_28":{ + if(entry.getValue()!=null){ + if(isValidDate(entry.getValue().toString())){ + addressBook.setExtAttr28(sdf.parse(entry.getValue().toString())); + } + } + break; + }case "EXT_ATTR_29":{ + if(entry.getValue()!=null){ + if(isValidDate(entry.getValue().toString())){ + addressBook.setExtAttr29(sdf.parse(entry.getValue().toString())); + } + } + break; + }case "EXT_ATTR_30":{ + if(entry.getValue()!=null){ + if(isValidDate(entry.getValue().toString())){ + addressBook.setExtAttr30(sdf.parse(entry.getValue().toString())); + } + } + break; + }case "EXT_ATTR_31":{ + if(entry.getValue()!=null){ + String enumId = srcEnumDao.getEnumByExtAttr("EXT_ATTR_31"); + String enumItemId = srcEnumDao.getEnumItemByRefEnumIdValue(enumId,entry.getValue().toString()); + addressBook.setExtAttr31(enumItemId); + } + break; + }case "EXT_ATTR_32":{ + if(entry.getValue()!=null){ + String enumId = srcEnumDao.getEnumByExtAttr("EXT_ATTR_32"); + String enumItemId = srcEnumDao.getEnumItemByRefEnumIdValue(enumId,entry.getValue().toString()); + addressBook.setExtAttr32(enumItemId); + } + break; + }case "EXT_ATTR_33":{ + if(entry.getValue()!=null){ + String enumId = srcEnumDao.getEnumByExtAttr("EXT_ATTR_33"); + String enumItemId = srcEnumDao.getEnumItemByRefEnumIdValue(enumId,entry.getValue().toString()); + addressBook.setExtAttr33(enumItemId); + } + break; + }case "EXT_ATTR_34":{ + if(entry.getValue()!=null){ + String enumId = srcEnumDao.getEnumByExtAttr("EXT_ATTR_34"); + String enumItemId = srcEnumDao.getEnumItemByRefEnumIdValue(enumId,entry.getValue().toString()); + addressBook.setExtAttr34(enumItemId); + } + break; + }case "EXT_ATTR_35":{ + if(entry.getValue()!=null){ + String enumId = srcEnumDao.getEnumByExtAttr("EXT_ATTR_35"); + String enumItemId = srcEnumDao.getEnumItemByRefEnumIdValue(enumId,entry.getValue().toString()); + addressBook.setExtAttr35(enumItemId); + } + break; + }case "EXT_ATTR_36":{ + if(entry.getValue()!=null){ + String enumId = srcEnumDao.getEnumByExtAttr("EXT_ATTR_36"); + String enumItemId = srcEnumDao.getEnumItemByRefEnumIdValue(enumId,entry.getValue().toString()); + addressBook.setExtAttr36(enumItemId); + } + break; + }case "EXT_ATTR_37":{ + if(entry.getValue()!=null){ + String enumId = srcEnumDao.getEnumByExtAttr("EXT_ATTR_37"); + String enumItemId = srcEnumDao.getEnumItemByRefEnumIdValue(enumId,entry.getValue().toString()); + addressBook.setExtAttr37(enumItemId); + } + break; + }case "EXT_ATTR_38":{ + if(entry.getValue()!=null){ + String enumId = srcEnumDao.getEnumByExtAttr("EXT_ATTR_38"); + String enumItemId = srcEnumDao.getEnumItemByRefEnumIdValue(enumId,entry.getValue().toString()); + addressBook.setExtAttr38(enumItemId); + } + break; + }case "EXT_ATTR_39":{ + if(entry.getValue()!=null){ + String enumId = srcEnumDao.getEnumByExtAttr("EXT_ATTR_39"); + String enumItemId = srcEnumDao.getEnumItemByRefEnumIdValue(enumId,entry.getValue().toString()); + addressBook.setExtAttr39(enumItemId); + } + break; + }case "EXT_ATTR_40":{ + if(entry.getValue()!=null){ + String enumId = srcEnumDao.getEnumByExtAttr("EXT_ATTR_40"); + String enumItemId = srcEnumDao.getEnumItemByRefEnumIdValue(enumId,entry.getValue().toString()); + addressBook.setExtAttr40(enumItemId); + } + break; + }case "EXT_ATTR_41":{ + if(entry.getValue()!=null){ + addressBook.setExtAttr41(entry.getValue().toString()); + } + break; + }case "EXT_ATTR_42":{ + if(entry.getValue()!=null){ + addressBook.setExtAttr42(entry.getValue().toString()); + } + break; + }case "EXT_ATTR_43":{ + if(entry.getValue()!=null){ + addressBook.setExtAttr43(entry.getValue().toString()); + } + break; + }case "EXT_ATTR_44":{ + if(entry.getValue()!=null){ + addressBook.setExtAttr44(entry.getValue().toString()); + } + break; + }case "EXT_ATTR_45":{ + if(entry.getValue()!=null){ + addressBook.setExtAttr45(entry.getValue().toString()); + } + break; + }case "EXT_ATTR_46":{ + if(entry.getValue()!=null){ + addressBook.setExtAttr46(entry.getValue().toString()); + } + break; + }case "EXT_ATTR_47":{ + if(entry.getValue()!=null){ + addressBook.setExtAttr47(entry.getValue().toString()); + } + break; + }case "EXT_ATTR_48":{ + if(entry.getValue()!=null){ + addressBook.setExtAttr48(entry.getValue().toString()); + } + break; + }case "EXT_ATTR_49":{ + if(entry.getValue()!=null){ + addressBook.setExtAttr49(entry.getValue().toString()); + } + break; + }case "EXT_ATTR_50":{ + if(entry.getValue()!=null){ + addressBook.setExtAttr50(entry.getValue().toString()); + } + break; + }case "EXT_ATTR_51":{ + if(entry.getValue()!=null){ + addressBook.setExtAttr51(entry.getValue().toString()); + } + break; + }case "EXT_ATTR_52":{ + if(entry.getValue()!=null){ + addressBook.setExtAttr52(entry.getValue().toString()); + } + break; + }case "EXT_ATTR_53":{ + if(entry.getValue()!=null){ + addressBook.setExtAttr53(entry.getValue().toString()); + } + break; + }case "EXT_ATTR_54":{ + if(entry.getValue()!=null){ + addressBook.setExtAttr54(entry.getValue().toString()); + } + break; + }case "EXT_ATTR_55":{ + if(entry.getValue()!=null){ + addressBook.setExtAttr55(entry.getValue().toString()); + } + break; + }case "EXT_ATTR_56":{ + if(entry.getValue()!=null){ + addressBook.setExtAttr56(entry.getValue().toString()); + } + break; + }case "EXT_ATTR_57":{ + if(entry.getValue()!=null){ + addressBook.setExtAttr57(entry.getValue().toString()); + } + break; + }case "EXT_ATTR_58":{ + if(entry.getValue()!=null){ + addressBook.setExtAttr58(entry.getValue().toString()); + } + break; + }case "EXT_ATTR_59":{ + if(entry.getValue()!=null){ + addressBook.setExtAttr59(entry.getValue().toString()); + } + break; + }case "EXT_ATTR_60":{ + if(entry.getValue()!=null){ + addressBook.setExtAttr60(entry.getValue().toString()); + } + break; + } + + } + } + return addressBook; + } + + + + public static boolean isValidDate(String dateStr) { + List formats = Arrays.asList( + "yyyy-MM-dd", "dd/MM/yyyy", "MM/dd/yyyy", + "yyyyMMdd", "yyyy年MM月dd日", "dd-MMM-yyyy" + ); + + for (String format : formats) { + try { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format); + LocalDate.parse(dateStr, formatter); + return true; + } catch (DateTimeParseException e) { + // 继续尝试下一个格式 + } + } + return false; + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/service/impl/ReceiveSrcCustomerServiceImpl.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/service/impl/ReceiveSrcCustomerServiceImpl.java new file mode 100644 index 0000000..3bcf833 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/service/impl/ReceiveSrcCustomerServiceImpl.java @@ -0,0 +1,61 @@ +package com.seeyon.apps.src_mainorganization.service.impl; + +import cn.hutool.log.Log; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.common.plugin.vo.ConfigVo; +import com.seeyon.apps.src_mainorganization.bo.ReceiveOrgMemberResponse; +import com.seeyon.apps.src_mainorganization.bo.ThirdCustomerBo; +import com.seeyon.apps.src_mainorganization.constans.SyncConstants; +import com.seeyon.apps.src_mainorganization.dao.IArchiveDao; +import com.seeyon.apps.src_mainorganization.service.IReceiveSrcCustomerService; +import com.seeyon.ctp.common.exceptions.BusinessException; + +import javax.inject.Inject; +import java.util.List; +import java.util.Map; + +public class ReceiveSrcCustomerServiceImpl implements IReceiveSrcCustomerService { + + private static Log log = Log.get(ReceiveOrgMemberServiceImpl.class); + + public String getPluginId() { + return SyncConstants.getPluginId(); + } + + @Inject + private ICstConfigApi cstConfigApi; + @Inject + private IArchiveDao archiveDao; + + + @Override + public ReceiveOrgMemberResponse queryCustomerMain(JSONObject param) { + log.info("查询客户参数"+param); + ConfigVo configVo = this.cstConfigApi.getConfig(this.getPluginId()); +// 查询客户信息列表 + JSONArray customers = new JSONArray(); + try{ + List> allCustomers = archiveDao.getAllCustomer(); + for (Map customer: allCustomers ) { + ThirdCustomerBo thirdCustomerBo = new ThirdCustomerBo(customer); + customers.add(thirdCustomerBo.toCustomerJSON()); + } + } catch (BusinessException e) { + e.printStackTrace(); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("status","2"); + jsonObject.put("msg","接口调用异常"); + jsonObject.put("data",e); + ReceiveOrgMemberResponse receiveOrgMemberResponse = new ReceiveOrgMemberResponse(jsonObject); + return receiveOrgMemberResponse; + } + JSONObject jsonObject = new JSONObject(); + jsonObject.put("status","1"); + jsonObject.put("msg","成功"); + jsonObject.put("data",customers); + ReceiveOrgMemberResponse receiveOrgMemberResponse = new ReceiveOrgMemberResponse(jsonObject); + return receiveOrgMemberResponse; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/service/impl/SrcMemberFormTableServiceImpl.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/service/impl/SrcMemberFormTableServiceImpl.java new file mode 100644 index 0000000..379eb3b --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/service/impl/SrcMemberFormTableServiceImpl.java @@ -0,0 +1,139 @@ +package com.seeyon.apps.src_mainorganization.service.impl; + +import cn.hutool.log.Log; +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.addressbook.manager.AddressBookCustomerFieldInfoManager; +import com.seeyon.apps.addressbook.po.AddressBook; +import com.seeyon.apps.src_mainorganization.bo.ReceiveOrgMemberResponse; +import com.seeyon.apps.src_mainorganization.dao.ISrcFormTableDao; +import com.seeyon.apps.src_mainorganization.service.ISrcMemberFormTableService; +import com.seeyon.apps.src_mainorganization.util.ExcelUtils; +import com.seeyon.apps.src_mainorganization.util.FormExportUtil; +import com.seeyon.ctp.common.SystemEnvironment; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.organization.bo.*; +import com.seeyon.ctp.organization.manager.OrgManager; +import com.seeyon.ctp.services.ServiceException; +import com.seeyon.v3x.services.form.FormFactory; +import com.seeyon.v3x.services.form.bean.FormExport; +import com.seeyon.v3x.services.form.bean.ValueExport; +import www.seeyon.com.utils.StringUtil; + +import javax.inject.Inject; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class SrcMemberFormTableServiceImpl implements ISrcMemberFormTableService { + + private static final Log log = Log.get(SrcMemberFormTableServiceImpl.class); + + @Inject + private ISrcFormTableDao srcFormTableDao; + @Inject + private OrgManager orgManager; + @Inject + private AddressBookCustomerFieldInfoManager addressBookCustomerFieldInfoManager; + @Inject + private FormFactory formFactory; + + @Override + public ReceiveOrgMemberResponse saveMemberFormTableMain() { + FormExportUtil formExportUtil = new FormExportUtil(); +// 通过dao查询当前系统中所有存在人员组织架构信息,但是没有人员档案表信息的数据。 + List memberDifferenceIds = srcFormTableDao.getMemberDifferenceIds(); + log.info("查询需要生成的人员条数"+memberDifferenceIds.size()); + List> excelDatas = new ArrayList<>(); + for(String memberDifferenceId:memberDifferenceIds){ + FormExport formExport = new FormExport(); +// 获取查询到的人员ID信息,根据人员ID查询人员对象。 + long memberId = Long.parseLong(memberDifferenceId); + Map mainTableData = new HashMap<>(); + Map excelData = new HashMap<>(); + try { +// 根据人员对象封装档案表数据对象。 + V3xOrgMember v3xOrgMember = orgManager.getMemberById(memberId); + log.info("根据ID查询人员信息"+v3xOrgMember.getId()+"-"+v3xOrgMember.getLoginName()+"-"+v3xOrgMember.getTelNumber()); +// 查询对应单位信息 + V3xOrgAccount v3xOrgAccount = orgManager.getAccountById(v3xOrgMember.getOrgAccountId()); + log.info(v3xOrgAccount.getName()); +// 查询对应部门信息 + V3xOrgDepartment v3xOrgDepartment = orgManager.getDepartmentById(v3xOrgMember.getOrgDepartmentId()); + log.info(v3xOrgDepartment.getName()); +// 查询对应岗位信息 + V3xOrgPost v3xOrgPost = orgManager.getPostById(v3xOrgMember.getOrgPostId()); + log.info(v3xOrgPost.getName()); +// 查询对应职务级别信息 + V3xOrgLevel v3xOrgLevel = orgManager.getLevelById(v3xOrgMember.getOrgLevelId()); + log.info(v3xOrgLevel.getName()); +// 获取人员主数据信息 + AddressBook addressBook = addressBookCustomerFieldInfoManager.getByMemberId(memberId); + log.info("自定义主数据"+addressBook); + mainTableData.put("姓名",v3xOrgMember.getId().toString()); + mainTableData.put("单位",v3xOrgAccount.getId().toString()); + mainTableData.put("部门",v3xOrgDepartment.getId().toString()); + mainTableData.put("岗位",v3xOrgPost.getId().toString()); + mainTableData.put("职务级别",v3xOrgLevel.getId().toString()); + mainTableData.put("手机号",v3xOrgMember.getTelNumber()); + if(addressBook!=null){ + String extAttr1 = addressBook.getExtAttr1(); + log.info("是否存在身份证号信息"+extAttr1); + if(StringUtil.isNotEmpty(extAttr1)){ + mainTableData.put("身份证号码",extAttr1); + excelData.put("身份证号码",extAttr1); + }else{ + mainTableData.put("身份证号码",""); + excelData.put("身份证号码",""); + } + }else{ + mainTableData.put("身份证号码",""); + excelData.put("身份证号码",""); + } + mainTableData.put("员工状态","-8568095563672566586"); + log.info("封装excel数据"); + excelData.put("ID",v3xOrgMember.getId().toString()); + excelData.put("姓名",v3xOrgMember.getName()); + excelData.put("单位",v3xOrgAccount.getName()); + excelData.put("部门",v3xOrgDepartment.getName()); + excelData.put("岗位",v3xOrgPost.getName()); + excelData.put("职务级别",v3xOrgLevel.getName()); + excelData.put("手机号",v3xOrgMember.getTelNumber()); +// 通过人员档案表数据对象调用档案表创建方法生成人员档案表信息 + List valueExports = formExportUtil.setFormValue(mainTableData); + formExport.setValues(valueExports); + formFactory.importBusinessFormData("demo2", "ygda", + formExport, new String[] {}); + } catch (BusinessException e) { + e.printStackTrace(); + log.info("人员数据查询失败。"); + } + catch (ServiceException e) { + e.printStackTrace(); + log.info("档案表创建失败。"); + } +// 将生成档案表的信息生成保存到输出对象中 + excelDatas.add(excelData); + } +// 创建数组表头数据集 + String[] headerData = {"ID","姓名","单位","部门","岗位","职务级别","手机号","身份证号码"}; + String str = SystemEnvironment.getApplicationFolder(); + String path = str + "/memberExcel/member_table.xlsx"; + String sheetName = "人员信息"; + try { + ExcelUtils.generateExcel(headerData,excelDatas,path,sheetName); + log.info("Excel文件生成成功!"); + } catch (IOException e) { + log.info("生成excel文件失败,请检查。。。"); + e.printStackTrace(); + } +// 将输出对象中的信息创建excel保存到服务器 + JSONObject res = new JSONObject(); + res.put("status","1"); + res.put("msg","成功"); + res.put("data","创建成功"); + ReceiveOrgMemberResponse receiveOrgMemberResponse = new ReceiveOrgMemberResponse(res); + return receiveOrgMemberResponse; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/sync/OrganizationOrgSyncApi.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/sync/OrganizationOrgSyncApi.java new file mode 100644 index 0000000..20e16d8 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/sync/OrganizationOrgSyncApi.java @@ -0,0 +1,268 @@ +package com.seeyon.apps.src_mainorganization.sync; + +import cn.hutool.log.Log; +import com.seeyon.apps.src_mainorganization.constans.SyncConstants; +import com.seeyon.apps.ext.thirdorg.api.AThirdOrgSyncApi; +import com.seeyon.apps.ext.thirdorg.vo.SyncResult; +import com.seeyon.apps.src_mainorganization.server.OrganizationOrgDingdingSyncServer; +import com.seeyon.apps.src_mainorganization.server.OrganizationOrgFlowSyncServer; +import com.seeyon.apps.src_mainorganization.server.OrganizationOrgGroupSyncServer; +import com.seeyon.apps.src_mainorganization.server.OrganizationOrgSyncServer; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.organization.bo.*; + +import javax.inject.Inject; +import java.sql.SQLException; +import java.util.*; +import java.util.stream.Collectors; + +public class OrganizationOrgSyncApi extends AThirdOrgSyncApi { + + private static Log log = Log.get(OrganizationOrgSyncApi.class); + public OrganizationOrgSyncApi() { + } + @Inject + private OrganizationOrgSyncServer organizationOrgSyncServer; + + @Inject + private OrganizationOrgFlowSyncServer organizationOrgFlowSyncServer; + + @Inject + private OrganizationOrgGroupSyncServer organizationOrgGroupSyncServer; + +// @Inject +// private OrganizationOrgDingdingSyncServer organizationOrgDingdingSyncServer; + + /** + * 单位修改实时同步 + * @param list + * @return + */ + public List syncBatchAccount(List list) { + log.info("进入单位同步方法"); + Map errorMap = new HashMap<>(); + try{ + log.info("进行客户服务平台单位同步数据处理"); + Map errorFvMap = organizationOrgSyncServer.fvSyncBatchAccount(list); + errorMap.putAll(errorFvMap); + }catch (Exception e){ + e.printStackTrace(); + } + try{ + log.info("进行流程平台单位同步数据处理"); + Map errorFlowMap = organizationOrgFlowSyncServer.flowSyncBatchAccount(list); + errorMap.putAll(errorFlowMap); + }catch (Exception e){ + e.printStackTrace(); + } + try{ + log.info("进行集团协同平台单位同步数据处理"); + Map errorGroupMap = organizationOrgGroupSyncServer.groupSyncBatchAccount(list); + errorMap.putAll(errorGroupMap); + }catch (Exception e){ + e.printStackTrace(); + } +// log.info("进行钉钉系统单位同步数据处理"); +// Map errorDingdingMap = organizationOrgDingdingSyncServer.dingdingSyncBatchAccount(list); +// errorMap.putAll(errorDingdingMap); + + List syncResults = list.stream().map(account -> { + SyncResult syncResult = new SyncResult(account); + if(errorMap.containsKey(account.getId() + "")) { + syncResult.setSuccess(false); + syncResult.setMessage(errorMap.get(account.getId() + "")); + } else { + syncResult.setSuccess(true); + syncResult.setMessage("同步成功"); + } + return syncResult; + }).collect(Collectors.toList()); + return syncResults; + } + + /** + * 部门修改实时同步 + * @param list + * @return + */ + public List syncBatchDepartment(List list) { + log.info("进入部门同步方法"); + Map errorMap = new HashMap<>(); + try{ + log.info("进行客户服务平台部门同步数据处理"); + Map errorFvMap = organizationOrgSyncServer.fvSyncBatchDepartment(list); + errorMap.putAll(errorFvMap); + }catch (SQLException e) { + e.printStackTrace(); + } + try{ + log.info("进行流程平台部门同步数据处理"); + Map errorFlowMap = organizationOrgFlowSyncServer.flowSyncBatchDepartment(list); + errorMap.putAll(errorFlowMap); + } catch (BusinessException e) { + e.printStackTrace(); + } + try{ + log.info("进行集团协同平台部门同步数据处理"); + Map errorGroupMap = organizationOrgGroupSyncServer.groupSyncBatchDept(list); + errorMap.putAll(errorGroupMap); + } catch (BusinessException e) { + e.printStackTrace(); + } +// log.info("进行钉钉系统部门同步数据处理"); +// Map errorDingdingMap = organizationOrgDingdingSyncServer.dingdingSyncBatchDept(list); +// errorMap.putAll(errorDingdingMap); + + List syncResults = list.stream().map(department -> { + SyncResult syncResult = new SyncResult(department); + if(errorMap.containsKey(department.getId() + "")) { + syncResult.setSuccess(false); + syncResult.setMessage(errorMap.get(department.getId() + "")); + } else { + syncResult.setSuccess(true); + syncResult.setMessage("同步成功"); + } + return syncResult; + }).collect(Collectors.toList()); + return syncResults; + } + + /** + * 岗位修改实时同步 + * @param list + * @return + */ + public List syncBatchPost(List list) { + log.info("进入岗位同步方法"); + Map errorMap = new HashMap<>(); + try{ + log.info("进行客户服务平台岗位同步数据处理"); + Map errorFvMap = organizationOrgSyncServer.fvSyncBatchPost(list); + errorMap.putAll(errorFvMap); + }catch (Exception e){ + e.printStackTrace(); + } + try{ + log.info("进行流程平台岗位同步数据处理"); + Map errorFlowMap = organizationOrgFlowSyncServer.flowSyncBatchPost(list); + errorMap.putAll(errorFlowMap); + }catch (Exception e){ + + } + try{ + log.info("进行集团协同平台岗位同步数据处理"); + Map errorGroupMap = organizationOrgGroupSyncServer.groupSyncBatchPost(list); + errorMap.putAll(errorGroupMap); + }catch (Exception e){ + e.printStackTrace(); + } + List syncResults = list.stream().map(post -> { + SyncResult syncResult = new SyncResult(post); + if(errorMap.containsKey(post.getId() + "")) { + syncResult.setSuccess(false); + syncResult.setMessage(errorMap.get(post.getId() + "")); + } else { + syncResult.setSuccess(true); + syncResult.setMessage("同步成功"); + } + return syncResult; + }).collect(Collectors.toList()); + return syncResults; + + } + + /** + *职务级别修改实时同步 + * @param list + * @return + */ + public List syncBatchLevel(List list) { + log.info("进入职务级别同步方法"); + Map errorMap = new HashMap<>(); + try{ + log.info("进行流程平台职务级别同步数据处理"); + Map errorFlowMap = organizationOrgFlowSyncServer.flowSyncBatchLevel(list); + errorMap.putAll(errorFlowMap); + }catch (Exception e){ + e.printStackTrace(); + } + try{ + log.info("进行集团协同平台职务级别同步数据处理"); + Map errorGroupMap = organizationOrgGroupSyncServer.groupSyncBatchLevel(list); + errorMap.putAll(errorGroupMap); + }catch (Exception e){ + e.printStackTrace(); + } + errorMap.putAll(errorMap); + List syncResults = list.stream().map(level -> { + SyncResult syncResult = new SyncResult(level); + if(errorMap.containsKey(level.getId() + "")) { + syncResult.setSuccess(false); + syncResult.setMessage(errorMap.get(level.getId() + "")); + } else { + syncResult.setSuccess(true); + syncResult.setMessage("同步成功"); + } + return syncResult; + }).collect(Collectors.toList()); + return syncResults; + } + + /** + * 人员修改实时同步 + * @param list + * @return + */ + public List syncBatchMember(List list) { + log.info("进入人员同步方法"); + Map errorMap = new HashMap<>(); + try{ + log.info("进行客户服务平台人员同步数据处理"); + Map errorFvMap = organizationOrgSyncServer.fvSyncBatchMember(list); + errorMap.putAll(errorFvMap); + } catch (InterruptedException e) { + e.printStackTrace(); + } catch (BusinessException e) { + e.printStackTrace(); + } + try{ + log.info("进行流程平台人员同步数据处理"); + Map errorFlowMap = organizationOrgFlowSyncServer.flowSyncBatchMember(list); + errorMap.putAll(errorFlowMap); + } catch (InterruptedException e) { + e.printStackTrace(); + } + try{ + log.info("进行集团协同平台人员同步数据处理"); + Map errorGroupMap = organizationOrgGroupSyncServer.groupSyncBatchMember(list); + errorMap.putAll(errorGroupMap); + } catch (InterruptedException e) { + e.printStackTrace(); + } catch (BusinessException e) { + e.printStackTrace(); + } + +// log.info("进行协同平台人员同步数据处理"); +// Map errorDingdingMap = organizationOrgDingdingSyncServer.dingdingSyncBatchMember(list); +// errorMap.putAll(errorDingdingMap); + + List syncResults = (List)list.stream().map((member) -> { + SyncResult syncResult = new SyncResult(member); + if (errorMap.containsKey(member.getId() + "")) { + syncResult.setSuccess(false); + syncResult.setMessage((String)errorMap.get(member.getId() + "")); + } else { + syncResult.setSuccess(true); + syncResult.setMessage("同步成功"); + } + + return syncResult; + }).collect(Collectors.toList()); + return syncResults; + } + + public String getPluginId() { + return SyncConstants.getPluginId(); + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/util/DingdingProtUtil.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/util/DingdingProtUtil.java new file mode 100644 index 0000000..e723fef --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/util/DingdingProtUtil.java @@ -0,0 +1,317 @@ +package com.seeyon.apps.src_mainorganization.util; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.dingtalk.api.DefaultDingTalkClient; +import com.dingtalk.api.DingTalkClient; +import com.dingtalk.api.request.*; +import com.dingtalk.api.response.*; +import com.seeyon.ctp.organization.bo.V3xOrgMember; +import com.taobao.api.ApiException; +//import com.taobao.api.ApiException; + +import java.io.*; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.Date; +import java.util.Map; + +public class DingdingProtUtil { + +// 获取钉钉token验证信息 + public static String getToken(String appkey,String appsecret) throws RuntimeException, ApiException { + DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/gettoken"); + OapiGettokenRequest request = new OapiGettokenRequest(); + request.setAppkey(appkey); + request.setAppsecret(appsecret); + request.setHttpMethod("GET"); + OapiGettokenResponse response = client.execute(request); + JSONObject jsonObject = JSON.parseObject(response.getBody()); + String token = jsonObject.getString("access_token"); + return token; + } + +// 调用钉钉部门新增接口 + public static String departmentCreate(OapiV2DepartmentCreateRequest req,String accessToken) throws ApiException { + DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/department/create"); + OapiV2DepartmentCreateResponse rsp = client.execute(req, accessToken); + System.out.println(rsp.getBody()); + return rsp.getBody(); + } + +// 调用钉钉部门修改接口 + public static String departmentUpdate(OapiV2DepartmentUpdateRequest req, String accessToken) throws ApiException { + DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/department/update"); + OapiV2DepartmentUpdateResponse rsp = client.execute(req, accessToken); + System.out.println(rsp.getBody()); + return rsp.getBody(); + } + +// 调用钉钉部门删除接口 + public static String departmentDelete(long deptId,String accessToken) throws ApiException { + DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/department/delete"); + OapiV2DepartmentDeleteRequest req = new OapiV2DepartmentDeleteRequest(); + req.setDeptId(deptId); + OapiV2DepartmentDeleteResponse rsp = client.execute(req, accessToken); + System.out.println(rsp.getBody()); + return rsp.getBody(); + } + +// 调用钉钉人员新增接口 + public static String memberCreate(OapiV2UserCreateRequest req,String accessToken) throws ApiException { + DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/create"); + OapiV2UserCreateResponse rsp = client.execute(req, accessToken); + System.out.println("新增"+rsp.getBody()); + return rsp.getBody(); + } + +// 封装参数,根据人员对象生成钉钉人员新增接口参数 +// public static OapiV2UserCreateRequest getMemberCreateParam(V3xOrgMember v3xOrgMember, Map memberMap){ +// OapiV2UserCreateRequest req = new OapiV2UserCreateRequest(); +//// 钉钉人员ID +// req.setUserid(v3xOrgMember.getId()+""); +//// 人员名称 +// req.setName(v3xOrgMember.getName()); +//// 人员手机号,钉钉内唯一值 +//// req.setMobile(v3xOrgMember.getTelNumber()); +// req.setMobile(memberMap.get("telNumber")); +//// 职位 +//// req.setTitle(""); +//// 邮箱 +//// req.setEmail(""); +//// 所属部门ID +// req.setDeptIdList(memberMap.get("deptId")); +//// 工号 +// req.setJobNumber(""); +//// 入职时间,时间戳 +// Date hiredate = v3xOrgMember.getHiredate(); +// if(hiredate!=null){ +// req.setHiredDate(hiredate.getTime()); +// } +// return req; +// } + + // 封装参数,根据人员对象生成钉钉人员新增接口参数 + public static OapiV2UserCreateRequest getMemberCreateParam(Map serviceBroker, Map memberMap){ + OapiV2UserCreateRequest req = new OapiV2UserCreateRequest(); +// 钉钉人员ID + req.setUserid(serviceBroker.get("id")+""); +// 人员名称 + req.setName(serviceBroker.get("name").toString()); +// 人员手机号,钉钉内唯一值 +// req.setMobile(v3xOrgMember.getTelNumber()); + req.setMobile(memberMap.get("telNumber")); +// 职位 +// req.setTitle(""); +// 邮箱 +// req.setEmail(""); +// 所属部门ID + req.setDeptIdList(memberMap.get("deptId")); +// 工号 + req.setJobNumber(""); +// 入职时间,时间戳 + if(serviceBroker.get("hiredate")!=null){ + req.setHiredDate(((Date)serviceBroker.get("hiredate")).getTime()); + } + return req; + } + + +// 调用钉钉人员修改接口 + public static String memberUpdate(OapiV2UserUpdateRequest req, String accessToken) throws ApiException { + DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/update"); + OapiV2UserUpdateResponse rsp = client.execute(req, accessToken); + System.out.println("修改"+rsp.getBody()); + return rsp.getBody(); + } + +// 封装参数,根据人员对象生成钉钉人员修改接口参数 +// public static OapiV2UserUpdateRequest getMemberUpdateParam(V3xOrgMember v3xOrgMember, Map memberMap){ +// OapiV2UserUpdateRequest req = new OapiV2UserUpdateRequest(); +//// 钉钉用户ID +// req.setUserid(v3xOrgMember.getId()+""); +//// 人员名称 +// req.setName(v3xOrgMember.getName()); +//// 工号 +// req.setJobNumber(v3xOrgMember.getCode()); +//// 职位 +// req.setTitle(""); +//// 邮箱 +// req.setEmail(""); +// req.setDeptIdList(memberMap.get("deptId")); +// req.setLanguage("zh_CN"); +//// 强制更新的字段 +//// req.setForceUpdateFields("manager_userid"); +// return req; +// } + + // 封装参数,根据人员对象生成钉钉人员修改接口参数 + public static OapiV2UserUpdateRequest getMemberUpdateParam(Map serviceBroker, Map memberMap){ + OapiV2UserUpdateRequest req = new OapiV2UserUpdateRequest(); +// 钉钉用户ID + req.setUserid(serviceBroker.get("dd_member_id")+""); +// 人员名称 + req.setName(serviceBroker.get("name")+""); +// 工号 + req.setJobNumber(""); +// 职位 + req.setTitle(""); +// 邮箱 + req.setEmail(""); + req.setDeptIdList(memberMap.get("deptId")); + req.setLanguage("zh_CN"); +// 强制更新的字段 +// req.setForceUpdateFields("manager_userid"); + return req; + } + + + // 调用钉钉人员删除接口,根据钉钉人员ID删除人员 + public static String memberDelete(String userId ,String accessToken) throws ApiException { + DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/delete"); + OapiV2UserDeleteRequest req = new OapiV2UserDeleteRequest(); + req.setUserid(userId); + OapiV2UserDeleteResponse rsp = client.execute(req, accessToken); + System.out.println("删除"+rsp.getBody()); + return rsp.getBody(); + } + + + // 调用钉钉接口获取部门下级部门ID + public static String departmentListsubid(long parentId ,String accessToken) throws ApiException { + DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/department/listsubid"); + OapiV2DepartmentListsubidRequest req = new OapiV2DepartmentListsubidRequest(); + req.setDeptId(parentId); + OapiV2DepartmentListsubidResponse rsp = client.execute(req, accessToken); + System.out.println(rsp.getBody()); + return rsp.getBody(); + } + + + //调用钉钉接口,根据钉钉部门ID获取部门信息 + public static String departmentGet(long parentId ,String accessToken) throws ApiException { + DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/department/get"); + OapiV2DepartmentGetRequest req = new OapiV2DepartmentGetRequest(); + req.setDeptId(parentId); + req.setLanguage("zh_CN"); + OapiV2DepartmentGetResponse rsp = client.execute(req, accessToken); + System.out.println(rsp.getBody()); + return rsp.getBody(); + } + +// 调用钉钉接口,根据钉钉部门ID获取部门下所有人员 + public static String userListId(long departmentId,String accessToken) throws ApiException { + DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/user/listid"); + OapiUserListidRequest req = new OapiUserListidRequest(); + req.setDeptId(departmentId); + OapiUserListidResponse rsp = client.execute(req, accessToken); + System.out.println(rsp.getBody()); + return rsp.getBody(); + } + +// 调用钉钉接口,调用钉钉人员ID信息获取钉钉中人员详细信息 + public static String userGet(String userId,String accessToken) throws ApiException { + DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/get"); + OapiV2UserGetRequest req = new OapiV2UserGetRequest(); + req.setUserid(userId); + req.setLanguage("zh_CN"); + OapiV2UserGetResponse rsp = client.execute(req, accessToken); + System.out.println(rsp.getBody()); + return rsp.getBody(); + } + + + + + /** + * 调用post接口 + * @param str 调用接口传递的参数json + * @param urlStr 需要调用的url对应的参数文件中的编码 + * @return + * @throws + * @throws RuntimeException + */ + public static JSONObject doPost(String str, String urlStr,String token ) throws RuntimeException { + HttpURLConnection connection = null; + InputStream is = null; + OutputStream os = null; + BufferedReader br = null; + String result = null; + try { + URL url = new URL(urlStr+"?access_token="+token); + // 通过远程url连接对象打开连接 + connection = (HttpURLConnection) url.openConnection(); + // 设置连接请求方式 + connection.setRequestMethod("POST"); + // 设置连接主机服务器超时时间:15000毫秒 + connection.setConnectTimeout(15000); + // 设置读取主机服务器返回数据超时时间:60000毫秒 + connection.setReadTimeout(60000); + + // 默认值为:false,当向远程服务器传送数据/写数据时,需要设置为true + connection.setDoOutput(true); + // 默认值为:true,当前向远程服务读取数据时,设置为true,该参数可有可无 + connection.setDoInput(true); + // 设置传入参数的格式:请求参数应该是 name1=value1&name2=value2 的形式。 +// connection.setRequestProperty("access_token", token); + connection.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); + // 通过连接对象获取一个输出流 + os = connection.getOutputStream(); + // 通过输出流对象将参数写出去/传输出去,它是通过字节数组写出的 + if (!("".equals(str) || str == null)) { + os.write(str.getBytes("UTF-8")); + } + // 连接对象获取一个输入流,向远程读取 + System.out.println(connection.getResponseCode()); + if (connection.getResponseCode() == 200) { + is = connection.getInputStream(); + // 对输入流对象进行包装:charset根据工作项目组的要求来设置 + br = new BufferedReader(new InputStreamReader(is, "UTF-8")); + + StringBuffer sbf = new StringBuffer(); + String temp = null; + // 循环遍历一行一行读取数据 + while ((temp = br.readLine()) != null) { + sbf.append(temp); + sbf.append("\r\n"); + } + result = sbf.toString(); + } + } catch (MalformedURLException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + // 关闭资源 + if (null != br) { + try { + br.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (null != os) { + try { + os.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (null != is) { + try { + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + // 断开与远程地址url的连接 + connection.disconnect(); + } + JSONObject json = JSONObject.parseObject(result); + return json; + } + + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/util/ExcelUtils.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/util/ExcelUtils.java new file mode 100644 index 0000000..5ad746f --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/util/ExcelUtils.java @@ -0,0 +1,64 @@ +package com.seeyon.apps.src_mainorganization.util; + +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.List; +import java.util.Map; + +public class ExcelUtils { + + /** + * 生成Excel文件 + * @param headerData 数据表头信息 + * @param dataList 数据列表 + * @param filePath 文件保存路径 + * @param sheetName 工作表名称 + * @throws IOException IO异常 + */ + public static void generateExcel(String[] headerData , List> dataList, String filePath, String sheetName) throws IOException { + // 创建工作簿 + try (XSSFWorkbook workbook = new XSSFWorkbook()) { + // 创建工作表 + XSSFSheet sheet = workbook.createSheet(sheetName); + + // 创建表头行 + XSSFRow headerRow = sheet.createRow(0); + for(int i = 0 ; i user : dataList) { + XSSFRow row = sheet.createRow(rowNum++); + for(int i = 0 ; i < headerData.length ; i ++){ + row.createCell(i).setCellValue(user.get(headerData[i])); + } +// row.createCell(0).setCellValue(user.get("ID")); +// row.createCell(1).setCellValue(user.get("姓名")); +// row.createCell(2).setCellValue(user.get("年龄")); + } + // 自动调整列宽 + for (int i = 0; i < headerData.length; i++) { + sheet.autoSizeColumn(i); + } + File file = new File(filePath); + File parentDir = file.getParentFile(); + if (parentDir != null && !parentDir.exists()) { + parentDir.mkdirs(); // 创建所有必要的父目录 + } + // 保存文件 + try (FileOutputStream outputStream = new FileOutputStream(filePath)) { + workbook.write(outputStream); + } + } + } + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/util/FormExportUtil.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/util/FormExportUtil.java new file mode 100644 index 0000000..2087ab2 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/util/FormExportUtil.java @@ -0,0 +1,107 @@ +package com.seeyon.apps.src_mainorganization.util; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.seeyon.v3x.services.form.bean.RecordExport; +import com.seeyon.v3x.services.form.bean.SubordinateFormExport; +import com.seeyon.v3x.services.form.bean.ValueExport; + +import java.util.*; + +//创建无流程表单数据处理工具类 +public class FormExportUtil { + + /** + * 设置主表信息 + * @param map 设置主表字段。Map<主表显示名称,主表数据> + * @return + */ + public List setFormValue(Map map){ +// 创建返回值对象 + List valueExports = new ArrayList(); + ValueExport valueExport ; +// 获取参数信息(显示名称) + Set keys = map.keySet(); + if(keys.size()>0) { +// 对控件赋值 + for (String key : keys) { + valueExport = new ValueExport(); + valueExport.setDisplayName(key); + valueExport.setValue(map.get(key)); + valueExports.add(valueExport); + } + } + return valueExports; + } + + /** + * 设置从表信息 + * @param lists 设置主表字段。List> + */ + public List setSubordinateFormValue(List> lists){ + List subordinateFormExports = new ArrayList(); + SubordinateFormExport subordinateFormExport = new SubordinateFormExport(); + List recordExports = new ArrayList(); + List valueExports; + RecordExport recordExport; + for(int i = 0 ; i < lists.size() ; i++) { + recordExport = new RecordExport(); + valueExports = setFormValue(lists.get(i)); + recordExport.setRecord(valueExports); + recordExports.add(recordExport); + } + subordinateFormExport.setValues(recordExports); + subordinateFormExports.add(subordinateFormExport); + + return subordinateFormExports; + } + + + /** + * 格式转换将{"id":1,"str1":"123","str2":"asd","str3":"qwe"},{"id":2,"str1":"123","str2":"asd","str3":"qwe"},{"id":3,"str1":"123","str2":"asd","str3":"qwe"},{"id":1,"str1":"123","str2":"asd","str3":"qwe"},{"id":2,"str1":"123","str2":"asd","str3":"qwe"},{"id":3,"str1":"123","str2":"asd","str3":"qwe"}] + 有什么办法转换成 + [{"id":1,"data":[{"id":1,"str1":"123","str2":"asd","str3":"qwe"},{"id":1,"str1":"123","str2":"asd","str3":"qwe"}]}{"id":2,"data":[{"id":2,"str1":"123","str2":"asd","str3":"qwe"},{"id":2,"str1":"123","str2":"asd","str3":"qwe"}]}{"id":3,"data":[{"id":3,"str1":"123","str2":"asd","str3":"qwe"},{"id":3,"str1":"123","str2":"asd","str3":"qwe"}]}] + * @param inputList + * @return + */ + public List> transformData(JSONArray inputList) { + Map>> groupedData = new HashMap<>(); + for(int i = 0 ; i < inputList.size();i++) { + String userId = inputList.getJSONObject(i).getString("userId"); + + groupedData.computeIfAbsent(userId, k -> new ArrayList<>()).add(inputList.getJSONObject(i)); + } + + List> result = new ArrayList<>(); + + for (Map.Entry>> entry : groupedData.entrySet()) { + Map resultMap = new HashMap<>(); + resultMap.put("userId", entry.getKey()); + resultMap.put("data", entry.getValue()); + result.add(resultMap); + } + + return result; + } + + + + public JSONArray dingdingTimeSequence (JSONArray datas){ + + for (int i = 0; i < datas.size() - 1; i++) { + for (int j = 0; j < datas.size() - i - 1; j++) { + String value1 = datas.getJSONObject(j).getString("baseCheckTime"); + String value2 = datas.getJSONObject(j + 1).getString("baseCheckTime"); + long long1 = Long.parseLong(value1); + long long2 = Long.parseLong(value2); + if (long1 > long2) { + JSONObject temp = datas.getJSONObject(j); + datas.set(j, datas.getJSONObject(j + 1)); + datas.set(j + 1, temp); + } + } + } + return datas; + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/util/LearnTokenUtil.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/util/LearnTokenUtil.java new file mode 100644 index 0000000..0937b60 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/util/LearnTokenUtil.java @@ -0,0 +1,107 @@ +package com.seeyon.apps.src_mainorganization.util; + +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.src_mainorganization.constans.SyncConstants; +import com.seeyon.apps.common.plugin.vo.ConfigVo; +import org.apache.http.HttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.impl.client.DefaultHttpClient; +import org.apache.http.util.EntityUtils; +import www.seeyon.com.utils.StringUtil; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; + +public class LearnTokenUtil { + + public static String getToken(ConfigVo configVo, String systemType) throws IOException { + String address = ""; + String token = ""; + String loginName = ""; + String restUserName = ""; + String restPassword = ""; + String url = ""; + byte var9 = -1; + switch(systemType.hashCode()) { + case 3146030: + if (systemType.equals("flow")) { + var9 = 0; + } + } + + switch(var9) { + case 0: + loginName = configVo.getParamVal(SyncConstants.flowLoginName.name()); + restUserName = configVo.getParamVal(SyncConstants.flowRestUserName.name()); + restPassword = configVo.getParamVal(SyncConstants.flowRestPassword.name()); + url = configVo.getParamVal(SyncConstants.flowurl.name()); + default: + if ("".equals(loginName)) { + address = url + "/seeyon/rest/token/" + restUserName + "/" + restPassword; + } else { + address = url + "/seeyon/rest/token" + restUserName + "/" + restPassword + "?loginName=" + loginName; + } + + HttpURLConnection connection = (HttpURLConnection)(new URL(address)).openConnection(); + connection.setRequestProperty("Accept", "application/json"); + connection.setRequestMethod("GET"); + int responseCode = connection.getResponseCode(); + if (responseCode == 200) { + BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); + StringBuffer response = new StringBuffer(); + + String inputLine; + while((inputLine = in.readLine()) != null) { + response.append(inputLine); + } + + in.close(); + String result = response.toString(); + if (result.contains("{")) { + JSONObject jsObj = JSONObject.parseObject(result); + System.out.println(jsObj); + token = jsObj.get("id").toString(); + } else { + token = result; + } + + System.out.println(token); + } else { + System.out.println("GET request not worked"); + } + + return token; + } + } + + public static String doGet(String par, String strUrl) { + String address = ""; + if (StringUtil.isNotEmpty(par)) { + if (strUrl.indexOf("?") != -1) { + address = strUrl + "?" + par; + } else { + address = strUrl + "&" + par; + } + } else { + address = strUrl; + } + + DefaultHttpClient client = new DefaultHttpClient(); + String result = ""; + HttpGet get = new HttpGet(address); + + try { + HttpResponse res = client.execute(get); + if (res.getStatusLine().getStatusCode() == 200) { + result = EntityUtils.toString(res.getEntity()); + } + + return result; + } catch (Exception var7) { + throw new RuntimeException(var7); + } + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/util/ParamUtil.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/util/ParamUtil.java new file mode 100644 index 0000000..7809e12 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/util/ParamUtil.java @@ -0,0 +1,37 @@ +package com.seeyon.apps.src_mainorganization.util; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class ParamUtil { + + public static boolean isClientAccount(String accountPath){ + String pattern = "00000017.{8}"; + boolean boo = false; + // 创建Pattern对象 + Pattern p = Pattern.compile(pattern); + // 创建Matcher对象 + Matcher m = p.matcher(accountPath); + // 检查是否匹配 + if (m.matches()) { + boo = true; + } + return boo; + } + + + public static String pathIncrease(String originalText,int num){ + // 1. 将字符串转为数字 + long number = Long.parseLong(originalText); + // 2. 数字+1 + number += num; + // 3. 格式化为原长度,前面补零 + String incrementedText = String.format("%0" + originalText.length() + "d", number); + System.out.println("原值: " + originalText); // 输出: 000000170011 + System.out.println("+1后: " + incrementedText); // 输出: 000000170012 + return incrementedText; + } + + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/util/ProtUtil.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/util/ProtUtil.java new file mode 100644 index 0000000..e30c5fe --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/util/ProtUtil.java @@ -0,0 +1,296 @@ +package com.seeyon.apps.src_mainorganization.util; + +import cn.hutool.log.Log; +import com.alibaba.fastjson.JSONObject; +import org.apache.http.HttpEntity; +import org.apache.http.HttpResponse; +import org.apache.http.HttpStatus; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPut; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.DefaultHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.util.EntityUtils; +import www.seeyon.com.utils.StringUtil; + +import java.io.*; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.HashMap; +import java.util.Map; + +public class ProtUtil { + private static Log log = Log.get(ProtUtil.class); + + /** + * 获取一个token + * @return + */ + public static String getToken(String url,String loginName) { + if(StringUtil.isNotEmpty(loginName)){ + url+="?loginName="+loginName; + } + DefaultHttpClient client = new DefaultHttpClient(); + String result = ""; + HttpGet get = new HttpGet(url); + try { + get.addHeader("Accept","application/json"); + HttpResponse res = client.execute(get); + if (res.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { + result = EntityUtils.toString(res.getEntity()); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + String token = ""; + if(result.contains("{")) { + JSONObject jsObj = JSONObject.parseObject(result); + token = jsObj.get("id").toString(); + }else { + token = result; + } + return token; + } + + /** + * 获取一个token + * @return + */ + public static String getQxxToken(String url,String corpId,String corpsecret) { +// if(StringUtil.isNotEmpty(loginName)){ +// url+="?loginName="+loginName; +// } + String getTokenUrl = url+"corpid="+corpId+"&corpsecret="+corpsecret; + log.info(getTokenUrl); + DefaultHttpClient client = new DefaultHttpClient(); + String result = ""; + HttpGet get = new HttpGet(getTokenUrl); + try { + get.addHeader("Content-Type","application/json"); + HttpResponse res = client.execute(get); + if (res.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { + result = EntityUtils.toString(res.getEntity()); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + String token = ""; + if(result.contains("{")) { + JSONObject jsObj = JSONObject.parseObject(result); + JSONObject data = jsObj.getJSONObject("data"); + token = data.getString("token"); + }else { + token = result; + } + return token; + } + + /** + * 调用get接口 + * @param strUrl 需要调用的url对应的配置文件的key + * @return + */ + public static String doGet( String strUrl) { + return doGet(strUrl , new HashMap<>()); + } + + /** + * 调用get接口 + * @param strUrl 需要调用的url对应的配置文件的key + * @return + */ + public static String doGet( String strUrl,Map headerMap) { + String address = strUrl; + DefaultHttpClient client = new DefaultHttpClient(); + String result = ""; + HttpGet get = new HttpGet(address); + try { + if(headerMap.size()>0){ + for (Map.Entry entry : headerMap.entrySet()) { + String key = entry.getKey(); // 获取键 + String value = entry.getValue(); // 获取值 + get.addHeader(key,value); + } + } + HttpResponse res = client.execute(get); + if (res.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { + result = EntityUtils.toString(res.getEntity()); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + return result; + } + + + public static String callPutApi(String apiUrl, String requestBody) { + StringBuilder response = new StringBuilder(); + try { + URL url = new URL(apiUrl); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod("PUT"); + connection.setRequestProperty("Content-Type", "application/json"); + connection.setDoOutput(true); + try (DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream())) { + outputStream.writeBytes(requestBody); + outputStream.flush(); + } + int responseCode = connection.getResponseCode(); + System.out.println("Response Code : " + responseCode); + try (BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()))) { + String line; + while ((line = reader.readLine())!= null) { + response.append(line); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + return response.toString(); + } + + /** + * 调用post接口 + * @param str 调用接口传递的参数json + * @param urlStr 需要调用的url对应的参数文件中的编码 + * @return + */ + public static String doPost(String str, String urlStr) { + return doPost(str,urlStr ,new HashMap<>()); + } + + /** + * 调用post接口 + * @param str 调用接口传递的参数json + * @param urlStr 需要调用的url对应的参数文件中的编码 + * @param headerMap 请求头参数列表 + * @return + */ + public static String doPost(String str, String urlStr , Map headerMap) { + HttpURLConnection connection = null; + InputStream is = null; + OutputStream os = null; + BufferedReader br = null; + String result = null; + try { + URL url = new URL(urlStr); + // 通过远程url连接对象打开连接 + connection = (HttpURLConnection) url.openConnection(); + // 设置连接请求方式 + connection.setRequestMethod("POST"); + // 设置连接主机服务器超时时间:15000毫秒 +// connection.setConnectTimeout(15000); + // 设置读取主机服务器返回数据超时时间:60000毫秒 +// connection.setReadTimeout(60000); + // 默认值为:false,当向远程服务器传送数据/写数据时,需要设置为true +// connection.setDoOutput(true); + // 默认值为:true,当前向远程服务读取数据时,设置为true,该参数可有可无 +// connection.setDoInput(true); + if(headerMap.size()>0){ + for (Map.Entry entry : headerMap.entrySet()) { + String key = entry.getKey(); // 获取键 + String value = entry.getValue(); // 获取值 + connection.setRequestProperty(key, value); + } + }else{ + connection.setRequestProperty("Content-Type", "application/json"); + } + os = connection.getOutputStream(); + if (!("".equals(str) || str == null)) { + os.write(str.getBytes("UTF-8")); + } + if (connection.getResponseCode() == 200) { + is = connection.getInputStream(); + br = new BufferedReader(new InputStreamReader(is, "UTF-8")); + StringBuffer sbf = new StringBuffer(); + String temp = null; + while ((temp = br.readLine()) != null) { + sbf.append(temp); + sbf.append("\r\n"); + } + result = sbf.toString(); + } + } catch (MalformedURLException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (null != br) { + try { + br.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (null != os) { + try { + os.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (null != is) { + try { + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + }if (null != connection) { + connection.disconnect(); + } + } + return result; + + } + + + public static String httpPutRaw(String url, String stringJson, Map headers, String encode){ + if(encode == null){ + encode = "utf-8"; + } + CloseableHttpResponse httpResponse = null; + CloseableHttpClient closeableHttpClient = null; + String content = null; + //since 4.3 不再使用 DefaultHttpClient + try { + + //HttpClients.createDefault()等价于 HttpClientBuilder.create().build(); + closeableHttpClient = HttpClients.createDefault(); + HttpPut httpput = new HttpPut(url); + + //设置header + httpput.setHeader("Content-type", "application/json"); + if (headers != null && headers.size() > 0) { + for (Map.Entry entry : headers.entrySet()) { + httpput.setHeader(entry.getKey(),entry.getValue().toString()); + } + } + //组织请求参数 + StringEntity stringEntity = new StringEntity(stringJson, encode); + httpput.setEntity(stringEntity); + //响应信息 + httpResponse = closeableHttpClient.execute(httpput); + HttpEntity entity = httpResponse.getEntity(); + content = EntityUtils.toString(entity, encode); + } catch (Exception e) { + e.printStackTrace(); + }finally{ + try { + httpResponse.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + try { + closeableHttpClient.close(); //关闭连接、释放资源 + } catch (IOException e) { + e.printStackTrace(); + } + return content; + } + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/util/QixuexingPortUtil.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/util/QixuexingPortUtil.java new file mode 100644 index 0000000..1aa60e1 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_mainorganization/util/QixuexingPortUtil.java @@ -0,0 +1,302 @@ +package com.seeyon.apps.src_mainorganization.util; + +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.common.plugin.vo.ConfigVo; +import com.seeyon.apps.src_mainorganization.constans.SyncConstants; +import com.seeyon.ctp.util.UUIDLong; + +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; +import java.util.Arrays; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +public class QixuexingPortUtil { + + /** + * 获取企学星token信息 + * @param configVo + * @return + */ + public static String qixuexingToken(ConfigVo configVo){ + String qxxUrl = configVo.getParamVal(SyncConstants.qxxUrl.name()); + String qxxGetToken = configVo.getParamVal(SyncConstants.qxxGetToken.name()); + String qxxCorpid = configVo.getParamVal(SyncConstants.qxxCorpid.name()); + String qxxCorpsecret = configVo.getParamVal(SyncConstants.qxxCorpsecret.name()); + String qxxToken = ProtUtil.getQxxToken(qxxUrl+qxxGetToken,qxxCorpid,qxxCorpsecret); + return qxxToken; + } + + /** + * 根据企学星唯一值信息查询企学星部门信息 + * @param configVo 枚举参数信息 + * @param orgUuid 部门唯一值 + * @return + */ + public static JSONObject qixuexingSelectOrg(ConfigVo configVo,String orgUuid){ + String qxxCorpsecret = configVo.getParamVal(SyncConstants.qxxCorpsecret.name()); + String qxxToken = qixuexingToken(configVo); + String qxxUrl = configVo.getParamVal(SyncConstants.qxxUrl.name()); + String qxxSelectOrg = configVo.getParamVal(SyncConstants.qxxSelectOrg.name()); + JSONObject param = new JSONObject(); + param.put("orgUuid",orgUuid); + Map headerMap = setHeaderMap(qxxToken,qxxCorpsecret,param); + String str = ProtUtil.doPost(param.toString(), qxxUrl+qxxSelectOrg, headerMap); + JSONObject jsonObject = JSONObject.parseObject(str); + return jsonObject; + } + + /** + * 调用接口保存企学星部门信息 + * @param configVo 枚举参数 + * @param map 协同单位信息 + * @param subAccountId 上级单位信息 + * @return + */ + public static JSONObject qixuexingSaveOrg(ConfigVo configVo,Map map ,String subAccountId){ + String qxxCorpsecret = configVo.getParamVal(SyncConstants.qxxCorpsecret.name()); + String qxxToken = qixuexingToken(configVo); + String qxxUrl = configVo.getParamVal(SyncConstants.qxxUrl.name()); + String qxxSaveOrg = configVo.getParamVal(SyncConstants.qxxSaveOrg.name()); + JSONObject param = new JSONObject(); + param.put("orgUuid",map.get("id").toString()); + param.put("name",map.get("name").toString()); + param.put("orgCode",map.get("code")); +// 上级设置,如果上级为集团则设置为空。 + if(!"-1730833917365171641".equals(subAccountId)){ + param.put("parentOrgUuid",subAccountId); + } + param.put("orderNum",map.get("sort_id").toString()); + param.put("status","1".equals(map.get("is_enable").toString())?"1":"2"); + Map headerMap = setHeaderMap(qxxToken,qxxCorpsecret,param); + String str = ProtUtil.doPost(param.toString(), qxxUrl+qxxSaveOrg, headerMap); + JSONObject jsonObject = JSONObject.parseObject(str); + return jsonObject; + } + + /** + * 根据企学星唯一值信息删除企学星部门信息 + * @param configVo 枚举参数信息 + * @param orgUuid 部门唯一值 + * @return + */ + public static JSONObject qixuexingDeleteOrg(ConfigVo configVo,String orgUuid){ + String qxxCorpsecret = configVo.getParamVal(SyncConstants.qxxCorpsecret.name()); + String qxxToken = qixuexingToken(configVo); + String qxxUrl = configVo.getParamVal(SyncConstants.qxxUrl.name()); + String qxxDeleteOrg = configVo.getParamVal(SyncConstants.qxxDeleteOrg.name()); + JSONObject param = new JSONObject(); + param.put("orgUuid",orgUuid); + Map headerMap = setHeaderMap(qxxToken,qxxCorpsecret,param); + String str = ProtUtil.doPost(param.toString(), qxxUrl+qxxDeleteOrg, headerMap); + JSONObject jsonObject = JSONObject.parseObject(str); + return jsonObject; + } + + /** + * 调用接口保存企学星用户信息 + * @param configVo 枚举参数信息 + * @param map 用户Map信息 + * @return + */ + public static JSONObject qixuexingSaveUser(ConfigVo configVo,Map map){ + String qxxCorpsecret = configVo.getParamVal(SyncConstants.qxxCorpsecret.name()); + String qxxToken = qixuexingToken(configVo); + String qxxUrl = configVo.getParamVal(SyncConstants.qxxUrl.name()); + String qxxSaveUser = configVo.getParamVal(SyncConstants.qxxSaveUser.name()); + JSONObject param = new JSONObject(); + param.put("userUuid",map.get("id").toString()); + param.put("username",map.get("telnumber").toString()); + param.put("realName",map.get("name").toString()); + param.put("orgUuid",map.get("department_id").toString()); + param.put("phone",map.get("telnumber").toString()); + param.put("credentialsType","1"); + param.put("credentialsCode",map.get("member_no").toString()); + param.put("sex",map.get("member_sex").toString()); + param.put("status",map.get("member_status").toString()); + param.put("entryDate",map.get("board_date").toString()); + Map headerMap = setHeaderMap(qxxToken,qxxCorpsecret,param); + String str = ProtUtil.doPost(param.toString(), qxxUrl+qxxSaveUser, headerMap); + JSONObject jsonObject = JSONObject.parseObject(str); + return jsonObject; + } + + /** + * 根据企学星唯一值信息删除企学星用户信息 + * @param configVo 枚举参数信息 + * @param userUuid 业代用户唯一值 + * @return + */ + public static JSONObject qixuexingDeleteUser(ConfigVo configVo,String userUuid){ + String qxxCorpsecret = configVo.getParamVal(SyncConstants.qxxCorpsecret.name()); + String qxxToken = qixuexingToken(configVo); + String qxxUrl = configVo.getParamVal(SyncConstants.qxxUrl.name()); + String qxxSaveUser = configVo.getParamVal(SyncConstants.qxxSaveUser.name()); + JSONObject param = new JSONObject(); + param.put("userUuid",userUuid); + Map headerMap = setHeaderMap(qxxToken,qxxCorpsecret,param); + String str = ProtUtil.doPost(param.toString(), qxxUrl+qxxSaveUser, headerMap); + JSONObject jsonObject = JSONObject.parseObject(str); + return jsonObject; + } + + /** + * 调用接口保存企学星业代用户信息 + * @param configVo 枚举参数信息 + * @param map 业代用户Map信息 + * @return + */ + public static JSONObject qixuexingSaveUserServiceBroker(ConfigVo configVo,Map map){ + String qxxCorpsecret = configVo.getParamVal(SyncConstants.qxxCorpsecret.name()); + String qxxToken = qixuexingToken(configVo); + String qxxUrl = configVo.getParamVal(SyncConstants.qxxUrl.name()); + String qxxSaveUser = configVo.getParamVal(SyncConstants.qxxSaveUser.name()); + JSONObject param = new JSONObject(); + param.put("userUuid",map.get("id").toString()); + param.put("username",map.get("telnumber").toString()); + param.put("realName",map.get("name").toString()); + param.put("orgUuid",map.get("dept_id").toString()); + param.put("phone",map.get("telnumber").toString()); + param.put("credentialsType","1"); + param.put("credentialsCode",map.get("member_no").toString()); + param.put("sex",map.get("member_sex").toString()); + param.put("status",map.get("member_status").toString()); + param.put("entryDate",map.get("hiredate").toString()); + Map headerMap = setHeaderMap(qxxToken,qxxCorpsecret,param); + String str = ProtUtil.doPost(param.toString(), qxxUrl+qxxSaveUser, headerMap); + JSONObject jsonObject = JSONObject.parseObject(str); + return jsonObject; + } + + /** + * 根据企学星唯一值信息删除企学星业代用户信息 + * @param configVo 枚举参数信息 + * @param userUuid 用户唯一值 + * @return + */ + public static JSONObject qixuexingDeleteUserServiceBroker(ConfigVo configVo,String userUuid){ + String qxxCorpsecret = configVo.getParamVal(SyncConstants.qxxCorpsecret.name()); + String qxxToken = qixuexingToken(configVo); + String qxxUrl = configVo.getParamVal(SyncConstants.qxxUrl.name()); + String qxxSaveUser = configVo.getParamVal(SyncConstants.qxxSaveUser.name()); + JSONObject param = new JSONObject(); + param.put("userUuid",userUuid); + Map headerMap = setHeaderMap(qxxToken,qxxCorpsecret,param); + String str = ProtUtil.doPost(param.toString(), qxxUrl+qxxSaveUser, headerMap); + JSONObject jsonObject = JSONObject.parseObject(str); + return jsonObject; + } + + /** + * 调用接口保存企学星业代用户信息 + * @param configVo 枚举参数信息 + * @param map 业代用户Map信息 + * @return + */ + public static JSONObject qixuexingSaveUserClientMember(ConfigVo configVo,Map map){ + String qxxCorpsecret = configVo.getParamVal(SyncConstants.qxxCorpsecret.name()); + String qxxToken = qixuexingToken(configVo); + String qxxUrl = configVo.getParamVal(SyncConstants.qxxUrl.name()); + String qxxSaveUser = configVo.getParamVal(SyncConstants.qxxSaveUser.name()); + JSONObject param = new JSONObject(); + param.put("userUuid",map.get("id").toString()); + param.put("username",map.get("telnumber").toString()); + param.put("realName",map.get("name").toString()); + param.put("orgUuid",map.get("area_dept").toString()); + param.put("phone",map.get("telnumber").toString()); + param.put("credentialsType","1"); + param.put("credentialsCode",map.get("member_no").toString()); + param.put("sex",map.get("member_sex").toString()); + param.put("status",map.get("member_status").toString()); + param.put("entryDate",map.get("board_date").toString()); + Map headerMap = setHeaderMap(qxxToken,qxxCorpsecret,param); + String str = ProtUtil.doPost(param.toString(), qxxUrl+qxxSaveUser, headerMap); + JSONObject jsonObject = JSONObject.parseObject(str); + return jsonObject; + } + + /** + * 根据企学星唯一值信息删除企学星业代用户信息 + * @param configVo 枚举参数信息 + * @param userUuid 用户唯一值 + * @return + */ + public static JSONObject qixuexingDeleteUserClientMember(ConfigVo configVo,String userUuid){ + String qxxCorpsecret = configVo.getParamVal(SyncConstants.qxxCorpsecret.name()); + String qxxToken = qixuexingToken(configVo); + String qxxUrl = configVo.getParamVal(SyncConstants.qxxUrl.name()); + String qxxSaveUser = configVo.getParamVal(SyncConstants.qxxSaveUser.name()); + JSONObject param = new JSONObject(); + param.put("userUuid",userUuid); + Map headerMap = setHeaderMap(qxxToken,qxxCorpsecret,param); + String str = ProtUtil.doPost(param.toString(), qxxUrl+qxxSaveUser, headerMap); + JSONObject jsonObject = JSONObject.parseObject(str); + return jsonObject; + } + + /** + * 设置企学星请求头信息 + * @param qxxToken + * @param qxxCorpsecret + * @param param + * @return + */ + private static Map setHeaderMap(String qxxToken,String qxxCorpsecret,JSONObject param){ + Map headerMap = new HashMap<>(); + long uuid = UUIDLong.longUUID(); + headerMap.put("Content-Type","application/json"); + headerMap.put("token",qxxToken); + long timestamp = new Date().getTime(); + headerMap.put("timestamp",timestamp+""); + headerMap.put("nonce",uuid+""); + String signature = QixuexingPortUtil.getSignature + (qxxToken,timestamp+"",uuid+"",param.toString(),qxxCorpsecret); + headerMap.put("signature",signature); + return headerMap; + } + + /** + * 获取接口签名 + * + * @param token 票据 + * @param timestamp 时间戳 + * @param nonce 随机字符串 + * @param body body 信息 + * @param corpsecret 企业的凭证密钥 + * @return 安全签名 + */ + public static String getSignature(String token, String timestamp, String nonce, String body,String corpsecret) { + try { + String[] array = new String[]{token, timestamp, nonce, body}; + StringBuffer stringBuffer = new StringBuffer(); + // 字符串排序 + Arrays.sort(array); + for (int i = 0; i < array.length; i++) { + stringBuffer.append(array[i]); + } + String str = stringBuffer.toString(); + + Mac mac = Mac.getInstance("HmacSHA256"); + mac.init(new SecretKeySpec(corpsecret.getBytes("UTF-8"), "HmacSHA256")); + byte[] signData = mac.doFinal(str.getBytes("UTF-8")); + + StringBuffer sb = new StringBuffer(signData.length); + String sTmp; + + for (int i = 0; i < signData.length; i++) { + sTmp = Integer.toHexString(0xFF & signData[i]); + if (sTmp.length() < 2) { + sb.append(0); + } + sb.append(sTmp.toUpperCase()); + } + return sb.toString(); + } catch (Exception e) { + throw new RuntimeException("获取签名异常"); + } + } + + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_quartformtable/dao/IQuartFormTableDao.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_quartformtable/dao/IQuartFormTableDao.java new file mode 100644 index 0000000..021d2fc --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_quartformtable/dao/IQuartFormTableDao.java @@ -0,0 +1,13 @@ +package com.seeyon.apps.src_quartformtable.dao; + +import java.util.List; +import java.util.Map; + +public interface IQuartFormTableDao { + + public String getFormNameByFormCode(String formCode); + + public List getFormmainDataByUniqueness(String formmainName, Map uniquenessMap); + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_quartformtable/dao/impl/QuartFormTableDao.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_quartformtable/dao/impl/QuartFormTableDao.java new file mode 100644 index 0000000..3eb2df9 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_quartformtable/dao/impl/QuartFormTableDao.java @@ -0,0 +1,74 @@ +package com.seeyon.apps.src_quartformtable.dao.impl; + +import com.seeyon.apps.src_quartformtable.dao.IQuartFormTableDao; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.util.JDBCAgent; + +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Set; + +public class QuartFormTableDao implements IQuartFormTableDao { + + String getFormNameByFormCode = "select form_id,table_name,table_display from cap_form_table_info where form_id = (select id from CAP_FORM_DEFINITION where appbind_info like ?) and table_type = 'master' "; + + @Override + public String getFormNameByFormCode(String formCode) { + String formName = ""; + JDBCAgent agent = new JDBCAgent(); + try { + StringBuilder sql = new StringBuilder(getFormNameByFormCode); + List p = new ArrayList(); + String formCodeparam = "%\"formCode\":\""+formCode+"\"%"; + p.add(formCodeparam); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + if (list != null && list.size() > 0) { + Map map = list.get(0); + formName = map.get("table_name").toString(); + } + } catch (BusinessException e) { + e.printStackTrace(); + } catch (SQLException e) { + e.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return formName; + } + + + @Override + public List getFormmainDataByUniqueness(String formmainName,Map uniquenessMap) { + List ids = new ArrayList<>(); + JDBCAgent agent = new JDBCAgent(); + String param = ""; + try { + for (Map.Entry entry : uniquenessMap.entrySet()) { + param = param + " and "+entry.getKey()+" = '"+entry.getValue()+"' "; + } + StringBuilder sql = new StringBuilder("select id from "); + sql = sql.append(formmainName).append(" where 1=1 ").append(param); + List p = new ArrayList(); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + for (Map map :list){ + ids.add(map.get("id").toString()); + } + } catch (BusinessException e) { + e.printStackTrace(); + } catch (SQLException e) { + e.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return ids; + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/ReceiveFVFlowPluginApi.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/ReceiveFVFlowPluginApi.java new file mode 100644 index 0000000..bb4dd06 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/ReceiveFVFlowPluginApi.java @@ -0,0 +1,45 @@ +package com.seeyon.apps.src_receiveFVFlow; + +import com.seeyon.apps.common.plugin.api.APluginInfoApi; +import com.seeyon.apps.common.plugin.vo.ConfigVo; +import com.seeyon.apps.src_mainorganization.constans.SyncConstants; +import com.seeyon.apps.src_receiveFVFlow.constans.ReceiveFVFlowConstans; + +public class ReceiveFVFlowPluginApi extends APluginInfoApi { + public ReceiveFVFlowPluginApi() { + } + + public String getPluginId() { + System.out.println(ReceiveFVFlowConstans.getPluginId()); + return ReceiveFVFlowConstans.getPluginId(); + } + + public String getCreateUser() { + return "橙阳科技"; + } + + public String getDescription() { + return "客户服务平台数据传递管理"; + } + + public boolean syncOrg() { + return true; + } + + public ConfigVo getDefaultConfig() { + ConfigVo configVo = new ConfigVo(); + ReceiveFVFlowConstans[] var2 = ReceiveFVFlowConstans.values(); + int var3 = var2.length; + + for(int var4 = 0; var4 < var3; ++var4) { + ReceiveFVFlowConstans value = var2[var4]; + if (value != ReceiveFVFlowConstans.plugin) { + configVo.getDevParams().put(value.name(), value.getDefaultValue()); + configVo.getProdParams().put(value.name(), value.getDefaultValue()); + configVo.getParamMap().put(value.name(), value.getDescription()); + } + } + + return configVo; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/config/RfvfPluginConfigProvider.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/config/RfvfPluginConfigProvider.java new file mode 100644 index 0000000..3cbcb3e --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/config/RfvfPluginConfigProvider.java @@ -0,0 +1,17 @@ +package com.seeyon.apps.src_receiveFVFlow.config; + +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.common.plugin.vo.ConfigVo; + +import com.seeyon.apps.src_receiveFVFlow.constans.ReceiveFVFlowConstans; +import com.seeyon.ctp.common.AppContext; +import org.springframework.stereotype.Component; + +@Component +public class RfvfPluginConfigProvider { + protected ICstConfigApi cstConfigApi = (ICstConfigApi) AppContext.getBean("cstConfigApi"); + public String getBizConfigByKey(ReceiveFVFlowConstans key) { + ConfigVo config = cstConfigApi.getConfig(ReceiveFVFlowConstans.getPluginId()); + return config.getParamVal(key.name()); + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/constans/ReceiveFVFlowConstans.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/constans/ReceiveFVFlowConstans.java new file mode 100644 index 0000000..692b727 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/constans/ReceiveFVFlowConstans.java @@ -0,0 +1,32 @@ +package com.seeyon.apps.src_receiveFVFlow.constans; + +public enum ReceiveFVFlowConstans { + + + plugin("src_receiveFVFlow", "插件ID"), + formDataLoginName("shenxian","档案表创建人"), + updateAccountName("57657676","更新账号"), + updateLoginName("dev","更新登录名"), + mappingHelpTableName("maptable","映射配置辅助表"), + ; + + private String defaultValue; + private String description; + + private ReceiveFVFlowConstans(String defaultValue, String description) { + this.defaultValue = defaultValue; + this.description = description; + } + + public String getDefaultValue() { + return this.defaultValue; + } + + public String getDescription() { + return this.description; + } + + public static String getPluginId() { + return plugin.defaultValue; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/dao/IReceiveFVFlowDao.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/dao/IReceiveFVFlowDao.java new file mode 100644 index 0000000..f385fd1 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/dao/IReceiveFVFlowDao.java @@ -0,0 +1,19 @@ +package com.seeyon.apps.src_receiveFVFlow.dao; + +import java.util.Map; + +public interface IReceiveFVFlowDao { + + /** + * 根据关键字信息查询表单数据ID + * @param fromName + * @return + */ + public long getFormIdBykeyword (String fromName, Map keyWord); + + public Map getTemplateJsonByFormCode(String formCode); + + public Map getKeyWordByformmainId(String formmainid); + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/dao/impl/ReceiveFVFlowDaoImpl.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/dao/impl/ReceiveFVFlowDaoImpl.java new file mode 100644 index 0000000..e15c355 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/dao/impl/ReceiveFVFlowDaoImpl.java @@ -0,0 +1,112 @@ +package com.seeyon.apps.src_receiveFVFlow.dao.impl; + +; +import com.seeyon.apps.src_receiveFVFlow.config.RfvfPluginConfigProvider; +import com.seeyon.apps.src_receiveFVFlow.constans.ReceiveFVFlowConstans; +import com.seeyon.apps.src_receiveFVFlow.dao.IReceiveFVFlowDao; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.util.JDBCAgent; + +import java.sql.SQLException; +import java.util.*; + +public class ReceiveFVFlowDaoImpl implements IReceiveFVFlowDao { + + @Override + public long getFormIdBykeyword(String fromName, Map keyWord) { + long res = 0; + JDBCAgent agent = new JDBCAgent(); + try { + StringBuilder sql = new StringBuilder("select id from "+fromName+" where 1=1 "); + Set keys = keyWord.keySet(); + List p = new ArrayList(); + for (String key: keys) { + sql.append(" and "+key +" = ?"); + p.add(keyWord.get(key)); + } + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + if (list != null && list.size() > 0) { + Map map = list.get(0); + String id = map.get("id").toString(); + res = Long.parseLong(id); + }else{ + res = -1; + } + } catch (BusinessException e) { + e.printStackTrace(); + } catch (SQLException e) { + e.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return res; + } + + @Override + public Map getTemplateJsonByFormCode(String formCode) { + Map res = new HashMap<>(); + RfvfPluginConfigProvider configProvider = (RfvfPluginConfigProvider) AppContext.getBean("rfvfPluginConfigProvider"); + String tableName = configProvider.getBizConfigByKey(ReceiveFVFlowConstans.mappingHelpTableName); + String getTemplateJsonByFormCode = "select id,field0002,field0003,field0004,field0008 from "+ tableName + " where field0001 = ? "; + JDBCAgent agent = new JDBCAgent(); + try { + StringBuilder sql = new StringBuilder(getTemplateJsonByFormCode); + List p = new ArrayList(); + p.add(formCode); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + if (list != null && list.size() > 0) { + Map map = list.get(0); + res.put("id",map.get("id").toString()); + res.put("templateJson",map.get("field0002").toString()); + res.put("formCode",map.get("field0003").toString()); + res.put("isAddOrUpdate",map.get("field0004").toString()); + res.put("formTableNameSql",map.get("field0008").toString()); + } + } catch (BusinessException e) { + e.printStackTrace(); + } catch (SQLException e) { + e.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return res; + } + + @Override + public Map getKeyWordByformmainId(String formmainId) { + Map res = new HashMap<>(); + RfvfPluginConfigProvider configProvider = (RfvfPluginConfigProvider) AppContext.getBean("rfvfPluginConfigProvider"); + String tableName = configProvider.getBizConfigByKey(ReceiveFVFlowConstans.mappingHelpTableName); + String getKeyWordByformmainId = "select field0006,field0007 from " + tableName + " where formmain_id = ? "; + JDBCAgent agent = new JDBCAgent(); + try { + StringBuilder sql = new StringBuilder(getKeyWordByformmainId); + List p = new ArrayList(); + p.add(formmainId); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + if (list != null && list.size() > 0) { + for(int i = 0 ; i < list.size() ; i++){ + Map map = list.get(i); + res.put(map.get("field0006").toString(),map.get("field0007").toString()); + } + } + } catch (BusinessException e) { + e.printStackTrace(); + } catch (SQLException e) { + e.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return res; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/AbnormalResignationHandler.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/AbnormalResignationHandler.java new file mode 100644 index 0000000..41b2378 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/AbnormalResignationHandler.java @@ -0,0 +1,194 @@ +package com.seeyon.apps.src_receiveFVFlow.handler; + +import com.alibaba.fastjson.JSONObject; +import com.aspose.imaging.internal.Z.E; +import com.seeyon.apps.src_receiveFVFlow.indexinterface.StepTask; +import com.seeyon.apps.src_receiveFVFlow.org.OrgManagerDirectFacade; +import com.seeyon.apps.src_receiveFVFlow.util.FormColumn; +import com.seeyon.apps.src_receiveFVFlow.util.FormDataOperator; +import com.seeyon.apps.src_receiveFVFlow.util.FormUpdateField; +import com.seeyon.apps.src_receiveFVFlow.util.FormWhereCondition; +import com.seeyon.apps.src_receiveFVFlow.util.WeaverJsonUtils; +import com.seeyon.cap4.form.api.FormApi4Cap4; +import com.seeyon.cap4.form.bean.FormBean; +import com.seeyon.cap4.form.bean.FormTableBean; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.organization.bo.V3xOrgMember; +import com.seeyon.ctp.organization.bo.V3xOrgPrincipal; +import com.seeyon.ctp.organization.manager.OrgManager; +import com.seeyon.ctp.services.ServiceException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.*; + +//非正常离职 +@Component +public class AbnormalResignationHandler extends FlowDataSyncHandler implements PersonnelDocUpdateHandler,OrgMemberUpdateHandler,TalentDocUpdateHandler{ + + @Autowired + private OrgManager orgManager; + @Autowired + private OrgManagerDirectFacade orgManagerDirect; + + @Override + public boolean support(String flowName) { + return getFormCode().equals(flowName); + } + + @Override + public void process(Map source) throws Exception { + + log.info("开始同步非正常离职流程数据"); + + Map paramsMap = buildParamsMap(source); + + // 执行各步骤任务 + Map results = new LinkedHashMap<>(); + results.put("履历记录构建", runStep(() -> addLlRecord(paramsMap), "履历记录构建")); + results.put("人员档案更新", runStep(() -> updatePersonnelDoc(paramsMap), "人员档案更新")); + results.put("组织架构人员信息更新", runStep(() -> updateOrgMember(paramsMap), "组织架构人员信息更新")); + results.put("人才档案更新", runStep(() -> updateTalentDoc(paramsMap), "人才档案更新")); + + // 检查结果 + if (results.containsValue(false)) { + StringBuilder errorMsg = new StringBuilder("非正常离职流程数据同步失败:" + respJsonLineSeparatorForJson); + results.forEach((k, v) -> errorMsg.append(k).append(v ? " ✅ 成功" : " ❌ 失败").append(respJsonLineSeparatorForJson)); + throw new RuntimeException(errorMsg.toString()); + } + + log.info("非正常离职流程数据同步完成 ✅"); + } + + @Override + protected Map buildParamsMap(Map source) { + try { + Map resMap = getReceiveFVFlowDao().getTemplateJsonByFormCode(getFormCode()); + String formNo = resMap.get("formCode"); + Map templateMap = JSONObject.parseObject(resMap.get("templateJson"),Map.class); + Map displayMap = WeaverJsonUtils.getDisplayMap(source, templateMap); + displayMap.put("formNo",formNo); + return displayMap; + }catch (Exception e) { + log.error(e.getMessage(),e); + throw new RuntimeException("参数构造失败"); + } + } + + //增加履历记录 + private void addLlRecord(Map source) throws Exception { + Map mainFormData = (Map) source.get("主表数据"); + List> subFormDatas = new ArrayList<>(); + DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + String formNo = (String) source.get("formNo"); + Long dept = getLong(mainFormData.get("部门")); + Long orgLevel = getLong(mainFormData.get("职务级别")); + Long unit = getLong(mainFormData.get("单位")); + Long post = getLong(mainFormData.get("岗位")); + FormApi4Cap4 formApi4Cap4 = (FormApi4Cap4) AppContext.getBean("formApi4Cap4"); + FormBean cap4FormBean = formApi4Cap4.getFormByFormCode(formNo); + FormTableBean llBean = null; + for (FormTableBean tableBean : cap4FormBean.getSubTableBean()) { + if (tableBean.getDisplay().contains("个人履历")) { + llBean = tableBean; + break; + } + } + String dbTableName = llBean.getTableName(); + List> list = new ArrayList<>(); + Map rowData = new HashMap<>(); + rowData.put("个人履历单位", unit); + rowData.put("个人履历部门", dept); + rowData.put("个人履历岗位", post); + rowData.put("个人履历职务级别", orgLevel); + rowData.put("个人履历日期", mainFormData.get("离职日期")); + rowData.put("个人履历备注", "离职"); + list.add(rowData); + Map llTableData = new HashMap<>(); + llTableData.put(dbTableName, list); + subFormDatas.add(llTableData); + source.put("从表数据", subFormDatas); + } + + @Override + protected String getFormCode() { + return "formtable_main_110"; + } + + @Override + public void addOrgMember(Map source) { + + } + + @Override + public void updateOrgMember(Map source) throws Exception { + //先查询组织架构人员信息是否存在,若不存在则报错,存在则更新 + Map mainFormData = (Map) source.get("主表数据"); + String uid = mainFormData.get("姓名") + ""; //人员ID + V3xOrgMember member = orgManager.getMemberById(Long.parseLong(uid)); + if(member == null) { + throw new RuntimeException("组织架构人员信息不存在"); + } + member.setState(2); + member.setEnabled(false); + V3xOrgPrincipal v3xOrgPrincipal = member.getV3xOrgPrincipal(); + v3xOrgPrincipal.setLoginName(null); + member.setV3xOrgPrincipal(v3xOrgPrincipal); + member.setCode(null); + orgManagerDirect.updateMember(member); + } + + @Override + public void addPersonnelDoc(Map source) { + + } + + @Override + public void updatePersonnelDoc(Map source) throws Exception { + String formNo = (String) source.get("formNo"); + Map mainFormData = (Map) source.get("主表数据"); + mainFormData.put("员工状态","离职"); + FormDataOperator operator = new FormDataOperator(); + operator.handleEnumDeptEtc(mainFormData,formNo); + List updateFields = new ArrayList<>(); + List> subFormDatas = (List>) source.get("从表数据"); + String leaveDate = mainFormData.get("离职日期") + ""; //预计离职时间 + String employeeState = mainFormData.get("员工状态") + ""; //人员状态 + updateFields.add(FormUpdateField.build().display("员工状态").value(employeeState)); + updateFields.add(FormUpdateField.build().display("离职日期").value(leaveDate)); + List whereClause = new ArrayList<>(); + whereClause.add(FormWhereCondition.build().display("姓名").value(mainFormData.get("姓名"))); + operator.updateMasterForm(formNo,updateFields,whereClause); + Map subDataMap = subFormDatas.get(0); + String subTableName = subDataMap.keySet().iterator().next(); + List formColumns = operator.queryFormDataCondition(formNo, null, whereClause); + if(formColumns != null && formColumns.size() > 0 && subDataMap.get(subTableName) != null) { + operator.addSubTableRecord(subTableName,(List)subDataMap.get(subTableName),formNo,formColumns.get(0).getId()); + } + } + + @Override + public void addTalentDoc(Map source) throws Exception { + + } + + @Override + public void updateTalentDoc(Map source) throws Exception { + Map resMap = getReceiveFVFlowDao().getTemplateJsonByFormCode("formtable_main_132"); + String formNo = resMap.get("formCode"); + FormDataOperator formDataOperator = new FormDataOperator(); + Map mainFormData = (Map) source.get("主表数据"); + String telPhone = (String) mainFormData.get("手机号"); + Map temp = new HashMap<>(); + temp.put("人才状态","已离职"); + formDataOperator.handleEnumDeptEtc(temp,formNo); + List updateFields = new ArrayList<>(); + updateFields.add(FormUpdateField.build().display("人才状态").value(temp.get("人才状态"))); + List whereClause = new ArrayList<>(); + whereClause.add(FormWhereCondition.build().display("手机").value(telPhone)); + formDataOperator.updateMasterForm(formNo, updateFields, whereClause); + } +} \ No newline at end of file diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/AccessionApprovalHandler.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/AccessionApprovalHandler.java new file mode 100644 index 0000000..df66b0a --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/AccessionApprovalHandler.java @@ -0,0 +1,336 @@ +package com.seeyon.apps.src_receiveFVFlow.handler; + +import com.alibaba.fastjson.JSONObject; +import com.seeyon.aicloud.common.JsonUtils; +import com.seeyon.apps.src_receiveFVFlow.constans.ReceiveFVFlowConstans; +import com.seeyon.apps.src_receiveFVFlow.org.OrgManagerDirectFacade; +import com.seeyon.apps.src_receiveFVFlow.util.FileUtils; +import com.seeyon.apps.src_receiveFVFlow.util.FormColumn; +import com.seeyon.apps.src_receiveFVFlow.util.FormDataOperator; +import com.seeyon.apps.src_receiveFVFlow.util.FormExportUtil; +import com.seeyon.apps.src_receiveFVFlow.util.FormUpdateField; +import com.seeyon.apps.src_receiveFVFlow.util.FormWhereCondition; +import com.seeyon.apps.src_receiveFVFlow.util.WeaverJsonUtils; +import com.seeyon.cap4.form.api.FormApi4Cap4; +import com.seeyon.cap4.form.bean.FormBean; +import com.seeyon.cap4.form.bean.FormFieldBean; +import com.seeyon.cap4.form.bean.FormTableBean; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.organization.bo.OrganizationMessage; +import com.seeyon.ctp.organization.bo.V3xOrgMember; +import com.seeyon.ctp.organization.bo.V3xOrgPrincipal; +import com.seeyon.ctp.organization.manager.OrgManager; +import com.seeyon.ctp.services.ServiceException; +import com.seeyon.ctp.util.JDBCAgent; +import com.seeyon.v3x.services.form.bean.FormExport; +import com.seeyon.v3x.services.form.bean.ValueExport; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.*; + +//入职 注:离职再入职是修改档案表并将状态职位试用 +@Component +public class AccessionApprovalHandler extends FlowDataSyncHandler implements PersonnelDocUpdateHandler,OrgMemberUpdateHandler,TalentDocUpdateHandler{ + + @Autowired + private OrgManager orgManager; + @Autowired + private OrgManagerDirectFacade orgManagerDirect; + private String updateLoginName = configProvider.getBizConfigByKey(ReceiveFVFlowConstans.updateLoginName); + private String updateAccountName = configProvider.getBizConfigByKey(ReceiveFVFlowConstans.updateAccountName); + + @Override + public boolean support(String flowName) { + return getFormCode().equals(flowName); + } + + @Override + public void process(Map source) throws Exception { + log.info("开始同步入职流程数据"); + Map map = buildParamsMap(source); + // 执行各步骤任务 + Map results = new LinkedHashMap<>(); + results.put("履历记录构建", runStep(() -> addLlRecord(map), "履历记录构建")); + results.put("合同明细构建", runStep(() -> addContractRecord(map), "合同明细构建")); + results.put("组织架构人员信息新增", runStep(() -> addOrgMember(map), "组织架构人员信息新增")); + results.put("人员档案新增", runStep(() -> addPersonnelDoc(map), "人员档案新增")); + results.put("人才档案更新", runStep(() -> updateTalentDoc(map), "人才档案更新")); + + // 检查结果 + if (results.containsValue(false)) { + StringBuilder errorMsg = new StringBuilder("同步入职流程数据同步失败:" + respJsonLineSeparatorForJson); + results.forEach((k, v) -> errorMsg.append(k).append(v ? " ✅ 成功" : " ❌ 失败").append(respJsonLineSeparatorForJson)); + throw new RuntimeException(errorMsg.toString()); + } + + log.info("入职流程数据同步结束"); + } + + @Override + protected Map buildParamsMap(Map source) { + Map resMap = getReceiveFVFlowDao().getTemplateJsonByFormCode(getFormCode()); + Map templateMap = JSONObject.parseObject(resMap.get("templateJson"),Map.class); + Map formatMap = WeaverJsonUtils.getDisplayMap(source,templateMap); + String formNo = resMap.get("formCode"); + formatMap.put("formNo",formNo); + return formatMap; + } + + @Override + protected String getFormCode() { + return "formtable_main_115"; + } + + //增加履历记录 + private void addLlRecord(Map source) throws Exception { + Map mainFormData = (Map) source.get("主表数据"); + List> subFormDatas = (List>) source.get("从表数据"); + DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + String formNo = (String) source.get("formNo"); + Long dept = getLong(mainFormData.get("部门")); + Long orgLevel = getLong(mainFormData.get("职务级别")); + Long unit = getLong(mainFormData.get("单位")); + Long post = getLong(mainFormData.get("岗位")); + FormApi4Cap4 formApi4Cap4 = (FormApi4Cap4) AppContext.getBean("formApi4Cap4"); + + FormBean cap4FormBean = formApi4Cap4.getFormByFormCode(formNo); + FormTableBean llBean = null; + for (FormTableBean tableBean : cap4FormBean.getSubTableBean()) { + if (tableBean.getDisplay().contains("个人履历")) { + llBean = tableBean; + break; + } + } + String dbTableName = llBean.getTableName(); + List> list = new ArrayList<>(); + Map rowData = new HashMap<>(); + rowData.put("个人履历单位", unit); + rowData.put("个人履历部门", dept); + rowData.put("个人履历岗位", post); + rowData.put("个人履历职务级别", orgLevel); + rowData.put("个人履历日期", mainFormData.get("入职日期")); + rowData.put("个人履历备注", "入职"); + list.add(rowData); + Map llTableData = new HashMap<>(); + llTableData.put(dbTableName, list); + subFormDatas.add(llTableData); + + } + + private void addContractRecord(Map source) throws BusinessException { + Map mainFormData = (Map) source.get("主表数据"); + List> subFormDatas = (List>) source.get("从表数据"); + String formNo = (String) source.get("formNo"); + String contractType = (String) mainFormData.get("合同类型"); + Object contractStartTime = mainFormData.get("合同开始日期"); + Object contractEndTime = mainFormData.get("合同到期日期"); + FormApi4Cap4 formApi4Cap4 = (FormApi4Cap4) AppContext.getBean("formApi4Cap4"); + FormBean cap4FormBean = formApi4Cap4.getFormByFormCode(formNo); + FormTableBean contractMxBean = null; + for (FormTableBean tableBean : cap4FormBean.getSubTableBean()) { + if (tableBean.getDisplay().contains("合同签订明细")) { + contractMxBean = tableBean; + break; + } + } + String dbTableName = contractMxBean.getTableName(); + List> list = new ArrayList<>(); + Map rowData = new HashMap<>(); + rowData.put("合同类型明细", contractType); + rowData.put("合同开始日期明细", contractStartTime); + rowData.put("合同截止日期明细", contractEndTime); + list.add(rowData); + Map llTableData = new HashMap<>(); + llTableData.put(dbTableName, list); + subFormDatas.add(llTableData); + } + + @Override + public void addOrgMember(Map source) throws Exception { + Map mainFormData = (Map) source.get("主表数据"); + String uName = (String) mainFormData.get("姓名") ; + Long dept = getLong(mainFormData.get("部门")) ; + Long orgLevel = getLong(mainFormData.get("职务级别")); + Long unit = getLong(mainFormData.get("单位")); + Long post = getLong(mainFormData.get("岗位")); + String telNumber = (String)mainFormData.get("手机号"); + String loginAccount = (String)mainFormData.get("登录账号"); + String emNo = (String)mainFormData.get("员工编号"); + //新建OA人员对象 + V3xOrgMember member = orgManager.getMemberByLoginName(loginAccount); + if(member != null){ + mainFormData.put("姓名",member.getId()); + log.warn("该人员账号已存在 :" + uName + "_" + telNumber); + return; + } + V3xOrgMember orgMember = new V3xOrgMember(); + orgMember.setState(1); + orgMember.setOrgLevelId(orgLevel); //职务级别 + orgMember.setOrgDepartmentId(dept); + orgMember.setName(uName); + orgMember.setOrgPostId(post); + orgMember.setIdIfNew(); + orgMember.setEnabled(true); + orgMember.setTelNumber(telNumber); + orgMember.setSortId(1L); + orgMember.setCode(emNo); + orgMember.setIsValid(true); + orgMember.setOrgAccountId(unit); + V3xOrgPrincipal v3xOrgPrincipal = new V3xOrgPrincipal(); + v3xOrgPrincipal.setLoginName(loginAccount); + v3xOrgPrincipal.setMemberId(orgMember.getId()); + v3xOrgPrincipal.setPassword("dhx123456"); + orgMember.setV3xOrgPrincipal(v3xOrgPrincipal); + orgManagerDirect.addMember(orgMember); + mainFormData.put("姓名",orgMember.getId()); + } + + private V3xOrgMember getMemberByCode(String code) { + String sql = "SELECT * FROM org_member WHERE code = ?"; + try (JDBCAgent agent = new JDBCAgent()){ + agent.execute(sql,code); + List list = agent.resultSetToList(); + return list == null ? null : (V3xOrgMember) list.get(0); + }catch (Exception e) { + System.out.println(e.getMessage()); + } + return null; + } + + @Override + public void updateOrgMember(Map source) { + + } + + @Override + public void addPersonnelDoc(Map source) throws Exception { + String formCode = (String) source.get("formNo"); + Map mainFormData = (Map) source.get("主表数据"); + List> subFormDatas = (List>) source.get("从表数据"); + String loginName = getConfigProvider().getBizConfigByKey(ReceiveFVFlowConstans.formDataLoginName); + //先根据身份证号查询是否已有 + List condiitonVo = new ArrayList<>(); + condiitonVo.add(FormWhereCondition.build().display("身份证号码").value(mainFormData.get("身份证号码"))); + FormDataOperator formDataOperator = new FormDataOperator(); + Long unit = getLong(mainFormData.get("单位")); + Long dept = getLong(mainFormData.get("部门")) ; + mainFormData.put("员工状态","试用"); + mainFormData.put("服务客户",dept); + mainFormData.put("用工主体",unit); + //转换主表和从表的枚举 + formDataOperator.handleEnumDeptEtc(mainFormData,formCode); + for (Map subFormData : subFormDatas) { + formDataOperator.handleSubTableEnumDeptEtc(subFormData,formCode); + } + List formColumns = formDataOperator.queryFormDataCondition(formCode, null,condiitonVo); + if(formColumns != null && formColumns.size() > 0) { + List updateFields = new ArrayList<>(); + FormColumn formColumn = formColumns.get(0); + String formId = formColumn.getId(); + FormApi4Cap4 formApi4Cap4 = (FormApi4Cap4) AppContext.getBean("formApi4Cap4"); + FormBean cap4FormBean = formApi4Cap4.getFormByFormCode(formCode); + FormTableBean masterTableBean = cap4FormBean.getMasterTableBean(); + for (String key : mainFormData.keySet()) { + FormFieldBean beanByDisplay = masterTableBean.getFieldBeanByDisplay(key); + if(beanByDisplay == null) { + continue; + } + if(beanByDisplay.getInputType().equals("image") || beanByDisplay.getInputType().equals("attachment")) { + try { + List attachments = (List) mainFormData.get(key); + String refId = FileUtils.uploadFilesToOA(attachments, formId, updateLoginName, updateAccountName); + if(refId == null) { + continue; + } + updateFields.add(FormUpdateField.build().value(refId).display(key)); + } catch (Exception e) { + e.printStackTrace(); + log.error("写入附件信息失败,"+e.getMessage()); + } + }else { + updateFields.add(FormUpdateField.build().value(mainFormData.get(key)).display(key)); + } + } + List whereClause = new ArrayList<>(); + whereClause.add(FormWhereCondition.build().display("ID").value(Long.parseLong(formId))); + formDataOperator.updateMasterForm(formCode,updateFields,whereClause); + //追加从表数据 + Map subDataMap = subFormDatas.get(0); + String subTableName = subDataMap.keySet().iterator().next(); + if(formColumns != null) { + formDataOperator.addSubTableRecord(subTableName,(List)subDataMap.get(subTableName),formCode,formId); + } + return; + } + Map> mainFormTableAttachments = formDataOperator.getMainFormTableAttachments(formCode,mainFormData); + mainFormData.put("泛微请求ID",source.get("泛微请求ID")); + FormExport formExport = new FormExport(); + FormExportUtil formExportUtil = new FormExportUtil(); + List valueExport = formExportUtil.setFormValue(mainFormData); + formExport.setValues(valueExport); + formExport.setSubordinateForms(formExportUtil.setAllSubordinateFormValue(subFormDatas)); + getFormFactory().importBusinessFormData(loginName, formCode, + formExport, new String[] {}); + bindAttachmentInfo(mainFormTableAttachments,formCode,(String)source.get("泛微请求ID")); + } + + private void bindAttachmentInfo(Map> mainFormTableAttachments,String formNo,String requestId) { + FormDataOperator formDataOperator = new FormDataOperator(); + List condiitonVo = new ArrayList<>(); + List updateFields = new ArrayList<>(); + condiitonVo.add(FormWhereCondition.build().display("泛微请求ID").value(requestId)); + try { + List formColumns = formDataOperator.queryFormDataCondition(formNo, null, condiitonVo); + if(formColumns == null || formColumns.size() == 0 ){ + throw new RuntimeException("未查询到员工档案记录"); + } + String formId = formColumns.get(0).getId(); + for (String fieldDisplay : mainFormTableAttachments.keySet()) { + List attachments = mainFormTableAttachments.get(fieldDisplay); + if(attachments == null || attachments.size() == 0) { + continue; + } + String refId = FileUtils.uploadFilesToOA(attachments,formId,updateLoginName,updateAccountName); + if(refId == null) { + continue; + } + updateFields.add(FormUpdateField.build().value(refId).display(fieldDisplay)); + } + List whereClause = new ArrayList<>(); + whereClause.add(FormWhereCondition.build().display("ID").value(Long.parseLong(formId))); + formDataOperator.updateMasterForm(formNo,updateFields,whereClause); + } catch (Exception e) { + log.error(e.getMessage(),e); + } + } + + @Override + public void updatePersonnelDoc(Map source) { + + } + + @Override + public void addTalentDoc(Map source) throws Exception { + } + + @Override + public void updateTalentDoc(Map source) throws Exception { + Map resMap = getReceiveFVFlowDao().getTemplateJsonByFormCode("formtable_main_132"); + String formNo = resMap.get("formCode"); + Map mainFormData = (Map) source.get("主表数据"); + FormDataOperator formDataOperator = new FormDataOperator(); + Map temp = new HashMap<>(); + temp.put("人才状态","已入职"); + formDataOperator.handleEnumDeptEtc(temp,formNo); + List updateFields = new ArrayList<>(); + updateFields.add(FormUpdateField.build().display("人才状态").value(temp.get("人才状态"))); + updateFields.add(FormUpdateField.build().value(mainFormData.get("入职日期")).display("入职日期")); + List whereClause = new ArrayList<>(); + whereClause.add(FormWhereCondition.build().display("应聘编号").value(mainFormData.get("人才库编号"))); + formDataOperator.updateMasterForm(formNo, updateFields, whereClause); + } +} \ No newline at end of file diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/AccountCloseHandler.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/AccountCloseHandler.java new file mode 100644 index 0000000..7bc3e25 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/AccountCloseHandler.java @@ -0,0 +1,112 @@ +package com.seeyon.apps.src_receiveFVFlow.handler; + +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.src_receiveFVFlow.util.FormColumn; +import com.seeyon.apps.src_receiveFVFlow.util.FormDataOperator; +import com.seeyon.apps.src_receiveFVFlow.util.FormUpdateField; +import com.seeyon.apps.src_receiveFVFlow.util.FormWhereCondition; +import com.seeyon.apps.src_receiveFVFlow.util.WeaverJsonUtils; +import com.seeyon.cap4.form.api.FormApi4Cap4; +import com.seeyon.cap4.form.bean.FormBean; +import com.seeyon.cap4.form.bean.FormTableBean; +import com.seeyon.ctp.common.AppContext; +import org.springframework.stereotype.Component; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.*; + +@Component +public class AccountCloseHandler extends FlowDataSyncHandler implements PersonnelDocUpdateHandler{ + + @Override + public void addPersonnelDoc(Map source) throws Exception { + + } + + @Override + public void updatePersonnelDoc(Map source) throws Exception { + String formCode = (String) source.get("formNo"); + Map mainFormData = (Map) source.get("主表数据"); + List> subFormDatas = (List>) source.get("从表数据"); + mainFormData.put("员工状态","离职"); + addLlRecord(source); + FormDataOperator formDataOperator = new FormDataOperator(); + formDataOperator.handleEnumDeptEtc(mainFormData,formCode); + List updateFields = new ArrayList<>(); + List conditions = new ArrayList<>(); + updateFields.add(FormUpdateField.build().display("员工状态").value(mainFormData.get("员工状态"))); + conditions.add(FormWhereCondition.build().display("身份证号码").value(mainFormData.get("身份证号码"))); + formDataOperator.updateMasterForm(formCode,updateFields,conditions); + List formColumns = formDataOperator.queryFormDataCondition(formCode, null, conditions); + Map subDataMap = subFormDatas.get(0); + String subTableName = subDataMap.keySet().iterator().next(); + if(formColumns != null && formColumns.size() > 0) { + String formId = formColumns.get(0).getId(); + formDataOperator.addSubTableRecord(subTableName, (List) subDataMap.get(subTableName),formCode,formId); + } + } + + @Override + public boolean support(String flowName) { + return getFormCode().equals(flowName); + } + + @Override + public void process(Map source) throws Exception { + log.info("账号关闭流程数据同步开始"); + Map map = buildParamsMap(source); + Map results = new LinkedHashMap<>(); + results.put("履历记录构建", runStep(() -> addLlRecord(map), "履历记录构建")); + results.put("人员档案更新", runStep(() -> updatePersonnelDoc(map), "人员档案更新")); + + // 检查结果 + if (results.containsValue(false)) { + StringBuilder errorMsg = new StringBuilder("账号关闭流程数据同步失败:" + respJsonLineSeparatorForJson); + results.forEach((k, v) -> errorMsg.append(k).append(v ? " ✅ 成功" : " ❌ 失败").append(respJsonLineSeparatorForJson)); + throw new RuntimeException(errorMsg.toString()); + } + log.info("账号关闭流程数据同步结束"); + } + + //增加履历记录 + private void addLlRecord(Map source) throws Exception { + Map mainFormData = (Map) source.get("主表数据"); + List> subFormDatas = (List>) source.get("从表数据"); + DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + String formNo = (String) source.get("formNo"); + FormApi4Cap4 formApi4Cap4 = (FormApi4Cap4) AppContext.getBean("formApi4Cap4"); + FormBean cap4FormBean = formApi4Cap4.getFormByFormCode(formNo); + FormTableBean llBean = null; + for (FormTableBean tableBean : cap4FormBean.getSubTableBean()) { + if (tableBean.getDisplay().contains("个人履历")) { + llBean = tableBean; + break; + } + } + String dbTableName = llBean.getTableName(); + List> list = new ArrayList<>(); + Map rowData = new HashMap<>(); + rowData.put("个人履历日期", mainFormData.get("离职日期")); + rowData.put("个人履历备注", "业代账号关闭"); + list.add(rowData); + Map llTableData = new HashMap<>(); + llTableData.put(dbTableName, list); + subFormDatas.add(llTableData); + } + + @Override + protected Map buildParamsMap(Map source){ + Map resMap = getReceiveFVFlowDao().getTemplateJsonByFormCode(getFormCode()); + Map templateMap = JSONObject.parseObject(resMap.get("templateJson"),Map.class); + Map formatMap = WeaverJsonUtils.getDisplayMap(source,templateMap); + String formNo = resMap.get("formCode"); + formatMap.put("formNo",formNo); + return formatMap; + } + + @Override + protected String getFormCode() { + return "formtable_main_154"; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/AccountOpenHandler.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/AccountOpenHandler.java new file mode 100644 index 0000000..cfe38fb --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/AccountOpenHandler.java @@ -0,0 +1,159 @@ +package com.seeyon.apps.src_receiveFVFlow.handler; + +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.src_receiveFVFlow.constans.ReceiveFVFlowConstans; +import com.seeyon.apps.src_receiveFVFlow.util.*; +import com.seeyon.cap4.form.api.FormApi4Cap4; +import com.seeyon.cap4.form.bean.FormBean; +import com.seeyon.cap4.form.bean.FormFieldBean; +import com.seeyon.cap4.form.bean.FormTableBean; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.services.ServiceException; +import com.seeyon.v3x.services.form.bean.FormExport; +import com.seeyon.v3x.services.form.bean.ValueExport; +import org.springframework.stereotype.Component; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.*; + +@Component +public class AccountOpenHandler extends FlowDataSyncHandler implements PersonnelDocUpdateHandler{ + + private String updateLoginName = configProvider.getBizConfigByKey(ReceiveFVFlowConstans.updateLoginName); + private String updateAccountName = configProvider.getBizConfigByKey(ReceiveFVFlowConstans.updateAccountName); + + @Override + public void addPersonnelDoc(Map source) throws Exception { + String formCode = (String) source.get("formNo"); + Map mainFormData = (Map) source.get("主表数据"); + List> subFormDatas = (List>) source.get("从表数据"); + FormDataOperator formDataOperator = new FormDataOperator(); + String loginName = getConfigProvider().getBizConfigByKey(ReceiveFVFlowConstans.formDataLoginName); + mainFormData.put("员工状态","在职"); + formDataOperator.handleEnumDeptEtc(mainFormData,formCode); + List condiitonVo = new ArrayList<>(); + condiitonVo.add(FormWhereCondition.build().display("身份证号码").value(mainFormData.get("法人身份证号"))); + List formColumns = formDataOperator.queryFormDataCondition(formCode, null,condiitonVo); + if(formColumns != null && formColumns.size() > 0) { + List updateFields = new ArrayList<>(); + FormColumn formColumn = formColumns.get(0); + String formId = formColumn.getId(); + FormApi4Cap4 formApi4Cap4 = (FormApi4Cap4) AppContext.getBean("formApi4Cap4"); + FormBean cap4FormBean = formApi4Cap4.getFormByFormCode(formCode); + FormTableBean masterTableBean = cap4FormBean.getMasterTableBean(); + for (String key : mainFormData.keySet()) { + FormFieldBean beanByDisplay = masterTableBean.getFieldBeanByDisplay(key); + if(beanByDisplay == null) { + continue; + } + if(beanByDisplay.getInputType().equals("image") || beanByDisplay.getInputType().equals("attachment")) { + try { + List attachments = (List) mainFormData.get(key); + if(attachments == null || attachments.size() == 0) { + continue; + } + String refId = FileUtils.uploadFilesToOA(attachments, formId, updateLoginName, updateAccountName); + if(refId == null) { + continue; + } + updateFields.add(FormUpdateField.build().value(refId).display(key)); + } catch (Exception e) { + e.printStackTrace(); + log.error("写入附件信息失败,"+e.getMessage()); + } + }else { + updateFields.add(FormUpdateField.build().value(mainFormData.get(key)).display(key)); + } + } + List whereClause = new ArrayList<>(); + whereClause.add(FormWhereCondition.build().display("ID").value(Long.parseLong(formId))); + formDataOperator.updateMasterForm(formCode,updateFields,whereClause); + //追加从表数据 + Map subDataMap = subFormDatas.get(0); + String subTableName = subDataMap.keySet().iterator().next(); + if(formColumns != null) { + formDataOperator.addSubTableRecord(subTableName,(List)subDataMap.get(subTableName),formCode,formId); + } + }else { + FormExport formExport = new FormExport(); + FormExportUtil formExportUtil = new FormExportUtil(); + List valueExport = formExportUtil.setFormValue(mainFormData); + formExport.setValues(valueExport); + formExport.setSubordinateForms(formExportUtil.setAllSubordinateFormValue(subFormDatas)); + getFormFactory().importBusinessFormData(loginName, formCode, + formExport, new String[] {}); + } + } + + + //增加履历记录 + private void addLlRecord(Map source) throws BusinessException { + Map mainFormData = (Map) source.get("主表数据"); + List> subFormDatas = (List>) source.get("从表数据"); + DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + String formNo = (String) source.get("formNo"); + FormApi4Cap4 formApi4Cap4 = (FormApi4Cap4) AppContext.getBean("formApi4Cap4"); + FormBean cap4FormBean = formApi4Cap4.getFormByFormCode(formNo); + FormTableBean llBean = null; + for (FormTableBean tableBean : cap4FormBean.getSubTableBean()) { + if (tableBean.getDisplay().contains("个人履历")) { + llBean = tableBean; + break; + } + } + String dbTableName = llBean.getTableName(); + List> list = new ArrayList<>(); + Map rowData = new HashMap<>(); + rowData.put("个人履历日期", mainFormData.get("入职日期")); + rowData.put("个人履历备注", "业代账号开通"); + list.add(rowData); + Map llTableData = new HashMap<>(); + llTableData.put(dbTableName, list); + subFormDatas.add(llTableData); + + } + + @Override + public void updatePersonnelDoc(Map source) throws Exception { + + + } + + @Override + public boolean support(String flowName) { + return getFormCode().equals(flowName); + } + + @Override + public void process(Map source) throws Exception { + log.info("账号开通流程数据同步结束"); + Map map = buildParamsMap(source); + Map results = new LinkedHashMap<>(); + results.put("履历记录构建", runStep(() -> addLlRecord(map), "履历记录构建")); + results.put("人员档案新增", runStep(() -> addPersonnelDoc(map), "人员档案新增")); + // 检查结果 + if (results.containsValue(false)) { + StringBuilder errorMsg = new StringBuilder("账号开通流程数据同步失败:" + respJsonLineSeparatorForJson); + results.forEach((k, v) -> errorMsg.append(k).append(v ? " ✅ 成功" : " ❌ 失败").append(respJsonLineSeparatorForJson)); + throw new RuntimeException(errorMsg.toString()); + } + log.info("账号开通流程数据同步结束"); + } + + @Override + protected Map buildParamsMap(Map source){ + Map resMap = getReceiveFVFlowDao().getTemplateJsonByFormCode(getFormCode()); + Map templateMap = JSONObject.parseObject(resMap.get("templateJson"),Map.class); + Map formatMap = WeaverJsonUtils.getDisplayMap(source,templateMap); + String formNo = resMap.get("formCode"); + formatMap.put("formNo",formNo); + return formatMap; + } + + @Override + protected String getFormCode() { + return "formtable_main_129"; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/ApplicationRegistrationHandler.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/ApplicationRegistrationHandler.java new file mode 100644 index 0000000..15475f1 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/ApplicationRegistrationHandler.java @@ -0,0 +1,122 @@ +package com.seeyon.apps.src_receiveFVFlow.handler; + + +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.src_receiveFVFlow.constans.ReceiveFVFlowConstans; +import com.seeyon.apps.src_receiveFVFlow.util.FileUtils; +import com.seeyon.apps.src_receiveFVFlow.util.FormColumn; +import com.seeyon.apps.src_receiveFVFlow.util.FormDataOperator; +import com.seeyon.apps.src_receiveFVFlow.util.FormExportUtil; +import com.seeyon.apps.src_receiveFVFlow.util.FormUpdateField; +import com.seeyon.apps.src_receiveFVFlow.util.FormWhereCondition; +import com.seeyon.apps.src_receiveFVFlow.util.WeaverJsonUtils; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.services.ServiceException; +import com.seeyon.v3x.services.form.bean.FormExport; +import com.seeyon.v3x.services.form.bean.ValueExport; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +//应聘登记审批结束新增人才库档案 +@Component +public class ApplicationRegistrationHandler extends FlowDataSyncHandler implements TalentDocUpdateHandler{ + + @Override + public boolean support(String flowName) { + return getFormCode().equals(flowName); + } + + @Override + public void process(Map source) throws Exception { + log.info("应聘登记审批流程数据同步结束"); + Map map = buildParamsMap(source); + Map results = new LinkedHashMap<>(); + results.put("人才档案新增", runStep(() -> addTalentDoc(map), "人才档案新增")); + // 检查结果 + if (results.containsValue(false)) { + StringBuilder errorMsg = new StringBuilder("应聘登记审批流程数据同步失败:" + respJsonLineSeparatorForJson); + results.forEach((k, v) -> errorMsg.append(k).append(v ? " ✅ 成功" : " ❌ 失败").append(respJsonLineSeparatorForJson)); + throw new RuntimeException(errorMsg.toString()); + } + log.info("应聘登记审批流程数据同步结束"); + } + + @Override + protected Map buildParamsMap(Map source) { + Map resMap = getReceiveFVFlowDao().getTemplateJsonByFormCode(getFormCode()); + String formNo = resMap.get("formCode"); + Map templateMap = JSONObject.parseObject(resMap.get("templateJson"),Map.class); + Map displayMap = WeaverJsonUtils.getDisplayMap(source, templateMap); + displayMap.put("formNo",formNo); + return displayMap; + } + + private void bindAttachmentInfo(Map> mainFormTableAttachments,String formNo,String requestId) { + FormDataOperator formDataOperator = new FormDataOperator(); + List condiitonVo = new ArrayList<>(); + List updateFields = new ArrayList<>(); + String updateLoginName = configProvider.getBizConfigByKey(ReceiveFVFlowConstans.updateLoginName); + String updateAccountName = configProvider.getBizConfigByKey(ReceiveFVFlowConstans.updateAccountName); + condiitonVo.add(FormWhereCondition.build().display("泛微请求ID").value(requestId)); + try { + List formColumns = formDataOperator.queryFormDataCondition(formNo, null, condiitonVo); + if(formColumns == null || formColumns.size() == 0 ){ + throw new RuntimeException("未查询到人才档案记录"); + } + String formId = formColumns.get(0).getId(); + for (String fieldDisplay : mainFormTableAttachments.keySet()) { + List attachments = mainFormTableAttachments.get(fieldDisplay); + if(attachments == null || attachments.size() == 0) { + continue; + } + String refId = FileUtils.uploadFilesToOA(attachments,formId,updateLoginName,updateAccountName); + if(refId == null) { + continue; + } + updateFields.add(FormUpdateField.build().value(refId).display(fieldDisplay)); + } + List whereClause = new ArrayList<>(); + whereClause.add(FormWhereCondition.build().display("ID").value(Long.parseLong(formId))); + formDataOperator.updateMasterForm(formNo,updateFields,whereClause); + } catch (Exception e) { + log.error("写入附件信息失败,"+e.getMessage(),e); + } + } + + @Override + public void addTalentDoc(Map source) throws Exception { + Map mainFormData = (Map) source.get("主表数据"); + List> subFormDatas = (List>) source.get("从表数据"); + String formNo = (String) source.get("formNo"); + String loginName = getConfigProvider().getBizConfigByKey(ReceiveFVFlowConstans.formDataLoginName); + FormDataOperator formDataOperator = new FormDataOperator(); + Map> mainFormTableAttachments = formDataOperator.getMainFormTableAttachments(formNo,mainFormData); + mainFormData.put("人才状态","未面试"); + mainFormData.put("泛微请求ID",source.get("泛微请求ID")); + formDataOperator.handleEnumDeptEtc(mainFormData,formNo); + for (Map subFormData : subFormDatas) { + formDataOperator.handleSubTableEnumDeptEtc(subFormData,formNo); + } + FormExport formExport = new FormExport(); + FormExportUtil formExportUtil = new FormExportUtil(); + List valueExport = formExportUtil.setFormValue(mainFormData); + formExport.setValues(valueExport); + formExport.setSubordinateForms(formExportUtil.setAllSubordinateFormValue(subFormDatas)); + getFormFactory().importBusinessFormData(loginName,formNo , + formExport, new String[] {}); + bindAttachmentInfo(mainFormTableAttachments,formNo,(String)source.get("泛微请求ID")); + } + + @Override + public void updateTalentDoc(Map source) { + + } + + protected String getFormCode() { + return "formtable_main_132"; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/BatchCloseDeptHandler.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/BatchCloseDeptHandler.java new file mode 100644 index 0000000..5ae2d2e --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/BatchCloseDeptHandler.java @@ -0,0 +1,66 @@ +package com.seeyon.apps.src_receiveFVFlow.handler; + +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.src_receiveFVFlow.util.WeaverJsonUtils; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.organization.bo.OrganizationMessage; +import com.seeyon.ctp.organization.bo.V3xOrgDepartment; +import com.seeyon.ctp.organization.bo.V3xOrgMember; +import com.seeyon.ctp.organization.manager.OrgManager; +import com.seeyon.ctp.organization.manager.OrgManagerDirect; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Collections; +import java.util.List; +import java.util.Map; + +@Component +public class BatchCloseDeptHandler extends FlowDataSyncHandler{ + + @Autowired + private OrgManager orgManager; + @Autowired + private OrgManagerDirect orgManagerDirect; + + @Override + public boolean support(String flowName) { + return getFormCode().equals(flowName); + } + + @Override + public void process(Map source) throws Exception { + //批量将部门置为不可用,存在下级部门或部门中还有人员则不可关闭 + Map map = buildParamsMap(source); + List> subFormDatas = (List>) map.get("从表数据"); + List> deptInfoList = (List>) subFormDatas.get(0).get("subTable1"); + for (Map rowMap : deptInfoList) { + String dept = (String) rowMap.get("部门"); + List members = orgManager.getMembersByDepartment(Long.valueOf(dept), true); + if((members != null && members.size() > 0) || (orgManager.hasChildren(Long.valueOf(dept),true))){ + throw new BusinessException("部门中还有人员或存在下级部门,无法关闭"); + } + V3xOrgDepartment department = orgManager.getDepartmentById(Long.valueOf(dept)); + department.setEnabled(false); + OrganizationMessage organizationMessage = orgManagerDirect.updateDepartment(department); + if(!organizationMessage.isSuccess()) { + throw new BusinessException("部门关闭失败"); + } + } + } + + @Override + protected Map buildParamsMap(Map source) { + Map resMap = getReceiveFVFlowDao().getTemplateJsonByFormCode(getFormCode()); + Map templateMap = JSONObject.parseObject(resMap.get("templateJson"),Map.class); + Map formatMap = WeaverJsonUtils.getDisplayMap(source,templateMap); + String formNo = resMap.get("formCode"); + formatMap.put("formNo",formNo); + return formatMap; + } + + @Override + protected String getFormCode() { + return "formtable_main_167"; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/BatchCreateDeptHandler.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/BatchCreateDeptHandler.java new file mode 100644 index 0000000..c69dadc --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/BatchCreateDeptHandler.java @@ -0,0 +1,65 @@ +package com.seeyon.apps.src_receiveFVFlow.handler; + +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.src_receiveFVFlow.org.OrgManagerDirectFacade; +import com.seeyon.apps.src_receiveFVFlow.util.WeaverJsonUtils; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.organization.bo.V3xOrgDepartment; +import com.seeyon.ctp.organization.manager.OrgManager; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Map; + +@Component +public class BatchCreateDeptHandler extends FlowDataSyncHandler{ + + @Autowired + private OrgManager orgManager; + @Autowired + private OrgManagerDirectFacade orgManagerDirect; + @Override + public boolean support(String flowName) { + return getFormCode().equals(flowName); + } + + @Override + public void process(Map source) throws Exception { + //批量增加就是新增部门如果选了上级部门就新建在该部门下,如果没选就建在分部下 + Map map = buildParamsMap(source); + List> subFormDatas = (List>) map.get("从表数据"); + List> deptInfoList = (List>) subFormDatas.get(0).get("subTable1"); + for (Map rowMap : deptInfoList) { + String deptName = (String) rowMap.get("部门"); + String unit = (String) rowMap.get("所属单位"); + String parentDept = (String) rowMap.get("上级部门"); + String isLevelOne = (String) rowMap.get("是否一级部门"); + V3xOrgDepartment department = new V3xOrgDepartment(); + department.setName(deptName); + department.setEnabled(true); + department.setOrgAccountId(Long.valueOf(unit)); + if(!"是".equals(isLevelOne)) { + department.setSuperior(Long.valueOf(parentDept)); + }else { + department.setSuperior(Long.valueOf(unit)); + } + orgManagerDirect.addDepartment(department); + } + } + + @Override + protected Map buildParamsMap(Map source) { + Map resMap = getReceiveFVFlowDao().getTemplateJsonByFormCode(getFormCode()); + Map templateMap = JSONObject.parseObject(resMap.get("templateJson"),Map.class); + Map formatMap = WeaverJsonUtils.getDisplayMap(source,templateMap); + String formNo = resMap.get("formCode"); + formatMap.put("formNo",formNo); + return formatMap; + } + + @Override + protected String getFormCode() { + return "formtable_main_166"; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/BatchDeptTransferHandler.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/BatchDeptTransferHandler.java new file mode 100644 index 0000000..6cea1d7 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/BatchDeptTransferHandler.java @@ -0,0 +1,66 @@ +package com.seeyon.apps.src_receiveFVFlow.handler; + +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.src_mainorganization.bo.ReceiveOrgMemberResponse; +import com.seeyon.apps.src_mainorganization.service.IReceiveOrgDepartmentService; +import com.seeyon.apps.src_receiveFVFlow.util.WeaverJsonUtils; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.organization.manager.OrgManager; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Map; + +@Component +public class BatchDeptTransferHandler extends FlowDataSyncHandler{ + + @Autowired + private OrgManager orgManager; + @Autowired + private IReceiveOrgDepartmentService iReceiveOrgDepartmentService; + @Override + public boolean support(String flowName) { + return getFormCode().equals(flowName); + } + + @Override + public void process(Map source) throws Exception { + Map map = buildParamsMap(source); + Map mainFormData = (Map) map.get("主表数据"); + List> subFormDatas = (List>) map.get("从表数据"); + List> deptInfoList = (List>) subFormDatas.get(0).get("subTable1"); + for (Map rowMap : deptInfoList) { + JSONObject params = new JSONObject(); + String isLevelOneDept = (String) rowMap.get("是否一级部门"); + if("是".equals(isLevelOneDept)){ + params.put("id", rowMap.get("调动部门")); + params.put("orgAccountId",mainFormData.get("单位")); + params.put("superior",mainFormData.get("单位")); + }else { + params.put("id", rowMap.get("调动部门")); + params.put("orgAccountId",mainFormData.get("单位")); + params.put("superior",rowMap.get("调动后上级部门")); + } + ReceiveOrgMemberResponse receiveOrgMemberResponse = iReceiveOrgDepartmentService.updateDepartmentSpanAccount(params); + if(!receiveOrgMemberResponse.isSuccess()) { + throw new BusinessException("部门:" + rowMap.get("调动部门") + "调动失败," + receiveOrgMemberResponse.getMsg()); + } + } + } + + @Override + protected Map buildParamsMap(Map source){ + Map resMap = getReceiveFVFlowDao().getTemplateJsonByFormCode(getFormCode()); + Map templateMap = JSONObject.parseObject(resMap.get("templateJson"),Map.class); + Map formatMap = WeaverJsonUtils.getDisplayMap(source,templateMap); + String formNo = resMap.get("formCode"); + formatMap.put("formNo",formNo); + return formatMap; + } + + @Override + protected String getFormCode() { + return "formtable_main_169"; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/ChangePersonInfoHandler.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/ChangePersonInfoHandler.java new file mode 100644 index 0000000..c8bcb2a --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/ChangePersonInfoHandler.java @@ -0,0 +1,159 @@ +package com.seeyon.apps.src_receiveFVFlow.handler; + +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.src_receiveFVFlow.constans.ReceiveFVFlowConstans; +import com.seeyon.apps.src_receiveFVFlow.org.OrgManagerDirectFacade; +import com.seeyon.apps.src_receiveFVFlow.util.FileUtils; +import com.seeyon.apps.src_receiveFVFlow.util.FormColumn; +import com.seeyon.apps.src_receiveFVFlow.util.FormDataOperator; +import com.seeyon.apps.src_receiveFVFlow.util.FormFieldType; +import com.seeyon.apps.src_receiveFVFlow.util.FormUpdateField; +import com.seeyon.apps.src_receiveFVFlow.util.FormWhereCondition; +import com.seeyon.apps.src_receiveFVFlow.util.WeaverJsonUtils; +import com.seeyon.cap4.form.api.FormApi4Cap4; +import com.seeyon.cap4.form.bean.FormBean; +import com.seeyon.cap4.form.bean.FormFieldBean; +import com.seeyon.cap4.form.bean.FormTableBean; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.organization.bo.V3xOrgMember; +import com.seeyon.ctp.organization.bo.V3xOrgPrincipal; +import com.seeyon.ctp.organization.manager.OrgManager; +import com.seeyon.ctp.services.ServiceException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +@Component +public class ChangePersonInfoHandler extends FlowDataSyncHandler implements PersonnelDocUpdateHandler,OrgMemberUpdateHandler{ + + @Autowired + private OrgManager orgManager; + @Autowired + private OrgManagerDirectFacade orgManagerDirect; + + @Override + public boolean support(String flowName) { + return getFormCode().equals(flowName); + } + + @Override + public void process(Map source) throws Exception { + log.info("个人信息变更流程数据同步开始"); + Map map = buildParamsMap(source); + Map results = new LinkedHashMap<>(); + results.put("组织人员信息更新", runStep(() -> updateOrgMember(map), "组织人员信息更新")); + results.put("人员档案更新", runStep(() -> updatePersonnelDoc(map), "人员档案更新")); + // 检查结果 + if (results.containsValue(false)) { + StringBuilder errorMsg = new StringBuilder("个人信息变更流程数据同步失败:" + respJsonLineSeparatorForJson); + results.forEach((k, v) -> errorMsg.append(k).append(v ? " ✅ 成功" : " ❌ 失败").append(respJsonLineSeparatorForJson)); + throw new RuntimeException(errorMsg.toString()); + } + log.info("个人信息变更流程数据同步结束"); + } + + @Override + protected Map buildParamsMap(Map source) { + Map resMap = getReceiveFVFlowDao().getTemplateJsonByFormCode(getFormCode()); + Map templateMap = JSONObject.parseObject(resMap.get("templateJson"),Map.class); + Map formatMap = WeaverJsonUtils.getDisplayMap(source,templateMap); + String formNo = resMap.get("formCode"); + formatMap.put("formNo",formNo); + return formatMap; + } + + @Override + protected String getFormCode() { + return "formtable_main_131"; + } + + @Override + public void addPersonnelDoc(Map source) throws ServiceException, BusinessException { + + } + + @Override + public void updatePersonnelDoc(Map source) throws Exception { + String formCode = (String) source.get("formNo"); + Map mainFormData = (Map) source.get("主表数据"); + FormDataOperator formDataOperator = new FormDataOperator(); + formDataOperator.handleEnumDeptEtc(mainFormData,formCode); + List whereClause = new ArrayList<>(); + Long memberId = getLong(mainFormData.get("姓名")); + if(memberId == null) { + throw new RuntimeException("人员ID为空"); + } + String updateLoginName = configProvider.getBizConfigByKey(ReceiveFVFlowConstans.updateLoginName); + String updateAccountName = configProvider.getBizConfigByKey(ReceiveFVFlowConstans.updateAccountName); + List conditionVo = new ArrayList<>(); + conditionVo.add(FormWhereCondition.build().display("姓名").value(memberId)); + List formColumns = formDataOperator.queryFormDataCondition(formCode, null, conditionVo); + if(formColumns == null || formColumns.size() == 0) { + throw new RuntimeException("人员档案信息不存在"); + } + String formId = formColumns.get(0).getId(); + whereClause.add(FormWhereCondition.build().display("ID").value(formId)); + mainFormData.remove("姓名"); + FormApi4Cap4 formApi4Cap4 = (FormApi4Cap4) AppContext.getBean("formApi4Cap4"); + FormBean cap4FormBean = formApi4Cap4.getFormByFormCode(formCode); + FormTableBean masterTableBean = cap4FormBean.getMasterTableBean(); + List updateFields = new ArrayList<>(); + for (String key : mainFormData.keySet()) { + FormFieldBean beanByDisplay = masterTableBean.getFieldBeanByDisplay(key); + if(beanByDisplay == null) {continue;} + if(beanByDisplay.getInputType().equals("image") || beanByDisplay.getInputType().equals("attachment")) { + List attachments = (List) mainFormData.get(key); + try { + String refId = FileUtils.uploadFilesToOA(attachments, formId, updateLoginName, updateAccountName); + if(refId == null) { + continue; + } + updateFields.add(FormUpdateField.build().value(refId).display(key)); + } catch (Exception e) { + log.error("写入附件信息失败,"+e.getMessage(),e); + } + }else { + updateFields.add(FormUpdateField.build().value(mainFormData.get(key)).display(key)); + } + } + formDataOperator.updateMasterForm(formCode,updateFields,whereClause); + } + + @Override + public void addOrgMember(Map source) throws BusinessException { + + } + + @Override + public void updateOrgMember(Map source) throws Exception { + Map mainFormData = (Map) source.get("主表数据"); + String mobile = (String)mainFormData.get("手机号"); + Long memberId = getLong(mainFormData.get("姓名")); + String xmText = (String)mainFormData.get("姓名文本"); + if(memberId == null) { + throw new BusinessException("姓名为空"); + } + //先判断登录名是否已存在,若存在则启用 + V3xOrgMember existMember = orgManager.getMemberById(memberId); + if(existMember == null) { + throw new RuntimeException("组织人员信息不存在"); + } + if(mobile != null && !mobile.equals(existMember.getTelNumber())) { + V3xOrgMember member = orgManager.getMemberByLoginName(mobile); + if(member != null) { + throw new BusinessException("该手机号已绑定账号"); + } + V3xOrgPrincipal v3xOrgPrincipal = existMember.getV3xOrgPrincipal(); + v3xOrgPrincipal.setLoginName(mobile); + existMember.setV3xOrgPrincipal(v3xOrgPrincipal); + existMember.setTelNumber(mobile); + } + existMember.setName(xmText); + orgManagerDirect.updateMember(existMember); + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/CusAccountAssignHandler.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/CusAccountAssignHandler.java new file mode 100644 index 0000000..15bb09a --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/CusAccountAssignHandler.java @@ -0,0 +1,232 @@ +package com.seeyon.apps.src_receiveFVFlow.handler; + +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.src_receiveFVFlow.constans.ReceiveFVFlowConstans; +import com.seeyon.apps.src_receiveFVFlow.org.OrgManagerDirectFacade; +import com.seeyon.apps.src_receiveFVFlow.util.*; +import com.seeyon.cap4.form.api.FormApi4Cap4; +import com.seeyon.cap4.form.bean.FormBean; +import com.seeyon.cap4.form.bean.FormFieldBean; +import com.seeyon.cap4.form.bean.FormTableBean; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.organization.bo.V3xOrgMember; +import com.seeyon.ctp.organization.bo.V3xOrgPrincipal; +import com.seeyon.ctp.organization.manager.OrgManager; +import com.seeyon.ctp.services.ServiceException; +import com.seeyon.v3x.services.form.bean.FormExport; +import com.seeyon.v3x.services.form.bean.ValueExport; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.*; + +//客户账号分配 +@Component +public class CusAccountAssignHandler extends FlowDataSyncHandler implements OrgMemberUpdateHandler,PersonnelDocUpdateHandler{ + + private String updateLoginName = configProvider.getBizConfigByKey(ReceiveFVFlowConstans.updateLoginName); + private String updateAccountName = configProvider.getBizConfigByKey(ReceiveFVFlowConstans.updateAccountName); + + @Autowired + private OrgManagerDirectFacade orgManagerDirect; + @Autowired + private OrgManager orgManager; + @Override + public boolean support(String flowName) { + return getFormCode().equals(flowName); + } + + @Override + public void process(Map source) throws Exception { + log.info("客户账号分配流程数据同步开始"); + //组织架构下部门增加账号 + Map map = buildParamsMap(source); + Map results = new LinkedHashMap<>(); + results.put("组织人员信息新增", runStep(() -> addOrgMember(map), "组织人员信息新增")); + results.put("人员档案新增", runStep(() -> addPersonnelDoc(map), "人员档案新增")); + // 检查结果 + if (results.containsValue(false)) { + StringBuilder errorMsg = new StringBuilder("客户账号分配流程数据同步失败:" + respJsonLineSeparatorForJson); + results.forEach((k, v) -> errorMsg.append(k).append(v ? " ✅ 成功" : " ❌ 失败").append(respJsonLineSeparatorForJson)); + throw new RuntimeException(errorMsg.toString()); + } + log.info("客户账号分配流程数据同步结束"); + } + + @Override + protected Map buildParamsMap(Map source) { + Map resMap = getReceiveFVFlowDao().getTemplateJsonByFormCode(getFormCode()); + Map templateMap = JSONObject.parseObject(resMap.get("templateJson"),Map.class); + Map formatMap = WeaverJsonUtils.getDisplayMap(source,templateMap); + String formNo = resMap.get("formCode"); + formatMap.put("formNo",formNo); + return formatMap; + } + + @Override + protected String getFormCode() { + return "formtable_main_152"; + } + + @Override + public void addOrgMember(Map source) throws Exception { + Map mainFormData = (Map) source.get("主表数据"); + String loginName = (String) mainFormData.get("登录名"); + String pwd = (String) mainFormData.get("初始密码"); + String name = (String) mainFormData.get("姓名"); + String phone = (String) mainFormData.get("移动电话"); + Long dept = getLong(mainFormData.get("经销商")); + Long unit = getLong(mainFormData.get("所属单位")); + Long jobLevel = getLong(mainFormData.get("职务级别")); + Long post = getLong(mainFormData.get("岗位")); + String cusNo = (String)mainFormData.get("客户编码"); + V3xOrgMember member = orgManager.getMemberByLoginName(loginName); + if(member != null){ + mainFormData.put("人员ID",member.getId()); + log.warn("该人员账号已存在"); + return; + } + V3xOrgMember orgMember = new V3xOrgMember(); + orgMember.setName(name); + orgMember.setOrgDepartmentId(dept); + orgMember.setOrgPostId(post); + orgMember.setOrgAccountId(unit); + orgMember.setOrgLevelId(jobLevel); + orgMember.setIdIfNew(); + orgMember.setCode(cusNo); + orgMember.setTelNumber(phone); + V3xOrgPrincipal v3xOrgPrincipal = new V3xOrgPrincipal(); + v3xOrgPrincipal.setLoginName(loginName); + v3xOrgPrincipal.setMemberId(orgMember.getId()); + v3xOrgPrincipal.setPassword(pwd); + orgMember.setV3xOrgPrincipal(v3xOrgPrincipal); + orgManagerDirect.addMember(orgMember); + mainFormData.put("人员ID",orgMember.getId()); + } + + @Override + public void updateOrgMember(Map source) throws BusinessException { + } + + @Override + public void addPersonnelDoc(Map source) throws Exception { + Map mainFormData = (Map) source.get("主表数据"); + Long dept = getLong(mainFormData.get("经销商")); + Long unit = getLong(mainFormData.get("所属单位")); + Long jobLevel = getLong(mainFormData.get("职务级别")); + String loginName = getConfigProvider().getBizConfigByKey(ReceiveFVFlowConstans.formDataLoginName); + Long post = getLong(mainFormData.get("岗位")); + Map personData = new HashMap<>(); + String formNo = (String) source.get("formNo"); + personData.put("姓名文本",mainFormData.get("姓名")); + personData.put("手机号",mainFormData.get("移动电话")); + personData.put("身份证号码",mainFormData.get("身份证号码")); + personData.put("单位",unit); + personData.put("部门",dept); + personData.put("姓名",mainFormData.get("人员ID")); + personData.put("员工编号",mainFormData.get("员工编码")); + personData.put("岗位",post); + personData.put("职务级别",jobLevel); + personData.put("入职日期",mainFormData.get("经办日期")); + personData.put("性别",EnumMapUtils.getMasterTableEnumItemValue(formNo,"性别", (String) mainFormData.get("性别"))); + personData.put("人员分类",EnumMapUtils.getMasterTableEnumItemValue(formNo,"人员分类", (String) mainFormData.get("人员分类"))); + personData.put("员工状态", EnumMapUtils.getMasterTableEnumItemValue(formNo,"员工状态","在职")); + personData.put("所属区域",mainFormData.get("所属区域")); + personData.put("系统",EnumMapUtils.getMasterTableEnumItemValue(formNo,"系统", (String) mainFormData.get("营销"))); + addLlRecord(source); + List> subFormDatas = (List>) source.get("从表数据"); + FormExport formExport = new FormExport(); + List condiitonVo = new ArrayList<>(); + condiitonVo.add(FormWhereCondition.build().display("身份证号码").value(mainFormData.get("身份证号码"))); + FormDataOperator formDataOperator = new FormDataOperator(); + List formColumns = formDataOperator.queryFormDataCondition(formNo, null,condiitonVo); + if(formColumns != null && formColumns.size() > 0) { + List updateFields = new ArrayList<>(); + FormColumn formColumn = formColumns.get(0); + String formId = formColumn.getId(); + FormApi4Cap4 formApi4Cap4 = (FormApi4Cap4) AppContext.getBean("formApi4Cap4"); + FormBean cap4FormBean = formApi4Cap4.getFormByFormCode(formNo); + FormTableBean masterTableBean = cap4FormBean.getMasterTableBean(); + for (String key : mainFormData.keySet()) { + FormFieldBean beanByDisplay = masterTableBean.getFieldBeanByDisplay(key); + if(beanByDisplay == null) { + continue; + } + if(beanByDisplay.getInputType().equals("image") || beanByDisplay.getInputType().equals("attachment")) { + try { + List attachments = (List) mainFormData.get(key); + if(attachments == null || attachments.size() == 0) { + continue; + } + String refId = FileUtils.uploadFilesToOA(attachments, formId, updateLoginName, updateAccountName); + if(refId == null) { + continue; + } + updateFields.add(FormUpdateField.build().value(refId).display(key)); + } catch (Exception e) { + e.printStackTrace(); + log.error("写入附件信息失败,"+e.getMessage()); + } + }else { + updateFields.add(FormUpdateField.build().value(mainFormData.get(key)).display(key)); + } + } + List whereClause = new ArrayList<>(); + whereClause.add(FormWhereCondition.build().display("ID").value(Long.parseLong(formId))); + formDataOperator.updateMasterForm(formNo,updateFields,whereClause); + //追加从表数据 + Map subDataMap = subFormDatas.get(0); + String subTableName = subDataMap.keySet().iterator().next(); + if(formColumns != null) { + formDataOperator.addSubTableRecord(subTableName,(List)subDataMap.get(subTableName),formNo,formId); + } + }else { + FormExportUtil formExportUtil = new FormExportUtil(); + List valueExport = formExportUtil.setFormValue(personData); + formExport.setValues(valueExport); + formExport.setSubordinateForms(formExportUtil.setAllSubordinateFormValue(subFormDatas)); + getFormFactory().importBusinessFormData(loginName, formNo, + formExport, new String[] {}); + } + } + + //增加履历记录 + private void addLlRecord(Map source) throws Exception { + Map mainFormData = (Map) source.get("主表数据"); + List> subFormDatas = new ArrayList<>(); + String formNo = (String) source.get("formNo"); + Long dept = getLong(mainFormData.get("经销商")); + Long unit = getLong(mainFormData.get("所属单位")); + Long orgLevel = getLong(mainFormData.get("职务级别")); + Long post = getLong(mainFormData.get("岗位")); + FormApi4Cap4 formApi4Cap4 = (FormApi4Cap4) AppContext.getBean("formApi4Cap4"); + FormBean cap4FormBean = formApi4Cap4.getFormByFormCode(formNo); + FormTableBean llBean = null; + for (FormTableBean tableBean : cap4FormBean.getSubTableBean()) { + if (tableBean.getDisplay().contains("个人履历")) { + llBean = tableBean; + break; + } + } + String dbTableName = llBean.getTableName(); + List> list = new ArrayList<>(); + Map rowData = new HashMap<>(); + rowData.put("个人履历单位", unit); + rowData.put("个人履历部门", dept); + rowData.put("个人履历岗位", post); + rowData.put("个人履历职务级别", orgLevel); + rowData.put("个人履历日期", mainFormData.get("经办日期")); + rowData.put("个人履历备注", "入职"); + list.add(rowData); + Map llTableData = new HashMap<>(); + llTableData.put(dbTableName, list); + subFormDatas.add(llTableData); + source.put("从表数据", subFormDatas); + } + + @Override + public void updatePersonnelDoc(Map source) throws BusinessException { + + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/CusCreateAccountHandler.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/CusCreateAccountHandler.java new file mode 100644 index 0000000..809beef --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/CusCreateAccountHandler.java @@ -0,0 +1,253 @@ +package com.seeyon.apps.src_receiveFVFlow.handler; + +import com.alibaba.fastjson.JSONObject; +import com.seeyon.aicloud.common.JsonUtils; +import com.seeyon.apps.businessorganization.manager.BusinessDepartmentManager; +import com.seeyon.apps.src_receiveFVFlow.constans.ReceiveFVFlowConstans; +import com.seeyon.apps.src_receiveFVFlow.org.OrgManagerDirectFacade; +import com.seeyon.apps.src_receiveFVFlow.util.EnumMapUtils; +import com.seeyon.apps.src_receiveFVFlow.util.FormColumn; +import com.seeyon.apps.src_receiveFVFlow.util.FormDataOperator; +import com.seeyon.apps.src_receiveFVFlow.util.FormExportUtil; +import com.seeyon.apps.src_receiveFVFlow.util.FormWhereCondition; +import com.seeyon.apps.src_receiveFVFlow.util.WeaverJsonUtils; +import com.seeyon.cap4.form.api.FormApi4Cap4; +import com.seeyon.cap4.form.bean.FormBean; +import com.seeyon.cap4.form.bean.FormTableBean; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.organization.bo.OrganizationMessage; +import com.seeyon.ctp.organization.bo.V3xOrgDepartment; +import com.seeyon.ctp.organization.bo.V3xOrgMember; +import com.seeyon.ctp.organization.bo.V3xOrgPrincipal; +import com.seeyon.ctp.organization.manager.OrgManager; +import com.seeyon.ctp.organization.manager.OrgManagerDirect; +import com.seeyon.ctp.services.ServiceException; +import com.seeyon.v3x.services.form.bean.FormExport; +import com.seeyon.v3x.services.form.bean.ValueExport; +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.*; + +//客户开户 +@Component +public class CusCreateAccountHandler extends FlowDataSyncHandler implements OrgMemberUpdateHandler, CustomerDocUpdateHandler, PersonnelDocUpdateHandler { + + @Autowired + private OrgManager orgManager; + @Autowired + private OrgManagerDirect orgManagerDirect; + @Autowired + private OrgManagerDirectFacade orgManagerDirectFacade; + @Override + public boolean support(String flowName) { + return getFormCode().equals(flowName); + } + + @Override + public void process(Map source) throws Exception { + //组织架构新增部门信息,部门下新增一个或多个人员信息,并设置登录名和密码,人员档案增加履历(写明是哪个公司),根据身份证号查询人员档案信息,若不存在则新增 + log.info("客户开户流程数据同步开始"); + Map map = buildParamsMap(source); + Map results = new LinkedHashMap<>(); + results.put("组织人员信息新增", runStep(() -> addOrgMember(map), "组织人员信息新增")); + results.put("人员档案更新", runStep(() -> updatePersonnelDoc(map), "人员档案更新")); + results.put("客户档案新增", runStep(() -> addCusDoc(map), "客户档案新增")); + // 检查结果 + if (results.containsValue(false)) { + StringBuilder errorMsg = new StringBuilder("客户账号分配流程数据同步失败:" + respJsonLineSeparatorForJson); + results.forEach((k, v) -> errorMsg.append(k).append(v ? " ✅ 成功" : " ❌ 失败").append(respJsonLineSeparatorForJson)); + throw new RuntimeException(errorMsg.toString()); + } + } + + @Override + protected Map buildParamsMap(Map source) { + Map resMap = getReceiveFVFlowDao().getTemplateJsonByFormCode(getFormCode()); + Map templateMap = JSONObject.parseObject(resMap.get("templateJson"),Map.class); + Map formatMap = WeaverJsonUtils.getDisplayMap(source,templateMap); + String formNo = resMap.get("formCode"); + formatMap.put("formNo",formNo); + return formatMap; + } + + @Override + protected String getFormCode() { + return "formtable_main_83"; + } + + @Override + public void addCusDoc(Map map) throws Exception { + Map mainFormData = (Map) map.get("主表数据"); + String formNo = (String) map.get("formNo"); + FormDataOperator formDataOperator = new FormDataOperator(); + String loginName = configProvider.getBizConfigByKey(ReceiveFVFlowConstans.formDataLoginName); + Long dept = (Long) mainFormData.get("部门"); + mainFormData.put("状态","正常"); + mainFormData.put("客户部门",dept); + formDataOperator.handleEnumDeptEtc(mainFormData,formNo); + FormExport formExport = new FormExport(); + FormExportUtil formExportUtil = new FormExportUtil(); + List valueExport = formExportUtil.setFormValue(mainFormData); + formExport.setValues(valueExport); +// formExport.setSubordinateForms(formExportUtil.setAllSubordinateFormValue(subFormDatas)); + getFormFactory().importBusinessFormData(loginName, formNo, + formExport, new String[] {}); +// bindAttachmentInfo(mainFormTableAttachments,formCode,(String)source.get("泛微请求ID")); + } + + @Override + public void updateCusDoc(Map map) { + + } + + @Override + public void addOrgMember(Map source) throws Exception { + //新建部门 + Map mainFormData = (Map) source.get("主表数据"); + String deptName = (String) mainFormData.get("客户名称"); + Long unit = getLong(mainFormData.get("单位")); + V3xOrgDepartment department = new V3xOrgDepartment(); + Integer sortId = orgManagerDirect.getMaxSortNum(V3xOrgDepartment.class.getSimpleName(), Long.valueOf(unit)); + department.setName(deptName); + Long pid = StringUtils.isBlank((String) mainFormData.get("上级部门")) ? getLong(mainFormData.get("单位")) : getLong(mainFormData.get("上级部门")); + department.setOrgAccountId(unit); + department.setSuperior(pid); + department.setSortId(Long.parseLong(sortId + "")); + String name = (String) mainFormData.get("法定代表人"); + String phone = (String) mainFormData.get("法人电话"); + String cusNo = (String) mainFormData.get("客户编码"); + Long gw = getLong(mainFormData.get("岗位")); + Long orgLevel = getLong(mainFormData.get("职务级别")); + V3xOrgMember member = orgManager.getMemberByLoginName(phone); + String existDepartmentId = orgManagerDirectFacade.getExistDepartmentIdByName(department); + if(existDepartmentId == null) { + orgManagerDirectFacade.addDepartment(department); + }else { + department.setId(Long.valueOf(existDepartmentId)); + } + if(member != null) { + mainFormData.put("部门",department.getId()); + log.warn("该人员账号已存在"); + return; + } + //创建账号 + //新建OA人员对象 + V3xOrgMember orgMember = new V3xOrgMember(); + orgMember.setIdIfNew(); + orgMember.setState(1); + orgMember.setSortId(1L); + orgMember.setOrgDepartmentId(department.getId()); + orgMember.setOrgAccountId(unit); + orgMember.setOrgLevelId(orgLevel); + orgMember.setOrgPostId(gw); + V3xOrgPrincipal v3xOrgPrincipal = new V3xOrgPrincipal(); + v3xOrgPrincipal.setLoginName(phone); + v3xOrgPrincipal.setMemberId(orgMember.getId()); + v3xOrgPrincipal.setPassword("dhx123456"); + orgMember.setV3xOrgPrincipal(v3xOrgPrincipal); + orgMember.setName(name); + orgMember.setTelNumber(phone); + orgMember.setEnabled(true); + orgMember.setCode(cusNo); + orgManagerDirectFacade.addMember(orgMember); + mainFormData.put("部门",department.getId()); + } + + @Override + public void updateOrgMember(Map source) throws BusinessException { + + } + + @Override + public void addPersonnelDoc(Map source) throws ServiceException, BusinessException { + + } + + @Override + public void updatePersonnelDoc(Map source) throws Exception { + Map mainFormData = (Map) source.get("主表数据"); + String legalPersonCardNo = (String) mainFormData.get("法人身份证号"); + Map resMap = getReceiveFVFlowDao().getTemplateJsonByFormCode("formtable_main_115"); + String formNo = resMap.get("formCode"); + Map personDocMap = new HashMap<>(); + FormDataOperator formDataOperator = new FormDataOperator(); + personDocMap.put("身份证号码",legalPersonCardNo); + String loginName = getConfigProvider().getBizConfigByKey(ReceiveFVFlowConstans.formDataLoginName); + String cusNo = (String) mainFormData.get("客户编码"); + addLlRecord(source); + List> subDatas = (List>) source.get("从表数据"); + List conditions = new ArrayList<>(); + conditions.add(FormWhereCondition.build().display("身份证号码").value(legalPersonCardNo)); + List formColumns = formDataOperator.queryFormDataCondition(formNo, null, conditions); + if(formColumns != null && formColumns.size() > 0) { + if(subDatas != null && subDatas.size() > 0) { + Map subDataMap = subDatas.get(0); + for (String key : subDataMap.keySet()) { + formDataOperator.addSubTableRecord(key, (List) subDataMap.get(key),formNo,formColumns.get(0).getId()); + } + } + }else { +// personDocMap.put("职务级别",mainFormData.get("职务级别")); +// personDocMap.put("岗位",mainFormData.get("岗位")); +// personDocMap.put("所属区域",mainFormData.get("所属区域")); +// personDocMap.put("银行网点",mainFormData.get("开户银行")); +// personDocMap.put("银行账号",mainFormData.get("银行账户")); + personDocMap.put("员工编号",cusNo); + personDocMap.put("手机号",mainFormData.get("法人电话")); + personDocMap.put("人员分类",EnumMapUtils.getMasterTableEnumItemValue(formNo,"人员分类", (String) mainFormData.get("人员分类"))); + personDocMap.put("姓名文本",mainFormData.get("法定代表人")); + personDocMap.put("员工状态", EnumMapUtils.getMasterTableEnumItemValue(formNo,"员工状态","在职")); + personDocMap.put("系统",EnumMapUtils.getMasterTableEnumItemValue(formNo,"系统","营销")); + FormExport formExport = new FormExport(); + FormExportUtil formExportUtil = new FormExportUtil(); + List valueExport = formExportUtil.setFormValue(personDocMap); + formExport.setValues(valueExport); + formExport.setSubordinateForms(formExportUtil.setAllSubordinateFormValue(subDatas)); + getFormFactory().importBusinessFormData(loginName, formNo, + formExport, new String[] {}); + } + } + + //增加履历记录 + private void addLlRecord(Map source) throws Exception { + Map mainFormData = (Map) source.get("主表数据"); + DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + List> subFormDatas = new ArrayList<>(); + Map resMap = getReceiveFVFlowDao().getTemplateJsonByFormCode("formtable_main_115"); + String formNo = resMap.get("formCode"); + Long dept = (Long) mainFormData.get("部门"); + Long orgLevel = getLong(mainFormData.get("职务级别")); + Long unit = getLong(mainFormData.get("单位")); + Long post = getLong(mainFormData.get("岗位")); + String cusName = (String) mainFormData.get("客户名称"); + FormApi4Cap4 formApi4Cap4 = (FormApi4Cap4) AppContext.getBean("formApi4Cap4"); + + FormBean cap4FormBean = formApi4Cap4.getFormByFormCode(formNo); + FormTableBean llBean = null; + for (FormTableBean tableBean : cap4FormBean.getSubTableBean()) { + if (tableBean.getDisplay().contains("个人履历")) { + llBean = tableBean; + break; + } + } + String dbTableName = llBean.getTableName(); + List> list = new ArrayList<>(); + Map rowData = new HashMap<>(); + rowData.put("个人履历单位", unit); + rowData.put("个人履历部门", dept); + rowData.put("个人履历岗位", post); + rowData.put("个人履历职务级别", orgLevel); + rowData.put("个人履历日期", df.format(new Date())); + rowData.put("个人履历备注", cusName + "开户"); + list.add(rowData); + Map llTableData = new HashMap<>(); + llTableData.put(dbTableName, list); + subFormDatas.add(llTableData); + source.put("从表数据", subFormDatas); + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/CusFreezeHandler.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/CusFreezeHandler.java new file mode 100644 index 0000000..e94007b --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/CusFreezeHandler.java @@ -0,0 +1,75 @@ +package com.seeyon.apps.src_receiveFVFlow.handler; + +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.src_receiveFVFlow.util.EnumMapUtils; +import com.seeyon.apps.src_receiveFVFlow.util.FormDataOperator; +import com.seeyon.apps.src_receiveFVFlow.util.FormUpdateField; +import com.seeyon.apps.src_receiveFVFlow.util.FormWhereCondition; +import com.seeyon.apps.src_receiveFVFlow.util.WeaverJsonUtils; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.services.ServiceException; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +//客户冻结 +@Component +public class CusFreezeHandler extends FlowDataSyncHandler implements CustomerDocUpdateHandler{ + @Override + public boolean support(String flowName) { + return getFormCode().equals(flowName); + } + + @Override + public void process(Map source) throws Exception { + //客户档案状态改为冻结 + log.info("客户冻结流程数据同步开始"); + Map map = buildParamsMap(source); + Map results = new LinkedHashMap<>(); + results.put("客户档案更新", runStep(() -> updateCusDoc(map), "客户档案更新")); + // 检查结果 + if (results.containsValue(false)) { + StringBuilder errorMsg = new StringBuilder("客户冻结流程数据同步失败:" + respJsonLineSeparatorForJson); + results.forEach((k, v) -> errorMsg.append(k).append(v ? " ✅ 成功" : " ❌ 失败").append(respJsonLineSeparatorForJson)); + throw new RuntimeException(errorMsg.toString()); + } + log.info("客户冻结流程数据同步结束"); + } + + @Override + protected Map buildParamsMap(Map source) { + Map resMap = getReceiveFVFlowDao().getTemplateJsonByFormCode(getFormCode()); + Map templateMap = JSONObject.parseObject(resMap.get("templateJson"),Map.class); + Map formatMap = WeaverJsonUtils.getDisplayMap(source,templateMap); + String formNo = resMap.get("formCode"); + formatMap.put("formNo",formNo); + return formatMap; + } + + @Override + protected String getFormCode() { + return "formtable_main_121"; + } + + @Override + public void addCusDoc(Map map) { + + } + + @Override + public void updateCusDoc(Map map) throws Exception { + Map mainFormData = (Map) map.get("主表数据"); + FormDataOperator formDataOperator = new FormDataOperator(); + String formNo = (String) map.get("formNo"); + List updateFields = new ArrayList<>(); + updateFields.add(FormUpdateField.build().display("状态").value(EnumMapUtils.getMasterTableEnumItemValue(formNo,"状态","冻结"))); + updateFields.add(FormUpdateField.build().display("冻结日期").value(mainFormData.get("冻结日期"))); + updateFields.add(FormUpdateField.build().display("冻结原因").value(mainFormData.get("冻结原因"))); + List conditions = new ArrayList<>(); + conditions.add(FormWhereCondition.build().display("客户编码").value(mainFormData.get("客户编号"))); + formDataOperator.updateMasterForm(formNo,updateFields,conditions); + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/CusInfoChangeHandler.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/CusInfoChangeHandler.java new file mode 100644 index 0000000..f8a46a6 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/CusInfoChangeHandler.java @@ -0,0 +1,245 @@ +package com.seeyon.apps.src_receiveFVFlow.handler; + +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.src_receiveFVFlow.constans.ReceiveFVFlowConstans; +import com.seeyon.apps.src_receiveFVFlow.org.OrgManagerDirectFacade; +import com.seeyon.apps.src_receiveFVFlow.util.EnumMapUtils; +import com.seeyon.apps.src_receiveFVFlow.util.FormColumn; +import com.seeyon.apps.src_receiveFVFlow.util.FormDataOperator; +import com.seeyon.apps.src_receiveFVFlow.util.FormExportUtil; +import com.seeyon.apps.src_receiveFVFlow.util.FormUpdateField; +import com.seeyon.apps.src_receiveFVFlow.util.FormWhereCondition; +import com.seeyon.apps.src_receiveFVFlow.util.WeaverJsonUtils; +import com.seeyon.cap4.form.api.FormApi4Cap4; +import com.seeyon.cap4.form.bean.FormBean; +import com.seeyon.cap4.form.bean.FormTableBean; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.organization.bo.OrganizationMessage; +import com.seeyon.ctp.organization.bo.V3xOrgDepartment; +import com.seeyon.ctp.organization.bo.V3xOrgMember; +import com.seeyon.ctp.organization.bo.V3xOrgPrincipal; +import com.seeyon.ctp.organization.manager.DepartmentManager; +import com.seeyon.ctp.organization.manager.OrgManager; +import com.seeyon.ctp.organization.manager.OrgManagerDirect; +import com.seeyon.ctp.services.ServiceException; +import com.seeyon.v3x.services.form.bean.FormExport; +import com.seeyon.v3x.services.form.bean.ValueExport; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.*; + +//客户信息变更 +@Component +public class CusInfoChangeHandler extends FlowDataSyncHandler implements CustomerDocUpdateHandler,OrgMemberUpdateHandler,PersonnelDocUpdateHandler{ + + @Autowired + private OrgManager orgManager; + @Autowired + private OrgManagerDirectFacade orgManagerDirect; + @Autowired + private DepartmentManager departmentManager; + @Override + public boolean support(String flowName) { + return getFormCode().equals(flowName); + } + + @Override + public void process(Map source) throws Exception { + //修改客户档案信息 + log.info("客户信息变更流程数据同步开始"); + Map map = buildParamsMap(source); + Map results = new LinkedHashMap<>(); + results.put("客户档案更新", runStep(() -> updateCusDoc(map), "客户档案更新")); + results.put("组织人员信息更新", runStep(() -> updateOrgMember(map), "组织人员信息更新")); + results.put("人员档案更新", runStep(() -> updatePersonnelDoc(map), "人员档案更新")); + // 检查结果 + if (results.containsValue(false)) { + StringBuilder errorMsg = new StringBuilder("客户信息变更流程数据同步失败:" + respJsonLineSeparatorForJson); + results.forEach((k, v) -> errorMsg.append(k).append(v ? " ✅ 成功" : " ❌ 失败").append(respJsonLineSeparatorForJson)); + throw new RuntimeException(errorMsg.toString()); + } + log.info("客户信息变更流程数据同步结束"); + } + + @Override + protected Map buildParamsMap(Map source) { + Map resMap = getReceiveFVFlowDao().getTemplateJsonByFormCode(getFormCode()); + Map templateMap = JSONObject.parseObject(resMap.get("templateJson"),Map.class); + Map formatMap = WeaverJsonUtils.getDisplayMap(source,templateMap); + String formNo = resMap.get("formCode"); + formatMap.put("formNo",formNo); + return formatMap; + } + + @Override + protected String getFormCode() { + return "formtable_main_85"; + } + + @Override + public void addCusDoc(Map map) { + + } + + @Override + public void updateCusDoc(Map map) throws Exception { + Map mainFormData = (Map) map.get("主表数据"); + List updateFields = new ArrayList<>(); + String formNo = (String) map.get("formNo"); + FormDataOperator formDataOperator = new FormDataOperator(); + Set sets = mainFormData.keySet(); + for (String key : sets) { + if(key.equals("发起者部门") || key.equals("客户编号")) { + continue; + } + updateFields.add(FormUpdateField.build().display(key).value(mainFormData.get(key))); + } + List conditions = new ArrayList<>(); + conditions.add(FormWhereCondition.build().display("客户编码").value(mainFormData.get("客户编号"))); + formDataOperator.updateMasterForm(formNo,updateFields,conditions); + } + + @Override + public void addOrgMember(Map source) throws BusinessException { + + } + + @Override + public void updateOrgMember(Map source) throws Exception { + Map mainFormData = (Map) source.get("主表数据"); + String preEditedLegalPerson = (String) mainFormData.get("变更前法人"); + String postEditedLegalPerson = (String) mainFormData.get("法定代表人"); + Long fqzDept = getLong(mainFormData.get("发起者部门")); + String khlb = (String) mainFormData.get("客户老板"); +// String preEditedLegalPersonCardNo = (String) mainFormData.get("变更前身份证号"); +// String postEditedLegalPersonCardNo = (String) mainFormData.get("变更后身份证号"); + String preEditedDeptName = (String) mainFormData.get("变更前客户名称"); + String postEditedDeptName = (String) mainFormData.get("客户名称"); + String postEditedPhone = (String) mainFormData.get("法人电话"); + String preEditedPhone = (String) mainFormData.get("变更前法人手机号"); + V3xOrgMember member = orgManager.getMemberById(Long.parseLong(khlb)); + if(!preEditedPhone.equals(postEditedPhone) && postEditedPhone != null) { + member.setTelNumber(postEditedPhone); + member.setCode(postEditedPhone); + V3xOrgMember byLoginName = orgManager.getMemberByLoginName(postEditedPhone); + if(byLoginName != null) { + throw new RuntimeException("该手机号已绑定账号"); + } + V3xOrgPrincipal v3xOrgPrincipal = member.getV3xOrgPrincipal(); + v3xOrgPrincipal.setLoginName(postEditedPhone); + member.setV3xOrgPrincipal(v3xOrgPrincipal); + } + if(!preEditedDeptName.equals(postEditedDeptName) && postEditedDeptName != null) { + V3xOrgDepartment department = departmentManager.getById(fqzDept); + department.setName(postEditedDeptName); + mainFormData.put("部门名称",postEditedDeptName); + orgManagerDirect.updateDepartment(department); + }else { + mainFormData.put("部门名称",preEditedDeptName); + } + if(postEditedLegalPerson != null && !preEditedLegalPerson.equals(postEditedLegalPerson)) { + member.setName(postEditedLegalPerson); + } + mainFormData.put("岗位",member.getOrgPostId()); + mainFormData.put("部门",member.getOrgDepartmentId()); + mainFormData.put("单位",member.getOrgAccountId()); + orgManagerDirect.updateMember(member); + } + + @Override + public void addPersonnelDoc(Map source) throws ServiceException, BusinessException { + + } + + @Override + public void updatePersonnelDoc(Map source) throws Exception { + Map mainFormData = (Map) source.get("主表数据"); + String loginName = getConfigProvider().getBizConfigByKey(ReceiveFVFlowConstans.formDataLoginName); + FormDataOperator formDataOperator = new FormDataOperator(); + Map resMap = getReceiveFVFlowDao().getTemplateJsonByFormCode("formtable_main_115"); + String formNo = resMap.get("formCode"); + String preEditedLegalPerson = (String) mainFormData.get("变更前法人"); + String postEditedLegalPerson = (String) mainFormData.get("法定代表人"); + String preEditedLegalPersonCardNo = (String) mainFormData.get("变更前身份证号"); + String postEditedLegalPersonCardNo = (String) mainFormData.get("法人身份证号"); + String postEditedPhone = (String) mainFormData.get("法人电话"); + String preEditedPhone = (String) mainFormData.get("变更前法人手机号"); + + if(postEditedLegalPersonCardNo != null && (preEditedLegalPersonCardNo == null || !preEditedLegalPersonCardNo.equals(postEditedLegalPersonCardNo))) { + Map personMap = new HashMap<>(); + personMap.put("岗位",mainFormData.get("岗位")); + personMap.put("单位",mainFormData.get("单位")); + personMap.put("部门",mainFormData.get("部门")); + personMap.put("部门名称",mainFormData.get("部门名称")); + personMap.put("姓名文本",postEditedLegalPerson); + personMap.put("身份证号码",postEditedLegalPersonCardNo); + personMap.put("员工状态", EnumMapUtils.getMasterTableEnumItemValue(formNo,"员工状态","入职")); + personMap.put("手机号",postEditedPhone != null && (preEditedPhone == null || !preEditedPhone.equals(postEditedPhone)) ? postEditedPhone : preEditedPhone); + addLlRecord(personMap); + List> subFormDatas = (List>) personMap.get("从表数据"); + FormExport formExport = new FormExport(); + FormExportUtil formExportUtil = new FormExportUtil(); + List valueExport = formExportUtil.setFormValue(mainFormData); + formExport.setValues(valueExport); + formExport.setSubordinateForms(formExportUtil.setAllSubordinateFormValue(subFormDatas)); + getFormFactory().importBusinessFormData(loginName, formNo, + formExport, new String[] {}); + }else { + List conditions = new ArrayList<>(); + List updateFields = new ArrayList<>(); + conditions.add(FormWhereCondition.build().display("身份证号码").value(preEditedLegalPersonCardNo)); + updateFields.add(FormUpdateField.build().display("手机号").value(postEditedPhone)); + List formColumns = formDataOperator.queryFormDataCondition(formNo, null, conditions); + addLlRecord(mainFormData); + List> subFormDatas = (List>) mainFormData.get("从表数据"); + Map subDataMap = subFormDatas.get(0); + String subTableName = subDataMap.keySet().iterator().next(); + formDataOperator.updateMasterForm(formNo,updateFields,conditions); + if(formColumns != null && formColumns.size() > 0) { + String formId = formColumns.get(0).getId(); + formDataOperator.addSubTableRecord(subTableName, (List) subDataMap.get(subTableName),formNo,formId); + } + } + } + + //增加履历记录 + private void addLlRecord(Map source) throws Exception { + DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + List> subFormDatas = new ArrayList<>(); + Map resMap = getReceiveFVFlowDao().getTemplateJsonByFormCode("formtable_main_154"); + String formNo = resMap.get("formCode"); + Long dept = (Long) source.get("部门"); + Long orgLevel = (Long) source.get("职务级别"); + Long unit = (Long) source.get("单位"); + Long post = (Long) source.get("岗位"); + String cusName = (String) source.get("部门名称"); + FormApi4Cap4 formApi4Cap4 = (FormApi4Cap4) AppContext.getBean("formApi4Cap4"); + FormBean cap4FormBean = formApi4Cap4.getFormByFormCode(formNo); + FormTableBean llBean = null; + for (FormTableBean tableBean : cap4FormBean.getSubTableBean()) { + if (tableBean.getDisplay().contains("个人履历")) { + llBean = tableBean; + break; + } + } + String dbTableName = llBean.getTableName(); + List> list = new ArrayList<>(); + Map rowData = new HashMap<>(); + rowData.put("个人履历单位", unit); + rowData.put("个人履历部门", dept); + rowData.put("个人履历岗位", post); + rowData.put("个人履历职务级别", orgLevel); + rowData.put("个人履历日期", df.format(new Date())); + rowData.put("个人履历备注", cusName + "信息变更"); + list.add(rowData); + Map llTableData = new HashMap<>(); + llTableData.put(dbTableName, list); + subFormDatas.add(llTableData); + source.put("从表数据", subFormDatas); + + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/CusRelationMaintainHandler.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/CusRelationMaintainHandler.java new file mode 100644 index 0000000..4379b82 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/CusRelationMaintainHandler.java @@ -0,0 +1,32 @@ +package com.seeyon.apps.src_receiveFVFlow.handler; + +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.services.ServiceException; +import org.springframework.stereotype.Component; + +import java.util.Collections; +import java.util.Map; + +//客户关系维护 +@Component +public class CusRelationMaintainHandler extends FlowDataSyncHandler{ + @Override + public boolean support(String flowName) { + return getFormCode().equals(flowName); + } + + @Override + public void process(Map source) throws ServiceException, BusinessException { + + } + + @Override + protected Map buildParamsMap(Map source) throws BusinessException { + return Collections.emptyMap(); + } + + @Override + protected String getFormCode() { + return ""; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/CusRevokedHandler.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/CusRevokedHandler.java new file mode 100644 index 0000000..111d98b --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/CusRevokedHandler.java @@ -0,0 +1,279 @@ +package com.seeyon.apps.src_receiveFVFlow.handler; + +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.src_receiveFVFlow.org.OrgManagerDirectFacade; +import com.seeyon.apps.src_receiveFVFlow.util.EnumMapUtils; +import com.seeyon.apps.src_receiveFVFlow.util.FormColumn; +import com.seeyon.apps.src_receiveFVFlow.util.FormDataOperator; +import com.seeyon.apps.src_receiveFVFlow.util.FormFieldVo; +import com.seeyon.apps.src_receiveFVFlow.util.FormUpdateField; +import com.seeyon.apps.src_receiveFVFlow.util.FormWhereCondition; +import com.seeyon.apps.src_receiveFVFlow.util.WeaverJsonUtils; +import com.seeyon.cap4.form.api.FormApi4Cap4; +import com.seeyon.cap4.form.bean.FormBean; +import com.seeyon.cap4.form.bean.FormTableBean; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.organization.bo.V3xOrgAccount; +import com.seeyon.ctp.organization.bo.V3xOrgDepartment; +import com.seeyon.ctp.organization.bo.V3xOrgMember; +import com.seeyon.ctp.organization.bo.V3xOrgPrincipal; +import com.seeyon.ctp.organization.manager.OrgManager; +import com.seeyon.ctp.organization.manager.OrgManagerDirect; +import com.seeyon.ctp.services.ServiceException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.*; + +//客户销户 +@Component +public class CusRevokedHandler extends FlowDataSyncHandler implements CustomerDocUpdateHandler,OrgMemberUpdateHandler,PersonnelDocUpdateHandler{ + + @Autowired + private OrgManager orgManager; + @Autowired + private OrgManagerDirectFacade orgManagerDirect; + @Override + public boolean support(String flowName) { + return getFormCode().equals(flowName); + } + + @Override + public void process(Map source) throws Exception { + //客户档案状态改为销户,组织架构部门停用,部门下人员改为离职,人员档案增加履历 + log.info("客户销户流程数据同步开始"); + Map map = buildParamsMap(source); + Map results = new LinkedHashMap<>(); + results.put("客户档案更新", runStep(() -> updateCusDoc(map), "客户档案更新")); + results.put("人员档案更新", runStep(() -> updatePersonnelDoc(map), "人员档案更新")); + results.put("组织人员信息更新", runStep(() -> updateOrgMember(map), "组织人员信息更新")); + // 检查结果 + if (results.containsValue(false)) { + StringBuilder errorMsg = new StringBuilder("客户销户流程数据同步失败:" + respJsonLineSeparatorForJson); + results.forEach((k, v) -> errorMsg.append(k).append(v ? " ✅ 成功" : " ❌ 失败").append(respJsonLineSeparatorForJson)); + throw new RuntimeException(errorMsg.toString()); + } + log.info("客户销户流程数据同步结束"); + } + + @Override + protected Map buildParamsMap(Map source) { + Map resMap = getReceiveFVFlowDao().getTemplateJsonByFormCode(getFormCode()); + Map templateMap = JSONObject.parseObject(resMap.get("templateJson"),Map.class); + Map formatMap = WeaverJsonUtils.getDisplayMap(source,templateMap); + String formNo = resMap.get("formCode"); + formatMap.put("formNo",formNo); + return formatMap; + } + + @Override + protected String getFormCode() { + return "formtable_main_118"; + } + + @Override + public void addCusDoc(Map map) { + + } + + @Override + public void updateCusDoc(Map map) throws Exception { + Map mainFormData = (Map) map.get("主表数据"); + String cusNo = (String) mainFormData.get("客户编号"); + String formNo = (String) map.get("formNo"); + List updateFields = new ArrayList<>(); + List conditions = new ArrayList<>(); + updateFields.add(FormUpdateField.build().display("状态").value(EnumMapUtils.getMasterTableEnumItemValue(formNo,"状态","销户"))); + conditions.add(FormWhereCondition.build().display("客户编码").value(cusNo)); + FormDataOperator formDataOperator = new FormDataOperator(); + List formColumns = formDataOperator.queryFormDataCondition(formNo, null, conditions); + if(formColumns != null && formColumns.size() > 0) { + for (FormFieldVo vo : formColumns.get(0).getVos()) { + if(vo.getDisplayName().equals("法人身份证号")) { + mainFormData.put("身份证号",vo.getValue()); + } + } + } + formDataOperator.updateMasterForm(formNo,updateFields,conditions); + } + + @Override + public void addOrgMember(Map source) throws BusinessException { + + } + + @Override + public void updateOrgMember(Map source) throws Exception { + Map mainFormData = (Map) source.get("主表数据"); + Long dept = getLong(mainFormData.get("客户名称")); + V3xOrgDepartment department = orgManager.getDepartmentById(dept); + List members = orgManager.getMembersByDepartment(dept, true); + for (V3xOrgMember member : members) { + V3xOrgMember temp = orgManager.getMemberById(member.getId()); + temp.setState(2); + temp.setEnabled(false); + V3xOrgPrincipal v3xOrgPrincipal = temp.getV3xOrgPrincipal(); + v3xOrgPrincipal.setLoginName(null); + temp.setV3xOrgPrincipal(v3xOrgPrincipal); + temp.setCode(null); + orgManagerDirect.updateMember(temp); + } + department.setEnabled(false); + orgManagerDirect.updateDepartment(department); + } + + @Override + public void addPersonnelDoc(Map source) throws ServiceException, BusinessException { + + } + + private void updateLpDoc(String cardNo,Long deptId,String formNo) throws Exception { + FormDataOperator formDataOperator = new FormDataOperator(); + List updateFields = new ArrayList<>(); + FormUpdateField updateField = FormUpdateField.build().display("员工状态").value(EnumMapUtils.getMasterTableEnumItemValue(formNo, "员工状态", "离职")); + updateFields.add(updateField); + List conditions = new ArrayList<>(); + conditions.add(FormWhereCondition.build().display("身份证号码").value(cardNo)); + V3xOrgDepartment department = orgManager.getDepartmentById(deptId); + Map source = new HashMap<>(); + Map mainData = new HashMap<>(); + source.put("主表数据",mainData); + mainData.put("单位",department.getOrgAccountId() + ""); + mainData.put("部门",deptId + ""); + mainData.put("客户名称",department.getName()); + addLlRecord(source); + List> subFormDatas = (List>) source.get("从表数据"); + Map subDataMap = subFormDatas.get(0); + String subTableName = subDataMap.keySet().iterator().next(); + List formColumns = formDataOperator.queryFormDataCondition(formNo, null, conditions); + if(formColumns != null && formColumns.size() > 0) { + formDataOperator.updateMasterForm(formNo,updateFields,conditions); + formDataOperator.addSubTableRecord(subTableName, (List) subDataMap.get(subTableName),formNo,formColumns.get(0).getId()); + } + } + + private void updateOtherDoc(Long deptId,String formNo) throws Exception{ + FormDataOperator formDataOperator = new FormDataOperator(); + List updateFields = new ArrayList<>(); + FormUpdateField updateField = FormUpdateField.build().display("员工状态").value(EnumMapUtils.getMasterTableEnumItemValue(formNo, "员工状态", "离职")); + updateFields.add(updateField); + List conditions = new ArrayList<>(); + Map source = new HashMap<>(); + Map mainData = new HashMap<>(); + List members = orgManager.getMembersByDepartment(deptId, true); + for (V3xOrgMember member : members) { + String post = member.getOrgPostId() + ""; + String orgLevel = member.getOrgLevelId() + ""; + source.clear(); + mainData.clear(); + conditions.clear(); + source.put("主表数据",mainData); + mainData.put("单位",member.getOrgAccountId() + ""); + mainData.put("部门",deptId + ""); + mainData.put("岗位",post); + mainData.put("职务级别",orgLevel); + addLlRecord(source); + List> subFormDatas = (List>) source.get("从表数据"); + Map subDataMap = subFormDatas.get(0); + String subTableName = subDataMap.keySet().iterator().next(); + conditions.add(FormWhereCondition.build().display("姓名").value(member.getId())); + updateFields.add(updateField); + List formColumnList = formDataOperator.queryFormDataCondition(formNo, null, conditions); + if(formColumnList != null && formColumnList.size() > 0) { + String id = formColumnList.get(0).getId(); + formDataOperator.updateMasterForm(formNo,updateFields,conditions); + formDataOperator.addSubTableRecord(subTableName, (List) subDataMap.get(subTableName),formNo,id); + } + } + } + + @Override + public void updatePersonnelDoc(Map source) throws Exception { + Map mainFormData = (Map) source.get("主表数据"); + Long dept = getLong(mainFormData.get("客户名称")); + String cardNo = (String) mainFormData.get("身份证号"); + Map resMap = getReceiveFVFlowDao().getTemplateJsonByFormCode("formtable_main_115"); + String formNo = resMap.get("formCode"); +// updateLpDoc(cardNo,dept,formNo); +// updateOtherDoc(dept,formNo); + FormDataOperator formDataOperator = new FormDataOperator(); + List updateFields = new ArrayList<>(); + updateFields.add(FormUpdateField.build().display("员工状态").value(EnumMapUtils.getMasterTableEnumItemValue(formNo, "员工状态", "离职"))); + updateFields.add(FormUpdateField.build().display("离职日期").value(mainFormData.get("离职日期"))); + List conditions = new ArrayList<>(); + Map sourceT = new HashMap<>(); + Map mainData = new HashMap<>(); + List members = orgManager.getMembersByDepartment(dept, true); + for (V3xOrgMember member : members) { + String post = member.getOrgPostId() + ""; + String orgLevel = member.getOrgLevelId() + ""; + sourceT.clear(); + mainData.clear(); + conditions.clear(); + sourceT.put("主表数据",mainData); + mainData.put("单位",member.getOrgAccountId() + ""); + mainData.put("部门",dept + ""); + mainData.put("岗位",post); + mainData.put("职务级别",orgLevel); + mainData.put("销户日期",mainData.get("销户日期")); + addLlRecord(sourceT); + List> subFormDatas = (List>) sourceT.get("从表数据"); + Map subDataMap = subFormDatas.get(0); + String subTableName = subDataMap.keySet().iterator().next(); + conditions.add(FormWhereCondition.build().display("姓名").value(member.getId())); + List formColumnList = formDataOperator.queryFormDataCondition(formNo, null, conditions); + if(formColumnList != null && formColumnList.size() > 0) { + String id = formColumnList.get(0).getId(); + formDataOperator.updateMasterForm(formNo,updateFields,conditions); + formDataOperator.addSubTableRecord(subTableName, (List) subDataMap.get(subTableName),formNo,id); + }else { + conditions.clear(); + conditions.add(FormWhereCondition.build().display("身份证号码").value(cardNo)); + formColumnList = formDataOperator.queryFormDataCondition(formNo, null, conditions); + if(formColumnList != null && formColumnList.size() > 0) { + String id = formColumnList.get(0).getId(); + formDataOperator.updateMasterForm(formNo,updateFields,conditions); + formDataOperator.addSubTableRecord(subTableName, (List) subDataMap.get(subTableName),formNo,id); + } + } + } + } + + //增加履历记录 + private void addLlRecord(Map source) throws Exception { + Map mainFormData = (Map) source.get("主表数据"); + List> subFormDatas = new ArrayList<>(); + Map resMap = getReceiveFVFlowDao().getTemplateJsonByFormCode("formtable_main_115"); + String formNo = resMap.get("formCode"); + Long dept = getLong(mainFormData.get("部门")); + Long orgLevel = getLong(mainFormData.get("职务级别")); + Long unit = getLong(mainFormData.get("单位")); + Long post = getLong(mainFormData.get("岗位")); + String cusName = (String) mainFormData.get("客户名称"); + FormApi4Cap4 formApi4Cap4 = (FormApi4Cap4) AppContext.getBean("formApi4Cap4"); + FormBean cap4FormBean = formApi4Cap4.getFormByFormCode(formNo); + FormTableBean llBean = null; + for (FormTableBean tableBean : cap4FormBean.getSubTableBean()) { + if (tableBean.getDisplay().contains("个人履历")) { + llBean = tableBean; + break; + } + } + String dbTableName = llBean.getTableName(); + List> list = new ArrayList<>(); + Map rowData = new HashMap<>(); + rowData.put("个人履历单位", unit); + rowData.put("个人履历部门", dept); + rowData.put("个人履历岗位", post); + rowData.put("个人履历职务级别", orgLevel); + rowData.put("个人履历日期", mainFormData.get("销户日期")); + rowData.put("个人履历备注", cusName == null ? "离职" : "销户"); + list.add(rowData); + Map llTableData = new HashMap<>(); + llTableData.put(dbTableName, list); + subFormDatas.add(llTableData); + source.put("从表数据", subFormDatas); + + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/CusUnfreezeHandler.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/CusUnfreezeHandler.java new file mode 100644 index 0000000..cd1ce7b --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/CusUnfreezeHandler.java @@ -0,0 +1,76 @@ +package com.seeyon.apps.src_receiveFVFlow.handler; + +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.src_receiveFVFlow.util.EnumMapUtils; +import com.seeyon.apps.src_receiveFVFlow.util.FormDataOperator; +import com.seeyon.apps.src_receiveFVFlow.util.FormUpdateField; +import com.seeyon.apps.src_receiveFVFlow.util.FormWhereCondition; +import com.seeyon.apps.src_receiveFVFlow.util.WeaverJsonUtils; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.services.ServiceException; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +//客户解冻 +@Component +public class CusUnfreezeHandler extends FlowDataSyncHandler implements CustomerDocUpdateHandler{ + @Override + public boolean support(String flowName) { + return getFormCode().equals(flowName); + } + + @Override + public void process(Map source) throws Exception { + //客户档案状态改为正常 + log.info("客户解冻流程数据同步开始"); + Map map = buildParamsMap(source); + Map results = new LinkedHashMap<>(); + results.put("客户档案更新", runStep(() -> updateCusDoc(map), "客户档案更新")); + // 检查结果 + if (results.containsValue(false)) { + StringBuilder errorMsg = new StringBuilder("客户解冻流程数据同步失败:" + respJsonLineSeparatorForJson); + results.forEach((k, v) -> errorMsg.append(k).append(v ? " ✅ 成功" : " ❌ 失败").append(respJsonLineSeparatorForJson)); + throw new RuntimeException(errorMsg.toString()); + } + log.info("客户解冻流程数据同步结束"); + } + + @Override + protected Map buildParamsMap(Map source) { + Map resMap = getReceiveFVFlowDao().getTemplateJsonByFormCode(getFormCode()); + Map templateMap = JSONObject.parseObject(resMap.get("templateJson"),Map.class); + Map formatMap = WeaverJsonUtils.getDisplayMap(source,templateMap); + String formNo = resMap.get("formCode"); + formatMap.put("formNo",formNo); + return formatMap; + } + + @Override + protected String getFormCode() { + return "formtable_main_123"; + } + + @Override + public void addCusDoc(Map map) { + + } + + @Override + public void updateCusDoc(Map map) throws Exception { + String formNo = (String) map.get("formNo"); + Map mainFormData = (Map) map.get("主表数据"); + FormDataOperator formDataOperator = new FormDataOperator(); + List updateFields = new ArrayList<>(); + List conditions = new ArrayList<>(); + updateFields.add(FormUpdateField.build().display("状态").value(EnumMapUtils.getMasterTableEnumItemValue(formNo,"状态","正常"))); + updateFields.add(FormUpdateField.build().display("冻结时间").value(mainFormData.get("冻结日期"))); + updateFields.add(FormUpdateField.build().display("冻结原因").value(mainFormData.get("冻结原因"))); + updateFields.add(FormUpdateField.build().display("解冻原因").value(mainFormData.get("解冻原因"))); + conditions.add(FormWhereCondition.build().display("客户编码").value(mainFormData.get("客户编号"))); + formDataOperator.updateMasterForm(formNo,updateFields,conditions); + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/CustomerDocUpdateHandler.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/CustomerDocUpdateHandler.java new file mode 100644 index 0000000..7ece98b --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/CustomerDocUpdateHandler.java @@ -0,0 +1,11 @@ +package com.seeyon.apps.src_receiveFVFlow.handler; + +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.services.ServiceException; + +import java.util.Map; + +public interface CustomerDocUpdateHandler { + void addCusDoc(Map map) throws Exception; + void updateCusDoc(Map map) throws Exception; +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/EmploymentApprovalHandler.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/EmploymentApprovalHandler.java new file mode 100644 index 0000000..b93ebf7 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/EmploymentApprovalHandler.java @@ -0,0 +1,82 @@ +package com.seeyon.apps.src_receiveFVFlow.handler; + +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.src_receiveFVFlow.util.FormDataOperator; +import com.seeyon.apps.src_receiveFVFlow.util.FormFieldType; +import com.seeyon.apps.src_receiveFVFlow.util.FormUpdateField; +import com.seeyon.apps.src_receiveFVFlow.util.FormWhereCondition; +import com.seeyon.apps.src_receiveFVFlow.util.WeaverJsonUtils; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.services.ServiceException; +import org.springframework.stereotype.Component; + +import java.util.*; + +//录用审批结束修改人才库档案 +@Component +public class EmploymentApprovalHandler extends FlowDataSyncHandler implements TalentDocUpdateHandler{ + + @Override + public boolean support(String flowName) { + return getFormCode().equals(flowName); + } + + @Override + public void process(Map source) throws Exception { + log.info("开始同步录用审批流程数据"); + Map map = buildParamsMap(source); + Map results = new LinkedHashMap<>(); + results.put("人才档案更新", runStep(() -> updateTalentDoc(map), "人才档案更新")); + // 检查结果 + if (results.containsValue(false)) { + StringBuilder errorMsg = new StringBuilder("录用审批流程数据同步失败:" + respJsonLineSeparatorForJson); + results.forEach((k, v) -> errorMsg.append(k).append(v ? " ✅ 成功" : " ❌ 失败").append(respJsonLineSeparatorForJson)); + throw new RuntimeException(errorMsg.toString()); + } + log.info("录用审批流程数据同步结束"); + } + + @Override + protected Map buildParamsMap(Map source) { + Map resMap = getReceiveFVFlowDao().getTemplateJsonByFormCode(getFormCode()); + String formNo = resMap.get("formCode"); + Map templateMap = JSONObject.parseObject(resMap.get("templateJson"),Map.class); + Map displayMap = WeaverJsonUtils.getDisplayMap(source, templateMap); + displayMap.put("formNo",formNo); + return displayMap; + } + + @Override + protected String getFormCode() { + return "formtable_main_116"; + } + + @Override + public void addTalentDoc(Map source) throws ServiceException { + + } + + @Override + public void updateTalentDoc(Map source) throws Exception { + Map mainFormData = (Map) source.get("主表数据"); + List> subFormDatas = (List>) source.get("从表数据"); + String formNo = (String) source.get("formNo"); + FormDataOperator formDataOperator = new FormDataOperator(); + mainFormData.put("人才状态","拟录用"); + formDataOperator.handleEnumDeptEtc(mainFormData,formNo); + List updateFields = new ArrayList<>(); + updateFields.add(FormUpdateField.build().value(mainFormData.get("人才状态")).display("人才状态")); + for (Map formData : subFormDatas) { + String table = formData.keySet().iterator().next(); + List> list = (List>)formData.get(table); + for (Map map : list) { + String ypbh = (String)map.get("应聘编号"); + if(ypbh != null) { + List whereClause = new ArrayList<>(); + whereClause.add(FormWhereCondition.build().display("应聘编号").value(ypbh)); + formDataOperator.updateMasterForm(formNo, updateFields, whereClause); + } + } + } + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/FlowDataSyncHandler.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/FlowDataSyncHandler.java new file mode 100644 index 0000000..bf5e410 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/FlowDataSyncHandler.java @@ -0,0 +1,90 @@ +package com.seeyon.apps.src_receiveFVFlow.handler; + + +import cn.hutool.log.Log; +import com.seeyon.apps.src_receiveFVFlow.config.RfvfPluginConfigProvider; +import com.seeyon.apps.src_receiveFVFlow.dao.IReceiveFVFlowDao; +import com.seeyon.apps.src_receiveFVFlow.indexinterface.StepTask; +import com.seeyon.cap4.form.api.FormApi4Cap4; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.v3x.services.form.FormFactory; + +import java.util.Map; + +public abstract class FlowDataSyncHandler { + protected Log log = Log.get(FlowDataSyncHandler.class); + public abstract boolean support(String flowName); + public abstract void process(Map source) throws Exception; + protected abstract Map buildParamsMap(Map source) throws BusinessException; + protected RfvfPluginConfigProvider configProvider = (RfvfPluginConfigProvider) AppContext.getBean("rfvfPluginConfigProvider"); + private IReceiveFVFlowDao receiveFVFlowDao; + private FormFactory formFactory; + private FormApi4Cap4 formApi4Cap4 = null; + protected String respJsonLineSeparatorForJson = System.lineSeparator() + .replace("\n", "\\u000A") + .replace("\r", "\\u000D"); + + public Long getLong(Object source) { + if(source instanceof Long) { + return (Long)source; + }else if(source instanceof String) { + try { + return Long.parseLong((String)source); + }catch (Exception e) { + System.out.println(e.getMessage()); + log.error(e.getMessage(),e); + } + } + return null; + } + + public FormApi4Cap4 getFormApi4Cap4() { + if (this.formApi4Cap4 == null) { + this.formApi4Cap4 = (FormApi4Cap4) AppContext.getBean("formApi4Cap4"); + } + + return this.formApi4Cap4; + } + + public IReceiveFVFlowDao getReceiveFVFlowDao() { + if (receiveFVFlowDao == null) { + receiveFVFlowDao = (IReceiveFVFlowDao) AppContext.getBean("receiveFVFlowDao"); + } + return receiveFVFlowDao; + } + public void setReceiveFVFlowDao(IReceiveFVFlowDao receiveFVFlowDao) { + this.receiveFVFlowDao = receiveFVFlowDao; + } + public RfvfPluginConfigProvider getConfigProvider() { + return configProvider; + } + + public void setConfigProvider(RfvfPluginConfigProvider configProvider) { + this.configProvider = configProvider; + } + public FormFactory getFormFactory() { + if (formFactory == null) { + formFactory = (FormFactory) AppContext.getBean("formFactory"); + } + return formFactory; + } + public void setFormFactory(FormFactory formFactory) { + this.formFactory = formFactory; + } + + protected abstract String getFormCode(); + + /** 统一执行步骤 */ + public boolean runStep(StepTask step, String stepName) { + try { + step.run(); + log.info("{}成功", stepName); + return true; + } catch (Exception e) { + log.error(e,"{}失败:", stepName); + log.error(e.getMessage(),e); + return false; + } + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/NormalResignationHandler.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/NormalResignationHandler.java new file mode 100644 index 0000000..dd56730 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/NormalResignationHandler.java @@ -0,0 +1,188 @@ +package com.seeyon.apps.src_receiveFVFlow.handler; + +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.src_receiveFVFlow.org.OrgManagerDirectFacade; +import com.seeyon.apps.src_receiveFVFlow.util.EnumMapUtils; +import com.seeyon.apps.src_receiveFVFlow.util.FormColumn; +import com.seeyon.apps.src_receiveFVFlow.util.FormDataOperator; +import com.seeyon.apps.src_receiveFVFlow.util.FormFieldType; +import com.seeyon.apps.src_receiveFVFlow.util.FormUpdateField; +import com.seeyon.apps.src_receiveFVFlow.util.FormWhereCondition; +import com.seeyon.apps.src_receiveFVFlow.util.WeaverJsonUtils; +import com.seeyon.cap4.form.api.FormApi4Cap4; +import com.seeyon.cap4.form.bean.FormBean; +import com.seeyon.cap4.form.bean.FormFieldBean; +import com.seeyon.cap4.form.bean.FormTableBean; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.organization.bo.V3xOrgMember; +import com.seeyon.ctp.organization.bo.V3xOrgPrincipal; +import com.seeyon.ctp.organization.manager.OrgManager; +import com.seeyon.ctp.organization.manager.OrgManagerDirect; +import com.seeyon.ctp.services.ServiceException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.*; + +//正常离职 +@Component +public class NormalResignationHandler extends FlowDataSyncHandler implements PersonnelDocUpdateHandler,OrgMemberUpdateHandler,TalentDocUpdateHandler{ + + @Autowired + private OrgManager orgManager; + @Autowired + private OrgManagerDirectFacade orgManagerDirect; + + @Override + public boolean support(String flowName) { + return getFormCode().equals(flowName); + } + + @Override + public void process(Map source) throws Exception { + log.info("开始同步正常离职流程数据"); + Map map = buildParamsMap(source); + Map results = new LinkedHashMap<>(); + results.put("构建履历记录", runStep(() -> addLlRecord(map), "构建履历记录")); + results.put("更新组织人员信息", runStep(() -> updateOrgMember(map), "更新组织人员信息")); + results.put("人员档案更新", runStep(() -> updatePersonnelDoc(map), "人员档案更新")); + results.put("人才档案更新", runStep(() -> updateTalentDoc(map), "人才档案更新")); + // 检查结果 + if (results.containsValue(false)) { + StringBuilder errorMsg = new StringBuilder("正常离职流程数据同步失败:" + respJsonLineSeparatorForJson); + results.forEach((k, v) -> errorMsg.append(k).append(v ? " ✅ 成功" : " ❌ 失败").append(respJsonLineSeparatorForJson)); + throw new RuntimeException(errorMsg.toString()); + } + log.info("正常离职流程数据同步结束"); + } + + @Override + protected Map buildParamsMap(Map source) { + //修改人员档案、修改组织架构人员信息 + Map resMap = getReceiveFVFlowDao().getTemplateJsonByFormCode(getFormCode()); + String formNo = resMap.get("formCode"); + Map templateMap = JSONObject.parseObject(resMap.get("templateJson"),Map.class); + Map displayMap = WeaverJsonUtils.getDisplayMap(source, templateMap); + displayMap.put("formNo",formNo); + return displayMap; + } + + @Override + protected String getFormCode() { + return "formtable_main_113"; + } + + @Override + public void addOrgMember(Map source) { + + } + + //增加履历记录 + private void addLlRecord(Map source) throws Exception { + Map mainFormData = (Map) source.get("主表数据"); + List> subFormDatas = new ArrayList<>(); + DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + String formNo = (String) source.get("formNo"); + Long dept = getLong(mainFormData.get("部门")); + Long orgLevel = getLong(mainFormData.get("职务级别")); + Long unit = getLong(mainFormData.get("单位")); + Long post = getLong(mainFormData.get("岗位")); + FormApi4Cap4 formApi4Cap4 = (FormApi4Cap4) AppContext.getBean("formApi4Cap4"); + + FormBean cap4FormBean = formApi4Cap4.getFormByFormCode(formNo); + FormTableBean llBean = null; + for (FormTableBean tableBean : cap4FormBean.getSubTableBean()) { + if (tableBean.getDisplay().contains("个人履历")) { + llBean = tableBean; + break; + } + } + String dbTableName = llBean.getTableName(); + List> list = new ArrayList<>(); + Map rowData = new HashMap<>(); + rowData.put("个人履历单位", unit); + rowData.put("个人履历部门", dept); + rowData.put("个人履历岗位", post); + rowData.put("个人履历职务级别", orgLevel); + rowData.put("个人履历日期", mainFormData.get("离职日期")); + rowData.put("个人履历备注", "离职"); + list.add(rowData); + Map llTableData = new HashMap<>(); + llTableData.put(dbTableName, list); + subFormDatas.add(llTableData); + source.put("从表数据", subFormDatas); + + } + + @Override + public void updateOrgMember(Map source) throws Exception { + //先查询组织架构人员信息是否存在,若不存在则报错,存在则更新 + Map mainFormData = (Map) source.get("主表数据"); + String uid = mainFormData.get("姓名") + ""; //人员ID + V3xOrgMember member = orgManager.getMemberById(Long.parseLong(uid)); + if(member == null) { + throw new RuntimeException("组织架构人员信息不存在"); + } + member.setState(2); + member.setEnabled(false); + V3xOrgPrincipal v3xOrgPrincipal = member.getV3xOrgPrincipal(); + v3xOrgPrincipal.setLoginName(null); + member.setV3xOrgPrincipal(v3xOrgPrincipal); + member.setCode(null); + orgManagerDirect.updateMember(member); + } + + @Override + public void addPersonnelDoc(Map source) { + + } + + @Override + public void updatePersonnelDoc(Map source) throws Exception { + String formNo = (String) source.get("formNo"); + Map mainFormData = (Map) source.get("主表数据"); + mainFormData.put("员工状态","离职"); + FormDataOperator operator = new FormDataOperator(); + operator.handleEnumDeptEtc(mainFormData,formNo); + List updateFields = new ArrayList<>(); + List> subFormDatas = (List>) source.get("从表数据"); + String leaveDate = mainFormData.get("离职日期") + ""; //预计离职时间 + String employeeState = mainFormData.get("员工状态") + ""; //人员状态 + updateFields.add(FormUpdateField.build().value(employeeState).display("员工状态")); + updateFields.add(FormUpdateField.build().value(leaveDate).display("离职日期")); + List whereClause = new ArrayList<>(); + whereClause.add(FormWhereCondition.build().value(mainFormData.get("姓名")).display("姓名")); + operator.updateMasterForm(formNo,updateFields,whereClause); + Map subDataMap = subFormDatas.get(0); + String subTableName = subDataMap.keySet().iterator().next(); + List formColumns = operator.queryFormDataCondition(formNo, null, whereClause); + if(formColumns != null && formColumns.size() > 0 && subDataMap.get(subTableName) != null) { + operator.addSubTableRecord(subTableName,(List)subDataMap.get(subTableName),formNo,formColumns.get(0).getId()); + } + } + + @Override + public void addTalentDoc(Map source) throws ServiceException, BusinessException { + + } + + @Override + public void updateTalentDoc(Map source) throws Exception { + Map resMap = getReceiveFVFlowDao().getTemplateJsonByFormCode("formtable_main_132"); + String formNo = resMap.get("formCode"); + FormDataOperator formDataOperator = new FormDataOperator(); + Map mainFormData = (Map) source.get("主表数据"); + String telPhone = (String) mainFormData.get("手机号"); + Map temp = new HashMap<>(); + temp.put("人才状态","已离职"); + formDataOperator.handleEnumDeptEtc(temp,formNo); + List updateFields = new ArrayList<>(); + updateFields.add(FormUpdateField.build().value(temp.get("人才状态")).value("人才状态")); + List whereClause = new ArrayList<>(); + whereClause.add(FormWhereCondition.build().value(telPhone).display("手机")); + formDataOperator.updateMasterForm(formNo, updateFields, whereClause); + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/OrgMemberUpdateHandler.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/OrgMemberUpdateHandler.java new file mode 100644 index 0000000..dcbca15 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/OrgMemberUpdateHandler.java @@ -0,0 +1,10 @@ +package com.seeyon.apps.src_receiveFVFlow.handler; + +import com.seeyon.ctp.common.exceptions.BusinessException; + +import java.util.Map; + +public interface OrgMemberUpdateHandler { + void addOrgMember(Map source) throws Exception; + void updateOrgMember(Map source) throws Exception; +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/PersonnelDocUpdateHandler.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/PersonnelDocUpdateHandler.java new file mode 100644 index 0000000..bcc856b --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/PersonnelDocUpdateHandler.java @@ -0,0 +1,11 @@ +package com.seeyon.apps.src_receiveFVFlow.handler; + +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.services.ServiceException; + +import java.util.Map; + +public interface PersonnelDocUpdateHandler { + void addPersonnelDoc(Map source) throws Exception; + void updatePersonnelDoc(Map source) throws Exception; +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/RegularizationFlowApprovalHandler.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/RegularizationFlowApprovalHandler.java new file mode 100644 index 0000000..de04a65 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/RegularizationFlowApprovalHandler.java @@ -0,0 +1,81 @@ +package com.seeyon.apps.src_receiveFVFlow.handler; + +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.src_receiveFVFlow.util.FormDataOperator; +import com.seeyon.apps.src_receiveFVFlow.util.FormFieldType; +import com.seeyon.apps.src_receiveFVFlow.util.FormUpdateField; +import com.seeyon.apps.src_receiveFVFlow.util.FormWhereCondition; +import com.seeyon.apps.src_receiveFVFlow.util.WeaverJsonUtils; +import com.seeyon.ctp.common.exceptions.BusinessException; +import org.springframework.stereotype.Component; + + +import java.util.*; + +//转正流程 +@Component +public class RegularizationFlowApprovalHandler extends FlowDataSyncHandler implements PersonnelDocUpdateHandler{ + + @Override + public boolean support(String flowName) { + return getFormCode().equals(flowName); + } + + @Override + public void process(Map source) throws Exception { + log.info("开始同步转正流程数据"); + Map map = buildParamsMap(source); + Map results = new LinkedHashMap<>(); + results.put("人员档案更新", runStep(() -> updatePersonnelDoc(map), "人员档案更新")); + // 检查结果 + if (results.containsValue(false)) { + StringBuilder errorMsg = new StringBuilder("转正流程数据同步失败:" + respJsonLineSeparatorForJson); + results.forEach((k, v) -> errorMsg.append(k).append(v ? " ✅ 成功" : " ❌ 失败").append(respJsonLineSeparatorForJson)); + throw new RuntimeException(errorMsg.toString()); + } + log.info("转正流程数据同步结束"); + } + + @Override + protected Map buildParamsMap(Map source) { + Map resMap = getReceiveFVFlowDao().getTemplateJsonByFormCode(getFormCode()); + String formNo = resMap.get("formCode"); + Map templateMap = JSONObject.parseObject(resMap.get("templateJson"),Map.class); + Map displayMap = WeaverJsonUtils.getDisplayMap(source, templateMap); + displayMap.put("formNo",formNo); + return displayMap; + } + + @Override + protected String getFormCode() { + return "formtable_main_112"; + } + + @Override + public void addPersonnelDoc(Map source) { + + } + + @Override + public void updatePersonnelDoc(Map source) throws Exception { + Map mainFormData = (Map) source.get("主表数据"); + String formNo = (String) source.get("formNo"); + FormDataOperator formDataOperator = new FormDataOperator(); + List updateFields = new ArrayList<>(); + String state = (String) mainFormData.get("人事部意见"); + + if(state.equals("转正")) { + mainFormData.put("员工状态","在职"); + formDataOperator.handleEnumDeptEtc(mainFormData, formNo); + updateFields.add(FormUpdateField.build().value(mainFormData.get("转正日期")).display("转正日期")); + updateFields.add(FormUpdateField.build().value(mainFormData.get("员工状态")).display("员工状态")); + }else if(state.equals("延长试用期")) { + updateFields.add(FormUpdateField.build().value(mainFormData.get("试用期延长后日期")).display("转正日期")); + }else if(state.equals("不予录用")) { + return; + } + List whereClause = new ArrayList<>(); + whereClause.add(FormWhereCondition.build().value(mainFormData.get("姓名")).display("姓名")); + formDataOperator.updateMasterForm(formNo, updateFields, whereClause); + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/TalentDocUpdateHandler.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/TalentDocUpdateHandler.java new file mode 100644 index 0000000..71d412a --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/TalentDocUpdateHandler.java @@ -0,0 +1,11 @@ +package com.seeyon.apps.src_receiveFVFlow.handler; + +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.services.ServiceException; + +import java.util.Map; + +public interface TalentDocUpdateHandler { + void addTalentDoc(Map source) throws Exception; + void updateTalentDoc(Map source) throws Exception; +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/TransferApprovalHandler.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/TransferApprovalHandler.java new file mode 100644 index 0000000..14899a5 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/TransferApprovalHandler.java @@ -0,0 +1,167 @@ +package com.seeyon.apps.src_receiveFVFlow.handler; + +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.src_receiveFVFlow.org.OrgManagerDirectFacade; +import com.seeyon.apps.src_receiveFVFlow.util.FormColumn; +import com.seeyon.apps.src_receiveFVFlow.util.FormDataOperator; +import com.seeyon.apps.src_receiveFVFlow.util.FormFieldType; +import com.seeyon.apps.src_receiveFVFlow.util.FormUpdateField; +import com.seeyon.apps.src_receiveFVFlow.util.FormWhereCondition; +import com.seeyon.apps.src_receiveFVFlow.util.WeaverJsonUtils; +import com.seeyon.cap4.form.api.FormApi4Cap4; +import com.seeyon.cap4.form.bean.FormBean; +import com.seeyon.cap4.form.bean.FormTableBean; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.organization.bo.V3xOrgMember; +import com.seeyon.ctp.organization.manager.OrgManager; +import com.seeyon.ctp.organization.manager.OrgManagerDirect; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.*; + +//调动 +@Component +public class TransferApprovalHandler extends FlowDataSyncHandler implements PersonnelDocUpdateHandler,OrgMemberUpdateHandler{ + + @Autowired + private OrgManager orgManager; + @Autowired + private OrgManagerDirectFacade orgManagerDirect; + + @Override + public boolean support(String flowName) { + return getFormCode().equals(flowName); + } + + @Override + public void process(Map source) throws Exception { + log.info("开始同步调动流程数据"); + Map map = buildParamsMap(source); + addLlRecord(map); + updatePersonnelDoc(map); + updateOrgMember(map); + Map results = new LinkedHashMap<>(); + results.put("构建履历信息", runStep(() -> addLlRecord(map), "构建履历信息")); + results.put("人员档案更新", runStep(() -> updatePersonnelDoc(map), "人员档案更新")); + results.put("更新组织人员信息", runStep(() -> updateOrgMember(map), "更新组织人员信息")); + // 检查结果 + if (results.containsValue(false)) { + StringBuilder errorMsg = new StringBuilder("调动流程数据同步失败:" + respJsonLineSeparatorForJson); + results.forEach((k, v) -> errorMsg.append(k).append(v ? " ✅ 成功" : " ❌ 失败").append(respJsonLineSeparatorForJson)); + throw new RuntimeException(errorMsg.toString()); + } + log.info("调动流程数据同步结束"); + } + + @Override + protected Map buildParamsMap(Map source) { + //修改人员档案、修改组织架构人员信息 + Map resMap = getReceiveFVFlowDao().getTemplateJsonByFormCode(getFormCode()); + String formNo = resMap.get("formCode"); + Map templateMap = JSONObject.parseObject(resMap.get("templateJson"),Map.class); + Map displayMap = WeaverJsonUtils.getDisplayMap(source, templateMap); + displayMap.put("formNo",formNo); + return displayMap; + } + + @Override + protected String getFormCode() { + return "formtable_main_114"; + } + + @Override + public void addOrgMember(Map source) { + + } + + @Override + public void updateOrgMember(Map source) throws Exception { + Map mainFormData = (Map) source.get("主表数据"); + String uid = (String) mainFormData.get("姓名"); + Long dept = getLong(mainFormData.get("部门")) ; + Long orgLevel = getLong(mainFormData.get("职务级别")); + Long unit = getLong(mainFormData.get("单位")); + Long post = getLong(mainFormData.get("岗位")); + V3xOrgMember member = orgManager.getMemberById(Long.parseLong(uid)); + if(member == null) { + throw new RuntimeException("组织架构人员信息不存在"); + } + member.setOrgDepartmentId(dept); + if(orgLevel != null) { + member.setOrgLevelId(orgLevel); + } + member.setOrgAccountId(unit); + member.setOrgPostId(post); + orgManagerDirect.updateMember(member); + } + + @Override + public void addPersonnelDoc(Map source) { + + } + + @Override + public void updatePersonnelDoc(Map source) throws Exception { + Map mainFormData = (Map) source.get("主表数据"); + List> subFormDatas = (List>) source.get("从表数据"); + String formNo = (String) source.get("formNo"); + FormDataOperator formDataOperator = new FormDataOperator(); + List updateFields = new ArrayList<>(); + formDataOperator.handleEnumDeptEtc(mainFormData,formNo); + updateFields.add(FormUpdateField.build().value(mainFormData.get("部门")).display("部门")); + updateFields.add(FormUpdateField.build().value(mainFormData.get("岗位")).display("岗位")); + updateFields.add(FormUpdateField.build().value(mainFormData.get("单位")).display("单位")); + updateFields.add(FormUpdateField.build().value(mainFormData.get("服务客户")).display("服务客户")); + updateFields.add(FormUpdateField.build().value(mainFormData.get("所属区域")).display("所属区域")); + if(mainFormData.get("职务级别") != null) { + updateFields.add(FormUpdateField.build().value(mainFormData.get("职务级别")).display("职务级别")); + } + List whereClause = new ArrayList<>(); + whereClause.add(FormWhereCondition.build().value(mainFormData.get("姓名")).display("姓名")); + formDataOperator.updateMasterForm(formNo, updateFields, whereClause); + Map subDataMap = subFormDatas.get(0); + String subTableName = subDataMap.keySet().iterator().next(); + List formColumns = formDataOperator.queryFormDataCondition(formNo, null, whereClause); + if(formColumns != null && formColumns.size() > 0) { + formDataOperator.addSubTableRecord(subTableName,(List)subDataMap.get(subTableName),formNo,formColumns.get(0).getId()); + } + } + + //增加履历记录 + private void addLlRecord(Map source) throws Exception { + Map mainFormData = (Map) source.get("主表数据"); + List> subFormDatas = (List>) source.get("从表数据"); + DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + String formNo = (String) source.get("formNo"); + Long dept = getLong(mainFormData.get("部门")); + Long orgLevel = getLong(mainFormData.get("职务级别")); + Long unit = getLong(mainFormData.get("单位")); + Long post = getLong(mainFormData.get("岗位")); + FormApi4Cap4 formApi4Cap4 = (FormApi4Cap4) AppContext.getBean("formApi4Cap4"); + FormBean cap4FormBean = formApi4Cap4.getFormByFormCode(formNo); + FormTableBean llBean = null; + for (FormTableBean tableBean : cap4FormBean.getSubTableBean()) { + if (tableBean.getDisplay().contains("个人履历")) { + llBean = tableBean; + break; + } + } + String dbTableName = llBean.getTableName(); + List> list = new ArrayList<>(); + Map rowData = new HashMap<>(); + rowData.put("个人履历单位", unit); + rowData.put("个人履历部门", dept); + rowData.put("个人履历岗位", post); + rowData.put("个人履历职务级别", orgLevel); + rowData.put("个人履历日期", df.format(new Date())); + rowData.put("个人履历备注", "调动"); + list.add(rowData); + Map llTableData = new HashMap<>(); + llTableData.put(dbTableName, list); + subFormDatas.add(llTableData); + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/indexinterface/StepTask.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/indexinterface/StepTask.java new file mode 100644 index 0000000..c16e4dd --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/indexinterface/StepTask.java @@ -0,0 +1,6 @@ +package com.seeyon.apps.src_receiveFVFlow.indexinterface; + +@FunctionalInterface +public interface StepTask { + void run() throws Exception; +} \ No newline at end of file diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/org/OrgManagerDirectFacade.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/org/OrgManagerDirectFacade.java new file mode 100644 index 0000000..32ca9f2 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/org/OrgManagerDirectFacade.java @@ -0,0 +1,75 @@ +package com.seeyon.apps.src_receiveFVFlow.org; + +import cn.hutool.log.Log; +import com.seeyon.aicloud.common.JsonUtils; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.organization.bo.OrganizationMessage; +import com.seeyon.ctp.organization.bo.V3xOrgDepartment; +import com.seeyon.ctp.organization.bo.V3xOrgMember; +import com.seeyon.ctp.organization.manager.OrgManagerDirect; +import com.seeyon.ctp.util.JDBCAgent; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Component +public class OrgManagerDirectFacade { + + @Autowired + private OrgManagerDirect orgManagerDirect; + private static final Log log = Log.get(OrgManagerDirectFacade.class); + + public void updateMember(V3xOrgMember orgMember) throws BusinessException { + OrganizationMessage organizationMessage = orgManagerDirect.updateMember(orgMember); + log.info("修改人员信息结果: " + JsonUtils.toJSONString(organizationMessage)); + if(!organizationMessage.isSuccess()) { + throw new BusinessException(JsonUtils.toJSONString(organizationMessage.getErrorMsgInfos())); + } + } + + public void updateDepartment(V3xOrgDepartment department) throws BusinessException { + OrganizationMessage organizationMessage = orgManagerDirect.updateDepartment(department); + log.info("修改部门信息结果: " + JsonUtils.toJSONString(organizationMessage)); + if(!organizationMessage.isSuccess()) { + throw new BusinessException(JsonUtils.toJSONString(organizationMessage.getErrorMsgInfos())); + } + } + + public void addMember(V3xOrgMember orgMember) throws BusinessException { + OrganizationMessage organizationMessage = orgManagerDirect.addMember(orgMember); + log.info("添加人员信息结果: " + JsonUtils.toJSONString(organizationMessage)); + if(!organizationMessage.isSuccess()) { + throw new BusinessException(JsonUtils.toJSONString(organizationMessage.getErrorMsgInfos())); + } + } + + public void addDepartment(V3xOrgDepartment department) throws BusinessException { + OrganizationMessage organizationMessage = orgManagerDirect.addDepartment(department); + log.info("添加部门信息结果: " + JsonUtils.toJSONString(organizationMessage)); + if(!organizationMessage.isSuccess()) { + throw new BusinessException(JsonUtils.toJSONString(organizationMessage.getErrorMsgInfos())); + } + } + + public String getExistDepartmentIdByName(V3xOrgDepartment department) { + String sql = "SELECT * FROM ORG_UNIT WHERE `NAME` = ? AND `ORG_ACCOUNT_ID` = ? "; + try (JDBCAgent agent = new JDBCAgent()){ + List params = new ArrayList<>(); + params.add(department.getName()); + params.add(department.getOrgAccountId()); + agent.execute(sql,params); + List list = agent.resultSetToList(); + if(list != null && list.size() > 0) { + Map objectMap = (Map) list.get(0); + return objectMap.get("id") + ""; + } + }catch (Exception e) { + + } + return null; + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/service/IReceiveFVFlowService.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/service/IReceiveFVFlowService.java new file mode 100644 index 0000000..5f8119a --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/service/IReceiveFVFlowService.java @@ -0,0 +1,16 @@ +package com.seeyon.apps.src_receiveFVFlow.service; + +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.src_receiveFVFlow.vo.ReceiveFVFlowResponse; +import com.seeyon.ctp.services.ServiceException; + +public interface IReceiveFVFlowService { + + + /** + * 客户服务平台流程结束操作主数据平台信息 + * @param flowData + * @return + */ + public ReceiveFVFlowResponse createFormData(JSONObject flowData); +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/service/impl/ReceiveFVFlowService.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/service/impl/ReceiveFVFlowService.java new file mode 100644 index 0000000..9fb744e --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/service/impl/ReceiveFVFlowService.java @@ -0,0 +1,98 @@ +package com.seeyon.apps.src_receiveFVFlow.service.impl; + +import cn.hutool.log.Log; +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.src_receiveFVFlow.constans.ReceiveFVFlowConstans; +import com.seeyon.apps.src_receiveFVFlow.dao.IReceiveFVFlowDao; +import com.seeyon.apps.src_receiveFVFlow.handler.FlowDataSyncHandler; +import com.seeyon.apps.src_receiveFVFlow.service.IReceiveFVFlowService; +import com.seeyon.apps.src_receiveFVFlow.util.WeaverJsonUtils; +import com.seeyon.apps.src_receiveFVFlow.vo.ReceiveFVFlowResponse; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.ctpenumnew.manager.EnumManager; +import com.seeyon.v3x.services.form.FormFactory; +import org.springframework.beans.factory.annotation.Autowired; + +import javax.inject.Inject; +import java.util.*; + +public class ReceiveFVFlowService implements IReceiveFVFlowService { + + @Inject + private ICstConfigApi cstConfigApi; + @Autowired + private List syncHandlers; + + private static final Log log = Log.get(ReceiveFVFlowService.class); + + private FormFactory formFactory; + public FormFactory getFormFactory() { + if (formFactory == null) { + formFactory = (FormFactory) AppContext.getBean("formFactory"); + } + return formFactory; + } + public void setFormFactory(FormFactory formFactory) { + this.formFactory = formFactory; + } + + private IReceiveFVFlowDao receiveFVFlowDao; + public IReceiveFVFlowDao getReceiveFVFlowDao() { + if (receiveFVFlowDao == null) { + receiveFVFlowDao = (IReceiveFVFlowDao) AppContext.getBean("receiveFVFlowDao"); + } + return receiveFVFlowDao; + } + public void setReceiveFVFlowDao(IReceiveFVFlowDao receiveFVFlowDao) { + this.receiveFVFlowDao = receiveFVFlowDao; + } + + + private EnumManager enumManagerNew; + public void setEnumManagerNew(EnumManager enumManagerNew) {this.enumManagerNew = enumManagerNew; } + public EnumManager getEnumManagerNew() { + if (enumManagerNew == null) {enumManagerNew = (EnumManager) AppContext.getBean("enumManagerNew");}return enumManagerNew; + } + + @Override + public ReceiveFVFlowResponse createFormData(JSONObject flowData) { + JSONObject resjson = new JSONObject(); + // 根据流程ID获取流程数据 + try{ + Map standardizededJsonMap = WeaverJsonUtils.standardizedJson(flowData.toString()); + //获取泛微流程表单编号 + String formCode = (String) standardizededJsonMap.get("formCode"); + log.info("当前流程类型为: " + formCode); + for (FlowDataSyncHandler handler : syncHandlers) { + if(handler.support(formCode)) { + handler.process(standardizededJsonMap); + resjson.put("status","1"); + resjson.put("msg","成功"); + resjson.put("data",""); + ReceiveFVFlowResponse response = new ReceiveFVFlowResponse(resjson); + return response; + } + } + throw new RuntimeException("未匹配到对应的处理器"); + }catch (Exception e){ + log.error(e.getMessage(),e); + resjson.put("status","2"); + resjson.put("msg","OA处理异常:"+e); + resjson.put("data",""); + ReceiveFVFlowResponse response = new ReceiveFVFlowResponse(resjson); + return response; + } + } + + +// 1.应聘人员登记流程(新增档案表) +// 2.人员入职流程(先进行组织架构新增-->进行人员档案表新增) +// 3.人员转正流程(根据选人控件人员ID查询档案表信息,修改人员状态) +// 4.人员调用流程(根据选人控件人员ID,修改组织架构人员信息,修改人员档案表信息) +// 5.人员离职流程(根据选人控件人员ID,修改组织架构人员信息,修改人员档案表信息) + public String getPluginId() { + return ReceiveFVFlowConstans.getPluginId(); + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/util/ClauseFactor.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/util/ClauseFactor.java new file mode 100644 index 0000000..5b9fa22 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/util/ClauseFactor.java @@ -0,0 +1,19 @@ +package com.seeyon.apps.src_receiveFVFlow.util; + +public enum ClauseFactor { + EQ, //相等 + GT, //大于 + GE, //大于等于 + LT, //小于 + LE, //小于等于 + NULL, //空 + NOT_NULL, //非空 + LIKE, //模糊 + AND, + OR + ; + + public boolean isNullType() { + return this == NULL || this == NOT_NULL; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/util/DeptGetUtils.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/util/DeptGetUtils.java new file mode 100644 index 0000000..f8f488e --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/util/DeptGetUtils.java @@ -0,0 +1,40 @@ +package com.seeyon.apps.src_receiveFVFlow.util; + +import com.seeyon.ctp.util.JDBCAgent; + +import java.util.ArrayList; +import java.util.List; + +public class DeptGetUtils { + + public static String getDeptIdByName(String deptName) { + String querySql = "SELECT ID FROM org_unit where IS_ENABLE = 1 AND `NAME` = ? limit 1"; + JDBCAgent agent = new JDBCAgent(); + try { + List params = new ArrayList<>(); + params.add(deptName); + agent.execute(querySql,params); + return agent.resultSetToMap().get("id") + ""; + } catch (Exception e) { + return null; + }finally { + agent.close(); + } + } + + public static String getPostByNameAndAccount(String name,String account) { + String querySql = "SELECT ID FROM org_post where `NAME` = ? and `ORG_ACCOUNT_ID` = ? AND `STATUS` = 1 limit 1"; + JDBCAgent agent = new JDBCAgent(); + try { + List params = new ArrayList<>(); + params.add(name); + params.add(account); + agent.execute(querySql,params); + return agent.resultSetToMap().get("id") + ""; + } catch (Exception e) { + return null; + }finally { + agent.close(); + } + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/util/EnumMapUtils.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/util/EnumMapUtils.java new file mode 100644 index 0000000..15585eb --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/util/EnumMapUtils.java @@ -0,0 +1,91 @@ +package com.seeyon.apps.src_receiveFVFlow.util; + +import com.seeyon.cap4.form.api.FormApi4Cap4; +import com.seeyon.cap4.form.bean.FormBean; +import com.seeyon.cap4.form.bean.FormFieldBean; +import com.seeyon.cap4.form.bean.FormTableBean; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.ctpenumnew.manager.EnumManager; +import com.seeyon.ctp.common.po.ctpenumnew.CtpEnumBean; +import com.seeyon.ctp.common.po.ctpenumnew.CtpEnumItem; +import com.seeyon.ctp.util.JDBCAgent; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +public class EnumMapUtils { + + public static String getMasterTableEnumItemValue(String formNo,String fieldDisplay, String targetValue) { + if(targetValue == null || "null".equals(targetValue) || "".equals(targetValue)){ + return ""; + } + try { + FormApi4Cap4 formApi4Cap4 = (FormApi4Cap4) AppContext.getBean("formApi4Cap4"); + FormBean cap4FormBean = formApi4Cap4.getFormByFormCode(formNo); + FormTableBean masterTableBean = cap4FormBean.getMasterTableBean(); + FormFieldBean beanByDisplay = masterTableBean.getFieldBeanByDisplay(fieldDisplay); + if(beanByDisplay == null || beanByDisplay.getEnumId() == 0l) { + return ""; + } + return getEnumItemValueByEnumId(targetValue, beanByDisplay.getEnumId()); + } catch (Exception e) { + return ""; + } + } + + public static String getEnumItemValue(String rootPCode, String groupValue, String targetValue) { + if(targetValue == null || "null".equals(targetValue) || "".equals(targetValue)){ + return ""; + } + String queryIdSql = "SELECT ce.ID FROM ctp_enum ce inner join ctp_enum cei on ce.`PARENT_ID` = cei.ID where CEI.`PROGRAM_CODE` = ? and ce.`ENUMNAME` = ?"; + Long enumId = null; + JDBCAgent agent = new JDBCAgent(); + try { + agent.execute(queryIdSql, Arrays.asList(rootPCode,groupValue)); + List> list = (List>) agent.resultSetToList(); + if(list == null || list.size() == 0) { + return ""; + } + Map map = list.get(0); + enumId = (Long)map.get("ID"); + } catch (Exception e) { + return ""; + }finally { + agent.close(); + } + EnumManager enumManagerNew = (EnumManager) AppContext.getBean("enumManagerNew"); + CtpEnumBean ctpEnumBean = enumManagerNew.getEnum(enumId); + if(ctpEnumBean == null) { + return ""; + } + List ctpEnumItems = ctpEnumBean.getItems(); + if(ctpEnumBean.getItems() == null) { + return ""; + } + for (CtpEnumItem enumItem : ctpEnumItems) { + if(enumItem.getShowvalue().equals(targetValue)) { + return enumItem.getId() + ""; + } + } + return ""; + } + + public static String getEnumItemValueByEnumId(String showValue,long enumId) { + EnumManager enumManagerNew = (EnumManager) AppContext.getBean("enumManagerNew"); + CtpEnumBean ctpEnumBean = enumManagerNew.getEnum(enumId); + if(ctpEnumBean == null) { + return ""; + } + List ctpEnumItems = ctpEnumBean.getItems(); + if(ctpEnumBean.getItems() == null) { + return ""; + } + for (CtpEnumItem enumItem : ctpEnumItems) { + if(enumItem.getShowvalue().equals(showValue)) { + return enumItem.getId() + ""; + } + } + return ""; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/util/FileUtils.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/util/FileUtils.java new file mode 100644 index 0000000..e0492ef --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/util/FileUtils.java @@ -0,0 +1,101 @@ +package com.seeyon.apps.src_receiveFVFlow.util; + +import cn.hutool.http.HttpUtil; +import com.seeyon.apps.src_receiveFVFlow.config.RfvfPluginConfigProvider; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.common.filemanager.manager.AttachmentManager; +import com.seeyon.ctp.common.po.filemanager.Attachment; +import com.seeyon.ctp.organization.bo.V3xOrgAccount; +import com.seeyon.ctp.organization.bo.V3xOrgMember; +import com.seeyon.ctp.organization.manager.OrgManager; +import com.seeyon.ctp.services.FileUploadExporter; +import com.seeyon.ctp.services.ServiceException; + +import java.io.File; +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +public class FileUtils { + + public static String uploadFilesToOA(List files,String formId,String loginName,String updateAccountName) throws IOException, ServiceException, BusinessException { + OrgManager orgManager = (OrgManager) AppContext.getBean("orgManager"); + V3xOrgMember v3xOrgMember = orgManager.getMemberByLoginName(loginName); + V3xOrgAccount v3xOrgAccount = orgManager.getAccountByName(updateAccountName); + List> filesInfo = new ArrayList<>(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + FileUploadExporter fileUpload = new FileUploadExporter(); + List attachments = new ArrayList(); + for (Object file : files) { + Map fileTempInfo = (Map)file; + String fileName = (String) fileTempInfo.get("fileName"); + String fileUrl = (String) fileTempInfo.get("fileUrl"); + if(fileUrl == null || fileUrl.equals("")) { + continue; + } + if(fileName == null || fileName.equals("")) { + fileName = new String("没有文件名_" + UUID.randomUUID().toString().replace("_","")); + } + String localFilePath = System.getProperty("java.io.tmpdir") + File.separator + "seeyontempfile"; + File tempFileParent = new File(localFilePath); + String tempFileName = localFilePath + File.separator + UUID.randomUUID() + "_" + fileName; + File tempFile = new File(tempFileName); + Map fileDetails = new HashMap<>(); + if(!tempFileParent.exists()) { + tempFileParent.mkdir(); + } + if(!tempFile.exists()) { + tempFile.createNewFile(); + } + HttpClient.httpDownloadFile(fileUrl,null,tempFileName,null); + fileDetails.put("oriFileName",fileName); + fileDetails.put("localFileName",tempFileName); + filesInfo.add(fileDetails); + } + String refId = Math.abs(UUID.randomUUID().getLeastSignificantBits()) + ""; + for(int n = 0 ; n < filesInfo.size() ; n++){ +// 判断文件路径是否存在 + Map fileInfoMap = filesInfo.get(n); + String fileLocalPath = fileInfoMap.get("localFileName"); + String fileFinalName = fileInfoMap.get("oriFileName"); + File file = new File(fileLocalPath); + if(file.exists()) { + if(file.length() > 102400000) { + return null; + } + String[] strs = new String[]{file.getAbsolutePath()}; + String s = fileUpload.processUpload(strs); + Map map = new HashMap(); + String attachName = fileFinalName; + String[] suffixNames = attachName.split("\\."); + map.put("type", "0"); + map.put("fileUrl", s); + if(suffixNames.length > 1 ) { + map.put("mimeType", "application/" + suffixNames[suffixNames.length - 1].toLowerCase()); + } + map.put("size", file.length() + ""); + map.put("subReference", refId); + map.put("category", "66"); + map.put("createdate", sdf.format(new Date())); + map.put("filename", fileFinalName); + map.put("reference", formId); + Attachment attachment = new Attachment(map); + + attachments.add(attachment); + } + file.delete(); + } + if(attachments.size() == 0) { + return null; + } + AttachmentManager attachmentManager = (AttachmentManager) AppContext.getBean("attachmentManager"); + attachmentManager.create(attachments, v3xOrgMember.getId(), v3xOrgAccount.getId()); + return attachments.get(0).getSubReference() + ""; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/util/FormColumn.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/util/FormColumn.java new file mode 100644 index 0000000..4c231ed --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/util/FormColumn.java @@ -0,0 +1,24 @@ +package com.seeyon.apps.src_receiveFVFlow.util; + +import java.util.List; + +public class FormColumn { + private String id; + private List vos; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public List getVos() { + return vos; + } + + public void setVos(List vos) { + this.vos = vos; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/util/FormDataOperator.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/util/FormDataOperator.java new file mode 100644 index 0000000..686f9fb --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/util/FormDataOperator.java @@ -0,0 +1,525 @@ +package com.seeyon.apps.src_receiveFVFlow.util; + +import com.seeyon.cap4.form.api.FormApi4Cap4; +import com.seeyon.cap4.form.bean.FormBean; +import com.seeyon.cap4.form.bean.FormFieldBean; +import com.seeyon.cap4.form.bean.FormTableBean; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.util.JDBCAgent; + +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.UUID; +import java.util.stream.Collectors; + +public class FormDataOperator { + + public void updateMasterForm(String formNo, List updateFieldVos, List conditionVos) throws BusinessException { + FormApi4Cap4 formApi4Cap4 = (FormApi4Cap4) AppContext.getBean("formApi4Cap4"); + FormBean cap4FormBean = formApi4Cap4.getFormByFormCode(formNo); + FormTableBean masterTableBean = cap4FormBean.getMasterTableBean(); + + if (updateFieldVos == null) { + throw new IllegalArgumentException("要修改的字段为空"); + } + for (FormUpdateField fieldVo : updateFieldVos) { + FormFieldBean bean = masterTableBean.getFieldBeanByDisplay(fieldVo.getDisplay()); + if (bean == null) { + continue; + } + if(bean.getInputType().equals("image") || bean.getInputType().equals("attachment")){} + fieldVo.fieldName(bean.getColumnName()); + } + List updateFields = updateFieldVos.stream().filter(u -> u.getFieldName() != null).collect(Collectors.toList()); + for (FormWhereCondition conditionVo : conditionVos) { + FormFieldBean bean = masterTableBean.getFieldBeanByDisplay(conditionVo.getDisplay()); + if (bean == null) { + if (conditionVo.getDisplay().equals("ID") || conditionVo.getDisplay().equals("id")) { + conditionVo.setFieldName(conditionVo.getDisplay()); + } + continue; + } + conditionVo.setFieldName(bean.getColumnName()); + } + List conditions = conditionVos.stream().filter(c -> c.getFieldName() != null).collect(Collectors.toList()); + Map map = generateSql(updateFields, masterTableBean.getTableName(), conditions); + JDBCAgent agent = new JDBCAgent(); + try { + agent.execute((String) map.get("sql"), (List) map.get("params")); + return; + } catch (Exception e) { + e.printStackTrace(); + } finally { + agent.close(); + } + } + + + public List queryFormDataCondition(String formNo, List queryColumnVos, List conditionVos) throws Exception { + FormApi4Cap4 formApi4Cap4 = (FormApi4Cap4) AppContext.getBean("formApi4Cap4"); + FormBean cap4FormBean = formApi4Cap4.getFormByFormCode(formNo); + List queryColumns = new ArrayList<>(); + FormTableBean masterTableBean = cap4FormBean.getMasterTableBean(); + String tableName = masterTableBean.getTableName(); + Map fieldMap4Name = masterTableBean.getFieldMap4Name(); + if (queryColumnVos != null) { + for (String queryColumnVo : queryColumnVos) { + FormFieldBean fieldBeanByDisplay = masterTableBean.getFieldBeanByDisplay(queryColumnVo); + if (fieldBeanByDisplay == null) { + continue; + } + queryColumns.add(fieldBeanByDisplay.getColumnName()); + } + } + for (FormWhereCondition conditionVo : conditionVos) { + FormFieldBean fieldBeanByDisplay = masterTableBean.getFieldBeanByDisplay(conditionVo.getDisplay()); + if (fieldBeanByDisplay == null) { + if (conditionVo.getDisplay().equals("ID") || conditionVo.getDisplay().equals("id")) { + conditionVo.setFieldName(conditionVo.getDisplay()); + } + continue; + } + conditionVo.setFieldName(fieldBeanByDisplay.getColumnName()); + } + + Map generateSql = generateSql(queryColumns, conditionVos, tableName); + String sql = (String) generateSql.get("sql"); + List params = (List) generateSql.get("params"); + JDBCAgent jdbcAgent = new JDBCAgent(); + List columns = new ArrayList<>(); + try { + jdbcAgent.execute(sql, params); + List list = jdbcAgent.resultSetToList(); + for (Object o : list) { + FormColumn column = new FormColumn(); + Map columnMap = (Map) o; + List vos = new ArrayList<>(); + for (String key : columnMap.keySet()) { + FormFieldVo fieldVo = new FormFieldVo(); + if (fieldMap4Name.containsKey(key)) { + FormFieldBean fieldBean = fieldMap4Name.get(key); + fieldVo.setDisplayName(fieldBean.getDisplay()); + fieldVo.setValue(columnMap.get(key)); + vos.add(fieldVo); + } + } + column.setVos(vos); + if (columnMap.get("id") != null) { + column.setId(columnMap.get("id") + ""); + } + columns.add(column); + } + return columns; + } finally { + jdbcAgent.close(); + } + } + + private Map generateSql(List queryColumn, List conditions, String tableName) { + if (tableName == null) { + throw new IllegalArgumentException("tableName cannot be null or empty"); + } + StringBuilder sqlBuilder = new StringBuilder("SELECT "); + if (queryColumn == null || queryColumn.isEmpty()) { + sqlBuilder.append("*"); + } + + for (int i = 0; i < queryColumn.size(); i++) { + sqlBuilder.append(queryColumn.get(i)); + if (queryColumn.size() > 1 && i >= 0 && i < queryColumn.size() - 1) { + sqlBuilder.append(","); + } + } + + if (queryColumn.size() > 0) { + sqlBuilder.append(",`ID`"); + } + + sqlBuilder.append(" from " + tableName); + List params = new ArrayList<>(); + sqlBuilder.append(buildWhereClause(conditions,params)); + Map result = new HashMap<>(); + result.put("sql", sqlBuilder.toString()); + result.put("params", params); + return result; + } + + private Map generateSql(List fieldValues, String tableName,List conditions) { + if (fieldValues == null || fieldValues.isEmpty()) { + throw new IllegalArgumentException("Field values cannot be null or empty"); + } + if (tableName == null || tableName.trim().isEmpty()) { + throw new IllegalArgumentException("Table name cannot be null or empty"); + } + StringBuilder sqlBuilder = new StringBuilder("UPDATE ").append(tableName).append(" SET "); + List params = new ArrayList<>(); + // Build the SET clause + int fieldCount = 0; + for (FormUpdateField updateField : fieldValues) { + if (updateField.getFieldName() == null) { + continue; + } + if (fieldCount > 0) { + sqlBuilder.append(", "); + } + if (updateField.getValue() instanceof String && ((String) updateField.getValue()).startsWith("DATE>")) { + String oldValue = (String) updateField.getValue(); + sqlBuilder.append(updateField.getFieldName()).append(" = TO_DATE( ?, 'YYYY-MM-DD')"); + updateField.setValue(oldValue.substring(oldValue.indexOf(">") + 1)); + } else { + sqlBuilder.append(updateField.getFieldName()).append(" = ?"); + } + params.add(updateField.getValue()); + fieldCount++; + } + String whereClauseStr = buildWhereClause(conditions,params); + // Append the WHERE clause + sqlBuilder.append(whereClauseStr); + // Create result map + Map result = new HashMap<>(); + result.put("sql", sqlBuilder.toString()); + result.put("params", params); + return result; + } + + public Map> getMainFormTableAttachments(String formNo,Map sourceMap) throws BusinessException { + FormApi4Cap4 formApi4Cap4 = (FormApi4Cap4) AppContext.getBean("formApi4Cap4"); + FormBean cap4FormBean = formApi4Cap4.getFormByFormCode(formNo); + FormTableBean masterTableBean = cap4FormBean.getMasterTableBean(); + Map> attachmentTempMap = new HashMap<>(); + Set removeKey = new HashSet<>(); + for (String key : sourceMap.keySet()) { + FormFieldBean fieldBeanByDisplay = masterTableBean.getFieldBeanByDisplay(key); + if(fieldBeanByDisplay == null ){ + continue; + } + if(fieldBeanByDisplay.getInputType().equals("image") || + fieldBeanByDisplay.getInputType().equals("attachment")) { + attachmentTempMap.put(fieldBeanByDisplay.getDisplay(),(List)sourceMap.get(key)); + removeKey.add(key); + } + } + for (String key : removeKey) { + sourceMap.remove(key); + } + return attachmentTempMap; + } + + public Map> getSubFormTableAttachments(String formNo,Map sourceMap) throws BusinessException { + FormApi4Cap4 formApi4Cap4 = (FormApi4Cap4) AppContext.getBean("formApi4Cap4"); + FormBean cap4FormBean = formApi4Cap4.getFormByFormCode(formNo); + List subTableBean = cap4FormBean.getSubTableBean(); + Map> attachmentTempMap = new HashMap<>(); + String tableName = null; + for (String key : sourceMap.keySet()) { + tableName = key; + } + String finalTableName = tableName; + FormTableBean tableBean = subTableBean.stream().filter(s->s.getTableName().equals(finalTableName)).collect(Collectors.toList()).get(0); + List> tableData = (List>)sourceMap.get(tableName); + Set removeKey = new HashSet<>(); + for (Map rowData : tableData) { + for (String key : rowData.keySet()) { + FormFieldBean fieldBeanByDisplay = tableBean.getFieldBeanByDisplay(key); + if(fieldBeanByDisplay == null ){ + continue; + } + if(fieldBeanByDisplay.getInputType().equals("image") || + fieldBeanByDisplay.getInputType().equals("attachment")) { + attachmentTempMap.put(fieldBeanByDisplay.getDisplay(),(List)sourceMap.get(key)); + removeKey.add(key); + } + } + for (String key : removeKey) { + rowData.remove(key); + } + removeKey.clear(); + } + return attachmentTempMap; + } + + public void addSubTableRecord(String subTableName,List data,String formNo,String formId) { + JDBCAgent agent = new JDBCAgent(); + try { + FormApi4Cap4 formApi4Cap4 = (FormApi4Cap4) AppContext.getBean("formApi4Cap4"); + FormBean cap4FormBean = formApi4Cap4.getFormByFormCode(formNo); + List tableBean = cap4FormBean.getSubTableBean(); + for (FormTableBean bean : tableBean) { + if(!bean.getTableName().equals(subTableName)) { + continue; + } + for (Object column : data) { + Map map = (Map) column; + Map tempMap = new HashMap<>(); + for (String key : map.keySet()) { + FormFieldBean fieldBeanByDisplay = bean.getFieldBeanByDisplay(key); + if(fieldBeanByDisplay == null) { + continue; + } + tempMap.put(fieldBeanByDisplay.getColumnName(),map.get(key)); + } + tempMap.put("formmain_id",formId); + tempMap.put("sort",1); + tempMap.put("ID",Math.abs(UUID.randomUUID().getLeastSignificantBits())); + Map insertSql = generateInsertSql(tempMap, subTableName); + agent.execute((String)insertSql.get("sql"),(List)insertSql.get("params")); + } + } + } catch (Exception e) { + + } finally { + agent.close(); + } + } + + public void rebuildSubTableRecord(String subTableName,List data,String formNo,String formId) { + String deleteSql = "delete from " + subTableName + " where formmain_id = ? "; + JDBCAgent agent = new JDBCAgent(); + try { + agent.execute(deleteSql, Arrays.asList(formId)); + FormApi4Cap4 formApi4Cap4 = (FormApi4Cap4) AppContext.getBean("formApi4Cap4"); + FormBean cap4FormBean = formApi4Cap4.getFormByFormCode(formNo); + List tableBean = cap4FormBean.getSubTableBean(); + for (FormTableBean bean : tableBean) { + if(!bean.getTableName().equals(subTableName)) { + continue; + } + for (Object column : data) { + Map map = (Map) column; + Map tempMap = new HashMap<>(); + for (String key : map.keySet()) { + FormFieldBean fieldBeanByDisplay = bean.getFieldBeanByDisplay(key); + if(fieldBeanByDisplay == null) { + continue; + } + tempMap.put(fieldBeanByDisplay.getColumnName(),map.get(key)); + } + tempMap.put("formmain_id",formId); + tempMap.put("sort",1); + tempMap.put("ID",Math.abs(UUID.randomUUID().getLeastSignificantBits())); + Map insertSql = generateInsertSql(tempMap, subTableName); + agent.execute((String)insertSql.get("sql"),(List)insertSql.get("params")); + } + } + } catch (Exception e) { + + } finally { + agent.close(); + } + } + + public void handleEnumDeptEtc(Map map,String formNo) throws BusinessException { + FormApi4Cap4 formApi4Cap4 = (FormApi4Cap4) AppContext.getBean("formApi4Cap4"); + FormBean cap4FormBean = formApi4Cap4.getFormByFormCode(formNo); + FormTableBean masterTableBean = cap4FormBean.getMasterTableBean(); + for (String key : map.keySet()) { + FormFieldBean fieldBean = masterTableBean.getFieldBeanByDisplay(key); + if(fieldBean == null) { + continue; + } + switch (fieldBean.getInputType()) { + case "select": if(fieldBean.getEnumId() != 0l) { + String enumItemId = EnumMapUtils.getEnumItemValueByEnumId((String)map.get(key),fieldBean.getEnumId()); + map.put(key,enumItemId); + } break; + case "image":break; + case "attachment": break; + case "account": break; + case "department": break; + case "radio": break; + case "member":break; + case "checkbox": + case "date": + case "text":break; + default: break; + + } + } + } + + public void handleSubTableEnumDeptEtc(Map map,String formNo) throws BusinessException { + FormApi4Cap4 formApi4Cap4 = (FormApi4Cap4) AppContext.getBean("formApi4Cap4"); + FormBean cap4FormBean = formApi4Cap4.getFormByFormCode(formNo); + List subTableBean = cap4FormBean.getSubTableBean(); + for (FormTableBean tableBean : subTableBean) { + String tableName = null; + for (String key : map.keySet()) { + tableName = key; + } + if(!tableBean.getTableName().equals(tableName)) { + continue; + } + List> subDatas = (List>) map.get(tableName); + for (Map subData : subDatas) { + for (String key : subData.keySet()) { + FormFieldBean fieldBean = tableBean.getFieldBeanByDisplay(key); + if(fieldBean == null) { + continue; + } + switch (fieldBean.getInputType()) { + case "select": if(fieldBean.getEnumId() != 0l) { + String enumItemId = EnumMapUtils.getEnumItemValueByEnumId((String)subData.get(key),fieldBean.getEnumId()); + subData.put(key,enumItemId); + } break; + case "image":break; + case "attachment": break; + case "account": break; + case "department": break; + case "radio": break; + case "member":break; + case "checkbox": + case "date": + case "text":break; + default: break; + + } + } + } + } + } + + public boolean isMasterTableFile(String displayName,String formNo) { + FormApi4Cap4 formApi4Cap4 = (FormApi4Cap4) AppContext.getBean("formApi4Cap4"); + try { + FormBean cap4FormBean = formApi4Cap4.getFormByFormCode(formNo); + FormTableBean masterTableBean = cap4FormBean.getMasterTableBean(); + FormFieldBean fieldBeanByDisplay = masterTableBean.getFieldBeanByDisplay(displayName); + return fieldBeanByDisplay.getInputType().equals("image") || fieldBeanByDisplay.getInputType().equals("attachment"); + } catch (BusinessException e) { + + } + return false; + } + + private Map generateInsertSql(Map data, String tableName) { + if (tableName == null || tableName.isEmpty()) { + throw new IllegalArgumentException("tableName cannot be null or empty"); + } + if (data == null || data.isEmpty()) { + throw new IllegalArgumentException("data cannot be null or empty"); + } + StringBuilder sqlBuilder = new StringBuilder("INSERT INTO " + tableName + " ("); + List params = new ArrayList<>(); + // 拼接字段名 + StringBuilder columns = new StringBuilder(); + // 拼接字段值 + StringBuilder values = new StringBuilder(); + for (Map.Entry entry : data.entrySet()) { + // 拼接字段名 + if (columns.length() > 0) { + columns.append(", "); + } + columns.append(entry.getKey()); + // 拼接值,使用占位符 ? + if (values.length() > 0) { + values.append(", "); + } + values.append("?"); + // 将值加入 params 列表 + params.add(entry.getValue()); + } + // 完善 SQL 语句 + sqlBuilder.append(columns).append(") VALUES (").append(values).append(");"); + Map result = new HashMap<>(); + result.put("sql", sqlBuilder.toString()); + result.put("params", params); + return result; + } + + /** + * 动态生成 WHERE 子句 + * @param conditions 条件集合 + * @param params 参数列表(引用传递) + * @return 拼接后的 WHERE 子句(包含 WHERE 关键字) + */ + private String buildWhereClause(List conditions, List params) { + if (conditions == null || conditions.isEmpty()) { + return ""; + } + + StringBuilder whereClause = new StringBuilder(" WHERE "); + int conditionIndex = 0; + + for (FormWhereCondition condition : conditions) { + // 处理括号起始 + if (condition.isStartWithBracket()) { + whereClause.append("("); + } + + // 字段名校验 + String fieldName = condition.getFieldName(); + ClauseFactor factor = condition.getClauseFactor(); + String operator = parseOperator(factor); + + // 构建条件表达式 + String conditionExpr; + if (factor.isNullType()) { + // 处理 NULL/NOT NULL 条件(无需参数) + conditionExpr = String.format("%s %s", fieldName, operator); + } else { + // 处理普通条件(带占位符) + conditionExpr = String.format("%s %s ?", fieldName, operator); + // 处理函数模板(如 TO_DATE) + if (condition.getIndex() != null) { + conditionExpr = conditionExpr.replace("?", condition.getIndex()); + } + // 添加参数值 + params.add(condition.getValue()); + } + + whereClause.append(conditionExpr); + + // 处理括号闭合 + if (condition.isEndWithBracket()) { + whereClause.append(")"); + } + + // 添加连接符(AND/OR) + if (conditionIndex < conditions.size() - 1) { + whereClause.append(" ").append(condition.getConcatFactor()).append(" "); + } + conditionIndex++; + } + + return whereClause.toString(); + } + + /** + * 校验字段名合法性(防止 SQL 注入) + */ + private String validateFieldName(String fieldName) { + if (!fieldName.matches("^[a-zA-Z_][a-zA-Z0-9_]*$")) { + throw new IllegalArgumentException("非法字段名: " + fieldName); + } + return fieldName; + } + + /** + * 解析运算符映射(eq -> =, lt -> < 等) + */ + private String parseOperator(ClauseFactor factor) { + if(factor == null) { + return "="; + } + switch (factor) { + case EQ: return "="; + case GT: return ">"; + case GE: return ">="; + case LT: return "<"; + case LE: return "<="; + case LIKE: return "LIKE"; + case NULL: return "IS NULL"; // 空值判断 + case NOT_NULL: return "IS NOT NULL"; // 非空判断 + default: throw new UnsupportedOperationException("不支持的运算符: " + factor); + } + } + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/util/FormExportUtil.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/util/FormExportUtil.java new file mode 100644 index 0000000..e48eda9 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/util/FormExportUtil.java @@ -0,0 +1,84 @@ +package com.seeyon.apps.src_receiveFVFlow.util; + +import com.seeyon.v3x.services.form.bean.RecordExport; +import com.seeyon.v3x.services.form.bean.SubordinateFormExport; +import com.seeyon.v3x.services.form.bean.ValueExport; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Set; + +//创建无流程表单数据处理工具类 +public class FormExportUtil { + + /** + * 设置主表信息 + * @param map 设置主表字段。Map<主表显示名称,主表数据> + * @return + */ + public List setFormValue(Map map ){ +// 创建返回值对象 + List valueExports = new ArrayList(); + ValueExport valueExport ; +// 获取参数信息(显示名称) + Set keys = map.keySet(); + if(keys.size()>0) { +// 对控件赋值 + for (String key : keys) { + if(map.get(key) != null ){ + valueExport = new ValueExport(); + valueExport.setDisplayName(key); + valueExport.setValue(map.get(key).toString()); + valueExports.add(valueExport); + } + System.out.println(key+":"+map.get(key)); + } + } + return valueExports; + } + + /** + * 设置从表信息 + * @param lists 设置主表字段。List> + */ + public List setSubordinateFormValue(List> lists){ + List subordinateFormExports = new ArrayList(); + SubordinateFormExport subordinateFormExport = new SubordinateFormExport(); + List recordExports = new ArrayList(); + List valueExports; + RecordExport recordExport; + for(int i = 0 ; i < lists.size() ; i++) { + recordExport = new RecordExport(); + valueExports = setFormValue(lists.get(i)); + recordExport.setRecord(valueExports); + recordExports.add(recordExport); + } + subordinateFormExport.setValues(recordExports); + subordinateFormExports.add(subordinateFormExport); + + return subordinateFormExports; + } + + public List setAllSubordinateFormValue(List> lists){ + List subordinateFormExports = new ArrayList(); + for (Map list : lists) { + SubordinateFormExport subordinateFormExport = new SubordinateFormExport(); + List recordExports = new ArrayList(); + for (String key : list.keySet()) { + List> columns = (List>) list.get(key); + for(int i = 0 ; i < columns.size() ; i++) { + List valueExports = setFormValue(columns.get(i)); + RecordExport recordExport = new RecordExport(); + recordExport.setRecord(valueExports); + recordExports.add(recordExport); + } + } + subordinateFormExport.setValues(recordExports); + subordinateFormExports.add(subordinateFormExport); + } + return subordinateFormExports; + } + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/util/FormFieldType.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/util/FormFieldType.java new file mode 100644 index 0000000..161128f --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/util/FormFieldType.java @@ -0,0 +1,7 @@ +package com.seeyon.apps.src_receiveFVFlow.util; + +public enum FormFieldType { + common, + file, + ; +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/util/FormFieldVo.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/util/FormFieldVo.java new file mode 100644 index 0000000..83a05e7 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/util/FormFieldVo.java @@ -0,0 +1,22 @@ +package com.seeyon.apps.src_receiveFVFlow.util; + +public class FormFieldVo { + private String displayName; + private Object value; + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + public Object getValue() { + return value; + } + + public void setValue(Object value) { + this.value = value; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/util/FormUpdateField.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/util/FormUpdateField.java new file mode 100644 index 0000000..19dfb1f --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/util/FormUpdateField.java @@ -0,0 +1,57 @@ +package com.seeyon.apps.src_receiveFVFlow.util; + +public class FormUpdateField { + private String display; + private String fieldName; + private Object value; + + public FormUpdateField(Object value) { + this.value = value; + } + + public FormUpdateField() { + } + + public static FormUpdateField build() { + return new FormUpdateField(); + } + + public FormUpdateField display(String display) { + this.display = display; + return this; + } + + public FormUpdateField value(Object value) { + this.value = value; + return this; + } + + public FormUpdateField fieldName(String fieldName) { + this.fieldName = fieldName; + return this; + } + + public Object getValue() { + return value; + } + + public void setValue(Object value) { + this.value = value; + } + + public String getDisplay() { + return display; + } + + public void setDisplay(String display) { + this.display = display; + } + + public String getFieldName() { + return fieldName; + } + + public void setFieldName(String fieldName) { + this.fieldName = fieldName; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/util/FormWhereCondition.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/util/FormWhereCondition.java new file mode 100644 index 0000000..0eff51e --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/util/FormWhereCondition.java @@ -0,0 +1,121 @@ +package com.seeyon.apps.src_receiveFVFlow.util; + +public class FormWhereCondition { + private String display; + private String fieldName; //字段名 + private Object value; //值 + private ClauseFactor clauseFactor = ClauseFactor.EQ; //条件因子 eq lt gt not_null null + private ClauseFactor concatFactor = ClauseFactor.AND; //拼接因子 + private boolean startWithBracket = false; //是否以括号开头生成子条件 + private boolean endWithBracket = false; //是否以括号结尾结束子条件 + private String index; + + public FormWhereCondition() { + } + + public String getDisplay() { + return display; + } + + public void setDisplay(String display) { + this.display = display; + } + + public static FormWhereCondition build() { + return new FormWhereCondition(); + } + + public FormWhereCondition display(String display) { + this.display = display; + return this; + } + public FormWhereCondition value(Object value) { + this.value = value; + return this; + } + public FormWhereCondition clauseFactor(ClauseFactor clauseFactor) { + this.clauseFactor = clauseFactor; + return this; + } + public FormWhereCondition index(String index) { + this.index = index; + return this; + } + + public FormWhereCondition startWithBracket(boolean startWithBracket) { + this.startWithBracket = startWithBracket; + return this; + } + + public FormWhereCondition endWithBracket(boolean endWithBracket) { + this.endWithBracket = endWithBracket; + return this; + } + + public FormWhereCondition concatFactor(ClauseFactor concatFactor) { + this.concatFactor = concatFactor; + return this; + } + + + public FormWhereCondition(Object value, ClauseFactor clauseFactor) { + this.value = value; + this.clauseFactor = clauseFactor; + } + + public boolean isStartWithBracket() { + return startWithBracket; + } + + public void setStartWithBracket(boolean startWithBracket) { + this.startWithBracket = startWithBracket; + } + + public String getFieldName() { + return fieldName; + } + + public void setFieldName(String fieldName) { + this.fieldName = fieldName; + } + + public Object getValue() { + return value; + } + + public void setValue(Object value) { + this.value = value; + } + + public ClauseFactor getClauseFactor() { + return clauseFactor; + } + + public void setClauseFactor(ClauseFactor clauseFactor) { + this.clauseFactor = clauseFactor; + } + + public ClauseFactor getConcatFactor() { + return concatFactor; + } + + public void setConcatFactor(ClauseFactor concatFactor) { + this.concatFactor = concatFactor; + } + + public String getIndex() { + return index; + } + + public void setIndex(String index) { + this.index = index; + } + + public boolean isEndWithBracket() { + return endWithBracket; + } + + public void setEndWithBracket(boolean endWithBracket) { + this.endWithBracket = endWithBracket; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/util/HttpClient.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/util/HttpClient.java new file mode 100644 index 0000000..1e552b7 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/util/HttpClient.java @@ -0,0 +1,420 @@ +package com.seeyon.apps.src_receiveFVFlow.util; + +import org.apache.http.HttpEntity; +import org.apache.http.NameValuePair; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.*; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; +import org.apache.http.entity.mime.HttpMultipartMode; +import org.apache.http.entity.mime.MultipartEntityBuilder; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.message.BasicNameValuePair; +import org.apache.http.util.EntityUtils; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.charset.Charset; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * @ClassName: HttpClient + * @Description: HTTP请求工具类 + * @Author: GiikJc + * @Date: 2022/7/12 15:03 + */ +/** + * 发送Get请求:HttpResponse httpGet(String url,Map headers,String encode) + *发送Post请求,同表单Post提交:HttpResponse httpPostForm(String url,Map params, Map headers,String encode) + *发送Post Raw请求:HttpResponse httpPostRaw(String url,String stringJson,Map headers, String encode) + *发送Put Raw请求:HttpResponse httpPutRaw(String url,String stringJson,Map headers, String encode) + *发送Delete请求:HttpResponse httpDelete(String url,Map headers,String encode) + */ +public class HttpClient { + + + /** + * 发送 HTTP GET 请求下载文件 + * @param url 下载文件的 URL + * @param headers 请求头 + * @param savePath 文件保存的路径 + * @param encode 文件内容的编码 + * @return 下载成功返回 true,失败返回 false + */ + public static boolean httpDownloadFile(String url, Map headers, String savePath, String encode) { + if (encode == null) { + encode = "utf-8"; // 默认字符编码 + } + + CloseableHttpClient httpClient = null; + CloseableHttpResponse httpResponse = null; + InputStream inputStream = null; + OutputStream outputStream = null; + + try { + // 创建 HttpClient 实例 + httpClient = HttpClients.createDefault(); + HttpGet httpGet = new HttpGet(url); + + // 设置请求头 + if (headers != null && headers.size() > 0) { + for (Map.Entry entry : headers.entrySet()) { + httpGet.setHeader(entry.getKey(), entry.getValue()); + } + } + + // 执行请求 + httpResponse = httpClient.execute(httpGet); + HttpEntity entity = httpResponse.getEntity(); + + // 检查响应状态码 + if (httpResponse.getStatusLine().getStatusCode() == 200) { + inputStream = entity.getContent(); + + // 创建输出流,将文件保存到本地 + outputStream = new FileOutputStream(savePath); + + // 设置缓冲区 + byte[] buffer = new byte[4096]; + int bytesRead; + while ((bytesRead = inputStream.read(buffer)) != -1) { + outputStream.write(buffer, 0, bytesRead); + } + + // 文件下载成功 + return true; + } else { + System.out.println("Download failed, HTTP error code: " + httpResponse.getStatusLine().getStatusCode()); + return false; + } + } catch (Exception e) { + e.printStackTrace(); + return false; + } finally { + try { + if (inputStream != null) { + inputStream.close(); + } + if (outputStream != null) { + outputStream.close(); + } + if (httpResponse != null) { + httpResponse.close(); + } + if (httpClient != null) { + httpClient.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + /** + * 发送http get请求 + */ + public static String httpGet(String url,Map headers,String encode){ + + if(encode == null){ + encode = "utf-8"; + } + CloseableHttpResponse httpResponse = null; + CloseableHttpClient closeableHttpClient = null; + String content = null; + //since 4.3 不再使用 DefaultHttpClient + try { + closeableHttpClient = HttpClientBuilder.create().build(); + HttpGet httpGet = new HttpGet(url); + //设置header + if (headers != null && headers.size() > 0) { + for (Map.Entry entry : headers.entrySet()) { + httpGet.setHeader(entry.getKey(),entry.getValue()); + } + } + + httpResponse = closeableHttpClient.execute(httpGet); + HttpEntity entity = httpResponse.getEntity(); + content = EntityUtils.toString(entity, encode); + } catch (Exception e) { + e.printStackTrace(); + }finally{ + try { + httpResponse.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + try { //关闭连接、释放资源 + closeableHttpClient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + return content; + } + /** + * 发送 http post 请求,参数以form表单键值对的形式提交。 + */ + public static String httpPostForm(String url,Map params, Map headers,String encode){ + + if(encode == null){ + encode = "utf-8"; + } + + String content = null; + CloseableHttpResponse httpResponse = null; + CloseableHttpClient closeableHttpClient = null; + try { + + closeableHttpClient = HttpClients.createDefault(); + HttpPost httpost = new HttpPost(url); + + //设置header + if (headers != null && headers.size() > 0) { + for (Map.Entry entry : headers.entrySet()) { + httpost.setHeader(entry.getKey(),entry.getValue()); + } + } + //组织请求参数 + List paramList = new ArrayList (); + if(params != null && params.size() > 0){ + Set keySet = params.keySet(); + for(String key : keySet) { + paramList.add(new BasicNameValuePair(key, params.get(key))); + } + } + httpost.setEntity(new UrlEncodedFormEntity(paramList, encode)); + + + httpResponse = closeableHttpClient.execute(httpost); + HttpEntity entity = httpResponse.getEntity(); + content = EntityUtils.toString(entity, encode); + } catch (Exception e) { + e.printStackTrace(); + }finally{ + try { + httpResponse.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + try { //关闭连接、释放资源 + closeableHttpClient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + return content; + } + + /** + * 发送 http post 请求,参数以原生字符串进行提交 + * @param url + * @param encode + * @return + */ + public static String httpPostRaw(String url,String stringJson,Map headers, String encode){ + if(encode == null){ + encode = "utf-8"; + } + String content = null; + CloseableHttpResponse httpResponse = null; + CloseableHttpClient closeableHttpClient = null; + try { + + //HttpClients.createDefault()等价于 HttpClientBuilder.create().build(); + closeableHttpClient = HttpClients.createDefault(); + HttpPost httpost = new HttpPost(url); + + //设置header + httpost.setHeader("Content-type", "application/json"); + if (headers != null && headers.size() > 0) { + for (Map.Entry entry : headers.entrySet()) { + httpost.setHeader(entry.getKey(),entry.getValue()); + } + } + //组织请求参数 + StringEntity stringEntity = new StringEntity(stringJson, encode); + httpost.setEntity(stringEntity); + + + //响应信息 + httpResponse = closeableHttpClient.execute(httpost); + HttpEntity entity = httpResponse.getEntity(); + content = EntityUtils.toString(entity, encode); + } catch (Exception e) { + e.printStackTrace(); + }finally{ + try { + httpResponse.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + try { //关闭连接、释放资源 + closeableHttpClient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + return content; + } + + /** + * 发送 http put 请求,参数以原生字符串进行提交 + * @param url + * @param encode + * @return + */ + public static String httpPutRaw(String url,String stringJson,Map headers, String encode){ + if(encode == null){ + encode = "utf-8"; + } + CloseableHttpResponse httpResponse = null; + CloseableHttpClient closeableHttpClient = null; + String content = null; + //since 4.3 不再使用 DefaultHttpClient + try { + + //HttpClients.createDefault()等价于 HttpClientBuilder.create().build(); + closeableHttpClient = HttpClients.createDefault(); + HttpPut httpput = new HttpPut(url); + + //设置header + httpput.setHeader("Content-type", "application/json"); + if (headers != null && headers.size() > 0) { + for (Map.Entry entry : headers.entrySet()) { + httpput.setHeader(entry.getKey(),entry.getValue()); + } + } + //组织请求参数 + StringEntity stringEntity = new StringEntity(stringJson, encode); + httpput.setEntity(stringEntity); + //响应信息 + httpResponse = closeableHttpClient.execute(httpput); + HttpEntity entity = httpResponse.getEntity(); + content = EntityUtils.toString(entity, encode); + } catch (Exception e) { + e.printStackTrace(); + }finally{ + try { + httpResponse.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + try { + closeableHttpClient.close(); //关闭连接、释放资源 + } catch (IOException e) { + e.printStackTrace(); + } + return content; + } + /** + * 发送http delete请求 + */ + public static String httpDelete(String url,Map headers,String encode){ + if(encode == null){ + encode = "utf-8"; + } + String content = null; + CloseableHttpResponse httpResponse = null; + CloseableHttpClient closeableHttpClient = null; + try { + //since 4.3 不再使用 DefaultHttpClient + closeableHttpClient = HttpClientBuilder.create().build(); + HttpDelete httpdelete = new HttpDelete(url); + //设置header + if (headers != null && headers.size() > 0) { + for (Map.Entry entry : headers.entrySet()) { + httpdelete.setHeader(entry.getKey(),entry.getValue()); + } + } + + httpResponse = closeableHttpClient.execute(httpdelete); + HttpEntity entity = httpResponse.getEntity(); + content = EntityUtils.toString(entity, encode); + } catch (Exception e) { + e.printStackTrace(); + }finally{ + try { + httpResponse.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + try { //关闭连接、释放资源 + closeableHttpClient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + return content; + } + + /** + * 发送 http post 请求,支持文件上传 + */ + public static String httpPostFormMultipart(String url,Map params, List files,Map headers,String encode){ + if(encode == null){ + encode = "utf-8"; + } + CloseableHttpResponse httpResponse = null; + CloseableHttpClient closeableHttpClient = null; + String content = null; + //since 4.3 不再使用 DefaultHttpClient + try { + + closeableHttpClient = HttpClients.createDefault(); + HttpPost httpost = new HttpPost(url); + + //设置header + if (headers != null && headers.size() > 0) { + for (Map.Entry entry : headers.entrySet()) { + httpost.setHeader(entry.getKey(),entry.getValue()); + } + } + MultipartEntityBuilder mEntityBuilder = MultipartEntityBuilder.create(); + mEntityBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); + mEntityBuilder.setCharset(Charset.forName(encode)); + + // 普通参数 + ContentType contentType = ContentType.create("text/plain",Charset.forName(encode));//解决中文乱码 + if (params != null && params.size() > 0) { + Set keySet = params.keySet(); + for (String key : keySet) { + mEntityBuilder.addTextBody(key, params.get(key),contentType); + } + } + //二进制参数 + if (files != null && files.size() > 0) { + for (File file : files) { + mEntityBuilder.addBinaryBody("file", file); + } + } + httpost.setEntity(mEntityBuilder.build()); + httpResponse = closeableHttpClient.execute(httpost); + HttpEntity entity = httpResponse.getEntity(); + content = EntityUtils.toString(entity, encode); + } catch (Exception e) { + e.printStackTrace(); + }finally{ + try { + httpResponse.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + try { //关闭连接、释放资源 + closeableHttpClient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + return content; + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/util/WeaverJsonUtils.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/util/WeaverJsonUtils.java new file mode 100644 index 0000000..d34e290 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/util/WeaverJsonUtils.java @@ -0,0 +1,143 @@ +package com.seeyon.apps.src_receiveFVFlow.util; + +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.src_receiveFVFlow.config.RfvfPluginConfigProvider; +import com.seeyon.apps.src_receiveFVFlow.constans.ReceiveFVFlowConstans; +import com.seeyon.ctp.common.AppContext; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class WeaverJsonUtils { + public static Map standardizedJson(String json) { + JSONObject jsonObject = JSONObject.parseObject(json); + Object workflowid = jsonObject.get("workflowid"); + Object requestid = jsonObject.get("requestid"); + + Map rootData = (Map)jsonObject.get("data"); + if(rootData == null) { + return null; + } + Map mainData = (Map)rootData.get("mainData"); + Object tableDBName = mainData.get("tableDBName"); + Object formCode = tableDBName; + List detailData = (List)rootData.get("detailData"); + List workflowRequestTableRecords1 = null; + if(mainData != null) { + workflowRequestTableRecords1 = (List)mainData.get("workflowRequestTableRecords"); + } + Map record = new HashMap<>(); + if(workflowRequestTableRecords1 != null) { + for (Object o : workflowRequestTableRecords1) { + Map column = (Map)o; + String attachment = column.get("attachmentField") + ""; + if("true".equals(attachment)) { + List> attachments = (List>) column.get("attachmentInfo"); + try { + record.put(column.get("fieldName")+"",attachments); + }catch (Exception e) { + System.err.println(e.getMessage()); + } + + }else if(column.get("fieldName") != null && column.get("fieldValue") != null && !column.get("fieldValue").equals("")){ + record.put(column.get("fieldName")+"",column.get("fieldValue") + ""); + } + } + } + + List>> subForms = new ArrayList<>(); + if(detailData != null) { + for (Object detailDatum : detailData) { + Map> subFormMap = new HashMap<>(); + List sumFormColumns = new ArrayList<>(); + Map temp = (Map)detailDatum; + String waveTableDBName = (String)temp.get("tableDBName"); + String subFormTableName = "subTable" + waveTableDBName.substring(waveTableDBName.length() - 1,waveTableDBName.length()); + subFormMap.put(subFormTableName,sumFormColumns); + subForms.add(subFormMap); + List> workflowRequestTableRecords2 = (List>)temp.get("workflowRequestTableRecords"); + for (Map o : workflowRequestTableRecords2) { + Map columnData = new HashMap<>(); + List tableData = (List)o.get("workflowRequestTableFields"); + for (Object datum : tableData) { + Map column = (Map)datum; + String attachment = column.get("attachmentField") + ""; + if("true".equals(attachment)) { + List> attachments = (List>) column.get("attachmentInfo"); + try { + record.put(column.get("fieldName")+"",attachments); + }catch (Exception e) { + System.err.println(e.getMessage()); + } + }else if(column.get("fieldName") != null && column.get("fieldValue") != null){ + columnData.put(column.get("fieldName")+"",column.get("fieldValue") + ""); + } + } + sumFormColumns.add(columnData); + } + } + } + + Map resMap = new HashMap<>(); + resMap.put("workflowId",workflowid); + resMap.put("formCode",formCode); + resMap.put("mainForm",record); + resMap.put("subForms",subForms); + resMap.put("requestid",requestid); + return resMap; + } + + public static Map getDisplayMap(Map map,Map sourceFieldMap) { + Map resMap = new HashMap<>(); + Map mainForm = new HashMap<>(); + List subFormTableList = new ArrayList<>(); + if(sourceFieldMap == null) { + throw new RuntimeException("字段映射模板为空"); + } + resMap.put("泛微流程ID",map.get("workflowId")); + Map mainFormMap = (Map) map.get("mainForm"); + if(mainFormMap == null ) { + throw new RuntimeException("主表数据为空"); + } + for (String sourceKey : mainFormMap.keySet()) { + if(sourceFieldMap.containsKey(sourceKey)) { + mainForm.put((String) sourceFieldMap.get(sourceKey),mainFormMap.get(sourceKey)); + } + } + Map> subFormMapping = (Map>)sourceFieldMap.get("从表映射"); + List subForms = (List) map.get("subForms"); + if(subFormMapping != null && subForms != null) { + for (Object subForm : subForms) { + Map subFormMap = (Map)subForm; + Map finalSubFormDataMap = new HashMap<>(); + subFormTableList.add(finalSubFormDataMap); + for (String subTableName : subFormMap.keySet()) { + List subFormDataList = new ArrayList<>(); + List> columns = (List>) subFormMap.get(subTableName); + if(!subFormMapping.containsKey(subTableName)) { + continue; + } + Map mappingDetail = subFormMapping.get(subTableName); + String subDbTableName = mappingDetail.get("从表表名"); + finalSubFormDataMap.put(subDbTableName,subFormDataList); + for (Map column : columns) { + Map columnData = new HashMap<>(); + subFormDataList.add(columnData); + for (String sourceKey : column.keySet()) { + if(mappingDetail.containsKey(sourceKey)) { + columnData.put(mappingDetail.get(sourceKey),column.get(sourceKey)); + } + } + } + + } + } + } + resMap.put("主表数据",mainForm); + resMap.put("从表数据",subFormTableList); + resMap.put("泛微请求ID",map.get("requestid")); + return resMap; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/vo/ReceiveFVFlowResponse.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/vo/ReceiveFVFlowResponse.java new file mode 100644 index 0000000..1e10c73 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/vo/ReceiveFVFlowResponse.java @@ -0,0 +1,56 @@ +package com.seeyon.apps.src_receiveFVFlow.vo; + +import com.alibaba.fastjson.JSONObject; + +public class ReceiveFVFlowResponse { + + private boolean success; + private int status; + private String msg; + private String data; + public ReceiveFVFlowResponse() {} + public ReceiveFVFlowResponse(JSONObject object) { + + this.status = object.getString("status").equals("1")?1:2; + this.success = (1 == status); + this.msg = object.getString("msg"); + this.data = object.getString("data"); + } + + public boolean isSuccess() { + return success; + } + + public ReceiveFVFlowResponse setSuccess(boolean success) { + this.success = success; + return this; + } + + public int getStatus() { + return status; + } + + public ReceiveFVFlowResponse setStatus(int status) { + this.status = status; + return this; + } + + public String getMsg() { + return msg; + } + + public ReceiveFVFlowResponse setMsg(String msg) { + this.msg = msg; + return this; + } + + public String getData() { + return data; + } + + public ReceiveFVFlowResponse setData(String data) { + this.data = data; + return this; + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/ctp/rest/resources/QuartFormTableResource.java b/v5/apps-customize/src/main/java/com/seeyon/ctp/rest/resources/QuartFormTableResource.java new file mode 100644 index 0000000..8df3a85 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/ctp/rest/resources/QuartFormTableResource.java @@ -0,0 +1,75 @@ +package com.seeyon.ctp.rest.resources; + +import cn.hutool.log.Log; +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.src_quartformtable.dao.IQuartFormTableDao; +import com.seeyon.apps.src_receiveFVFlow.service.IReceiveFVFlowService; +import com.seeyon.apps.src_receiveFVFlow.vo.ReceiveFVFlowResponse; +import com.seeyon.ctp.common.AppContext; +import www.seeyon.com.utils.StringUtil; + +import javax.ws.rs.*; +import javax.ws.rs.core.Response; +import java.io.IOException; +import java.util.List; +import java.util.Map; + + +/** + * @author huangzhengguo: + * @version 创建时间:2025年03月14日 + * 类说明 根据表名或者表编码、数据唯一值,查询对应档案表的各ID数据 + */ +@Path("/formTable") +@Produces({"application/json", "application/xml"}) +public class QuartFormTableResource extends BaseResource{ + + private static final Log log = Log.get(QuartFormTableResource.class); + + private IQuartFormTableDao quartFormTableDao; + public IQuartFormTableDao getQuartFormTableDao() { + if (this.quartFormTableDao == null) { + this.quartFormTableDao = ((IQuartFormTableDao) AppContext.getBean("quartFormTableDao")); + } + return quartFormTableDao; + } + public void setQuartFormTableDao(IQuartFormTableDao quartFormTableDao) { + this.quartFormTableDao = quartFormTableDao; + } + + @GET + @Path("/quart") + @Produces({"application/json"}) + @Consumes({"application/json"}) + public Response getData(@QueryParam("params") String params) throws IOException { + log.info("获取查询参数为:"+params); + JSONObject param = JSONObject.parseObject(params); +// 处理调用参数,根据参数查询主要数据 + String formCode = param.getString("formCode"); +// 根据表单编码查询数据库表名 + + String formName = getQuartFormTableDao().getFormNameByFormCode(formCode); + if(StringUtil.isEmpty(formName)){ + return fail("根据表单编号查询表单为空,请确定表单编号是是否存在"); + } + JSONObject uniqueness = param.getJSONObject("uniqueness"); +// 根据唯一值字段设置查询当前表单是否存在此字段 + Map uniquenessMap = uniqueness.getInnerMap(); + List formmainIds = getQuartFormTableDao().getFormmainDataByUniqueness(formName,uniquenessMap); + if(formmainIds.size()>1){ + return fail("查询数据不唯一,请确定查询条件是否正确"); + }else{ + JSONObject res = new JSONObject(); + if(formmainIds.size()==1){ + String id = formmainIds.get(0); + res.put("id",id); + return success(res); + }else{ + res.put("id",""); + return success(res); + } + } + + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/ctp/rest/resources/ReceiveFVFlowDataResource.java b/v5/apps-customize/src/main/java/com/seeyon/ctp/rest/resources/ReceiveFVFlowDataResource.java new file mode 100644 index 0000000..7100c6d --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/ctp/rest/resources/ReceiveFVFlowDataResource.java @@ -0,0 +1,70 @@ +package com.seeyon.ctp.rest.resources; + +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.src_receiveFVFlow.service.IReceiveFVFlowService; +import com.seeyon.apps.src_receiveFVFlow.vo.ReceiveFVFlowResponse; +import com.seeyon.ctp.common.AppContext; + +import cn.hutool.log.Log; +import com.seeyon.ctp.common.SystemEnvironment; +import com.seeyon.ctp.services.ServiceException; +import com.seeyon.ctp.util.annotation.RestInterfaceAnnotation; +import com.seeyon.v3x.dee.util.DateUtil; +import org.apache.commons.io.FileUtils; + +import javax.ws.rs.*; +import javax.ws.rs.core.Response; +import java.io.File; +import java.io.IOException; +import java.util.Date; +import java.util.Map; + + +/** + * @author huangzhengguo: + * @version 创建时间:2025年01月17日 + * 类说明 接收客户服务平台流程结束后传递给主数据平台的流程ID,并切执行组织架构和档案表创建操作 + */ +@Path("/weaver/oa") +@Produces({"application/json", "application/xml"}) +public class ReceiveFVFlowDataResource extends BaseResource{ + + private static final Log log = Log.get(ReceiveFVFlowDataResource.class); + + private IReceiveFVFlowService receiveFVFlowService; + public IReceiveFVFlowService getReceiveFVFlowService() { + if (this.receiveFVFlowService == null) { + this.receiveFVFlowService = ((IReceiveFVFlowService) AppContext.getBean("receiveFVFlowService")); + } + return receiveFVFlowService; + } + public void setReceiveFVFlowService(IReceiveFVFlowService receiveFVFlowService) { + this.receiveFVFlowService = receiveFVFlowService; + } + + @POST + @Path("/receiveFVFlowData") + @Produces({"application/json"}) + @Consumes({"application/json"}) + public Response getData(JSONObject params) throws IOException { + log.info("获取泛微结束流程ID为:"+params); + String str = "/home/seeyon/Seeyon/A8/ApacheJetspeed/logs_sy"; + String date = DateUtil.format(new Date(), "yyyyMMddHHmmss"); + FileUtils.writeStringToFile(new File(str+"/testFVflowdata/" + date + ".json"), params.toString(), "UTF-8"); + + ReceiveFVFlowResponse result = new ReceiveFVFlowResponse(); + try{ +// 根据泛微流程ID获取泛微流程数据 + result = getReceiveFVFlowService().createFormData(params); + if(result.isSuccess()) { + return success("推送数据到主数据成功"); + }else { + return fail(result.getMsg()); + } + } catch (Exception e) { + log.error(e.getMessage(),e); + return fail(e.getMessage()); + } + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/ctp/rest/resources/SaveAndUpdateDepartmentResource.java b/v5/apps-customize/src/main/java/com/seeyon/ctp/rest/resources/SaveAndUpdateDepartmentResource.java new file mode 100644 index 0000000..9650630 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/ctp/rest/resources/SaveAndUpdateDepartmentResource.java @@ -0,0 +1,105 @@ +package com.seeyon.ctp.rest.resources; + +import cn.hutool.log.Log; +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.src_mainorganization.bo.ReceiveOrgMemberResponse; +import com.seeyon.apps.src_mainorganization.service.IReceiveOrgDepartmentService; +import com.seeyon.ctp.common.AppContext; + +import javax.ws.rs.Consumes; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.Response; +import java.io.IOException; + + +/** + * @author huangzhengguo: + * @version 创建时间:2025年04月16日 + * 类说明 根据接收消息新增或者修改组织架构信息 + */ +@Path("/orgDepartment") +@Produces({"application/json", "application/xml"}) +public class SaveAndUpdateDepartmentResource extends BaseResource{ + + private static final Log log = Log.get(SaveAndUpdateDepartmentResource.class); + + private IReceiveOrgDepartmentService receiveOrgDepartmentService; + + public IReceiveOrgDepartmentService getReceiveOrgDepartmentService() { + if (this.receiveOrgDepartmentService == null) { + this.receiveOrgDepartmentService = ((IReceiveOrgDepartmentService) AppContext.getBean("receiveOrgDepartmentService")); + } + return receiveOrgDepartmentService; + } + public void setReceiveOrgDepartmentService(IReceiveOrgDepartmentService receiveOrgDepartmentService) { + this.receiveOrgDepartmentService = receiveOrgDepartmentService; + } + + + @POST + @Path("/updateDepartmentSpanAccount") + @Produces({"application/json"}) + @Consumes({"application/json"}) + public Response updateDepartmentSpanAccount(JSONObject params){ + log.info("新建部门参数:"+params); + ReceiveOrgMemberResponse result = new ReceiveOrgMemberResponse(); + try{ +// 根据泛微流程ID获取泛微流程数据 + result = getReceiveOrgDepartmentService().updateDepartmentSpanAccount(params); + if(result.isSuccess()) { + return success(result.getData()); + }else { + return fail(result.getMsg()); + } + } catch (Exception e) { + e.printStackTrace(); + return fail(e.getMessage()); + } + } + + @POST + @Path("/updateDepartmentMain") + @Produces({"application/json"}) + @Consumes({"application/json"}) + public Response updateDepartmentMain(JSONObject params){ + log.info("新建部门参数:"+params); + ReceiveOrgMemberResponse result = new ReceiveOrgMemberResponse(); + try{ +// 根据泛微流程ID获取泛微流程数据 + result = getReceiveOrgDepartmentService().updateDepartmentMain(params); + if(result.isSuccess()) { + return success(result.getData()); + }else { + return fail(result.getMsg()); + } + } catch (Exception e) { + e.printStackTrace(); + return fail(e.getMessage()); + } + } + + @POST + @Path("/queryDepartmentMain") + @Produces({"application/json"}) + @Consumes({"application/json"}) + public Response queryDepartmentMain(JSONObject params){ + log.info("查询部门参数:"+params); + ReceiveOrgMemberResponse result = new ReceiveOrgMemberResponse(); + try{ +// 根据泛微流程ID获取泛微流程数据 + result = getReceiveOrgDepartmentService().queryDepartmentMain(params); + if(result.isSuccess()) { + return success(result.getData()); + }else { + return fail(result.getMsg()); + } + } catch (Exception e) { + e.printStackTrace(); + return fail(e.getMessage()); + } + } + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/ctp/rest/resources/SaveAndUpdateMemberMainResource.java b/v5/apps-customize/src/main/java/com/seeyon/ctp/rest/resources/SaveAndUpdateMemberMainResource.java new file mode 100644 index 0000000..46cd9f8 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/ctp/rest/resources/SaveAndUpdateMemberMainResource.java @@ -0,0 +1,145 @@ +package com.seeyon.ctp.rest.resources; + +import cn.hutool.log.Log; +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.src_mainorganization.bo.ReceiveOrgMemberResponse; +import com.seeyon.apps.src_mainorganization.service.IReceiveOrgMemberService; +import com.seeyon.apps.src_receiveFVFlow.service.IReceiveFVFlowService; +import com.seeyon.apps.src_receiveFVFlow.vo.ReceiveFVFlowResponse; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.v3x.dee.util.DateUtil; +import org.apache.commons.io.FileUtils; + +import javax.ws.rs.Consumes; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.Response; +import java.io.File; +import java.io.IOException; +import java.util.Date; + + +/** + * @author huangzhengguo: + * @version 创建时间:2025年04月16日 + * 类说明 根据接收消息新增或者修改组织架构信息 + */ +@Path("/orgMember") +@Produces({"application/json", "application/xml"}) +public class SaveAndUpdateMemberMainResource extends BaseResource{ + + private static final Log log = Log.get(SaveAndUpdateMemberMainResource.class); + + private IReceiveOrgMemberService receiveOrgMemberService; + + public IReceiveOrgMemberService getReceiveOrgMemberService() { + if (this.receiveOrgMemberService == null) { + this.receiveOrgMemberService = ((IReceiveOrgMemberService) AppContext.getBean("receiveOrgMemberService")); + } + return receiveOrgMemberService; + } + public void setReceiveOrgMemberService(IReceiveOrgMemberService receiveOrgMemberService) { + this.receiveOrgMemberService = receiveOrgMemberService; + } + + @POST + @Path("/saveMemberMain") + @Produces({"application/json"}) + @Consumes({"application/json"}) + public Response saveMemberMain(JSONObject params){ + log.info("新建人员参数:"+params); + ReceiveOrgMemberResponse result = new ReceiveOrgMemberResponse(); + try{ +// 根据泛微流程ID获取泛微流程数据 + result = getReceiveOrgMemberService().saveMemberMain(params); + if(result.isSuccess()) { + return success(result.getData()); + }else { + return fail(result.getMsg()); + } + } catch (Exception e) { + e.printStackTrace(); + return fail(e.getMessage()); + } + } + + + @POST + @Path("/updateMemberMain") + @Produces({"application/json"}) + @Consumes({"application/json"}) + public Response updateMemberMain(JSONObject params){ + log.info("修改人员参数:"+params); + ReceiveOrgMemberResponse result = new ReceiveOrgMemberResponse(); + try{ +// 根据泛微流程ID获取泛微流程数据 + result = getReceiveOrgMemberService().updateMemberMain(params); + if(result.isSuccess()) { + return success(result.getData()); + }else { + return fail(result.getMsg()); + } + } catch (Exception e) { + e.printStackTrace(); + return fail(e.getMessage()); + } + } + + /** + * 调用接口查询指定单位下所有人员 + * @param params + * @return + * @throws IOException + */ + @POST + @Path("/queryMemberMain") + @Produces({"application/json"}) + @Consumes({"application/json"}) + public Response queryMemberMain(JSONObject params){ + log.info("查询人员参数:"+params); + ReceiveOrgMemberResponse result = new ReceiveOrgMemberResponse(); + try{ +// 根据泛微流程ID获取泛微流程数据 + result = getReceiveOrgMemberService().queryMemberMain(params); + if(result.isSuccess()) { + return success(result.getData()); + }else { + return fail(result.getMsg()); + } + } catch (Exception e) { + e.printStackTrace(); + return fail(e.getMessage()); + } + } + + + /** + * 调用接口查询指定单位下所有人员 + * @param params + * @return + * @throws IOException + */ + @POST + @Path("/queryFHMemberMain") + @Produces({"application/json"}) + @Consumes({"application/json"}) + public Response queryFHMemberMain(JSONObject params){ + log.info("查询人员参数:"+params); + ReceiveOrgMemberResponse result = new ReceiveOrgMemberResponse(); + try{ +// 根据泛微流程ID获取泛微流程数据 + result = getReceiveOrgMemberService().queryFHMemberMain(params); + if(result.isSuccess()) { + return success(result.getData()); + }else { + return fail(result.getMsg()); + } + } catch (Exception e) { + e.printStackTrace(); + return fail(e.getMessage()); + } + } + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/ctp/rest/resources/SrcCustomerMainResource.java b/v5/apps-customize/src/main/java/com/seeyon/ctp/rest/resources/SrcCustomerMainResource.java new file mode 100644 index 0000000..38f9f3b --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/ctp/rest/resources/SrcCustomerMainResource.java @@ -0,0 +1,69 @@ +package com.seeyon.ctp.rest.resources; + +import cn.hutool.log.Log; +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.src_mainorganization.bo.ReceiveOrgMemberResponse; +import com.seeyon.apps.src_mainorganization.service.IReceiveOrgMemberService; +import com.seeyon.apps.src_mainorganization.service.IReceiveSrcCustomerService; +import com.seeyon.ctp.common.AppContext; + +import javax.ws.rs.Consumes; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.Response; +import java.io.IOException; + + +/** + * @author huangzhengguo: + * @version 创建时间:2025年04月16日 + * 类说明 根据接收消息操作客户信息 + */ +@Path("/srcCustomer") +@Produces({"application/json", "application/xml"}) +public class SrcCustomerMainResource extends BaseResource{ + + private static final Log log = Log.get(SrcCustomerMainResource.class); + + private IReceiveSrcCustomerService receiveSrcCustomerService; + + public IReceiveSrcCustomerService getReceiveSrcCustomerService() { + if (this.receiveSrcCustomerService == null) { + this.receiveSrcCustomerService = ((IReceiveSrcCustomerService) AppContext.getBean("receiveSrcCustomerService")); + } + return receiveSrcCustomerService; + } + public void setReceiveSrcCustomerService(IReceiveSrcCustomerService receiveSrcCustomerService) { + this.receiveSrcCustomerService = receiveSrcCustomerService; + } + + /** + * 调用接口查询客户信息下所有人员 + * @param params + * @return + * @throws IOException + */ + @POST + @Path("/queryCustomerMain") + @Produces({"application/json"}) + @Consumes({"application/json"}) + public Response queryCustomerMain(JSONObject params) { + log.info("查询客户参数:"+params); + ReceiveOrgMemberResponse result = new ReceiveOrgMemberResponse(); + try{ +// 根据泛微流程ID获取泛微流程数据 + result = getReceiveSrcCustomerService().queryCustomerMain(params); + if(result.isSuccess()) { + return success(result.getData()); + }else { + return fail(result.getMsg()); + } + } catch (Exception e) { + e.printStackTrace(); + return fail(e.getMessage()); + } + } + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/ctp/rest/resources/SrcMemberFormTableResource.java b/v5/apps-customize/src/main/java/com/seeyon/ctp/rest/resources/SrcMemberFormTableResource.java new file mode 100644 index 0000000..82a87c5 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/ctp/rest/resources/SrcMemberFormTableResource.java @@ -0,0 +1,66 @@ +package com.seeyon.ctp.rest.resources; + +import cn.hutool.log.Log; +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.src_mainorganization.bo.ReceiveOrgMemberResponse; +import com.seeyon.apps.src_mainorganization.service.IReceiveOrgMemberService; +import com.seeyon.apps.src_mainorganization.service.ISrcMemberFormTableService; +import com.seeyon.ctp.common.AppContext; + +import javax.ws.rs.Consumes; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.Response; +import java.io.IOException; + +/** + * @author huangzhengguo: + * @version 创建时间:2025年04月16日 + * 类说明 根据接收消息新增或者修改组织架构信息 + */ +@Path("/srcMemberFormTable") +@Produces({"application/json", "application/xml"}) +public class SrcMemberFormTableResource extends BaseResource { + + private static final Log log = Log.get(SrcMemberFormTableResource.class); + + private ISrcMemberFormTableService srcMemberFormTableService; + public ISrcMemberFormTableService getSrcMemberFormTableService() { + if (this.srcMemberFormTableService == null) { + this.srcMemberFormTableService = ((ISrcMemberFormTableService) AppContext.getBean("srcMemberFormTableService")); + } + return srcMemberFormTableService; + } + public void setSrcMemberFormTableService(ISrcMemberFormTableService srcMemberFormTableService) { + this.srcMemberFormTableService = srcMemberFormTableService; + } + + + /** + * 调用接口根据人员组织架构信息补充人员档案信息 + * @return + * @throws IOException + */ + @POST + @Path("/saveMemberFormTableMain") + @Produces({"application/json"}) + @Consumes({"application/json"}) + public Response saveMemberFormTableMain(){ + log.info("生成人员档案表"); + ReceiveOrgMemberResponse result = new ReceiveOrgMemberResponse(); + try{ +// 根据泛微流程ID获取泛微流程数据 + result = getSrcMemberFormTableService().saveMemberFormTableMain(); + if(result.isSuccess()) { + return success(result.getData()); + }else { + return fail(result.getMsg()); + } + } catch (Exception e) { + e.printStackTrace(); + return fail(e.getMessage()); + } + } + +} diff --git a/v5/apps-customize/src/main/resources/needless_check_login.xml b/v5/apps-customize/src/main/resources/needless_check_login.xml new file mode 100644 index 0000000..97114bc --- /dev/null +++ b/v5/apps-customize/src/main/resources/needless_check_login.xml @@ -0,0 +1,322 @@ + + + + /qrCodeForm.do + + index + newMain + + + + /sc.do + + qr + + + + /elearning.do + + error + m3Redirect + message + pcRedirect + + + + /phoneLogin/phoneLogin.do + + getMessageCode + validateMessageCode + + + + /wechat/miniprogram.do + + a8home + bind + bindMemberPhone + login + unbind + + + + /portal/spaceController.do + + showThemSpace + + + + /identification.do + + getSessionId + + + + /fileUpload.do + + showRTE + + + + /fileDownload.do + + showRTE + + + + /form/formUpgrade.do + + toUpgrade + upgrade + viewUpgrade + + + + formtalkFormMapperController.do + + importFormtalkData + + + + /thirdpartyController.do + + access + index + logoutNotify + show + mailAuth + + + + /main.do + + changeLocale + hangup + headerjs + index + login + login4Ucpc + login4Ucpc3 + login4Vjoin + logout + logout4Session + logout4Vjoin + logout4ZX + main + login4QrCode + qrCodeHelp + updateLoginSeed + + + + /trustdo/A8/XRD.do + + getLoginAccount + getLoginAcctoken + webLogin + + + + /share.do + + index + + + + /genericController.do + + index + + + + /edoc/edocUpgradeControllor.do + + upgrade + download + + + + /uploadService.do + + processUploadService + + + + /autoinstall.do + + ieSetDown + regInstallDown + regInstallDown64 + downloadAssistant + + + + /personalBind.do + + getBindTypeByLoginName + isCanUse + retrievePassword + sendVerificationCodeToBindEmail + sendVerificationCodeToBindNum + validateVerificationCode + + + + + + + + + + + /commonimage.do + + showImage + + + + /individualManager.do + + resetPassword + + + + /wechat/dingding.do + + binding + index + main + newIndex + newMain + viewh5Message + + + + /uc/rest.do + + commonPierce + downloadImage + getBgTimeStamp + getLoginsecurityMsg + sendsms + smsrequired + testIp + isQrLogin + getDigitalCodeInfo + + + + portalManager + + sendSMSLoginCode + smsLoginEnabled + + + + loginUserManager + + getLockTime + + + + qrCodeLoginManager + + isLogin + + + + meetingAjaxManager + + meetingPanelData + meetingPanelDisplay + + + + /m3/loginController.do + + transLogin + transLogout + getProfile + + + + /m3/mClientBindController.do + + bindApply + + + + m3ProductManager + + productInfo + productStatus + + + + /m3/homeSkinController.do + + downloadImage + getSkinImageUrl + + + + /m3/transModeController.do + + getTransModeForMobile + + + + /media/media.do + + mediaShow + + + + /ocipEdoc.do + + index + + + + /colView.do + + index + + + + /caAccountManagerController.do + + findKeyNumByLoginName + + + + /fddCallbackController.do + + asynch + synch + + + + /seeyonReport/seeyonReportController.do + + redirectSeeyonReport + + + + /imc.do + + index + logout + + + + + /cloudbuild.do + + download + getDownloadPageInfo + getLatestVersionInfo + getDownloadQrUrl + + + \ No newline at end of file diff --git a/v5/apps-customize/src/main/resources/needless_check_login_recheck.xml b/v5/apps-customize/src/main/resources/needless_check_login_recheck.xml new file mode 100644 index 0000000..0e84aeb --- /dev/null +++ b/v5/apps-customize/src/main/resources/needless_check_login_recheck.xml @@ -0,0 +1,426 @@ + + + + + + /qrCodeForm.do + com.seeyon.apps.qrCodeForm.controller.QrCodeFormController + + index + newMain + + + + + /sc.do + com.seeyon.cap4.form.modules.smartCode.controller.SmartCodeController + + qr + + + + /media/media.do + com.seeyon.ctp.common.media.controller.MediaController + + mediaShow + + + + /phoneLogin/phoneLogin.do + com.seeyon.ctp.login.controller.PhoneLoginController + + getMessageCode + validateMessageCode + + + + portalManager + com.seeyon.ctp.portal.manager.PortalManagerImpl + + sendSMSLoginCode + smsLoginEnabled + + + + /fileDownload.do + com.seeyon.ctp.common.fileupload.FileUploadController + + showRTE + + + + loginUserManager + com.seeyon.ctp.login.LoginUserManagerImpl + + getLockTime + + + + /main.do + com.seeyon.ctp.login.controller.MainController + + changeLocale + hangup + headerjs + index + login + login4Ucpc + login4Ucpc3 + login4Vjoin + logout + logout4Session + logout4Vjoin + logout4ZX + main + login4QrCode + qrCodeHelp + updateLoginSeed + + + + /trustdo/A8/XRD.do + com.seeyon.apps.trustdo.controller.XRDController + + getLoginAccount + getLoginAcctoken + webLogin + + + + /share.do + com.seeyon.v3x.system.share.controller.ShareController + + index + + + + /edoc/edocUpgradeControllor.do + com.seeyon.v3x.edoc.controller.EdocUpgradeControllor + + upgrade + download + + + + /m3/mClientBindController.do + com.seeyon.apps.m3.bind.controller.M3ClientBindController + + bindApply + + + + /uploadService.do + com.seeyon.ctp.services.FileUploadService + + processUploadService + + + + /uc/rest.do + com.seeyon.apps.zx.controller.ZxRestController + + commonPierce + downloadImage + getBgTimeStamp + getLoginsecurityMsg + sendsms + smsrequired + testIp + isQrLogin + getDigitalCodeInfo + + + + /m3/homeSkinController.do + com.seeyon.apps.m3.skin.controller.M3HomeSkinController + + downloadImage + getSkinImageUrl + + + + /colView.do + com.seeyon.apps.ocip.exchange.collaboration.controller.CollViewController + + index + + + + /autoinstall.do + com.seeyon.apps.autoinstall.controller.AutoInstallController + + ieSetDown + regInstallDown + regInstallDown64 + downloadAssistant + + + + + + + + + + + + /caAccountManagerController.do + com.seeyon.v3x.ca.caaccount.controller.CAAccountManagerController + + findKeyNumByLoginName + + + + /elearning.do + com.seeyon.apps.elearning.controller.ElearningController + + error + m3Redirect + message + pcRedirect + + + + /wechat/miniprogram.do + com.seeyon.apps.weixin.controller.MiniProgramController + + a8home + bind + bindMemberPhone + login + unbind + + + + /portal/spaceController.do + com.seeyon.ctp.portal.space.controller.SpaceController + + showThemSpace + + + + /identification.do + com.seeyon.v3x.identification.controller.IdentificationController + + getSessionId + + + + /fddCallbackController.do + com.seeyon.apps.econtract.fdd.controller.FddCallbackController + + asynch + synch + + + + m3ProductManager + com.seeyon.apps.m3.product.manager.impl.M3ProductManagerImpl + + productInfo + productStatus + + + + /ocipEdoc.do + com.seeyon.apps.ocip.exchange.edoc.OCIPEdocController + + index + + + + /m3/loginController.do + + transLogin + transLogout + getProfile + + + + /fileUpload.do + com.seeyon.ctp.common.fileupload.FileUploadController + + showRTE + processUpload + + + + qrCodeLoginManager + com.seeyon.ctp.login.manager.QrCodeLoginManagerImpl + + isLogin + + + + /form/formUpgrade.do + com.seeyon.ctp.form.service.FormUpgradeController + + toUpgrade + upgrade + viewUpgrade + + + + /seeyonReport/seeyonReportController.do + com.seeyon.apps.seeyonreport.controller.SeeyonReportController + + redirectSeeyonReport + + + + formtalkFormMapperController.do + com.seeyon.apps.formtalk.controller.FormtalkImportController + + importFormtalkData + + + + /thirdpartyController.do + com.seeyon.ctp.portal.sso.thirdpartyintegration.controller.ThirdpartyController + + access + index + logoutNotify + show + mailAuth + + + + /m3/transModeController.do + com.seeyon.apps.m3.transmissionmode.controller.M3TransModeController + + getTransModeForMobile + + + + /genericController.do + com.seeyon.v3x.common.controller.GenericController + + index + + + + /personalBind.do + com.seeyon.v3x.personalaffair.controller.PersonalBindController + + getBindTypeByLoginName + isCanUse + retrievePassword + sendVerificationCodeToBindEmail + sendVerificationCodeToBindNum + validateVerificationCode + + + + /commonimage.do + com.seeyon.apps.common.image.controller.ImageController + + showImage + + + + /individualManager.do + com.seeyon.v3x.personalaffair.controller.IndividualManagerController + + resetPassword + + + + meetingAjaxManager + com.seeyon.apps.meeting.manager.MeetingAjaxManagerImpl + + meetingPanelData + meetingPanelDisplay + + + + /wechat/dingding.do + com.seeyon.apps.weixin.controller.DingDingController + + binding + index + main + newIndex + newMain + viewh5Message + + + + /imc.do + com.seeyon.apps.imc.controller.ImcLoginController + + index + logout + + + + /wechat/feishu.do + com.seeyon.apps.weixin.controller.FeishuController + + newMain + viewh5Message + + + + + + + + + + + + + + + /wechat/pcapp.do + com.seeyon.apps.weixin.controller.PcAppController + + transferPageFromWxCoreServer + gotoPcApp + checkCodeTurnToRightPage + transfer + transferMsg + + + + /wechat/feishu/approvalData.do + com.seeyon.apps.zhifei.feishu.approval.controller.ApprovalDataController + + index + + + + /zhifei/feishu.do + com.seeyon.apps.zhifei.controller.FeishuController + + newMain + viewh5Message + + + + /zhifei/pcapp.do + com.seeyon.apps.zhifei.controller.ZhifeiPcAppController + + transferPageFromWxCoreServer + gotoPcApp + + + + /zhifei/feishu/approvalData.do + com.seeyon.apps.zhifei.feishu.approval.controller.ApprovalDataController + + index + + + + /cloudbuild.do + com.seeyon.apps.cloudbuild.controller.CloudBuildController + + download + getDownloadPageInfo + getLatestVersionInfo + getDownloadQrUrl + + + diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/qrCodeForm/pluginCfg.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/qrCodeForm/pluginCfg.xml new file mode 100644 index 0000000..c12ee18 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/qrCodeForm/pluginCfg.xml @@ -0,0 +1,6 @@ + + + qrCodeForm + 二维码扫码填单 + 20220422 + diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/qrCodeForm/spring/spring-qrCodeForm-controller.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/qrCodeForm/spring/spring-qrCodeForm-controller.xml new file mode 100644 index 0000000..93d89e1 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/qrCodeForm/spring/spring-qrCodeForm-controller.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/qrCodeForm/spring/spring-qrCodeForm-manager.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/qrCodeForm/spring/spring-qrCodeForm-manager.xml new file mode 100644 index 0000000..7d6233b --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/qrCodeForm/spring/spring-qrCodeForm-manager.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/qrCodeForm/spring/spring-qrCodeForm-plugin.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/qrCodeForm/spring/spring-qrCodeForm-plugin.xml new file mode 100644 index 0000000..de1e69f --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/qrCodeForm/spring/spring-qrCodeForm-plugin.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_mainorganization/pluginCfg.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_mainorganization/pluginCfg.xml new file mode 100644 index 0000000..a5fce69 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_mainorganization/pluginCfg.xml @@ -0,0 +1,6 @@ + + + src_mainorganization + 稻花香主数据同步 + 20241220 + \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_mainorganization/spring/spring-controller.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_mainorganization/spring/spring-controller.xml new file mode 100644 index 0000000..082e02d --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_mainorganization/spring/spring-controller.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_mainorganization/spring/spring-dao.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_mainorganization/spring/spring-dao.xml new file mode 100644 index 0000000..d088d3b --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_mainorganization/spring/spring-dao.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_mainorganization/spring/spring-fieldCtrl.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_mainorganization/spring/spring-fieldCtrl.xml new file mode 100644 index 0000000..2b0f3c0 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_mainorganization/spring/spring-fieldCtrl.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_mainorganization/spring/spring-node.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_mainorganization/spring/spring-node.xml new file mode 100644 index 0000000..d83cc64 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_mainorganization/spring/spring-node.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_mainorganization/spring/spring-quartz.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_mainorganization/spring/spring-quartz.xml new file mode 100644 index 0000000..0d8e0cc --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_mainorganization/spring/spring-quartz.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_mainorganization/spring/spring-server.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_mainorganization/spring/spring-server.xml new file mode 100644 index 0000000..987fa82 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_mainorganization/spring/spring-server.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_mainorganization/spring/spring-service.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_mainorganization/spring/spring-service.xml new file mode 100644 index 0000000..d878208 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_mainorganization/spring/spring-service.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_mainorganization/spring/spring.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_mainorganization/spring/spring.xml new file mode 100644 index 0000000..84d9063 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_mainorganization/spring/spring.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_quartformtable/pluginCfg.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_quartformtable/pluginCfg.xml new file mode 100644 index 0000000..a392322 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_quartformtable/pluginCfg.xml @@ -0,0 +1,6 @@ + + + src_quartformtable + 数据库表查询辅助管理 + 20250318 + \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_quartformtable/spring/spring-dao.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_quartformtable/spring/spring-dao.xml new file mode 100644 index 0000000..6cd2fb6 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_quartformtable/spring/spring-dao.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_receiveFVFlow/pluginCfg.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_receiveFVFlow/pluginCfg.xml new file mode 100644 index 0000000..5d0f405 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_receiveFVFlow/pluginCfg.xml @@ -0,0 +1,6 @@ + + + src_receiveFVFlow + 客户服务平台数据传递管理 + 20250212 + \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_receiveFVFlow/spring/spring-dao.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_receiveFVFlow/spring/spring-dao.xml new file mode 100644 index 0000000..e282573 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_receiveFVFlow/spring/spring-dao.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_receiveFVFlow/spring/spring-service.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_receiveFVFlow/spring/spring-service.xml new file mode 100644 index 0000000..ba7317d --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_receiveFVFlow/spring/spring-service.xml @@ -0,0 +1,14 @@ + + + + + + + \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_test/pluginCfg.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_test/pluginCfg.xml new file mode 100644 index 0000000..a798d9b --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_test/pluginCfg.xml @@ -0,0 +1,6 @@ + + + src_test + 稻花香断点测试超级节点 + 20241121 + \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_test/spring/spring-node.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_test/spring/spring-node.xml new file mode 100644 index 0000000..bb269f8 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_test/spring/spring-node.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/jsp/plugin/qrCodeForm/qrCodeFormIndex.jsp b/v5/apps-customize/src/main/webapp/WEB-INF/jsp/plugin/qrCodeForm/qrCodeFormIndex.jsp new file mode 100644 index 0000000..0f620b0 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/jsp/plugin/qrCodeForm/qrCodeFormIndex.jsp @@ -0,0 +1,249 @@ +<%@ page contentType="text/html; charset=UTF-8" isELIgnored="false" %> +<%@ page language="java" import=" com.seeyon.apps.m3.skin.enums.M3StartPageCustomEnum" %> + + + + + <%@ include file="/WEB-INF/jsp/common/common.jsp" %> + 模板二维码生成 + + + + + +
+ + + + + + + + \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/apps_res/cap/customCtrlResources/synchronizationBtnResources/css/formQueryBtn.css b/v5/apps-customize/src/main/webapp/apps_res/cap/customCtrlResources/synchronizationBtnResources/css/formQueryBtn.css new file mode 100644 index 0000000..ae96722 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/apps_res/cap/customCtrlResources/synchronizationBtnResources/css/formQueryBtn.css @@ -0,0 +1,27 @@ +.customButton_class_box { + width: 100%; + line-height: 24px; + height:24px; + color: #1f85ec; + cursor: pointer; + font-family: "Microsoft YaHei"!important; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + word-break:keep-all; +} +.customButton_box_content{ + width: 100%; + height: 24px; + box-sizing: border-box; + -webkit-box-sizing : border-box; + -moz-box-sizing : border-box; + text-align: center; + outline: none; + border: 1px solid #1f85ec; + background-color: #fff; + border-radius: 15px; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; +} + diff --git a/v5/apps-customize/src/main/webapp/apps_res/cap/customCtrlResources/synchronizationBtnResources/css/img/icon16.png b/v5/apps-customize/src/main/webapp/apps_res/cap/customCtrlResources/synchronizationBtnResources/css/img/icon16.png new file mode 100644 index 0000000000000000000000000000000000000000..e43def3b7a2d46b32ea439d5f5e133a03204e1f6 GIT binary patch literal 103273 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 z zX72LN*Y>(-sf`uxb$Cy&@}jV%{({3fhC*;^4zcYX2<iCqI=~=B9GG9<8N5TU4}5*y3ev8B3f?QF44_7Q zC9hLMT&}9>h*R`kO|K97JjPD)o!93h{=JhIV*XTPRf+-c=u>?)EolTjdtp8+-${P7 z@@ZabVvqx@pzcZ@#J|63VW28hG4}wLq@-SX(bBKyEa`OhRhRwQ=bFxc;hCEJsPY2M-f7hn$A*Qv6qdzY1Ku~{=DVw%vB8QC zk*YGYsc2jPr5n$*p}2~bpI1D}pZL$}5}5r5cmR?mPaQvlGo!2X| zg*fvReb=H~|0G)O^Zly-N;K`y<1bhjRCOM%o2T$BjQ3ANlVX&IawzEu302MM@q-8h zt%g5a@ZqK$^0ld5PJT6KY1wP9>T=?XIZMvR6DZfEc3J-A>?P%TWnXI=dBp* z!s;gblAJEG^U(?)mq6@4MF9k-+sZ`1z8TlQ#7$|q>2`&}_(I%;AnAkx8&^rIFkX46aa;y(PSo0Q&M$i_k4xTG0XWFr|TQ7y>P>2iN~c*RO0YE zvUM0q80YD_eg;}@vk|}hB6!o(LZ8}Lk|46!a`ssQm-e{w3_-u&4?aav{dhn;Zfl6g zwo~-F@x6ryKuRD3t^MRaS9QtcZDkPrGtbmUL{UBn?B9T%%-t!}NY}TJ6YQ!VkKo->SsJ_} z267#X@EoV~`fp7L=tTmk>8^=HRUh!hDak1W^fobzk#>j_QHIBml77za`dzzr%@P0> zLFnh{kgfboV^A585*&q!K}*ko>&dJbXpF#TxZM&w5!`=9&~M4cPjeHX{TBD1kH?9S z+#^gW$x%gdZY*>z3tZN$e&`;>8|uR)Q2B46fJ#Ij?Q52z*^M$1KPisAZxL=KqU%di z)a$zv9q4%iYY)v*hhUwpXv;PdOiX@MQKsL z6?GQ(!Sx?liP7j|>hqusu3tEv3&EZGuUa6`Q@U>v^l(!03gvd&4)ie50#?P8!-qP6 zKQNq@2DK5b+L$f*I7zvvnz1lc$&|cKI@b=|R*5|tpTVQZL&cz{l2DWt`FZ(!>OOx| z9zC=T7gii9KDR2Ou>g-%P?nb<&FPntY@j9b{~|OMV=aech|20$#B)$gd~K_p2>Jx9 z6ta0gTkr&^GzT+{U->YSTtIe$O2TY2DWV5WwmoE`Y-ptK*ZA{N_9W!zyoTu{vyR*Y zr~qmR9BKH{@tX2ZpI5nBRa9-bCwhkO#Cg=9`LDN(tgsJ?xf8lXN)$kel*s?Jm?!{J zIy4B96piRWrh#fi36X32cZdQgk$= 41) || (x64)) return true; + } else if (verOPR) { + verOPR = verOPR[0].match(/\d+/); + if (verOPR[0] >= 32) return true; + } else if ((!verTrident) && (!verIE)) { + var verChrome = ua.match(/Chrome\D?\d+/i); + if (verChrome) { + verChrome = verChrome[0].match(/\d+/); + if (verChrome[0] >= 41) return true; + } + } + return false; + } catch (err) { + return true; + } +} + +//==检查加载成功与否,如没成功则用http(s)再试== +//==低版本CLODOP6.561/Lodop7.043及前)用本方法== +function checkOrTryHttp() { + if (window.getCLodop) { + LoadJsState = "complete"; + return true; + } + if (LoadJsState == "loadingB" || LoadJsState == "complete") return; + LoadJsState = "loadingB"; + var head = document.head || document.getElementsByTagName("head")[0] || document.documentElement; + var JS1 = document.createElement("script") + ,JS2 = document.createElement("script") + ,JS3 = document.createElement("script"); + JS1.src = URL_HTTP1; + JS2.src = URL_HTTP2; + JS3.src = URL_HTTP3; + JS1.onload = JS2.onload = JS3.onload = JS2.onerror = JS3.onerror=function(){LoadJsState = "complete";} + JS1.onerror = function(e) { + if (window.location.protocol !== 'https:') + head.insertBefore(JS2, head.firstChild); else + head.insertBefore(JS3, head.firstChild); + } + head.insertBefore(JS1,head.firstChild); +} + +//==加载Lodop对象的主过程:== +(function loadCLodop(){ + if (!needCLodop()) return; + CLodopIsLocal = !!((URL_WS1 + URL_WS2).match(/\/\/localho|\/\/127.0.0./i)); + LoadJsState = "loadingA"; + if (!window.WebSocket && window.MozWebSocket) window.WebSocket=window.MozWebSocket; + //ws方式速度快(小于200ms)且可避免CORS错误,但要求Lodop版本足够新: + try { + var WSK1=new WebSocket(URL_WS1); + WSK1.onopen = function(e) { setTimeout("checkOrTryHttp();",200); } + WSK1.onmessage = function(e) {if (!window.getCLodop) eval(e.data);} + WSK1.onerror = function(e) { + var WSK2=new WebSocket(URL_WS2); + WSK2.onopen = function(e) {setTimeout("checkOrTryHttp();",200);} + WSK2.onmessage = function(e) {if (!window.getCLodop) eval(e.data);} + WSK2.onerror= function(e) {checkOrTryHttp();} + } + } catch(e){ + checkOrTryHttp(); + } +})(); + +//==获取LODOP对象主过程,判断是否安装、需否升级:== +function getLodop(oOBJECT, oEMBED) { + var strFontTag = "
打印控件"; + var strLodopInstall = strFontTag + "未安装!点击这里执行安装"; + var strLodopUpdate = strFontTag + "需要升级!点击这里执行升级"; + var strLodop64Install = strFontTag + "未安装!点击这里执行安装"; + var strLodop64Update = strFontTag + "需要升级!点击这里执行升级"; + var strCLodopInstallA = "
Web打印服务CLodop未安装启动,点击这里下载执行安装"; + var strCLodopInstallB = "
(若此前已安装过,可点这里直接再次启动)"; + var strCLodopUpdate = "
Web打印服务CLodop需升级!点击这里执行升级"; + var strLodop7FontTag = "
Web打印服务Lodop7"; + var strLodop7HrefX86 = "点击这里下载安装(下载后解压,点击lodop文件开始执行)"; + var strLodop7HrefARM = "点击这里下载安装(下载后解压,点击lodop文件开始执行)"; + var strLodop7Install_X86 = strLodop7FontTag + "未安装启动," + strLodop7HrefX86; + var strLodop7Install_ARM = strLodop7FontTag + "未安装启动," + strLodop7HrefARM; + var strLodop7Update_X86 = strLodop7FontTag + "需升级," + strLodop7HrefX86; + var strLodop7Update_ARM = strLodop7FontTag + "需升级," + strLodop7HrefARM; + var strInstallOK = ",成功后请刷新本页面或重启浏览器。"; + var LODOP; + try { + var isWinIE = (/MSIE/i.test(navigator.userAgent)) || (/Trident/i.test(navigator.userAgent)); + var isWinIE64 = isWinIE && (/x64/i.test(navigator.userAgent)); + var isLinuxX86 = (/Linux/i.test(navigator.platform)) && (/x86/i.test(navigator.platform)); + var isLinuxARM = (/Linux/i.test(navigator.platform)) && (/aarch/i.test(navigator.platform)); + + if (needCLodop() || isLinuxX86 || isLinuxARM) { + try { + LODOP = window.getCLodop(); + } catch (err) {} + if (!LODOP && LoadJsState !== "complete") { + if (!LoadJsState) + alert("未曾加载Lodop主JS文件,请先调用loadCLodop过程."); else + alert("网页还没下载完毕,请稍等一下再操作."); + return; + } + var strAlertMessage; + if (!LODOP) { + if (isLinuxX86) + strAlertMessage = strLodop7Install_X86; + else if (isLinuxARM) + strAlertMessage = strLodop7Install_ARM; + else + strAlertMessage = strCLodopInstallA + (CLodopIsLocal ? strCLodopInstallB : ""); + document.body.innerHTML = strAlertMessage + strInstallOK + document.body.innerHTML; + return; + } else { + if (isLinuxX86 && LODOP.CVERSION < "7.0.4.3") + strAlertMessage = strLodop7Update_X86; + else if (isLinuxARM && LODOP.CVERSION < "7.0.4.3") + strAlertMessage = strLodop7Update_ARM; + else if (CLODOP.CVERSION < "6.5.7.1") + strAlertMessage = strCLodopUpdate; + + if (strAlertMessage) + document.body.innerHTML = strAlertMessage + strInstallOK + document.body.innerHTML; + } + } else { + //==如果页面有Lodop插件就直接使用,否则新建:== + if (oOBJECT || oEMBED) { + if (isWinIE) + LODOP = oOBJECT; + else + LODOP = oEMBED; + } else if (!CreatedOKLodopObject) { + LODOP = document.createElement("object"); + LODOP.setAttribute("width", 0); + LODOP.setAttribute("height", 0); + LODOP.setAttribute("style", "position:absolute;left:0px;top:-100px;width:0px;height:0px;"); + if (isWinIE) + LODOP.setAttribute("classid", "clsid:2105C259-1E0C-4534-8141-A753534CB4CA"); + else + LODOP.setAttribute("type", "application/x-print-lodop"); + document.documentElement.appendChild(LODOP); + CreatedOKLodopObject = LODOP; + } else + LODOP = CreatedOKLodopObject; + //==Lodop插件未安装时提示下载地址:== + if ((!LODOP) || (!LODOP.VERSION)) { + document.body.innerHTML = (isWinIE64 ? strLodop64Install : strLodopInstall) + strInstallOK + document.body.innerHTML; + return LODOP; + } + if (LODOP.VERSION < "6.2.2.6") { + document.body.innerHTML = (isWinIE64 ? strLodop64Update : strLodopUpdate) + strInstallOK + document.body.innerHTML; + } + } + //===如下空白位置适合调用统一功能(如注册语句、语言选择等):======================= + + + //=============================================================================== + return LODOP; + } catch (err) { + alert("getLodop出错:" + err); + } +} + diff --git a/v5/apps-customize/src/main/webapp/apps_res/cap/customCtrlResources/synchronizationBtnResources/js/setTemplate.js b/v5/apps-customize/src/main/webapp/apps_res/cap/customCtrlResources/synchronizationBtnResources/js/setTemplate.js new file mode 100644 index 0000000..bc6bb40 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/apps_res/cap/customCtrlResources/synchronizationBtnResources/js/setTemplate.js @@ -0,0 +1,99 @@ +var unflowList, param, loading, process; +$(document).ready(function() { + param = initParam().params;// 获取页面参数 + // 处理进度条 + process = top.$.progressBar({ + text : "加载中..." + }); + loading = true; + getUnflowList(); +}); + + +// 获取底表 +function getUnflowList() { + $.ajax({ + url : "/seeyon/rest/cap4/unflow/select", + async : true, + success : function(data) { + // 处理进度条 + if (loading) + process.close(); + loading = false; + //data = JSON.parse(data); + var result = data.data; + unflowList = result; + for (var i = 0; i < result.length; i++) { + $("#queryList ul").append( + $("
  • " + + result[i].name + + "
  • ").attr("info", + JSON.stringify(result[i]))); + } + $("#queryList ul").delegate( + "li", + "click", + function() { + $(this).siblings().removeClass('active').end() + .addClass('active'); + }); + if (param && param.id) { // 激活当前项 + $('#' + param.id).trigger('click'); + } + } + }); +} + +// 搜索 +function search() { + var searchValue = $("#search_query").val(); + $("#queryList ul").empty(); + for (var i = 0; i < unflowList.length; i++) { + if (unflowList[i].name.indexOf(searchValue) != -1) { + $("#queryList ul").append( + $("
  • " + + unflowList[i].name + "
  • ").attr( + "info", JSON.stringify(unflowList[i]))); + } + } +} + +// 返回参数获取 +function getResult() { + return JSON.parse($("#queryList ul").find(".active").attr("info") + || "{}"); +} + +// --------------------以下为固定方法,需要实现返回参数获取-------------- + +// 获取弹窗传递过来的参数 +function initParam() { + var obj = window.parentDialogObj && (window.parentDialogObj["ctrlDialog"]);// 获取窗口对象 + if (obj && obj.getTransParams) { + // 然后通过V5方法获取弹窗传递过来的参数 + return obj.getTransParams(); + } +} + +// 确定按钮调用方法,返回需要的json数据 +function OK() { + var result = getResult(); + + if (param && param.designId !== result.designId) + return { + valid : true, + data : { + customParam : { + templateId : result, + mapping : null + } + } + }; + + return { + valid : true, + data : result + }; +} \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/apps_res/cap/customCtrlResources/synchronizationBtnResources/js/synchronization.js b/v5/apps-customize/src/main/webapp/apps_res/cap/customCtrlResources/synchronizationBtnResources/js/synchronization.js new file mode 100644 index 0000000..3a4d691 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/apps_res/cap/customCtrlResources/synchronizationBtnResources/js/synchronization.js @@ -0,0 +1,275 @@ +(function(_self, factory) { + var nameSpace = 'customBtn_8381906109546975519'; + if (!window[nameSpace] && typeof factory === 'function') { + var Builder = factory(); + window[nameSpace] = { + initBtn : {} + }; + /** + * 初始化方法 + */ + window[nameSpace].init = function(el, options) { + var identification = Math.floor(Math.round() * 10000000000) + .toString(); + window[nameSpace].initBtn[identification] = new Builder(el, + options, _self, identification); + } + } +}) +( + window, + function() { + /** + * js,css文件加载方法 + */ + var dynamicLoading = { + css : function(path, name, callBk) { + if (!path || path.length === 0) { + throw new Error('argument "path" is required !'); + } + var head = document.getElementsByTagName('head')[0]; + var link = document.createElement('link'); + link.href = path; + link.rel = 'stylesheet'; + link.type = 'text/css'; + link.setAttribute('data-name', name); + link.onload = function() { + callBk(); + } + head.appendChild(link); + }, + insertCss : function(innerTexts, name) { + var head = document.getElementsByTagName('head')[0]; + var style = document.createElement('style'); + style.type = 'text/css'; + style.setAttribute('data-name', name); + try { + style.appendChild(document + .createTextNode(innerTexts)); + } catch (ex) { + style.styleSheet.cssText = innerTexts;// 针对IE + } + head.appendChild(style); + }, + checkCss : function(name) { + var styleList = document + .getElementsByTagName('style'); + for (var i = 0; i < styleList.length; i++) { + if (styleList[i].getAttribute('data-name') === name) + return true; + } + return false; + }, + js : function(path, callBk) { + if (!path || path.length === 0) { + throw new Error('argument "path" is required !'); + } + var head = document.getElementsByTagName('head')[0]; + var script = document.createElement('script'); + script.src = path; + script.type = 'text/javascript'; + script.onload = function() { + callBk(); + } + head.appendChild(script); + }, + checkJs : function(name) { + var scriptList = document + .getElementsByTagName('script'); + for (var i = 0; i < scriptList.length; i++) { + if (scriptList[i].getAttribute('data-name') === name) + return true; + } + return false; + }, + } + /** + * 浏览器 + */ + function myBrowser() { + var userAgent = navigator.userAgent; // 取得浏览器的userAgent字符串 + var isOpera = userAgent.indexOf("Opera") > -1; + if (isOpera) { // 判断是否Opera浏览器 + return "Opera" + } + ; + if (userAgent.indexOf("Firefox") > -1) { // 判断是否Firefox浏览器 + return "FF"; + } + ; + if (userAgent.indexOf("Chrome") > -1) { + return "Chrome"; + } + ; + if (userAgent.indexOf("Safari") > -1) { // 判断是否Safari浏览器 + return "Safari"; + } + ; + if (userAgent.indexOf("compatible") > -1 + && userAgent.indexOf("MSIE") > -1 && !isOpera) { // 判断是否IE浏览器 + return "IE"; + } + ; + } + /** + * 定义标签打印按钮的构造函数 + * + * @param {*} + * options + * @param {*} + * _self + */ + function labelPrintingBtn(el, options, _self, + identification) { + var self = this; + self.window_self = _self; + self.el = el; + self.identification = identification; + // 解析传进来的数据 + self.initParams(options); + // 处理挂载 + self.initBtn(el); + // 销毁自己 + self.beforeDestroy = function() { + self = null; + } + } + /** + * 构造函数的原型方法 + */ + labelPrintingBtn.prototype = { + initParams : function(options) { + this.place = options.place; + this.rowData = options.rowData; + this.data = options.data; + }, + initBtn : function(el) { + /** + * 挂载dom初始化处理 + */ + var innerTexts = '.labelPrintingBtnHandler {' + + 'background-color: rgba(0,0,0,0);' + + 'font-family: "Ping Fang SC", "Microsoft YaHei", Arial, Helvetica, sans-serif, "SimSun";' + + 'cursor: pointer;' + + 'white-space : nowrap;' + + 'border: 0;' + + 'overflow: hidden;' + + 'text-overflow: ellipsis;' + + '}' + + '.labelPrintingBtnBox { box-sizing: border-box; cursor: pointer; outline: none; font-family: inherit; white-space: nowrap;display: inline-block; margin-top: 5px; vertical-align: middle; margin-right: 5px;' + + ' background-color: #fff; border: 1px solid #d4d4d4; color: #666;font-size: 14px; line-height: 28px; border-radius: 15px; height: 30px;}' + + '.labelPrintingBtnBox:hover{ border-color: #1f85ec; }' + + '.labelPrintingBtnRow{color: #1f85ec;}' + + '.labelPrintingBtnRow:hover{color : #479bf3}' + + '.labelPrintingBtnLi{color : #333}' + + '.labelPrintingBtnLi:hover{color : #fff}'; + if (!dynamicLoading.checkCss('labelPrintingBtn')) { + dynamicLoading.insertCss(innerTexts, + 'labelPrintingBtn'); + } + // 挂载dom + this.appendDom(el); + }, + appendDom : function(el) { + var self = this; + var labelPrint = document.createElement('div'), labelPrintToolbar, labelPrintIcon; + // 对代码片段进行配置 + el.appendChild(labelPrint); + // 根据不同位置渲染按钮 + switch (this.place) { + case 'toolbar': + labelPrint.parentNode.setAttribute('class', + 'labelPrintingBtnBox'); + labelPrint.style.padding = '0 14px'; + // 加入icon + labelPrintIcon = document.createElement('i'); + labelPrintIcon.setAttribute('class', + 'CAP cap-icon-dayin'); + labelPrintIcon.style.color = '#C3AF1C'; + labelPrint.appendChild(labelPrintIcon); + // 加入name信息 + labelPrintToolbar = document + .createElement('span'); + labelPrintToolbar.innerHTML = this.data + && this.data.name ? this.data.name : ''; + labelPrintToolbar.style.paddingLeft = '3px'; + labelPrint.appendChild(labelPrintToolbar); + break; + case 'li': + labelPrint.innerHTML = this.data + && this.data.name ? this.data.name : ''; + labelPrint + .setAttribute('class', + 'labelPrintingBtnLi labelPrintingBtnHandler') + break; + case 'row': + labelPrint.innerHTML = this.data + && this.data.name ? this.data.name : ''; + labelPrint + .setAttribute('class', + 'labelPrintingBtnRow labelPrintingBtnHandler') + break; + default: + } + labelPrint.onclick = function() { + switch (self.place) { + case 'toolbar': + // 点击执行对应的操作 + self.implementClick(); + break; + case 'li': + case 'row': + // 点击执行对应的操作 + self.implementClick(self.rowData); + break; + default: + } + + } + // 阻止数据污染 + labelPrint.parentNode.onclick = function(e) { + e.stopPropagation(); + } + }, + // 执行点击事件 + implementClick : function(rowData) { + var url2 = window.location.origin; + var result = confirm('是否执行同步!此操作位全量同步'); + if(result){ + $.ajax({ + //请求url + //url: 'http://127.0.0.1:8888/seeyon/servlet/partnersUnbindingServlet', + contentType:"application/json", + url: url2+'/seeyon/organizationFieldCtrlController.do', + //请求参数 + data: "", + //请求类型 + type: 'POST', + //响应体结果设置 + dataType: 'json', + //成功的回调函数 + success: function(data){ + alert("调用成功"); + }, + //失败的回调函数 + error: function(){ + alert("失败的回调"); + } + }); + this.handlerLogic(datas); + }else{ + + + } + + }, + // 点击逻辑执行 + handlerLogic : function(rowData) { + $.alert(JSON.stringify(rowData)); + } + }; + /** + * 返回值 + */ + return labelPrintingBtn; + }); \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/common/capextend/cap4/form/utils/qrcodeform/index.js b/v5/apps-customize/src/main/webapp/common/capextend/cap4/form/utils/qrcodeform/index.js new file mode 100644 index 0000000..ec27f89 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/common/capextend/cap4/form/utils/qrcodeform/index.js @@ -0,0 +1,13 @@ + +csdk.event.on('formRendered', function(){ + + try { + if(cmp.href.getParam().qc = "ext") { + document.getElementById("relationBtns").style.display="none"; + document.getElementById("attachment_wrap").style.display="none"; + } + } catch(e) { + + } + +}); diff --git a/v5/apps-customize/src/main/webapp/jsp/apps/src_mainorganization/businessStructureTree.jsp b/v5/apps-customize/src/main/webapp/jsp/apps/src_mainorganization/businessStructureTree.jsp new file mode 100644 index 0000000..cb4d3ac --- /dev/null +++ b/v5/apps-customize/src/main/webapp/jsp/apps/src_mainorganization/businessStructureTree.jsp @@ -0,0 +1,275 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8"%> +<%-- <%@ include file="/WEB-INF/jsp/common/INC/noCache.jsp"%> --%> +<%@ include file="/WEB-INF/jsp/common/common.jsp"%> +<%@ include file="/WEB-INF/jsp/ctp/form/common/common.js.jsp"%> + + + + 业务架构树 + + + +<%--
      --%> +
      +
      +
        +
        +
        +
        +
        +
        +
        +
        +
        +
        请点击左侧树节点查看人员信息
        +
        +
        +
        + + + \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/m3/apps/v5/capextend/cap4/form/utils/qrcodeform/index.js b/v5/apps-customize/src/main/webapp/m3/apps/v5/capextend/cap4/form/utils/qrcodeform/index.js new file mode 100644 index 0000000..bc09362 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/m3/apps/v5/capextend/cap4/form/utils/qrcodeform/index.js @@ -0,0 +1,11 @@ +document.addEventListener('cap_form_afterFormRender', function(evt) { + try { + if(cmp.href.getParam().qc == "ext") { + document.getElementById("relationBtns").style.display="none"; + document.getElementById("attachment_wrap").style.display="none"; + document.getElementsByClassName("cmp-button-left-iconContent btn-box2")[0].style.display="none"; + } + } catch(e) { + + } +}); \ No newline at end of file