From 4e764b6c0ab5a1eea86a1db7d3ec4644739deaf1 Mon Sep 17 00:00:00 2001 From: Hai Liang Wang Date: Fri, 1 Nov 2019 19:28:14 +0800 Subject: [PATCH] init new opensouce version code --- .gitignore | 4 + INTRODUCTION.md | 242 + LICENSE | 208 +- README.md | 254 +- cc-switch/.gitignore | 14 - cc-switch/README.md | 1 - cc-switch/admin/test.sh | 24 - cc-switch/app/Dockerfile | 14 - cc-switch/app/config/dev.env.sample | 7 - cc-switch/app/config/index.js | 42 - cc-switch/app/control.js | 81 - cc-switch/app/dialplan.js | 109 - cc-switch/app/engine.js | 60 - cc-switch/app/fs.js | 406 - cc-switch/app/index.js | 14 - cc-switch/app/minio.js | 12 - cc-switch/app/package.json | 26 - cc-switch/app/test/callout.answer.test.js | 47 - cc-switch/app/test/callout.hangup.test.js | 41 - contact-center/.dockerignore | 3 +- contact-center/Dockerfile | 27 +- contact-center/README.md | 19 +- contact-center/admin/build.sh | 15 +- contact-center/admin/package.sh | 4 + contact-center/admin/push.sh | 6 +- contact-center/admin/run.sh | 6 +- .../dev.sh => contact-center/admin/test.sh | 6 +- contact-center/app/.gitignore | 7 + contact-center/app/pom.xml | 137 +- .../chatopera/cc/{app => }/Application.java | 75 +- .../cc/{app => }/ServletInitializer.java | 2 +- .../cc/acd/AutomaticServiceDist.java | 1223 +++ .../cc/activemq/AgentAuditSubscription.java | 113 + .../cc/activemq/AgentSessionSubscription.java | 52 + .../cc/activemq/AgentSubscription.java | 69 + .../activemq/BlackListEventSubscription.java | 66 + .../cc/activemq/BrokerPublisher.java | 107 + .../cc/activemq/ChatbotEventSubscription.java | 143 + .../activemq/ConnectionEventSubscription.java | 109 + .../cc/activemq/OnlineUserSubscription.java | 72 + .../cc/activemq/PbxEventSubscription.java | 107 + .../filter/AgentCallOutFilter.java | 43 - .../filter/AgentStatusBusyOrgiFilter.java | 42 - .../filter/AgentStatusOrgiFilter.java | 42 - .../filter/AgentUserOrgiFilter.java | 45 - .../aggregation/filter/AiCallOutFilter.java | 43 - .../com/chatopera/cc/aop/AgentUserAspect.java | 136 + .../chatopera/cc/aop/BlackEntityAspect.java | 52 + .../chatopera/cc/aop/OnlineUserAspect.java | 46 + .../chatopera/cc/aop/SyncDatabaseAspect.java | 100 + .../app/algorithm/AutomaticServiceDist.java | 837 -- .../cc/app/basic/aop/SyncDatabaseExt.java | 96 - .../com/chatopera/cc/app/cache/CacheBean.java | 79 - .../chatopera/cc/app/cache/CacheHelper.java | 64 - .../chatopera/cc/app/cache/CacheInstance.java | 84 - .../cache/hazelcast/HazlcastCacheHelper.java | 91 - .../hazelcast/impl/AgentStatusCache.java | 115 - .../cache/hazelcast/impl/AgentUserCache.java | 115 - .../cache/hazelcast/impl/ApiUserCache.java | 115 - .../cache/hazelcast/impl/CallCenterCache.java | 115 - .../cc/app/cache/hazelcast/impl/JobCache.java | 116 - .../app/cache/hazelcast/impl/MultiCache.java | 117 - .../app/cache/hazelcast/impl/OnlineCache.java | 116 - .../app/cache/hazelcast/impl/SystemCache.java | 116 - .../chatopera/cc/app/config/ApiConfigure.java | 55 - .../app/config/ApiRequestMatchingFilter.java | 89 - .../cc/app/config/DisruptorConfigure.java | 74 - .../cc/app/config/IMServerConfiguration.java | 124 - .../cc/app/config/RedisConfigure.java | 91 - .../cc/app/config/StartedEventListener.java | 99 - .../cc/app/handler/ApplicationController.java | 52 - .../cc/app/handler/LoginController.java | 317 - .../cc/app/handler/admin/AdminController.java | 181 - .../callcenter/CallCenterController.java | 168 - .../CallCenterExtentionController.java | 252 - .../CallCenterResourceController.java | 128 - .../CallCenterSipTrunkController.java | 154 - .../handler/admin/organ/OrganController.java | 346 - .../handler/admin/role/RoleController.java | 249 - .../system/HazelcastMonitorController.java | 73 - .../handler/admin/system/LogController.java | 64 - .../admin/system/SysDicController.java | 240 - .../app/handler/api/ApiLoginController.java | 103 - .../api/rest/ApiAgentUserController.java | 59 - .../api/rest/ApiContactsController.java | 117 - .../api/rest/ApiServiceQueneController.java | 165 - .../handler/api/rest/ApiSysDicController.java | 54 - .../cc/app/handler/apps/AppsController.java | 273 - .../handler/apps/agent/AgentController.java | 1336 ---- .../apps/callcenter/SipTrunkController.java | 126 - .../apps/contacts/ContactsController.java | 433 - .../apps/customer/CustomerController.java | 407 - .../handler/apps/entim/EntIMController.java | 231 - .../handler/apps/internet/IMController.java | 829 -- .../apps/quality/AgentQualityController.java | 129 - .../handler/apps/service/StatsController.java | 166 - .../handler/apps/tenant/TenantController.java | 305 - .../app/handler/apps/test/TestController.java | 48 - .../resource/UsersResourceController.java | 144 - .../cc/app/im/client/NettyAgentClient.java | 49 - .../cc/app/im/client/NettyCalloutClient.java | 53 - .../cc/app/im/client/NettyChatbotClient.java | 54 - .../cc/app/im/client/NettyIMClient.java | 53 - .../cc/app/im/handler/AgentEventHandler.java | 227 - .../cc/app/im/handler/IMEventHandler.java | 209 - .../app/im/message/AgentServiceMessage.java | 45 - .../cc/app/im/message/AgentStatusMessage.java | 45 - .../cc/app/im/message/ChatMessage.java | 425 - .../cc/app/im/message/ChatObject.java | 47 - .../chatopera/cc/app/im/message/Message.java | 130 - .../cc/app/im/message/NewRequestMessage.java | 53 - .../cc/app/im/message/OtherMessage.java | 71 - .../cc/app/im/message/OtherMessageItem.java | 54 - .../cc/app/im/router/AgentUserRouter.java | 29 - .../app/im/router/CallOutMessageRouter.java | 37 - .../cc/app/im/router/MessageRouter.java | 76 - .../cc/app/im/router/OutMessageRouter.java | 24 - .../chatopera/cc/app/im/router/Router.java | 25 - .../cc/app/im/router/RouterHelper.java | 25 - .../app/im/router/WebIMOutMessageRouter.java | 38 - .../cc/app/im/util/ChatbotUtils.java | 168 - .../chatopera/cc/app/im/util/HumanUtils.java | 223 - .../cc/app/im/util/IMServiceUtils.java | 68 - .../interceptor/LogIntercreptorHandler.java | 116 - .../interceptor/UserInterceptorHandler.java | 143 - .../chatopera/cc/app/model/AgentReport.java | 146 - .../chatopera/cc/app/model/AgentStatus.java | 216 - .../com/chatopera/cc/app/model/AiUser.java | 231 - .../chatopera/cc/app/model/InviteRecord.java | 125 - .../com/chatopera/cc/app/model/JobDetail.java | 823 -- .../java/com/chatopera/cc/app/model/Log.java | 237 - .../cc/app/model/MessageDataBean.java | 82 - .../cc/app/model/MessageInContent.java | 199 - .../cc/app/model/MessageOutContent.java | 35 - .../chatopera/cc/app/model/OnlineUser.java | 472 -- .../com/chatopera/cc/app/model/Organ.java | 129 - .../chatopera/cc/app/model/Organization.java | 113 - .../chatopera/cc/app/model/SNSAccount.java | 352 - .../com/chatopera/cc/app/model/UKFacet.java | 54 - .../com/chatopera/cc/app/model/UKeFuDic.java | 97 - .../java/com/chatopera/cc/app/model/User.java | 530 -- .../chatopera/cc/app/model/UserHistory.java | 254 - .../com/chatopera/cc/app/model/UserRole.java | 87 - .../persistence/es/ContactsRepository.java | 28 - .../es/ContactsRepositoryImpl.java | 198 - .../persistence/hibernate/BaseService.java | 80 - .../persistence/impl/AgentUserService.java | 44 - .../cc/app/persistence/impl/CallOutQuene.java | 117 - .../impl/ContactsDataExchangeImpl.java | 45 - .../persistence/impl/HazelcastService.java | 28 - .../cc/app/persistence/impl/UserService.java | 24 - .../repository/AgentServiceRepository.java | 49 - .../AgentUserContactsRepository.java | 28 - .../repository/AgentUserRepository.java | 44 - .../repository/AgentUserTaskRepository.java | 36 - .../repository/CallAgentRepository.java | 39 - .../repository/ChatMessageRepository.java | 46 - .../repository/ChatbotRepository.java | 25 - .../ColumnPropertiesRepository.java | 34 - .../repository/CubeMetadataRepository.java | 35 - .../repository/InstructionRepository.java | 43 - .../repository/JobDetailRepository.java | 45 - .../repository/KbsTypeRepository.java | 34 - .../repository/KnowledgeTypeRepository.java | 45 - .../repository/OnlineUserRepository.java | 117 - .../repository/OrganRepository.java | 53 - .../repository/QualityRepository.java | 31 - .../repository/QueSurveyAnswerRepository.java | 42 - .../repository/ReportCubeService.java | 602 -- .../repository/ReportFilterRepository.java | 36 - .../repository/RoleRepository.java | 37 - .../repository/SNSAccountRepository.java | 54 - .../repository/SaleStatusRepository.java | 39 - .../repository/SysDicRepository.java | 47 - .../repository/TablePropertiesRepository.java | 35 - .../UKefuCallOutConfigRepository.java | 31 - .../UKefuCallOutNamesRepository.java | 53 - .../UKefuCallOutTaskRepository.java | 36 - .../repository/UserRepository.java | 148 - .../repository/WeiXinUserRepository.java | 38 - .../repository/WorkOrderTypeRepository.java | 33 - .../chatopera/cc/app/schedule/Fetcher.java | 165 - .../chatopera/cc/app/schedule/LogTask.java | 45 - .../chatopera/cc/app/schedule/NamesTask.java | 69 - .../com/chatopera/cc/app/schedule/Task.java | 90 - .../cc/app/schedule/WebIMAgentDispatcher.java | 104 - .../schedule/WebIMOnlineUserDispatcher.java | 102 - .../chatopera/cc/app/schedule/WebIMTask.java | 345 - .../com/chatopera/cc/basic/Constants.java | 198 + .../java/com/chatopera/cc/basic/I18N.java | 8 + .../cc/{app => }/basic/MainContext.java | 473 +- .../cc/{app => }/basic/MainUtils.java | 203 +- .../cc/{app => }/basic/Viewport.java | 53 +- .../cc/basic/plugins/IPluginDescriptor.java | 5 + .../cc/basic/plugins/PluginRegistry.java | 14 + .../cc/basic/plugins/PluginsLoader.java | 13 + .../basic/resource/ActivityResource.java | 71 +- .../basic/resource/BatchResource.java | 24 +- .../basic/resource/OutputTextFormat.java | 4 +- .../cc/{app => }/basic/resource/Resource.java | 6 +- .../java/com/chatopera/cc/cache/Cache.java | 965 +++ .../com/chatopera/cc/cache/RedisCommand.java | 312 + .../java/com/chatopera/cc/cache/RedisKey.java | 289 + .../ChatbotDisruptorExceptionHandler.java | 39 - .../cc/concurrent/chatbot/ChatbotEvent.java | 47 - .../chatbot/ChatbotEventFactory.java | 27 - .../chatbot/ChatbotEventHandler.java | 149 - .../chatbot/ChatbotEventProducer.java | 42 - .../concurrent/dsdata/DSDataEventHandler.java | 34 - .../dsdata/DSDataEventProducer.java | 41 - .../dsdata/DSQueueProcessHandler.java | 59 - .../multiupdate/MultiUpdateEvent.java | 58 - .../multiupdate/MultiUpdateEventFactory.java | 28 - .../multiupdate/MultiUpdateEventHandler.java | 45 - .../multiupdate/MultiUpdateEventProducer.java | 40 - .../cc/concurrent/user/UserDataEvent.java | 42 - .../concurrent/user/UserDataEventFactory.java | 27 - .../user/UserDataEventProducer.java | 40 - .../cc/concurrent/user/UserEventHandler.java | 66 - .../cc/config/ActiveMQConfigure.java | 42 + .../cc/config/ApiRequestMatchingFilter.java | 96 + .../cc/config/AppCtxRefreshEventListener.java | 136 + .../config/ApplicationStartupListener.java | 8 +- .../CSKeFuExceptionHandler.java} | 4 +- .../config/DelegateRequestMatchingFilter.java | 8 +- .../{app => }/config/DruidConfiguration.java | 2 +- .../cc/{app => }/config/ExecutorConfig.java | 11 +- .../cc/config/MessagingServerConfigure.java | 120 + .../chatopera/cc/config/RedisConfigure.java | 39 + .../config/StringToDateConverter.java | 2 +- .../{app => }/config/UKWebAppConfigurer.java | 14 +- .../cc/{app => }/config/WebConfigBeans.java | 2 +- .../{app => }/config/WebSecurityConfig.java | 2 +- .../config/WebServerConfiguration.java | 91 +- .../cc/config/WebServerSessionConfigure.java | 73 + .../conditions/CalloutBeanCondition.java | 27 + .../plugins/SkypePluginPresentCondition.java | 17 + .../CSKefuCacheException.java} | 44 +- .../cc/exception/CSKefuException.java | 2 +- .../cc/exception/CalloutRecordException.java | 4 +- .../cc/exception/CalloutRuntimeException.java | 4 +- ...=> InstantMessagingExceptionListener.java} | 20 +- .../com/chatopera/cc/exchange/UserEvent.java | 21 - .../cc/handler/ApplicationController.java | 72 + .../cc/{app => }/handler/Handler.java | 148 +- .../chatopera/cc/handler/LoginController.java | 421 + .../cc/handler/admin/AdminController.java | 183 + .../handler/admin/area/AreaController.java | 29 +- .../callcenter/CallCenterAclController.java | 10 +- .../callcenter/CallCenterBlackController.java | 14 +- .../callcenter/CallCenterController.java | 174 + .../CallCenterExtentionController.java | 248 + .../callcenter/CallCenterIvrController.java | 12 +- .../callcenter/CallCenterMediaController.java | 12 +- .../CallCenterResourceController.java | 135 + .../CallCenterRouterController.java | 28 +- .../CallCenterSipTrunkController.java | 152 + .../callcenter/CallCenterSkillController.java | 24 +- .../channel/CalloutChannelController.java | 120 +- .../admin/channel/SNSAccountIMController.java | 62 +- .../admin/channel/WebIMController.java | 107 +- .../admin/config/SystemConfigController.java | 90 +- .../admin/config/SystemMessageController.java | 23 +- .../handler/admin/organ/OrganController.java | 333 + .../cc/handler/admin/role/RoleController.java | 256 + .../admin/skill/AgentSkillController.java | 18 +- .../admin/system/MetadataController.java | 40 +- .../admin/system/SysDicController.java | 256 + .../admin/system/TemplateController.java | 47 +- .../handler/admin/users/UsersController.java | 139 +- .../cc/handler/api/ApiLoginController.java | 112 + .../handler/api/ApiTokensErrorController.java | 23 +- .../api/request}/QueryParams.java | 2 +- .../api/request}/RequestValues.java | 2 +- .../handler/api/request/RestUtils.java | 4 +- .../api/rest/ApiAgentUserController.java | 135 + .../handler/api/rest/ApiAppsController.java | 130 + .../api/rest/ApiCallMonitorController.java | 32 +- .../api/rest/ApiCallRecordsController.java | 99 +- .../api/rest/ApiChatMessageController.java | 24 +- .../api/rest/ApiChatbotController.java | 128 +- .../api/rest/ApiContactNotesController.java | 69 +- .../api/rest/ApiContactTagsController.java | 27 +- .../api/rest/ApiContactsController.java | 228 + .../api/rest/ApiDailplanRunController.java | 70 +- .../api/rest/ApiLeavemsgController.java | 91 +- .../api/rest/ApiOnlineUserController.java | 66 +- .../handler/api/rest/ApiOrganController.java | 25 +- .../api/rest/ApiQualityController.java | 89 +- .../api/rest/ApiQuickReplyController.java | 28 +- .../api/rest/ApiQuickTypeController.java | 32 +- .../api/rest/ApiServiceQueneController.java | 163 + .../handler/api/rest/ApiSysDicController.java | 153 + .../handler/api/rest/ApiTagsController.java | 33 +- .../handler/api/rest/ApiUserController.java | 16 +- .../handler/api/rest/ApiWebIMController.java | 77 +- .../api/rest/ApiWlContactsController.java | 250 + .../api/rest}/QueryParams.java | 2 +- .../api/rest}/RequestValues.java | 2 +- .../api/rest/UkefuApiTagsController.java | 25 +- .../cc/handler/apps/AppsController.java | 290 + .../handler/apps/agent/AgentController.java | 1573 ++++ .../apps/callcenter/ExtentionController.java | 34 +- .../apps/callcenter/SipTrunkController.java | 126 + .../apps/callout/CalloutController.java | 35 +- .../apps/cca/AgentAuditController.java | 516 ++ .../apps/chatbot/ChatbotController.java | 27 +- .../apps/contacts/ContactsController.java | 684 ++ .../apps/customer/CustomerController.java | 422 + .../handler/apps/entim/EntIMController.java | 269 + .../handler/apps/internet/IMController.java | 1175 +++ .../handler/apps/job/JobController.java | 12 +- .../handler/apps/kbs/KbsController.java | 34 +- .../handler/apps/kbs/TopicController.java | 75 +- .../apps/message/MessageController.java | 4 +- .../organization/OrganizationController.java | 17 +- .../apps/quality/AgentQualityController.java | 129 + .../handler/apps/report/CubeController.java | 42 +- .../apps/report/CubeLevelController.java | 20 +- .../apps/report/CubeMeasureController.java | 14 +- .../apps/report/DimensionController.java | 18 +- .../handler/apps/report/ReportController.java | 43 +- .../apps/report/ReportDesignController.java | 77 +- .../apps/report/ReportViewController.java | 14 +- .../apps/service/AgentSummaryController.java | 35 +- .../apps/service/ChatServiceController.java | 318 +- .../apps/service/CommentController.java | 8 +- .../apps/service/OnlineUserController.java | 129 +- .../service/ProcessedSummaryController.java | 41 +- .../handler/apps/service/StatsController.java | 173 + .../apps/setting/IMAgentController.java | 51 +- .../apps/setting/QuickReplyController.java | 72 +- .../handler/apps/tenant/TenantController.java | 271 + .../resource/CallAgentResourceController.java | 12 +- .../resource/ContactsResourceController.java | 6 +- .../resource/CssResourceController.java | 4 +- .../handler/resource/MediaController.java | 18 +- .../QuickReplyResourceController.java | 8 +- .../resource/SysDicResourceController.java | 14 +- .../resource/UsersResourceController.java | 148 + .../interceptor/CrossInterceptorHandler.java | 29 +- .../interceptor/LogIntercreptorHandler.java | 127 + .../interceptor/UserInterceptorHandler.java | 164 + .../com/chatopera/cc/{app => }/model/Acl.java | 4 +- .../chatopera/cc/{app => }/model/AdType.java | 2 +- .../com/chatopera/cc/model/AgentReport.java | 169 + .../cc/{app => }/model/AgentService.java | 6 +- .../cc/{app => }/model/AgentServiceSatis.java | 2 +- .../{app => }/model/AgentServiceSummary.java | 2 +- .../com/chatopera/cc/model/AgentStatus.java | 257 + .../cc/{app => }/model/AgentUser.java | 54 +- .../chatopera/cc/model/AgentUserAudit.java | 95 + .../cc/{app => }/model/AgentUserContacts.java | 2 +- .../cc/{app => }/model/AgentUserTask.java | 2 +- .../cc/{app => }/model/AiConfig.java | 2 +- .../cc/{app => }/model/AiSNSAccount.java | 2 +- .../cc/{app => }/model/AreaType.java | 2 +- .../cc/{app => }/model/AttachmentFile.java | 2 +- .../cc/{app => }/model/BlackEntity.java | 2 +- .../cc/{app => }/model/CallAgent.java | 2 +- .../cc/{app => }/model/CallCenterSkill.java | 2 +- .../cc/{app => }/model/CallMonitor.java | 2 +- .../model/CallMonitorPerformance.java | 4 +- .../cc/{app => }/model/CallOutDialplan.java | 2 +- .../{app => }/model/CallOutLogDialPlan.java | 2 +- .../cc/{app => }/model/CallOutTarget.java | 2 +- .../cc/{app => }/model/ChartProperties.java | 2 +- .../chatopera/cc/{app => }/model/Chatbot.java | 11 +- .../cc/{app => }/model/ColumnProperties.java | 2 +- .../cc/{app => }/model/ContactNotes.java | 4 +- .../cc/{app => }/model/Contacts.java | 74 +- .../cc/{app => }/model/CousultInvite.java | 25 +- .../chatopera/cc/{app => }/model/Cube.java | 4 +- .../cc/{app => }/model/CubeLevel.java | 2 +- .../cc/{app => }/model/CubeMeasure.java | 2 +- .../cc/{app => }/model/CubeMetadata.java | 2 +- .../cc/{app => }/model/CubeType.java | 2 +- .../cc/{app => }/model/CustomerGroupForm.java | 2 +- .../chatopera/cc/{app => }/model/DataDic.java | 2 +- .../cc/{app => }/model/DataEvent.java | 2 +- .../java/com/chatopera/cc/model/Dict.java | 153 + .../cc/{app => }/model/Dimension.java | 2 +- .../cc/{app => }/model/DrillDown.java | 2 +- .../chatopera/cc/{app => }/model/ESBean.java | 2 +- .../cc/{app => }/model/EntCustomer.java | 4 +- .../cc/{app => }/model/Extention.java | 6 +- .../cc/{app => }/model/Favorites.java | 4 +- .../cc/{app => }/model/FormFilter.java | 2 +- .../cc/{app => }/model/FormFilterItem.java | 4 +- .../cc/{app => }/model/FormFilterRequest.java | 2 +- .../cc/{app => }/model/Generation.java | 2 +- .../chatopera/cc/{app => }/model/IMGroup.java | 2 +- .../cc/{app => }/model/IMGroupUser.java | 2 +- .../cc/{app => }/model/Instruction.java | 2 +- .../com/chatopera/cc/model/InviteRecord.java | 142 + .../chatopera/cc/{app => }/model/IvrMenu.java | 2 +- .../com/chatopera/cc/model/JobDetail.java | 828 ++ .../chatopera/cc/{app => }/model/JobTask.java | 2 +- .../cc/{app => }/model/KbsExpert.java | 2 +- .../cc/{app => }/model/KbsTopic.java | 5 +- .../cc/{app => }/model/KbsTopicComment.java | 4 +- .../chatopera/cc/{app => }/model/KbsType.java | 2 +- .../cc/{app => }/model/KnowledgeType.java | 2 +- .../cc/{app => }/model/LeaveMsg.java | 2 +- .../chatopera/cc/{app => }/model/Media.java | 2 +- .../cc/{app => }/model/MetadataTable.java | 2 +- .../com/chatopera/cc/model/OnlineUser.java | 466 ++ .../cc/{app => }/model/OnlineUserHis.java | 2 +- .../cc/{app => }/model/OrdersComment.java | 4 +- .../java/com/chatopera/cc/model/Organ.java | 149 + .../cc/{app => }/model/OrganRole.java | 2 +- .../com/chatopera/cc/model/OrganUser.java | 87 + .../com/chatopera/cc/model/Organization.java | 126 + .../cc/{app => }/model/OrgiSkillRel.java | 2 +- .../chatopera/cc/{app => }/model/PbxHost.java | 2 +- .../cc/{app => }/model/ProcessContent.java | 2 +- .../chatopera/cc/{app => }/model/Product.java | 2 +- .../cc/{app => }/model/PropertiesEvent.java | 2 +- .../cc/{app => }/model/PublishedCube.java | 4 +- .../cc/{app => }/model/PublishedReport.java | 4 +- .../chatopera/cc/{app => }/model/Quality.java | 2 +- .../cc/{app => }/model/QualityRequest.java | 2 +- .../cc/{app => }/model/QueSurveyAnswer.java | 2 +- .../cc/{app => }/model/QueSurveyProcess.java | 2 +- .../cc/{app => }/model/QueSurveyQuestion.java | 2 +- .../cc/{app => }/model/QuickReply.java | 4 +- .../cc/{app => }/model/QuickType.java | 2 +- .../cc/{app => }/model/RecentUser.java | 2 +- .../chatopera/cc/{app => }/model/Report.java | 4 +- .../cc/{app => }/model/ReportFilter.java | 4 +- .../cc/{app => }/model/ReportModel.java | 4 +- .../cc/{app => }/model/Reporter.java | 2 +- .../cc/{app => }/model/RequestLog.java | 16 +- .../chatopera/cc/{app => }/model/Role.java | 2 +- .../cc/{app => }/model/RoleAuth.java | 2 +- .../cc/{app => }/model/RouterRules.java | 2 +- .../com/chatopera/cc/model/SNSAccount.java | 425 + .../cc/{app => }/model/SaleStatus.java | 2 +- .../chatopera/cc/{app => }/model/Scene.java | 4 +- .../cc/{app => }/model/SceneType.java | 2 +- .../chatopera/cc/{app => }/model/Secret.java | 2 +- .../cc/{app => }/model/ServiceAi.java | 4 +- .../cc/{app => }/model/SessionConfig.java | 2 +- .../cc/{app => }/model/SipTrunk.java | 2 +- .../chatopera/cc/{app => }/model/Skill.java | 2 +- .../cc/{app => }/model/SkillExtention.java | 2 +- .../cc/{app => }/model/StatusEvent.java | 8 +- .../cc/{app => }/model/StatusEventSatisf.java | 2 +- .../cc/{app => }/model/StreamingFile.java | 17 +- .../chatopera/cc/{app => }/model/SysDic.java | 2 +- .../cc/{app => }/model/SystemConfig.java | 2 +- .../cc/{app => }/model/SystemMessage.java | 2 +- .../cc/{app => }/model/TableProperties.java | 2 +- .../com/chatopera/cc/{app => }/model/Tag.java | 2 +- .../cc/{app => }/model/TagRelation.java | 2 +- .../cc/{app => }/model/Template.java | 2 +- .../chatopera/cc/{app => }/model/Tenant.java | 2 +- .../chatopera/cc/{app => }/model/Topic.java | 4 +- .../cc/{app => }/model/TopicItem.java | 2 +- .../chatopera/cc/{app => }/model/UKAgg.java | 10 +- .../{app => }/model/UKefuCallOutConfig.java | 2 +- .../{app => }/model/UKefuCallOutFilter.java | 2 +- .../cc/{app => }/model/UKefuCallOutNames.java | 4 +- .../cc/{app => }/model/UKefuCallOutRole.java | 2 +- .../cc/{app => }/model/UKefuCallOutTask.java | 2 +- .../cc/{app => }/model/UploadStatus.java | 2 +- .../java/com/chatopera/cc/model/User.java | 536 ++ .../com/chatopera/cc/model/UserHistory.java | 308 + .../java/com/chatopera/cc/model/UserRole.java | 98 + .../cc/{app => }/model/UserTraceHistory.java | 16 +- .../cc/{app => }/model/WebIMReport.java | 2 +- .../cc/{app => }/model/WeiXinUser.java | 2 +- .../cc/{app => }/model/WorkMonitor.java | 2 +- .../cc/{app => }/model/WorkOrderType.java | 2 +- .../cc/{app => }/model/WorkOrders.java | 4 +- .../cc/{app => }/model/WorkSession.java | 2 +- .../cc/{app => }/model/WorkTime.java | 2 +- .../cc/{app => }/model/WxMpEvent.java | 2 +- .../chatopera/cc/model/keys/OrganUserId.java | 68 + .../com/chatopera/cc/peer/PeerContext.java | 113 + .../com/chatopera/cc/peer/PeerSyncIM.java | 146 + .../java/com/chatopera/cc/peer/PeerUtils.java | 19 + .../com/chatopera/cc/peer/im/ComposeMw1.java | 136 + .../com/chatopera/cc/peer/im/ComposeMw2.java | 90 + .../com/chatopera/cc/peer/im/ComposeMw3.java | 77 + .../persistence/blob/JpaBlobHelper.java | 3 +- .../es/ChatMessageEsRepository.java | 12 + .../es/ContactNotesRepository.java | 6 +- .../es/ContactsEsCommonRepository.java | 14 +- .../es/ContactsIndependRepository.java} | 8 +- .../cc/persistence/es/ContactsRepository.java | 52 + .../es/ContactsRepositoryImpl.java | 197 + .../es/EntCustomerEsCommonRepository.java | 10 +- .../persistence/es/EntCustomerRepository.java | 4 +- .../es/EntCustomerRepositoryImpl.java | 8 +- .../es/KbsTopicCommentEsCommonRepository.java | 14 +- .../es/KbsTopicCommentRepository.java | 4 +- .../es/KbsTopicCommentRepositoryImpl.java | 6 +- .../es/KbsTopicEsCommonRepository.java | 14 +- .../persistence/es/KbsTopicRepository.java | 4 +- .../es/KbsTopicRepositoryImpl.java | 4 +- .../es/QuickReplyEsCommonRepository.java | 20 +- .../persistence/es/QuickReplyRepository.java | 4 +- .../es/QuickReplyRepositoryImpl.java | 10 +- .../es/TopicEsCommonRepository.java | 14 +- .../persistence/es/TopicRepository.java | 4 +- .../persistence/es/TopicRepositoryImpl.java | 6 +- .../persistence/es/UKAggResultExtractor.java | 6 +- .../es/UKAggTopResultExtractor.java | 4 +- .../persistence/es/UKResultMapper.java | 2 +- .../cc/persistence/hibernate/BaseService.java | 130 + .../persistence/impl/BatchDataProcess.java | 8 +- .../persistence/impl/DataBatProcess.java | 6 +- .../persistence/impl/ESDataExchangeImpl.java | 74 +- .../impl/OrganDataExchangeImpl.java | 8 +- .../impl/QuickTypeDataExchangeImpl.java | 8 +- .../impl/ServiceDataExchangeImpl.java | 8 +- .../impl/TopicDataExchangeImpl.java | 8 +- .../impl/TopicMoreDataExchangeImpl.java | 10 +- .../impl/TopicTypeDataExchangeImpl.java | 8 +- .../impl/UserDataExchangeImpl.java | 8 +- .../interfaces}/CallCenterInterface.java | 4 +- .../interfaces/CalloutWireEvent.java} | 50 +- .../interfaces}/DataExchangeInterface.java | 2 +- .../persistence/repository/AclRepository.java | 10 +- .../repository/AdTypeRepository.java} | 19 +- .../repository/AgentReportRepository.java | 30 + .../repository/AgentServiceRepository.java | 58 + .../AgentServiceSatisRepository.java | 8 +- .../repository/AgentStatusRepository.java} | 26 +- .../AgentUserContactsRepository.java | 46 + .../repository/AgentUserRepository.java | 88 + .../repository/AgentUserTaskRepository.java} | 16 +- .../repository/AiConfigRepository.java | 34 + .../repository/AiSNSAccountRepository.java} | 17 +- .../repository/AreaTypeRepository.java} | 17 +- .../repository/AttachmentRepository.java | 37 + .../repository/BaseRepository.java | 4 +- .../repository/BlackListRepository.java} | 20 +- .../repository/CallAgentRepository.java} | 23 +- .../repository/CallCenterSkillRepository.java | 10 +- .../CallMonitorPerformanceRepository.java | 4 +- .../repository/CallMonitorRepository.java | 18 +- .../repository/CallOutDialplanRepository.java | 12 +- .../CallOutLogDialPlanRepository.java | 6 +- .../repository/CallOutTargetRepository.java | 6 +- .../repository/ChatMessageRepository.java | 82 + .../repository/ChatbotRepository.java | 40 + .../ColumnPropertiesRepository.java} | 13 +- .../repository/ConsultInviteRepository.java} | 19 +- .../repository/CubeLevelRepository.java | 33 + .../repository/CubeMeasureRepository.java | 10 +- .../repository/CubeMetadataRepository.java | 35 + .../repository/CubeRepository.java} | 17 +- .../persistence/repository/CubeService.java | 12 +- .../repository/CubeTypeRepository.java} | 20 +- .../repository/DataDicRepository.java | 16 +- .../repository/DataEventRepository.java | 8 +- .../repository/DataSourceService.java | 2 +- .../repository/DbDataRepository.java | 4 +- .../repository/DimensionRepository.java | 33 + .../repository/DrilldownRepository.java | 6 +- .../repository/ExtentionRepository.java | 20 +- .../repository/FormFilterItemRepository.java | 30 + .../repository/FormFilterRepository.java | 40 + .../repository/GenerationRepository.java | 28 + .../repository/IMGroupRepository.java | 12 +- .../repository/IMGroupUserRepository.java | 18 +- .../repository/InstructionRepository.java} | 30 +- .../repository/InviteRecordRepository.java} | 23 +- .../repository/IvrMenuRepository.java | 12 +- .../repository/JobDetailRepository.java} | 25 +- .../repository/KbsExpertRepository.java} | 22 +- .../repository/KbsTypeRepository.java} | 15 +- .../repository/KnowledgeTypeRepository.java} | 25 +- .../repository/LeaveMsgRepository.java} | 17 +- .../repository/MediaRepository.java | 12 +- .../repository/MetadataRepository.java} | 20 +- .../repository/OnlineUserHisRepository.java} | 18 +- .../repository/OnlineUserRepository.java | 126 + .../repository/OrganRepository.java | 54 + .../repository/OrganRoleRepository.java} | 16 +- .../repository/OrganUserRepository.java | 51 + .../repository/OrganizationRepository.java | 8 +- .../repository/OrgiSkillRelRepository.java | 7 +- .../repository/PbxHostRepository.java | 14 +- .../repository/ProcessContentRepository.java} | 21 +- .../repository/ProductRepository.java} | 20 +- .../repository/PropertiesEventRepository.java | 6 +- .../repository/PublishedCubeRepository.java | 39 + .../PublishedReportRepository.java} | 23 +- .../repository/QualityRepository.java | 31 + .../QueSurveyAnswerRepository.java} | 22 +- .../QueSurveyProcessRepository.java} | 17 +- .../QueSurveyQuestionRepository.java} | 24 +- .../repository/QuickTypeRepository.java | 18 +- .../repository/RecentUserRepository.java | 10 +- .../repository/ReportCubeService.java | 598 ++ .../repository/ReportFilterRepository.java} | 22 +- .../repository/ReportModelRepository.java | 12 +- .../repository/ReportRepository.java | 16 +- .../repository/ReporterRepository.java | 12 +- .../repository/RequestLogRepository.java} | 11 +- .../repository/RoleAuthRepository.java | 25 +- .../repository/RoleRepository.java} | 23 +- .../repository/RouterRulesRepository.java | 10 +- .../repository/SNSAccountRepository.java | 59 + .../repository/SaleStatusRepository.java} | 18 +- .../repository/SceneRepository.java | 6 +- .../repository/SecretRepository.java | 8 +- .../repository/ServiceAiRepository.java} | 17 +- .../repository/ServiceSummaryRepository.java | 16 +- .../repository/SessionConfigRepository.java | 8 +- .../repository/SipTrunkRepository.java | 18 +- .../repository/SkillExtentionRepository.java | 8 +- .../repository/SkillRepository.java | 4 +- .../repository/StatusEventRepository.java | 70 +- .../StatusEventSatisfRepository.java | 6 +- .../repository/StreamingFileRepository.java | 4 +- .../repository/SysDicRepository.java} | 37 +- .../repository/SystemConfigRepository.java | 8 +- .../repository/SystemMessageRepository.java | 10 +- .../TablePropertiesRepository.java} | 17 +- .../repository/TagRelationRepository.java | 31 + .../persistence/repository/TagRepository.java | 16 +- .../repository/TemplateRepository.java | 10 +- .../repository/TenantRepository.java | 35 + .../repository/TopicItemRepository.java | 8 +- .../UKefuCallOutConfigRepository.java | 31 + .../UKefuCallOutFilterRepository.java | 40 + .../UKefuCallOutNamesRepository.java | 53 + .../UKefuCallOutRoleRepository.java | 35 + .../UKefuCallOutTaskRepository.java | 36 + .../repository/UserEventRepository.java | 6 +- .../repository/UserHistoryRepository.java | 30 + .../repository/UserRepository.java | 131 + .../repository/UserRoleRepository.java} | 26 +- .../repository/UserTraceRepository.java | 4 +- .../repository/WeiXinUserRepository.java | 38 + .../repository/WorkMonitorRepository.java} | 21 +- .../repository/WorkOrderTypeRepository.java} | 16 +- .../repository/WorkSessionRepository.java} | 23 +- .../repository/WorkTimeRepository.java | 10 +- .../repository/WxMpEventRepository.java | 8 +- .../repository/XiaoEUKResultMapper.java | 2 +- .../persistence/storage/MinioService.java | 2 +- .../chatopera/cc/proxy/AgentAuditProxy.java | 90 + .../com/chatopera/cc/proxy/AgentProxy.java | 344 + .../chatopera/cc/proxy/AgentServiceProxy.java | 257 + .../chatopera/cc/proxy/AgentSessionProxy.java | 97 + .../chatopera/cc/proxy/AgentUserProxy.java | 484 ++ .../chatopera/cc/proxy/BlackEntityProxy.java | 97 + .../com/chatopera/cc/proxy/CalloutProxy.java | 250 + .../chatopera/cc/proxy/CalloutQueneProxy.java | 83 + .../com/chatopera/cc/proxy/ChatbotProxy.java | 180 + .../com/chatopera/cc/proxy/ContactsProxy.java | 220 + .../chatopera/cc/proxy/OnlineUserProxy.java | 1560 ++++ .../com/chatopera/cc/proxy/OrganProxy.java | 87 + .../com/chatopera/cc/proxy/UserProxy.java | 294 + .../{app => }/schedule/CallOutSheetTask.java | 19 +- .../CalloutPlanTask.java} | 76 +- .../CalloutWireTask.java} | 229 +- .../com/chatopera/cc/schedule/Fetcher.java | 179 + .../com/chatopera/cc/schedule/NamesTask.java | 80 + .../java/com/chatopera/cc/schedule/Task.java | 99 + .../com/chatopera/cc/schedule/WebIMTask.java | 339 + .../cc/{app/im => socketio}/ServerRunner.java | 35 +- .../cc/socketio/client/NettyAgentClient.java | 77 + .../client/NettyCallCenterClient.java | 11 +- .../socketio/client/NettyCalloutClient.java | 54 + .../socketio/client/NettyChatbotClient.java | 55 + .../im => socketio}/client/NettyClient.java | 18 +- .../im => socketio}/client/NettyClients.java | 137 +- .../cc/socketio/client/NettyIMClient.java | 69 + .../im => socketio}/client/UserClient.java | 2 +- .../socketio/handler/AgentEventHandler.java | 358 + .../handler/CalloutEventHandler.java | 8 +- .../handler/ChatbotEventHandler.java | 255 +- .../handler/EntIMEventHandler.java | 50 +- .../cc/socketio/handler/IMEventHandler.java | 270 + .../message/AgentStatusMessage.java} | 20 +- .../cc/socketio/message/ChatMessage.java | 525 ++ .../cc/socketio/message/InterventMessage.java | 141 + .../cc/socketio/message/Message.java | 289 + .../cc/socketio/message/OtherMessageItem.java | 61 + .../cc/socketio/util/HumanUtils.java | 157 + .../cc/socketio/util/IMServiceUtils.java | 56 + .../im => socketio}/util/RichMediaUtils.java | 85 +- .../chatopera/cc/util/CallCenterUtils.java | 908 ++- .../com/chatopera/cc/util/CallOutUtils.java | 258 - .../java/com/chatopera/cc/util/Constants.java | 87 - .../java/com/chatopera/cc/util/CronTools.java | 54 +- .../chatopera/cc/util/CskefuIdGenerator.java | 30 + .../util/{UKeFuList.java => CskefuList.java} | 2 +- .../com/chatopera/cc/util/HttpClientUtil.java | 175 +- .../java/com/chatopera/cc/util/IPTools.java | 2 +- .../cc/{aggregation => util}/MathHelper.java | 2 +- .../{CheckMobile.java => MobileDevice.java} | 6 +- .../chatopera/cc/util/OnlineUserUtils.java | 1239 --- ...entUtils.java => PropertiesEventUtil.java} | 4 +- .../com/chatopera/cc/util/SerializeUtil.java | 79 + ...gFileUtils.java => StreamingFileUtil.java} | 10 +- .../chatopera/cc/util/SystemEnvHelper.java | 72 +- .../java/com/chatopera/cc/util/TaskTools.java | 2 +- .../com/chatopera/cc/util/WebIMClient.java | 71 +- .../cc/util/WebSseEmitterClient.java | 88 +- .../{WechatUtils.java => WechatUtil.java} | 4 +- .../com/chatopera/cc/util/bi/model/Level.java | 2 +- .../chatopera/cc/util/bi/model/ValueData.java | 4 +- .../callout/CalloutHangupAggsResult.java} | 18 +- .../callout/CalloutHangupAuditResult.java} | 27 +- .../{concurrent => util}/dsdata/DSData.java | 12 +- .../dsdata/DSDataEvent.java | 2 +- .../dsdata/DataProcess.java | 2 +- .../dsdata/ExcelImportProecess.java | 28 +- .../dsdata/ExcelImportUtils.java | 18 +- .../dsdata/export/ExcelExporterProcess.java | 18 +- .../dsdata/export/ExportData.java | 4 +- .../dsdata/process/ContactsProcess.java | 6 +- .../dsdata/process/EntCustomerProcess.java | 6 +- .../dsdata/process/JPAProcess.java | 2 +- .../dsdata/process/QuickReplyProcess.java | 6 +- .../dsdata/process/TopicProcess.java | 12 +- .../com/chatopera/cc/util/es/ESTools.java | 105 +- .../com/chatopera/cc/util/es/SearchTools.java | 27 +- .../com/chatopera/cc/util/es/UKDataBean.java | 10 +- .../freeswitch/model/CallCenterAgent.java | 2 +- .../chatopera/cc/util/log/UKeFuAppender.java | 57 - .../java/com/chatopera/cc/util/mail/Mail.java | 4 +- .../main/java/mondrian/olap/fun/FunUtil.java | 10 +- .../spi/impl/SqlStatisticsProvider.java | 2 +- .../resources/WEB-INF/data/mdx/coment.xml | 2 +- .../resources/WEB-INF/data/mdx/consult.xml | 2 +- .../src/main/resources/application.properties | 136 +- .../app/src/main/resources/banner.txt | 9 +- .../src/main/resources/config/hazelcast.xml | 299 - .../app/src/main/resources/git.properties | 16 + .../app/src/main/resources/jcseg.properties | 77 - .../app/src/main/resources/logback-spring.xml | 9 +- .../src/main/resources/static/css/entim.css | 9 +- .../src/main/resources/static/css/layui.css | 2 +- .../resources/static/css/layui.mobile.css | 2 +- .../src/main/resources/static/css/login.css | 15 +- .../resources/static/css/ukefu-design.css | 5 + .../main/resources/static/css/ukefu-view.css | 6 + .../static/fonts/csfont/iconfont.eot | Bin 0 -> 3972 bytes .../static/fonts/csfont/iconfont.svg | 50 + .../static/fonts/csfont/iconfont.ttf | Bin 0 -> 3812 bytes .../static/fonts/csfont/iconfont.woff | Bin 0 -> 2624 bytes .../static/fonts/csfont/iconfont.woff2 | Bin 0 -> 2136 bytes .../{font => fonts/default}/iconfont.svg | 0 .../{font => fonts/default}/iconfont.ttf | Bin .../{font => fonts/default}/iconfont.woff | Bin .../{ukfont => fonts/kfont}/iconfont.eot | Bin .../{ukfont => fonts/kfont}/iconfont.svg | 0 .../{ukfont => fonts/kfont}/iconfont.ttf | Bin .../{ukfont => fonts/kfont}/iconfont.woff | Bin .../main/resources/static/im/css/layui.css | 2 +- .../main/resources/static/im/css/ukefu.css | 4 +- .../main/resources/static/im/img/cutimage.png | Bin 0 -> 291 bytes .../main/resources/static/im/js/dayjs.min.js | 1 + .../resources/static/im/js/html2canvas.js | 6991 +++++++++++++++++ .../static/im/js/kindeditor/kindeditor.js | 3 +- .../plugins/html2canvas/html2canvas.js | 20 + .../plugins/insertfile/insertfile.js | 5 +- .../js/kindeditor/themes/default/cutimage.png | Bin 0 -> 255 bytes .../main/resources/static/im/js/socket.io.js | 2 +- .../src/main/resources/static/images/bg.jpg | Bin 1287318 -> 191568 bytes .../main/resources/static/images/skype/0.png | Bin 0 -> 2002 bytes .../main/resources/static/images/skype/1.png | Bin 0 -> 1914 bytes .../main/resources/static/images/skype/10.png | Bin 0 -> 31252 bytes .../resources/static/images/skype/100.png | Bin 0 -> 2922 bytes .../resources/static/images/skype/101.png | Bin 0 -> 2168 bytes .../resources/static/images/skype/102.png | Bin 0 -> 3252 bytes .../resources/static/images/skype/103.png | Bin 0 -> 2579 bytes .../resources/static/images/skype/104.png | Bin 0 -> 1967 bytes .../resources/static/images/skype/105.png | Bin 0 -> 2205 bytes .../resources/static/images/skype/106.png | Bin 0 -> 2686 bytes .../resources/static/images/skype/107.png | Bin 0 -> 2177 bytes .../resources/static/images/skype/108.png | Bin 0 -> 2279 bytes .../resources/static/images/skype/109.png | Bin 0 -> 2538 bytes .../main/resources/static/images/skype/11.png | Bin 0 -> 22861 bytes .../resources/static/images/skype/110.png | Bin 0 -> 2139 bytes .../resources/static/images/skype/111.png | Bin 0 -> 2080 bytes .../resources/static/images/skype/112.png | Bin 0 -> 1867 bytes .../resources/static/images/skype/113.png | Bin 0 -> 1783 bytes .../resources/static/images/skype/114.png | Bin 0 -> 1947 bytes .../resources/static/images/skype/115.png | Bin 0 -> 2443 bytes .../main/resources/static/images/skype/12.png | Bin 0 -> 1891 bytes .../main/resources/static/images/skype/13.png | Bin 0 -> 2104 bytes .../main/resources/static/images/skype/14.png | Bin 0 -> 2283 bytes .../main/resources/static/images/skype/15.png | Bin 0 -> 2268 bytes .../main/resources/static/images/skype/16.png | Bin 0 -> 1992 bytes .../main/resources/static/images/skype/17.png | Bin 0 -> 34793 bytes .../main/resources/static/images/skype/18.png | Bin 0 -> 1493 bytes .../main/resources/static/images/skype/19.png | Bin 0 -> 2068 bytes .../main/resources/static/images/skype/2.png | Bin 0 -> 1873 bytes .../main/resources/static/images/skype/20.png | Bin 0 -> 1746 bytes .../main/resources/static/images/skype/21.png | Bin 0 -> 25511 bytes .../main/resources/static/images/skype/22.png | Bin 0 -> 1897 bytes .../main/resources/static/images/skype/23.png | Bin 0 -> 2080 bytes .../main/resources/static/images/skype/24.png | Bin 0 -> 2371 bytes .../main/resources/static/images/skype/25.png | Bin 0 -> 2070 bytes .../main/resources/static/images/skype/26.png | Bin 0 -> 2236 bytes .../main/resources/static/images/skype/27.png | Bin 0 -> 1358 bytes .../main/resources/static/images/skype/28.png | Bin 0 -> 1025 bytes .../main/resources/static/images/skype/29.png | Bin 0 -> 1821 bytes .../main/resources/static/images/skype/3.png | Bin 0 -> 1965 bytes .../main/resources/static/images/skype/30.png | Bin 0 -> 2059 bytes .../main/resources/static/images/skype/31.png | Bin 0 -> 2042 bytes .../main/resources/static/images/skype/32.png | Bin 0 -> 2007 bytes .../main/resources/static/images/skype/33.png | Bin 0 -> 1956 bytes .../main/resources/static/images/skype/34.png | Bin 0 -> 2167 bytes .../main/resources/static/images/skype/35.png | Bin 0 -> 1685 bytes .../main/resources/static/images/skype/36.png | Bin 0 -> 1903 bytes .../main/resources/static/images/skype/37.png | Bin 0 -> 1806 bytes .../main/resources/static/images/skype/38.png | Bin 0 -> 1887 bytes .../main/resources/static/images/skype/39.png | Bin 0 -> 2160 bytes .../main/resources/static/images/skype/4.png | Bin 0 -> 1933 bytes .../main/resources/static/images/skype/40.png | Bin 0 -> 1872 bytes .../main/resources/static/images/skype/41.png | Bin 0 -> 2029 bytes .../main/resources/static/images/skype/42.png | Bin 0 -> 1947 bytes .../main/resources/static/images/skype/43.png | Bin 0 -> 2003 bytes .../main/resources/static/images/skype/44.png | Bin 0 -> 2012 bytes .../main/resources/static/images/skype/45.png | Bin 0 -> 41114 bytes .../main/resources/static/images/skype/46.png | Bin 0 -> 46765 bytes .../main/resources/static/images/skype/47.png | Bin 0 -> 1934 bytes .../main/resources/static/images/skype/48.png | Bin 0 -> 2079 bytes .../main/resources/static/images/skype/49.png | Bin 0 -> 1772 bytes .../main/resources/static/images/skype/5.png | Bin 0 -> 2187 bytes .../main/resources/static/images/skype/50.png | Bin 0 -> 1938 bytes .../main/resources/static/images/skype/51.png | Bin 0 -> 2178 bytes .../main/resources/static/images/skype/52.png | Bin 0 -> 1961 bytes .../main/resources/static/images/skype/53.png | Bin 0 -> 2111 bytes .../main/resources/static/images/skype/54.png | Bin 0 -> 2068 bytes .../main/resources/static/images/skype/55.png | Bin 0 -> 1955 bytes .../main/resources/static/images/skype/56.png | Bin 0 -> 1703 bytes .../main/resources/static/images/skype/57.png | Bin 0 -> 2360 bytes .../main/resources/static/images/skype/58.png | Bin 0 -> 1732 bytes .../main/resources/static/images/skype/59.png | Bin 0 -> 2107 bytes .../main/resources/static/images/skype/6.png | Bin 0 -> 1992 bytes .../main/resources/static/images/skype/60.png | Bin 0 -> 2023 bytes .../main/resources/static/images/skype/61.png | Bin 0 -> 1976 bytes .../main/resources/static/images/skype/62.png | Bin 0 -> 1690 bytes .../main/resources/static/images/skype/63.png | Bin 0 -> 1401 bytes .../main/resources/static/images/skype/64.png | Bin 0 -> 2055 bytes .../main/resources/static/images/skype/65.png | Bin 0 -> 2046 bytes .../main/resources/static/images/skype/66.png | Bin 0 -> 1852 bytes .../main/resources/static/images/skype/67.png | Bin 0 -> 2371 bytes .../main/resources/static/images/skype/68.png | Bin 0 -> 1714 bytes .../main/resources/static/images/skype/69.png | Bin 0 -> 2073 bytes .../main/resources/static/images/skype/7.png | Bin 0 -> 1501 bytes .../main/resources/static/images/skype/70.png | Bin 0 -> 2176 bytes .../main/resources/static/images/skype/71.png | Bin 0 -> 1720 bytes .../main/resources/static/images/skype/72.png | Bin 0 -> 2301 bytes .../main/resources/static/images/skype/73.png | Bin 0 -> 2134 bytes .../main/resources/static/images/skype/74.png | Bin 0 -> 2267 bytes .../main/resources/static/images/skype/75.png | Bin 0 -> 2065 bytes .../main/resources/static/images/skype/76.png | Bin 0 -> 1870 bytes .../main/resources/static/images/skype/77.png | Bin 0 -> 2384 bytes .../main/resources/static/images/skype/78.png | Bin 0 -> 2220 bytes .../main/resources/static/images/skype/79.png | Bin 0 -> 2119 bytes .../main/resources/static/images/skype/8.png | Bin 0 -> 2162 bytes .../main/resources/static/images/skype/80.png | Bin 0 -> 2420 bytes .../main/resources/static/images/skype/81.png | Bin 0 -> 1788 bytes .../main/resources/static/images/skype/82.png | Bin 0 -> 2145 bytes .../main/resources/static/images/skype/83.png | Bin 0 -> 2768 bytes .../main/resources/static/images/skype/84.png | Bin 0 -> 1699 bytes .../main/resources/static/images/skype/85.png | Bin 0 -> 2231 bytes .../main/resources/static/images/skype/86.png | Bin 0 -> 24875 bytes .../main/resources/static/images/skype/87.png | Bin 0 -> 26763 bytes .../main/resources/static/images/skype/88.png | Bin 0 -> 2090 bytes .../main/resources/static/images/skype/89.png | Bin 0 -> 33507 bytes .../main/resources/static/images/skype/9.png | Bin 0 -> 1911 bytes .../main/resources/static/images/skype/90.png | Bin 0 -> 36682 bytes .../main/resources/static/images/skype/91.png | Bin 0 -> 2118 bytes .../main/resources/static/images/skype/92.png | Bin 0 -> 2971 bytes .../main/resources/static/images/skype/93.png | Bin 0 -> 2669 bytes .../main/resources/static/images/skype/94.png | Bin 0 -> 2678 bytes .../main/resources/static/images/skype/95.png | Bin 0 -> 2917 bytes .../main/resources/static/images/skype/96.png | Bin 0 -> 1974 bytes .../main/resources/static/images/skype/97.png | Bin 0 -> 1662 bytes .../main/resources/static/images/skype/98.png | Bin 0 -> 1876 bytes .../main/resources/static/images/skype/99.png | Bin 0 -> 1732 bytes .../static/js/CSKeFu_Agent_Invite.v1.js | 91 + .../static/js/CSKeFu_Agent_State.v1.js | 39 + .../resources/static/js/CSKeFu_Callout.v1.js | 2 +- .../main/resources/static/js/CSKeFu_IM.v1.js | 64 +- .../static/js/CSKeFu_Rest_Request.v1.js | 56 +- .../resources/static/js/ace/worker-html.js | 2 +- .../static/js/{ukefu.js => cskefu.js} | 105 +- .../static/js/kindeditor/kindeditor.js | 6 + .../plugins/insertfile/insertfile.js | 5 +- .../static/js/moment-timezone-with-data.js | 1224 +++ .../resources/static/js/moment-timezone.js | 1 + .../main/resources/static/layui/css/layui.css | 2 +- .../src/main/resources/static/testclient.html | 46 +- .../admin/callcenter/config/index.html | 2 +- .../admin/callcenter/onextention/index.html | 2 +- .../templates/admin/callcenter/skill/imp.html | 4 +- .../admin/callcenter/skill/index.html | 6 +- .../templates/admin/channel/callout/add.html | 50 - .../templates/admin/channel/callout/edit.html | 51 - .../admin/channel/callout/index.html | 92 - .../templates/admin/channel/im/add.html | 49 - .../templates/admin/channel/im/edit.html | 50 - .../templates/admin/channel/im/index.html | 98 - .../templates/admin/config/index.html | 15 +- .../templates/admin/include/left.html | 33 +- .../templates/admin/include/tpl.html | 2 +- .../resources/templates/admin/organ/add.html | 7 + .../resources/templates/admin/organ/area.html | 5 +- .../resources/templates/admin/organ/edit.html | 19 +- .../templates/admin/organ/index.html | 56 +- .../resources/templates/admin/role/add.html | 9 +- .../resources/templates/admin/role/auth.html | 6 +- .../resources/templates/admin/role/edit.html | 9 +- .../resources/templates/admin/role/index.html | 41 +- .../templates/admin/skill/index.html | 4 +- .../templates/admin/system/log/detail.html | 56 - .../templates/admin/system/log/index.html | 71 - .../templates/admin/system/log/levels.html | 71 - .../admin/system/monitor/hazelcast.html | 1 - .../resources/templates/admin/user/add.html | 30 +- .../resources/templates/admin/user/edit.html | 31 +- .../resources/templates/admin/user/index.html | 59 +- .../templates/admin/webim/index.html | 49 +- .../templates/admin/webim/invote.html | 22 +- .../templates/admin/webim/profile.html | 392 +- .../templates/apps/agent/agentusers.html | 9 +- .../templates/apps/agent/channel/phone.html | 2 +- .../templates/apps/agent/channel/skype.html | 160 + .../templates/apps/agent/channel/webim.html | 179 +- .../templates/apps/agent/contacts.html | 6 +- .../resources/templates/apps/agent/index.html | 13 +- .../templates/apps/agent/mainagentuser.html | 555 +- .../apps/agent/mainagentuser_callout.html | 22 +- .../apps/agent/mainagentuser_skype.html | 685 ++ .../apps/agent/mainagentuserconter.html | 70 + .../apps/agent/mainagentusersearch.html | 62 + .../apps/agent/media/messageimage.html | 100 +- .../templates/apps/agent/othertopic.html | 2 +- .../templates/apps/agent/transfer.html | 39 +- .../apps/agent/transferagentlist.html | 30 +- .../callcenter/configure/callcenter.html | 8 +- .../business/callcenter/extention/detail.html | 2 +- .../templates/apps/business/contacts/add.html | 25 +- .../apps/business/contacts/detail.html | 35 +- .../apps/business/contacts/edit.html | 13 + .../apps/business/contacts/embed/add.html | 14 + .../apps/business/contacts/embed/edit.html | 14 + .../apps/business/contacts/embed/index.html | 72 +- .../apps/business/contacts/index.html | 502 +- .../apps/business/contacts/mass.html | 148 + .../templates/apps/business/customer/add.html | 22 +- .../apps/business/customer/edit.html | 7 +- .../apps/business/customer/index.html | 422 +- .../apps/business/report/cube/detail.html | 4 +- .../apps/business/report/cube/list.html | 2 +- .../apps/business/report/cube/pbcubelist.html | 2 +- .../report/design/cube/pbcubelist.html | 2 +- .../apps/business/report/design/element.html | 2 +- .../apps/business/report/element.html | 2 +- .../templates/apps/business/report/index.html | 2 +- .../apps/business/report/pbreportlist.html | 2 +- .../apps/business/report/replylist.html | 2 +- .../templates/apps/business/view/index.html | 2 +- .../apps/callout/dialplan/index.html | 32 +- .../apps/callout/reports/agent-monitor.html | 34 +- .../apps/callout/reports/agents.html | 16 +- .../apps/callout/reports/communicate.html | 20 +- .../apps/callout/reports/daily-summary.html | 8 +- .../templates/apps/cca/agentusers.html | 74 + .../templates/apps/cca/blacklistadd.html | 129 + .../apps/cca/calloutcontact/add.html | 202 + .../apps/cca/calloutcontact/edit.html | 274 + .../templates/apps/cca/channel/phone.html | 116 + .../templates/apps/cca/channel/webim.html | 139 + .../templates/apps/cca/channel/weixin.html | 70 + .../templates/apps/cca/contacts.html | 48 + .../resources/templates/apps/cca/index.html | 142 + .../templates/apps/cca/mainagentuser.html | 659 ++ .../apps/cca/mainagentuser_callout.html | 378 + .../apps/cca/mainagentuserconter.html | 70 + .../apps/cca/mainagentusersearch.html | 62 + .../templates/apps/cca/media/message.html | 66 + .../apps/cca/media/messageimage.html | 64 + .../templates/apps/cca/othertopic.html | 32 + .../templates/apps/cca/quicklist.html | 146 + .../templates/apps/cca/quickreply/add.html | 101 + .../apps/cca/quickreply/addtype.html | 141 + .../templates/apps/cca/quickreply/edit.html | 107 + .../apps/cca/quickreply/edittype.html | 142 + .../templates/apps/cca/quickreplycontent.html | 1 + .../templates/apps/cca/searchbox.html | 42 + .../resources/templates/apps/cca/summary.html | 107 + .../templates/apps/cca/topicdetail.html | 1 + .../templates/apps/cca/transfer.html | 86 + .../templates/apps/cca/transferagentlist.html | 50 + .../resources/templates/apps/cca/upload.html | 8 + .../templates/apps/cca/workorders.html | 58 + .../templates/apps/chatbot/include/left.html | 23 + .../templates/apps/chatbot/index.html | 52 +- .../templates/apps/desktop/include/left.html | 8 +- .../templates/apps/desktop/index.html | 43 +- .../templates/apps/desktop/onlineuser.html | 19 +- .../templates/apps/desktop/profile.html | 10 +- .../resources/templates/apps/entim/chat.html | 75 +- .../templates/apps/entim/group/index.html | 109 +- .../templates/apps/entim/group/more.html | 33 + .../templates/apps/entim/group/user.html | 49 +- .../templates/apps/entim/include/tpl.html | 4 +- .../resources/templates/apps/entim/index.html | 20 +- .../resources/templates/apps/entim/more.html | 33 + .../resources/templates/apps/entim/point.html | 4 +- .../templates/apps/im/chatbot/index.html | 15 +- .../templates/apps/im/chatbot/mobile.html | 13 +- .../templates/apps/im/collecting.html | 4 +- .../resources/templates/apps/im/cutimage.png | Bin 0 -> 291 bytes .../resources/templates/apps/im/index.html | 204 +- .../resources/templates/apps/im/leavemsg.html | 12 +- .../resources/templates/apps/im/mobile.html | 17 +- .../resources/templates/apps/im/point.html | 248 +- .../resources/templates/apps/im/text.html | 20 +- .../resources/templates/apps/include/tpl.html | 2 +- .../main/resources/templates/apps/index.html | 151 +- .../main/resources/templates/apps/index2.html | 563 -- .../templates/apps/service/agent/index.html | 8 +- .../templates/apps/service/comment/index.html | 14 +- .../templates/apps/service/current/index.html | 36 +- .../apps/service/current/transfer.html | 46 +- .../templates/apps/service/history/index.html | 214 +- .../templates/apps/service/include/left.html | 8 +- .../apps/service/leavemsg/index.html | 47 +- .../apps/service/online/chatmsg.html | 2 +- .../apps/service/online/contacts.html | 2 +- .../templates/apps/service/online/index.html | 49 +- .../templates/apps/service/online/trace.html | 2 +- .../apps/service/processed/index.html | 65 +- .../templates/apps/service/quene/index.html | 2 +- .../templates/apps/service/stats/coment.html | 173 +- .../templates/apps/service/stats/consult.html | 66 +- .../templates/apps/service/stats/report.html | 2 +- .../templates/apps/service/summary/index.html | 59 +- .../templates/apps/service/user/index.html | 2 +- .../templates/apps/setting/agent/acd.html | 2 +- .../templates/apps/setting/agent/adadd.html | 10 +- .../templates/apps/setting/agent/adedit.html | 11 +- .../templates/apps/setting/agent/adv.html | 2 +- .../apps/setting/agent/blacklist.html | 2 +- .../templates/apps/setting/agent/index.html | 92 +- .../templates/apps/setting/agent/tag.html | 2 +- .../apps/setting/quickreply/replylist.html | 6 +- .../resources/templates/apps/tenant/add.html | 8 +- .../resources/templates/apps/tenant/edit.html | 8 +- .../templates/apps/tenant/index.html | 2 +- .../src/main/resources/templates/login.html | 35 +- .../templates/public/agentstatus.html | 99 +- .../templates/public/clearcookie.html | 14 + .../resources/templates/public/error.html | 0 .../resources/templates/public/success.html | 1 + .../templates/resource/css/system.html | 36 +- .../templates/resource/css/ukefu.html | 45 +- .../chatopera/cc/basic/MainContextTest.java | 46 + .../com/chatopera/cc/util/CronToolsTest.java | 34 + .../assets/docker-entrypoint.sh | 15 +- contact-center/assets/setup-mysql-db.sh | 74 + contact-center/assets/sources.list | 54 + contact-center/assets/utils.sh | 27 + ...-MySQL-slim.sql => cosinee-MySQL-slim.sql} | 69 +- contact-center/config/tomcat.context.xml | 31 - .../Chatopera_cc_v1.postman_collection.json | 1110 +++ contact-center/docs/database/.gitignore | 1 + contact-center/docs/database/README.md | 25 + .../docs/database/docs}/README.md | 0 .../docs/database/docs/demo.html | 40 +- .../docs/database/docs}/jquery.sticky-kit.js | 0 .../docs/database/docs}/lang/da/language.php | 0 .../docs/database/docs}/lang/en/language.php | 0 .../docs/database/docs}/scripts.js | 0 .../docs/database/docs}/standalone.html | 0 .../docs/database/docs}/style.css | 0 .../docs/database/docs}/template.html | 0 .../docs/database/docs}/uikit.css | 0 .../docs/database/docs}/uikit.js | 0 contact-center/docs/database/generate.sh | 38 + .../docs/database/php/generator.php | 116 + contact-center/nohup.out | 0 .../activemq/data}/.gitignore | 0 .../activemq/logs}/.gitignore | 0 .../elasticsearch}/config/elasticsearch.yml | 0 .../elasticsearch}/config/logging.yml | 0 .../elasticsearch/config/scripts}/.gitignore | 0 database/elasticsearch/data/.gitignore | 2 + .../elasticsearch}/plugins/head/.gitignore | 0 .../elasticsearch}/plugins/head/.jshintrc | 0 .../elasticsearch}/plugins/head/Gruntfile.js | 0 .../elasticsearch}/plugins/head/LICENCE | 0 .../plugins/head/README.textile | 0 .../elasticsearch}/plugins/head/_site/app.css | 0 .../elasticsearch}/plugins/head/_site/app.js | 0 .../plugins/head/_site/base/favicon.png | Bin .../plugins/head/_site/base/loading.gif | Bin .../plugins/head/_site/base/reset.css | 0 .../plugins/head/_site/fonts/FontAwesome.otf | Bin .../head/_site/fonts/fontawesome-webfont.eot | Bin .../head/_site/fonts/fontawesome-webfont.svg | 0 .../head/_site/fonts/fontawesome-webfont.ttf | Bin .../head/_site/fonts/fontawesome-webfont.woff | Bin .../elasticsearch}/plugins/head/_site/i18n.js | 0 .../plugins/head/_site/index.html | 0 .../plugins/head/_site/lang/en_strings.js | 0 .../plugins/head/_site/lang/fr_strings.js | 0 .../plugins/head/_site/lang/pt_strings.js | 0 .../plugins/head/_site/lang/tr_strings.js | 0 .../plugins/head/_site/lang/zh_strings.js | 0 .../plugins/head/_site/vendor.css | 0 .../plugins/head/_site/vendor.js | 0 .../plugins/head/grunt_fileSets.js | 0 .../elasticsearch}/plugins/head/index.html | 0 .../elasticsearch}/plugins/head/package.json | 0 .../plugins/head/plugin-descriptor.properties | 0 .../plugins/head/src/app/app.css | 0 .../plugins/head/src/app/app.js | 0 .../plugins/head/src/app/base/boot.js | 0 .../plugins/head/src/app/base/favicon.png | Bin .../plugins/head/src/app/base/loading.gif | Bin .../plugins/head/src/app/base/reset.css | 0 .../plugins/head/src/app/data/boolQuery.js | 0 .../head/src/app/data/dataSourceInterface.js | 0 .../plugins/head/src/app/data/metaData.js | 0 .../head/src/app/data/metaDataFactory.js | 0 .../plugins/head/src/app/data/model/model.js | 0 .../head/src/app/data/model/modelSpec.js | 0 .../plugins/head/src/app/data/query.js | 0 .../src/app/data/queryDataSourceInterface.js | 0 .../src/app/data/resultDataSourceInterface.js | 0 .../plugins/head/src/app/lang/en_strings.js | 0 .../plugins/head/src/app/lang/fr_strings.js | 0 .../plugins/head/src/app/lang/pt_strings.js | 0 .../plugins/head/src/app/lang/tr_strings.js | 0 .../plugins/head/src/app/lang/zh_strings.js | 0 .../head/src/app/services/cluster/cluster.js | 0 .../src/app/services/cluster/clusterSpec.js | 0 .../app/services/clusterState/clusterState.js | 0 .../services/clusterState/clusterStateSpec.js | 0 .../services/preferences/preferenceSpec.js | 0 .../app/services/preferences/preferences.js | 0 .../app/ui/abstractField/abstractField.css | 0 .../src/app/ui/abstractField/abstractField.js | 0 .../app/ui/abstractPanel/abstractPanel.css | 0 .../src/app/ui/abstractPanel/abstractPanel.js | 0 .../app/ui/abstractWidget/abstractWidget.js | 0 .../head/src/app/ui/anyRequest/anyRequest.css | 0 .../head/src/app/ui/anyRequest/anyRequest.js | 0 .../head/src/app/ui/browser/browser.css | 0 .../head/src/app/ui/browser/browser.js | 0 .../plugins/head/src/app/ui/button/button.css | 0 .../plugins/head/src/app/ui/button/button.js | 0 .../head/src/app/ui/button/buttonDemo.js | 0 .../head/src/app/ui/checkField/checkField.js | 0 .../src/app/ui/checkField/checkFieldDemo.js | 0 .../src/app/ui/checkField/checkFieldSpec.js | 0 .../app/ui/clusterConnect/clusterConnect.css | 0 .../app/ui/clusterConnect/clusterConnect.js | 0 .../ui/clusterConnect/clusterConnectSpec.js | 0 .../ui/clusterOverview/clusterOverview.css | 0 .../app/ui/clusterOverview/clusterOverview.js | 0 .../head/src/app/ui/csvTable/csvTable.js | 0 .../src/app/ui/dateHistogram/dateHistogram.js | 0 .../src/app/ui/dialogPanel/dialogPanel.js | 0 .../app/ui/draggablePanel/draggablePanel.js | 0 .../app/ui/filterBrowser/filterBrowser.css | 0 .../src/app/ui/filterBrowser/filterBrowser.js | 0 .../plugins/head/src/app/ui/header/header.css | 0 .../plugins/head/src/app/ui/header/header.js | 0 .../head/src/app/ui/helpPanel/helpPanel.js | 0 .../src/app/ui/indexOverview/indexOverview.js | 0 .../src/app/ui/indexSelector/indexSelector.js | 0 .../head/src/app/ui/infoPanel/infoPanel.css | 0 .../head/src/app/ui/infoPanel/infoPanel.js | 0 .../head/src/app/ui/jsonPanel/jsonPanel.css | 0 .../head/src/app/ui/jsonPanel/jsonPanel.js | 0 .../head/src/app/ui/jsonPretty/jsonPretty.css | 0 .../head/src/app/ui/jsonPretty/jsonPretty.js | 0 .../head/src/app/ui/menuButton/menuButton.css | 0 .../head/src/app/ui/menuButton/menuButton.js | 0 .../head/src/app/ui/menuPanel/menuPanel.css | 0 .../head/src/app/ui/menuPanel/menuPanel.js | 0 .../head/src/app/ui/nodesView/nodesView.css | 0 .../head/src/app/ui/nodesView/nodesView.js | 0 .../src/app/ui/nodesView/nodesViewDemo.js | 0 .../plugins/head/src/app/ui/page/page.js | 0 .../head/src/app/ui/panelForm/panelForm.css | 0 .../head/src/app/ui/panelForm/panelForm.js | 0 .../src/app/ui/queryFilter/queryFilter.css | 0 .../src/app/ui/queryFilter/queryFilter.js | 0 .../src/app/ui/refreshButton/refreshButton.js | 0 .../app/ui/refreshButton/refreshButtonDemo.js | 0 .../app/ui/refreshButton/refreshButtonSpec.js | 0 .../src/app/ui/resultTable/resultTable.js | 0 .../ui/selectMenuPanel/selectMenuPanel.css | 0 .../app/ui/selectMenuPanel/selectMenuPanel.js | 0 .../app/ui/sidebarSection/sidebarSection.css | 0 .../app/ui/sidebarSection/sidebarSection.js | 0 .../src/app/ui/splitButton/splitButton.css | 0 .../src/app/ui/splitButton/splitButton.js | 0 .../src/app/ui/splitButton/splitButtonDemo.js | 0 .../ui/structuredQuery/structuredQuery.css | 0 .../app/ui/structuredQuery/structuredQuery.js | 0 .../plugins/head/src/app/ui/table/table.css | 0 .../plugins/head/src/app/ui/table/table.js | 0 .../head/src/app/ui/textField/textField.js | 0 .../src/app/ui/textField/textFieldDemo.js | 0 .../head/src/app/ui/toolbar/toolbar.css | 0 .../head/src/app/ui/toolbar/toolbar.js | 0 .../plugins/head/src/app/ux/class.js | 0 .../plugins/head/src/app/ux/dragdrop.js | 0 .../head/src/app/ux/fieldCollection.js | 0 .../plugins/head/src/app/ux/observable.js | 0 .../plugins/head/src/app/ux/singleton.js | 0 .../plugins/head/src/app/ux/singletonSpec.js | 0 .../plugins/head/src/app/ux/table.css | 0 .../head/src/app/ux/templates/templateSpec.js | 0 .../head/src/app/ux/templates/templates.js | 0 .../dateRangeParser/date-range-parser.js | 0 .../vendor/font-awesome/css/font-awesome.css | 0 .../font-awesome/css/font-awesome.min.css | 0 .../vendor/font-awesome/fonts/FontAwesome.otf | Bin .../fonts/fontawesome-webfont.eot | Bin .../fonts/fontawesome-webfont.svg | 0 .../fonts/fontawesome-webfont.ttf | Bin .../fonts/fontawesome-webfont.woff | Bin .../vendor/graphael/g.raphael.standalone.js | 0 .../plugins/head/src/vendor/i18n/i18n.js | 0 .../plugins/head/src/vendor/joey/joey.js | 0 .../plugins/head/src/vendor/jquery/jquery.js | 0 .../head/src/vendor/nohtml/jquery-nohtml.js | 0 .../plugins/head/test/demo.html | 0 .../head/test/generators/conflictingField.sh | 0 .../test/generators/delete_all_indices.sh | 0 .../head/test/generators/multi_type.sh | 0 .../head/test/generators/twitter_feed.sh | 0 .../head/test/generators/twitter_river.sh | 0 .../plugins/head/test/perf.html | 0 .../plugins/head/test/spec/specHelper.js | 0 {mysql => database/mysql}/admin/start.sh | 0 {mysql => database/mysql}/admin/stop.sh | 0 .../mysql}/config/conf.d/docker.cnf | 0 .../mysql}/config/conf.d/mysql.cnf | 0 {mysql => database/mysql}/config/my.cnf | 0 .../mysql}/config/my.cnf.fallback | 0 {mysql => database/mysql}/config/mysql.cnf | 0 .../mysql}/config/mysql.conf.d/mysqld.cnf | 0 database/mysql/data/.gitignore | 2 + {redis => database/redis}/admin/start.sh | 0 {redis => database/redis}/admin/stop.sh | 0 {redis => database/redis}/data/.gitignore | 0 docker-compose.yml | 148 +- .../head/elasticsearch-head.sublime-project | 9 - nginx/certs/.gitignore | 2 + nginx/conf.d/default.conf | 28 + nginx/logs/.gitignore | 2 + sample.env | 14 + scripts/flush.sh | 13 +- scripts/start.sh | 2 +- 1266 files changed, 52079 insertions(+), 31958 deletions(-) create mode 100644 INTRODUCTION.md delete mode 100644 cc-switch/.gitignore delete mode 100644 cc-switch/README.md delete mode 100755 cc-switch/admin/test.sh delete mode 100644 cc-switch/app/Dockerfile delete mode 100644 cc-switch/app/config/dev.env.sample delete mode 100644 cc-switch/app/config/index.js delete mode 100644 cc-switch/app/control.js delete mode 100644 cc-switch/app/dialplan.js delete mode 100644 cc-switch/app/engine.js delete mode 100644 cc-switch/app/fs.js delete mode 100644 cc-switch/app/index.js delete mode 100644 cc-switch/app/minio.js delete mode 100644 cc-switch/app/package.json delete mode 100644 cc-switch/app/test/callout.answer.test.js delete mode 100644 cc-switch/app/test/callout.hangup.test.js rename cc-switch/admin/dev.sh => contact-center/admin/test.sh (75%) create mode 100644 contact-center/app/.gitignore rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/Application.java (62%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/ServletInitializer.java (94%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/acd/AutomaticServiceDist.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/activemq/AgentAuditSubscription.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/activemq/AgentSessionSubscription.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/activemq/AgentSubscription.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/activemq/BlackListEventSubscription.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/activemq/BrokerPublisher.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/activemq/ChatbotEventSubscription.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/activemq/ConnectionEventSubscription.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/activemq/OnlineUserSubscription.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/activemq/PbxEventSubscription.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/aggregation/filter/AgentCallOutFilter.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/aggregation/filter/AgentStatusBusyOrgiFilter.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/aggregation/filter/AgentStatusOrgiFilter.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/aggregation/filter/AgentUserOrgiFilter.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/aggregation/filter/AiCallOutFilter.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/aop/AgentUserAspect.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/aop/BlackEntityAspect.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/aop/OnlineUserAspect.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/aop/SyncDatabaseAspect.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/algorithm/AutomaticServiceDist.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/basic/aop/SyncDatabaseExt.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/cache/CacheBean.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/cache/CacheHelper.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/cache/CacheInstance.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/cache/hazelcast/HazlcastCacheHelper.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/cache/hazelcast/impl/AgentStatusCache.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/cache/hazelcast/impl/AgentUserCache.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/cache/hazelcast/impl/ApiUserCache.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/cache/hazelcast/impl/CallCenterCache.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/cache/hazelcast/impl/JobCache.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/cache/hazelcast/impl/MultiCache.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/cache/hazelcast/impl/OnlineCache.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/cache/hazelcast/impl/SystemCache.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/config/ApiConfigure.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/config/ApiRequestMatchingFilter.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/config/DisruptorConfigure.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/config/IMServerConfiguration.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/config/RedisConfigure.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/config/StartedEventListener.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/handler/ApplicationController.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/handler/LoginController.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/handler/admin/AdminController.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/handler/admin/callcenter/CallCenterController.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/handler/admin/callcenter/CallCenterExtentionController.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/handler/admin/callcenter/CallCenterResourceController.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/handler/admin/callcenter/CallCenterSipTrunkController.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/handler/admin/organ/OrganController.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/handler/admin/role/RoleController.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/handler/admin/system/HazelcastMonitorController.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/handler/admin/system/LogController.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/handler/admin/system/SysDicController.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/handler/api/ApiLoginController.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/handler/api/rest/ApiAgentUserController.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/handler/api/rest/ApiContactsController.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/handler/api/rest/ApiServiceQueneController.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/handler/api/rest/ApiSysDicController.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/handler/apps/AppsController.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/handler/apps/agent/AgentController.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/handler/apps/callcenter/SipTrunkController.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/handler/apps/contacts/ContactsController.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/handler/apps/customer/CustomerController.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/handler/apps/entim/EntIMController.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/handler/apps/internet/IMController.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/handler/apps/quality/AgentQualityController.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/handler/apps/service/StatsController.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/handler/apps/tenant/TenantController.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/handler/apps/test/TestController.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/handler/resource/UsersResourceController.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/im/client/NettyAgentClient.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/im/client/NettyCalloutClient.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/im/client/NettyChatbotClient.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/im/client/NettyIMClient.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/im/handler/AgentEventHandler.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/im/handler/IMEventHandler.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/im/message/AgentServiceMessage.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/im/message/AgentStatusMessage.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/im/message/ChatMessage.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/im/message/ChatObject.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/im/message/Message.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/im/message/NewRequestMessage.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/im/message/OtherMessage.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/im/message/OtherMessageItem.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/im/router/AgentUserRouter.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/im/router/CallOutMessageRouter.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/im/router/MessageRouter.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/im/router/OutMessageRouter.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/im/router/Router.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/im/router/RouterHelper.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/im/router/WebIMOutMessageRouter.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/im/util/ChatbotUtils.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/im/util/HumanUtils.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/im/util/IMServiceUtils.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/interceptor/LogIntercreptorHandler.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/interceptor/UserInterceptorHandler.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/model/AgentReport.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/model/AgentStatus.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/model/AiUser.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/model/InviteRecord.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/model/JobDetail.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/model/Log.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/model/MessageDataBean.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/model/MessageInContent.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/model/MessageOutContent.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/model/OnlineUser.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/model/Organ.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/model/Organization.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/model/SNSAccount.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/model/UKFacet.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/model/UKeFuDic.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/model/User.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/model/UserHistory.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/model/UserRole.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/persistence/es/ContactsRepository.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/persistence/es/ContactsRepositoryImpl.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/persistence/hibernate/BaseService.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/persistence/impl/AgentUserService.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/persistence/impl/CallOutQuene.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/persistence/impl/ContactsDataExchangeImpl.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/persistence/impl/HazelcastService.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/persistence/impl/UserService.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/AgentServiceRepository.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/AgentUserContactsRepository.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/AgentUserRepository.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/AgentUserTaskRepository.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/CallAgentRepository.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/ChatMessageRepository.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/ChatbotRepository.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/ColumnPropertiesRepository.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/CubeMetadataRepository.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/InstructionRepository.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/JobDetailRepository.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/KbsTypeRepository.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/KnowledgeTypeRepository.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/OnlineUserRepository.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/OrganRepository.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/QualityRepository.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/QueSurveyAnswerRepository.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/ReportCubeService.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/ReportFilterRepository.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/RoleRepository.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/SNSAccountRepository.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/SaleStatusRepository.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/SysDicRepository.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/TablePropertiesRepository.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/UKefuCallOutConfigRepository.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/UKefuCallOutNamesRepository.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/UKefuCallOutTaskRepository.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/UserRepository.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/WeiXinUserRepository.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/WorkOrderTypeRepository.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/schedule/Fetcher.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/schedule/LogTask.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/schedule/NamesTask.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/schedule/Task.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/schedule/WebIMAgentDispatcher.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/schedule/WebIMOnlineUserDispatcher.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/app/schedule/WebIMTask.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/basic/Constants.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/basic/I18N.java rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/basic/MainContext.java (65%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/basic/MainUtils.java (82%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/basic/Viewport.java (54%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/basic/plugins/IPluginDescriptor.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/basic/plugins/PluginRegistry.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/basic/plugins/PluginsLoader.java rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/basic/resource/ActivityResource.java (81%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/basic/resource/BatchResource.java (84%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/basic/resource/OutputTextFormat.java (91%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/basic/resource/Resource.java (91%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/cache/Cache.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/cache/RedisCommand.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/cache/RedisKey.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/concurrent/chatbot/ChatbotDisruptorExceptionHandler.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/concurrent/chatbot/ChatbotEvent.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/concurrent/chatbot/ChatbotEventFactory.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/concurrent/chatbot/ChatbotEventHandler.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/concurrent/chatbot/ChatbotEventProducer.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/concurrent/dsdata/DSDataEventHandler.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/concurrent/dsdata/DSDataEventProducer.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/concurrent/dsdata/DSQueueProcessHandler.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/concurrent/multiupdate/MultiUpdateEvent.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/concurrent/multiupdate/MultiUpdateEventFactory.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/concurrent/multiupdate/MultiUpdateEventHandler.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/concurrent/multiupdate/MultiUpdateEventProducer.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/concurrent/user/UserDataEvent.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/concurrent/user/UserDataEventFactory.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/concurrent/user/UserDataEventProducer.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/concurrent/user/UserEventHandler.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/config/ActiveMQConfigure.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/config/ApiRequestMatchingFilter.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/config/AppCtxRefreshEventListener.java rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/config/ApplicationStartupListener.java (89%) rename contact-center/app/src/main/java/com/chatopera/cc/{app/config/UKeFuExceptionHandler.java => config/CSKeFuExceptionHandler.java} (87%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/config/DelegateRequestMatchingFilter.java (89%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/config/DruidConfiguration.java (96%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/config/ExecutorConfig.java (85%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/config/MessagingServerConfigure.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/config/RedisConfigure.java rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/config/StringToDateConverter.java (95%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/config/UKWebAppConfigurer.java (76%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/config/WebConfigBeans.java (95%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/config/WebSecurityConfig.java (97%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/config/WebServerConfiguration.java (53%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/config/WebServerSessionConfigure.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/config/conditions/CalloutBeanCondition.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/config/plugins/SkypePluginPresentCondition.java rename contact-center/app/src/main/java/com/chatopera/cc/{concurrent/dsdata/ESData.java => exception/CSKefuCacheException.java} (71%) rename contact-center/app/src/main/java/com/chatopera/cc/exception/{UCKeFuExceptionListener.java => InstantMessagingExceptionListener.java} (76%) delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/exchange/UserEvent.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/handler/ApplicationController.java rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/handler/Handler.java (75%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/handler/LoginController.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/handler/admin/AdminController.java rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/handler/admin/area/AreaController.java (80%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/handler/admin/callcenter/CallCenterAclController.java (92%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/handler/admin/callcenter/CallCenterBlackController.java (89%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/handler/admin/callcenter/CallCenterController.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/handler/admin/callcenter/CallCenterExtentionController.java rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/handler/admin/callcenter/CallCenterIvrController.java (91%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/handler/admin/callcenter/CallCenterMediaController.java (93%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/handler/admin/callcenter/CallCenterResourceController.java rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/handler/admin/callcenter/CallCenterRouterController.java (87%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/handler/admin/callcenter/CallCenterSipTrunkController.java rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/handler/admin/callcenter/CallCenterSkillController.java (88%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/handler/admin/channel/CalloutChannelController.java (55%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/handler/admin/channel/SNSAccountIMController.java (75%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/handler/admin/channel/WebIMController.java (79%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/handler/admin/config/SystemConfigController.java (72%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/handler/admin/config/SystemMessageController.java (89%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/handler/admin/organ/OrganController.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/handler/admin/role/RoleController.java rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/handler/admin/skill/AgentSkillController.java (88%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/handler/admin/system/MetadataController.java (90%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/handler/admin/system/SysDicController.java rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/handler/admin/system/TemplateController.java (88%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/handler/admin/users/UsersController.java (67%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/handler/api/ApiLoginController.java rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/handler/api/ApiTokensErrorController.java (77%) rename contact-center/app/src/main/java/com/chatopera/cc/{app/handler/api/rest => handler/api/request}/QueryParams.java (92%) rename contact-center/app/src/main/java/com/chatopera/cc/{app/handler/api/rest => handler/api/request}/RequestValues.java (92%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/handler/api/request/RestUtils.java (97%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/handler/api/rest/ApiAgentUserController.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/handler/api/rest/ApiAppsController.java rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/handler/api/rest/ApiCallMonitorController.java (93%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/handler/api/rest/ApiCallRecordsController.java (87%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/handler/api/rest/ApiChatMessageController.java (84%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/handler/api/rest/ApiChatbotController.java (81%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/handler/api/rest/ApiContactNotesController.java (87%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/handler/api/rest/ApiContactTagsController.java (92%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/handler/api/rest/ApiContactsController.java rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/handler/api/rest/ApiDailplanRunController.java (82%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/handler/api/rest/ApiLeavemsgController.java (52%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/handler/api/rest/ApiOnlineUserController.java (53%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/handler/api/rest/ApiOrganController.java (83%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/handler/api/rest/ApiQualityController.java (54%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/handler/api/rest/ApiQuickReplyController.java (81%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/handler/api/rest/ApiQuickTypeController.java (84%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/handler/api/rest/ApiServiceQueneController.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/handler/api/rest/ApiSysDicController.java rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/handler/api/rest/ApiTagsController.java (89%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/handler/api/rest/ApiUserController.java (83%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/handler/api/rest/ApiWebIMController.java (58%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/handler/api/rest/ApiWlContactsController.java rename contact-center/app/src/main/java/com/chatopera/cc/{app/handler/api/request => handler/api/rest}/QueryParams.java (92%) rename contact-center/app/src/main/java/com/chatopera/cc/{app/handler/api/request => handler/api/rest}/RequestValues.java (92%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/handler/api/rest/UkefuApiTagsController.java (77%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/handler/apps/AppsController.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/handler/apps/agent/AgentController.java rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/handler/apps/callcenter/ExtentionController.java (86%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/handler/apps/callcenter/SipTrunkController.java rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/handler/apps/callout/CalloutController.java (92%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/handler/apps/cca/AgentAuditController.java rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/handler/apps/chatbot/ChatbotController.java (72%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/handler/apps/contacts/ContactsController.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/handler/apps/customer/CustomerController.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/handler/apps/entim/EntIMController.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/handler/apps/internet/IMController.java rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/handler/apps/job/JobController.java (88%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/handler/apps/kbs/KbsController.java (84%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/handler/apps/kbs/TopicController.java (87%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/handler/apps/message/MessageController.java (90%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/handler/apps/organization/OrganizationController.java (88%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/handler/apps/quality/AgentQualityController.java rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/handler/apps/report/CubeController.java (92%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/handler/apps/report/CubeLevelController.java (89%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/handler/apps/report/CubeMeasureController.java (90%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/handler/apps/report/DimensionController.java (88%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/handler/apps/report/ReportController.java (91%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/handler/apps/report/ReportDesignController.java (93%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/handler/apps/report/ReportViewController.java (88%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/handler/apps/service/AgentSummaryController.java (88%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/handler/apps/service/ChatServiceController.java (57%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/handler/apps/service/CommentController.java (87%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/handler/apps/service/OnlineUserController.java (50%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/handler/apps/service/ProcessedSummaryController.java (87%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/handler/apps/service/StatsController.java rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/handler/apps/setting/IMAgentController.java (86%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/handler/apps/setting/QuickReplyController.java (83%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/handler/apps/tenant/TenantController.java rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/handler/resource/CallAgentResourceController.java (88%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/handler/resource/ContactsResourceController.java (89%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/handler/resource/CssResourceController.java (92%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/handler/resource/MediaController.java (92%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/handler/resource/QuickReplyResourceController.java (86%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/handler/resource/SysDicResourceController.java (80%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/handler/resource/UsersResourceController.java rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/interceptor/CrossInterceptorHandler.java (73%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/interceptor/LogIntercreptorHandler.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/interceptor/UserInterceptorHandler.java rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/Acl.java (94%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/AdType.java (94%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/model/AgentReport.java rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/AgentService.java (94%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/AgentServiceSatis.java (94%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/AgentServiceSummary.java (94%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/model/AgentStatus.java rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/AgentUser.java (90%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/model/AgentUserAudit.java rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/AgentUserContacts.java (94%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/AgentUserTask.java (95%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/AiConfig.java (96%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/AiSNSAccount.java (94%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/AreaType.java (94%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/AttachmentFile.java (95%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/BlackEntity.java (95%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/CallAgent.java (94%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/CallCenterSkill.java (94%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/CallMonitor.java (95%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/CallMonitorPerformance.java (95%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/CallOutDialplan.java (99%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/CallOutLogDialPlan.java (98%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/CallOutTarget.java (98%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/ChartProperties.java (95%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/Chatbot.java (95%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/ColumnProperties.java (95%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/ContactNotes.java (97%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/Contacts.java (86%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/CousultInvite.java (94%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/Cube.java (94%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/CubeLevel.java (95%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/CubeMeasure.java (95%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/CubeMetadata.java (95%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/CubeType.java (94%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/CustomerGroupForm.java (93%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/DataDic.java (95%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/DataEvent.java (94%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/model/Dict.java rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/Dimension.java (95%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/DrillDown.java (95%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/ESBean.java (92%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/EntCustomer.java (95%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/Extention.java (92%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/Favorites.java (94%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/FormFilter.java (94%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/FormFilterItem.java (92%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/FormFilterRequest.java (93%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/Generation.java (94%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/IMGroup.java (94%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/IMGroupUser.java (94%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/Instruction.java (95%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/model/InviteRecord.java rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/IvrMenu.java (95%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/model/JobDetail.java rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/JobTask.java (95%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/KbsExpert.java (94%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/KbsTopic.java (99%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/KbsTopicComment.java (94%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/KbsType.java (94%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/KnowledgeType.java (94%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/LeaveMsg.java (93%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/Media.java (94%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/MetadataTable.java (94%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/model/OnlineUser.java rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/OnlineUserHis.java (95%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/OrdersComment.java (94%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/model/Organ.java rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/OrganRole.java (94%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/model/OrganUser.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/model/Organization.java rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/OrgiSkillRel.java (94%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/PbxHost.java (95%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/ProcessContent.java (94%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/Product.java (94%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/PropertiesEvent.java (94%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/PublishedCube.java (94%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/PublishedReport.java (94%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/Quality.java (94%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/QualityRequest.java (93%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/QueSurveyAnswer.java (95%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/QueSurveyProcess.java (95%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/QueSurveyQuestion.java (96%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/QuickReply.java (92%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/QuickType.java (94%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/RecentUser.java (94%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/Report.java (95%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/ReportFilter.java (95%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/ReportModel.java (95%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/Reporter.java (94%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/RequestLog.java (91%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/Role.java (94%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/RoleAuth.java (94%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/RouterRules.java (95%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/model/SNSAccount.java rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/SaleStatus.java (93%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/Scene.java (98%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/SceneType.java (94%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/Secret.java (94%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/ServiceAi.java (93%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/SessionConfig.java (96%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/SipTrunk.java (95%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/Skill.java (94%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/SkillExtention.java (94%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/StatusEvent.java (94%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/StatusEventSatisf.java (94%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/StreamingFile.java (84%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/SysDic.java (95%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/SystemConfig.java (96%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/SystemMessage.java (95%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/TableProperties.java (95%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/Tag.java (93%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/TagRelation.java (94%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/Template.java (95%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/Tenant.java (95%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/Topic.java (98%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/TopicItem.java (94%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/UKAgg.java (80%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/UKefuCallOutConfig.java (95%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/UKefuCallOutFilter.java (94%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/UKefuCallOutNames.java (94%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/UKefuCallOutRole.java (94%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/UKefuCallOutTask.java (94%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/UploadStatus.java (93%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/model/User.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/model/UserHistory.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/model/UserRole.java rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/UserTraceHistory.java (83%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/WebIMReport.java (93%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/WeiXinUser.java (95%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/WorkMonitor.java (95%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/WorkOrderType.java (94%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/WorkOrders.java (99%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/WorkSession.java (95%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/WorkTime.java (95%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/model/WxMpEvent.java (94%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/model/keys/OrganUserId.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/peer/PeerContext.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/peer/PeerSyncIM.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/peer/PeerUtils.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/peer/im/ComposeMw1.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/peer/im/ComposeMw2.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/peer/im/ComposeMw3.java rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/blob/JpaBlobHelper.java (93%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/persistence/es/ChatMessageEsRepository.java rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/es/ContactNotesRepository.java (81%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/es/ContactsEsCommonRepository.java (52%) rename contact-center/app/src/main/java/com/chatopera/cc/{util/UCKeFuIdGenerator.java => persistence/es/ContactsIndependRepository.java} (76%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/persistence/es/ContactsRepository.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/persistence/es/ContactsRepositoryImpl.java rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/es/EntCustomerEsCommonRepository.java (57%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/es/EntCustomerRepository.java (88%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/es/EntCustomerRepositoryImpl.java (94%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/es/KbsTopicCommentEsCommonRepository.java (59%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/es/KbsTopicCommentRepository.java (88%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/es/KbsTopicCommentRepositoryImpl.java (95%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/es/KbsTopicEsCommonRepository.java (61%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/es/KbsTopicRepository.java (88%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/es/KbsTopicRepositoryImpl.java (96%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/es/QuickReplyEsCommonRepository.java (53%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/es/QuickReplyRepository.java (88%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/es/QuickReplyRepositoryImpl.java (95%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/es/TopicEsCommonRepository.java (60%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/es/TopicRepository.java (89%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/es/TopicRepositoryImpl.java (96%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/es/UKAggResultExtractor.java (93%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/es/UKAggTopResultExtractor.java (94%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/es/UKResultMapper.java (96%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/persistence/hibernate/BaseService.java rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/impl/BatchDataProcess.java (87%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/impl/DataBatProcess.java (88%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/impl/ESDataExchangeImpl.java (83%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/impl/OrganDataExchangeImpl.java (83%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/impl/QuickTypeDataExchangeImpl.java (83%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/impl/ServiceDataExchangeImpl.java (83%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/impl/TopicDataExchangeImpl.java (83%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/impl/TopicMoreDataExchangeImpl.java (80%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/impl/TopicTypeDataExchangeImpl.java (82%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/impl/UserDataExchangeImpl.java (83%) rename contact-center/app/src/main/java/com/chatopera/cc/{exchange => persistence/interfaces}/CallCenterInterface.java (88%) rename contact-center/app/src/main/java/com/chatopera/cc/{exchange/CallOutWireEvent.java => persistence/interfaces/CalloutWireEvent.java} (84%) rename contact-center/app/src/main/java/com/chatopera/cc/{exchange => persistence/interfaces}/DataExchangeInterface.java (92%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/repository/AclRepository.java (73%) rename contact-center/app/src/main/java/com/chatopera/cc/{app/persistence/repository/OrganRoleRepository.java => persistence/repository/AdTypeRepository.java} (66%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/persistence/repository/AgentReportRepository.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/persistence/repository/AgentServiceRepository.java rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/repository/AgentServiceSatisRepository.java (73%) rename contact-center/app/src/main/java/com/chatopera/cc/{app/persistence/repository/ProcessContentRepository.java => persistence/repository/AgentStatusRepository.java} (53%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/persistence/repository/AgentUserContactsRepository.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/persistence/repository/AgentUserRepository.java rename contact-center/app/src/main/java/com/chatopera/cc/{app/persistence/repository/AiSNSAccountRepository.java => persistence/repository/AgentUserTaskRepository.java} (60%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/persistence/repository/AiConfigRepository.java rename contact-center/app/src/main/java/com/chatopera/cc/{app/persistence/repository/AreaTypeRepository.java => persistence/repository/AiSNSAccountRepository.java} (66%) rename contact-center/app/src/main/java/com/chatopera/cc/{app/persistence/repository/GenerationRepository.java => persistence/repository/AreaTypeRepository.java} (68%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/persistence/repository/AttachmentRepository.java rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/repository/BaseRepository.java (87%) rename contact-center/app/src/main/java/com/chatopera/cc/{app/persistence/repository/AgentStatusRepository.java => persistence/repository/BlackListRepository.java} (62%) rename contact-center/app/src/main/java/com/chatopera/cc/{app/persistence/repository/KbsExpertRepository.java => persistence/repository/CallAgentRepository.java} (61%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/repository/CallCenterSkillRepository.java (72%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/repository/CallMonitorPerformanceRepository.java (86%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/repository/CallMonitorRepository.java (57%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/repository/CallOutDialplanRepository.java (74%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/repository/CallOutLogDialPlanRepository.java (82%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/repository/CallOutTargetRepository.java (78%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/persistence/repository/ChatMessageRepository.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/persistence/repository/ChatbotRepository.java rename contact-center/app/src/main/java/com/chatopera/cc/{app/persistence/repository/CubeLevelRepository.java => persistence/repository/ColumnPropertiesRepository.java} (62%) rename contact-center/app/src/main/java/com/chatopera/cc/{app/persistence/repository/OnlineUserHisRepository.java => persistence/repository/ConsultInviteRepository.java} (56%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/persistence/repository/CubeLevelRepository.java rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/repository/CubeMeasureRepository.java (70%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/persistence/repository/CubeMetadataRepository.java rename contact-center/app/src/main/java/com/chatopera/cc/{app/persistence/repository/RequestLogRepository.java => persistence/repository/CubeRepository.java} (66%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/repository/CubeService.java (95%) rename contact-center/app/src/main/java/com/chatopera/cc/{app/persistence/repository/TagRelationRepository.java => persistence/repository/CubeTypeRepository.java} (68%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/repository/DataDicRepository.java (59%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/repository/DataEventRepository.java (75%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/repository/DataSourceService.java (93%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/repository/DbDataRepository.java (89%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/persistence/repository/DimensionRepository.java rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/repository/DrilldownRepository.java (78%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/repository/ExtentionRepository.java (53%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/persistence/repository/FormFilterItemRepository.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/persistence/repository/FormFilterRepository.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/persistence/repository/GenerationRepository.java rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/repository/IMGroupRepository.java (69%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/repository/IMGroupUserRepository.java (59%) rename contact-center/app/src/main/java/com/chatopera/cc/{app/persistence/repository/UKefuCallOutRoleRepository.java => persistence/repository/InstructionRepository.java} (53%) rename contact-center/app/src/main/java/com/chatopera/cc/{app/persistence/repository/PublishedReportRepository.java => persistence/repository/InviteRecordRepository.java} (51%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/repository/IvrMenuRepository.java (67%) rename contact-center/app/src/main/java/com/chatopera/cc/{app/persistence/repository/WorkMonitorRepository.java => persistence/repository/JobDetailRepository.java} (52%) rename contact-center/app/src/main/java/com/chatopera/cc/{app/persistence/repository/QueSurveyProcessRepository.java => persistence/repository/KbsExpertRepository.java} (64%) rename contact-center/app/src/main/java/com/chatopera/cc/{app/persistence/repository/CubeTypeRepository.java => persistence/repository/KbsTypeRepository.java} (65%) rename contact-center/app/src/main/java/com/chatopera/cc/{app/persistence/repository/UKefuCallOutFilterRepository.java => persistence/repository/KnowledgeTypeRepository.java} (53%) rename contact-center/app/src/main/java/com/chatopera/cc/{app/persistence/repository/CubeRepository.java => persistence/repository/LeaveMsgRepository.java} (67%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/repository/MediaRepository.java (70%) rename contact-center/app/src/main/java/com/chatopera/cc/{app/persistence/repository/LeaveMsgRepository.java => persistence/repository/MetadataRepository.java} (66%) rename contact-center/app/src/main/java/com/chatopera/cc/{app/persistence/repository/FormFilterItemRepository.java => persistence/repository/OnlineUserHisRepository.java} (51%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/persistence/repository/OnlineUserRepository.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/persistence/repository/OrganRepository.java rename contact-center/app/src/main/java/com/chatopera/cc/{app/persistence/repository/AgentReportRepository.java => persistence/repository/OrganRoleRepository.java} (68%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/persistence/repository/OrganUserRepository.java rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/repository/OrganizationRepository.java (73%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/repository/OrgiSkillRelRepository.java (86%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/repository/PbxHostRepository.java (67%) rename contact-center/app/src/main/java/com/chatopera/cc/{app/persistence/repository/UserRoleRepository.java => persistence/repository/ProcessContentRepository.java} (61%) rename contact-center/app/src/main/java/com/chatopera/cc/{app/persistence/repository/AdTypeRepository.java => persistence/repository/ProductRepository.java} (62%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/repository/PropertiesEventRepository.java (81%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/persistence/repository/PublishedCubeRepository.java rename contact-center/app/src/main/java/com/chatopera/cc/{app/persistence/repository/AttachmentRepository.java => persistence/repository/PublishedReportRepository.java} (60%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/persistence/repository/QualityRepository.java rename contact-center/app/src/main/java/com/chatopera/cc/{app/persistence/repository/QueSurveyQuestionRepository.java => persistence/repository/QueSurveyAnswerRepository.java} (54%) rename contact-center/app/src/main/java/com/chatopera/cc/{app/persistence/repository/InviteRecordRepository.java => persistence/repository/QueSurveyProcessRepository.java} (66%) rename contact-center/app/src/main/java/com/chatopera/cc/{app/persistence/repository/MetadataRepository.java => persistence/repository/QueSurveyQuestionRepository.java} (60%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/repository/QuickTypeRepository.java (56%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/repository/RecentUserRepository.java (72%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/persistence/repository/ReportCubeService.java rename contact-center/app/src/main/java/com/chatopera/cc/{app/persistence/repository/ServiceAiRepository.java => persistence/repository/ReportFilterRepository.java} (59%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/repository/ReportModelRepository.java (68%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/repository/ReportRepository.java (63%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/repository/ReporterRepository.java (69%) rename contact-center/app/src/main/java/com/chatopera/cc/{app/persistence/repository/LogRepository.java => persistence/repository/RequestLogRepository.java} (70%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/repository/RoleAuthRepository.java (60%) rename contact-center/app/src/main/java/com/chatopera/cc/{app/persistence/repository/ConsultInviteRepository.java => persistence/repository/RoleRepository.java} (61%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/repository/RouterRulesRepository.java (72%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/persistence/repository/SNSAccountRepository.java rename contact-center/app/src/main/java/com/chatopera/cc/{app/persistence/repository/ProductRepository.java => persistence/repository/SaleStatusRepository.java} (56%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/repository/SceneRepository.java (80%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/repository/SecretRepository.java (75%) rename contact-center/app/src/main/java/com/chatopera/cc/{app/persistence/repository/TenantRepository.java => persistence/repository/ServiceAiRepository.java} (65%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/repository/ServiceSummaryRepository.java (56%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/repository/SessionConfigRepository.java (73%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/repository/SipTrunkRepository.java (61%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/repository/SkillExtentionRepository.java (76%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/repository/SkillRepository.java (92%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/repository/StatusEventRepository.java (59%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/repository/StatusEventSatisfRepository.java (82%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/repository/StreamingFileRepository.java (88%) rename contact-center/app/src/main/java/com/chatopera/cc/{app/persistence/repository/BlackListRepository.java => persistence/repository/SysDicRepository.java} (58%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/repository/SystemConfigRepository.java (73%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/repository/SystemMessageRepository.java (70%) rename contact-center/app/src/main/java/com/chatopera/cc/{app/persistence/repository/AiConfigRepository.java => persistence/repository/TablePropertiesRepository.java} (60%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/persistence/repository/TagRelationRepository.java rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/repository/TagRepository.java (65%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/repository/TemplateRepository.java (73%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/persistence/repository/TenantRepository.java rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/repository/TopicItemRepository.java (76%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/persistence/repository/UKefuCallOutConfigRepository.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/persistence/repository/UKefuCallOutFilterRepository.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/persistence/repository/UKefuCallOutNamesRepository.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/persistence/repository/UKefuCallOutRoleRepository.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/persistence/repository/UKefuCallOutTaskRepository.java rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/repository/UserEventRepository.java (86%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/persistence/repository/UserHistoryRepository.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/persistence/repository/UserRepository.java rename contact-center/app/src/main/java/com/chatopera/cc/{app/persistence/repository/PublishedCubeRepository.java => persistence/repository/UserRoleRepository.java} (55%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/repository/UserTraceRepository.java (89%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/persistence/repository/WeiXinUserRepository.java rename contact-center/app/src/main/java/com/chatopera/cc/{app/persistence/repository/WorkSessionRepository.java => persistence/repository/WorkMonitorRepository.java} (55%) rename contact-center/app/src/main/java/com/chatopera/cc/{app/persistence/repository/DimensionRepository.java => persistence/repository/WorkOrderTypeRepository.java} (67%) rename contact-center/app/src/main/java/com/chatopera/cc/{app/persistence/repository/FormFilterRepository.java => persistence/repository/WorkSessionRepository.java} (58%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/repository/WorkTimeRepository.java (73%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/repository/WxMpEventRepository.java (79%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/repository/XiaoEUKResultMapper.java (96%) rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/persistence/storage/MinioService.java (96%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/proxy/AgentAuditProxy.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/proxy/AgentProxy.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/proxy/AgentServiceProxy.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/proxy/AgentSessionProxy.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/proxy/AgentUserProxy.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/proxy/BlackEntityProxy.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/proxy/CalloutProxy.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/proxy/CalloutQueneProxy.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/proxy/ChatbotProxy.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/proxy/ContactsProxy.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/proxy/OnlineUserProxy.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/proxy/OrganProxy.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/proxy/UserProxy.java rename contact-center/app/src/main/java/com/chatopera/cc/{app => }/schedule/CallOutSheetTask.java (94%) rename contact-center/app/src/main/java/com/chatopera/cc/{app/schedule/CallOutPlanTask.java => schedule/CalloutPlanTask.java} (75%) rename contact-center/app/src/main/java/com/chatopera/cc/{app/schedule/CallOutWireTask.java => schedule/CalloutWireTask.java} (72%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/schedule/Fetcher.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/schedule/NamesTask.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/schedule/Task.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/schedule/WebIMTask.java rename contact-center/app/src/main/java/com/chatopera/cc/{app/im => socketio}/ServerRunner.java (77%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/socketio/client/NettyAgentClient.java rename contact-center/app/src/main/java/com/chatopera/cc/{app/im => socketio}/client/NettyCallCenterClient.java (87%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/socketio/client/NettyCalloutClient.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/socketio/client/NettyChatbotClient.java rename contact-center/app/src/main/java/com/chatopera/cc/{app/im => socketio}/client/NettyClient.java (74%) rename contact-center/app/src/main/java/com/chatopera/cc/{app/im => socketio}/client/NettyClients.java (57%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/socketio/client/NettyIMClient.java rename contact-center/app/src/main/java/com/chatopera/cc/{app/im => socketio}/client/UserClient.java (93%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/socketio/handler/AgentEventHandler.java rename contact-center/app/src/main/java/com/chatopera/cc/{app/im => socketio}/handler/CalloutEventHandler.java (93%) rename contact-center/app/src/main/java/com/chatopera/cc/{app/im => socketio}/handler/ChatbotEventHandler.java (59%) rename contact-center/app/src/main/java/com/chatopera/cc/{app/im => socketio}/handler/EntIMEventHandler.java (77%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/socketio/handler/IMEventHandler.java rename contact-center/app/src/main/java/com/chatopera/cc/{concurrent/dsdata/DSDataEventFactory.java => socketio/message/AgentStatusMessage.java} (65%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/socketio/message/ChatMessage.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/socketio/message/InterventMessage.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/socketio/message/Message.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/socketio/message/OtherMessageItem.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/socketio/util/HumanUtils.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/socketio/util/IMServiceUtils.java rename contact-center/app/src/main/java/com/chatopera/cc/{app/im => socketio}/util/RichMediaUtils.java (57%) delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/util/CallOutUtils.java delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/util/Constants.java create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/util/CskefuIdGenerator.java rename contact-center/app/src/main/java/com/chatopera/cc/util/{UKeFuList.java => CskefuList.java} (91%) rename contact-center/app/src/main/java/com/chatopera/cc/{aggregation => util}/MathHelper.java (98%) rename contact-center/app/src/main/java/com/chatopera/cc/util/{CheckMobile.java => MobileDevice.java} (93%) delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/util/OnlineUserUtils.java rename contact-center/app/src/main/java/com/chatopera/cc/util/{PropertiesEventUtils.java => PropertiesEventUtil.java} (95%) create mode 100644 contact-center/app/src/main/java/com/chatopera/cc/util/SerializeUtil.java rename contact-center/app/src/main/java/com/chatopera/cc/util/{StreamingFileUtils.java => StreamingFileUtil.java} (87%) rename contact-center/app/src/main/java/com/chatopera/cc/util/{WechatUtils.java => WechatUtil.java} (96%) rename contact-center/app/src/main/java/com/chatopera/cc/{aggregation/CallOutHangupAggsResult.java => util/callout/CalloutHangupAggsResult.java} (82%) rename contact-center/app/src/main/java/com/chatopera/cc/{aggregation/CallOutHangupAuditResult.java => util/callout/CalloutHangupAuditResult.java} (86%) rename contact-center/app/src/main/java/com/chatopera/cc/{concurrent => util}/dsdata/DSData.java (84%) rename contact-center/app/src/main/java/com/chatopera/cc/{concurrent => util}/dsdata/DSDataEvent.java (93%) rename contact-center/app/src/main/java/com/chatopera/cc/{concurrent => util}/dsdata/DataProcess.java (92%) rename contact-center/app/src/main/java/com/chatopera/cc/{concurrent => util}/dsdata/ExcelImportProecess.java (93%) rename contact-center/app/src/main/java/com/chatopera/cc/{concurrent => util}/dsdata/ExcelImportUtils.java (93%) rename contact-center/app/src/main/java/com/chatopera/cc/{concurrent => util}/dsdata/export/ExcelExporterProcess.java (90%) rename contact-center/app/src/main/java/com/chatopera/cc/{concurrent => util}/dsdata/export/ExportData.java (89%) rename contact-center/app/src/main/java/com/chatopera/cc/{concurrent => util}/dsdata/process/ContactsProcess.java (83%) rename contact-center/app/src/main/java/com/chatopera/cc/{concurrent => util}/dsdata/process/EntCustomerProcess.java (83%) rename contact-center/app/src/main/java/com/chatopera/cc/{concurrent => util}/dsdata/process/JPAProcess.java (91%) rename contact-center/app/src/main/java/com/chatopera/cc/{concurrent => util}/dsdata/process/QuickReplyProcess.java (83%) rename contact-center/app/src/main/java/com/chatopera/cc/{concurrent => util}/dsdata/process/TopicProcess.java (83%) delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/util/log/UKeFuAppender.java delete mode 100644 contact-center/app/src/main/resources/config/hazelcast.xml create mode 100644 contact-center/app/src/main/resources/git.properties delete mode 100644 contact-center/app/src/main/resources/jcseg.properties create mode 100644 contact-center/app/src/main/resources/static/fonts/csfont/iconfont.eot create mode 100644 contact-center/app/src/main/resources/static/fonts/csfont/iconfont.svg create mode 100644 contact-center/app/src/main/resources/static/fonts/csfont/iconfont.ttf create mode 100644 contact-center/app/src/main/resources/static/fonts/csfont/iconfont.woff create mode 100644 contact-center/app/src/main/resources/static/fonts/csfont/iconfont.woff2 rename contact-center/app/src/main/resources/static/{font => fonts/default}/iconfont.svg (100%) rename contact-center/app/src/main/resources/static/{font => fonts/default}/iconfont.ttf (100%) rename contact-center/app/src/main/resources/static/{font => fonts/default}/iconfont.woff (100%) rename contact-center/app/src/main/resources/static/{ukfont => fonts/kfont}/iconfont.eot (100%) rename contact-center/app/src/main/resources/static/{ukfont => fonts/kfont}/iconfont.svg (100%) rename contact-center/app/src/main/resources/static/{ukfont => fonts/kfont}/iconfont.ttf (100%) rename contact-center/app/src/main/resources/static/{ukfont => fonts/kfont}/iconfont.woff (100%) create mode 100755 contact-center/app/src/main/resources/static/im/img/cutimage.png create mode 100644 contact-center/app/src/main/resources/static/im/js/dayjs.min.js create mode 100644 contact-center/app/src/main/resources/static/im/js/html2canvas.js create mode 100644 contact-center/app/src/main/resources/static/im/js/kindeditor/plugins/html2canvas/html2canvas.js create mode 100644 contact-center/app/src/main/resources/static/im/js/kindeditor/themes/default/cutimage.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/0.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/1.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/10.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/100.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/101.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/102.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/103.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/104.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/105.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/106.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/107.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/108.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/109.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/11.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/110.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/111.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/112.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/113.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/114.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/115.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/12.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/13.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/14.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/15.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/16.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/17.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/18.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/19.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/2.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/20.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/21.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/22.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/23.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/24.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/25.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/26.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/27.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/28.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/29.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/3.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/30.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/31.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/32.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/33.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/34.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/35.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/36.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/37.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/38.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/39.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/4.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/40.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/41.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/42.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/43.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/44.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/45.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/46.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/47.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/48.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/49.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/5.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/50.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/51.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/52.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/53.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/54.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/55.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/56.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/57.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/58.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/59.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/6.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/60.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/61.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/62.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/63.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/64.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/65.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/66.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/67.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/68.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/69.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/7.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/70.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/71.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/72.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/73.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/74.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/75.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/76.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/77.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/78.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/79.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/8.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/80.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/81.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/82.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/83.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/84.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/85.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/86.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/87.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/88.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/89.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/9.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/90.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/91.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/92.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/93.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/94.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/95.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/96.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/97.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/98.png create mode 100644 contact-center/app/src/main/resources/static/images/skype/99.png create mode 100644 contact-center/app/src/main/resources/static/js/CSKeFu_Agent_Invite.v1.js create mode 100644 contact-center/app/src/main/resources/static/js/CSKeFu_Agent_State.v1.js rename contact-center/app/src/main/resources/static/js/{ukefu.js => cskefu.js} (77%) create mode 100644 contact-center/app/src/main/resources/static/js/moment-timezone-with-data.js create mode 100644 contact-center/app/src/main/resources/static/js/moment-timezone.js delete mode 100644 contact-center/app/src/main/resources/templates/admin/channel/callout/add.html delete mode 100644 contact-center/app/src/main/resources/templates/admin/channel/callout/edit.html delete mode 100644 contact-center/app/src/main/resources/templates/admin/channel/callout/index.html delete mode 100644 contact-center/app/src/main/resources/templates/admin/channel/im/add.html delete mode 100644 contact-center/app/src/main/resources/templates/admin/channel/im/edit.html delete mode 100644 contact-center/app/src/main/resources/templates/admin/channel/im/index.html delete mode 100644 contact-center/app/src/main/resources/templates/admin/system/log/detail.html delete mode 100644 contact-center/app/src/main/resources/templates/admin/system/log/index.html delete mode 100644 contact-center/app/src/main/resources/templates/admin/system/log/levels.html delete mode 100644 contact-center/app/src/main/resources/templates/admin/system/monitor/hazelcast.html create mode 100644 contact-center/app/src/main/resources/templates/apps/agent/channel/skype.html create mode 100644 contact-center/app/src/main/resources/templates/apps/agent/mainagentuser_skype.html create mode 100644 contact-center/app/src/main/resources/templates/apps/agent/mainagentuserconter.html create mode 100644 contact-center/app/src/main/resources/templates/apps/agent/mainagentusersearch.html create mode 100644 contact-center/app/src/main/resources/templates/apps/business/contacts/mass.html create mode 100644 contact-center/app/src/main/resources/templates/apps/cca/agentusers.html create mode 100644 contact-center/app/src/main/resources/templates/apps/cca/blacklistadd.html create mode 100644 contact-center/app/src/main/resources/templates/apps/cca/calloutcontact/add.html create mode 100644 contact-center/app/src/main/resources/templates/apps/cca/calloutcontact/edit.html create mode 100644 contact-center/app/src/main/resources/templates/apps/cca/channel/phone.html create mode 100644 contact-center/app/src/main/resources/templates/apps/cca/channel/webim.html create mode 100644 contact-center/app/src/main/resources/templates/apps/cca/channel/weixin.html create mode 100644 contact-center/app/src/main/resources/templates/apps/cca/contacts.html create mode 100644 contact-center/app/src/main/resources/templates/apps/cca/index.html create mode 100644 contact-center/app/src/main/resources/templates/apps/cca/mainagentuser.html create mode 100644 contact-center/app/src/main/resources/templates/apps/cca/mainagentuser_callout.html create mode 100644 contact-center/app/src/main/resources/templates/apps/cca/mainagentuserconter.html create mode 100644 contact-center/app/src/main/resources/templates/apps/cca/mainagentusersearch.html create mode 100644 contact-center/app/src/main/resources/templates/apps/cca/media/message.html create mode 100644 contact-center/app/src/main/resources/templates/apps/cca/media/messageimage.html create mode 100644 contact-center/app/src/main/resources/templates/apps/cca/othertopic.html create mode 100644 contact-center/app/src/main/resources/templates/apps/cca/quicklist.html create mode 100644 contact-center/app/src/main/resources/templates/apps/cca/quickreply/add.html create mode 100644 contact-center/app/src/main/resources/templates/apps/cca/quickreply/addtype.html create mode 100644 contact-center/app/src/main/resources/templates/apps/cca/quickreply/edit.html create mode 100644 contact-center/app/src/main/resources/templates/apps/cca/quickreply/edittype.html create mode 100644 contact-center/app/src/main/resources/templates/apps/cca/quickreplycontent.html create mode 100644 contact-center/app/src/main/resources/templates/apps/cca/searchbox.html create mode 100644 contact-center/app/src/main/resources/templates/apps/cca/summary.html create mode 100644 contact-center/app/src/main/resources/templates/apps/cca/topicdetail.html create mode 100644 contact-center/app/src/main/resources/templates/apps/cca/transfer.html create mode 100644 contact-center/app/src/main/resources/templates/apps/cca/transferagentlist.html create mode 100644 contact-center/app/src/main/resources/templates/apps/cca/upload.html create mode 100644 contact-center/app/src/main/resources/templates/apps/cca/workorders.html create mode 100644 contact-center/app/src/main/resources/templates/apps/chatbot/include/left.html create mode 100644 contact-center/app/src/main/resources/templates/apps/entim/group/more.html create mode 100644 contact-center/app/src/main/resources/templates/apps/entim/more.html create mode 100755 contact-center/app/src/main/resources/templates/apps/im/cutimage.png delete mode 100644 contact-center/app/src/main/resources/templates/apps/index2.html create mode 100644 contact-center/app/src/main/resources/templates/public/clearcookie.html rename elasticsearch/plugins/head/src/app/ui/clusterOverview/clusterOverview.css => contact-center/app/src/main/resources/templates/public/error.html (100%) create mode 100644 contact-center/app/src/test/java/com/chatopera/cc/basic/MainContextTest.java create mode 100644 contact-center/app/src/test/java/com/chatopera/cc/util/CronToolsTest.java rename cc-switch/admin/install.sh => contact-center/assets/docker-entrypoint.sh (56%) create mode 100755 contact-center/assets/setup-mysql-db.sh create mode 100644 contact-center/assets/sources.list create mode 100755 contact-center/assets/utils.sh rename contact-center/config/sql/{cskefu-MySQL-slim.sql => cosinee-MySQL-slim.sql} (99%) delete mode 100644 contact-center/config/tomcat.context.xml create mode 100644 contact-center/docs/Chatopera_cc_v1.postman_collection.json create mode 100644 contact-center/docs/database/.gitignore create mode 100644 contact-center/docs/database/README.md rename {docs => contact-center/docs/database/docs}/README.md (100%) rename docs/index.html => contact-center/docs/database/docs/demo.html (99%) rename {docs => contact-center/docs/database/docs}/jquery.sticky-kit.js (100%) rename {docs => contact-center/docs/database/docs}/lang/da/language.php (100%) rename {docs => contact-center/docs/database/docs}/lang/en/language.php (100%) rename {docs => contact-center/docs/database/docs}/scripts.js (100%) rename {docs => contact-center/docs/database/docs}/standalone.html (100%) rename {docs => contact-center/docs/database/docs}/style.css (100%) rename {docs => contact-center/docs/database/docs}/template.html (100%) rename {docs => contact-center/docs/database/docs}/uikit.css (100%) rename {docs => contact-center/docs/database/docs}/uikit.js (100%) create mode 100755 contact-center/docs/database/generate.sh create mode 100644 contact-center/docs/database/php/generator.php create mode 100644 contact-center/nohup.out rename {elasticsearch/config/scripts => database/activemq/data}/.gitignore (100%) rename {elasticsearch/data => database/activemq/logs}/.gitignore (100%) rename {elasticsearch => database/elasticsearch}/config/elasticsearch.yml (100%) rename {elasticsearch => database/elasticsearch}/config/logging.yml (100%) rename {mysql/data => database/elasticsearch/config/scripts}/.gitignore (100%) create mode 100644 database/elasticsearch/data/.gitignore rename {elasticsearch => database/elasticsearch}/plugins/head/.gitignore (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/.jshintrc (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/Gruntfile.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/LICENCE (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/README.textile (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/_site/app.css (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/_site/app.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/_site/base/favicon.png (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/_site/base/loading.gif (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/_site/base/reset.css (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/_site/fonts/FontAwesome.otf (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/_site/fonts/fontawesome-webfont.eot (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/_site/fonts/fontawesome-webfont.svg (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/_site/fonts/fontawesome-webfont.ttf (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/_site/fonts/fontawesome-webfont.woff (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/_site/i18n.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/_site/index.html (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/_site/lang/en_strings.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/_site/lang/fr_strings.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/_site/lang/pt_strings.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/_site/lang/tr_strings.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/_site/lang/zh_strings.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/_site/vendor.css (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/_site/vendor.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/grunt_fileSets.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/index.html (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/package.json (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/plugin-descriptor.properties (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/app.css (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/app.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/base/boot.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/base/favicon.png (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/base/loading.gif (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/base/reset.css (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/data/boolQuery.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/data/dataSourceInterface.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/data/metaData.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/data/metaDataFactory.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/data/model/model.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/data/model/modelSpec.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/data/query.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/data/queryDataSourceInterface.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/data/resultDataSourceInterface.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/lang/en_strings.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/lang/fr_strings.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/lang/pt_strings.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/lang/tr_strings.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/lang/zh_strings.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/services/cluster/cluster.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/services/cluster/clusterSpec.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/services/clusterState/clusterState.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/services/clusterState/clusterStateSpec.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/services/preferences/preferenceSpec.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/services/preferences/preferences.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ui/abstractField/abstractField.css (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ui/abstractField/abstractField.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ui/abstractPanel/abstractPanel.css (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ui/abstractPanel/abstractPanel.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ui/abstractWidget/abstractWidget.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ui/anyRequest/anyRequest.css (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ui/anyRequest/anyRequest.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ui/browser/browser.css (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ui/browser/browser.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ui/button/button.css (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ui/button/button.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ui/button/buttonDemo.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ui/checkField/checkField.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ui/checkField/checkFieldDemo.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ui/checkField/checkFieldSpec.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ui/clusterConnect/clusterConnect.css (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ui/clusterConnect/clusterConnect.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ui/clusterConnect/clusterConnectSpec.js (100%) create mode 100644 database/elasticsearch/plugins/head/src/app/ui/clusterOverview/clusterOverview.css rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ui/clusterOverview/clusterOverview.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ui/csvTable/csvTable.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ui/dateHistogram/dateHistogram.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ui/dialogPanel/dialogPanel.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ui/draggablePanel/draggablePanel.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ui/filterBrowser/filterBrowser.css (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ui/filterBrowser/filterBrowser.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ui/header/header.css (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ui/header/header.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ui/helpPanel/helpPanel.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ui/indexOverview/indexOverview.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ui/indexSelector/indexSelector.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ui/infoPanel/infoPanel.css (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ui/infoPanel/infoPanel.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ui/jsonPanel/jsonPanel.css (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ui/jsonPanel/jsonPanel.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ui/jsonPretty/jsonPretty.css (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ui/jsonPretty/jsonPretty.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ui/menuButton/menuButton.css (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ui/menuButton/menuButton.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ui/menuPanel/menuPanel.css (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ui/menuPanel/menuPanel.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ui/nodesView/nodesView.css (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ui/nodesView/nodesView.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ui/nodesView/nodesViewDemo.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ui/page/page.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ui/panelForm/panelForm.css (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ui/panelForm/panelForm.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ui/queryFilter/queryFilter.css (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ui/queryFilter/queryFilter.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ui/refreshButton/refreshButton.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ui/refreshButton/refreshButtonDemo.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ui/refreshButton/refreshButtonSpec.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ui/resultTable/resultTable.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ui/selectMenuPanel/selectMenuPanel.css (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ui/selectMenuPanel/selectMenuPanel.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ui/sidebarSection/sidebarSection.css (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ui/sidebarSection/sidebarSection.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ui/splitButton/splitButton.css (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ui/splitButton/splitButton.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ui/splitButton/splitButtonDemo.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ui/structuredQuery/structuredQuery.css (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ui/structuredQuery/structuredQuery.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ui/table/table.css (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ui/table/table.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ui/textField/textField.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ui/textField/textFieldDemo.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ui/toolbar/toolbar.css (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ui/toolbar/toolbar.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ux/class.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ux/dragdrop.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ux/fieldCollection.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ux/observable.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ux/singleton.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ux/singletonSpec.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ux/table.css (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ux/templates/templateSpec.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/app/ux/templates/templates.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/vendor/dateRangeParser/date-range-parser.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/vendor/font-awesome/css/font-awesome.css (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/vendor/font-awesome/css/font-awesome.min.css (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/vendor/font-awesome/fonts/FontAwesome.otf (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/vendor/font-awesome/fonts/fontawesome-webfont.eot (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/vendor/font-awesome/fonts/fontawesome-webfont.svg (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/vendor/font-awesome/fonts/fontawesome-webfont.ttf (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/vendor/font-awesome/fonts/fontawesome-webfont.woff (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/vendor/graphael/g.raphael.standalone.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/vendor/i18n/i18n.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/vendor/joey/joey.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/vendor/jquery/jquery.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/src/vendor/nohtml/jquery-nohtml.js (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/test/demo.html (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/test/generators/conflictingField.sh (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/test/generators/delete_all_indices.sh (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/test/generators/multi_type.sh (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/test/generators/twitter_feed.sh (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/test/generators/twitter_river.sh (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/test/perf.html (100%) rename {elasticsearch => database/elasticsearch}/plugins/head/test/spec/specHelper.js (100%) rename {mysql => database/mysql}/admin/start.sh (100%) rename {mysql => database/mysql}/admin/stop.sh (100%) rename {mysql => database/mysql}/config/conf.d/docker.cnf (100%) rename {mysql => database/mysql}/config/conf.d/mysql.cnf (100%) rename {mysql => database/mysql}/config/my.cnf (100%) rename {mysql => database/mysql}/config/my.cnf.fallback (100%) rename {mysql => database/mysql}/config/mysql.cnf (100%) rename {mysql => database/mysql}/config/mysql.conf.d/mysqld.cnf (100%) create mode 100644 database/mysql/data/.gitignore rename {redis => database/redis}/admin/start.sh (100%) rename {redis => database/redis}/admin/stop.sh (100%) rename {redis => database/redis}/data/.gitignore (100%) delete mode 100644 elasticsearch/plugins/head/elasticsearch-head.sublime-project create mode 100644 nginx/certs/.gitignore create mode 100644 nginx/conf.d/default.conf create mode 100644 nginx/logs/.gitignore create mode 100644 sample.env diff --git a/.gitignore b/.gitignore index 8926ab39..f1331a46 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,7 @@ sftp-config.json ~$*.xls* ~$*.ppt* ~$*.doc* +backups/ +.env +build.gradle +.vscode/ diff --git a/INTRODUCTION.md b/INTRODUCTION.md new file mode 100644 index 00000000..090abfd8 --- /dev/null +++ b/INTRODUCTION.md @@ -0,0 +1,242 @@ +[![Docker Layers](https://images.microbadger.com/badges/image/chatopera/contact-center:develop.svg)](https://microbadger.com/images/chatopera/contact-center:develop "Get your own image badge on microbadger.com") [![Docker Version](https://images.microbadger.com/badges/version/chatopera/contact-center:develop.svg)](https://microbadger.com/images/chatopera/contact-center:develop "Get your own version badge on microbadger.com") [![Docker Pulls](https://img.shields.io/docker/pulls/chatopera/contact-center.svg)](https://hub.docker.com/r/chatopera/contact-center/) [![Docker Stars](https://img.shields.io/docker/stars/chatopera/contact-center.svg)](https://hub.docker.com/r/chatopera/contact-center/) [![Docker Commit](https://images.microbadger.com/badges/commit/chatopera/contact-center:develop.svg)](https://microbadger.com/images/chatopera/contact-center:develop "Get your own commit badge on microbadger.com") + +

+ 春松客服QQ交流群:185659917, 点击链接加入群聊
+ +

+ +# 春松客服: 全渠道智能客服 + +春松客服是帮助中小型企业快速而低成本的获得好用的智能客服系统。 + +春松客服是Chatopera自主研发以及基于且增强其它开源软件的方式实现的,春松客服会不断增强客服系统的智能化,这包括利用自然语言处理、机器学习和语音识别等技术让客服工作更有效率、客服满意度更高、成本更低。 + +**项目地址:** [https://github.com/samurais/cosinee](https://github.com/samurais/cosinee) + +**开发环境搭建:** [https://github.com/samurais/cosinee/wiki/春松客服:开发环境](https://github.com/samurais/cosinee/wiki/%E6%98%A5%E6%9D%BE%E5%AE%A2%E6%9C%8D%EF%BC%9A%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83) + + +## 内容结构 + +[产品演示](https://github.com/samurais/cosinee#%E4%BA%A7%E5%93%81%E6%BC%94%E7%A4%BA) + +[功能](https://github.com/samurais/cosinee#%E5%8A%9F%E8%83%BD) + +[开发文档](https://github.com/samurais/cosinee#%E5%BC%80%E5%8F%91%E6%96%87%E6%A1%A3) + +[产品截图](https://github.com/samurais/cosinee#%E4%BA%A7%E5%93%81%E6%88%AA%E5%9B%BE) + +[产品体系](https://github.com/samurais/cosinee#%E4%BA%A7%E5%93%81%E4%BD%93%E7%B3%BB) + +[立即部署](https://github.com/samurais/cosinee#%E7%AB%8B%E5%8D%B3%E9%83%A8%E7%BD%B2) + +[鸣谢](https://github.com/samurais/cosinee#%E9%B8%A3%E8%B0%A2) + +[开源许可协议](https://github.com/samurais/cosinee#%E5%BC%80%E6%BA%90%E8%AE%B8%E5%8F%AF%E5%8D%8F%E8%AE%AE) + +## 产品演示 +* 坐席工作台 + +[http://cc.chatopera.com/](http://cc.chatopera.com/) + +| **登录账号** | **密码** | +| --- | --- | +| admin | admin1234 | + +* 网页端访客程序 + +[http://cc.chatopera.com/testclient.html](http://cc.chatopera.com/testclient.html) + +## 功能 + +* 账号及组织机构管理:按组织、角色分配账号权限 + +* 联系人管理:细粒度维护客户信息 + +* 网页聊天组件:一分钟接入对话窗口 + +* 坐席工作台:汇聚多渠道访客请求 + +* 机器人客服:集成机器人平台服务,完成多轮对话和知识库问答 + +* 外呼系统:自动外呼,手动外呼,监听和报表等 + + 《春松客服产品系列视频》 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
序号内容腾讯视频百度网盘
No. 1产品概述观看下载
No. 2安装部署观看下载
No. 3功能演示观看下载
No. 4账号体系观看下载
No. 5客户关系管理观看下载
No. 6即时通信观看下载
No. 7呼叫中心观看下载
No. 8数据报表观看下载
+ +[*下载视频合集*](https://pan.baidu.com/s/1YH7d7nMm5wZQp7P8kID3KA) + +## 使用说明 + +关于产品的具体使用说明,请参考[文档中心](https://docs.chatopera.com/omni-channel-customer-support-system.html)。 + +## 来自真实用户的反馈 + +``` +项目代码写的挺好的,容易维护,是不错的开源项目。 +``` + +-- 海洋 (深圳银之杰项目经理) + + +``` +Amazing! 要的就是这个效果。 +``` + +-- 常经理 (某电器世界五百强企业) + + +``` +我要在APP内集成,我看了好多项目了,就你们这个最好,基本就是一个商用化的项目。 +``` + +-- Engine X (某二手车出售平台技术负责人) + + +## 开发文档 + +

+ 开发文档
+ + + +

+ +## 产品截图 + +

+ 欢迎页
+ +

+ +

+ 坐席工作台
+ +

+ +

+ 坐席监控
+ +

+ +

+ 外呼计划
+ +

+ +

+ 通话记录
+ +

+ +

+ 集成客服机器人
+ +

+ +

+ 客服机器人应答
+ +

+ +

+ 更多功能,敬请期待 ...
+ +

+ +## 产品体系 + +

+ 观看视频介绍
+ + + +

+ +## 立即部署 + +* 企业版 + +通过青云AppCenter部署,青云AppCenter是开发运维一体化(DevOps)管理企业应用的平台,Chatopera的春松客服在2018年10月登录AppCenter,并借助PaaS平台强大的计算能力实现计算节点集群、存储节点HADR。从而保证了服务高可靠性、高性能、动态伸缩、一键备份和一键回滚等功能。 + +青云AppCenter以其提供的资源秒级计算特点,企业使用AppCenter中的春松客服应用,可以按需付费,灵活升配和降配,Chatopera也非常推荐客户使用青云服务。 + +

+ 春松客服 on QingCloud
+ + + +

+ +更为详细的部署文档见[春松客服上架青云AppCenter](https://github.com/samurais/cosinee/wiki/%E6%98%A5%E6%9D%BE%E5%AE%A2%E6%9C%8D%E4%B8%8A%E6%9E%B6%E9%9D%92%E4%BA%91AppCenter)。 + +* 社区版 + +参考部署[开源社区版本文档](https://github.com/samurais/cosinee/wiki/%E6%9C%8D%E5%8A%A1%E5%99%A8%E9%83%A8%E7%BD%B2)。 + +## 鸣谢 + +[优客服](https://gitee.com/beimigame/ukefu) + +[FreeSWITCH中国社区](http://www.freeswitch.org.cn/) + +## 软件许可协议 + +Copyright (2018) 北京华夏春松科技有限公司 + +[LICENSE](https://github.com/samurais/cosinee/blob/master/LICENSE) \ No newline at end of file diff --git a/LICENSE b/LICENSE index 5646b747..09ca7f74 100644 --- a/LICENSE +++ b/LICENSE @@ -1,201 +1,7 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright (2018) 北京华夏春松科技有限公司 - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. +Copyright 2019 Chatopera Inc. . All rights reserved. +This software and related documentation are provided under a license agreement containing +restrictions on use and disclosure and are protected by intellectual property laws. +Except as expressly permitted in your license agreement or allowed by law, you may not use, +copy, reproduce, translate, broadcast, modify, license, transmit, distribute, exhibit, perform, +publish, or display any part, in any form, or by any means. Reverse engineering, disassembly, +or decompilation of this software, unless required by law for interoperability, is prohibited. diff --git a/README.md b/README.md index 9b2e1624..9477606e 100644 --- a/README.md +++ b/README.md @@ -1,252 +1,8 @@ -[![Docker Layers](https://images.microbadger.com/badges/image/chatopera/contact-center:develop.svg)](https://microbadger.com/images/chatopera/contact-center:develop "Get your own image badge on microbadger.com") [![Docker Version](https://images.microbadger.com/badges/version/chatopera/contact-center:develop.svg)](https://microbadger.com/images/chatopera/contact-center:develop "Get your own version badge on microbadger.com") [![Docker Pulls](https://img.shields.io/docker/pulls/chatopera/contact-center.svg)](https://hub.docker.com/r/chatopera/contact-center/) [![Docker Stars](https://img.shields.io/docker/stars/chatopera/contact-center.svg)](https://hub.docker.com/r/chatopera/contact-center/) [![Docker Commit](https://images.microbadger.com/badges/commit/chatopera/contact-center:develop.svg)](https://microbadger.com/images/chatopera/contact-center:develop "Get your own commit badge on microbadger.com") +# 春松客服企业版 -

- 春松客服QQ交流群:185659917, 点击链接加入群聊
- -

+https://gitlab.chatopera.com/chatopera -# 春松客服: 全渠道智能客服 +## License -春松客服是帮助中小型企业快速而低成本的获得好用的智能客服系统。 - - - - - -春松客服是Chatopera自主研发以及基于且增强其它开源软件的方式实现的,春松客服会不断增强客服系统的智能化,这包括利用自然语言处理、机器学习和语音识别等技术让客服工作更有效率、客服满意度更高、成本更低。 - -**开源项目地址:** [https://github.com/chatopera/cosin](https://github.com/chatopera/cosin) - -**开发环境搭建:** [https://github.com/chatopera/cosin/wiki/春松客服:开发环境](https://github.com/chatopera/cosin/wiki/%E6%98%A5%E6%9D%BE%E5%AE%A2%E6%9C%8D%EF%BC%9A%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83) - - -## 内容结构 - -[产品演示](https://github.com/chatopera/cosin#%E4%BA%A7%E5%93%81%E6%BC%94%E7%A4%BA) - -[功能](https://github.com/chatopera/cosin#%E5%8A%9F%E8%83%BD) - -[开发文档](https://github.com/chatopera/cosin#%E5%BC%80%E5%8F%91%E6%96%87%E6%A1%A3) - -[产品截图](https://github.com/chatopera/cosin#%E4%BA%A7%E5%93%81%E6%88%AA%E5%9B%BE) - -[产品体系](https://github.com/chatopera/cosin#%E4%BA%A7%E5%93%81%E4%BD%93%E7%B3%BB) - -[立即部署](https://github.com/chatopera/cosin#%E7%AB%8B%E5%8D%B3%E9%83%A8%E7%BD%B2) - -[鸣谢](https://github.com/chatopera/cosin#%E9%B8%A3%E8%B0%A2) - -[开源许可协议](https://github.com/chatopera/cosin#%E5%BC%80%E6%BA%90%E8%AE%B8%E5%8F%AF%E5%8D%8F%E8%AE%AE) - -## 产品演示 -* 坐席工作台 - -[http://cc.chatopera.com/](http://cc.chatopera.com/) - -| **登录账号** | **密码** | -| --- | --- | -| admin | admin1234 | - -* 网页端访客程序 - -[http://cc.chatopera.com/testclient.html](http://cc.chatopera.com/testclient.html) - - -## 功能 - -* 账号及组织机构管理:按组织、角色分配账号权限 - -* 联系人管理:细粒度维护客户信息 - -* 网页聊天组件:一分钟接入对话窗口 - -* 坐席工作台:汇聚多渠道访客请求 - -* 机器人客服:集成机器人平台服务,完成多轮对话和知识库问答 - -* 外呼系统:自动外呼,手动外呼,监听和报表等 - - 《春松客服产品系列视频》 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
序号内容腾讯视频百度网盘
No. 1产品概述观看下载
No. 2安装部署观看下载
No. 3功能演示观看下载
No. 4账号体系观看下载
No. 5客户关系管理观看下载
No. 6即时通信观看下载
No. 7呼叫中心观看下载
No. 8数据报表观看下载
- -[*下载视频合集*](https://pan.baidu.com/s/1YH7d7nMm5wZQp7P8kID3KA) - -## 使用说明 - -关于产品的具体使用说明,请参考[文档中心](https://docs.chatopera.com/omni-channel-customer-support-system.html)。 - -## 来自真实用户的反馈 - -``` -项目代码写的挺好的,容易维护,是不错的开源项目。 -``` - --- 海洋 (深圳银之杰项目经理) - - -``` -Amazing! 要的就是这个效果。 -``` - --- 常经理 (某电器世界五百强企业) - - -``` -我要在APP内集成,我看了好多项目了,就你们这个最好,基本就是一个商用化的项目。 -``` - --- Engine X (某二手车出售平台技术负责人) - - -## 开发文档 - -

- 开发文档
- - - -

- -## 产品截图 - -

- 欢迎页
- -

- -

- 坐席工作台
- -

- -

- 坐席监控
- -

- -

- 外呼计划
- -

- -

- 通话记录
- -

- -

- 集成客服机器人
- -

- -

- 客服机器人应答
- -

- -

- 更多功能,敬请期待 ...
- -

- -## 产品体系 - -

- 观看视频介绍
- - - -

- -## 立即部署 - -* 企业版 - -通过青云AppCenter部署,青云AppCenter是开发运维一体化(DevOps)管理企业应用的平台,Chatopera的春松客服在2018年10月登录AppCenter,并借助PaaS平台强大的计算能力实现计算节点集群、存储节点HADR。从而保证了服务高可靠性、高性能、动态伸缩、一键备份和一键回滚等功能。 - -青云AppCenter以其提供的资源秒级计算特点,企业使用AppCenter中的春松客服应用,可以按需付费,灵活升配和降配,Chatopera也非常推荐客户使用青云服务。 - -

- 春松客服 on QingCloud
- - - -

- -更为详细的部署文档见[春松客服上架青云AppCenter](https://github.com/chatopera/cosin/wiki/%E6%98%A5%E6%9D%BE%E5%AE%A2%E6%9C%8D%E4%B8%8A%E6%9E%B6%E9%9D%92%E4%BA%91AppCenter)。 - -* 社区版 - -参考部署[开源社区版本文档](https://github.com/chatopera/cosin/wiki/%E6%9C%8D%E5%8A%A1%E5%99%A8%E9%83%A8%E7%BD%B2)。 - -## 鸣谢 - -[优客服](https://gitee.com/beimigame/ukefu) - -[FreeSWITCH中国社区](http://www.freeswitch.org.cn/) - -## 开源许可协议 - -Copyright (2018) 北京华夏春松科技有限公司 - -[Apache License Version 2.0](https://github.com/chatopera/cosin/blob/master/LICENSE) - -[![chatoper banner][co-banner-image]][co-url] - -[co-banner-image]: https://user-images.githubusercontent.com/3538629/42383104-da925942-8168-11e8-8195-868d5fcec170.png -[co-url]: https://www.chatopera.com +Copyright 2019 北京华夏春松科技有限公司 . All rights reserved. +This software and related documentation are provided under a license agreement containing restrictions on use and disclosure and are protected by intellectual property laws. Except as expressly permitted in your license agreement or allowed by law, you may not use, copy, reproduce, translate, broadcast, modify, license, transmit, distribute, exhibit, perform, publish, or display any part, in any form, or by any means. Reverse engineering, disassembly, or decompilation of this software, unless required by law for interoperability, is prohibited. diff --git a/cc-switch/.gitignore b/cc-switch/.gitignore deleted file mode 100644 index fbba8a8f..00000000 --- a/cc-switch/.gitignore +++ /dev/null @@ -1,14 +0,0 @@ -*.swp -*.swo -*.sublime-* -*.pyc -__pycache__ -node_modules/ -sftp-config.json -.DS_Store -~$* -.vscode -.idea/ -.composer.phar -app/config/dev.env -ax.js diff --git a/cc-switch/README.md b/cc-switch/README.md deleted file mode 100644 index 0cc4cae6..00000000 --- a/cc-switch/README.md +++ /dev/null @@ -1 +0,0 @@ -# cc-switch diff --git a/cc-switch/admin/test.sh b/cc-switch/admin/test.sh deleted file mode 100755 index f59b1847..00000000 --- a/cc-switch/admin/test.sh +++ /dev/null @@ -1,24 +0,0 @@ -#! /bin/bash -########################################### -# -########################################### - -# constants -baseDir=$(cd `dirname "$0"`;pwd) -export ACTIVEMQ_HOST=corsair -export REDIS_HOST=corsair - -# functions - -# main -[ -z "${BASH_SOURCE[0]}" -o "${BASH_SOURCE[0]}" = "$0" ] || return -cd $baseDir/../app - -# for x in {1..100}; do -# echo $x -# DEBUG=cc* ava --timeout=10hrs -# sleep 5 -# done - -DEBUG=cc* ava --timeout=10hrs $* - diff --git a/cc-switch/app/Dockerfile b/cc-switch/app/Dockerfile deleted file mode 100644 index 9f6cbbe1..00000000 --- a/cc-switch/app/Dockerfile +++ /dev/null @@ -1,14 +0,0 @@ -FROM node:carbon-alpine - -RUN apk add --no-cache tzdata && \ - ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \ - echo "Asia/Shanghai" > /etc/timezone - -RUN mkdir -p /usr/src/app -WORKDIR /usr/src/app - -COPY package.json /usr/src/app/ -RUN npm install && npm cache clean --force -COPY . /usr/src/app - -CMD [ "npm", "start" ] diff --git a/cc-switch/app/config/dev.env.sample b/cc-switch/app/config/dev.env.sample deleted file mode 100644 index 61a4a094..00000000 --- a/cc-switch/app/config/dev.env.sample +++ /dev/null @@ -1,7 +0,0 @@ - - PBX_CHANNEL_ID=bxzq - FREESWITCH_HOST=freeswitch - REDIS_HOST=redis - MINIO_END_POINT=mini - MINIO_ACCESS_KEY=key - MINIO_SECRET_KEY=secret diff --git a/cc-switch/app/config/index.js b/cc-switch/app/config/index.js deleted file mode 100644 index deacb6ca..00000000 --- a/cc-switch/app/config/index.js +++ /dev/null @@ -1,42 +0,0 @@ -const fs = require('fs'); -const path = require('path'); -const dotenv = require('dotenv'); - -const PBX_CHANNEL_ID = 'test'; - -const FREESWITCH_HOST = 'localhost'; -const FREESWITCH_PORT = 8021; -const FREESWITCH_MAX_CHANNEL = 5; - -const MINIO_END_POINT = 'localhost'; -const MINIO_ACCESS_KEY = 'key'; -const MINIO_SECRET_KEY = 'secret'; - -const REDIS_HOST = 'localhost'; -const REDIS_PORT = 6379; - -const config = { - PBX_CHANNEL_ID, - FREESWITCH_HOST, - FREESWITCH_PORT, - FREESWITCH_MAX_CHANNEL, - REDIS_HOST, - REDIS_PORT, - MINIO_END_POINT, - MINIO_ACCESS_KEY, - MINIO_SECRET_KEY, -}; - -let envFile = path.join(__dirname, 'dev.env'); -if (fs.existsSync(envFile)) { - dotenv.config({ path: envFile }); -} - -for (let key in config) { - let value = process.env[key]; - if (value) { - config[key] = value; - } -} - -module.exports = exports = config; diff --git a/cc-switch/app/control.js b/cc-switch/app/control.js deleted file mode 100644 index 1dfe15ea..00000000 --- a/cc-switch/app/control.js +++ /dev/null @@ -1,81 +0,0 @@ -const Redis = require('ioredis'); -const _ = require('lodash'); -const config = require('./config'); -const debug = require('debug')('cc-switch:control'); - -const FS_SIP_STATUS = `pbx:${config.PBX_CHANNEL_ID}:sips`; -const FS_CHANNE_CC_TO_FS = `pbx:${config.PBX_CHANNEL_ID}:execute`; -const FS_DIALPLAN_STATUS = `pbx:${config.PBX_CHANNEL_ID}:status`; -const FS_DIALPLAN_TARGET = `pbx:${config.PBX_CHANNEL_ID}:targets`; -const FS_EVENT_TO_CC = `pbx:${config.PBX_CHANNEL_ID}:events`; - -const sub = new Redis({ - host: config.REDIS_HOST, - port: config.REDIS_PORT, - db: 2, -}); - -const redis = new Redis({ - host: config.REDIS_HOST, - port: config.REDIS_PORT, - db: 2, -}); - -module.exports = exports = { - subExecute(fn) { - return new Promise((resolve, reject) => { - debug('订阅控制信道'); - sub.subscribe(FS_CHANNE_CC_TO_FS, (err, count) => { - if (err) { - debug('订阅失败: %o', err); - reject(err); - } else { - debug('订阅成功: %s', count); - sub.on('message', (channel, message) => { - if (channel == FS_CHANNE_CC_TO_FS) { - message = JSON.parse(message); - fn(message); - } - }); - resolve(); - } - }); - }); - }, - getStatus() { - return redis.hgetall(FS_DIALPLAN_STATUS).then(rows => - _.map(rows, (v, k) => { - let obj = JSON.parse(v); - obj.id = k; - return obj; - }), - ); - }, - getNextCall(dialplanId) { - return redis - .rpop(`${FS_DIALPLAN_TARGET}:${dialplanId}`) - .then(data => JSON.parse(data)); - }, - getSips() { - return redis.hgetall(FS_SIP_STATUS).then(sips => - _.map(sips, (v, k) => ({ - no: k, - state: v, - })), - ); - }, - removeSips(nos) { - return redis.hdel(FS_SIP_STATUS, ...nos); - }, - setSips(sips) { - let args = []; - _.forEach(sips, s => { - args.push(s.no); - args.push(s.state); - }); - return redis.hmset(FS_SIP_STATUS, ...args); - }, - sendEvent(data) { - return redis.publish(FS_EVENT_TO_CC, JSON.stringify(data)); - }, -}; diff --git a/cc-switch/app/dialplan.js b/cc-switch/app/dialplan.js deleted file mode 100644 index 06c39478..00000000 --- a/cc-switch/app/dialplan.js +++ /dev/null @@ -1,109 +0,0 @@ -const _ = require('lodash'); -const moment = require('moment'); -const fs = require('./fs'); -const control = require('./control'); -const debug = require('debug')('cc-switch:dialplan'); -const { access } = require('fs'); -const minio = require('./minio'); - -class Dialplan { - constructor(id, concurrency, sips) { - this.id = id; - this.concurrency = concurrency; - this.tasks = []; - this.sips = sips; - this.state = 'create'; - } - - start(cb) { - debug('开始呼叫计划: %o', this.id); - this.time = setInterval(() => this.loop(), 1000); - this.start = 'start'; - this.cb = cb; - } - - callTask(to, channel) { - debug('呼叫目标号码: %s', to); - - let message = { to, channel, dialplan: this.id, type: 'callout' }; - let call = fs.call(to); - call.sips = this.sips; - let removeThisCall = () => _.remove(this.tasks, call); - - call.on('channel_answer', uuid => { - debug('用户接听 %s', to); - message.uuid = uuid; - message.from = call.sip; - message.ops = 'answer'; - message.createtime = moment().valueOf(); - control.sendEvent(message); - }); - - call.on('channel_hangup', () => { - debug('用户挂机 %s', to); - message.ops = 'hangup'; - message.createtime = moment().valueOf(); - removeThisCall(); - - if (call.state != 'call') { - let file = `/usr/recordings/archive/${call.uuid}.wav`; - message.record = `${moment().format('YYYY-MM-DD')}/${call.uuid}.wav`; - - access(file, err => { - if (err) { - debug('录音文件不存在: %s', call.uuid); - } else { - debug('上传录音: %s', call.uuid); - - setTimeout(() => { - minio.fPutObject('chatopera', message.record, file).catch(err => { - debug('上传录音失败 %s error: %o', call.uuid, err); - }); - }, 5000); - } - }); - } - - control.sendEvent(message); - }); - - call.on('error', () => { - debug('呼叫错误 %s', to); - message.ops = 'hangup'; - removeThisCall(); - control.sendEvent(message); - }); - - return call; - } - - async loop() { - // debug('呼叫计划循环: %s', this.id); - while (this.tasks.length < this.concurrency) { - let info = await control.getNextCall(this.id); - - if (info) { - let { to, channel } = info; - let call = this.callTask(to, channel); - this.tasks.push(call); - } else { - debug('完成呼叫计划: %s', this.id); - this.start = 'finish'; - clearInterval(this.time); - if (this.cb) { - this.cb(); - } - - return; - } - } - } - - async stop() { - debug('停止呼叫计划: %s', this.id); - clearInterval(this.time); - // await Promise.all(this.tasks); - } -} - -module.exports = exports = Dialplan; diff --git a/cc-switch/app/engine.js b/cc-switch/app/engine.js deleted file mode 100644 index e8506aa8..00000000 --- a/cc-switch/app/engine.js +++ /dev/null @@ -1,60 +0,0 @@ -const _ = require('lodash'); -const debug = require('debug')('cc-switch:engine'); - -const config = require('./config'); -const control = require('./control'); -const Dialplan = require('./dialplan'); -const fs = require('./fs'); - -class Engine { - constructor() { - this.dialplans = []; - } - - createDialplan(id, concurrency, sips) { - debug('创建呼叫计划: %s ,并发: %s', id, concurrency); - if (!_.find(this.dialplans, { id })) { - let dialplan = new Dialplan(id, concurrency, sips); - this.dialplans.push(dialplan); - dialplan.start(() => _.remove(this.dialplans, dialplan)); - } - } - - async init() { - await fs.init(); - - await control.subExecute(message => { - debug('接收控制命令: %o', message); - let { ops, channel } = message; - if (channel == config.PBX_CHANNEL_ID) { - if (ops == 'start') { - this.createDialplan( - message.dialplan, - message.concurrency, - message.sips, - ); - } else if (ops == 'monitor') { - fs.eavesdrop(message.sip, message.uuid); - } else { - let dialplan = _.find(this.dialplans, { id: message.dialplan }); - if (dialplan) { - dialplan.stop(); - _.remove(this.dialplans, dialplan); - } - } - } - }); - - debug('获取初始状态'); - let dialplanTasks = await control.getStatus(); - - for (let task of dialplanTasks) { - let { id, concurrency, status } = task; - if (status == '执行中') { - this.createDialplan(id, concurrency); - } - } - } -} - -module.exports = exports = Engine; diff --git a/cc-switch/app/fs.js b/cc-switch/app/fs.js deleted file mode 100644 index a07b3fbd..00000000 --- a/cc-switch/app/fs.js +++ /dev/null @@ -1,406 +0,0 @@ -const EventEmitter = require('events'); -const _ = require('lodash'); -const esl = require('modesl'); -const debug = require('debug')('cc-switch:fs'); -const config = require('./config'); -const control = require('./control'); -const { access } = require('fs'); -const minio = require('./minio'); -const moment = require('moment'); - -const { FREESWITCH_HOST, FREESWITCH_PORT, FREESWITCH_MAX_CHANNEL } = config; - -const parseTable = body => { - let list = []; - let rows = body.split('\n'); - let first = rows.shift(); - if (first) { - let head = first.split(','); - for (let r of rows) { - if (r) { - let obj = {}; - let cell = r.split(','); - for (let i = 0; i < head.length; i++) { - obj[head[i]] = cell[i]; - } - list.push(obj); - } else break; - } - } - - return list; -}; - -const parseHeaders = headers => { - let obj = {}; - for (let h of headers) { - obj[h.name] = h.value; - } - return obj; -}; - -let conn; - -const doConnect = reg => - new Promise((resolve, reject) => { - conn = new esl.Connection( - FREESWITCH_HOST, - FREESWITCH_PORT, - 'ClueCon', - () => { - reg(); - resolve(); - }, - ); - - conn.once('error', err => { - debug('connect freeswitch error: %o', err); - reject(err); - - setTimeout(() => doConnect(reg), 2000); - }); - }); - -const show = cmd => - new Promise((resolve, reject) => { - // debug('执行命令: %s', cmd); - - conn.bgapi(cmd, ({ body }) => { - resolve(parseTable(body)); - }); - }); - -const showRegistrations = () => show('show registrations'); - -const showChannels = () => show('show channels'); - -const showCalls = () => show('show calls'); - -const record = uuid => - new Promise((resolve, reject) => { - debug('开始录音: %s', uuid); - - conn.bgapi( - `uuid_record ${uuid} start /usr/recordings/archive/${uuid}.wav`, - ({ body }) => { - console.log(body); - resolve(); - }, - ); - }); - -const callOut = phone => - new Promise((resolve, reject) => { - debug('拨打电话: %s', phone); - - conn.bgapi(`originate sofia/gateway/goipx/${phone} &park`, ({ body }) => { - let match = body.match(/([a-f\d]{8}(-[a-f\d]{4}){3}-[a-f\d]{12}?)/i); - if (match) { - resolve(match[1]); - } else { - reject(new Error(`呼叫 ${phone} 失败`)); - } - }); - }); - -const callSip = (phone, originate) => - new Promise((resolve, reject) => { - debug('拨打SIP: %s', phone); - - ('originate user/1000 &park'); - - conn.bgapi( - `originate {origination_caller_id_number=${originate}}user/${phone} &park`, - ({ body }) => { - let match = body.match(/([a-f\d]{8}(-[a-f\d]{4}){3}-[a-f\d]{12}?)/i); - if (match) { - resolve(match[1]); - } else { - reject(new Error(`呼叫SIP ${phone} 失败`)); - } - }, - ); - }); - -const bridge = (luuid, ruuid) => - new Promise((resolve, reject) => { - debug('桥接: %s <--> %s', luuid, ruuid); - - conn.bgapi(`uuid_bridge ${luuid} ${ruuid}`, ({ body }) => { - if (/OK/.test(body)) { - resolve(); - } else { - reject(new Error('桥接失败')); - } - }); - }); - -const eavesdrop = (sip, uuid) => - new Promise((resolve, reject) => { - debug('监听: %s <--> %s', sip, uuid); - - conn.bgapi(`originate user/${sip} &eavesdrop(${uuid})`, ({ body }) => { - if (/OK/.test(body)) { - resolve(); - } else { - reject(new Error('监听失败')); - } - }); - }); - -class FreeSwitch extends EventEmitter { - constructor() { - super(); - this.tasks = []; - this.wait = []; - this.sips = []; - } - - async init() { - debug('初始化Freeswich'); - await doConnect(() => this.regEvent()); - - setInterval(async () => { - let sips = await showRegistrations(); - let toDel = _.chain(await control.getSips()) - .map(s => s.no) - .filter(k => !_.find(sips, { reg_user: k })) - .value(); - if (toDel.length > 0) { - await control.removeSips(toDel); - } - - let channels = await showChannels(); - let updateSips = _.map(sips, ({ reg_user }) => { - return { - no: reg_user, - state: _.find(channels, { dest: reg_user }) ? '通话' : '空闲', - }; - }); - if (updateSips.length > 0) { - await control.setSips(updateSips); - } - }, 2000); - } - - regEvent() { - conn.events('plain CUSTOM sofia::register'); - - conn.on('esl::event::CUSTOM::*', ({ subclass, headers }) => { - if (subclass == 'sofia::register') { - let { username } = parseHeaders(headers); - - debug('SIP %s 已上线', username); - control.setSips([{ no: username, state: '空闲' }]); - } - }); - - conn.on('esl::event::CHANNEL_ANSWER::*', async ({ headers }) => { - let variable = parseHeaders(headers); - let { variable_uuid } = variable; - debug('接通电话: %s', variable_uuid); - - let call = _.find(this.tasks, { uuid: variable_uuid }); - if (call) { - for (let i = 0; i < 3; i++) { - if (call.state == 'hangup') { - return; - } - - try { - await call.linkSip(); - call.emit('channel_answer', variable_uuid); - return; - } catch (e) { - debug('link sip error: %o', e); - } - } - - // debug('link sip error: %o', err); - } else if (variable.variable_sip_gateway_name == 'goipx') { - let { - variable_bridge_channel, - variable_sip_to_user: sip_to_user, - variable_call_uuid, - } = variable; - let match = variable_bridge_channel.match(/sofia\/internal\/(\d+)@/); - if (match) { - let sip_from_user = match[1]; - let call = new CallOut( - variable_uuid, - sip_to_user, - variable_call_uuid, - sip_from_user, - ); - this.tasks.push(call); - call.emit('channel_answer', variable_uuid); - } - } - }); - - conn.on('esl::event::CHANNEL_HANGUP::*', ({ headers }) => { - let event = parseHeaders(headers); - - let { variable_uuid } = event; - debug('挂断电话: %s', variable_uuid); - - let call = _.find(this.tasks, { uuid: variable_uuid }); - if (call) { - this.removeCall(call); - call.state = 'hangup'; - call.emit('channel_hangup', variable_uuid); - } else if (event.variable_sip_gateway_name == 'goipx') { - let { - variable_bridge_channel, - variable_sip_to_user: sip_to_user, - variable_call_uuid, - } = event; - let match = - variable_bridge_channel && - variable_bridge_channel.match(/sofia\/internal\/(\d+)@/); - if (match) { - let sip_from_user = match[1]; - let call = new CallOut( - variable_uuid, - sip_to_user, - null, - sip_from_user, - ); - - call.emit('channel_hangup', variable_uuid); - } - } - - if ( - _.filter(this.tasks, { state: 'call' }).length <= - FREESWITCH_MAX_CHANNEL && - this.wait.length > 0 - ) { - debug('执行队列'); - let func = this.wait.shift(); - func(); - } - }); - } - - removeCall(call) { - _.remove(this.tasks, call); - } - - call(phone) { - let call = new Call(phone); - this.tasks.push(call); - - let doCall = async () => { - try { - await call.start(); - } catch (err) { - this.removeCall(call); - call.emit('error', err); - } - }; - - if (this.tasks.length <= FREESWITCH_MAX_CHANNEL) { - doCall(); - } else { - this.wait.push(doCall); - } - - return call; - } - - eavesdrop(sip, uuid) { - return eavesdrop(sip, uuid); - } -} - -class Call extends EventEmitter { - constructor(phone) { - super(); - - this.sips = []; - this.phone = phone; - this.try = 0; - } - - async start() { - this.uuid = await callOut(this.phone); - this.state = 'call'; - } - - async linkSip() { - debug('链接SIP电话'); - - let sips = _.chain(await control.getSips()) - .filter({ state: '空闲' }) - .map(s => s.no) - .value(); - - this.sip = _.sample(_.intersection(sips, this.sips)); - if (!this.sip) { - throw new Error('无可用SIP'); - } - - await control.setSips([{ no: this.sip, state: '通话' }]); - - this.sip_uuid = await callSip(this.sip, this.phone); - await bridge(this.uuid, this.sip_uuid); - await record(this.uuid); - this.state = 'answer'; - } -} - -class CallOut extends EventEmitter { - constructor(uuid, phone, sip_uuid, sip) { - super(); - - this.uuid = uuid; - this.phone = phone; - this.sip_uuid = sip_uuid; - this.sip = sip; - - let message = { - uuid, - from: sip, - to: phone, - channel: config.PBX_CHANNEL_ID, - type: 'callout', - }; - - this.on('channel_answer', () => { - debug('用户接听 %s -> %s', sip, phone); - message.ops = 'answer'; - message.createtime = moment().valueOf(); - control.sendEvent(message); - }); - - this.on('channel_hangup', () => { - debug('用户挂机 %s -> %s', sip, phone); - message.ops = 'hangup'; - message.createtime = moment().valueOf(); - - if (sip_uuid) { - let file = `/usr/recordings/archive/${sip_uuid}.wav`; - message.record = `${moment().format('YYYY-MM-DD')}/${uuid}.wav`; - - access(file, err => { - if (err) { - debug('录音文件不存在: %s', uuid); - } else { - debug('上传录音: %s', uuid); - - setTimeout(() => { - minio.fPutObject('chatopera', message.record, file).catch(err => { - debug('上传录音失败 %s error: %o', uuid, err); - }); - }, 5000); - } - }); - } - - control.sendEvent(message); - }); - } -} - -module.exports = exports = new FreeSwitch(); diff --git a/cc-switch/app/index.js b/cc-switch/app/index.js deleted file mode 100644 index e61abfe8..00000000 --- a/cc-switch/app/index.js +++ /dev/null @@ -1,14 +0,0 @@ -const debug = require('debug')('cc-switch'); -const Engine = require('./engine'); - -const engine = new Engine(); - -engine - .init() - .then(() => { - console.log('cc-switch started'); - }) - .catch(err => { - debug('cc-switch start error: %o', err); - process.exit(); - }); diff --git a/cc-switch/app/minio.js b/cc-switch/app/minio.js deleted file mode 100644 index f325b520..00000000 --- a/cc-switch/app/minio.js +++ /dev/null @@ -1,12 +0,0 @@ -const Minio = require('minio'); -const config = require('./config'); - -let client = new Minio.Client({ - endPoint: config.MINIO_END_POINT, - accessKey: config.MINIO_ACCESS_KEY, - secretKey: config.MINIO_SECRET_KEY, - port: 9000, - useSSL: false, -}); - -module.exports = exports = client; diff --git a/cc-switch/app/package.json b/cc-switch/app/package.json deleted file mode 100644 index 55bedc6c..00000000 --- a/cc-switch/app/package.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "name": "cc-switch", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "start": "node index.js", - "dev:start": "nodemon index.js" - }, - "keywords": [], - "author": "", - "license": "ISC", - "dependencies": { - "debug": "^3.1.0", - "dotenv": "^6.0.0", - "ioredis": "^4.0.0", - "lodash": ">=4.17.11", - "minio": "^7.0.0", - "modesl": "^1.2.0", - "moment": "^2.22.2" - }, - "devDependencies": { - "ava": "^0.25.0", - "nodemon": "^1.18.3" - } -} diff --git a/cc-switch/app/test/callout.answer.test.js b/cc-switch/app/test/callout.answer.test.js deleted file mode 100644 index 5b763263..00000000 --- a/cc-switch/app/test/callout.answer.test.js +++ /dev/null @@ -1,47 +0,0 @@ -/** - * Redis Test - */ -const test = require('ava'); -const debug = require('debug')('cc-switch:test:redis'); -const Redis = require('ioredis'); -const config = require('../config'); -const util = require('util'); -const moment = require('moment'); - - -const redis = new Redis({ - host: config.REDIS_HOST, - port: config.REDIS_PORT, - db: 2, -}); - -const EVENT_TYPE_CALLOUT = "callout"; -const EVENT_QUEUE_QUEUE_CC_TO_FS = "cc:to:freeswitch"; -const CALLOUT_DIALPLAN_STATUS = "callout:dialplan:status"; -const CALLOUT_DIALPLAN_TARGET = "freeswitch:%s:callout"; -const CALLOUT_CC_FROM_FS = "pbx:bxzq:events"; - - - -test.only("Redis Test # 外呼接通", async(t) => { - let now = moment(); - now.add(-3, "minutes"); - console.log("接通时间:", now); - - let payload = { - "uuid": "9a0cbc81-ccae-425e-8d3d-369b872a6481", - "to": "13213213213", - "from": "1003", - "type": "callout", - "channel": "bxzq", - "dialplan": "4028827365b2acec0165b307afe405de", - "createtime": now.valueOf(), - "ops": "answer" - } - - redis.publish(CALLOUT_CC_FROM_FS, JSON.stringify(payload)); - t.pass(); -}) - - - diff --git a/cc-switch/app/test/callout.hangup.test.js b/cc-switch/app/test/callout.hangup.test.js deleted file mode 100644 index 7b3e451d..00000000 --- a/cc-switch/app/test/callout.hangup.test.js +++ /dev/null @@ -1,41 +0,0 @@ -/** - * Redis Test - */ -const test = require('ava'); -const debug = require('debug')('cc-switch:test:redis'); -const Redis = require('ioredis'); -const config = require('../config'); -const util = require('util'); -const moment = require('moment'); - -const redis = new Redis({ - host: config.REDIS_HOST, - port: config.REDIS_PORT, - db: 2, -}); - -const EVENT_TYPE_CALLOUT = "callout"; -const EVENT_QUEUE_QUEUE_CC_TO_FS = "cc:to:freeswitch"; -const CALLOUT_DIALPLAN_STATUS = "callout:dialplan:status"; -const CALLOUT_DIALPLAN_TARGET = "freeswitch:%s:callout"; -const CALLOUT_CC_FROM_FS = "pbx:bxzq:events"; - -test.only("Redis Test # 外呼挂断", async(t) => { - let now = moment(); - now.add(-3, "minutes"); - console.log("挂断时间:", now); - let payload = { - "uuid": "9a0cbc81-ccae-425e-8d3d-369b872a6481", - "to": "13213213213", - "from": "1003", - "type": "callout", - "channel": "bxzq", - "dialplan": "4028827365b2acec0165b307afe405de", - "createtime": now.valueOf(), - "ops": "hangup", - "record":"chatopera/376bf70a-9449-46c8-ad3e-03ac41953946.wav" - } - - redis.publish(CALLOUT_CC_FROM_FS, JSON.stringify(payload)); - t.pass(); -}) diff --git a/contact-center/.dockerignore b/contact-center/.dockerignore index d0999061..b669156a 100644 --- a/contact-center/.dockerignore +++ b/contact-center/.dockerignore @@ -1,5 +1,6 @@ app/target -!app/target/contact-center-*.war.original +!app/target/*.war.original +!app/target/*.war logs/ tmp/ data/ diff --git a/contact-center/Dockerfile b/contact-center/Dockerfile index fcc1f071..df095b4c 100644 --- a/contact-center/Dockerfile +++ b/contact-center/Dockerfile @@ -12,13 +12,9 @@ LABEL org.label-schema.vcs-ref=$VCS_REF \ COPY $PWD/assets/install-corretto-8.sh /opt RUN chmod +x /opt/install-corretto-8.sh && /opt/install-corretto-8.sh -# install maven -COPY $PWD/assets/install-maven.sh /opt -RUN chmod +x /opt/install-maven.sh && /opt/install-maven.sh - -# configure timezone +# install other lib and configure timezone RUN apt-get update && \ - apt-get install --no-install-recommends -y tzdata && \ + apt-get install --no-install-recommends -y tzdata mysql-client-5.7 zip unzip vim-tiny && \ ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \ DEBIAN_FRONTEND=noninteractive dpkg-reconfigure --frontend noninteractive tzdata && \ rm -rf /var/lib/apt/lists/* @@ -30,22 +26,19 @@ ENV LC_ALL C.UTF-8 # set ENVs ENV JAVA_HOME=/usr/lib/jvm/java-1.8.0-amazon-corretto -ENV MAVEN_HOME=/opt/maven -ENV PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin +ENV PATH=$PATH:$JAVA_HOME/bin # create dirs RUN /bin/bash -c "mkdir -p /{data,logs}" # build WAR -COPY app /app -COPY config /config -WORKDIR /app -RUN mvn clean package && \ - mkdir -p /opt/chatopera && \ - mv target/contact-center-3.9.0.war /opt/chatopera && \ - rm -rf /app && rm -rf /config && \ - rm -rf /root/.m2 +RUN mkdir -p /opt/chatopera +COPY ./app/target/contact-center-*.war /opt/chatopera/contact-center.war +COPY ./assets/setup-mysql-db.sh /opt/chatopera +COPY ./assets/utils.sh /opt/chatopera +COPY ./assets/docker-entrypoint.sh /opt/chatopera +RUN chmod +x /opt/chatopera/*.sh WORKDIR /opt/chatopera EXPOSE 8030-8050 -CMD ["java", "-jar", "contact-center-3.9.0.war"] +CMD ["./docker-entrypoint.sh"] \ No newline at end of file diff --git a/contact-center/README.md b/contact-center/README.md index 3b56d4de..48e60757 100644 --- a/contact-center/README.md +++ b/contact-center/README.md @@ -1,22 +1,7 @@ # 春松客服:智能客服系统 -前三代呼叫中心均是以电话为主要的服务渠道。在2000年,伴随着互联网以及移动通信的发展与普及,将电子邮件、互联网、手机短信等渠道接入呼叫中心,成为第四代呼叫中心的标志。第四代呼叫中心也称为多媒体呼叫中心或联络中心(Contact Center)。它相对传统呼叫中心来说接入渠道丰富,同时引入了多渠道接入与多渠道统一排队等概念。 +前三代呼叫中心均是以电话为主要的服务渠道。在 2000 年,伴随着互联网以及移动通信的发展与普及,将电子邮件、互联网、手机短信等渠道接入呼叫中心,成为第四代呼叫中心的标志。第四代呼叫中心也称为多媒体呼叫中心或联络中心(Contact Center)。它相对传统呼叫中心来说接入渠道丰富,同时引入了多渠道接入与多渠道统一排队等概念。 ## 文档 -### ukefu -原始项目基于[ukefu](https://gitee.com/beimigame/ukefu)。 - -``` -链接: https://pan.baidu.com/s/1wEPZeieZm4qaaFSWUb2Szg -密码: tdm2 -``` - -### wiki - -ContactCenter:多媒体呼叫中心 - -## 媒体 - -谷歌发布Contact Center AI,智能客服真能不再“智障”了吗? - +https://docs.chatopera.com/products/cskefu/index.html diff --git a/contact-center/admin/build.sh b/contact-center/admin/build.sh index a6349d7f..62e31852 100755 --- a/contact-center/admin/build.sh +++ b/contact-center/admin/build.sh @@ -6,14 +6,23 @@ # constants baseDir=$(cd `dirname "$0"`;pwd) appHome=$baseDir/.. +registryName=dockerhub.qingcloud.com imagename=chatopera/contact-center -PACKAGE_VERSION=1.0.0 # functions # main [ -z "${BASH_SOURCE[0]}" -o "${BASH_SOURCE[0]}" = "$0" ] || return # build cd $appHome +PACKAGE_VERSION=`git rev-parse --short HEAD` + set -x -docker build --build-arg VCS_REF=`git rev-parse --short HEAD` --force-rm=true --tag $imagename:$PACKAGE_VERSION . -docker tag $imagename:$PACKAGE_VERSION $imagename:develop +$baseDir/package.sh + +if [ ! $? -eq 0 ]; then + exit 1 +fi + +docker build --build-arg VCS_REF=$PACKAGE_VERSION \ + --no-cache \ + --force-rm=true --tag $registryName/$imagename:$PACKAGE_VERSION . \ No newline at end of file diff --git a/contact-center/admin/package.sh b/contact-center/admin/package.sh index c435be66..68d5183e 100755 --- a/contact-center/admin/package.sh +++ b/contact-center/admin/package.sh @@ -11,3 +11,7 @@ baseDir=$(cd `dirname "$0"`;pwd) [ -z "${BASH_SOURCE[0]}" -o "${BASH_SOURCE[0]}" = "$0" ] || return cd $baseDir/../app mvn clean package + +if [ ! $? -eq 0 ]; then + exit 1 +fi diff --git a/contact-center/admin/push.sh b/contact-center/admin/push.sh index 06b62cf9..269bfd36 100755 --- a/contact-center/admin/push.sh +++ b/contact-center/admin/push.sh @@ -5,12 +5,12 @@ # constants baseDir=$(cd `dirname "$0"`;pwd) +registryName=dockerhub.qingcloud.com imagename=chatopera/contact-center -PACKAGE_VERSION=1.0.0 +PACKAGE_VERSION=w4l # functions # main [ -z "${BASH_SOURCE[0]}" -o "${BASH_SOURCE[0]}" = "$0" ] || return -docker push $imagename:$PACKAGE_VERSION -docker push $imagename:develop +docker push $registryName/$imagename:$PACKAGE_VERSION \ No newline at end of file diff --git a/contact-center/admin/run.sh b/contact-center/admin/run.sh index 205e3426..90464548 100755 --- a/contact-center/admin/run.sh +++ b/contact-center/admin/run.sh @@ -5,6 +5,10 @@ # constants baseDir=$(cd `dirname "$0"`;pwd) +registryName=dockerhub.qingcloud.com +imagename=chatopera/contact-center +PACKAGE_VERSION=w4l + # functions # main @@ -35,4 +39,4 @@ docker run -it --rm \ -e SPRING_DATA_ELASTICSEARCH_CLUSTER_NODES=elasticsearch:8040 \ -e SPRING_DATA_ELASTICSEARCH_LOCAL=false \ -e SPRING_DATA_ELASTICSEARCH_REPOSITORIES_ENABLED=true \ - chatopera/contact-center:develop + $registryName/$imagename:$PACKAGE_VERSION diff --git a/cc-switch/admin/dev.sh b/contact-center/admin/test.sh similarity index 75% rename from cc-switch/admin/dev.sh rename to contact-center/admin/test.sh index 34c5578f..9b594284 100755 --- a/cc-switch/admin/dev.sh +++ b/contact-center/admin/test.sh @@ -5,12 +5,10 @@ # constants baseDir=$(cd `dirname "$0"`;pwd) -export ACTIVEMQ_HOST=corsair -export REDIS_HOST=corsair - # functions # main [ -z "${BASH_SOURCE[0]}" -o "${BASH_SOURCE[0]}" = "$0" ] || return cd $baseDir/../app -DEBUG=cc* npm run dev:start +set -x +mvn -Dtest=com.chatopera.cc.proto.ProtoTest#testProto test diff --git a/contact-center/app/.gitignore b/contact-center/app/.gitignore new file mode 100644 index 00000000..41459fda --- /dev/null +++ b/contact-center/app/.gitignore @@ -0,0 +1,7 @@ +# ignore plugins source code +src/main/java/com/chatopera/cc/plugins/ + +# ignore views within plugins +!src/main/resources/templates/admin/channel/callout/ +!src/main/resources/templates/admin/channel/im/ +src/main/resources/templates/admin/channel/* diff --git a/contact-center/app/pom.xml b/contact-center/app/pom.xml index 2ae908a5..889b08d5 100644 --- a/contact-center/app/pom.xml +++ b/contact-center/app/pom.xml @@ -3,16 +3,15 @@ 4.0.0 com.chatopera.cc contact-center - 3.9.0 + 5.0.0 war - contact-center - Chatopera Contact Center,多媒体呼叫中心,下一代呼叫中心 + cskefu + 春松客服企业版:多媒体呼叫中心,下一代呼叫中心 org.springframework.boot spring-boot-starter-parent 1.5.6.RELEASE - UTF-8 @@ -28,10 +27,23 @@ spring-boot-starter-test test + org.springframework.boot spring-boot-starter-web + + + org.apache.activemq + activemq-pool + 5.14.3 + + + + org.springframework.boot + spring-boot-starter-activemq + + org.springframework.boot spring-boot-starter-freemarker @@ -44,7 +56,7 @@ org.freemarker freemarker - 2.3.25-incubating + 2.3.29 mysql @@ -73,11 +85,15 @@ org.springframework.boot - spring-boot-starter-data-jpa + spring-boot-starter-cache + + + org.springframework.session + spring-session-data-redis org.springframework.boot - spring-boot-starter-actuator + spring-boot-starter-data-jpa org.springframework.boot @@ -98,16 +114,7 @@ org.springframework.boot spring-boot-starter-data-redis - - - io.springfox - springfox-swagger2 - 2.2.2 - - - io.springfox - springfox-swagger-ui - 2.2.2 + 1.5.13.RELEASE org.jasypt @@ -157,12 +164,6 @@ org.springframework spring-context-support - - com.hazelcast - hazelcast-all - 3.10.5 - provided - org.quartz-scheduler quartz @@ -172,6 +173,19 @@ com.fasterxml.jackson.dataformat jackson-dataformat-xml + + + + org.aspectj + aspectjrt + 1.9.4 + + + org.aspectj + aspectjweaver + 1.9.4 + + com.alibaba @@ -183,11 +197,6 @@ ip2region 1.7.2 - - org.lionsoul - jcseg-core - 2.2.0 - com.lmax disruptor @@ -203,6 +212,11 @@ poi-ooxml 3.15 + + com.alibaba + fastjson + 1.2.47 + com.github.binarywang weixin-java-mp @@ -329,14 +343,63 @@ unirest-java 1.4.9 + + com.chatopera.compose4j + compose4j + 1.0.0 + com.chatopera.bot sdk 1.0.2 + + + org.apache.maven.plugins + maven-resources-plugin + + + pl.project13.maven + git-commit-id-plugin + 2.2.5 + + + get-the-git-infos + + revision + + + initialize + + + validate-the-git-infos + + validateRevision + + + package + + + + + git.tags + git.remote.* + git.closest.* + git.total.commit.count + + ${project.basedir}/../../.git + + ${project.build.outputDirectory}/git.properties + + true + git + false + true + + org.springframework.boot spring-boot-maven-plugin @@ -351,11 +414,12 @@ + maven-compiler-plugin - 1.7 - 1.7 + 1.8 + 1.8 UTF-8 @@ -370,21 +434,14 @@ ../config/sql/ - cskefu-MySQL-slim.sql + cosinee-MySQL-slim.sql 2.1.1 - - org.apache.maven.plugins - maven-compiler-plugin - - 8 - 8 - - + compile @@ -405,7 +462,7 @@ hain Hai Liang Wang - hailiang.hl.wang@gmail.com + hain@chatopera.com https://github.com/Samurais Chatopera Inc. https://www.chatopera.com diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/Application.java b/contact-center/app/src/main/java/com/chatopera/cc/Application.java similarity index 62% rename from contact-center/app/src/main/java/com/chatopera/cc/app/Application.java rename to contact-center/app/src/main/java/com/chatopera/cc/Application.java index 00b84c4a..9c7c6d1e 100644 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/Application.java +++ b/contact-center/app/src/main/java/com/chatopera/cc/Application.java @@ -14,20 +14,21 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.chatopera.cc.app; +package com.chatopera.cc; -import com.chatopera.cc.app.basic.MainContext; -import com.chatopera.cc.app.config.StartedEventListener; -import com.chatopera.cc.util.Constants; +import com.chatopera.cc.basic.MainContext; +import com.chatopera.cc.basic.plugins.PluginRegistry; +import com.chatopera.cc.config.AppCtxRefreshEventListener; +import com.chatopera.cc.basic.Constants; import com.chatopera.cc.util.SystemEnvHelper; import com.chatopera.cc.util.mobile.MobileNumberUtils; -import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.Banner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.context.embedded.ConfigurableEmbeddedServletContainer; import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer; import org.springframework.boot.web.servlet.ErrorPage; @@ -35,6 +36,7 @@ import org.springframework.boot.web.servlet.MultipartConfigFactory; import org.springframework.context.annotation.Bean; import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.jms.annotation.EnableJms; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.transaction.annotation.EnableTransactionManagement; @@ -42,12 +44,15 @@ import javax.servlet.MultipartConfigElement; import java.io.IOException; @SpringBootApplication -@EnableJpaRepositories("com.chatopera.cc.app.persistence.repository") -@EnableElasticsearchRepositories("com.chatopera.cc.app.persistence.es") +@EnableJpaRepositories("com.chatopera.cc.persistence.repository") +@EnableElasticsearchRepositories("com.chatopera.cc.persistence.es") @EnableAsync +@EnableJms @EnableTransactionManagement public class Application { + private static final Logger logger = LoggerFactory.getLogger(Application.class); + @Value("${web.upload-path}") private String uploaddir; @@ -61,24 +66,51 @@ public class Application { * 记载模块 */ // 外呼模块 - private final static boolean isCalloutModule = SystemEnvHelper.parseModuleFlag("CSKEFU_MODULE_CALLOUT"); + private final static boolean isCalloutModule = SystemEnvHelper.parseModuleFlag("cskefu.module.callout"); + // CRM模块 - private final static boolean isContactsModule = SystemEnvHelper.parseModuleFlag("CSKEFU_MODULE_CONTACTS"); + private final static boolean isContactsModule = SystemEnvHelper.parseModuleFlag("cskefu.module.contacts"); + // 聊天机器人模块 - private final static boolean isChatbotModule = SystemEnvHelper.parseModuleFlag("CSKEFU_MODULE_CHATBOT"); + private final static boolean isChatbotModule = SystemEnvHelper.parseModuleFlag("cskefu.module.chatbot"); + + // 访客聊天监控模块 + private final static boolean isCcaModule = SystemEnvHelper.parseModuleFlag("cskefu.module.cca"); + + // 企业聊天模块 + private final static boolean isEntImModule = SystemEnvHelper.parseModuleFlag("cskefu.module.entim"); + + // 渠道:Skype渠道 + private final static boolean isSkypeModule = SystemEnvHelper.isClassExistByFullName( + PluginRegistry.PLUGIN_ENTRY_SKYPE); static { // 外呼模块 if (isCalloutModule) { - MainContext.model.put(Constants.CSKEFU_MODULE_CALLOUT, true); + MainContext.enableModule(Constants.CSKEFU_MODULE_CALLOUT); } // CRM模块 if (isContactsModule) { - MainContext.model.put(Constants.CSKEFU_MODULE_CONTACTS, true); + MainContext.enableModule(Constants.CSKEFU_MODULE_CONTACTS); } // 聊天机器人模块 if (isChatbotModule) { - MainContext.model.put(Constants.CSKEFU_MODULE_CHATBOT, true); + MainContext.enableModule(Constants.CSKEFU_MODULE_CHATBOT); + } + + // skype模块 + if (isSkypeModule) { + MainContext.enableModule(Constants.CSKEFU_MODULE_SKYPE); + } + + // 会话监控模块 Customer Chats Audit + if (isCcaModule) { + MainContext.enableModule(Constants.CSKEFU_MODULE_CCA); + + } + // 企业聊天模块 + if (isEntImModule) { + MainContext.enableModule(Constants.CSKEFU_MODULE_ENTIM); } } @@ -87,10 +119,9 @@ public class Application { */ protected static void init() { try { - System.out.println("init mobile number utils ..."); MobileNumberUtils.init(); } catch (IOException e) { - e.printStackTrace(); + logger.error("Application Startup Error", e); System.exit(1); } } @@ -106,7 +137,6 @@ public class Application { @Bean public EmbeddedServletContainerCustomizer containerCustomizer() { - return new EmbeddedServletContainerCustomizer() { @Override public void customize(ConfigurableEmbeddedServletContainer container) { @@ -118,11 +148,18 @@ public class Application { public static void main(String[] args) { Application.init(); - SpringApplication app = new SpringApplication(Application.class); + + /************************ + * 该APP中加载多个配置文件 + * http://roufid.com/load-multiple-configuration-files-different-directories-spring-boot/ + ************************/ + SpringApplication app = new SpringApplicationBuilder(Application.class) + .properties("spring.config.name:application,git") + .build(); + app.setBannerMode(Banner.Mode.CONSOLE); app.setAddCommandLineProperties(false); - app.addListeners(new StartedEventListener()); + app.addListeners(new AppCtxRefreshEventListener()); MainContext.setApplicationContext(app.run(args)); } } - diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/ServletInitializer.java b/contact-center/app/src/main/java/com/chatopera/cc/ServletInitializer.java similarity index 94% rename from contact-center/app/src/main/java/com/chatopera/cc/app/ServletInitializer.java rename to contact-center/app/src/main/java/com/chatopera/cc/ServletInitializer.java index 8f5c787d..f11e80c0 100644 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/ServletInitializer.java +++ b/contact-center/app/src/main/java/com/chatopera/cc/ServletInitializer.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.chatopera.cc.app; +package com.chatopera.cc; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.support.SpringBootServletInitializer; diff --git a/contact-center/app/src/main/java/com/chatopera/cc/acd/AutomaticServiceDist.java b/contact-center/app/src/main/java/com/chatopera/cc/acd/AutomaticServiceDist.java new file mode 100644 index 00000000..f166566c --- /dev/null +++ b/contact-center/app/src/main/java/com/chatopera/cc/acd/AutomaticServiceDist.java @@ -0,0 +1,1223 @@ +/* + * Copyright (C) 2017 优客服-多渠道客服系统 + * Modifications copyright (C) 2018 Chatopera Inc, + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.chatopera.cc.acd; + +import com.chatopera.cc.basic.Constants; +import com.chatopera.cc.basic.MainContext; +import com.chatopera.cc.basic.MainUtils; +import com.chatopera.cc.cache.Cache; +import com.chatopera.cc.cache.RedisCommand; +import com.chatopera.cc.cache.RedisKey; +import com.chatopera.cc.exception.CSKefuException; +import com.chatopera.cc.model.*; +import com.chatopera.cc.peer.PeerSyncIM; +import com.chatopera.cc.persistence.es.ContactsRepository; +import com.chatopera.cc.persistence.repository.*; +import com.chatopera.cc.proxy.AgentAuditProxy; +import com.chatopera.cc.socketio.client.NettyClients; +import com.chatopera.cc.socketio.message.Message; +import com.chatopera.cc.util.SerializeUtil; +import com.chatopera.cc.util.WebIMReport; +import com.corundumstudio.socketio.SocketIONamespace; +import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * Automatic Call Distribution + */ +@SuppressWarnings("deprecation") +public class AutomaticServiceDist { + private final static Logger logger = LoggerFactory.getLogger(AutomaticServiceDist.class); + + // Redis缓存: 缓存的底层实现接口 + private static RedisCommand redisCommand; + + // 缓存管理:高级缓存实现接口 + private static Cache cache; + + // 在线访客与坐席关联表 + private static AgentUserRepository agentUserRes; + + // 在线访客 + private static OnlineUserRepository onlineUserRes; + + // 坐席服务记录 + private static AgentServiceRepository agentServiceRes; + + // 坐席服务任务 + private static AgentUserTaskRepository agentUserTaskRes; + + // 坐席状态报告 + private static AgentReportRepository agentReportRes; + + // 坐席状态 + private static AgentStatusRepository agentStatusRes; + + // 坐席配置 + private static SessionConfigRepository sessionConfigRes; + + //用户 + private static UserRepository UserRes; + + // 联系人 + private static ContactsRepository contactsRes; + + // 联系人会话关联表 + private static AgentUserContactsRepository agentUserContactsRes; + + // 会话监控 + private static AgentAuditProxy agentAuditProxy; + + + // 消息分发 + private static PeerSyncIM peerSyncIM; + + /** + * 载入坐席 ACD策略配置 + * + * @param orgi + * @return + */ + public static SessionConfig initSessionConfig(final String orgi) { + SessionConfig sessionConfig; + if ((sessionConfig = getCache().findOneSessionConfigByOrgi(orgi)) == null) { + sessionConfig = getSessionConfigRes().findByOrgi(orgi); + if (sessionConfig == null) { + sessionConfig = new SessionConfig(); + } else { + getCache().putSessionConfigByOrgi(sessionConfig, orgi); + } + } + return sessionConfig; + } + + /** + * 载入坐席 ACD策略配置 + * + * @return + */ + @SuppressWarnings("unchecked") + public static List initSessionConfigList() { + List sessionConfigList; + if ((sessionConfigList = getCache().findOneSessionConfigListByOrgi(MainContext.SYSTEM_ORGI)) == null) { + SessionConfigRepository sessionConfigRes = MainContext.getContext().getBean(SessionConfigRepository.class); + sessionConfigList = sessionConfigRes.findAll(); + if (sessionConfigList != null && sessionConfigList.size() > 0) { + getCache().putSessionConfigListByOrgi(sessionConfigList, MainContext.SYSTEM_ORGI); + } + } + return sessionConfigList; + } + + /** + * 获得 当前服务状态 + * + * @param orgi + * @return + */ + @SuppressWarnings({"unchecked", "rawtypes"}) + public static AgentReport getAgentReport(String orgi) { + return AutomaticServiceDist.getAgentReport(null, orgi); + } + + /** + * 获得一个技能组的坐席状态 + * + * @param organ + * @param orgi + * @return + */ + public static AgentReport getAgentReport(String organ, String orgi) { + /** + * 统计当前在线的坐席数量 + */ + AgentReport report = new AgentReport(); + + Map readys = getCache().getAgentStatusReadyByOrig(orgi); + int readyNum = 0; + int busyNum = 0; + + for (Map.Entry entry : readys.entrySet()) { + if (organ == null) { + readyNum++; + if (entry.getValue().isBusy()) { + busyNum++; + } + continue; + } + + if (entry.getValue().getSkills() != null && + entry.getValue().getSkills().containsKey(organ)) { + readyNum++; + if (entry.getValue().isBusy()) { + busyNum++; + } + + } + } + report.setAgents(readyNum); + report.setBusy(busyNum); + report.setOrgi(orgi); + + /** + * 统计当前服务中的用户数量 + */ + // 服务中 + report.setUsers(getCache().getInservAgentUsersSizeByOrgi(orgi)); + // 等待中 + report.setInquene(getCache().getInqueAgentUsersSizeByOrgi(orgi)); + + // DEBUG +// logger.info( +// "[getAgentReport] orgi {}, organ {}, agents {}, busy {}, users {}, inqueue {}", orgi, organ, +// report.getAgents(), report.getBusy(), report.getUsers(), report.getInquene() +// ); + return report; + } + + @SuppressWarnings("unchecked") + public static int getQueueIndex(String agent, String orgi, String skill) { + int queneUsers = 0; + Map map = getCache().getAgentUsersInQueByOrgi(orgi); + + for (Map.Entry entry : map.entrySet()) { + if (StringUtils.isNotBlank(skill)) { + if (StringUtils.equals(entry.getValue().getSkill(), skill)) { + queneUsers++; + } + continue; + } else { + if (StringUtils.isNotBlank(agent)) { + if (StringUtils.equals(entry.getValue().getAgentno(), agent)) { + queneUsers++; + } + continue; + } else { + queneUsers++; + } + } + } + return queneUsers; + } + + /** + * 为坐席批量分配用户 + * + * @param agentno + * @param orgi + */ + @SuppressWarnings("unchecked") + public static void allotAgent(String agentno, String orgi) { + // 获得目标坐席的状态 + AgentStatus agentStatus = SerializeUtil.deserialize( + getRedisCommand().getHashKV(RedisKey.getAgentStatusReadyHashKey(orgi), agentno)); + + if (agentStatus == null) { + logger.warn("[allotAgent] can not find AgentStatus for agentno {}", agentno); + return; + } + + // 获得所有待服务访客的列表 + Map pendingAgentUsers = getCache().getAgentUsersInQueByOrgi(orgi); + + for (Map.Entry entry : pendingAgentUsers.entrySet()) { + AgentUser agentUser = entry.getValue(); + boolean process = false; + + if ((StringUtils.equals(agentUser.getAgentno(), agentno))) { + // 待服务的访客指定了该坐席 + process = true; + } else { + if (agentStatus != null && + agentStatus.getSkills() != null && + agentStatus.getSkills().size() > 0) { + // 目标坐席有状态,并且坐席属于某技能组 + if ((StringUtils.isBlank(agentUser.getAgentno()) && + StringUtils.isBlank(agentUser.getSkill()))) { + // 待服务的访客还没有指定坐席,并且也没有绑定技能组 + process = true; + } else { + if (StringUtils.isBlank(agentUser.getAgentno()) && + agentStatus.getSkills().containsKey(agentUser.getSkill())) { + // 待服务的访客还没有指定坐席,并且指定的技能组和该坐席的技能组一致 + process = true; + } + } + } else { + // 目标坐席没有状态,或该目标坐席有状态但是没有属于任何一个技能组 + if (StringUtils.isBlank(agentUser.getAgentno()) && + StringUtils.isBlank(agentUser.getSkill())) { + // 待服务访客没有指定坐席,并且没有指定技能组 + process = true; + } + } + } + + if (!process) { + continue; + } + + SessionConfig sessionConfig = AutomaticServiceDist.initSessionConfig(orgi); + long maxusers = sessionConfig == null ? Constants.AGENT_STATUS_MAX_USER : sessionConfig.getMaxuser(); + if (agentStatus.getUsers() < maxusers) { //坐席未达到最大咨询访客数量 + // 从排队队列移除 + getCache().deleteAgentUserInqueByAgentUserIdAndOrgi(agentUser.getUserid(), orgi); + + // 下面开始处理其加入到服务中的队列 + try { + AgentService agentService = processAgentService(agentStatus, agentUser, orgi, sessionConfig); + + // 处理完成得到 agentService + Message outMessage = new Message(); + outMessage.setMessage(AutomaticServiceDist.getSuccessMessage( + agentService, + agentUser.getChannel(), + orgi)); + outMessage.setMessageType(MainContext.MediaType.TEXT.toString()); + outMessage.setCalltype(MainContext.CallType.IN.toString()); + outMessage.setCreatetime(MainUtils.dateFormate.format(new Date())); + + if (StringUtils.isNotBlank(agentUser.getUserid())) { + outMessage.setAgentUser(agentUser); + outMessage.setChannelMessage(agentUser); + + // 向访客推送消息 + getPeerSyncIM().send( + MainContext.ReceiverType.VISITOR, + MainContext.ChannelType.toValue(agentUser.getChannel()), agentUser.getAppid(), + MainContext.MessageType.STATUS, agentUser.getUserid(), outMessage, true + ); + + // 向坐席推送消息 + getPeerSyncIM().send(MainContext.ReceiverType.AGENT, MainContext.ChannelType.WEBIM, + agentUser.getAppid(), + MainContext.MessageType.NEW, agentUser.getAgentno(), outMessage, true); + } + } catch (Exception ex) { + logger.warn("[allotAgent] fail to process service", ex); + } + } else { + logger.info("[allotAgent] agentno {} reach the max users limit", agentno); + break; + } + } + broadcastAgentsStatus(orgi, "agent", "success", agentno); + } + + /** + * 访客服务结束 + * + * @param agentUser + * @param orgi + * @throws Exception + */ + public static void serviceFinish(final AgentUser agentUser, final String orgi) { + if (agentUser != null) { + // 获得坐席状态 + AgentStatus agentStatus = null; + if (StringUtils.equals(MainContext.AgentUserStatusEnum.INSERVICE.toString(), agentUser.getStatus()) && + agentUser.getAgentno() != null) { + agentStatus = getCache().findOneAgentStatusByAgentnoAndOrig(agentUser.getAgentno(), orgi); + } + + // 设置新AgentUser的状态 + agentUser.setStatus(MainContext.AgentUserStatusEnum.END.toString()); + if (agentUser.getServicetime() != null) { + agentUser.setSessiontimes(System.currentTimeMillis() - agentUser.getServicetime().getTime()); + } + + // 从缓存中删除agentUser缓存 + getAgentUserRes().save(agentUser); + + final SessionConfig sessionConfig = AutomaticServiceDist.initSessionConfig(orgi); + + // 坐席服务 + AgentService service = null; + if (StringUtils.isNotBlank(agentUser.getAgentserviceid())) { + service = getAgentServiceRes().findByIdAndOrgi(agentUser.getAgentserviceid(), agentUser.getOrgi()); + } else if (agentStatus != null) { + // 该访客没有和坐席对话,因此没有 AgentService + // 当做留言处理,创建一个新的 AgentService + service = processAgentService(agentStatus, agentUser, orgi, true, sessionConfig); + } + + if (service != null) { + service.setStatus(MainContext.AgentUserStatusEnum.END.toString()); + service.setEndtime(new Date()); + if (service.getServicetime() != null) { + service.setSessiontimes(System.currentTimeMillis() - service.getServicetime().getTime()); + } + + final List agentUserTaskList = getAgentUserTaskRes().findByIdAndOrgi( + agentUser.getId(), agentUser.getOrgi()); + if (agentUserTaskList.size() > 0) { + final AgentUserTask agentUserTask = agentUserTaskList.get(0); + service.setAgentreplyinterval(agentUserTask.getAgentreplyinterval()); + service.setAgentreplytime(agentUserTask.getAgentreplytime()); + service.setAvgreplyinterval(agentUserTask.getAvgreplyinterval()); + service.setAvgreplytime(agentUserTask.getAvgreplytime()); + + service.setUserasks(agentUserTask.getUserasks()); + service.setAgentreplys(agentUserTask.getAgentreplys()); + + // 开启了质检,并且是有效对话 + if (sessionConfig.isQuality()) { + // 未分配质检任务 + service.setQualitystatus(MainContext.QualityStatusEnum.NODIS.toString()); + } + } + + /** + * 启用了质检任务,开启质检 + */ + if ((!sessionConfig.isQuality()) || service.getUserasks() == 0) { + // 未开启质检 或无效对话无需质检 + service.setQualitystatus(MainContext.QualityStatusEnum.NO.toString()); + } + getAgentServiceRes().save(service); + } + + /** + * 发送到访客端的通知 + */ + switch (MainContext.ChannelType.toValue(agentUser.getChannel())) { + case WEBIM: + // WebIM 发送对话结束事件 + // 向访客发送消息 + Message outMessage = new Message(); + outMessage.setAgentStatus(agentStatus); + outMessage.setMessage(AutomaticServiceDist.getServiceFinishMessage(agentUser.getChannel(), orgi)); + outMessage.setMessageType(MainContext.AgentUserStatusEnum.END.toString()); + outMessage.setCalltype(MainContext.CallType.IN.toString()); + outMessage.setCreatetime(MainUtils.dateFormate.format(new Date())); + outMessage.setAgentUser(agentUser); + + // 向访客发送消息 + getPeerSyncIM().send( + MainContext.ReceiverType.VISITOR, + MainContext.ChannelType.toValue(agentUser.getChannel()), agentUser.getAppid(), + MainContext.MessageType.STATUS, agentUser.getUserid(), outMessage, true + ); + + if (agentStatus != null) { + // 坐席在线,通知结束会话 + outMessage.setChannelMessage(agentUser); + outMessage.setAgentUser(agentUser); + getPeerSyncIM().send(MainContext.ReceiverType.AGENT, MainContext.ChannelType.WEBIM, + agentUser.getAppid(), + MainContext.MessageType.END, agentUser.getAgentno(), outMessage, true); + } + break; + case PHONE: + // 语音渠道,强制发送 + logger.info("[serviceFinish] send notify to callout channel agentno {}", agentUser.getAgentno()); + NettyClients.getInstance().sendCalloutEventMessage( + agentUser.getAgentno(), MainContext.MessageType.END.toString(), agentUser); + break; + default: + logger.info( + "[serviceFinish] ignore notify agent service end for channel {}, agent user id {}", + agentUser.getChannel(), agentUser.getId()); + } + + // 更新访客的状态为可以接收邀请 + final OnlineUser onlineUser = getOnlineUserRes().findOneByUseridAndOrgi( + agentUser.getUserid(), agentUser.getOrgi()); + if (onlineUser != null) { + onlineUser.setInvitestatus(MainContext.OnlineUserInviteStatus.DEFAULT.toString()); + getOnlineUserRes().save(onlineUser); + logger.info( + "[online] onlineUser id {}, status {}, invite status {}", onlineUser.getId(), + onlineUser.getStatus(), onlineUser.getInvitestatus()); + } + + // 当前访客服务已经结束,为坐席寻找新访客 + if (agentStatus != null) { + long maxusers = sessionConfig != null ? sessionConfig.getMaxuser() : Constants.AGENT_STATUS_MAX_USER; + if ((agentStatus.getUsers() - 1) < maxusers) { + allotAgent(agentStatus.getAgentno(), orgi); + } + } + broadcastAgentsStatus(orgi, "end", "success", agentUser != null ? agentUser.getId() : null); + } else { + logger.info("[serviceFinish] orgi {}, invalid agent user, should not be null", orgi); + } + } + + /** + * 更新坐席当前服务中的用户状态 + * #TODO 需要分布式锁 + * + * @param agentStatus + * @param orgi + */ + public synchronized static void updateAgentStatus(AgentStatus agentStatus, String orgi) { + int users = getCache().getInservAgentUsersSizeByAgentnoAndOrgi(agentStatus.getAgentno(), orgi); + agentStatus.setUsers(users); + agentStatus.setUpdatetime(new Date()); + getCache().putAgentStatusByOrgi(agentStatus, orgi); + } + + /** + * 向所有client通知坐席状态变化 + * + * @param orgi + * @param worktype + * @param workresult + * @param dataid + */ + public static void broadcastAgentsStatus(final String orgi, final String worktype, final String workresult, final String dataid) { + /** + * 坐席状态改变,通知监测服务 + */ + AgentReport agentReport = AutomaticServiceDist.getAgentReport(orgi); + agentReport.setOrgi(orgi); + agentReport.setWorktype(worktype); + agentReport.setWorkresult(workresult); + agentReport.setDataid(dataid); + getAgentReportRes().save(agentReport); + MainContext.getContext().getBean("agentNamespace", SocketIONamespace.class).getBroadcastOperations().sendEvent( + "status", agentReport); + } + + + /** + * @param agent 坐席 + * @param userid 用户ID + * @param status 工作状态,也就是上一个状态 + * @param current 下一个工作状态 + * @param worktype 类型 : 语音OR 文本 + * @param orgi + * @param lasttime + */ + public static void recordAgentStatus( + String agent, + String username, + String extno, + boolean admin, + String userid, + String status, + String current, + String worktype, + String orgi, + Date lasttime + ) { + WorkMonitorRepository workMonitorRes = MainContext.getContext().getBean(WorkMonitorRepository.class); + WorkMonitor workMonitor = new WorkMonitor(); + if (StringUtils.isNotBlank(agent) && StringUtils.isNotBlank(status)) { + workMonitor.setAgent(agent); + workMonitor.setAgentno(agent); + workMonitor.setStatus(status); + workMonitor.setAdmin(admin); + workMonitor.setUsername(username); + workMonitor.setExtno(extno); + workMonitor.setWorktype(worktype); + if (lasttime != null) { + workMonitor.setDuration((int) (System.currentTimeMillis() - lasttime.getTime()) / 1000); + } + if (status.equals(MainContext.AgentStatusEnum.BUSY.toString())) { + workMonitor.setBusy(true); + } + if (status.equals(MainContext.AgentStatusEnum.READY.toString())) { + int count = workMonitorRes.countByAgentAndDatestrAndStatusAndOrgi( + agent, MainUtils.simpleDateFormat.format(new Date()), + MainContext.AgentStatusEnum.READY.toString(), orgi + ); + if (count == 0) { + workMonitor.setFirsttime(true); + } + } + if (current.equals(MainContext.AgentStatusEnum.NOTREADY.toString())) { + List workMonitorList = workMonitorRes.findByOrgiAndAgentAndDatestrAndFirsttime( + orgi, agent, MainUtils.simpleDateFormat.format(new Date()), true); + if (workMonitorList.size() > 0) { + WorkMonitor firstWorkMonitor = workMonitorList.get(0); + if (firstWorkMonitor.getFirsttimes() == 0) { + firstWorkMonitor.setFirsttimes( + (int) (System.currentTimeMillis() - firstWorkMonitor.getCreatetime().getTime())); + workMonitorRes.save(firstWorkMonitor); + } + } + } + workMonitor.setCreatetime(new Date()); + workMonitor.setDatestr(MainUtils.simpleDateFormat.format(new Date())); + + workMonitor.setName(agent); + workMonitor.setOrgi(orgi); + workMonitor.setUserid(userid); + + workMonitorRes.save(workMonitor); + } + } + + /** + * 撤退一个坐席 + * 1)将该坐席状态置为"非就绪" + * 2) 将该坐席的访客重新分配给其它坐席 + * + * @param orgi + * @param agentno + * @return 有没有成功将所有其服务的访客都分配出去 + */ + public static boolean withdrawAgent(final String orgi, final String agentno) { + // 先将该客服切换到非就绪状态 + final AgentStatus agentStatus = getCache().findOneAgentStatusByAgentnoAndOrig(agentno, orgi); + if (agentStatus != null) { + agentStatus.setBusy(false); + agentStatus.setUpdatetime(new Date()); + agentStatus.setStatus(MainContext.AgentStatusEnum.NOTREADY.toString()); + getAgentStatusRes().save(agentStatus); + cache.putAgentStatusByOrgi(agentStatus, orgi); + } + + // 然后将该坐席的访客分配给其它坐席 + // 获得该租户在线的客服的多少 + // TODO 对于agentUser的技能组过滤,在下面再逐个考虑? + // 该信息同样也包括当前用户 + List agentUsers = cache.findInservAgentUsersByAgentnoAndOrgi(agentno, orgi); + int sz = agentUsers.size(); + for (final AgentUser x : agentUsers) { + try { + // TODO 此处没有考虑遍历过程中,系统中坐席的服务访客的信息实际上是变化的 + // 可能会发生maxusers超过设置的情况,如果做很多检查,会带来一定一系统开销 + // 因为影响不大,放弃实时的检查 + allotAgent(x, x.getOrgi()); + // 因为重新分配该访客,将其从撤离的坐席中服务集合中删除 + // 此处类似于 Transfer + getRedisCommand().removeSetVal( + RedisKey.getInServAgentUsersByAgentnoAndOrgi(agentno, orgi), x.getUserid()); + sz--; + } catch (Exception e) { + logger.warn("[withdrawAgent] throw error:", e); + } + } + + if (sz == 0) { + logger.info("[withdrawAgent] after re-allotAgent, the agentUsers size is {} for agentno {}", sz, agentno); + } else { + logger.warn("[withdrawAgent] after re-allotAgent, the agentUsers size is {} for agentno {}", sz, agentno); + } + + return sz == 0; + } + + /** + * 为用户分配坐席 + * + * @param agentUser + */ + @SuppressWarnings("unchecked") + public static AgentService allotAgent( + final AgentUser agentUser, + final String orgi) { + /** + * 查询条件,当前在线的 坐席,并且 未达到最大 服务人数的坐席 + */ + + List agentStatusList = filterOutAvailableAgentStatus(agentUser, orgi); + + /** + * 处理ACD 的 技能组请求和 坐席请求 + */ + AgentStatus agentStatus = null; + AgentService agentService = null; //放入缓存的对象 + SessionConfig sessionConfig = initSessionConfig(orgi); + if (agentStatusList.size() > 0) { + agentStatus = agentStatusList.get(0); + if (agentStatus.getUsers() >= sessionConfig.getMaxuser()) { + agentStatus = null; + /** + * 判断当前有多少人排队中 , 分三种情况:1、请求技能组的,2、请求坐席的,3,默认请求的 + * + */ + } + } + + try { + agentService = processAgentService(agentStatus, agentUser, orgi, sessionConfig); + // 处理结果:进入排队队列 + if (StringUtils.equals(MainContext.AgentUserStatusEnum.INQUENE.toString(), agentService.getStatus())) { + agentService.setQueneindex(getQueueIndex(agentUser.getAgentno(), orgi, agentUser.getSkill())); + } + } catch (Exception ex) { + logger.warn("[allotAgent] exception: ", ex); + } + broadcastAgentsStatus( + orgi, "user", agentService != null && agentService.getStatus().equals( + MainContext.AgentUserStatusEnum.INSERVICE.toString()) ? "inservice" : "inquene", + agentUser.getId() + ); + return agentService; + } + + /** + * 过滤在线客服 + * 优先级: 1. 指定坐席;2. 指定技能组; 3. 租户所有的坐席 + * + * @param agentUser + * @param orgi + * @return + */ + private static List filterOutAvailableAgentStatus( + final AgentUser agentUser, + final String orgi + ) { + logger.info( + "[filterOutAvailableAgentStatus] agentUser {}, orgi {}, skill {}, onlineUser {}", + agentUser.getAgentno(), orgi, agentUser.getSkill(), agentUser.getUserid() + ); + List agentStatuses = new ArrayList<>(); + Map map = getCache().findAllReadyAgentStatusByOrgi(orgi); + + if (agentUser != null && StringUtils.isNotBlank(agentUser.getAgentno())) { + // 指定坐席 + for (Map.Entry entry : map.entrySet()) { + if ((!entry.getValue().isBusy()) && (StringUtils.equals( + entry.getValue().getAgentno(), agentUser.getAgentno()))) { + agentStatuses.add(entry.getValue()); + } + } + } + + /** + * 指定坐席未查询到就绪的 + */ + if (agentStatuses.size() == 0) { + if (StringUtils.isNotBlank(agentUser.getSkill())) { + // 指定技能组 + for (Map.Entry entry : map.entrySet()) { + if ((!entry.getValue().isBusy()) && + (entry.getValue().getSkills() != null && + entry.getValue().getSkills().containsKey(agentUser.getSkill()))) { + agentStatuses.add(entry.getValue()); + } + } + } + } + + /** + * 在指定的坐席和技能组中未查到坐席 + * 接下来进行无差别查询 + */ + if (agentStatuses.size() == 0) { + // 对于该租户的所有客服 + for (Map.Entry entry : map.entrySet()) { + if (!entry.getValue().isBusy()) { + agentStatuses.add(entry.getValue()); + } + } + } + + logger.info("[filterOutAvailableAgentStatus] agent status list size: {}", agentStatuses.size()); + return agentStatuses; + } + + /** + * 邀请访客进入当前对话,如果当前操作的 坐席是已就绪状态,则直接加入到当前坐席的 对话列表中,如果未登录,则分配给其他坐席 + * + * @param agentno + * @param agentUser + * @param orgi + * @return + * @throws Exception + */ + public static AgentService allotAgentForInvite( + final String agentno, + final AgentUser agentUser, + final String orgi + ) throws Exception { + AgentStatus agentStatus = getCache().findOneAgentStatusByAgentnoAndOrig(agentno, orgi); + AgentService agentService; + if (agentStatus != null) { + SessionConfig sessionConfig = initSessionConfig(orgi); + agentService = processAgentService(agentStatus, agentUser, orgi, sessionConfig); + broadcastAgentsStatus(orgi, "invite", "success", agentno); + + /** + * 通知坐席新的访客邀请成功 + */ + Message outMessage = new Message(); + outMessage.setAgentUser(agentUser); + outMessage.setChannelMessage(agentUser); + getPeerSyncIM().send(MainContext.ReceiverType.AGENT, MainContext.ChannelType.WEBIM, + agentUser.getAppid(), + MainContext.MessageType.NEW, agentUser.getAgentno(), outMessage, true); + } else { + agentService = allotAgent(agentUser, orgi); + } + return agentService; + } + + /** + * 为访客 分配坐席, ACD策略,此处 AgentStatus 是建议 的 坐席, 如果启用了 历史服务坐席 优先策略, 则会默认检查历史坐席是否空闲,如果空闲,则分配,如果不空闲,则 分配当前建议的坐席 + * + * @param agentStatus + * @param agentUser + * @param orgi + * @return + * @throws Exception + */ + private static AgentService processAgentService(AgentStatus agentStatus, final AgentUser agentUser, final String orgi, final SessionConfig sessionConfig) throws Exception { + return processAgentService(agentStatus, agentUser, orgi, false, sessionConfig); + } + + /** + * 为访客分配机器人客服, ACD策略,此处 AgentStatus 是建议 的 坐席, 如果启用了 历史服务坐席 优先策略, 则会默认检查历史坐席是否空闲,如果空闲,则分配,如果不空闲,则 分配当前建议的坐席 + * + * @param agentUser + * @param orgi + * @return + * @throws Exception + */ + public static AgentService processChatbotService(final String botName, final AgentUser agentUser, final String orgi) { + AgentService agentService = new AgentService(); //放入缓存的对象 + Date now = new Date(); + if (StringUtils.isNotBlank(agentUser.getAgentserviceid())) { + agentService = getAgentServiceRes().findByIdAndOrgi(agentUser.getAgentserviceid(), orgi); + agentService.setEndtime(now); + if (agentService.getServicetime() != null) { + agentService.setSessiontimes(System.currentTimeMillis() - agentService.getServicetime().getTime()); + } + agentService.setStatus(MainContext.AgentUserStatusEnum.END.toString()); + } else { + agentService.setServicetime(now); + agentService.setLogindate(now); + agentService.setOrgi(orgi); + agentService.setOwner(agentUser.getContextid()); + agentService.setSessionid(agentUser.getSessionid()); + agentService.setRegion(agentUser.getRegion()); + agentService.setUsername(agentUser.getUsername()); + agentService.setChannel(agentUser.getChannel()); + if (botName != null) { + agentService.setAgentusername(botName); + } + + if (StringUtils.isNotBlank(agentUser.getContextid())) { + agentService.setContextid(agentUser.getContextid()); + } else { + agentService.setContextid(agentUser.getSessionid()); + } + + agentService.setUserid(agentUser.getUserid()); + agentService.setAiid(agentUser.getAgentno()); + agentService.setAiservice(true); + agentService.setStatus(MainContext.AgentUserStatusEnum.INSERVICE.toString()); + + agentService.setAppid(agentUser.getAppid()); + agentService.setLeavemsg(false); + } + + agentServiceRes.save(agentService); + return agentService; + } + + /** + * 为agentUser生成对应的AgentService + * 使用场景: + * 1. 在AgentUser服务结束并且还没有对应的AgentService + * 2. 在新服务开始,安排坐席 + * + * @param agentStatus 坐席状态 + * @param agentUser 坐席访客会话 + * @param orgi 租户ID + * @param finished 结束服务 + * @param sessionConfig 坐席配置 + * @return + */ + private static AgentService processAgentService( + AgentStatus agentStatus, + final AgentUser agentUser, + final String orgi, + final boolean finished, + final SessionConfig sessionConfig) { + AgentService agentService = new AgentService(); + if (StringUtils.isNotBlank(agentUser.getAgentserviceid())) { + agentService.setId(agentUser.getAgentserviceid()); + } + agentService.setOrgi(orgi); + + final Date now = new Date(); + // 批量复制属性 + MainUtils.copyProperties(agentUser, agentService); + agentService.setChannel(agentUser.getChannel()); + agentService.setSessionid(agentUser.getSessionid()); + + // 此处为何设置loginDate为现在 + agentUser.setLogindate(now); + OnlineUser onlineUser = getOnlineUserRes().findOneByUseridAndOrgi(agentUser.getUserid(), orgi); + + if (finished == true) { + // 服务结束 + agentUser.setStatus(MainContext.AgentUserStatusEnum.END.toString()); + agentService.setStatus(MainContext.AgentUserStatusEnum.END.toString()); + agentService.setSessiontype(MainContext.AgentUserStatusEnum.END.toString()); + if (agentStatus == null) { + // 没有满足条件的坐席,留言 + agentService.setLeavemsg(true); + agentService.setLeavemsgstatus(MainContext.LeaveMsgStatus.NOTPROCESS.toString()); //未处理的留言 + } + + if (onlineUser != null) { + // 更新OnlineUser对象,变更为默认状态,可以接受邀请 + onlineUser.setInvitestatus(MainContext.OnlineUserInviteStatus.DEFAULT.toString()); + } + } else if (agentStatus != null) { + agentService.setAgent(agentStatus.getAgentno()); + agentService.setSkill(agentUser.getSkill()); + + if (sessionConfig.isLastagent()) { + // 启用了历史坐席优先 , 查找 历史服务坐席 + List webIMaggList = MainUtils.getWebIMDataAgg( + onlineUserRes.findByOrgiForDistinctAgent(orgi, agentUser.getUserid())); + if (webIMaggList.size() > 0) { + for (WebIMReport report : webIMaggList) { + if (report.getData().equals(agentStatus.getAgentno())) { + break; + } else { + AgentStatus hisAgentStatus = getCache().findOneAgentStatusByAgentnoAndOrig( + report.getData(), orgi); + if (hisAgentStatus != null && hisAgentStatus.getUsers() < hisAgentStatus.getMaxusers()) { + // 变更为 历史服务坐席 + agentStatus = hisAgentStatus; + break; + } + } + + } + } + } + + agentUser.setStatus(MainContext.AgentUserStatusEnum.INSERVICE.toString()); + agentService.setStatus(MainContext.AgentUserStatusEnum.INSERVICE.toString()); + agentService.setSessiontype(MainContext.AgentUserStatusEnum.INSERVICE.toString()); + + // 设置坐席名字 + agentService.setAgentno(agentStatus.getUserid()); + agentService.setAgentusername(agentStatus.getUsername()); + } else { + // 不是服务结束,但是没有满足条件的坐席 + // 加入到排队中 + agentUser.setStatus(MainContext.AgentUserStatusEnum.INQUENE.toString()); + agentService.setStatus(MainContext.AgentUserStatusEnum.INQUENE.toString()); + agentService.setSessiontype(MainContext.AgentUserStatusEnum.INQUENE.toString()); + } + + if (finished || agentStatus != null) { + agentService.setAgentuserid(agentUser.getId()); + agentService.setInitiator(MainContext.ChatInitiatorType.USER.toString()); + + long waittingtime = 0; + if (agentUser.getWaittingtimestart() != null) { + waittingtime = System.currentTimeMillis() - agentUser.getWaittingtimestart().getTime(); + } else { + if (agentUser.getCreatetime() != null) { + waittingtime = System.currentTimeMillis() - agentUser.getCreatetime().getTime(); + } + } + + agentUser.setWaittingtime((int) waittingtime); + agentUser.setServicetime(now); + agentService.setOwner(agentUser.getOwner()); + agentService.setTimes(0); + + final User agent = getUserRes().findOne(agentService.getAgentno()); + agentUser.setAgentname(agent.getUname()); + agentUser.setAgentno(agentService.getAgentno()); + + if (StringUtils.isNotBlank(agentUser.getName())) { + agentService.setName(agentUser.getName()); + } + if (StringUtils.isNotBlank(agentUser.getPhone())) { + agentService.setPhone(agentUser.getPhone()); + } + if (StringUtils.isNotBlank(agentUser.getEmail())) { + agentService.setEmail(agentUser.getEmail()); + } + if (StringUtils.isNotBlank(agentUser.getResion())) { + agentService.setResion(agentUser.getResion()); + } + + if (StringUtils.isNotBlank(agentUser.getSkill())) { + agentService.setAgentskill(agentUser.getSkill()); + } + + agentService.setServicetime(now); + + if (agentUser.getCreatetime() != null) { + agentService.setWaittingtime((int) (System.currentTimeMillis() - agentUser.getCreatetime().getTime())); + agentUser.setWaittingtime(agentService.getWaittingtime()); + } + if (onlineUser != null) { + agentService.setOsname(onlineUser.getOpersystem()); + agentService.setBrowser(onlineUser.getBrowser()); + // 记录onlineUser的id + agentService.setDataid(onlineUser.getId()); + } + + agentService.setLogindate(agentUser.getCreatetime()); + getAgentServiceRes().save(agentService); + + agentUser.setAgentserviceid(agentService.getId()); + agentUser.setLastgetmessage(now); + agentUser.setLastmessage(now); + } + + agentService.setDataid(agentUser.getId()); + + /** + * 分配成功以后, 将用户和坐席的对应关系放入到缓存 + * 将 AgentUser 放入到当前坐席的服务队列 + */ + getAgentUserRes().save(agentUser); + + /** + * 更新OnlineUser对象,变更为服务中,不可邀请 + */ + if (onlineUser != null && !finished) { + onlineUser.setInvitestatus(MainContext.OnlineUserInviteStatus.INSERV.toString()); + onlineUserRes.save(onlineUser); + } + + // 更新坐席服务人数,坐席更新时间到缓存 + if (agentStatus != null) { + updateAgentStatus(agentStatus, orgi); + } + return agentService; + } + + /** + * 删除AgentUser + * 包括数据库记录及缓存信息 + * + * @param agentUser + * @param orgi + * @return + */ + public static void deleteAgentUser(final AgentUser agentUser, final String orgi) throws CSKefuException { + logger.info("[deleteAgentUser] userId {}, orgi {}", agentUser.getUserid(), orgi); + + if (agentUser == null || agentUser.getId() == null) { + throw new CSKefuException("Invalid agentUser info"); + } + + if (!StringUtils.equals(MainContext.AgentUserStatusEnum.END.toString(), agentUser.getStatus())) { + /** + * 未结束聊天,先结束对话,然后删除记录 + */ + // 删除缓存 + serviceFinish(agentUser, orgi); + } + + // 删除数据库里的AgentUser记录 + getAgentUserRes().delete(agentUser); + } + + /** + * 通知消息内容:分配到坐席 + * + * @param agentService + * @param channel + * @param orgi + * @return + */ + public static String getSuccessMessage(AgentService agentService, String channel, String orgi) { + String queneTip = "" + agentService.getAgentusername() + ""; + if (!MainContext.ChannelType.WEBIM.toString().equals(channel)) { + queneTip = agentService.getAgentusername(); + } + SessionConfig sessionConfig = initSessionConfig(orgi); + String successMsg = "坐席分配成功," + queneTip + "为您服务。"; + if (StringUtils.isNotBlank(sessionConfig.getSuccessmsg())) { + successMsg = sessionConfig.getSuccessmsg().replaceAll("\\{agent\\}", queneTip); + } + return successMsg; + } + + /** + * 通知消息内容:和坐席断开 + * + * @param channel + * @param orgi + * @return + */ + public static String getServiceFinishMessage(String channel, String orgi) { + SessionConfig sessionConfig = initSessionConfig(orgi); + String queneTip = "坐席已断开和您的对话"; + if (StringUtils.isNotBlank(sessionConfig.getFinessmsg())) { + queneTip = sessionConfig.getFinessmsg(); + } + return queneTip; + } + + + /** + * 通知消息内容:和坐席断开,刷新页面 + * + * @param channel + * @param orgi + * @return + */ + public static String getServiceOffMessage(String channel, String orgi) { + SessionConfig sessionConfig = initSessionConfig(orgi); + String queneTip = "坐席已断开和您的对话,刷新页面为您分配新的坐席"; + if (StringUtils.isNotBlank(sessionConfig.getFinessmsg())) { + queneTip = sessionConfig.getFinessmsg(); + } + return queneTip; + } + + public static String getNoAgentMessage(int queneIndex, String channel, String orgi) { + if (queneIndex < 0) { + queneIndex = 0; + } + String queneTip = "" + queneIndex + ""; + if (!MainContext.ChannelType.WEBIM.toString().equals(channel)) { + queneTip = String.valueOf(queneIndex); + } + SessionConfig sessionConfig = initSessionConfig(orgi); + String noAgentTipMsg = "坐席全忙,已进入等待队列,您也可以在其他时间再来咨询。"; + if (StringUtils.isNotBlank(sessionConfig.getNoagentmsg())) { + noAgentTipMsg = sessionConfig.getNoagentmsg().replaceAll("\\{num\\}", queneTip); + } + return noAgentTipMsg; + } + + public static String getQueneMessage(int queneIndex, String channel, String orgi) { + + String queneTip = "" + queneIndex + ""; + if (!MainContext.ChannelType.WEBIM.toString().equals(channel)) { + queneTip = String.valueOf(queneIndex); + } + SessionConfig sessionConfig = initSessionConfig(orgi); + String agentBusyTipMsg = "正在排队,请稍候,在您之前,还有 " + queneTip + " 位等待用户。"; + if (StringUtils.isNotBlank(sessionConfig.getAgentbusymsg())) { + agentBusyTipMsg = sessionConfig.getAgentbusymsg().replaceAll("\\{num\\}", queneTip); + } + return agentBusyTipMsg; + } + + private static RedisCommand getRedisCommand() { + if (redisCommand == null) { + redisCommand = MainContext.getContext().getBean(RedisCommand.class); + } + return redisCommand; + } + + private static Cache getCache() { + if (cache == null) { + cache = MainContext.getContext().getBean(Cache.class); + } + return cache; + } + + private static AgentUserRepository getAgentUserRes() { + if (agentUserRes == null) { + agentUserRes = MainContext.getContext().getBean(AgentUserRepository.class); + } + return agentUserRes; + } + + private static OnlineUserRepository getOnlineUserRes() { + if (onlineUserRes == null) { + onlineUserRes = MainContext.getContext().getBean(OnlineUserRepository.class); + } + return onlineUserRes; + } + + private static AgentServiceRepository getAgentServiceRes() { + if (agentServiceRes == null) { + agentServiceRes = MainContext.getContext().getBean(AgentServiceRepository.class); + } + return agentServiceRes; + } + + private static AgentUserTaskRepository getAgentUserTaskRes() { + if (agentUserTaskRes == null) { + agentUserTaskRes = MainContext.getContext().getBean(AgentUserTaskRepository.class); + } + return agentUserTaskRes; + } + + private static AgentReportRepository getAgentReportRes() { + if (agentReportRes == null) { + agentReportRes = MainContext.getContext().getBean(AgentReportRepository.class); + } + return agentReportRes; + } + + private static AgentStatusRepository getAgentStatusRes() { + if (agentStatusRes == null) { + agentStatusRes = MainContext.getContext().getBean(AgentStatusRepository.class); + } + + return agentStatusRes; + } + + private static SessionConfigRepository getSessionConfigRes() { + if (sessionConfigRes == null) { + sessionConfigRes = MainContext.getContext().getBean(SessionConfigRepository.class); + } + + return sessionConfigRes; + } + + private static UserRepository getUserRes() { + if (UserRes == null) { + UserRes = MainContext.getContext().getBean(UserRepository.class); + } + + return UserRes; + } + + private static ContactsRepository getContactsRes() { + if (contactsRes == null) { + contactsRes = MainContext.getContext().getBean(ContactsRepository.class); + } + + return contactsRes; + } + + private static AgentUserContactsRepository getAgentUserContactsRes() { + if (agentUserContactsRes == null) { + agentUserContactsRes = MainContext.getContext().getBean(AgentUserContactsRepository.class); + } + + return agentUserContactsRes; + } + + private static AgentAuditProxy getAgentAuditProxy() { + if (agentAuditProxy == null) { + agentAuditProxy = MainContext.getContext().getBean(AgentAuditProxy.class); + } + return agentAuditProxy; + } + + private static PeerSyncIM getPeerSyncIM() { + if (peerSyncIM == null) { + peerSyncIM = MainContext.getContext().getBean(PeerSyncIM.class); + } + return peerSyncIM; + } + + +} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/activemq/AgentAuditSubscription.java b/contact-center/app/src/main/java/com/chatopera/cc/activemq/AgentAuditSubscription.java new file mode 100644 index 00000000..aef06b4d --- /dev/null +++ b/contact-center/app/src/main/java/com/chatopera/cc/activemq/AgentAuditSubscription.java @@ -0,0 +1,113 @@ +/* + * Copyright (C) 2019 Chatopera Inc, + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.chatopera.cc.activemq; + +import com.chatopera.cc.basic.Constants; +import com.chatopera.cc.cache.Cache; +import com.chatopera.cc.exception.CSKefuException; +import com.chatopera.cc.model.AgentUser; +import com.chatopera.cc.model.AgentUserAudit; +import com.chatopera.cc.persistence.repository.AgentUserRepository; +import com.chatopera.cc.proxy.AgentAuditProxy; +import com.chatopera.cc.socketio.client.NettyClients; +import com.chatopera.cc.util.SerializeUtil; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jms.annotation.JmsListener; +import org.springframework.stereotype.Component; + +/** + * 会话监控 + */ +@Component +public class AgentAuditSubscription { + private final static Logger logger = LoggerFactory.getLogger(AgentAuditSubscription.class); + + @Autowired + private Cache cache; + + @Autowired + private AgentAuditProxy agentAuditProxy; + + @Autowired + private AgentUserRepository agentUserRes; + + + /** + * 接收坐席会话监控消息 + * + * @param msg + */ + @JmsListener(destination = Constants.AUDIT_AGENT_MESSAGE, containerFactory = "jmsListenerContainerTopic") + public void onMessage(final String msg) { + logger.info("[onMessage] payload {}", msg); + try { + final JsonObject json = new JsonParser().parse(msg).getAsJsonObject(); + + if (json.has("orgi") && json.has("data") && + json.has("agentUserId") && + json.has("event") && json.has("agentno")) { + + // 查找关联的会话监控信息 + final AgentUserAudit agentUserAudit = cache.findOneAgentUserAuditByOrgiAndId( + json.get("orgi").getAsString(), + json.get("agentUserId").getAsString()).orElseGet(() -> { + final AgentUser agentUser = agentUserRes.findOne(json.get("agentUserId").getAsString()); + if (agentUser != null) { + return agentAuditProxy.updateAgentUserAudits(agentUser); + } else { + logger.warn( + "[onMessage] can not find agent user by id {}", json.get("agentUserId").getAsString()); + } + return null; + }); + + if (agentUserAudit != null) { + final String agentno = json.get("agentno").getAsString(); + logger.info( + "[onMessage] agentno {}, subscribers size {}, subscribers {}", agentno, + agentUserAudit.getSubscribers().size(), + StringUtils.join(agentUserAudit.getSubscribers().keySet(), "|")); + + // 发送消息给坐席监控,不需要分布式,因为这条消息已经是从ActiveMQ使用Topic多机广播 + for (final String subscriber : agentUserAudit.getSubscribers().keySet()) { + logger.info("[onMessage] process subscriber {}", subscriber); + if (!StringUtils.equals(subscriber, agentno)) { + logger.info("[onMessage] publish event to {}", subscriber); + NettyClients.getInstance().publishAuditEventMessage( + subscriber, + json.get("event").getAsString(), + SerializeUtil.deserialize(json.get("data").getAsString())); + } + } + } else { + logger.warn( + "[onMessage] can not resolve agent user audit object for agent user id {}", + json.get("agentUserId").getAsString()); + } + } else { + throw new CSKefuException("Invalid payload."); + } + } catch (Exception e) { + logger.error("[onMessage] error", e); + } + } +} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/activemq/AgentSessionSubscription.java b/contact-center/app/src/main/java/com/chatopera/cc/activemq/AgentSessionSubscription.java new file mode 100644 index 00000000..bb0e3db5 --- /dev/null +++ b/contact-center/app/src/main/java/com/chatopera/cc/activemq/AgentSessionSubscription.java @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2019 Chatopera Inc, + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.chatopera.cc.activemq; + +import com.chatopera.cc.basic.Constants; +import com.chatopera.cc.socketio.client.NettyClients; +import com.chatopera.cc.util.SerializeUtil; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.jms.annotation.JmsListener; +import org.springframework.stereotype.Component; + +@Component +public class AgentSessionSubscription { + private final static Logger logger = LoggerFactory.getLogger(AgentSessionSubscription.class); + + /** + * 接收坐席会话监控消息 + * + * @param msg + */ + @JmsListener(destination = Constants.MQ_TOPIC_WEB_SESSION_SSO, containerFactory = "jmsListenerContainerTopic") + public void onMessage(final String msg) { + logger.info("[onMessage] payload {}", msg); + try { + final JsonObject json = new JsonParser().parse(msg).getAsJsonObject(); + // 把登出消息通知给浏览器 + NettyClients.getInstance().publishLeaveEventMessage( + json.get("agentno").getAsString(), + json.get("post").getAsString()); + } catch (Exception e) { + logger.warn("[onMessage] error", e); + } + } + + +} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/activemq/AgentSubscription.java b/contact-center/app/src/main/java/com/chatopera/cc/activemq/AgentSubscription.java new file mode 100644 index 00000000..340d274b --- /dev/null +++ b/contact-center/app/src/main/java/com/chatopera/cc/activemq/AgentSubscription.java @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2019 Chatopera Inc, All rights reserved. + * + * This software and related documentation are provided under a license agreement containing + * restrictions on use and disclosure and are protected by intellectual property laws. + * Except as expressly permitted in your license agreement or allowed by law, you may not use, + * copy, reproduce, translate, broadcast, modify, license, transmit, distribute, exhibit, perform, + * publish, or display any part, in any form, or by any means. Reverse engineering, disassembly, + * or decompilation of this software, unless required by law for interoperability, is prohibited. + */ +package com.chatopera.cc.activemq; + +import com.chatopera.cc.basic.Constants; +import com.chatopera.cc.socketio.client.NettyClients; +import com.chatopera.cc.util.SerializeUtil; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.jms.annotation.JmsListener; +import org.springframework.stereotype.Component; + +/** + * WebIM Agent + */ +@Component +public class AgentSubscription { + + private final static Logger logger = LoggerFactory.getLogger(AgentSubscription.class); + + @Value("${application.node.id}") + private String appNodeId; + + @Autowired + private BrokerPublisher brokerPublisher; + + /** + * Publish Message into ActiveMQ + * + * @param j + */ + public void publish(JsonObject j) { + j.addProperty("node", appNodeId); + brokerPublisher.send(Constants.INSTANT_MESSAGING_MQ_TOPIC_AGENT, j.toString(), true); + } + + @JmsListener(destination = Constants.INSTANT_MESSAGING_MQ_TOPIC_AGENT, containerFactory = "jmsListenerContainerTopic") + public void onMessage(final String payload) { + logger.info("[onMessage] payload {}", payload); + JsonParser parser = new JsonParser(); + JsonObject j = parser.parse(payload).getAsJsonObject(); + logger.debug("[onMessage] message body {}", j.toString()); + try { + if (!j.has("id")) { + logger.warn("[onMessage] Invalid payload, id is null"); + return; + } + + NettyClients.getInstance().sendAgentEventMessage( + j.get("id").getAsString(), + j.get("event").getAsString(), + SerializeUtil.deserialize(j.get("data").getAsString())); + } catch (Exception e) { + logger.error("onMessage", e); + } + } +} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/activemq/BlackListEventSubscription.java b/contact-center/app/src/main/java/com/chatopera/cc/activemq/BlackListEventSubscription.java new file mode 100644 index 00000000..4496b5e1 --- /dev/null +++ b/contact-center/app/src/main/java/com/chatopera/cc/activemq/BlackListEventSubscription.java @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2019 Chatopera Inc, + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.chatopera.cc.activemq; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.chatopera.cc.basic.Constants; +import com.chatopera.cc.cache.Cache; +import com.chatopera.cc.persistence.repository.BlackListRepository; +import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jms.annotation.JmsListener; +import org.springframework.stereotype.Component; + +/** + * 访客黑名单 + */ +@Component +public class BlackListEventSubscription { + private final static Logger logger = LoggerFactory.getLogger(BlackListEventSubscription.class); + + @Autowired + private Cache cache; + + @Autowired + private BlackListRepository blackListRes; + + /** + * 拉黑访客到达拉黑时间后,从黑名单中移除 + * + * @param payload + */ + @JmsListener(destination = Constants.WEBIM_SOCKETIO_ONLINE_USER_BLACKLIST, containerFactory = "jmsListenerContainerQueue") + public void onMessage(final String payload) { + logger.info("[onMessage] payload {}", payload); + + try { + final JSONObject json = JSON.parseObject(payload); + final String userId = json.getString("userId"); + final String orgi = json.getString("orgi"); + + if (StringUtils.isNotBlank(userId) && StringUtils.isNotBlank(orgi)) { + cache.findOneBlackEntityByUserIdAndOrgi(userId, orgi).ifPresent(blackListRes::delete); + } else { + logger.warn("[onMessage] error: invalid payload"); + } + } catch (Exception e) { + logger.error("[onMessage] error", e); + } + } +} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/activemq/BrokerPublisher.java b/contact-center/app/src/main/java/com/chatopera/cc/activemq/BrokerPublisher.java new file mode 100644 index 00000000..928e2a47 --- /dev/null +++ b/contact-center/app/src/main/java/com/chatopera/cc/activemq/BrokerPublisher.java @@ -0,0 +1,107 @@ +/* + * Copyright (C) 2019 Chatopera Inc, All rights reserved. + * + * This software and related documentation are provided under a license agreement containing + * restrictions on use and disclosure and are protected by intellectual property laws. + * Except as expressly permitted in your license agreement or allowed by law, you may not use, + * copy, reproduce, translate, broadcast, modify, license, transmit, distribute, exhibit, perform, + * publish, or display any part, in any form, or by any means. Reverse engineering, disassembly, + * or decompilation of this software, unless required by law for interoperability, is prohibited. + */ + +package com.chatopera.cc.activemq; + +import com.alibaba.fastjson.JSONObject; +import org.apache.activemq.ScheduledMessage; +import org.apache.activemq.command.ActiveMQTopic; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jms.core.JmsTemplate; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import java.util.Map; + +@Component +public class BrokerPublisher { + + final static private Logger logger = LoggerFactory.getLogger(BrokerPublisher.class); + + @Autowired + private JmsTemplate jmsTemplate; + + @PostConstruct + public void setup() { + logger.info("[ActiveMQ Publisher] setup successfully."); + } + + + /** + * 时延消息 + * + * @param destination + * @param payload + * @param delay available by delayed seconds + */ + public void send(final String destination, final String payload, final boolean isTopic, final int delay) { + try { + if (isTopic) { + jmsTemplate.convertAndSend(new ActiveMQTopic(destination), payload, m -> { + m.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY, 1000 * delay); + return m; + }); + } else { + // 默认为Queue + jmsTemplate.convertAndSend(destination, payload, m -> { + m.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY, 1000 * delay); + return m; + }); + } + logger.debug("[send] send succ, dest {}, payload {}", destination, payload); + } catch (Exception e) { + logger.warn("[send] error happens.", e); + } + } + + /** + * @param destination + * @param payload + * @param isTopic + */ + public void send(final String destination, final String payload, boolean isTopic) { + try { + if (isTopic) { + jmsTemplate.convertAndSend(new ActiveMQTopic(destination), payload); + } else { + // 默认为Queue + jmsTemplate.convertAndSend(destination, payload); + } + logger.debug("[send] send succ, dest {}, payload {}", destination, payload); + } catch (Exception e) { + logger.warn("[send] error happens.", e); + } + } + + public void send(final String destination, final String payload) { + send(destination, payload, false); + } + + public void send(final String destination, final JSONObject payload) { + send(destination, payload.toJSONString()); + } + + public void send(final String destination, final org.json.JSONObject payload) { + send(destination, payload.toString()); + } + + public void send(final String destination, final Map payload) { + JSONObject obj = new JSONObject(); + + for (Map.Entry entry : payload.entrySet()) { + obj.put(entry.getKey(), entry.getValue()); + } + + send(destination, obj.toJSONString()); + } +} \ No newline at end of file diff --git a/contact-center/app/src/main/java/com/chatopera/cc/activemq/ChatbotEventSubscription.java b/contact-center/app/src/main/java/com/chatopera/cc/activemq/ChatbotEventSubscription.java new file mode 100644 index 00000000..3f798db2 --- /dev/null +++ b/contact-center/app/src/main/java/com/chatopera/cc/activemq/ChatbotEventSubscription.java @@ -0,0 +1,143 @@ +/* + * Copyright (C) 2019 Chatopera Inc, All rights reserved. + * + * This software and related documentation are provided under a license agreement containing + * restrictions on use and disclosure and are protected by intellectual property laws. + * Except as expressly permitted in your license agreement or allowed by law, you may not use, + * copy, reproduce, translate, broadcast, modify, license, transmit, distribute, exhibit, perform, + * publish, or display any part, in any form, or by any means. Reverse engineering, disassembly, + * or decompilation of this software, unless required by law for interoperability, is prohibited. + */ + +package com.chatopera.cc.activemq; + +import com.chatopera.bot.exception.ChatbotException; +import com.chatopera.cc.basic.MainContext; +import com.chatopera.cc.cache.Cache; +import com.chatopera.cc.handler.api.request.RestUtils; +import com.chatopera.cc.socketio.message.ChatMessage; +import com.chatopera.cc.proxy.ChatbotProxy; +import com.chatopera.cc.model.AgentUser; +import com.chatopera.cc.model.Chatbot; +import com.chatopera.cc.persistence.repository.AgentUserRepository; +import com.chatopera.cc.persistence.repository.ChatbotRepository; +import com.chatopera.cc.basic.Constants; +import com.chatopera.cc.util.SerializeUtil; +import org.json.JSONException; +import org.json.JSONObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.jms.annotation.JmsListener; +import org.springframework.stereotype.Component; + +import java.net.MalformedURLException; + +/** + * 发送消息给聊天机器人并处理返回结果 + */ +@Component +public class ChatbotEventSubscription { + private final static Logger logger = LoggerFactory.getLogger(ChatbotEventSubscription.class); + + @Autowired + private Cache cache; + + @Autowired + private AgentUserRepository agentUserRes; + + @Autowired + private ChatbotRepository chatbotRes; + + @Value("${bot.baseurl}") + private static String botBaseUrl; + + @Autowired + private ChatbotProxy chatbotProxy; + + /** + * 接收发送消息给聊天机器人的请求 + * + * @param payload + */ + @JmsListener(destination = Constants.INSTANT_MESSAGING_MQ_QUEUE_CHATBOT, containerFactory = "jmsListenerContainerQueue") + public void onMessage(final String payload) { + ChatMessage message = SerializeUtil.deserialize(payload); + try { + chat(message); + } catch (MalformedURLException e) { + logger.error("[onMessage] error", e); + } catch (ChatbotException e) { + logger.error("[onMessage] error", e); + } + } + + + private void chat(final ChatMessage request) throws MalformedURLException, ChatbotException, JSONException { + Chatbot c = chatbotRes + .findOne(request.getAiid()); + + logger.info( + "[chat] chat request baseUrl {}, chatbot {}, fromUserId {}, textMessage {}", botBaseUrl, c.getName(), + request.getUserid(), request.getMessage()); + // Get response from Conversational Engine. + com.chatopera.bot.sdk.Chatbot bot = new com.chatopera.bot.sdk.Chatbot( + c.getClientId(), c.getSecret(), botBaseUrl); + JSONObject result = bot.conversation(request.getUserid(), request.getMessage()); + + // parse response + if (result != null) { + logger.info("[chat] chat response {}", result.toString()); + if (result.getInt(RestUtils.RESP_KEY_RC) == 0) { + // reply + JSONObject data = result.getJSONObject("data"); + ChatMessage resp = new ChatMessage(); + resp.setCalltype(MainContext.CallType.OUT.toString()); + resp.setAppid(resp.getAppid()); + resp.setOrgi(request.getOrgi()); + resp.setAiid(request.getAiid()); + resp.setMessage(data.getString("string")); + resp.setTouser(request.getUserid()); + resp.setAgentserviceid(request.getAgentserviceid()); + resp.setMsgtype(request.getMsgtype()); + resp.setUserid(request.getUserid()); + resp.setType(request.getType()); + resp.setChannel(request.getChannel()); + if (data.has("params")) { + resp.setExpmsg(data.get("params").toString()); + } + resp.setContextid(request.getContextid()); + resp.setSessionid(request.getSessionid()); + resp.setUsession(request.getUsession()); + resp.setUsername(c.getName()); + resp.setUpdatetime(System.currentTimeMillis()); + + // 更新聊天机器人累计值 + updateAgentUserWithRespData(request.getUserid(), request.getOrgi(), data); + // 保存并发送 + chatbotProxy.saveAndPublish(resp); + } else { + logger.warn("[chat] can not get expected response {}", result.toString()); + } + } + } + + /** + * 根据聊天机器人返回数据更新agentUser + * + * @param userid + * @param data + */ + private void updateAgentUserWithRespData(final String userid, final String orgi, final JSONObject data) throws JSONException { + cache.findOneAgentUserByUserIdAndOrgi(userid, orgi).ifPresent(p -> { + p.setChatbotround(p.getChatbotround() + 1); + if (data.has("logic_is_unexpected") && data.getBoolean("logic_is_unexpected")) { + p.setChatbotlogicerror(p.getChatbotlogicerror() + 1); + } + agentUserRes.save(p); + }); + + } + +} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/activemq/ConnectionEventSubscription.java b/contact-center/app/src/main/java/com/chatopera/cc/activemq/ConnectionEventSubscription.java new file mode 100644 index 00000000..02757af4 --- /dev/null +++ b/contact-center/app/src/main/java/com/chatopera/cc/activemq/ConnectionEventSubscription.java @@ -0,0 +1,109 @@ +/* + * Copyright (C) 2019 Chatopera Inc, All rights reserved. + * + * This software and related documentation are provided under a license agreement containing + * restrictions on use and disclosure and are protected by intellectual property laws. + * Except as expressly permitted in your license agreement or allowed by law, you may not use, + * copy, reproduce, translate, broadcast, modify, license, transmit, distribute, exhibit, perform, + * publish, or display any part, in any form, or by any means. Reverse engineering, disassembly, + * or decompilation of this software, unless required by law for interoperability, is prohibited. + */ +package com.chatopera.cc.activemq; + +import com.chatopera.cc.acd.AutomaticServiceDist; +import com.chatopera.cc.basic.MainContext; +import com.chatopera.cc.cache.Cache; +import com.chatopera.cc.model.AgentStatus; +import com.chatopera.cc.persistence.repository.AgentStatusRepository; +import com.chatopera.cc.persistence.repository.UserRepository; +import com.chatopera.cc.basic.Constants; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.jms.annotation.JmsListener; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import java.util.Date; + +/** + * 处理SocketIO的离线事件 + */ +@Component +public class ConnectionEventSubscription { + + private final static Logger logger = LoggerFactory.getLogger(ConnectionEventSubscription.class); + + @Autowired + private AgentStatusRepository agentStatusRes; + + @Autowired + private UserRepository userRes; + + @Autowired + private Cache cache; + + @Value("${application.node.id}") + private String appNodeId; + + @PostConstruct + public void setup() { + logger.info("ActiveMQ Subscription is setup successfully."); + } + + @JmsListener(destination = Constants.WEBIM_SOCKETIO_AGENT_DISCONNECT, containerFactory = "jmsListenerContainerQueue") + public void onMessage(final String payload) { + logger.info("[onMessage] payload {}", payload); + + try { + JsonParser parser = new JsonParser(); + JsonObject j = parser.parse(payload).getAsJsonObject(); + if (j.has("userId") && j.has("orgi") && j.has("isAdmin")) { + final AgentStatus agentStatus = cache.findOneAgentStatusByAgentnoAndOrig(j.get("userId").getAsString(), + j.get("orgi").getAsString()); + if (agentStatus != null && (!agentStatus.isConnected())) { + /** + * 处理该坐席为离线 + */ + // 重分配坐席 + if (AutomaticServiceDist.withdrawAgent(agentStatus.getOrgi(), agentStatus.getAgentno())) { + logger.info("[onMessage] re-allotAgent for user's visitors successfully."); + } else { + logger.info("[onMessage] re-allotAgent, error happens."); + } + + // 更新数据库 + agentStatus.setBusy(false); + agentStatus.setStatus(MainContext.AgentStatusEnum.OFFLINE.toString()); + agentStatus.setUpdatetime(new Date()); + + // 设置该坐席状态为离线 + cache.deleteAgentStatusByAgentnoAndOrgi(agentStatus.getAgentno(), agentStatus.getOrgi()); + agentStatusRes.save(agentStatus); + + // 记录坐席工作日志 + AutomaticServiceDist.recordAgentStatus(agentStatus.getAgentno(), + agentStatus.getUsername(), + agentStatus.getAgentno(), + j.get("isAdmin").getAsBoolean(), + agentStatus.getAgentno(), + agentStatus.getStatus(), + MainContext.AgentStatusEnum.OFFLINE.toString(), + MainContext.AgentWorkType.MEIDIACHAT.toString(), + agentStatus.getOrgi(), null); + } else if (agentStatus == null) { + // 该坐席已经完成离线设置 + logger.info("[onMessage] agent is already offline, skip any further operations"); + } else { + // 该坐席目前在线,忽略该延迟事件 + logger.info("[onMessage] agent is online now, ignore this message."); + } + } + } catch (Exception e) { + logger.error("onMessage", e); + } + } +} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/activemq/OnlineUserSubscription.java b/contact-center/app/src/main/java/com/chatopera/cc/activemq/OnlineUserSubscription.java new file mode 100644 index 00000000..31556fde --- /dev/null +++ b/contact-center/app/src/main/java/com/chatopera/cc/activemq/OnlineUserSubscription.java @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2019 Chatopera Inc, All rights reserved. + * + * This software and related documentation are provided under a license agreement containing + * restrictions on use and disclosure and are protected by intellectual property laws. + * Except as expressly permitted in your license agreement or allowed by law, you may not use, + * copy, reproduce, translate, broadcast, modify, license, transmit, distribute, exhibit, perform, + * publish, or display any part, in any form, or by any means. Reverse engineering, disassembly, + * or decompilation of this software, unless required by law for interoperability, is prohibited. + */ +package com.chatopera.cc.activemq; + +import com.chatopera.cc.socketio.client.NettyClients; +import com.chatopera.cc.basic.Constants; +import com.chatopera.cc.util.SerializeUtil; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.jms.annotation.JmsListener; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; + +/** + * IM OnlineUser + */ +@Component +public class OnlineUserSubscription { + + private final static Logger logger = LoggerFactory.getLogger(OnlineUserSubscription.class); + + @Value("${application.node.id}") + private String appNodeId; + + + @Autowired + private BrokerPublisher brokerPublisher; + + @PostConstruct + public void setup() { + logger.info("ActiveMQ Subscription is setup successfully."); + } + + /** + * Publish Message into ActiveMQ + * + * @param j + */ + public void publish(final JsonObject j) { + j.addProperty("node", appNodeId); + brokerPublisher.send(Constants.INSTANT_MESSAGING_MQ_TOPIC_ONLINEUSER, j.toString(), true); + + } + + @JmsListener(destination = Constants.INSTANT_MESSAGING_MQ_TOPIC_ONLINEUSER, containerFactory = "jmsListenerContainerTopic") + public void onMessage(final String payload){ + logger.info("[onMessage] payload {}", payload); + JsonParser parser = new JsonParser(); + JsonObject j = parser.parse(payload).getAsJsonObject(); + logger.debug("[instant messaging] message body {}", j.toString()); + try { + NettyClients.getInstance().publishIMEventMessage(j.get("id").getAsString(), + j.get("event").getAsString(), + SerializeUtil.deserialize(j.get("data").getAsString())); + } catch (Exception e) { + logger.error("onMessage", e); + } + } +} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/activemq/PbxEventSubscription.java b/contact-center/app/src/main/java/com/chatopera/cc/activemq/PbxEventSubscription.java new file mode 100644 index 00000000..37fe4e1c --- /dev/null +++ b/contact-center/app/src/main/java/com/chatopera/cc/activemq/PbxEventSubscription.java @@ -0,0 +1,107 @@ +/* + * Copyright (C) 2019 Chatopera Inc, All rights reserved. + * + * This software and related documentation are provided under a license agreement containing + * restrictions on use and disclosure and are protected by intellectual property laws. + * Except as expressly permitted in your license agreement or allowed by law, you may not use, + * copy, reproduce, translate, broadcast, modify, license, transmit, distribute, exhibit, perform, + * publish, or display any part, in any form, or by any means. Reverse engineering, disassembly, + * or decompilation of this software, unless required by law for interoperability, is prohibited. + */ +package com.chatopera.cc.activemq; + +import com.chatopera.cc.config.conditions.CalloutBeanCondition; +import com.chatopera.cc.persistence.interfaces.CalloutWireEvent; +import com.chatopera.cc.schedule.CalloutWireTask; +import com.chatopera.cc.basic.Constants; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Conditional; +import org.springframework.jms.annotation.JmsListener; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; + +/** + * FreeSWITCH + */ +@Component +@Conditional(CalloutBeanCondition.class) +public class PbxEventSubscription { + + private final static Logger logger = LoggerFactory.getLogger(PbxEventSubscription.class); + + @PostConstruct + public void setup() { + logger.info("ActiveMQ Subscription is setup successfully."); + } + + @Autowired + private BrokerPublisher brokerPublisher; + + @Autowired + private CalloutWireTask callOutWireTask; + + public void publish(final String dest, final String payload) { + brokerPublisher.send(dest, payload); + } + + @JmsListener(destination = Constants.INSTANT_MESSAGING_MQ_QUEUE_PBX, containerFactory = "jmsListenerContainerQueue") + public void onMessage(final String payload) { + logger.info("[onMessage] payload {}", payload); + JsonParser parser = new JsonParser(); + JsonObject j = parser.parse(payload).getAsJsonObject(); + // validate message + if (!(j.has("type") + && j.has("to") + && j.has("ops") + && j.has("channel") + && j.has("createtime"))) { + logger.error(String.format("[callout wire] 接线数据格式不对, %s", payload)); + } else { + try { + CalloutWireEvent event = CalloutWireEvent.parse(j); + switch (event.getEventType()) { + case 1: // 自动外呼接通 + logger.info("[callout wire] 自动外呼接通 {}", j.toString()); + callOutWireTask.callOutConnect(event); + break; + case 2: // 自动外呼挂断 + logger.info("[callout wire] 自动外呼挂断 {}", j.toString()); + callOutWireTask.callOutDisconnect(event); + break; + case 3: // 自动外呼失败 + logger.info("[callout wire] 自动外呼失败 {}", j.toString()); + callOutWireTask.callOutFail(event); + break; + case 4: // 手动外呼接通 + logger.info("[callout wire] 手动外呼接通 {}", j.toString()); + callOutWireTask.callOutConnect(event); + break; + case 5: // 手动外呼挂断 + logger.info("[callout wire] 手动外呼挂断 {}", j.toString()); + callOutWireTask.callOutDisconnect(event); + break; + case 6: // 手动外呼失败 + logger.info("[callout wire] 手动外呼失败 {}", j.toString()); + callOutWireTask.callOutFail(event); + break; + case 7: // 呼入接通 + logger.info("[callin wire] 呼入接通 {}", j.toString()); + break; + case 8: // 呼入挂断 + logger.info("[callin wire] 呼入挂断 {}", j.toString()); + break; + case 9: // 呼入失败 + logger.info("[callin wire] 呼入失败 {}", j.toString()); + break; + } + } catch (Exception e) { + logger.error("[callout wire] ", e); + } + } + } +} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/aggregation/filter/AgentCallOutFilter.java b/contact-center/app/src/main/java/com/chatopera/cc/aggregation/filter/AgentCallOutFilter.java deleted file mode 100644 index 1ca4dc45..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/aggregation/filter/AgentCallOutFilter.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.aggregation.filter; - -import com.chatopera.cc.app.cache.CacheHelper; -import org.apache.commons.lang.StringUtils; - -import com.hazelcast.mapreduce.KeyPredicate; -import com.chatopera.cc.app.basic.MainContext; -import com.chatopera.cc.app.model.UKefuCallOutNames; - -@SuppressWarnings("deprecation") -public class AgentCallOutFilter implements KeyPredicate{ - /** - * - */ - private static final long serialVersionUID = 1236581634096258855L; - private String orgi ; - /** - * - */ - public AgentCallOutFilter(String orgi){ - this.orgi = orgi ; - } - public boolean evaluate(String key) { - UKefuCallOutNames ukefuCallOutNames = (UKefuCallOutNames) CacheHelper.getCallOutCacheBean().getCacheObject(key, orgi); - return ukefuCallOutNames !=null && !StringUtils.isBlank(orgi) && orgi.equals(ukefuCallOutNames.getOrgi()) && MainContext.CallOutType.AGENT.toString().equals(ukefuCallOutNames.getCalltype()); - } -} \ No newline at end of file diff --git a/contact-center/app/src/main/java/com/chatopera/cc/aggregation/filter/AgentStatusBusyOrgiFilter.java b/contact-center/app/src/main/java/com/chatopera/cc/aggregation/filter/AgentStatusBusyOrgiFilter.java deleted file mode 100644 index 367c28b3..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/aggregation/filter/AgentStatusBusyOrgiFilter.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.aggregation.filter; - -import com.chatopera.cc.app.cache.CacheHelper; -import com.chatopera.cc.app.model.AgentStatus; -import org.apache.commons.lang.StringUtils; - -import com.hazelcast.mapreduce.KeyPredicate; - -@SuppressWarnings("deprecation") -public class AgentStatusBusyOrgiFilter implements KeyPredicate{ - /** - * - */ - private static final long serialVersionUID = 1236581634096258855L; - private String orgi ; - /** - * - */ - public AgentStatusBusyOrgiFilter(String orgi){ - this.orgi = orgi ; - } - public boolean evaluate(String key) { - AgentStatus agent = (AgentStatus) CacheHelper.getAgentStatusCacheBean().getCacheObject(key, orgi); - return agent!=null && !StringUtils.isBlank(orgi) && orgi.equals(agent.getOrgi()) && agent.isBusy(); - } -} \ No newline at end of file diff --git a/contact-center/app/src/main/java/com/chatopera/cc/aggregation/filter/AgentStatusOrgiFilter.java b/contact-center/app/src/main/java/com/chatopera/cc/aggregation/filter/AgentStatusOrgiFilter.java deleted file mode 100644 index 8e638cf9..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/aggregation/filter/AgentStatusOrgiFilter.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.aggregation.filter; - -import com.chatopera.cc.app.cache.CacheHelper; -import com.chatopera.cc.app.model.AgentStatus; -import org.apache.commons.lang.StringUtils; - -import com.hazelcast.mapreduce.KeyPredicate; - -@SuppressWarnings("deprecation") -public class AgentStatusOrgiFilter implements KeyPredicate{ - /** - * - */ - private static final long serialVersionUID = 1236581634096258855L; - private String orgi ; - /** - * - */ - public AgentStatusOrgiFilter(String orgi){ - this.orgi = orgi ; - } - public boolean evaluate(String key) { - AgentStatus agent = (AgentStatus) CacheHelper.getAgentStatusCacheBean().getCacheObject(key, orgi); - return agent!=null && !StringUtils.isBlank(orgi) && orgi.equals(agent.getOrgi()); - } -} \ No newline at end of file diff --git a/contact-center/app/src/main/java/com/chatopera/cc/aggregation/filter/AgentUserOrgiFilter.java b/contact-center/app/src/main/java/com/chatopera/cc/aggregation/filter/AgentUserOrgiFilter.java deleted file mode 100644 index e225acea..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/aggregation/filter/AgentUserOrgiFilter.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.aggregation.filter; - -import com.chatopera.cc.app.cache.CacheHelper; -import com.chatopera.cc.app.model.AgentUser; -import org.apache.commons.lang.StringUtils; - -import com.hazelcast.mapreduce.KeyPredicate; - -@SuppressWarnings("deprecation") -public class AgentUserOrgiFilter implements KeyPredicate{ - /** - * - */ - private static final long serialVersionUID = 1236581634096258855L; - private String orgi ; - private String status ; - /** - * - */ - public AgentUserOrgiFilter(String orgi , String status){ - this.orgi = orgi ; - this.status = status ; - } - public boolean evaluate(String key) { - AgentUser user = (AgentUser) CacheHelper - .getAgentUserCacheBean().getCacheObject(key , orgi); - return user!=null && user.getStatus()!=null && !StringUtils.isBlank(orgi) && orgi.equals(user.getOrgi()) && user.getStatus()!=null && user.getStatus().equals(status); - } -} \ No newline at end of file diff --git a/contact-center/app/src/main/java/com/chatopera/cc/aggregation/filter/AiCallOutFilter.java b/contact-center/app/src/main/java/com/chatopera/cc/aggregation/filter/AiCallOutFilter.java deleted file mode 100644 index f743d3c8..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/aggregation/filter/AiCallOutFilter.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.aggregation.filter; - -import com.chatopera.cc.app.basic.MainContext; -import com.chatopera.cc.app.cache.CacheHelper; -import com.chatopera.cc.app.model.UKefuCallOutNames; -import org.apache.commons.lang.StringUtils; - -import com.hazelcast.mapreduce.KeyPredicate; - -@SuppressWarnings("deprecation") -public class AiCallOutFilter implements KeyPredicate{ - /** - * - */ - private static final long serialVersionUID = 1236581634096258855L; - private String orgi ; - /** - * - */ - public AiCallOutFilter(String orgi){ - this.orgi = orgi ; - } - public boolean evaluate(String key) { - UKefuCallOutNames ukefuCallOutNames = (UKefuCallOutNames) CacheHelper.getCallOutCacheBean().getCacheObject(key, orgi); - return ukefuCallOutNames !=null && !StringUtils.isBlank(orgi) && orgi.equals(ukefuCallOutNames.getOrgi()) && MainContext.CallOutType.AI.toString().equals(ukefuCallOutNames.getCalltype()); - } -} \ No newline at end of file diff --git a/contact-center/app/src/main/java/com/chatopera/cc/aop/AgentUserAspect.java b/contact-center/app/src/main/java/com/chatopera/cc/aop/AgentUserAspect.java new file mode 100644 index 00000000..321ec91c --- /dev/null +++ b/contact-center/app/src/main/java/com/chatopera/cc/aop/AgentUserAspect.java @@ -0,0 +1,136 @@ +/* + * Copyright (C) 2019 Chatopera Inc, + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.chatopera.cc.aop; + +import com.chatopera.cc.basic.MainContext; +import com.chatopera.cc.cache.Cache; +import com.chatopera.cc.cache.RedisCommand; +import com.chatopera.cc.cache.RedisKey; +import com.chatopera.cc.exception.CSKefuCacheException; +import com.chatopera.cc.model.AgentUser; +import com.chatopera.cc.model.AgentUserAudit; +import com.chatopera.cc.proxy.AgentAuditProxy; +import com.chatopera.cc.proxy.AgentUserProxy; +import org.apache.commons.lang.StringUtils; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.After; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import java.util.HashMap; +import java.util.Optional; + +@Aspect +@Component +public class AgentUserAspect { + + private final static Logger logger = LoggerFactory.getLogger(AgentUserAspect.class); + + @Autowired + private Cache cache; + + @Autowired + private RedisCommand redisCommand; + + @Autowired + private AgentAuditProxy agentAuditProxy; + + @Before("execution(* com.chatopera.cc.persistence.repository.AgentUserRepository.save(..))") + public void save(final JoinPoint joinPoint) { + final AgentUser agentUser = (AgentUser) joinPoint.getArgs()[0]; + logger.info( + "[save] agentUser id {}, agentno {}, userId {}", agentUser.getId(), agentUser.getAgentno(), + agentUser.getUserid()); + + if (StringUtils.isBlank(agentUser.getId()) + || StringUtils.isBlank(agentUser.getUserid()) + || StringUtils.isBlank(agentUser.getAgentno())) { + return; + } + + // 从缓存恢复之前的AgentUser + final Optional opt = cache.findOneAgentUserByUserIdAndOrgi( + agentUser.getUserid(), agentUser.getOrgi()); + if (opt.isPresent()) { + if (!StringUtils.equals(opt.get().getAgentno(), agentUser.getAgentno())) { + // 发生了转接 + agentAuditProxy.updateAgentUserAudits(agentUser); + } + } else { + // 新建AgentUser + agentAuditProxy.updateAgentUserAudits(agentUser); + } + + // 同步缓存 + cache.putAgentUserByOrgi(agentUser, agentUser.getOrgi()); + } + + @After("execution(* com.chatopera.cc.persistence.repository.AgentUserRepository.delete(..))") + public void delete(final JoinPoint joinPoint) { + final AgentUser agentUser = (AgentUser) joinPoint.getArgs()[0]; + logger.info( + "[delete] agentUser id {}, agentno {}, userId {}", agentUser.getId(), agentUser.getAgentno(), + agentUser.getUserid()); + cache.deleteAgentUserAuditByOrgiAndId(agentUser.getOrgi(), agentUser.getId()); + cache.deleteAgentUserByUserIdAndOrgi(agentUser.getUserid(), agentUser.getOrgi()); + } + + /** + * 更新内存中的坐席与其服务的访客的集合 + * + * @param joinPoint + * @return + * @throws Throwable + */ + @Around("@annotation(AgentUserAspect.LinkAgentUser)") + public Object LinkAgentUser(ProceedingJoinPoint joinPoint) throws Throwable { + final AgentUser updated = (AgentUser) joinPoint.getArgs()[0]; + final String orgi = (String) joinPoint.getArgs()[1]; + Object proceed = joinPoint.proceed(); // after things are done. + logger.info( + "[linkAgentUser] agentUser: status {}, userId {}, agentno {}, orgi {}", updated.getStatus(), + updated.getUserid(), updated.getAgentno(), orgi); + if (StringUtils.equals(updated.getStatus(), MainContext.AgentUserStatusEnum.END.toString())) { + // 从集合中删除 + redisCommand.removeSetVal( + RedisKey.getInServAgentUsersByAgentnoAndOrgi(updated.getAgentno(), orgi), updated.getUserid()); + } else if (StringUtils.equals(updated.getStatus(), MainContext.AgentUserStatusEnum.INSERVICE.toString())) { + redisCommand.insertSetVal( + RedisKey.getInServAgentUsersByAgentnoAndOrgi(updated.getAgentno(), orgi), updated.getUserid()); + } else if (StringUtils.equals(updated.getStatus(), MainContext.AgentUserStatusEnum.INQUENE.toString())) { + logger.info("[linkAgentUser] ignored inque agent user, haven't resolve one agent yet."); + } else { + logger.warn("[linkAgentUser] unexpected condition."); + } + return proceed; + } + + @Target(ElementType.METHOD) + @Retention(RetentionPolicy.RUNTIME) + public @interface LinkAgentUser { + } +} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/aop/BlackEntityAspect.java b/contact-center/app/src/main/java/com/chatopera/cc/aop/BlackEntityAspect.java new file mode 100644 index 00000000..c4d07a8a --- /dev/null +++ b/contact-center/app/src/main/java/com/chatopera/cc/aop/BlackEntityAspect.java @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2019 Chatopera Inc, + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.chatopera.cc.aop; + +import com.chatopera.cc.cache.Cache; +import com.chatopera.cc.model.BlackEntity; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.After; +import org.aspectj.lang.annotation.Aspect; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + + +@Aspect +@Component +public class BlackEntityAspect { + + private final static Logger logger = LoggerFactory.getLogger(BlackEntityAspect.class); + + @Autowired + private Cache cache; + + @After("execution(* com.chatopera.cc.persistence.repository.BlackListRepository.save(..))") + public void save(final JoinPoint joinPoint) { + final BlackEntity blackEntity = (BlackEntity) joinPoint.getArgs()[0]; + logger.info("[save] blackEntity userId {}, orgi {}", blackEntity.getUserid(), blackEntity.getOrgi()); + cache.putBlackEntityByOrgi(blackEntity, blackEntity.getOrgi()); + } + + @After("execution(* com.chatopera.cc.persistence.repository.BlackListRepository.delete(..))") + public void delete(final JoinPoint joinPoint) { + final BlackEntity blackEntity = (BlackEntity) joinPoint.getArgs()[0]; + logger.info("[delete] blackEntity userId {}, orgi {}", blackEntity.getUserid(), blackEntity.getOrgi()); + cache.deleteBlackEntityByUserIdAndOrgi(blackEntity.getUserid(), blackEntity.getOrgi()); + } +} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/aop/OnlineUserAspect.java b/contact-center/app/src/main/java/com/chatopera/cc/aop/OnlineUserAspect.java new file mode 100644 index 00000000..3d21deac --- /dev/null +++ b/contact-center/app/src/main/java/com/chatopera/cc/aop/OnlineUserAspect.java @@ -0,0 +1,46 @@ +package com.chatopera.cc.aop; + +import com.chatopera.cc.basic.MainContext; +import com.chatopera.cc.cache.Cache; +import com.chatopera.cc.model.OnlineUser; +import org.apache.commons.lang.StringUtils; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.After; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Aspect +@Component +public class OnlineUserAspect { + private final static Logger logger = LoggerFactory.getLogger(OnlineUserAspect.class); + + @Autowired + private Cache cache; + + /** + * 因为会定期从缓存序列化到数据库 + * + * @param joinPoint + */ + @Before("execution(* com.chatopera.cc.persistence.repository.OnlineUserRepository.save(..))") + public void save(final JoinPoint joinPoint) { + final OnlineUser onlineUser = (OnlineUser) joinPoint.getArgs()[0]; + logger.info( + "[save] put onlineUser id {}, status {}, invite status {}", onlineUser.getId(), onlineUser.getStatus(), + onlineUser.getInvitestatus()); + if (StringUtils.isNotBlank(onlineUser.getStatus())) { + switch (MainContext.OnlineUserStatusEnum.toValue(onlineUser.getStatus())) { + case OFFLINE: + cache.deleteOnlineUserByIdAndOrgi(onlineUser.getId(), onlineUser.getOrgi()); + break; + default: + cache.putOnlineUserByOrgi(onlineUser, onlineUser.getOrgi()); + } + } + } + +} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/aop/SyncDatabaseAspect.java b/contact-center/app/src/main/java/com/chatopera/cc/aop/SyncDatabaseAspect.java new file mode 100644 index 00000000..9c924910 --- /dev/null +++ b/contact-center/app/src/main/java/com/chatopera/cc/aop/SyncDatabaseAspect.java @@ -0,0 +1,100 @@ +/* + * Copyright (C) 2017 优客服-多渠道客服系统 + * Modifications copyright (C) 2018 Chatopera Inc, + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.chatopera.cc.aop; + +import com.chatopera.cc.model.ESBean; +import com.chatopera.cc.persistence.hibernate.BaseService; +import com.chatopera.cc.util.CskefuList; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.hibernate.StaleStateException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Aspect +@Component +public class SyncDatabaseAspect { + private final static Logger logger = LoggerFactory.getLogger(SyncDatabaseAspect.class); + + @Autowired + private BaseService dbDataRes; + + /** + * 定义拦截规则:拦截org.springframework.data.elasticsearch.repository。 + */ + @Pointcut("execution(* org.springframework.data.elasticsearch.repository.*.save(*))") + public void syncSaveEsData() { + } + + /** + * 定义拦截规则:拦截org.springframework.data.elasticsearch.repository。 + */ + @Pointcut("execution(* org.springframework.data.elasticsearch.repository.*.delete(*))") + public void syncDeleteEsData() { + } + + @SuppressWarnings("unchecked") + @Around("syncSaveEsData()") + public void syncSaveEsData(ProceedingJoinPoint pjp) throws Throwable { + pjp.proceed(); + Object[] args = pjp.getArgs(); + if (args.length == 1) { + Object data = args[0]; + if (data != null) { + if (data instanceof CskefuList) { + /** 只有一个地方用到,从ES同步数据到MySQL **/ + } else if (data instanceof List) { + // TODO 批量建联系人操作会执行这段代码,此处会报错,但是批量更新可以通过 + dbDataRes.saveOrUpdateAll((List) data); + } else { + try { + // 更新时,执行此代码,但是新建时会报错 + dbDataRes.saveOrUpdate(data); + } catch (StaleStateException ex) { + // 报错的情况下,执行此代码 + dbDataRes.save(data); + } + } + } + } + } + + @SuppressWarnings("unchecked") + @Around("syncDeleteEsData()") + public void syncDeleteEsData(ProceedingJoinPoint pjp) throws Throwable { + pjp.proceed(); + Object[] args = pjp.getArgs(); + if (args.length == 1) { + Object data = args[0]; + if (data instanceof List) { + dbDataRes.deleteAll((List) data); + } else { + if (data instanceof ESBean) { + dbDataRes.delete(data); + } else { + dbDataRes.delete(data); + } + } + } + } +} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/algorithm/AutomaticServiceDist.java b/contact-center/app/src/main/java/com/chatopera/cc/app/algorithm/AutomaticServiceDist.java deleted file mode 100644 index dc40f81e..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/algorithm/AutomaticServiceDist.java +++ /dev/null @@ -1,837 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.algorithm; - -import com.chatopera.cc.aggregation.filter.AgentStatusBusyOrgiFilter; -import com.chatopera.cc.aggregation.filter.AgentStatusOrgiFilter; -import com.chatopera.cc.aggregation.filter.AgentUserOrgiFilter; -import com.chatopera.cc.app.basic.MainContext; -import com.chatopera.cc.app.basic.MainUtils; -import com.chatopera.cc.app.cache.CacheHelper; -import com.chatopera.cc.app.im.client.NettyClients; -import com.chatopera.cc.app.im.router.OutMessageRouter; -import com.chatopera.cc.app.model.*; -import com.chatopera.cc.app.persistence.repository.*; -import com.chatopera.cc.util.WebIMReport; -import com.corundumstudio.socketio.SocketIONamespace; -import com.hazelcast.core.IMap; -import com.hazelcast.mapreduce.aggregation.Aggregations; -import com.hazelcast.mapreduce.aggregation.Supplier; -import com.hazelcast.query.PagingPredicate; -import com.hazelcast.query.SqlPredicate; -import org.apache.commons.lang.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.concurrent.locks.Lock; - -/** - * Automatic Call Distribution - */ -@SuppressWarnings("deprecation") -public class AutomaticServiceDist { - private final static Logger logger = LoggerFactory.getLogger(AutomaticServiceDist.class); - - /** - * 载入坐席 ACD策略配置 - * - * @param orgi - * @return - */ - public static SessionConfig initSessionConfig(String orgi) { - SessionConfig sessionConfig = null; - if (MainContext.getContext() != null && (sessionConfig = (SessionConfig) CacheHelper.getSystemCacheBean().getCacheObject(MainContext.SYSTEM_CACHE_SESSION_CONFIG + "_" + orgi, orgi)) == null) { - SessionConfigRepository sessionConfigRes = MainContext.getContext().getBean(SessionConfigRepository.class); - sessionConfig = sessionConfigRes.findByOrgi(orgi); - if (sessionConfig == null) { - sessionConfig = new SessionConfig(); - } else { - CacheHelper.getSystemCacheBean().put(MainContext.SYSTEM_CACHE_SESSION_CONFIG + "_" + orgi, sessionConfig, orgi); - } - } - return sessionConfig; - } - - /** - * 载入坐席 ACD策略配置 - * - * @return - */ - @SuppressWarnings("unchecked") - public static List initSessionConfigList() { - List sessionConfigList = null; - if (MainContext.getContext() != null && (sessionConfigList = (List) CacheHelper.getSystemCacheBean().getCacheObject(MainContext.SYSTEM_CACHE_SESSION_CONFIG_LIST, MainContext.SYSTEM_ORGI)) == null) { - SessionConfigRepository sessionConfigRes = MainContext.getContext().getBean(SessionConfigRepository.class); - sessionConfigList = sessionConfigRes.findAll(); - if (sessionConfigList != null && sessionConfigList.size() > 0) { - CacheHelper.getSystemCacheBean().put(MainContext.SYSTEM_CACHE_SESSION_CONFIG_LIST, sessionConfigList, MainContext.SYSTEM_ORGI); - } - } - return sessionConfigList; - } - - /** - * 获得 当前服务状态 - * - * @param orgi - * @return - */ - @SuppressWarnings({"unchecked", "rawtypes"}) - public static AgentReport getAgentReport(String orgi) { - /** - * 统计当前在线的坐席数量 - */ - AgentReport report = new AgentReport(); - IMap agentStatusMap = (IMap) CacheHelper.getAgentStatusCacheBean().getCache(); - AgentStatusOrgiFilter filter = new AgentStatusOrgiFilter(orgi); - Long agents = (Long) agentStatusMap.aggregate(Supplier.fromKeyPredicate(filter), Aggregations.count()); - report.setAgents(agents.intValue()); - - Long busyAgent = (Long) agentStatusMap.aggregate(Supplier.fromKeyPredicate(new AgentStatusBusyOrgiFilter(orgi)), Aggregations.count()); - report.setBusy(busyAgent.intValue()); - report.setOrgi(orgi); - - /** - * 统计当前服务中的用户数量 - */ - IMap agentUserMap = (IMap) CacheHelper.getAgentUserCacheBean().getCache(); - Long users = (Long) agentUserMap.aggregate(Supplier.fromKeyPredicate(new AgentUserOrgiFilter(orgi, MainContext.AgentUserStatusEnum.INSERVICE.toString())), Aggregations.count()); - report.setUsers(users.intValue()); - - Long queneUsers = (Long) agentUserMap.aggregate(Supplier.fromKeyPredicate(new AgentUserOrgiFilter(orgi, MainContext.AgentUserStatusEnum.INQUENE.toString())), Aggregations.count()); - report.setInquene(queneUsers.intValue()); - - return report; - } - - public static int getQueneIndex(String userid, String orgi, long ordertime) { - -// IList queneUserList = (IList) CacheHelper.getQueneUserCacheBean().getCache() ; - int queneUsers = 0; -// for(AgentUser agentUser : queneUserList){ -// if(agentUser.getOrgi().equals(orgi) && agentUser.getUserid().equals(userid)){ -// queneUsers ++ ; -// } -// } - - return queneUsers; - } - - @SuppressWarnings("unchecked") - public static int getQueneIndex(String agent, String orgi, String skill) { - - int queneUsers = 0; - - PagingPredicate pagingPredicate = null; - if (StringUtils.isNotBlank(skill)) { - pagingPredicate = new PagingPredicate(new SqlPredicate("status = 'inquene' AND skill = '" + skill + "' AND orgi = '" + orgi + "'"), 100); - } else if (StringUtils.isNotBlank(agent)) { - pagingPredicate = new PagingPredicate(new SqlPredicate("status = 'inquene' AND agent = '" + agent + "' AND orgi = '" + orgi + "'"), 100); - } else { - pagingPredicate = new PagingPredicate(new SqlPredicate("status = 'inquene' AND orgi = '" + orgi + "'"), 100); - } - queneUsers = ((IMap) CacheHelper.getAgentUserCacheBean().getCache()).values(pagingPredicate).size(); - return queneUsers; - } - - @SuppressWarnings("unchecked") - public static int getAgentUsers(String agent, String orgi) { - /** - * agentno自动是 服务的坐席, agent 是请求的坐席 - */ - PagingPredicate pagingPredicate = new PagingPredicate(new SqlPredicate("status = 'inservice' AND agentno = '" + agent + "' AND orgi = '" + orgi + "'"), 100); - List agentUserList = new ArrayList(); - agentUserList.addAll(((IMap) CacheHelper.getAgentUserCacheBean().getCache()).values(pagingPredicate)); - return agentUserList.size(); - } - - - @SuppressWarnings("unchecked") - public static List getAgentStatus(String skill, String orgi) { - PagingPredicate pagingPredicate = new PagingPredicate(new SqlPredicate("orgi = '" + orgi + "'"), 100); - - if (StringUtils.isNotBlank(skill)) { - pagingPredicate = new PagingPredicate(new SqlPredicate("skill = '" + skill + "' AND orgi = '" + orgi + "'"), 100); - } - List agentList = new ArrayList(); - agentList.addAll(((IMap) CacheHelper.getAgentStatusCacheBean().getCache()).values(pagingPredicate)); - return agentList; - } - - /** - * 为坐席批量分配用户 - * - * @param agentStatus - */ - @SuppressWarnings("unchecked") - public static void allotAgent(String agentno, String orgi) { - AgentStatus agentStatus = (AgentStatus) CacheHelper.getAgentStatusCacheBean().getCacheObject(agentno, orgi); - List agentStatusList = new ArrayList(); - PagingPredicate pagingPredicate = null; - if (agentStatus != null && StringUtils.isNotBlank(agentStatus.getSkill())) { - pagingPredicate = new PagingPredicate(new SqlPredicate("status = 'inquene' AND ((agent = null AND skill = null) OR (skill = '" + agentStatus.getSkill() + "' AND agent = null) OR agent = '" + agentno + "') AND orgi = '" + orgi + "'"), 10); - } else { - pagingPredicate = new PagingPredicate(new SqlPredicate("status = 'inquene' AND ((agent = null AND skill = null) OR agent = '" + agentno + "') AND orgi = '" + orgi + "'"), 10); - } - agentStatusList.addAll(((IMap) CacheHelper.getAgentUserCacheBean().getCache()).values(pagingPredicate)); - for (AgentUser agentUser : agentStatusList) { - SessionConfig sessionConfig = AutomaticServiceDist.initSessionConfig(orgi); - long maxusers = sessionConfig != null ? sessionConfig.getMaxuser() : MainContext.AGENT_STATUS_MAX_USER; - if (agentStatus != null && agentStatus.getUsers() < maxusers) { //坐席未达到最大咨询访客数量 - CacheHelper.getAgentUserCacheBean().delete(agentUser.getUserid(), orgi); //从队列移除,进入正在处理的队列, 避免使用 分布式锁 - try { - AgentService agentService = processAgentService(agentStatus, agentUser, orgi); - - MessageOutContent outMessage = new MessageOutContent(); - outMessage.setMessage(AutomaticServiceDist.getSuccessMessage(agentService, agentUser.getChannel(), orgi)); - outMessage.setMessageType(MainContext.MediaTypeEnum.TEXT.toString()); - outMessage.setCalltype(MainContext.CallTypeEnum.IN.toString()); - outMessage.setNickName(agentStatus.getUsername()); - outMessage.setCreatetime(MainUtils.dateFormate.format(new Date())); - - if (StringUtils.isNotBlank(agentUser.getUserid())) { - OutMessageRouter router = null; - router = (OutMessageRouter) MainContext.getContext().getBean(agentUser.getChannel()); - if (router != null) { - router.handler(agentUser.getUserid(), MainContext.MessageTypeEnum.MESSAGE.toString(), agentUser.getAppid(), outMessage); - } - } - // TODO #111 为坐席分配访客 - NettyClients.getInstance().publishAgentEventMessage(agentService.getAgentno(), MainContext.MessageTypeEnum.NEW.toString(), agentUser); - } catch (Exception ex) { - ex.printStackTrace(); - } - } else { - break; - } - } - publishMessage(orgi, "agent", "success", agentno); - } - - /** - * 为坐席批量分配用户 - * - * @param agentStatus - * @throws Exception - */ - public static void serviceFinish(AgentUser agentUser, String orgi) throws Exception { - if (agentUser != null) { - AgentStatus agentStatus = null; - if (MainContext.AgentUserStatusEnum.INSERVICE.toString().equals(agentUser.getStatus()) && agentUser.getAgentno() != null) { - agentStatus = (AgentStatus) CacheHelper.getAgentStatusCacheBean().getCacheObject(agentUser.getAgentno(), orgi); - } - CacheHelper.getAgentUserCacheBean().delete(agentUser.getUserid(), orgi); - - AgentUserRepository agentUserRepository = MainContext.getContext().getBean(AgentUserRepository.class); - - AgentUser agentUseDataBean = agentUserRepository.findByIdAndOrgi(agentUser.getId(), agentUser.getOrgi()); - SessionConfig sessionConfig = AutomaticServiceDist.initSessionConfig(orgi); - if (agentUseDataBean != null) { - agentUseDataBean.setStatus(MainContext.AgentUserStatusEnum.END.toString()); - if (agentUser.getServicetime() != null) { - agentUseDataBean.setSessiontimes(System.currentTimeMillis() - agentUser.getServicetime().getTime()); - } - - agentUserRepository.save(agentUseDataBean); - - /** - * 更新OnlineUser对象,变更为服务中,不可邀请 , WebIM渠道专用 - */ - if (MainContext.ChannelTypeEnum.WEBIM.toString().equals(agentUser.getChannel())) { - OnlineUserRepository onlineUserRes = MainContext.getContext().getBean(OnlineUserRepository.class); - List onlineUserList = onlineUserRes.findByUseridAndOrgi(agentUser.getUserid(), agentUser.getOrgi()); - if (onlineUserList.size() > 0) { - OnlineUser onlineUser = onlineUserList.get(0); - onlineUser.setInvitestatus(MainContext.OnlineUserInviteStatus.DEFAULT.toString()); - onlineUserRes.save(onlineUser); - } - } - } - - final boolean isPhone = MainContext.ChannelTypeEnum.PHONE.toString().equals(agentUser.getChannel()); - AgentServiceRepository agentServiceRes = MainContext.getContext().getBean(AgentServiceRepository.class); - AgentService service = null; - if (StringUtils.isNotBlank(agentUser.getAgentserviceid())) { - service = agentServiceRes.findByIdAndOrgi(agentUser.getAgentserviceid(), agentUser.getOrgi()); - } - if (service == null) {//当做留言处理 - service = processAgentService(agentStatus, agentUser, orgi, true); - } - if (service != null) { - service.setStatus(MainContext.AgentUserStatusEnum.END.toString()); - service.setEndtime(new Date()); - if (service.getServicetime() != null) { - service.setSessiontimes(System.currentTimeMillis() - service.getServicetime().getTime()); - } - - AgentUserTaskRepository agentUserTaskRes = MainContext.getContext().getBean(AgentUserTaskRepository.class); - List agentUserTaskList = agentUserTaskRes.findByIdAndOrgi(agentUser.getId(), agentUser.getOrgi()); - if (agentUserTaskList.size() > 0) { - AgentUserTask agentUserTask = agentUserTaskList.get(0); - service.setAgentreplyinterval(agentUserTask.getAgentreplyinterval()); - service.setAgentreplytime(agentUserTask.getAgentreplytime()); - service.setAvgreplyinterval(agentUserTask.getAvgreplyinterval()); - service.setAvgreplytime(agentUserTask.getAvgreplytime()); - - service.setUserasks(agentUserTask.getUserasks()); - service.setAgentreplys(agentUserTask.getAgentreplys()); - } - - - /** - * 启用了质检任务,开启质检 - */ - if (sessionConfig.isQuality() && service.getUserasks() > 0) { //开启了质检,并且是有效对话 - service.setQualitystatus(MainContext.QualityStatus.NODIS.toString()); //未分配质检任务 - } else { - service.setQualitystatus(MainContext.QualityStatus.NO.toString()); //未开启质检 或无效对话无需质检 - } - agentServiceRes.save(service); - } - - if (isPhone) { // 语音渠道,强制发送 - NettyClients.getInstance().sendCalloutEventMessage(agentUser.getAgentno(), MainContext.MessageTypeEnum.END.toString(), agentUser); - } else { - if (agentStatus != null) // WebIM 查看用户状态 - // TODO #111 结束会话 - NettyClients.getInstance().publishAgentEventMessage(agentUser.getAgentno(), MainContext.MessageTypeEnum.END.toString(), agentUser); - OutMessageRouter router = null; - router = (OutMessageRouter) MainContext.getContext().getBean(agentUser.getChannel()); - if (router != null) { - MessageOutContent outMessage = new MessageOutContent(); - outMessage.setMessage(AutomaticServiceDist.getServiceFinishMessage(agentUser.getChannel(), orgi)); - outMessage.setMessageType(MainContext.AgentUserStatusEnum.END.toString()); - outMessage.setCalltype(MainContext.CallTypeEnum.IN.toString()); - if (agentStatus != null) { - outMessage.setNickName(agentStatus.getUsername()); - } else { - outMessage.setNickName(agentUser.getUsername()); - } - outMessage.setCreatetime(MainUtils.dateFormate.format(new Date())); - outMessage.setAgentserviceid(agentUser.getAgentserviceid()); - - router.handler(agentUser.getUserid(), MainContext.MessageTypeEnum.STATUS.toString(), agentUser.getAppid(), outMessage); - } - } - - if (agentStatus != null) { - updateAgentStatus(agentStatus, agentUser, orgi, false); - - long maxusers = sessionConfig != null ? sessionConfig.getMaxuser() : MainContext.AGENT_STATUS_MAX_USER; - if (agentStatus.getUsers() < maxusers) { - allotAgent(agentStatus.getAgentno(), orgi); - } - } - publishMessage(orgi, "end", "success", agentUser != null ? agentUser.getId() : null); - } - } - - /** - * 更新坐席当前服务中的用户状态,需要分布式锁 - * - * @param agentStatus - * @param agentUser - * @param orgi - */ - public synchronized static void updateAgentStatus(AgentStatus agentStatus, AgentUser agentUser, String orgi, boolean in) { - int users = getAgentUsers(agentStatus.getAgentno(), orgi); - Lock lock = CacheHelper.getAgentStatusCacheBean().getLock("LOCK", orgi); - lock.lock(); - try { - agentStatus.setUsers(users); - agentStatus.setUpdatetime(new Date()); - CacheHelper.getAgentStatusCacheBean().put(agentStatus.getAgentno(), agentStatus, orgi); - } finally { - lock.unlock(); - } - } - - public static void publishMessage(String orgi, String worktype, String workresult, String dataid) { - /** - * 坐席状态改变,通知监测服务 - */ - AgentReport agentReport = AutomaticServiceDist.getAgentReport(orgi); - AgentReportRepository agentReportRes = MainContext.getContext().getBean(AgentReportRepository.class); - if (agentReportRes != null) { - agentReport.setOrgi(orgi); - agentReport.setWorktype(worktype); - agentReport.setWorkresult(workresult); - agentReport.setDataid(dataid); - - agentReportRes.save(agentReport); - } - MainContext.getContext().getBean("agentNamespace", SocketIONamespace.class).getBroadcastOperations().sendEvent("status", agentReport); - } - - /** - * @param agent 坐席 - * @param skill 技能组 - * @param userid 用户ID - * @param status 工作状态 - * @param worktype 类型 : 语音OR 文本 - * @param orgi - * @param lasttime - */ - public static void recordAgentStatus(String agent, String username, String extno, String skill, boolean admin, String userid, String status, String current, String worktype, String orgi, Date lasttime) { - WorkMonitorRepository workMonitorRes = MainContext.getContext().getBean(WorkMonitorRepository.class); - WorkMonitor workMonitor = new WorkMonitor(); - if (StringUtils.isNotBlank(agent) && StringUtils.isNotBlank(status)) { - workMonitor.setAgent(agent); - workMonitor.setAgentno(agent); - workMonitor.setStatus(status); - workMonitor.setAdmin(admin); - workMonitor.setUsername(username); - workMonitor.setExtno(extno); - workMonitor.setWorktype(worktype); - if (lasttime != null) { - workMonitor.setDuration((int) (System.currentTimeMillis() - lasttime.getTime()) / 1000); - } - if (status.equals(MainContext.AgentStatusEnum.BUSY.toString())) { - workMonitor.setBusy(true); - } - if (status.equals(MainContext.AgentStatusEnum.READY.toString())) { - int count = workMonitorRes.countByAgentAndDatestrAndStatusAndOrgi(agent, MainUtils.simpleDateFormat.format(new Date()), MainContext.AgentStatusEnum.READY.toString(), orgi); - if (count == 0) { - workMonitor.setFirsttime(true); - } - } - if (current.equals(MainContext.AgentStatusEnum.NOTREADY.toString())) { - List workMonitorList = workMonitorRes.findByOrgiAndAgentAndDatestrAndFirsttime(orgi, agent, MainUtils.simpleDateFormat.format(new Date()), true); - if (workMonitorList.size() > 0) { - WorkMonitor firstWorkMonitor = workMonitorList.get(0); - if (firstWorkMonitor.getFirsttimes() == 0) { - firstWorkMonitor.setFirsttimes((int) (System.currentTimeMillis() - firstWorkMonitor.getCreatetime().getTime())); - workMonitorRes.save(firstWorkMonitor); - } - } - } - workMonitor.setCreatetime(new Date()); - workMonitor.setDatestr(MainUtils.simpleDateFormat.format(new Date())); - - workMonitor.setName(agent); - workMonitor.setOrgi(orgi); - workMonitor.setSkill(skill); - workMonitor.setUserid(userid); - - workMonitorRes.save(workMonitor); - } - } - - /** - * 为用户分配坐席 - * - * @param agentUser - */ - @SuppressWarnings("unchecked") - public static AgentService allotAgent(AgentUser agentUser, String orgi) { - /** - * 查询条件,当前在线的 坐席,并且 未达到最大 服务人数的坐席 - */ - - List agentStatusList = new ArrayList(); - PagingPredicate pagingPredicate = null; - /** - * 处理ACD 的 技能组请求和 坐席请求 - */ - if (StringUtils.isNotBlank(agentUser.getAgent())) { - pagingPredicate = new PagingPredicate(new SqlPredicate(" busy = false AND agentno = '" + agentUser.getAgent() + "' AND orgi = '" + orgi + "'"), 1); - } else if (StringUtils.isNotBlank(agentUser.getSkill())) { - pagingPredicate = new PagingPredicate(new SqlPredicate(" busy = false AND skill = '" + agentUser.getSkill() + "' AND orgi = '" + orgi + "'"), 1); - } else { - pagingPredicate = new PagingPredicate(new SqlPredicate(" busy = false AND orgi = '" + orgi + "'"), 1); - } - - agentStatusList.addAll(((IMap) CacheHelper.getAgentStatusCacheBean().getCache()).values(pagingPredicate)); - AgentStatus agentStatus = null; - AgentService agentService = null; //放入缓存的对象 - if (agentStatusList.size() > 0) { - agentStatus = agentStatusList.get(0); - if (agentStatus.getUsers() >= initSessionConfig(orgi).getMaxuser()) { - agentStatus = null; - /** - * 判断当前有多少人排队中 , 分三种情况:1、请求技能组的,2、请求坐席的,3,默认请求的 - * - */ - - } - } - try { - agentService = processAgentService(agentStatus, agentUser, orgi); - if (agentService.getStatus().equals(MainContext.AgentUserStatusEnum.INQUENE.toString())) { - agentService.setQueneindex(getQueneIndex(agentUser.getAgent(), orgi, agentUser.getSkill())); - } - - } catch (Exception ex) { - ex.printStackTrace(); - } - publishMessage(orgi, "user", agentService != null && agentService.getStatus().equals(MainContext.AgentUserStatusEnum.INSERVICE.toString()) ? "inservice" : "inquene", agentUser.getId()); - return agentService; - } - - /** - * 邀请访客进入当前对话,如果当前操作的 坐席是已就绪状态,则直接加入到当前坐席的 对话列表中,如果未登录,则分配给其他坐席 - * - * @param agentno - * @param agentUser - * @param orgi - * @return - * @throws Exception - */ - public static AgentService allotAgentForInvite(String agentno, AgentUser agentUser, String orgi) throws Exception { - AgentStatus agentStatus = (AgentStatus) CacheHelper.getAgentStatusCacheBean().getCacheObject(agentno, orgi); - AgentService agentService = null; - if (agentStatus != null) { - agentService = processAgentService(agentStatus, agentUser, orgi); - publishMessage(orgi, "invite", "success", agentno); - // TODO #111 为坐席分配邀请的访客 - NettyClients.getInstance().publishAgentEventMessage(agentService.getAgentno(), MainContext.MessageTypeEnum.NEW.toString(), agentUser); - } else { - agentService = allotAgent(agentUser, orgi); - } - return agentService; - } - - /** - * 为访客 分配坐席, ACD策略,此处 AgentStatus 是建议 的 坐席, 如果启用了 历史服务坐席 优先策略, 则会默认检查历史坐席是否空闲,如果空闲,则分配,如果不空闲,则 分配当前建议的坐席 - * - * @param agentStatus - * @param agentUser - * @param orgi - * @return - * @throws Exception - */ - private static AgentService processAgentService(AgentStatus agentStatus, AgentUser agentUser, String orgi) throws Exception { - return processAgentService(agentStatus, agentUser, orgi, false); - } - - /** - * 为访客 分配坐席, ACD策略,此处 AgentStatus 是建议 的 坐席, 如果启用了 历史服务坐席 优先策略, 则会默认检查历史坐席是否空闲,如果空闲,则分配,如果不空闲,则 分配当前建议的坐席 - * - * @param agentUser - * @param orgi - * @return - * @throws Exception - */ - public static AgentService processChatbotService(final String botName, final AgentUser agentUser, final String orgi) { - AgentService agentService = new AgentService(); //放入缓存的对象 - AgentServiceRepository agentServiceRes = MainContext.getContext().getBean(AgentServiceRepository.class); - Date now = new Date(); - if (StringUtils.isNotBlank(agentUser.getAgentserviceid())) { - agentService = agentServiceRes.findByIdAndOrgi(agentUser.getAgentserviceid(), orgi); - agentService.setEndtime(now); - if (agentService.getServicetime() != null) { - agentService.setSessiontimes(System.currentTimeMillis() - agentService.getServicetime().getTime()); - } - agentService.setStatus(MainContext.AgentUserStatusEnum.END.toString()); - } else { - agentService.setServicetime(now); - agentService.setLogindate(now); - agentService.setOrgi(orgi); - agentService.setOwner(agentUser.getContextid()); - agentService.setSessionid(agentUser.getSessionid()); - agentService.setRegion(agentUser.getRegion()); - agentService.setUsername(agentUser.getUsername()); - agentService.setChannel(agentUser.getChannel()); - if (botName != null) - agentService.setAgentusername(botName); - - if (StringUtils.isNotBlank(agentUser.getContextid())) { - agentService.setContextid(agentUser.getContextid()); - } else { - agentService.setContextid(agentUser.getSessionid()); - } - - agentService.setUserid(agentUser.getUserid()); - agentService.setAiid(agentUser.getAgentno()); - agentService.setAiservice(true); - agentService.setStatus(MainContext.AgentUserStatusEnum.INSERVICE.toString()); - - agentService.setAppid(agentUser.getAppid()); - agentService.setLeavemsg(false); - } - - agentServiceRes.save(agentService); - return agentService; - } - - /** - * 为访客 分配坐席, ACD策略,此处 AgentStatus 是建议 的 坐席, 如果启用了 历史服务坐席 优先策略, 则会默认检查历史坐席是否空闲,如果空闲,则分配,如果不空闲,则 分配当前建议的坐席 - * - * @param agentStatus - * @param agentUser - * @param orgi - * @return - * @throws Exception - */ - private static AgentService processAgentService(AgentStatus agentStatus, AgentUser agentUser, String orgi, boolean finished) throws Exception { - AgentService agentService = new AgentService(); //放入缓存的对象 - if (StringUtils.isNotBlank(agentUser.getAgentserviceid())) { - agentService.setId(agentUser.getAgentserviceid()); - } - agentService.setOrgi(orgi); - - MainUtils.copyProperties(agentUser, agentService); //复制属性 - - agentService.setChannel(agentUser.getChannel()); - - agentService.setSessionid(agentUser.getSessionid()); - OnlineUserRepository onlineUserRes = MainContext.getContext().getBean(OnlineUserRepository.class); - agentUser.setLogindate(new Date()); - List onlineUserList = onlineUserRes.findByUseridAndOrgi(agentUser.getUserid(), agentUser.getOrgi()); - OnlineUser onlineUser = null; - if (onlineUserList.size() > 0) { - onlineUser = onlineUserList.get(0); - } - - if (agentStatus != null) { - SessionConfig sessionConfig = initSessionConfig(orgi); - - agentService.setAgent(agentStatus.getAgentno()); - agentService.setSkill(agentUser.getSkill()); - - if (sessionConfig.isLastagent()) { //启用了历史坐席优先 , 查找 历史服务坐席 - List webIMaggList = MainUtils.getWebIMDataAgg(onlineUserRes.findByOrgiForDistinctAgent(orgi, agentUser.getUserid())); - if (webIMaggList.size() > 0) { - for (WebIMReport report : webIMaggList) { - if (report.getData().equals(agentStatus.getAgentno())) { - break; - } else { - AgentStatus hisAgentStatus = (AgentStatus) CacheHelper.getAgentStatusCacheBean().getCacheObject(report.getData(), orgi); - if (hisAgentStatus != null && hisAgentStatus.getUsers() < hisAgentStatus.getMaxusers()) { - agentStatus = hisAgentStatus; //变更为 历史服务坐席 - break; - } - } - - } - } - } - - agentUser.setStatus(MainContext.AgentUserStatusEnum.INSERVICE.toString()); - agentService.setStatus(MainContext.AgentUserStatusEnum.INSERVICE.toString()); - - agentService.setSessiontype(MainContext.AgentUserStatusEnum.INSERVICE.toString()); - - agentService.setAgentno(agentStatus.getUserid()); - agentService.setAgentusername(agentStatus.getUsername()); //agent - } else { - if (finished == true) { - agentUser.setStatus(MainContext.AgentUserStatusEnum.END.toString()); - agentService.setStatus(MainContext.AgentUserStatusEnum.END.toString()); - agentService.setSessiontype(MainContext.AgentUserStatusEnum.END.toString()); - if (agentStatus == null) { - agentService.setLeavemsg(true); //是留言 - agentService.setLeavemsgstatus(MainContext.LeaveMsgStatus.NOTPROCESS.toString()); //未处理的留言 - } - } else { - agentUser.setStatus(MainContext.AgentUserStatusEnum.INQUENE.toString()); - agentService.setStatus(MainContext.AgentUserStatusEnum.INQUENE.toString()); - - agentService.setSessiontype(MainContext.AgentUserStatusEnum.INQUENE.toString()); - } - } - if (finished || agentStatus != null) { - // agentService.setId(null); - - agentService.setAgentuserid(agentUser.getId()); - - agentService.setInitiator(MainContext.ChatInitiatorType.USER.toString()); - - long waittingtime = 0; - if (agentUser.getWaittingtimestart() != null) { - waittingtime = System.currentTimeMillis() - agentUser.getWaittingtimestart().getTime(); - } else if (agentUser.getCreatetime() != null) { - waittingtime = System.currentTimeMillis() - agentUser.getCreatetime().getTime(); - } - agentUser.setWaittingtime((int) waittingtime); - - agentUser.setServicetime(new Date()); - - agentService.setOwner(agentUser.getOwner()); - - agentService.setTimes(0); - agentUser.setAgentno(agentService.getAgentno()); - - AgentServiceRepository agentServiceRes = MainContext.getContext().getBean(AgentServiceRepository.class); - - if (StringUtils.isNotBlank(agentUser.getName())) { - agentService.setName(agentUser.getName()); - } - if (StringUtils.isNotBlank(agentUser.getPhone())) { - agentService.setPhone(agentUser.getPhone()); - } - if (StringUtils.isNotBlank(agentUser.getEmail())) { - agentService.setEmail(agentUser.getEmail()); - } - if (StringUtils.isNotBlank(agentUser.getResion())) { - agentService.setResion(agentUser.getResion()); - } - - if (StringUtils.isNotBlank(agentUser.getSkill())) { - agentService.setAgentskill(agentUser.getSkill()); - } else if (agentStatus != null) { - agentService.setAgentskill(agentStatus.getSkill()); - } - - agentService.setServicetime(new Date()); - if (agentUser.getCreatetime() != null) { - agentService.setWaittingtime((int) (System.currentTimeMillis() - agentUser.getCreatetime().getTime())); - agentUser.setWaittingtime(agentService.getWaittingtime()); - } - if (onlineUser != null) { - agentService.setOsname(onlineUser.getOpersystem()); - agentService.setBrowser(onlineUser.getBrowser()); - agentService.setDataid(onlineUser.getId()); //记录 onlineuser 的id - } - agentService.setLogindate(agentUser.getCreatetime()); - agentServiceRes.save(agentService); - agentUser.setAgentserviceid(agentService.getId()); - agentUser.setLastgetmessage(new Date()); - agentUser.setLastmessage(new Date()); - } - - agentService.setDataid(agentUser.getId()); - /** - * 分配成功以后, 将用户 和坐席的对应关系放入到 缓存 - */ - /** - * 将 AgentUser 放入到 当前坐席的 服务队列 - */ - AgentUserRepository agentUserRepository = MainContext.getContext().getBean(AgentUserRepository.class); - - /** - * 更新OnlineUser对象,变更为服务中,不可邀请 - */ - - if (onlineUser != null) { - onlineUser.setInvitestatus(MainContext.OnlineUserInviteStatus.INSERV.toString()); - onlineUserRes.save(onlineUser); - } - - /** - * - */ - agentUserRepository.save(agentUser); - - CacheHelper.getAgentUserCacheBean().put(agentUser.getUserid(), agentUser, MainContext.SYSTEM_ORGI); - - if (agentStatus != null) { - updateAgentStatus(agentStatus, agentUser, orgi, true); - } - - return agentService; - } - - public static AgentUser deleteAgentUser(AgentUser agentUser, String orgi) - throws Exception { - if (agentUser != null) { - if (!MainContext.AgentUserStatusEnum.END.toString().equals( - agentUser.getStatus())) { - serviceFinish(agentUser, orgi); - } - if (StringUtils.isNotBlank(agentUser.getId())) { - AgentUserRepository agentUserRes = MainContext.getContext().getBean(AgentUserRepository.class); - agentUser = agentUserRes.findByIdAndOrgi(agentUser.getId(), orgi); - if (agentUser != null) { - agentUserRes.delete(agentUser); - } - } - } - return agentUser; - } - - - /** - * @param agentStatus - * @return - */ - public static String getSuccessMessage(AgentService agentService, String channel, String orgi) { - String queneTip = "" + agentService.getAgentusername() + ""; - if (!MainContext.ChannelTypeEnum.WEBIM.toString().equals(channel)) { - queneTip = agentService.getAgentusername(); - } - SessionConfig sessionConfig = initSessionConfig(orgi); - String successMsg = "坐席分配成功," + queneTip + "为您服务。"; - if (StringUtils.isNotBlank(sessionConfig.getSuccessmsg())) { - successMsg = sessionConfig.getSuccessmsg().replaceAll("\\{agent\\}", queneTip); - } - return successMsg; - } - - /** - * @param agentStatus - * @return - */ - public static String getServiceFinishMessage(String channel, String orgi) { - SessionConfig sessionConfig = initSessionConfig(orgi); - String queneTip = "坐席已断开和您的对话"; - if (StringUtils.isNotBlank(sessionConfig.getFinessmsg())) { - queneTip = sessionConfig.getFinessmsg(); - } - return queneTip; - } - - public static String getNoAgentMessage(int queneIndex, String channel, String orgi) { - if (queneIndex < 0) { - queneIndex = 0; - } - String queneTip = "" + queneIndex + ""; - if (!MainContext.ChannelTypeEnum.WEBIM.toString().equals(channel)) { - queneTip = String.valueOf(queneIndex); - } - SessionConfig sessionConfig = initSessionConfig(orgi); - String noAgentTipMsg = "坐席全忙,已进入等待队列,您也可以在其他时间再来咨询。"; - if (StringUtils.isNotBlank(sessionConfig.getNoagentmsg())) { - noAgentTipMsg = sessionConfig.getNoagentmsg().replaceAll("\\{num\\}", queneTip); - } - return noAgentTipMsg; - } - - public static String getQueneMessage(int queneIndex, String channel, String orgi) { - - String queneTip = "" + queneIndex + ""; - if (!MainContext.ChannelTypeEnum.WEBIM.toString().equals(channel)) { - queneTip = String.valueOf(queneIndex); - } - SessionConfig sessionConfig = initSessionConfig(orgi); - String agentBusyTipMsg = "正在排队,请稍候,在您之前,还有 " + queneTip + " 位等待用户。"; - if (StringUtils.isNotBlank(sessionConfig.getAgentbusymsg())) { - agentBusyTipMsg = sessionConfig.getAgentbusymsg().replaceAll("\\{num\\}", queneTip); - } - return agentBusyTipMsg; - } - - /** - * 坐席离线 - * - * @param userid - * @param status - */ - public static void deleteAgentStatus(String userid, String orgi, boolean isAdmin) { - AgentStatusRepository agentStatusRes = MainContext.getContext().getBean(AgentStatusRepository.class); - List agentStatusList = agentStatusRes.findByAgentnoAndOrgi(userid, orgi); - for (AgentStatus agentStatus : agentStatusList) { - AutomaticServiceDist.recordAgentStatus(agentStatus.getAgentno(), agentStatus.getUsername(), agentStatus.getAgentno(), agentStatus.getSkill(), isAdmin, agentStatus.getAgentno(), agentStatus.isBusy() ? MainContext.AgentStatusEnum.BUSY.toString() : MainContext.AgentStatusEnum.NOTREADY.toString(), MainContext.AgentStatusEnum.NOTREADY.toString(), MainContext.AgentWorkType.MEIDIACHAT.toString(), agentStatus.getOrgi(), agentStatus.getUpdatetime()); - agentStatusRes.delete(agentStatus); - } - CacheHelper.getAgentStatusCacheBean().delete(userid, orgi); - AutomaticServiceDist.publishMessage(orgi, "agent", "leave", userid); - } -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/basic/aop/SyncDatabaseExt.java b/contact-center/app/src/main/java/com/chatopera/cc/app/basic/aop/SyncDatabaseExt.java deleted file mode 100644 index ac4152f8..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/basic/aop/SyncDatabaseExt.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.basic.aop; - -import java.util.List; - -import com.chatopera.cc.app.basic.MainContext; -import com.chatopera.cc.app.basic.MainUtils; -import com.chatopera.cc.util.UKeFuList; -import com.chatopera.cc.concurrent.multiupdate.MultiUpdateEvent; -import com.chatopera.cc.app.persistence.hibernate.BaseService; -import org.aspectj.lang.ProceedingJoinPoint; -import org.aspectj.lang.annotation.Around; -import org.aspectj.lang.annotation.Aspect; -import org.aspectj.lang.annotation.Pointcut; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import com.chatopera.cc.app.model.ESBean; - -@Aspect -@Component -public class SyncDatabaseExt { - - @Autowired - private BaseService dbDataRes ; - /** - * 定义拦截规则:拦截org.springframework.data.elasticsearch.repository。 - */ - @Pointcut("execution(* org.springframework.data.elasticsearch.repository.*.save(*))") - public void syncSaveEsData(){} - - /** - * 定义拦截规则:拦截org.springframework.data.elasticsearch.repository。 - */ - @Pointcut("execution(* org.springframework.data.elasticsearch.repository.*.delete(*))") - public void syncDeleteEsData(){} - - @SuppressWarnings("unchecked") - @Around("syncSaveEsData()") - public Object syncSaveEsData(ProceedingJoinPoint pjp) throws Throwable{ - Object[] args = pjp.getArgs() ; - if(args.length == 1){ - Object data = args[0] ; - if(data!=null){ - if(data instanceof UKeFuList){ - /**只有一个地方用到,从DB同步数据到ES**/ - }else if(data instanceof List){ - List dataList = (List)data ; - for(Object dbData : dataList){ - MainUtils.multiupdate(new MultiUpdateEvent(dbData , dbDataRes, MainContext.MultiUpdateType.SAVE.toString())); - } - }else{ - MainUtils.multiupdate(new MultiUpdateEvent(data, dbDataRes, MainContext.MultiUpdateType.SAVE.toString())); - } - } - } - return pjp.proceed(); - } - - @SuppressWarnings("unchecked") - @Around("syncDeleteEsData()") - public Object syncDeleteEsData(ProceedingJoinPoint pjp) throws Throwable{ - Object[] args = pjp.getArgs() ; - if(args.length == 1){ - Object data = args[0] ; - if(data instanceof List){ - List dataList = (List)data ; - for(Object dbData : dataList){ - MainUtils.multiupdate(new MultiUpdateEvent(dbData , dbDataRes, MainContext.MultiUpdateType.DELETE.toString())); - } - }else{ - if(data instanceof ESBean){ - MainUtils.multiupdate(new MultiUpdateEvent(data, dbDataRes, MainContext.MultiUpdateType.DELETE.toString())); - }else{ - MainUtils.multiupdate(new MultiUpdateEvent(data, dbDataRes, MainContext.MultiUpdateType.DELETE.toString())); - } - } - } - return pjp.proceed(); - } -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/cache/CacheBean.java b/contact-center/app/src/main/java/com/chatopera/cc/app/cache/CacheBean.java deleted file mode 100644 index ba998af9..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/cache/CacheBean.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.cache; - -import java.util.Collection; -import java.util.concurrent.locks.Lock; - -import com.hazelcast.com.eclipsesource.json.JsonObject; - -public interface CacheBean { - /** - * - */ - public void put(String key , Object value , String orgi) ; - - /** - * - */ - public void clear(String orgi); - - - public Object delete(String key , String orgi) ; - - public void update(String key , String orgi , Object object) ; - - /** - * - * @param key - * @param orgi - * @return - */ - public Object getCacheObject(String key, String orgi) ; - - - /** - * - * @param key - * @param orgi - * @return - */ - public Object getCacheObject(String key, String orgi,Object defaultValue) ; - - /** - * 获取所有缓存对象 - * @param orgi - * @return - */ - public Collection getAllCacheObject(String orgi) ; - - - public CacheBean getCacheInstance(String cacheName); - - public Object getCache(); - - public JsonObject getStatics(); - - public Lock getLock(String lock, String orgi); - - public long getSize(); - - public long getAtomicLong(String cacheName) ; - - public void setAtomicLong(String cacheName , long start) ; //初始化 发号器 - -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/cache/CacheHelper.java b/contact-center/app/src/main/java/com/chatopera/cc/app/cache/CacheHelper.java deleted file mode 100644 index b3337091..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/cache/CacheHelper.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.cache; - -import com.chatopera.cc.app.cache.hazelcast.HazlcastCacheHelper; - -public class CacheHelper { - private static CacheHelper instance = new CacheHelper(); - - /** - * 获取缓存实例 - */ - public static CacheHelper getInstance(){ - return instance ; - } - private static CacheInstance cacheInstance = new HazlcastCacheHelper(); - - public static CacheBean getAgentStatusCacheBean() { - return cacheInstance!=null ? cacheInstance.getAgentStatusCacheBean() : null; - } - public static CacheBean getAgentUserCacheBean() { - return cacheInstance!=null ? cacheInstance.getAgentUserCacheBean() : null ; - } - public static CacheBean getOnlineUserCacheBean() { - return cacheInstance!=null ? cacheInstance.getOnlineCacheBean() : null; - } - public static CacheBean getSystemCacheBean() { - return cacheInstance!=null ? cacheInstance.getSystemCacheBean() : null ; - } - - public static CacheBean getIMRCacheBean() { - return cacheInstance!=null ? cacheInstance.getIMRCacheBean() : null ; - } - public static CacheBean getCallCenterCacheBean() { - return cacheInstance!=null ? cacheInstance.getCallCenterCacheBean() : null ; - } - public static CacheBean getCallCenterAgentCacheBean() { - return cacheInstance!=null ? cacheInstance.getCallCenterAgentCacheBean() : null ; - } - public static CacheBean getApiUserCacheBean() { - return cacheInstance!=null ? cacheInstance.getApiUserCacheBean() : null ; - } - public static CacheBean getJobCacheBean() { - return cacheInstance!=null ? cacheInstance.getJobCacheBean(): null ; - } - public static CacheBean getCallOutCacheBean() { - return cacheInstance!=null ? cacheInstance.getCallOutCacheBean(): null ; - } - -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/cache/CacheInstance.java b/contact-center/app/src/main/java/com/chatopera/cc/app/cache/CacheInstance.java deleted file mode 100644 index 161295ee..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/cache/CacheInstance.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.cache; - - -public interface CacheInstance { - /** - * 坐席状态 - * @return - */ - public CacheBean getAgentStatusCacheBean() ; - - - /** - * 服务中用户 - * @return - */ - public CacheBean getAgentUserCacheBean(); - - - /** - * 在线用户 - * @return - */ - public CacheBean getOnlineCacheBean(); - - /** - * 系统缓存 - * @return - */ - public CacheBean getSystemCacheBean(); - - - /** - * IMR指令 - * @return - */ - public CacheBean getIMRCacheBean(); - - /** - * IMR指令 - * @return - */ - public CacheBean getCallCenterCacheBean(); - - /** - * IMR指令 - * @return - */ - public CacheBean getCallCenterAgentCacheBean(); - - /** - * IMR指令 - * @return - */ - public CacheBean getApiUserCacheBean(); - - /** - * IMR指令 - * @return - */ - public CacheBean getJobCacheBean(); - - /** - * 外呼 - * @return - */ - public CacheBean getCallOutCacheBean(); - -} \ No newline at end of file diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/cache/hazelcast/HazlcastCacheHelper.java b/contact-center/app/src/main/java/com/chatopera/cc/app/cache/hazelcast/HazlcastCacheHelper.java deleted file mode 100644 index 691660e4..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/cache/hazelcast/HazlcastCacheHelper.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.cache.hazelcast; - -import com.chatopera.cc.app.basic.MainContext; -import com.chatopera.cc.app.cache.CacheBean; -import com.chatopera.cc.app.cache.CacheInstance; -import com.chatopera.cc.app.cache.hazelcast.impl.AgentStatusCache; -import com.chatopera.cc.app.cache.hazelcast.impl.AgentUserCache; -import com.chatopera.cc.app.cache.hazelcast.impl.ApiUserCache; -import com.chatopera.cc.app.cache.hazelcast.impl.CallCenterCache; -import com.chatopera.cc.app.cache.hazelcast.impl.JobCache; -import com.chatopera.cc.app.cache.hazelcast.impl.MultiCache; -import com.chatopera.cc.app.cache.hazelcast.impl.OnlineCache; -import com.chatopera.cc.app.cache.hazelcast.impl.SystemCache; -/** - * Hazlcast缓存处理实例类 - * @author admin - * - */ -public class HazlcastCacheHelper implements CacheInstance { - /** - * 服务类型枚举 - * @author admin - * - */ - public enum CacheServiceEnum{ - HAZLCAST_CLUSTER_AGENT_USER_CACHE, HAZLCAST_CLUSTER_AGENT_STATUS_CACHE, HAZLCAST_CLUSTER_QUENE_USER_CACHE,HAZLCAST_ONLINE_CACHE , HAZLCAST_CULUSTER_SYSTEM , HAZLCAST_IMR_CACHE , API_USER_CACHE , CALLCENTER_CURRENT_CALL ,CALLCENTER_AGENT,JOB_CACHE,HAZLCAST_CALLOUT_CACHE; - public String toString(){ - return super.toString().toLowerCase(); - } - } - - @Override - public CacheBean getAgentStatusCacheBean() { - // TODO Auto-generated method stub - return MainContext.getContext().getBean(AgentStatusCache.class).getCacheInstance(CacheServiceEnum.HAZLCAST_CLUSTER_AGENT_STATUS_CACHE.toString()) ; - } - @Override - public CacheBean getAgentUserCacheBean() { - // TODO Auto-generated method stub - return MainContext.getContext().getBean(AgentUserCache.class).getCacheInstance(CacheServiceEnum.HAZLCAST_CLUSTER_QUENE_USER_CACHE.toString()) ; - } - @Override - public CacheBean getOnlineCacheBean() { - return MainContext.getContext().getBean(OnlineCache.class).getCacheInstance(CacheServiceEnum.HAZLCAST_ONLINE_CACHE.toString()) ; - } - @Override - public CacheBean getSystemCacheBean() { - return MainContext.getContext().getBean(SystemCache.class).getCacheInstance(CacheServiceEnum.HAZLCAST_CULUSTER_SYSTEM.toString()) ; - } - @Override - public CacheBean getIMRCacheBean() { - return MainContext.getContext().getBean(MultiCache.class).getCacheInstance(CacheServiceEnum.HAZLCAST_IMR_CACHE.toString()) ; - } - @Override - public CacheBean getCallCenterCacheBean() { - return MainContext.getContext().getBean(CallCenterCache.class).getCacheInstance(CacheServiceEnum.CALLCENTER_CURRENT_CALL.toString()) ; - } - @Override - public CacheBean getCallCenterAgentCacheBean() { - return MainContext.getContext().getBean(CallCenterCache.class).getCacheInstance(CacheServiceEnum.CALLCENTER_AGENT.toString()) ; - } - @Override - public CacheBean getApiUserCacheBean() { - return MainContext.getContext().getBean(ApiUserCache.class).getCacheInstance(CacheServiceEnum.API_USER_CACHE.toString()) ; - } - @Override - public CacheBean getJobCacheBean() { - return MainContext.getContext().getBean(JobCache.class).getCacheInstance(CacheServiceEnum.JOB_CACHE.toString()) ; - } - @Override - public CacheBean getCallOutCacheBean() { - // TODO Auto-generated method stub - return MainContext.getContext().getBean(JobCache.class).getCacheInstance(CacheServiceEnum.HAZLCAST_CALLOUT_CACHE.toString()) ; - } -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/cache/hazelcast/impl/AgentStatusCache.java b/contact-center/app/src/main/java/com/chatopera/cc/app/cache/hazelcast/impl/AgentStatusCache.java deleted file mode 100644 index afc643ea..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/cache/hazelcast/impl/AgentStatusCache.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.cache.hazelcast.impl; - -import java.util.Collection; -import java.util.concurrent.locks.Lock; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import com.hazelcast.com.eclipsesource.json.JsonObject; -import com.hazelcast.core.HazelcastInstance; -import com.chatopera.cc.app.cache.CacheBean; - -@Service("agentstatus_cache") -public class AgentStatusCache implements CacheBean{ - - @Autowired - public HazelcastInstance hazelcastInstance; - - private String cacheName ; - - public HazelcastInstance getInstance(){ - return hazelcastInstance ; - } - public CacheBean getCacheInstance(String cacheName){ - this.cacheName = cacheName ; - return this ; - } - - @Override - public void put(String key, Object value, String orgi) { - getInstance().getMap(getName()).put(key, value) ; - } - - @Override - public void clear(String orgi) { - getInstance().getMap(getName()).clear(); - } - - @Override - public Object delete(String key, String orgi) { - return getInstance().getMap(getName()).remove(key) ; - } - - @Override - public void update(String key, String orgi, Object value) { - getInstance().getMap(getName()).put(key, value); - } - - @Override - public Object getCacheObject(String key, String orgi) { - return getInstance().getMap(getName()).get(key); - } - - public String getName() { - return cacheName ; - } - -// @Override - public void service() throws Exception { - // TODO Auto-generated method stub - - } - - @Override - public Collection getAllCacheObject(String orgi) { - return getInstance().getMap(getName()).keySet(); - } - @Override - public Object getCacheObject(String key, String orgi, Object defaultValue) { - return getCacheObject(key, orgi); - } - @Override - public Object getCache() { - return getInstance().getMap(cacheName); - } - - @Override - public Lock getLock(String lock , String orgi) { - // TODO Auto-generated method stub - return getInstance().getLock(lock); - } - @Override - public long getSize() { - return getInstance().getMap(getName()).size(); - } - @Override - public long getAtomicLong(String cacheName) { - return getInstance().getAtomicLong(getName()).incrementAndGet(); - } - @Override - public void setAtomicLong(String cacheName, long start) { - getInstance().getAtomicLong(getName()).set(start); - } - @Override - public JsonObject getStatics() { - // TODO Auto-generated method stub - return getInstance().getMap(getName()).getLocalMapStats().toJson(); - } -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/cache/hazelcast/impl/AgentUserCache.java b/contact-center/app/src/main/java/com/chatopera/cc/app/cache/hazelcast/impl/AgentUserCache.java deleted file mode 100644 index f03c5989..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/cache/hazelcast/impl/AgentUserCache.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.cache.hazelcast.impl; - -import java.util.Collection; -import java.util.concurrent.locks.Lock; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import com.hazelcast.com.eclipsesource.json.JsonObject; -import com.hazelcast.core.HazelcastInstance; -import com.chatopera.cc.app.cache.CacheBean; - -@Service("agentuser_cache") -public class AgentUserCache implements CacheBean{ - - @Autowired - public HazelcastInstance hazelcastInstance; - - private String cacheName ; - - public HazelcastInstance getInstance(){ - return hazelcastInstance ; - } - public CacheBean getCacheInstance(String cacheName){ - this.cacheName = cacheName ; - return this ; - } - - @Override - public void put(String key, Object value, String orgi) { - getInstance().getMap(getName()).put(key, value) ; - } - - @Override - public void clear(String orgi) { - getInstance().getMap(getName()).clear(); - } - - @Override - public Object delete(String key, String orgi) { - return getInstance().getMap(getName()).remove(key) ; - } - - @Override - public void update(String key, String orgi, Object value) { - getInstance().getMap(getName()).put(key, value); - } - - @Override - public Object getCacheObject(String key, String orgi) { - return getInstance().getMap(getName()).get(key); - } - - public String getName() { - return cacheName ; - } - -// @Override - public void service() throws Exception { - // TODO Auto-generated method stub - - } - - @Override - public Collection getAllCacheObject(String orgi) { - return getInstance().getMap(getName()).keySet(); - } - @Override - public Object getCacheObject(String key, String orgi, Object defaultValue) { - return getCacheObject(key, orgi); - } - @Override - public Object getCache() { - return getInstance().getMap(cacheName); - } - - @Override - public Lock getLock(String lock , String orgi) { - // TODO Auto-generated method stub - return getInstance().getLock(lock); - } - @Override - public long getSize() { - return getInstance().getMap(getName()).size(); - } - @Override - public long getAtomicLong(String cacheName) { - return getInstance().getAtomicLong(getName()).incrementAndGet(); - } - @Override - public void setAtomicLong(String cacheName, long start) { - getInstance().getAtomicLong(getName()).set(start); - } - @Override - public JsonObject getStatics() { - // TODO Auto-generated method stub - return getInstance().getMap(getName()).getLocalMapStats().toJson(); - } -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/cache/hazelcast/impl/ApiUserCache.java b/contact-center/app/src/main/java/com/chatopera/cc/app/cache/hazelcast/impl/ApiUserCache.java deleted file mode 100644 index 8d9f74fb..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/cache/hazelcast/impl/ApiUserCache.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.cache.hazelcast.impl; - -import java.util.Collection; -import java.util.concurrent.locks.Lock; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import com.hazelcast.com.eclipsesource.json.JsonObject; -import com.hazelcast.core.HazelcastInstance; -import com.chatopera.cc.app.cache.CacheBean; - -@Service("api_user_cache") -public class ApiUserCache implements CacheBean{ - - @Autowired - public HazelcastInstance hazelcastInstance; - - private String cacheName ; - - public HazelcastInstance getInstance(){ - return hazelcastInstance ; - } - public CacheBean getCacheInstance(String cacheName){ - this.cacheName = cacheName ; - return this ; - } - - @Override - public void put(String key, Object value, String orgi) { - getInstance().getMap(getName()).put(key, value) ; - } - - @Override - public void clear(String orgi) { - getInstance().getMap(getName()).clear(); - } - - @Override - public Object delete(String key, String orgi) { - return getInstance().getMap(getName()).remove(key) ; - } - - @Override - public void update(String key, String orgi, Object value) { - getInstance().getMap(getName()).put(key, value); - } - - @Override - public Object getCacheObject(String key, String orgi) { - return getInstance().getMap(getName()).get(key); - } - - public String getName() { - return cacheName ; - } - -// @Override - public void service() throws Exception { - // TODO Auto-generated method stub - - } - - @Override - public Collection getAllCacheObject(String orgi) { - return getInstance().getMap(getName()).keySet(); - } - @Override - public Object getCacheObject(String key, String orgi, Object defaultValue) { - return getCacheObject(key, orgi); - } - @Override - public Object getCache() { - return getInstance().getMap(cacheName); - } - - @Override - public Lock getLock(String lock , String orgi) { - // TODO Auto-generated method stub - return getInstance().getLock(lock); - } - @Override - public long getSize() { - return getInstance().getMap(getName()).size(); - } - @Override - public long getAtomicLong(String cacheName) { - return getInstance().getAtomicLong(getName()).incrementAndGet(); - } - @Override - public void setAtomicLong(String cacheName, long start) { - getInstance().getAtomicLong(getName()).set(start); - } - @Override - public JsonObject getStatics() { - // TODO Auto-generated method stub - return getInstance().getMap(getName()).getLocalMapStats().toJson(); - } -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/cache/hazelcast/impl/CallCenterCache.java b/contact-center/app/src/main/java/com/chatopera/cc/app/cache/hazelcast/impl/CallCenterCache.java deleted file mode 100644 index e01a1ea6..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/cache/hazelcast/impl/CallCenterCache.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.cache.hazelcast.impl; - -import java.util.Collection; -import java.util.concurrent.locks.Lock; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import com.hazelcast.com.eclipsesource.json.JsonObject; -import com.hazelcast.core.HazelcastInstance; -import com.chatopera.cc.app.cache.CacheBean; - -@Service("callcenter_current_call") -public class CallCenterCache implements CacheBean{ - - @Autowired - public HazelcastInstance hazelcastInstance; - - private String cacheName ; - - public HazelcastInstance getInstance(){ - return hazelcastInstance ; - } - public CacheBean getCacheInstance(String cacheName){ - this.cacheName = cacheName ; - return this ; - } - - @Override - public void put(String key, Object value, String orgi) { - getInstance().getMap(getName()).put(key, value) ; - } - - @Override - public void clear(String orgi) { - getInstance().getMap(getName()).clear(); - } - - @Override - public Object delete(String key, String orgi) { - return getInstance().getMap(getName()).remove(key) ; - } - - @Override - public void update(String key, String orgi, Object value) { - getInstance().getMap(getName()).put(key, value); - } - - @Override - public Object getCacheObject(String key, String orgi) { - return getInstance().getMap(getName()).get(key); - } - - public String getName() { - return cacheName ; - } - -// @Override - public void service() throws Exception { - // TODO Auto-generated method stub - - } - - @Override - public Collection getAllCacheObject(String orgi) { - return getInstance().getMap(getName()).keySet(); - } - @Override - public Object getCacheObject(String key, String orgi, Object defaultValue) { - return getCacheObject(key, orgi); - } - @Override - public Object getCache() { - return getInstance().getMap(cacheName); - } - - @Override - public Lock getLock(String lock , String orgi) { - // TODO Auto-generated method stub - return getInstance().getLock(lock); - } - @Override - public long getSize() { - return getInstance().getMap(getName()).size(); - } - @Override - public long getAtomicLong(String cacheName) { - return getInstance().getAtomicLong(getName()).incrementAndGet(); - } - @Override - public void setAtomicLong(String cacheName, long start) { - getInstance().getAtomicLong(getName()).set(start); - } - @Override - public JsonObject getStatics() { - // TODO Auto-generated method stub - return getInstance().getMap(getName()).getLocalMapStats().toJson(); - } -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/cache/hazelcast/impl/JobCache.java b/contact-center/app/src/main/java/com/chatopera/cc/app/cache/hazelcast/impl/JobCache.java deleted file mode 100644 index bb39934c..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/cache/hazelcast/impl/JobCache.java +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.cache.hazelcast.impl; - -import java.util.Collection; -import java.util.concurrent.locks.Lock; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import com.hazelcast.com.eclipsesource.json.JsonObject; -import com.hazelcast.core.HazelcastInstance; -import com.chatopera.cc.app.cache.CacheBean; - -@Service("job_cache") -public class JobCache implements CacheBean{ - - @Autowired - public HazelcastInstance hazelcastInstance; - - private String cacheName ; - - public HazelcastInstance getInstance(){ - return hazelcastInstance ; - } - public CacheBean getCacheInstance(String cacheName){ - this.cacheName = cacheName ; - return this ; - } - - @Override - public void put(String key, Object value, String orgi) { - getInstance().getMap(getName()).put(key, value) ; - } - - @Override - public void clear(String orgi) { - getInstance().getMap(getName()).clear(); - } - - @Override - public Object delete(String key, String orgi) { - return getInstance().getMap(getName()).remove(key) ; - } - - @Override - public void update(String key, String orgi, Object value) { - getInstance().getMap(getName()).put(key, value); - } - - @Override - public Object getCacheObject(String key, String orgi) { - return getInstance().getMap(getName()).get(key); - } - - public String getName() { - return cacheName ; - } - -// @Override - public void service() throws Exception { - // TODO Auto-generated method stub - - } - - @Override - public Collection getAllCacheObject(String orgi) { - return getInstance().getMap(getName()).keySet(); - } - @Override - public Object getCacheObject(String key, String orgi, Object defaultValue) { - return getCacheObject(key, orgi); - } - @Override - public Object getCache() { - return getInstance().getMap(cacheName); - } - - @Override - public Lock getLock(String lock , String orgi) { - // TODO Auto-generated method stub - return getInstance().getLock(lock); - } - @Override - public long getSize() { - return getInstance().getMap(getName()).size(); - } - @Override - public long getAtomicLong(String cacheName) { - return getInstance().getAtomicLong(getName()).incrementAndGet(); - } - @Override - public void setAtomicLong(String cacheName, long start) { - getInstance().getAtomicLong(getName()).set(start); - } - - @Override - public JsonObject getStatics() { - // TODO Auto-generated method stub - return getInstance().getMap(getName()).getLocalMapStats().toJson(); - } -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/cache/hazelcast/impl/MultiCache.java b/contact-center/app/src/main/java/com/chatopera/cc/app/cache/hazelcast/impl/MultiCache.java deleted file mode 100644 index 00cca20f..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/cache/hazelcast/impl/MultiCache.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.cache.hazelcast.impl; - -import java.util.Collection; -import java.util.concurrent.locks.Lock; - -import com.chatopera.cc.app.cache.CacheBean; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import com.hazelcast.com.eclipsesource.json.JsonObject; -import com.hazelcast.core.HazelcastInstance; - -@Service("multi_cache") -public class MultiCache implements CacheBean { - - @Autowired - public HazelcastInstance hazelcastInstance; - - private String cacheName ; - - public HazelcastInstance getInstance(){ - return hazelcastInstance ; - } - public CacheBean getCacheInstance(String cacheName){ - this.cacheName = cacheName ; - return this ; - } - - @Override - public void put(String key, Object value, String orgi) { - getInstance().getMultiMap(getName()).put(key, value) ; - } - - @Override - public void clear(String orgi) { - getInstance().getMultiMap(getName()).clear(); - } - - @Override - public Object delete(String key, String orgi) { - return getInstance().getMultiMap(getName()).remove(key) ; - } - - @Override - public void update(String key, String orgi, Object value) { - getInstance().getMultiMap(getName()).put(key, value); - } - - @Override - public Object getCacheObject(String key, String orgi) { - return getInstance().getMultiMap(getName()).get(key); - } - - public String getName() { - return cacheName ; - } - -// @Override - public void service() throws Exception { - // TODO Auto-generated method stub - - } - - @Override - public Collection getAllCacheObject(String orgi) { - return getInstance().getMultiMap(getName()).keySet(); - } - @Override - public Object getCacheObject(String key, String orgi, Object defaultValue) { - return getCacheObject(key, orgi); - - } - @Override - public Object getCache() { - return getInstance().getMultiMap(cacheName); - } - - @Override - public Lock getLock(String lock , String orgi) { - // TODO Auto-generated method stub - return getInstance().getLock(lock); - } - @Override - public long getSize() { - return getInstance().getMultiMap(getName()).size(); - } - @Override - public long getAtomicLong(String cacheName) { - return getInstance().getAtomicLong(getName()).incrementAndGet(); - } - @Override - public void setAtomicLong(String cacheName, long start) { - getInstance().getAtomicLong(getName()).set(start); - } - - @Override - public JsonObject getStatics() { - // TODO Auto-generated method stub - return getInstance().getMultiMap(getName()).getLocalMultiMapStats().toJson(); - } -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/cache/hazelcast/impl/OnlineCache.java b/contact-center/app/src/main/java/com/chatopera/cc/app/cache/hazelcast/impl/OnlineCache.java deleted file mode 100644 index 157b9d83..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/cache/hazelcast/impl/OnlineCache.java +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.cache.hazelcast.impl; - -import java.util.Collection; -import java.util.concurrent.locks.Lock; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import com.hazelcast.com.eclipsesource.json.JsonObject; -import com.hazelcast.core.HazelcastInstance; -import com.chatopera.cc.app.cache.CacheBean; - -@Service("online_cache") -public class OnlineCache implements CacheBean{ - - @Autowired - public HazelcastInstance hazelcastInstance; - - private String cacheName ; - - public HazelcastInstance getInstance(){ - return hazelcastInstance ; - } - public CacheBean getCacheInstance(String cacheName){ - this.cacheName = cacheName ; - return this ; - } - - @Override - public void put(String key, Object value, String orgi) { - getInstance().getMap(getName()).put(key, value) ; - } - - @Override - public void clear(String orgi) { - getInstance().getMap(getName()).clear(); - } - - @Override - public Object delete(String key, String orgi) { - return getInstance().getMap(getName()).remove(key) ; - } - - @Override - public void update(String key, String orgi, Object value) { - getInstance().getMap(getName()).put(key, value); - } - - @Override - public Object getCacheObject(String key, String orgi) { - return getInstance().getMap(getName()).get(key); - } - - public String getName() { - return cacheName ; - } - -// @Override - public void service() throws Exception { - // TODO Auto-generated method stub - - } - - @Override - public Collection getAllCacheObject(String orgi) { - return getInstance().getMap(getName()).keySet(); - } - @Override - public Object getCacheObject(String key, String orgi, Object defaultValue) { - return getCacheObject(key, orgi); - } - @Override - public Object getCache() { - return getInstance().getMap(cacheName); - } - - @Override - public Lock getLock(String lock , String orgi) { - // TODO Auto-generated method stub - return getInstance().getLock(lock); - } - @Override - public long getSize() { - return getInstance().getMap(getName()).size(); - } - @Override - public long getAtomicLong(String cacheName) { - return getInstance().getAtomicLong(getName()).incrementAndGet(); - } - @Override - public void setAtomicLong(String cacheName, long start) { - getInstance().getAtomicLong(getName()).set(start); - } - - @Override - public JsonObject getStatics() { - // TODO Auto-generated method stub - return getInstance().getMap(getName()).getLocalMapStats().toJson(); - } -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/cache/hazelcast/impl/SystemCache.java b/contact-center/app/src/main/java/com/chatopera/cc/app/cache/hazelcast/impl/SystemCache.java deleted file mode 100644 index 80492759..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/cache/hazelcast/impl/SystemCache.java +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.cache.hazelcast.impl; - -import java.util.Collection; -import java.util.concurrent.locks.Lock; - -import com.chatopera.cc.app.cache.CacheBean; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import com.hazelcast.com.eclipsesource.json.JsonObject; -import com.hazelcast.core.HazelcastInstance; - -@Service("system_cache") -public class SystemCache implements CacheBean { - - @Autowired - public HazelcastInstance hazelcastInstance; - - private String cacheName ; - - public HazelcastInstance getInstance(){ - return hazelcastInstance ; - } - public CacheBean getCacheInstance(String cacheName){ - this.cacheName = cacheName ; - return this ; - } - - @Override - public void put(String key, Object value, String orgi) { - getInstance().getMap(getName()).put(key, value) ; - } - - @Override - public void clear(String orgi) { - getInstance().getMap(getName()).clear(); - } - - @Override - public Object delete(String key, String orgi) { - return getInstance().getMap(getName()).remove(key) ; - } - - @Override - public void update(String key, String orgi, Object value) { - getInstance().getMap(getName()).put(key, value); - } - - @Override - public Object getCacheObject(String key, String orgi) { - return getInstance().getMap(getName()).get(key); - } - - public String getName() { - return cacheName ; - } - -// @Override - public void service() throws Exception { - // TODO Auto-generated method stub - - } - - @Override - public Collection getAllCacheObject(String orgi) { - return getInstance().getMap(getName()).keySet(); - } - @Override - public Object getCacheObject(String key, String orgi, Object defaultValue) { - return getCacheObject(key, orgi); - } - @Override - public Object getCache() { - return getInstance().getMap(cacheName); - } - - @Override - public Lock getLock(String lock , String orgi) { - // TODO Auto-generated method stub - return getInstance().getLock(lock); - } - @Override - public long getSize() { - return getInstance().getMap(getName()).size(); - } - @Override - public long getAtomicLong(String cacheName) { - return getInstance().getAtomicLong(getName()).incrementAndGet(); - } - @Override - public void setAtomicLong(String cacheName, long start) { - getInstance().getAtomicLong(getName()).set(start); - } - - @Override - public JsonObject getStatics() { - // TODO Auto-generated method stub - return getInstance().getMap(getName()).getLocalMapStats().toJson(); - } -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/config/ApiConfigure.java b/contact-center/app/src/main/java/com/chatopera/cc/app/config/ApiConfigure.java deleted file mode 100644 index 71f37aaa..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/config/ApiConfigure.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.config; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import springfox.documentation.builders.ApiInfoBuilder; -import springfox.documentation.builders.PathSelectors; -import springfox.documentation.builders.RequestHandlerSelectors; -import springfox.documentation.service.ApiInfo; -import springfox.documentation.spi.DocumentationType; -import springfox.documentation.spring.web.plugins.Docket; -import springfox.documentation.swagger2.annotations.EnableSwagger2; - -@Configuration -@EnableSwagger2 -public class ApiConfigure { - - @Bean - public Docket createRestApi() { - return new Docket(DocumentationType.SWAGGER_2) - .groupName("CSKefu") - .apiInfo(apiInfo()) - .select() - .apis(RequestHandlerSelectors.basePackage("com.chatopera.cc.app.handler.api.rest")) - .paths(PathSelectors.any()) - .build(); - } - - private ApiInfo apiInfo() { - return new ApiInfoBuilder() - .title("春松客服") - .description("春松客服 基于 JAVA 语言开发,是一个全渠道融合的客户支持服务平台,聚合企业内部多个客服渠道,帮助各种行业各种规模的企业建立完整客服体系。通过将邮件、短信、电话语音、WebIM 在线客服、微信、微博、H5 页面、APP 接口等多个渠道来源的客户服务请求与对话汇聚在一个管理平台,用统一的方式来响应和支撑客户服务。") - .termsOfServiceUrl("http://docs.chatopera.com/") - .contact("春松客服") - .version("1.0.0") - .build(); - } - -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/config/ApiRequestMatchingFilter.java b/contact-center/app/src/main/java/com/chatopera/cc/app/config/ApiRequestMatchingFilter.java deleted file mode 100644 index dee5f14d..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/config/ApiRequestMatchingFilter.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.config; - -import java.io.IOException; - -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import com.chatopera.cc.app.cache.CacheHelper; -import org.apache.commons.lang.StringUtils; -import org.springframework.http.HttpStatus; -import org.springframework.security.web.util.matcher.RequestMatcher; - -import com.chatopera.cc.app.basic.MainContext; - -public class ApiRequestMatchingFilter implements Filter { - private RequestMatcher[] ignoredRequests; - - public ApiRequestMatchingFilter(RequestMatcher... matcher) { - this.ignoredRequests = matcher; - } - - public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { - HttpServletRequest request = (HttpServletRequest) req; - HttpServletResponse response = (HttpServletResponse) resp; - - String method = request.getMethod() ; - - if(!StringUtils.isBlank(method) && method.equalsIgnoreCase("options")){ - response.setHeader("Access-Control-Allow-Origin", "*"); - response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT"); - response.setHeader("Access-Control-Max-Age", "3600"); - response.setHeader("Access-Control-Allow-Headers", "x-requested-with,accept,authorization,content-type"); - response.setHeader("X-Frame-Options", "SAMEORIGIN"); - response.setStatus(HttpStatus.ACCEPTED.value()); - }else{ - boolean matchAnyRoles = false ; - for(RequestMatcher anyRequest : ignoredRequests ){ - if(anyRequest.matches(request)){ - matchAnyRoles = true ; - } - } - if(matchAnyRoles){ - String authorization = request.getHeader("authorization") ; - if(StringUtils.isBlank(authorization)){ - authorization = request.getParameter("authorization") ; - } - if(!StringUtils.isBlank(authorization) && CacheHelper.getApiUserCacheBean().getCacheObject(authorization, MainContext.SYSTEM_ORGI) != null){ - chain.doFilter(req,resp); - }else{ - response.sendRedirect("/tokens/error"); - } - }else{ - chain.doFilter(req,resp); - } - } - } - - @Override - public void destroy() { - - } - - @Override - public void init(FilterConfig arg0) throws ServletException { - - } -} \ No newline at end of file diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/config/DisruptorConfigure.java b/contact-center/app/src/main/java/com/chatopera/cc/app/config/DisruptorConfigure.java deleted file mode 100644 index 4b86ef49..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/config/DisruptorConfigure.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.config; - -import java.util.concurrent.Executor; -import java.util.concurrent.Executors; - -import com.chatopera.cc.concurrent.chatbot.ChatbotDisruptorExceptionHandler; -import com.chatopera.cc.concurrent.chatbot.ChatbotEventFactory; -import com.chatopera.cc.concurrent.chatbot.ChatbotEventHandler; -import com.chatopera.cc.concurrent.multiupdate.MultiUpdateEventFactory; -import com.chatopera.cc.concurrent.multiupdate.MultiUpdateEventHandler; -import org.springframework.context.annotation.Bean; -import org.springframework.stereotype.Component; - -import com.lmax.disruptor.SleepingWaitStrategy; -import com.lmax.disruptor.dsl.Disruptor; -import com.lmax.disruptor.dsl.ProducerType; -import com.chatopera.cc.concurrent.user.UserDataEvent; -import com.chatopera.cc.concurrent.user.UserDataEventFactory; -import com.chatopera.cc.concurrent.user.UserEventHandler; - -@Component -public class DisruptorConfigure { - @SuppressWarnings({ "unchecked", "deprecation" }) - @Bean(name="disruptor") - public Disruptor disruptor() { - Executor executor = Executors.newCachedThreadPool(); - UserDataEventFactory factory = new UserDataEventFactory(); - Disruptor disruptor = new Disruptor(factory, 1024, executor, ProducerType.SINGLE , new SleepingWaitStrategy()); - disruptor.setDefaultExceptionHandler(new UKeFuExceptionHandler()); - disruptor.handleEventsWith(new UserEventHandler()); - disruptor.start(); - return disruptor; - } - - @SuppressWarnings({ "unchecked", "deprecation" }) - @Bean(name="multiupdate") - public Disruptor multiupdate() { - Executor executor = Executors.newCachedThreadPool(); - MultiUpdateEventFactory factory = new MultiUpdateEventFactory(); - Disruptor disruptor = new Disruptor(factory, 1024, executor, ProducerType.SINGLE , new SleepingWaitStrategy()); - disruptor.handleEventsWith(new MultiUpdateEventHandler()); - disruptor.setDefaultExceptionHandler(new UKeFuExceptionHandler()); - disruptor.start(); - return disruptor; - } - - @SuppressWarnings({ "unchecked", "deprecation" }) - @Bean(name="chatbot") - public Disruptor chatbot() { - Executor executor = Executors.newCachedThreadPool(); - ChatbotEventFactory factory = new ChatbotEventFactory(); - Disruptor disruptor = new Disruptor(factory, 1024, executor, ProducerType.SINGLE , new SleepingWaitStrategy()); - disruptor.handleEventsWith(new ChatbotEventHandler()); - disruptor.setDefaultExceptionHandler(new ChatbotDisruptorExceptionHandler()); - disruptor.start(); - return disruptor; - } -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/config/IMServerConfiguration.java b/contact-center/app/src/main/java/com/chatopera/cc/app/config/IMServerConfiguration.java deleted file mode 100644 index 8f1ebfb6..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/config/IMServerConfiguration.java +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.config; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.security.NoSuchAlgorithmException; -import java.util.Properties; - -import javax.annotation.PreDestroy; - -import com.chatopera.cc.app.basic.MainContext; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Bean; - -import com.corundumstudio.socketio.AuthorizationListener; -import com.corundumstudio.socketio.Configuration; -import com.corundumstudio.socketio.HandshakeData; -import com.corundumstudio.socketio.SocketIOServer; -import com.corundumstudio.socketio.annotation.SpringAnnotationScanner; -import com.chatopera.cc.app.basic.MainUtils; -import com.chatopera.cc.exception.UCKeFuExceptionListener; - -@org.springframework.context.annotation.Configuration -public class IMServerConfiguration -{ - @Value("${uk.im.server.host}") - private String host; - - @Value("${uk.im.server.port}") - private Integer port; - - @Value("${cs.im.server.ssl.port}") - private Integer sslPort; - - @Value("${web.upload-path}") - private String path; - - @Value("${uk.im.server.threads}") - private String threads; - - private SocketIOServer server ; - - @Bean(name="webimport") - public Integer getWebIMPort() { - if(sslPort != null){ - MainContext.setWebIMPort(sslPort); - return sslPort; - } else { - MainContext.setWebIMPort(port); - return port; - } - } - - @Bean - public SocketIOServer socketIOServer() throws NoSuchAlgorithmException, IOException - { - Configuration config = new Configuration(); -// config.setHostname("localhost"); - config.setPort(port); - -// config.getSocketConfig().setReuseAddress(true); -// config.setSocketConfig(new SocketConfig()); -// config.setOrigin("*"); - config.setExceptionListener(new UCKeFuExceptionListener()); - - File sslFile = new File(path , "ssl/https.properties") ; - if(sslFile.exists()){ - Properties sslProperties = new Properties(); - FileInputStream in = new FileInputStream(sslFile); - sslProperties.load(in); - in.close(); - if(StringUtils.isNotBlank(sslProperties.getProperty("key-store")) && StringUtils.isNotBlank(sslProperties.getProperty("key-store-password"))){ - config.setKeyStorePassword(MainUtils.decryption(sslProperties.getProperty("key-store-password"))); - InputStream stream = new FileInputStream(new File(path , "ssl/"+sslProperties.getProperty("key-store"))); - config.setKeyStore(stream); - } - } - - -// config.setSSLProtocol("https"); - int workThreads = StringUtils.isNotBlank(threads) && threads.matches("[\\d]{1,6}") ? Integer.parseInt(threads) : 100 ; - config.setWorkerThreads(workThreads); -// config.setStoreFactory(new HazelcastStoreFactory()); - config.setAuthorizationListener(new AuthorizationListener() { - public boolean isAuthorized(HandshakeData data) { - return true; - } - }); - config.getSocketConfig().setReuseAddress(true); - config.getSocketConfig().setSoLinger(0); - config.getSocketConfig().setTcpNoDelay(true); - config.getSocketConfig().setTcpKeepAlive(true); - - return server = new SocketIOServer(config); - } - - @Bean - public SpringAnnotationScanner springAnnotationScanner(SocketIOServer socketServer) { - return new SpringAnnotationScanner(socketServer); - } - - @PreDestroy - public void destory() { - server.stop(); - } -} \ No newline at end of file diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/config/RedisConfigure.java b/contact-center/app/src/main/java/com/chatopera/cc/app/config/RedisConfigure.java deleted file mode 100644 index 599d55ea..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/config/RedisConfigure.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.config; - -import com.chatopera.cc.app.schedule.CallOutWireTask; -import com.chatopera.cc.app.schedule.WebIMAgentDispatcher; -import com.chatopera.cc.app.schedule.WebIMOnlineUserDispatcher; -import com.chatopera.cc.util.Constants; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; -import org.springframework.data.redis.listener.PatternTopic; -import org.springframework.data.redis.listener.RedisMessageListenerContainer; -import org.springframework.data.redis.listener.adapter.MessageListenerAdapter; - -import java.util.concurrent.Executors; - -@Configuration -public class RedisConfigure { - - - @Autowired - JedisConnectionFactory jedisConnectionFactory; - - - @Autowired - CallOutWireTask callOutWireTask; - - @Autowired - WebIMAgentDispatcher webIMAgentDispatcher; - - @Autowired - WebIMOnlineUserDispatcher webIMOnlineUserDispatcher; - - @Bean - RedisMessageListenerContainer redisContainer() { - final RedisMessageListenerContainer container = new RedisMessageListenerContainer(); - container.setConnectionFactory(jedisConnectionFactory); - container.addMessageListener(pbxMessageListener(), pbxEvents()); - container.addMessageListener(imAgentDispatchListener(), imAgentEvents()); - container.addMessageListener(imOnlineUserDispatchListener(), imOnlineUserEvents()); - container.setTaskExecutor(Executors.newFixedThreadPool(50)); - return container; - } - - @Bean - MessageListenerAdapter pbxMessageListener() { - return new MessageListenerAdapter(callOutWireTask); - } - - @Bean - PatternTopic pbxEvents() { - return new PatternTopic(Constants.FS_CHANNEL_FS_TO_CC); - } - - @Bean - MessageListenerAdapter imAgentDispatchListener() { - return new MessageListenerAdapter(webIMAgentDispatcher); - } - - @Bean - PatternTopic imAgentEvents() { - return new PatternTopic(Constants.INSTANT_MESSAGING_WEBIM_AGENT_CHANNEL); - } - - @Bean - MessageListenerAdapter imOnlineUserDispatchListener(){ - return new MessageListenerAdapter(webIMOnlineUserDispatcher); - } - - @Bean - PatternTopic imOnlineUserEvents() { - return new PatternTopic(Constants.INSTANT_MESSAGING_WEBIM_ONLINE_USER_CHANNEL); - } - - -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/config/StartedEventListener.java b/contact-center/app/src/main/java/com/chatopera/cc/app/config/StartedEventListener.java deleted file mode 100644 index 9521c88d..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/config/StartedEventListener.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.config; - -import java.util.ArrayList; -import java.util.Date; -import java.util.List; - -import com.chatopera.cc.app.basic.MainContext; -import com.chatopera.cc.app.cache.CacheHelper; -import com.chatopera.cc.app.persistence.repository.GenerationRepository; -import com.chatopera.cc.app.persistence.repository.SysDicRepository; -import com.chatopera.cc.app.persistence.repository.SystemConfigRepository; -import com.chatopera.cc.app.persistence.repository.TablePropertiesRepository; -import com.chatopera.cc.app.model.Generation; -import com.chatopera.cc.app.model.SysDic; -import com.chatopera.cc.app.basic.MainUtils; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.ApplicationListener; -import org.springframework.context.event.ContextRefreshedEvent; -import org.springframework.stereotype.Component; - -import com.chatopera.cc.app.persistence.repository.BlackListRepository; -import com.chatopera.cc.app.model.BlackEntity; -import com.chatopera.cc.app.model.SystemConfig; - -@Component -public class StartedEventListener implements ApplicationListener { - - @Value("${web.upload-path}") - private String path; - - private SysDicRepository sysDicRes; - private BlackListRepository blackListRes ; - - @Override - public void onApplicationEvent(ContextRefreshedEvent event) { - if(MainContext.getContext() == null){ - MainContext.setApplicationContext(event.getApplicationContext()); - } - sysDicRes = event.getApplicationContext().getBean(SysDicRepository.class) ; - blackListRes = event.getApplicationContext().getBean(BlackListRepository.class) ; - List sysDicList = sysDicRes.findAll() ; - - for(SysDic dic : sysDicList){ - CacheHelper.getSystemCacheBean().put(dic.getId(), dic, dic.getOrgi()); - if(dic.getParentid().equals("0")){ - List sysDicItemList = new ArrayList(); - for(SysDic item : sysDicList){ - if(item.getDicid()!=null && item.getDicid().equals(dic.getId())){ - sysDicItemList.add(item) ; - } - } - CacheHelper.getSystemCacheBean().put(dic.getCode(), sysDicItemList, dic.getOrgi()); - } - } - List blackList = blackListRes.findByOrgi(MainContext.SYSTEM_ORGI) ; - for(BlackEntity black : blackList){ - if(!StringUtils.isBlank(black.getUserid())) { - if(black.getEndtime()==null || black.getEndtime().after(new Date())){ - CacheHelper.getSystemCacheBean().put(black.getUserid(), black, black.getOrgi()); - } - } - } - /** - * 加载系统全局配置 - */ - SystemConfigRepository systemConfigRes = event.getApplicationContext().getBean(SystemConfigRepository.class) ; - SystemConfig config = systemConfigRes.findByOrgi(MainContext.SYSTEM_ORGI) ; - if(config != null){ - CacheHelper.getSystemCacheBean().put("systemConfig", config, MainContext.SYSTEM_ORGI); - } - GenerationRepository generationRes = event.getApplicationContext().getBean(GenerationRepository.class) ; - List generationList = generationRes.findAll() ; - for(Generation generation : generationList){ - CacheHelper.getSystemCacheBean().setAtomicLong(MainContext.ModelType.WORKORDERS.toString(), generation.getStartinx()); - } - - MainUtils.initSystemArea(); - - MainUtils.initSystemSecField(event.getApplicationContext().getBean(TablePropertiesRepository.class)); - //MainUtils.initAdv();//初始化广告位 - } -} \ No newline at end of file diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/handler/ApplicationController.java b/contact-center/app/src/main/java/com/chatopera/cc/app/handler/ApplicationController.java deleted file mode 100644 index d6f66ebf..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/handler/ApplicationController.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.handler; - -import javax.servlet.http.HttpServletRequest; - -import com.chatopera.cc.app.algorithm.AutomaticServiceDist; -import com.chatopera.cc.app.basic.MainContext; -import com.chatopera.cc.app.cache.CacheHelper; -import com.chatopera.cc.app.model.User; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.servlet.ModelAndView; - -@Controller -public class ApplicationController extends Handler{ - - @RequestMapping("/") - public ModelAndView admin(HttpServletRequest request) { - ModelAndView view = request(super.createRequestPageTempletResponse("/apps/index")); - User user = super.getUser(request) ; - view.addObject("agentStatusReport", AutomaticServiceDist.getAgentReport(user.getOrgi())) ; - view.addObject("tenant",super.getTenant(request)); - view.addObject("istenantshare",super.isEnabletneant()); - if(super.isEnabletneant()) { - //多租户启用 非超级管理员 一定要选择租户才能进入界面 - if(!user.isSuperuser() && StringUtils.isNotBlank(user.getOrgid()) && super.isTenantconsole() && MainContext.SYSTEM_ORGI.equals(user.getOrgi())) { - view = request(super.createRequestPageTempletResponse("redirect:/apps/tenant/index")); - } - if(StringUtils.isBlank(user.getOrgid())) { - view = request(super.createRequestPageTempletResponse("redirect:/apps/organization/add.html")); - } - } - view.addObject("agentStatus", CacheHelper.getAgentStatusCacheBean().getCacheObject(user.getId(), user.getOrgi())) ; - return view; - } -} \ No newline at end of file diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/handler/LoginController.java b/contact-center/app/src/main/java/com/chatopera/cc/app/handler/LoginController.java deleted file mode 100644 index f57d6f05..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/handler/LoginController.java +++ /dev/null @@ -1,317 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.handler; - -import com.chatopera.cc.app.basic.MainContext; -import com.chatopera.cc.app.basic.MainUtils; -import com.chatopera.cc.app.cache.CacheHelper; -import com.chatopera.cc.app.model.*; -import com.chatopera.cc.app.persistence.repository.OrganRepository; -import com.chatopera.cc.app.persistence.repository.RoleAuthRepository; -import com.chatopera.cc.app.persistence.repository.UserRepository; -import com.chatopera.cc.app.persistence.repository.UserRoleRepository; -import com.chatopera.cc.util.Menu; -import com.chatopera.cc.util.OnlineUserUtils; -import org.apache.commons.lang.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.jpa.domain.Specification; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestHeader; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.servlet.ModelAndView; - -import javax.persistence.criteria.CriteriaBuilder; -import javax.persistence.criteria.CriteriaQuery; -import javax.persistence.criteria.Predicate; -import javax.persistence.criteria.Root; -import javax.servlet.http.Cookie; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; -import java.security.NoSuchAlgorithmException; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; - -/** - * @author UK - * @version 1.0.0 - */ -@Controller -public class LoginController extends Handler { - private final static Logger logger = LoggerFactory.getLogger(LoginController.class); - - @Autowired - private UserRepository userRepository; - - @Autowired - private UserRoleRepository userRoleRes; - - @Autowired - private RoleAuthRepository roleAuthRes; - - @Autowired - private OrganRepository organRepository; - - /** - * 获取一个用户所拥有的所有部门ID - * - * @param user - */ - private void organs(final User user, final String organ) { - if (organ == null) - return; - - if (user.inMyorgans(organ)) - return; - - user.getMyorgans().add(organ); - List y = organRepository.findByOrgiAndParent(user.getOrgi(), organ); - for (Organ x : y) { - try { - organs(user, x.getId()); - } catch (Exception e) { - logger.error("organs", e); - } - } - } - - @RequestMapping(value = "/login", method = RequestMethod.GET) - @Menu(type = "apps", subtype = "user", access = true) - public ModelAndView login(HttpServletRequest request, HttpServletResponse response, @RequestHeader(value = "referer", required = false) String referer, @Valid String msg) throws NoSuchAlgorithmException { - ModelAndView view = request(super.createRequestPageTempletResponse("redirect:/")); - if (request.getSession(true).getAttribute(MainContext.USER_SESSION_NAME) == null) { - view = request(super.createRequestPageTempletResponse("/login")); - if (!StringUtils.isBlank(request.getParameter("referer"))) { - referer = request.getParameter("referer"); - } - if (!StringUtils.isBlank(referer)) { - view.addObject("referer", referer); - } - Cookie[] cookies = request.getCookies();//这样便可以获取一个cookie数组 - if (cookies != null) { - for (Cookie cookie : cookies) { - if (cookie != null && !StringUtils.isBlank(cookie.getName()) && !StringUtils.isBlank(cookie.getValue())) { - if (cookie.getName().equals(MainContext.UKEFU_SYSTEM_COOKIES_FLAG)) { - String flagid = MainUtils.decryption(cookie.getValue()); - if (!StringUtils.isBlank(flagid)) { - User user = userRepository.findById(flagid); - if (user != null) { - view = this.processLogin(request, response, view, user, referer); - } - } - } - } - } - } - } - if (!StringUtils.isBlank(msg)) { - view.addObject("msg", msg); - } - SystemConfig systemConfig = MainUtils.getSystemConfig(); - if (systemConfig != null && systemConfig.isEnableregorgi()) { - view.addObject("show", true); - } - if (systemConfig != null) { - view.addObject("systemConfig", systemConfig); - } - return view; - } - - @RequestMapping(value = "/login", method = RequestMethod.POST) - @Menu(type = "apps", subtype = "user", access = true) - public ModelAndView login(HttpServletRequest request, HttpServletResponse response, @Valid User user, @Valid String referer, @Valid String sla) throws NoSuchAlgorithmException { - ModelAndView view = request(super.createRequestPageTempletResponse("redirect:/")); - if (request.getSession(true).getAttribute(MainContext.USER_SESSION_NAME) == null) { - if (user != null && user.getUsername() != null) { - final User loginUser = userRepository.findByUsernameAndPasswordAndDatastatus(user.getUsername(), MainUtils.md5(user.getPassword()), false); - if (loginUser != null && !StringUtils.isBlank(loginUser.getId())) { - view = this.processLogin(request, response, view, loginUser, referer); - if (!StringUtils.isBlank(sla) && sla.equals("1")) { - Cookie flagid = new Cookie(MainContext.UKEFU_SYSTEM_COOKIES_FLAG, MainUtils.encryption(loginUser.getId())); - flagid.setMaxAge(7 * 24 * 60 * 60); - response.addCookie(flagid); - // add authorization code for rest api - String auth = MainUtils.getUUID(); - CacheHelper.getApiUserCacheBean().put(auth, loginUser, MainContext.SYSTEM_ORGI); - response.addCookie((new Cookie("authorization", auth))); - } - } else { - view = request(super.createRequestPageTempletResponse("/login")); - if (!StringUtils.isBlank(referer)) { - view.addObject("referer", referer); - } - view.addObject("msg", "0"); - } - } - } - SystemConfig systemConfig = MainUtils.getSystemConfig(); - if (systemConfig != null && systemConfig.isEnableregorgi()) { - view.addObject("show", true); - } - if (systemConfig != null) { - view.addObject("systemConfig", systemConfig); - } - return view; - } - - private ModelAndView processLogin(HttpServletRequest request, HttpServletResponse response, ModelAndView view, final User loginUser, String referer) { - if (loginUser != null) { - loginUser.setLogin(true); - if (!StringUtils.isBlank(referer)) { - view = request(super.createRequestPageTempletResponse("redirect:" + referer)); - } else { - view = request(super.createRequestPageTempletResponse("redirect:/")); - } - //登录成功 判断是否进入多租户页面 - SystemConfig systemConfig = MainUtils.getSystemConfig(); - if (systemConfig != null && systemConfig.isEnabletneant() && systemConfig.isTenantconsole() && !loginUser.isSuperuser()) { - view = request(super.createRequestPageTempletResponse("redirect:/apps/tenant/index")); - } - List userRoleList = userRoleRes.findByOrgiAndUser(loginUser.getOrgi(), loginUser); - if (userRoleList != null && userRoleList.size() > 0) { - for (UserRole userRole : userRoleList) { - loginUser.getRoleList().add(userRole.getRole()); - } - } - - // 获取用户部门以及下级部门 - organs(loginUser, loginUser.getOrgan()); // 添加部门到myorgans中 - - // 获取用户的角色权限,进行授权 - List roleAuthList = roleAuthRes.findAll(new Specification() { - @Override - public Predicate toPredicate(Root root, CriteriaQuery query, - CriteriaBuilder cb) { - List list = new ArrayList(); - if (loginUser.getRoleList() != null && loginUser.getRoleList().size() > 0) { - for (Role role : loginUser.getRoleList()) { - list.add(cb.equal(root.get("roleid").as(String.class), role.getId())); - } - } - Predicate[] p = new Predicate[list.size()]; - cb.and(cb.equal(root.get("orgi").as(String.class), loginUser.getOrgi())); - return cb.or(list.toArray(p)); - } - }); - - if (roleAuthList != null) { - for (RoleAuth roleAuth : roleAuthList) { - loginUser.getRoleAuthMap().put(roleAuth.getDicvalue(), true); - } - } - - loginUser.setLastlogintime(new Date()); - if (!StringUtils.isBlank(loginUser.getId())) { - userRepository.save(loginUser); - } - - super.setUser(request, loginUser); - //当前用户 企业id为空 调到创建企业页面 - if (StringUtils.isBlank(loginUser.getOrgid())) { - view = request(super.createRequestPageTempletResponse("redirect:/apps/organization/add.html")); - } - } - return view; - } - - @RequestMapping("/logout") - public String logout(HttpServletRequest request, HttpServletResponse response) { - request.getSession().removeAttribute(MainContext.USER_SESSION_NAME); - Cookie[] cookies = request.getCookies(); - if (cookies != null) { - for (Cookie cookie : cookies) { - if (cookie != null && !StringUtils.isBlank(cookie.getName()) && !StringUtils.isBlank(cookie.getValue())) { - if (cookie.getName().equals(MainContext.UKEFU_SYSTEM_COOKIES_FLAG)) { - cookie.setMaxAge(0); - response.addCookie(cookie); - } - } - } - } - return "redirect:/"; - } - - @RequestMapping(value = "/register") - @Menu(type = "apps", subtype = "user", access = true) - public ModelAndView register(HttpServletRequest request, HttpServletResponse response, @Valid String msg) { - ModelAndView view = request(super.createRequestPageTempletResponse("redirect:/")); - if (request.getSession(true).getAttribute(MainContext.USER_SESSION_NAME) == null) { - view = request(super.createRequestPageTempletResponse("/register")); - } - if (!StringUtils.isBlank(msg)) { - view.addObject("msg", msg); - } - return view; - } - - @RequestMapping("/addAdmin") - @Menu(type = "apps", subtype = "user", access = true) - public ModelAndView addAdmin(HttpServletRequest request, HttpServletResponse response, @Valid User user) { - String msg = ""; - msg = validUser(user); - if (!StringUtils.isBlank(msg)) { - return request(super.createRequestPageTempletResponse("redirect:/register.html?msg=" + msg)); - } else { - user.setUname(user.getUsername()); - user.setUsertype("0"); - if (!StringUtils.isBlank(user.getPassword())) { - user.setPassword(MainUtils.md5(user.getPassword())); - } - user.setOrgi(super.getOrgiByTenantshare(request)); - /*if(!StringUtils.isBlank(super.getUser(request).getOrgid())) { - user.setOrgid(super.getUser(request).getOrgid()); - }else { - user.setOrgid(MainContext.SYSTEM_ORGI); - }*/ - userRepository.save(user); - OnlineUserUtils.clean(super.getOrgi(request)); - - } - ModelAndView view = this.processLogin(request, response, request(super.createRequestPageTempletResponse("redirect:/")), user, ""); - //当前用户 企业id为空 调到创建企业页面 - if (StringUtils.isBlank(user.getOrgid())) { - view = request(super.createRequestPageTempletResponse("redirect:/apps/organization/add.html")); - } - return view; - } - - private String validUser(User user) { - String msg = ""; - User tempUser = userRepository.findByUsernameAndDatastatus(user.getUsername(), false); - if (tempUser != null) { - msg = "username_exist"; - return msg; - } - tempUser = userRepository.findByEmailAndDatastatus(user.getEmail(), false); - if (tempUser != null) { - msg = "email_exist"; - return msg; - } - tempUser = userRepository.findByMobileAndDatastatus(user.getMobile(), false); - if (tempUser != null) { - msg = "mobile_exist"; - return msg; - } - return msg; - } - - -} \ No newline at end of file diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/handler/admin/AdminController.java b/contact-center/app/src/main/java/com/chatopera/cc/app/handler/admin/AdminController.java deleted file mode 100644 index 68368319..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/handler/admin/AdminController.java +++ /dev/null @@ -1,181 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.handler.admin; - -import java.util.ArrayList; -import java.util.Date; -import java.util.List; - -import javax.servlet.http.HttpServletRequest; -import javax.validation.Valid; - -import com.chatopera.cc.app.algorithm.AutomaticServiceDist; -import com.chatopera.cc.app.basic.MainContext; -import com.chatopera.cc.app.basic.MainUtils; -import com.chatopera.cc.util.Menu; -import com.chatopera.cc.app.im.client.NettyClients; -import com.chatopera.cc.app.cache.CacheHelper; -import com.chatopera.cc.app.persistence.repository.OnlineUserRepository; -import com.chatopera.cc.app.persistence.repository.SysDicRepository; -import com.chatopera.cc.app.persistence.repository.UserEventRepository; -import com.chatopera.cc.util.OnlineUserUtils; -import com.chatopera.cc.app.model.SysDic; -import com.chatopera.cc.app.model.User; -import org.apache.commons.lang.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.ui.ModelMap; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.servlet.ModelAndView; - -import com.chatopera.cc.app.persistence.repository.UserRepository; -import com.chatopera.cc.app.handler.Handler; - -@Controller -public class AdminController extends Handler{ - - @Autowired - private UserRepository userRes; - - @Autowired - private OnlineUserRepository onlineUserRes; - - @Autowired - private UserEventRepository userEventRes ; - - @Autowired - private SysDicRepository sysDicRes ; - - @RequestMapping("/admin") - public ModelAndView index(ModelMap map ,HttpServletRequest request) { - ModelAndView view = request(super.createRequestPageTempletResponse("redirect:/")); - User user = super.getUser(request) ; - view.addObject("agentStatusReport", AutomaticServiceDist.getAgentReport(user.getOrgi())) ; - view.addObject("agentStatus", CacheHelper.getAgentStatusCacheBean().getCacheObject(user.getId(), user.getOrgi())) ; - - return view; - } - - - private void aggValues(ModelMap map , HttpServletRequest request){ - map.put("onlineUserCache", CacheHelper.getOnlineUserCacheBean().getSize()) ; - map.put("onlineUserClients", OnlineUserUtils.webIMClients.size()) ; - map.put("chatClients", NettyClients.getInstance().size()) ; - map.put("systemCaches", CacheHelper.getSystemCacheBean().getSize()) ; - - map.put("agentReport", AutomaticServiceDist.getAgentReport(super.getOrgi(request))) ; - map.put("webIMReport", MainUtils.getWebIMReport(userEventRes.findByOrgiAndCreatetimeRange(super.getOrgi(request), MainUtils.getStartTime() , MainUtils.getEndTime()))) ; - - map.put("agents",getAgent(request).size()) ; - - map.put("webIMInvite", MainUtils.getWebIMInviteStatus(onlineUserRes.findByOrgiAndStatus(super.getOrgi(request), MainContext.OnlineUserOperatorStatus.ONLINE.toString()))) ; - - map.put("inviteResult", MainUtils.getWebIMInviteResult(onlineUserRes.findByOrgiAndAgentnoAndCreatetimeRange(super.getOrgi(request), super.getUser(request).getId() , MainUtils.getStartTime() , MainUtils.getEndTime()))) ; - - map.put("agentUserCount", onlineUserRes.countByAgentForAgentUser(super.getOrgi(request), MainContext.AgentUserStatusEnum.INSERVICE.toString(),super.getUser(request).getId() , MainUtils.getStartTime() , MainUtils.getEndTime())) ; - - map.put("agentServicesCount", onlineUserRes.countByAgentForAgentUser(super.getOrgi(request), MainContext.AgentUserStatusEnum.END.toString(),super.getUser(request).getId() , MainUtils.getStartTime() , MainUtils.getEndTime())) ; - - map.put("agentServicesAvg", onlineUserRes.countByAgentForAvagTime(super.getOrgi(request), MainContext.AgentUserStatusEnum.END.toString(),super.getUser(request).getId() , MainUtils.getStartTime() , MainUtils.getEndTime())) ; - - map.put("webInviteReport", MainUtils.getWebIMInviteAgg(onlineUserRes.findByOrgiAndCreatetimeRange(super.getOrgi(request) , MainContext.ChannelTypeEnum.WEBIM.toString(), MainUtils.getLast30Day(), MainUtils.getEndTime()))) ; - - map.put("agentConsultReport", MainUtils.getWebIMDataAgg(onlineUserRes.findByOrgiAndCreatetimeRangeForAgent(super.getOrgi(request), MainUtils.getLast30Day(), MainUtils.getEndTime()))) ; - - map.put("clentConsultReport", MainUtils.getWebIMDataAgg(onlineUserRes.findByOrgiAndCreatetimeRangeForClient(super.getOrgi(request), MainUtils.getLast30Day(), MainUtils.getEndTime() , MainContext.ChannelTypeEnum.WEBIM.toString()))) ; - - map.put("browserConsultReport", MainUtils.getWebIMDataAgg(onlineUserRes.findByOrgiAndCreatetimeRangeForBrowser(super.getOrgi(request), MainUtils.getLast30Day(), MainUtils.getEndTime(), MainContext.ChannelTypeEnum.WEBIM.toString()))) ; - } - private List getAgent(HttpServletRequest request){ - //获取当前产品or租户坐席数 - List userList = new ArrayList<>(); - if(super.isEnabletneant()) { - userList = userRes.findByOrgidAndAgentAndDatastatus(super.getOrgid(request), true, false); - }else { - userList = userRes.findByOrgiAndAgentAndDatastatus(super.getOrgi(request), true, false); - } - return userList.isEmpty()?new ArrayList():userList; - } - - @RequestMapping("/admin/content") - @Menu(type = "admin" , subtype = "content") - public ModelAndView content(ModelMap map , HttpServletRequest request) { - aggValues(map, request); - return request(super.createAdminTempletResponse("/admin/content")); - /*if(super.getUser(request).isSuperuser()) { - aggValues(map, request); - return request(super.createAdminTempletResponse("/admin/content")); - }else { - return request(super.createAdminTempletResponse("/admin/user/index")); - }*/ - } - - @RequestMapping("/admin/auth/infoacq") - @Menu(type = "admin" , subtype = "infoacq" , access= false , admin = true) - public ModelAndView infoacq(ModelMap map , HttpServletRequest request) { - String inacq = (String) request.getSession().getAttribute(MainContext.UKEFU_SYSTEM_INFOACQ) ; - if(!StringUtils.isBlank(inacq)){ - request.getSession().removeAttribute(MainContext.UKEFU_SYSTEM_INFOACQ); - }else{ - request.getSession().setAttribute(MainContext.UKEFU_SYSTEM_INFOACQ , "true"); - } - return request(super.createRequestPageTempletResponse("redirect:/")); - } - - @RequestMapping("/admin/auth/event") - @Menu(type = "admin" , subtype = "authevent") - public ModelAndView authevent(ModelMap map , HttpServletRequest request , @Valid String title , @Valid String url , @Valid String iconstr, @Valid String icontext) { - map.addAttribute("title", title) ; - map.addAttribute("url", url) ; - if(!StringUtils.isBlank(iconstr) && !StringUtils.isBlank(icontext)){ - map.addAttribute("iconstr", iconstr.replaceAll(icontext, "&#x"+ MainUtils.string2HexString(icontext)+";")) ; - } - return request(super.createRequestPageTempletResponse("/admin/system/auth/exchange")); - } - - @RequestMapping("/admin/auth/save") - @Menu(type = "admin" , subtype = "authsave") - public ModelAndView authsave(ModelMap map , HttpServletRequest request , @Valid String title , @Valid SysDic dic) { - SysDic sysDic = sysDicRes.findByCode(MainContext.UKEFU_SYSTEM_AUTH_DIC) ; - boolean newdic = false ; - if(sysDic!=null && !StringUtils.isBlank(dic.getName())){ - if(!StringUtils.isBlank(dic.getParentid())){ - if(dic.getParentid().equals("0")){ - dic.setParentid(sysDic.getId()); - newdic = true ; - }else{ - List dicList = sysDicRes.findByDicid(sysDic.getId()) ; - for(SysDic temp : dicList){ - if(temp.getCode().equals(dic.getParentid()) || temp.getName().equals(dic.getParentid())){ - dic.setParentid(temp.getId()); - newdic = true ; - } - } - } - } - if(newdic){ - dic.setCreater(super.getUser(request).getId()); - dic.setCreatetime(new Date()); - dic.setCtype("auth"); - dic.setDicid(sysDic.getId()); - sysDicRes.save(dic) ; - } - } - return request(super.createRequestPageTempletResponse("/public/success")); - } - -} \ No newline at end of file diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/handler/admin/callcenter/CallCenterController.java b/contact-center/app/src/main/java/com/chatopera/cc/app/handler/admin/callcenter/CallCenterController.java deleted file mode 100644 index 8c764f87..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/handler/admin/callcenter/CallCenterController.java +++ /dev/null @@ -1,168 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.handler.admin.callcenter; - -import java.util.List; - -import javax.servlet.http.HttpServletRequest; -import javax.validation.Valid; - -import com.chatopera.cc.app.basic.MainContext; -import com.chatopera.cc.util.Menu; -import com.chatopera.cc.exchange.CallCenterInterface; -import com.chatopera.cc.app.persistence.repository.PbxHostRepository; -import com.chatopera.cc.app.handler.Handler; -import com.chatopera.cc.app.model.PbxHost; -import org.apache.commons.lang.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.ui.ModelMap; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.servlet.ModelAndView; - -@Controller -@RequestMapping("/admin/callcenter") -public class CallCenterController extends Handler { - - @Autowired - private PbxHostRepository pbxHostRes ; - - @RequestMapping(value = "/index") - @Menu(type = "callcenter" , subtype = "callcenter" , access = false , admin = true) - public ModelAndView index(ModelMap map , HttpServletRequest request , @Valid String msg) { - List pbxHostList = pbxHostRes.findByOrgi(super.getOrgi(request)) ; - if(MainContext.model.get("callcenter")!=null){ - CallCenterInterface callCenterImpl = (CallCenterInterface) MainContext.getContext().getBean("callcenter") ; - - for(PbxHost pbxHost : pbxHostList){ - if(callCenterImpl!=null){ - pbxHost.setConnected(callCenterImpl.connected(pbxHost.getId())); - } - } - } - map.addAttribute("pbxHostList" , pbxHostList); - return request(super.createAdminTempletResponse("/admin/callcenter/index")); - } - - @RequestMapping(value = "/pbxhost") - @Menu(type = "callcenter" , subtype = "pbxhost" , access = false , admin = true) - public ModelAndView pbxhost(ModelMap map , HttpServletRequest request) { - List pbxHostList = pbxHostRes.findByOrgi(super.getOrgi(request)) ; - if(MainContext.model.get("callcenter")!=null){ - CallCenterInterface callCenterImpl = (CallCenterInterface) MainContext.getContext().getBean("callcenter") ; - - for(PbxHost pbxHost : pbxHostList){ - if(callCenterImpl!=null){ - pbxHost.setConnected(callCenterImpl.connected(pbxHost.getId())); - } - } - } - map.addAttribute("pbxHostList" , pbxHostList); - return request(super.createRequestPageTempletResponse("/admin/callcenter/pbxhost/index")); - } - - @RequestMapping(value = "/pbxhost/add") - @Menu(type = "callcenter" , subtype = "pbxhost" , access = false , admin = true) - public ModelAndView pbxhostadd(ModelMap map , HttpServletRequest request) { - return request(super.createRequestPageTempletResponse("/admin/callcenter/pbxhost/add")); - } - - @RequestMapping(value = "/pbxhost/save") - @Menu(type = "callcenter" , subtype = "pbxhost" , access = false , admin = true) - public ModelAndView pbxhostsave(ModelMap map , HttpServletRequest request , @Valid PbxHost pbxHost) { - ModelAndView view = request(super.createRequestPageTempletResponse("redirect:/admin/callcenter/pbxhost.html")); - String msg = null ; - if(!StringUtils.isBlank(pbxHost.getName())){ - int count = pbxHostRes.countByHostnameAndOrgi(pbxHost.getHostname(), super.getOrgi(request)) ; - if(count == 0){ - pbxHost.setOrgi(super.getOrgi(request)); - pbxHost.setCreater(super.getUser(request).getId()); - pbxHostRes.save(pbxHost) ; - if(MainContext.model.get("callcenter")!=null){ - CallCenterInterface callCenterImpl = (CallCenterInterface) MainContext.getContext().getBean("callcenter") ; - if(callCenterImpl!=null){ - try{ - callCenterImpl.init(pbxHost); - }catch(Exception ex){ - msg = ex.getMessage() ; - ex.printStackTrace(); - } - } - } - } - } - if(!StringUtils.isBlank(msg)){ - view = request(super.createRequestPageTempletResponse("redirect:/admin/callcenter/pbxhost.html?msg="+msg)); - } - return view; - } - - @RequestMapping(value = "/pbxhost/edit") - @Menu(type = "callcenter" , subtype = "pbxhost" , access = false , admin = true) - public ModelAndView pbxhostedit(ModelMap map , HttpServletRequest request , @Valid String id) { - map.addAttribute("pbxHost" , pbxHostRes.findByIdAndOrgi(id, super.getOrgi(request))); - return request(super.createRequestPageTempletResponse("/admin/callcenter/pbxhost/edit")); - } - - @RequestMapping(value = "/pbxhost/update") - @Menu(type = "callcenter" , subtype = "pbxhost" , access = false , admin = true) - public ModelAndView pbxhostupdate(ModelMap map , HttpServletRequest request , @Valid PbxHost pbxHost) { - ModelAndView view = request(super.createRequestPageTempletResponse("redirect:/admin/callcenter/pbxhost.html")); - String msg = null ; - if(!StringUtils.isBlank(pbxHost.getId())){ - PbxHost destHost = pbxHostRes.findByIdAndOrgi(pbxHost.getId(), super.getOrgi(request)) ; - destHost.setHostname(pbxHost.getHostname()); - destHost.setIpaddr(pbxHost.getIpaddr()); - destHost.setName(pbxHost.getName()); - destHost.setPort(pbxHost.getPort()); - if(!StringUtils.isBlank(pbxHost.getPassword())){ - destHost.setPassword(pbxHost.getPassword()); - } - pbxHostRes.save(destHost) ; - if(MainContext.model.get("callcenter")!=null){ - CallCenterInterface callCenterImpl = (CallCenterInterface) MainContext.getContext().getBean("callcenter") ; - if(callCenterImpl!=null){ - try{ - callCenterImpl.init(destHost); - }catch(Exception ex){ - msg = ex.getMessage() ; - ex.printStackTrace(); - } - } - } - } - if(!StringUtils.isBlank(msg)){ - view = request(super.createRequestPageTempletResponse("redirect:/admin/callcenter/pbxhost.html?msg="+msg)); - } - return view; - } - - @RequestMapping(value = "/pbxhost/delete") - @Menu(type = "callcenter" , subtype = "pbxhost" , access = false , admin = true) - public ModelAndView mediadelete(ModelMap map , HttpServletRequest request , @Valid String id) { - if(!StringUtils.isBlank(id)){ - pbxHostRes.delete(id); - if(MainContext.model.get("callcenter")!=null){ - CallCenterInterface callCenterImpl = (CallCenterInterface) MainContext.getContext().getBean("callcenter") ; - if(callCenterImpl!=null){ - callCenterImpl.remove(id); - } - } - } - return request(super.createRequestPageTempletResponse("redirect:/admin/callcenter/pbxhost.html")); - } -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/handler/admin/callcenter/CallCenterExtentionController.java b/contact-center/app/src/main/java/com/chatopera/cc/app/handler/admin/callcenter/CallCenterExtentionController.java deleted file mode 100644 index 0ad89c3e..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/handler/admin/callcenter/CallCenterExtentionController.java +++ /dev/null @@ -1,252 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.handler.admin.callcenter; - -import java.util.Date; -import java.util.List; - -import javax.servlet.http.HttpServletRequest; -import javax.validation.Valid; - -import com.chatopera.cc.util.Menu; -import com.chatopera.cc.app.cache.CacheHelper; -import com.chatopera.cc.app.persistence.repository.PbxHostRepository; -import com.chatopera.cc.app.persistence.repository.ProductRepository; -import com.chatopera.cc.app.model.PbxHost; -import com.chatopera.cc.app.model.User; -import org.apache.commons.lang.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.ui.ModelMap; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.servlet.ModelAndView; - -import com.chatopera.cc.util.freeswitch.model.CallCenterAgent; -import com.chatopera.cc.app.persistence.impl.CallOutQuene; -import com.chatopera.cc.app.persistence.repository.ExtentionRepository; -import com.chatopera.cc.app.persistence.repository.MediaRepository; -import com.chatopera.cc.app.persistence.repository.QueSurveyProcessRepository; -import com.chatopera.cc.app.persistence.repository.ServiceAiRepository; -import com.chatopera.cc.app.persistence.repository.SipTrunkRepository; -import com.chatopera.cc.app.handler.Handler; -import com.chatopera.cc.app.model.Extention; - -@Controller -@RequestMapping("/admin/callcenter") -public class CallCenterExtentionController extends Handler{ - - @Autowired - private PbxHostRepository pbxHostRes ; - - @Autowired - private ExtentionRepository extentionRes; - - @Autowired - private SipTrunkRepository sipTrunkRes ; - - @Autowired - private MediaRepository mediaRes ; - - @Autowired - private ServiceAiRepository serviceAiRes ; - - @Autowired - private ProductRepository productRes ; - - @Autowired - private QueSurveyProcessRepository queSurveyProcessRes ; - - - @RequestMapping(value = "/extention") - @Menu(type = "callcenter" , subtype = "callcenterresource" , access = false , admin = true) - public ModelAndView extention(ModelMap map , HttpServletRequest request , @Valid String hostid) { - List pbxHostList = pbxHostRes.findByOrgi(super.getOrgi(request)) ; - map.addAttribute("pbxHostList" , pbxHostList); - PbxHost pbxHost = null ; - if(pbxHostList.size() > 0){ - map.addAttribute("pbxHost" , pbxHost = getPbxHost(pbxHostList, hostid)); - map.addAttribute("extentionList" , extentionRes.findByHostidAndOrgi(pbxHost.getId() , super.getOrgi(request))); - } - return request(super.createRequestPageTempletResponse("/admin/callcenter/extention/index")); - } - - private PbxHost getPbxHost(List pbxHostList ,String hostid){ - PbxHost pbxHost = pbxHostList.get(0) ; - if(!StringUtils.isBlank(hostid)){ - for(PbxHost pbx : pbxHostList){ - if(pbx.getId().equals(hostid)){ - pbxHost = pbx; break ; - } - } - } - return pbxHost ; - } - - @RequestMapping(value = "/extention/add") - @Menu(type = "callcenter" , subtype = "extention" , access = false , admin = true) - public ModelAndView extentionadd(ModelMap map , HttpServletRequest request , @Valid String hostid) { - map.put("pbxHost", pbxHostRes.findByIdAndOrgi(hostid, super.getOrgi(request))) ; - - map.addAttribute("sipTrunkListList" , sipTrunkRes.findByHostidAndOrgi(hostid, super.getOrgi(request))); - - map.put("mediaList" , mediaRes.findByHostidAndOrgi(hostid, super.getOrgi(request))); - return request(super.createRequestPageTempletResponse("/admin/callcenter/extention/add")); - } - - @RequestMapping(value = "/extention/save") - @Menu(type = "callcenter" , subtype = "extention" , access = false , admin = true) - public ModelAndView extentionsave(ModelMap map , HttpServletRequest request , @Valid Extention extention) { - if(!StringUtils.isBlank(extention.getExtention()) && !StringUtils.isBlank(extention.getPassword())){ - String[] extstr = extention.getExtention().split("[,, ]") ; - int extnum = 0 ; - for(String ext : extstr){ - if(ext.matches("[\\d]{3,8}")){ //分机号码最少3位数字 - createNewExtention(ext, super.getUser(request), extention.getHostid(), extention.getPassword(), super.getOrgi(request) , extention) ; - }else{ - String[] ph = ext.split("[~-]") ; - if(ph.length == 2 && ph[0].matches("[\\d]{3,8}") && ph[1].matches("[\\d]{3,8}") && ph[0].length() == ph[1].length()){ - int start = Integer.parseInt(ph[0]) ; - int end = Integer.parseInt(ph[1]) ; - - for(int i= start ; i <= end && extnum < 100 ; i++){ //最大一次批量生产的 分机号不超过100个 - createNewExtention(String.valueOf(i), super.getUser(request), extention.getHostid(), extention.getPassword(), super.getOrgi(request) , extention) ; - } - } - } - } - } - return request(super.createRequestPageTempletResponse("redirect:/admin/callcenter/extention.html?hostid="+extention.getHostid())); - } - - private Extention createNewExtention(String num , User user , String hostid , String password , String orgi , Extention src){ - Extention extno = new Extention(); - extno.setExtention(num); - extno.setOrgi(orgi); - extno.setCreater(user.getId()); - extno.setHostid(hostid); - extno.setPassword(password); - - extno.setPlaynum(src.isPlaynum()); - extno.setCallout(src.isCallout()); - extno.setRecord(src.isRecord()); - extno.setExtype(src.getExtype()); - extno.setMediapath(src.getMediapath()); - - extno.setSiptrunk(src.getSiptrunk()); - extno.setEnablewebrtc(src.isEnablewebrtc()); - int count = extentionRes.countByExtentionAndHostidAndOrgi(extno.getExtention() , hostid, orgi) ; - if(count == 0){ - extentionRes.save(extno) ; - } - return extno ; - } - - @RequestMapping(value = "/extention/edit") - @Menu(type = "callcenter" , subtype = "extention" , access = false , admin = true) - public ModelAndView extentionedit(ModelMap map , HttpServletRequest request , @Valid String id , @Valid String hostid) { - map.addAttribute("extention" , extentionRes.findByIdAndOrgi(id, super.getOrgi(request))); - map.put("pbxHost", pbxHostRes.findByIdAndOrgi(hostid, super.getOrgi(request))) ; - map.put("mediaList" , mediaRes.findByHostidAndOrgi(hostid, super.getOrgi(request))); - map.addAttribute("sipTrunkListList" , sipTrunkRes.findByHostidAndOrgi(hostid, super.getOrgi(request))); - - return request(super.createRequestPageTempletResponse("/admin/callcenter/extention/edit")); - } - - @RequestMapping(value = "/extention/update") - @Menu(type = "callcenter" , subtype = "extention" , access = false , admin = true) - public ModelAndView extentionupdate(ModelMap map , HttpServletRequest request , @Valid Extention extention) { - if(!StringUtils.isBlank(extention.getId())){ - Extention ext = extentionRes.findByIdAndOrgi(extention.getId(), super.getOrgi(request)) ; - if(ext!=null){ -// ext.setExtention(extention.getExtention());//分机号不能修改 - if(!StringUtils.isBlank(extention.getPassword())){ - ext.setPassword(extention.getPassword()); - } - ext.setPlaynum(extention.isPlaynum()); - ext.setCallout(extention.isCallout()); - ext.setRecord(extention.isRecord()); - ext.setExtype(extention.getExtype()); - ext.setSubtype(extention.getSubtype()); - ext.setDescription(extention.getDescription()); - - ext.setMediapath(extention.getMediapath()); - - ext.setSiptrunk(extention.getSiptrunk()); - ext.setEnablewebrtc(extention.isEnablewebrtc()); - - ext.setUpdatetime(new Date()); - extentionRes.save(ext) ; - - List callOutAgentList = CallOutQuene.extention(ext.getExtention()) ; - for(CallCenterAgent callOutAgent : callOutAgentList) { - callOutAgent.setSiptrunk(ext.getSiptrunk()); - CacheHelper.getCallCenterAgentCacheBean().put(callOutAgent.getUserid(), callOutAgent, callOutAgent.getOrgi()); - } - } - } - return request(super.createRequestPageTempletResponse("redirect:/admin/callcenter/extention.html?hostid="+extention.getHostid())); - } - - @RequestMapping(value = "/extention/ivr") - @Menu(type = "callcenter" , subtype = "extention" , access = false , admin = true) - public ModelAndView ivr(ModelMap map , HttpServletRequest request , @Valid String id , @Valid String hostid) { - map.addAttribute("extention" , extentionRes.findByIdAndOrgi(id, super.getOrgi(request))); - map.put("pbxHost", pbxHostRes.findByIdAndOrgi(hostid, super.getOrgi(request))) ; - map.put("mediaList" , mediaRes.findByHostidAndOrgi(hostid, super.getOrgi(request))); - map.addAttribute("sipTrunkListList" , sipTrunkRes.findByHostidAndOrgi(hostid, super.getOrgi(request))); - - map.put("serviceAiList",serviceAiRes.findByOrgi(super.getOrgi(request)) ) ; - map.put("queList",queSurveyProcessRes.findByOrgi(super.getOrgi(request)) ) ; - map.put("productList",productRes.findByOrgi(super.getOrgi(request)) ) ; - - return request(super.createRequestPageTempletResponse("/admin/callcenter/extention/ivr")); - } - - @RequestMapping(value = "/extention/ivr/update") - @Menu(type = "callcenter" , subtype = "extention" , access = false , admin = true) - public ModelAndView ivrupdate(ModelMap map , HttpServletRequest request , @Valid Extention extention) { - if(!StringUtils.isBlank(extention.getId())){ - Extention ext = extentionRes.findByIdAndOrgi(extention.getId(), super.getOrgi(request)) ; - if(ext!=null){ - - ext.setEnableai(extention.getEnableai()); - ext.setAiid(extention.getAiid()); - ext.setSceneid(extention.getSceneid()); - ext.setWelcomemsg(extention.getWelcomemsg()) ; - ext.setWaitmsg(extention.getWaitmsg()) ; - ext.setTipmessage(extention.getTipmessage()); - - ext.setAitype(extention.getAitype()); - ext.setBustype(extention.getBustype()); - ext.setProid(extention.getProid()); - ext.setQueid(extention.getQueid()); - - extentionRes.save(ext) ; - } - } - return request(super.createRequestPageTempletResponse("redirect:/admin/callcenter/extention.html?hostid="+extention.getHostid())); - } - - @RequestMapping(value = "/extention/delete") - @Menu(type = "callcenter" , subtype = "extention" , access = false , admin = true) - public ModelAndView extentiondelete(ModelMap map , HttpServletRequest request , @Valid String id , @Valid String hostid) { - if(!StringUtils.isBlank(id)){ - extentionRes.delete(id); - } - return request(super.createRequestPageTempletResponse("redirect:/admin/callcenter/extention.html?hostid="+hostid)); - } -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/handler/admin/callcenter/CallCenterResourceController.java b/contact-center/app/src/main/java/com/chatopera/cc/app/handler/admin/callcenter/CallCenterResourceController.java deleted file mode 100644 index 575f35c3..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/handler/admin/callcenter/CallCenterResourceController.java +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.handler.admin.callcenter; - -import java.util.List; - -import javax.servlet.http.HttpServletRequest; -import javax.validation.Valid; - -import com.chatopera.cc.app.basic.MainContext; -import com.chatopera.cc.util.Menu; -import com.chatopera.cc.exchange.CallCenterInterface; -import com.chatopera.cc.app.persistence.repository.PbxHostRepository; -import com.chatopera.cc.app.persistence.repository.ServiceAiRepository; -import com.chatopera.cc.app.handler.Handler; -import com.chatopera.cc.app.model.PbxHost; -import org.apache.commons.lang.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.ui.ModelMap; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.servlet.ModelAndView; - -import com.chatopera.cc.app.persistence.repository.ExtentionRepository; - -@Controller -@RequestMapping("/admin/callcenter") -public class CallCenterResourceController extends Handler { - - @Autowired - private PbxHostRepository pbxHostRes ; - - @Autowired - private ExtentionRepository extentionRes; - - @Autowired - private ServiceAiRepository serviceAiRes ; - - @RequestMapping(value = "/resource") - @Menu(type = "callcenter" , subtype = "callcenter" , access = false , admin = true) - public ModelAndView index(ModelMap map , HttpServletRequest request , @Valid String hostid) { - List pbxHostList = pbxHostRes.findByOrgi(super.getOrgi(request)) ; - map.addAttribute("pbxHostList" , pbxHostList); - - map.put("serviceAiList",serviceAiRes.findByOrgi(super.getOrgi(request)) ) ; - - PbxHost pbxHost = null ; - if(pbxHostList.size() > 0){ - map.addAttribute("pbxHost" , pbxHost = getPbxHost(pbxHostList, hostid)); - map.addAttribute("extentionList" , extentionRes.findByHostidAndOrgi(pbxHost.getId() , super.getOrgi(request))); - } - return request(super.createAdminTempletResponse("/admin/callcenter/resource/index")); - } - - @RequestMapping(value = "/resource/config") - @Menu(type = "callcenter" , subtype = "callcenter" , access = false , admin = true) - public ModelAndView config(ModelMap map , HttpServletRequest request , @Valid String hostid) { - List pbxHostList = pbxHostRes.findByOrgi(super.getOrgi(request)) ; - map.addAttribute("pbxHostList" , pbxHostList); - PbxHost pbxHost = null ; - if(pbxHostList.size() > 0){ - map.addAttribute("pbxHost" , pbxHost = getPbxHost(pbxHostList, hostid)); - map.addAttribute("extentionList" , extentionRes.findByHostidAndOrgi(pbxHost.getId() , super.getOrgi(request))); - } - return request(super.createRequestPageTempletResponse("/admin/callcenter/resource/config")); - } - - @RequestMapping(value = "/resource/save") - @Menu(type = "callcenter" , subtype = "callcenter" , access = false , admin = true) - public ModelAndView save(ModelMap map , HttpServletRequest request , @Valid PbxHost pbxHost) throws Exception { - PbxHost tempPbxHost = pbxHostRes.findByIdAndOrgi(pbxHost.getId(), super.getOrgi(request)) ; - if(tempPbxHost != null){ - pbxHost.setCreater(tempPbxHost.getCreater()); - pbxHost.setCreatetime(tempPbxHost.getCreatetime()); - if(StringUtils.isBlank(pbxHost.getPassword())){ - pbxHost.setPassword(tempPbxHost.getPassword()); - } - pbxHost.setOrgi(super.getOrgi(request)); - pbxHostRes.save(pbxHost) ; - - if(MainContext.model.get("callcenter")!=null){ - CallCenterInterface callCenterImpl = (CallCenterInterface) MainContext.getContext().getBean("callcenter") ; - callCenterImpl.init(pbxHost); - } - } - return request(super.createRequestPageTempletResponse("redirect:/admin/callcenter/resource.html?hostid="+pbxHost.getId())); - } - - @RequestMapping(value = "/resource/pbxhost") - @Menu(type = "callcenter" , subtype = "callcenter" , access = false , admin = true) - public ModelAndView resourcepbx(ModelMap map , HttpServletRequest request , @Valid String hostid) { - List pbxHostList = pbxHostRes.findByOrgi(super.getOrgi(request)) ; - map.addAttribute("pbxHostList" , pbxHostList); - PbxHost pbxHost = null ; - if(pbxHostList.size() > 0){ - map.addAttribute("pbxHost" , pbxHost = getPbxHost(pbxHostList, hostid)); - map.addAttribute("extentionList" , extentionRes.findByHostidAndOrgi(pbxHost.getId() , super.getOrgi(request))); - } - return request(super.createAdminTempletResponse("/admin/callcenter/resource/pbxhost")); - } - - private PbxHost getPbxHost(List pbxHostList ,String hostid){ - PbxHost pbxHost = pbxHostList.get(0) ; - if(!StringUtils.isBlank(hostid)){ - for(PbxHost pbx : pbxHostList){ - if(pbx.getId().equals(hostid)){ - pbxHost = pbx; break ; - } - } - } - return pbxHost ; - } - -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/handler/admin/callcenter/CallCenterSipTrunkController.java b/contact-center/app/src/main/java/com/chatopera/cc/app/handler/admin/callcenter/CallCenterSipTrunkController.java deleted file mode 100644 index 1afaa1fc..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/handler/admin/callcenter/CallCenterSipTrunkController.java +++ /dev/null @@ -1,154 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.handler.admin.callcenter; - -import javax.servlet.http.HttpServletRequest; -import javax.validation.Valid; - -import com.chatopera.cc.util.Menu; -import com.chatopera.cc.app.cache.CacheHelper; -import com.chatopera.cc.app.persistence.repository.PbxHostRepository; -import com.chatopera.cc.app.model.SipTrunk; -import org.apache.commons.lang.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.ui.ModelMap; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.servlet.ModelAndView; - -import com.chatopera.cc.app.persistence.repository.SipTrunkRepository; -import com.chatopera.cc.app.handler.Handler; - -@Controller -@RequestMapping("/admin/callcenter") -public class CallCenterSipTrunkController extends Handler{ - - @Autowired - private PbxHostRepository pbxHostRes ; - - - @Autowired - private SipTrunkRepository sipTrunkRes ; - - - @RequestMapping(value = "/siptrunk") - @Menu(type = "callcenter" , subtype = "callcenterresource" , access = false , admin = true) - public ModelAndView skill(ModelMap map , HttpServletRequest request , @Valid String hostid) { - if(!StringUtils.isBlank(hostid)){ - map.addAttribute("pbxHost" , pbxHostRes.findByIdAndOrgi(hostid, super.getOrgi(request))); - map.addAttribute("sipTrunkListList" , sipTrunkRes.findByHostidAndOrgi(hostid, super.getOrgi(request))); - } - return request(super.createRequestPageTempletResponse("/admin/callcenter/siptrunk/index")); - } - - @RequestMapping(value = "/siptrunk/add") - @Menu(type = "callcenter" , subtype = "extention" , access = false , admin = true) - public ModelAndView extentionadd(ModelMap map , HttpServletRequest request , @Valid String hostid) { - map.put("pbxHost", pbxHostRes.findByIdAndOrgi(hostid, super.getOrgi(request))) ; - return request(super.createRequestPageTempletResponse("/admin/callcenter/siptrunk/add")); - } - - @RequestMapping(value = "/siptrunk/save") - @Menu(type = "callcenter" , subtype = "extention" , access = false , admin = true) - public ModelAndView extentionsave(ModelMap map , HttpServletRequest request , @Valid SipTrunk siptrunk) { - if(!StringUtils.isBlank(siptrunk.getName())){ - int count = sipTrunkRes.countByNameAndOrgi(siptrunk.getName(), super.getOrgi(request)) ; - if(count == 0){ - siptrunk.setOrgi(super.getOrgi(request)); - siptrunk.setCreater(super.getUser(request).getId()); - sipTrunkRes.save(siptrunk) ; - - CacheHelper.getSystemCacheBean().put(siptrunk.getId() ,siptrunk , siptrunk.getOrgi()) ; - } - } - return request(super.createRequestPageTempletResponse("redirect:/admin/callcenter/siptrunk.html?hostid="+siptrunk.getHostid())); - } - - @RequestMapping(value = "/siptrunk/edit") - @Menu(type = "callcenter" , subtype = "extention" , access = false , admin = true) - public ModelAndView siptrunkedit(ModelMap map , HttpServletRequest request , @Valid String id , @Valid String hostid) { - map.addAttribute("siptrunk" , sipTrunkRes.findByIdAndOrgi(id, super.getOrgi(request))); - map.put("pbxHost", pbxHostRes.findByIdAndOrgi(hostid, super.getOrgi(request))) ; - return request(super.createRequestPageTempletResponse("/admin/callcenter/siptrunk/edit")); - } - - @RequestMapping(value = "/siptrunk/update") - @Menu(type = "callcenter" , subtype = "extention" , access = false , admin = true) - public ModelAndView pbxhostupdate(ModelMap map , HttpServletRequest request , @Valid SipTrunk siptrunk) { - if(!StringUtils.isBlank(siptrunk.getId())){ - SipTrunk oldSipTrunk = sipTrunkRes.findByIdAndOrgi(siptrunk.getId(), super.getOrgi(request)) ; - if(oldSipTrunk!=null){ - oldSipTrunk.setName(siptrunk.getName()); - oldSipTrunk.setSipserver(siptrunk.getSipserver()); - oldSipTrunk.setPort(siptrunk.getPort()); - oldSipTrunk.setProtocol(siptrunk.getProtocol()); - oldSipTrunk.setRegister(siptrunk.isRegister()); - oldSipTrunk.setDefaultsip(siptrunk.isDefaultsip()); - oldSipTrunk.setTitle(siptrunk.getTitle()); - - oldSipTrunk.setEnablecallagent(siptrunk.isEnablecallagent()); - - oldSipTrunk.setOutnumber(siptrunk.getOutnumber()); - oldSipTrunk.setBusyext(siptrunk.getBusyext()); - oldSipTrunk.setNotready(siptrunk.getNotready()); - - oldSipTrunk.setNoname(siptrunk.getNoname()); - - oldSipTrunk.setProvince(siptrunk.getProvince()); - oldSipTrunk.setCity(siptrunk.getCity()); - oldSipTrunk.setPrefix(siptrunk.getPrefix()); - - sipTrunkRes.save(oldSipTrunk); - - CacheHelper.getSystemCacheBean().put(oldSipTrunk.getId() ,oldSipTrunk , oldSipTrunk.getOrgi()) ; - } - } - return request(super.createRequestPageTempletResponse("redirect:/admin/callcenter/siptrunk.html?hostid="+siptrunk.getHostid())); - } - - @RequestMapping(value = "/siptrunk/code") - @Menu(type = "callcenter" , subtype = "extention" , access = false , admin = true) - public ModelAndView siptrunkcode(ModelMap map , HttpServletRequest request , @Valid String id , @Valid String hostid) { - map.addAttribute("siptrunk" , sipTrunkRes.findByIdAndOrgi(id, super.getOrgi(request))); - map.put("pbxHost", pbxHostRes.findByIdAndOrgi(hostid, super.getOrgi(request))) ; - return request(super.createRequestPageTempletResponse("/admin/callcenter/siptrunk/code")); - } - - @RequestMapping(value = "/siptrunk/code/update") - @Menu(type = "callcenter" , subtype = "extention" , access = false , admin = true) - public ModelAndView siptrunkcodeupdate(ModelMap map , HttpServletRequest request , @Valid SipTrunk siptrunk) { - if(!StringUtils.isBlank(siptrunk.getId())){ - SipTrunk oldSipTrunk = sipTrunkRes.findByIdAndOrgi(siptrunk.getId(), super.getOrgi(request)) ; - if(!StringUtils.isBlank(siptrunk.getSipcontent())){ - oldSipTrunk.setSipcontent(siptrunk.getSipcontent()); - sipTrunkRes.save(oldSipTrunk); - - CacheHelper.getSystemCacheBean().put(oldSipTrunk.getId() ,oldSipTrunk , oldSipTrunk.getOrgi()) ; - } - } - return request(super.createRequestPageTempletResponse("redirect:/admin/callcenter/siptrunk.html?hostid="+siptrunk.getHostid())); - } - - @RequestMapping(value = "/siptrunk/delete") - @Menu(type = "callcenter" , subtype = "extention" , access = false , admin = true) - public ModelAndView extentiondelete(ModelMap map , HttpServletRequest request , @Valid String id , @Valid String hostid) { - if(!StringUtils.isBlank(id)){ - sipTrunkRes.delete(id); - } - return request(super.createRequestPageTempletResponse("redirect:/admin/callcenter/siptrunk.html?hostid="+hostid)); - } -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/handler/admin/organ/OrganController.java b/contact-center/app/src/main/java/com/chatopera/cc/app/handler/admin/organ/OrganController.java deleted file mode 100644 index 2b3651e3..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/handler/admin/organ/OrganController.java +++ /dev/null @@ -1,346 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.handler.admin.organ; - -import java.util.ArrayList; -import java.util.Date; -import java.util.List; - -import javax.servlet.http.HttpServletRequest; -import javax.validation.Valid; - -import com.chatopera.cc.app.basic.MainContext; -import com.chatopera.cc.util.Menu; -import com.chatopera.cc.app.cache.CacheHelper; -import com.chatopera.cc.app.persistence.repository.OrganRepository; -import com.chatopera.cc.app.persistence.repository.SysDicRepository; -import com.chatopera.cc.util.OnlineUserUtils; -import org.apache.commons.lang.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.ui.ModelMap; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.servlet.ModelAndView; - -import com.chatopera.cc.app.persistence.repository.AreaTypeRepository; -import com.chatopera.cc.app.persistence.repository.OrganRoleRepository; -import com.chatopera.cc.app.persistence.repository.RoleRepository; -import com.chatopera.cc.app.persistence.repository.UserRepository; -import com.chatopera.cc.app.handler.Handler; -import com.chatopera.cc.app.model.AgentStatus; -import com.chatopera.cc.app.model.Organ; -import com.chatopera.cc.app.model.OrganRole; -import com.chatopera.cc.app.model.SysDic; -import com.chatopera.cc.app.model.UKeFuDic; -import com.chatopera.cc.app.model.User; - -/** - * - * @author 程序猿DD - * @version 1.0.0 - * @blog http://blog.didispace.com - * - */ -@Controller -@RequestMapping("/admin/organ") -public class OrganController extends Handler{ - - @Autowired - private OrganRepository organRepository; - - @Autowired - private RoleRepository roleRepository; - - @Autowired - private SysDicRepository sysDicRepository; - - @Autowired - private AreaTypeRepository areaRepository; - - @Autowired - private UserRepository userRepository; - - @Autowired - private OrganRoleRepository organRoleRes ; - - @Autowired - private SysDicRepository sysDicRes; - - @RequestMapping("/index") - @Menu(type = "admin" , subtype = "organ") - public ModelAndView index(ModelMap map , HttpServletRequest request , @Valid String organ, @Valid String msg) { - List organList = organRepository.findByOrgiAndOrgid(super.getOrgiByTenantshare(request),super.getOrgid(request)) ; - map.addAttribute("organList", organList); - if(organList.size() > 0){ - Organ organData = null ; - if(!StringUtils.isBlank(organ) && !"null".equals(organ)){ - for(Organ data : organList){ - if(data.getId().equals(organ)){ - map.addAttribute("organData", data); - organData = data; - } - } - }else{ - map.addAttribute("organData", organData = organList.get(0)); - } - if(organData!=null){ - map.addAttribute("userList", userRepository.findByOrganAndOrgiAndDatastatus(organData.getId() , super.getOrgiByTenantshare(request),false)); - } - } - map.addAttribute("areaList", areaRepository.findByOrgi(super.getOrgiByTenantshare(request))) ; - map.addAttribute("roleList", roleRepository.findByOrgiAndOrgid(super.getOrgiByTenantshare(request),super.getOrgid(request))); - map.put("msg", msg); - return request(super.createAdminTempletResponse("/admin/organ/index")); - } - - @RequestMapping("/add") - @Menu(type = "admin" , subtype = "organ") - public ModelAndView add(ModelMap map , HttpServletRequest request , @Valid String parent, @Valid String area) { - map.addAttribute("areaList", areaRepository.findByOrgi(super.getOrgiByTenantshare(request))) ; - if(!StringUtils.isBlank(parent)){ - map.addAttribute("organ", organRepository.findByIdAndOrgi(parent, super.getOrgiByTenantshare(request))) ; - } - if(!StringUtils.isBlank(area)){ - map.addAttribute("area", areaRepository.findByIdAndOrgi(area, super.getOrgiByTenantshare(request))) ; - } - - map.addAttribute("organList", organRepository.findByOrgiAndOrgid(super.getOrgiByTenantshare(request),super.getOrgid(request))); - - return request(super.createRequestPageTempletResponse("/admin/organ/add")); - } - - @RequestMapping("/save") - @Menu(type = "admin" , subtype = "organ") - public ModelAndView save(HttpServletRequest request ,@Valid Organ organ) { - Organ tempOrgan = organRepository.findByNameAndOrgiAndOrgid(organ.getName(), super.getOrgiByTenantshare(request),super.getOrgid(request)) ; - String msg = "admin_organ_save_success" ; - String firstId = null; - if(tempOrgan != null){ - msg = "admin_organ_update_name_not";//分类名字重复 - }else{ - organ.setOrgi(super.getOrgiByTenantshare(request)); - - if(!StringUtils.isBlank(super.getUser(request).getOrgid())) { - organ.setOrgid(super.getUser(request).getOrgid()); - }else { - organ.setOrgid(MainContext.SYSTEM_ORGI); - } - firstId = organ.getId(); - - organRepository.save(organ) ; - - OnlineUserUtils.clean(super.getOrgi(request)); - } - return request(super.createRequestPageTempletResponse("redirect:/admin/organ/index.html?msg="+msg+"&organ="+firstId)); - } - - @RequestMapping("/seluser") - @Menu(type = "admin" , subtype = "seluser" , admin = true) - public ModelAndView seluser(ModelMap map , HttpServletRequest request , @Valid String organ) { - map.addAttribute("userList", userRepository.findByOrgiAndDatastatusAndOrgid(super.getOrgiByTenantshare(request) , false,super.getOrgid(request))) ; - Organ organData = organRepository.findByIdAndOrgi(organ, super.getOrgiByTenantshare(request)) ; - map.addAttribute("userOrganList", userRepository.findByOrganAndOrgiAndDatastatus(organ, super.getOrgiByTenantshare(request),false)) ; - map.addAttribute("organ", organData) ; - return request(super.createRequestPageTempletResponse("/admin/organ/seluser")); - } - - - @RequestMapping("/saveuser") - @Menu(type = "admin" , subtype = "saveuser" , admin = true) - public ModelAndView saveuser(HttpServletRequest request ,@Valid String[] users , @Valid String organ) { - List userList = new ArrayList(); - if(users!=null && users.length > 0){ - for(String user : users){ - userList.add(user) ; - } - Organ organData = organRepository.findByIdAndOrgi(organ, super.getOrgiByTenantshare(request)) ; - List organUserList = userRepository.findAll(userList) ; - for(User user : organUserList){ - user.setOrgan(organ); - /** - * 以下更新技能组状态 - */ - AgentStatus agentStatus = (AgentStatus) CacheHelper.getAgentStatusCacheBean().getCacheObject(user.getId(), super.getOrgiByTenantshare(request)) ; - if(agentStatus!=null){ - agentStatus.setSkill(organ); - agentStatus.setSkillname(organData.getName()); - CacheHelper.getAgentStatusCacheBean().delete(user.getId(), user.getOrgi()); - CacheHelper.getAgentStatusCacheBean().put(user.getId(), agentStatus, super.getOrgiByTenantshare(request)); - } - } - userRepository.save(organUserList) ; - OnlineUserUtils.clean(super.getOrgi(request)); - } - - return request(super.createRequestPageTempletResponse("redirect:/admin/organ/index.html?organ="+organ)); - } - - @RequestMapping("/user/delete") - @Menu(type = "admin" , subtype = "role") - public ModelAndView userroledelete(HttpServletRequest request ,@Valid String id , @Valid String organ) { - if(id!=null){ - User user= userRepository.getOne(id) ; - user.setOrgan(null); - userRepository.save(user) ; - OnlineUserUtils.clean(super.getOrgi(request)); - } - return request(super.createRequestPageTempletResponse("redirect:/admin/organ/index.html?organ="+organ)); - } - - @RequestMapping("/edit") - @Menu(type = "admin" , subtype = "organ") - public ModelAndView edit(ModelMap map ,HttpServletRequest request , @Valid String id) { - ModelAndView view = request(super.createRequestPageTempletResponse("/admin/organ/edit")) ; - map.addAttribute("areaList", areaRepository.findByOrgi(super.getOrgiByTenantshare(request))) ; - view.addObject("organData", organRepository.findByIdAndOrgi(id, super.getOrgiByTenantshare(request))) ; - - map.addAttribute("organList", organRepository.findByOrgiAndOrgid(super.getOrgiByTenantshare(request),super.getOrgid(request))); - return view; - } - - @RequestMapping("/update") - @Menu(type = "admin" , subtype = "organ") - public ModelAndView update(HttpServletRequest request ,@Valid Organ organ) { - Organ org = organRepository.findByNameAndOrgi(organ.getName(), super.getOrgi(request)); - String msg = "admin_organ_update_success" ; - - if(org != null){ - if(org.getId().equals(organ.getId())){ - Organ tempOrgan = organRepository.findByIdAndOrgi(organ.getId(), super.getOrgiByTenantshare(request)) ; - - if(tempOrgan != null){ - tempOrgan.setName(organ.getName()); - tempOrgan.setUpdatetime(new Date()); - tempOrgan.setOrgi(super.getOrgiByTenantshare(request)); - tempOrgan.setSkill(organ.isSkill()); - - tempOrgan.setParent(organ.getParent()); - - tempOrgan.setArea(organ.getArea()); - - if(!StringUtils.isBlank(super.getUser(request).getOrgid())) { - tempOrgan.setOrgid(super.getUser(request).getOrgid()); - }else { - tempOrgan.setOrgid(MainContext.SYSTEM_ORGI); - } - organRepository.save(tempOrgan) ; - OnlineUserUtils.clean(super.getOrgi(request)); - }else{ - msg = "admin_organ_update_not_exist";//修改失败 - } - }else{ - msg = "admin_organ_update_name_not" ;//分类名字重复 - } - }else{ - Organ tempOrgan = organRepository.findByIdAndOrgi(organ.getId(), super.getOrgiByTenantshare(request)) ; - - if(tempOrgan != null){ - tempOrgan.setName(organ.getName()); - tempOrgan.setUpdatetime(new Date()); - tempOrgan.setOrgi(super.getOrgiByTenantshare(request)); - tempOrgan.setSkill(organ.isSkill()); - - tempOrgan.setParent(organ.getParent()); - - tempOrgan.setArea(organ.getArea()); - - if(!StringUtils.isBlank(super.getUser(request).getOrgid())) { - tempOrgan.setOrgid(super.getUser(request).getOrgid()); - }else { - tempOrgan.setOrgid(MainContext.SYSTEM_ORGI); - } - organRepository.save(tempOrgan) ; - OnlineUserUtils.clean(super.getOrgi(request)); - }else{ - msg = "admin_organ_update_not_exist";//修改失败 - } - } - - return request(super.createRequestPageTempletResponse("redirect:/admin/organ/index.html?msg="+msg+"&organ="+organ.getId())); - } - - @RequestMapping("/area") - @Menu(type = "admin" , subtype = "area") - public ModelAndView area(ModelMap map ,HttpServletRequest request , @Valid String id) { - - SysDic sysDic = sysDicRepository.findByCode(MainContext.UKEFU_SYSTEM_AREA_DIC) ; - if(sysDic!=null){ - map.addAttribute("sysarea", sysDic) ; - map.addAttribute("areaList", sysDicRepository.findByDicid(sysDic.getId())) ; - } - map.addAttribute("cacheList", UKeFuDic.getInstance().getDic(MainContext.UKEFU_SYSTEM_AREA_DIC)) ; - - map.addAttribute("organData", organRepository.findByIdAndOrgi(id, super.getOrgiByTenantshare(request))) ; - return request(super.createRequestPageTempletResponse("/admin/organ/area")); - } - - - @RequestMapping("/area/update") - @Menu(type = "admin" , subtype = "organ") - public ModelAndView areaupdate(HttpServletRequest request ,@Valid Organ organ) { - Organ tempOrgan = organRepository.findByIdAndOrgi(organ.getId(), super.getOrgiByTenantshare(request)) ; - String msg = "admin_organ_update_success" ; - if(tempOrgan != null){ - tempOrgan.setArea(organ.getArea()); - organRepository.save(tempOrgan) ; - OnlineUserUtils.clean(super.getOrgi(request)); - }else{ - msg = "admin_organ_update_not_exist"; - } - return request(super.createRequestPageTempletResponse("redirect:/admin/organ/index.html?msg="+msg+"&organ="+organ.getId())); - } - - @RequestMapping("/delete") - @Menu(type = "admin" , subtype = "organ") - public ModelAndView delete(HttpServletRequest request ,@Valid Organ organ) { - String msg = "admin_organ_delete" ; - if(organ!=null){ - organRepository.delete(organ); - OnlineUserUtils.clean(super.getOrgi(request)); - }else{ - msg = "admin_organ_not_exist" ; - } - return request(super.createRequestPageTempletResponse("redirect:/admin/organ/index.html?msg="+msg)); - } - - @RequestMapping("/auth/save") - @Menu(type = "admin" , subtype = "role") - public ModelAndView authsave(HttpServletRequest request ,@Valid String id ,@Valid String menus) { - Organ organData = organRepository.findByIdAndOrgi(id, super.getOrgiByTenantshare(request)) ; - List organRoleList = organRoleRes.findByOrgiAndOrgan(super.getOrgiByTenantshare(request), organData) ; - organRoleRes.delete(organRoleList); - if(!StringUtils.isBlank(menus)){ - String[] menusarray = menus.split(",") ; - for(String menu : menusarray){ - OrganRole organRole = new OrganRole(); - SysDic sysDic = UKeFuDic.getInstance().getDicItem(menu) ; - if(sysDic!=null && !"0".equals(sysDic.getParentid())) { - organRole.setDicid(menu); - organRole.setDicvalue(sysDic.getCode()); - - organRole.setOrgan(organData); - organRole.setCreater(super.getUser(request).getId()); - organRole.setOrgi(super.getOrgiByTenantshare(request)); - organRole.setCreatetime(new Date()); - organRoleRes.save(organRole) ; - } - - } - } - return request(super.createRequestPageTempletResponse("redirect:/admin/organ/index.html?organ="+organData.getId())); - } -} \ No newline at end of file diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/handler/admin/role/RoleController.java b/contact-center/app/src/main/java/com/chatopera/cc/app/handler/admin/role/RoleController.java deleted file mode 100644 index 20f82a22..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/handler/admin/role/RoleController.java +++ /dev/null @@ -1,249 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.handler.admin.role; - -import java.util.Date; -import java.util.List; - -import javax.servlet.http.HttpServletRequest; -import javax.validation.Valid; - -import com.chatopera.cc.app.basic.MainContext; -import com.chatopera.cc.util.Menu; -import com.chatopera.cc.app.persistence.repository.RoleAuthRepository; -import com.chatopera.cc.app.persistence.repository.SysDicRepository; -import com.chatopera.cc.app.persistence.repository.UserRoleRepository; -import org.apache.commons.lang.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.PageRequest; -import org.springframework.stereotype.Controller; -import org.springframework.ui.ModelMap; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.servlet.ModelAndView; - -import com.chatopera.cc.app.persistence.repository.RoleRepository; -import com.chatopera.cc.app.persistence.repository.UserRepository; -import com.chatopera.cc.app.handler.Handler; -import com.chatopera.cc.app.model.Role; -import com.chatopera.cc.app.model.RoleAuth; -import com.chatopera.cc.app.model.SysDic; -import com.chatopera.cc.app.model.UKeFuDic; -import com.chatopera.cc.app.model.User; -import com.chatopera.cc.app.model.UserRole; - -@Controller -@RequestMapping("/admin/role") -public class RoleController extends Handler{ - - @Autowired - private RoleRepository roleRepository; - - @Autowired - private UserRoleRepository userRoleRes; - - @Autowired - private RoleAuthRepository roleAuthRes ; - - @Autowired - private UserRepository userRepository; - - @Autowired - private SysDicRepository sysDicRes; - - @RequestMapping("/index") - @Menu(type = "admin" , subtype = "role") - public ModelAndView index(ModelMap map , HttpServletRequest request , @Valid String role) { - List roleList = roleRepository.findByOrgiAndOrgid(super.getOrgiByTenantshare(request),super.getOrgid(request)); - map.addAttribute("roleList", roleList); - if(roleList.size() > 0){ - Role roleData = null ; - if(!StringUtils.isBlank(role)){ - for(Role data : roleList){ - if(data.getId().equals(role)){ - roleData = data ; - map.addAttribute("roleData", data); - } - } - }else{ - map.addAttribute("roleData", roleData = roleList.get(0)); - } - if(roleData!=null){ - map.addAttribute("userRoleList", userRoleRes.findByOrgiAndRole(super.getOrgiByTenantshare(request), roleData, new PageRequest(super.getP(request), super.getPs(request))) ); - } - } - return request(super.createAdminTempletResponse("/admin/role/index")); - } - - @RequestMapping("/add") - @Menu(type = "admin" , subtype = "role") - public ModelAndView add(ModelMap map , HttpServletRequest request) { - return request(super.createRequestPageTempletResponse("/admin/role/add")); - } - - @RequestMapping("/save") - @Menu(type = "admin" , subtype = "role") - public ModelAndView save(HttpServletRequest request ,@Valid Role role) { - Role tempRole = roleRepository.findByNameAndOrgiAndOrgid(role.getName(), super.getOrgiByTenantshare(request),super.getOrgid(request)) ; - String msg = "admin_role_save_success" ; - if(tempRole != null){ - msg = "admin_role_save_exist"; - }else{ - role.setOrgi(super.getOrgiByTenantshare(request)); - role.setCreater(super.getUser(request).getId()); - role.setCreatetime(new Date()); - role.setUpdatetime(new Date()); - - if(!StringUtils.isBlank(super.getUser(request).getOrgid())) { - role.setOrgid(super.getUser(request).getOrgid()); - }else { - role.setOrgid(MainContext.SYSTEM_ORGI); - } - - roleRepository.save(role) ; - } - return request(super.createRequestPageTempletResponse("redirect:/admin/role/index.html?msg="+msg)); - } - - @RequestMapping("/seluser") - @Menu(type = "admin" , subtype = "seluser" , admin = true) - public ModelAndView seluser(ModelMap map , HttpServletRequest request , @Valid String role) { - map.addAttribute("userList", userRepository.findByOrgiAndDatastatusAndOrgid(super.getOrgiByTenantshare(request) , false,super.getOrgid(request))) ; - Role roleData = roleRepository.findByIdAndOrgi(role, super.getOrgiByTenantshare(request)) ; - map.addAttribute("userRoleList", userRoleRes.findByOrgiAndRole(super.getOrgiByTenantshare(request) , roleData)) ; - map.addAttribute("role", roleData) ; - return request(super.createRequestPageTempletResponse("/admin/role/seluser")); - } - - - @RequestMapping("/saveuser") - @Menu(type = "admin" , subtype = "saveuser" , admin = true) - public ModelAndView saveuser(HttpServletRequest request ,@Valid String[] users , @Valid String role) { - Role roleData = roleRepository.findByIdAndOrgi(role, super.getOrgiByTenantshare(request)) ; - List userRoleList = userRoleRes.findByOrgiAndRole(super.getOrgiByTenantshare(request) , roleData) ; - if(users!=null && users.length > 0){ - for(String user : users){ - boolean exist = false ; - for(UserRole userRole : userRoleList){ - if(user.equals(userRole.getUser().getId())){ - exist = true ; continue ; - } - } - if(exist == false) { - UserRole userRole = new UserRole() ; - userRole.setUser(new User(user)); - userRole.setRole(new Role(role)); - userRole.setOrgi(super.getOrgiByTenantshare(request)); - userRole.setCreater(super.getUser(request).getId()); - userRoleRes.save(userRole) ; - } - } - } - return request(super.createRequestPageTempletResponse("redirect:/admin/role/index.html?role="+role)); - } - - @RequestMapping("/user/delete") - @Menu(type = "admin" , subtype = "role") - public ModelAndView userroledelete(HttpServletRequest request ,@Valid String id , @Valid String role) { - if(role!=null){ - userRoleRes.delete(id); - } - return request(super.createRequestPageTempletResponse("redirect:/admin/role/index.html?role="+role)); - } - - @RequestMapping("/edit") - @Menu(type = "admin" , subtype = "role") - public ModelAndView edit(ModelMap map , HttpServletRequest request ,@Valid String id) { - ModelAndView view = request(super.createRequestPageTempletResponse("/admin/role/edit")) ; - view.addObject("roleData", roleRepository.findByIdAndOrgi(id, super.getOrgiByTenantshare(request))) ; - return view; - } - - @RequestMapping("/update") - @Menu(type = "admin" , subtype = "role") - public ModelAndView update(HttpServletRequest request ,@Valid Role role) { - Role tempRole = roleRepository.findByIdAndOrgi(role.getId(), super.getOrgiByTenantshare(request)) ; - String msg = "admin_role_update_success" ; - if(tempRole != null){ - tempRole.setName(role.getName()); - tempRole.setUpdatetime(new Date()); - - if(!StringUtils.isBlank(super.getUser(request).getOrgid())) { - tempRole.setOrgid(super.getUser(request).getOrgid()); - }else { - tempRole.setOrgid(MainContext.SYSTEM_ORGI); - } - - roleRepository.save(tempRole) ; - }else{ - msg = "admin_role_update_not_exist"; - } - return request(super.createRequestPageTempletResponse("redirect:/admin/role/index.html?msg="+msg)); - } - - @RequestMapping("/delete") - @Menu(type = "admin" , subtype = "role") - public ModelAndView delete(HttpServletRequest request ,@Valid Role role) { - String msg = "admin_role_delete" ; - if(role!=null){ - userRoleRes.delete(userRoleRes.findByOrgiAndRole(super.getOrgiByTenantshare(request), role)); - roleRepository.delete(role); - }else{ - msg = "admin_role_not_exist" ; - } - return request(super.createRequestPageTempletResponse("redirect:/admin/role/index.html?msg="+msg)); - } - - @RequestMapping("/auth") - @Menu(type = "admin" , subtype = "role") - public ModelAndView auth(ModelMap map , HttpServletRequest request , @Valid String id) { - SysDic sysDic = sysDicRes.findByCode(MainContext.UKEFU_SYSTEM_AUTH_DIC) ; - if(sysDic!=null){ - map.addAttribute("resourceList", sysDicRes.findByDicid(sysDic.getId())) ; - } - map.addAttribute("sysDic", sysDic) ; - Role role = roleRepository.findByIdAndOrgi(id, super.getOrgiByTenantshare(request)) ; - map.addAttribute("role", role) ; - map.addAttribute("roleAuthList", roleAuthRes.findByRoleidAndOrgi(role.getId(), super.getOrgiByTenantshare(request))) ; - return request(super.createRequestPageTempletResponse("/admin/role/auth")); - } - - @RequestMapping("/auth/save") - @Menu(type = "admin" , subtype = "role") - public ModelAndView authsave(HttpServletRequest request ,@Valid String id ,@Valid String menus) { - List roleAuthList = roleAuthRes.findByRoleidAndOrgi(id, super.getOrgiByTenantshare(request)) ; - roleAuthRes.delete(roleAuthList); - if(!StringUtils.isBlank(menus)){ - String[] menuarray = menus.split(",") ; - for(String menu : menuarray){ - RoleAuth roleAuth = new RoleAuth(); - - roleAuth.setRoleid(id); - roleAuth.setDicid(menu); - SysDic sysDic = UKeFuDic.getInstance().getDicItem(menu) ; - if(sysDic!=null && !"0".equals(sysDic.getParentid())) { - roleAuth.setCreater(super.getUser(request).getId()); - roleAuth.setOrgi(super.getOrgiByTenantshare(request)); - roleAuth.setCreatetime(new Date()); - roleAuth.setName(sysDic.getName()); - roleAuth.setDicvalue(sysDic.getCode()); - roleAuthRes.save(roleAuth) ; - } - } - } - return request(super.createRequestPageTempletResponse("redirect:/admin/role/index.html?role="+id)); - } -} \ No newline at end of file diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/handler/admin/system/HazelcastMonitorController.java b/contact-center/app/src/main/java/com/chatopera/cc/app/handler/admin/system/HazelcastMonitorController.java deleted file mode 100644 index 6ab4bbfc..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/handler/admin/system/HazelcastMonitorController.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.handler.admin.system; - -import java.sql.SQLException; -import java.util.HashMap; -import java.util.Map; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.springframework.stereotype.Controller; -import org.springframework.ui.ModelMap; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.servlet.ModelAndView; - -import com.google.gson.Gson; -import com.hazelcast.com.eclipsesource.json.JsonObject; -import com.chatopera.cc.util.Menu; -import com.chatopera.cc.app.cache.CacheHelper; -import com.chatopera.cc.app.handler.Handler; - -@Controller -@RequestMapping("/admin/monitor") -public class HazelcastMonitorController extends Handler{ - - @RequestMapping("/hazelcast") - @Menu(type = "admin" , subtype = "metadata" , admin = true) - public ModelAndView index(ModelMap map , HttpServletRequest request , HttpServletResponse response) throws SQLException { - Map jsonObjectMap = new HashMap< String , Object>(); - - jsonObjectMap.put("agentUser" , convert(CacheHelper.getAgentUserCacheBean().getStatics())) ; - jsonObjectMap.put("agentStatus" , convert(CacheHelper.getAgentStatusCacheBean().getStatics())) ; - - jsonObjectMap.put("apiUser" , convert(CacheHelper.getApiUserCacheBean().getStatics())) ; - jsonObjectMap.put("imrCache" , convert(CacheHelper.getIMRCacheBean().getStatics())) ; - jsonObjectMap.put("onlineUser" , convert(CacheHelper.getOnlineUserCacheBean().getStatics())) ; - jsonObjectMap.put("systemCache" , convert(CacheHelper.getSystemCacheBean().getStatics())) ; - - map.addAttribute("systemStatics", new Gson().toJson(jsonObjectMap)) ; - - - response.setCharacterEncoding("UTF-8"); - response.setContentType("application/json; charset=utf-8"); - return request(super.createRequestPageTempletResponse("/admin/system/monitor/hazelcast")); - } - /** - * 转换统计数据 - * @param json - * @return - */ - private Map convert(JsonObject json){ - Map values = new HashMap(); - for(String key : json.names()){ - values.put(key, json.get(key)) ; - } - return values; - } -} \ No newline at end of file diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/handler/admin/system/LogController.java b/contact-center/app/src/main/java/com/chatopera/cc/app/handler/admin/system/LogController.java deleted file mode 100644 index b3e46980..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/handler/admin/system/LogController.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.handler.admin.system; - -import javax.servlet.http.HttpServletRequest; -import javax.validation.Valid; - -import com.chatopera.cc.app.basic.MainContext; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Sort.Direction; -import org.springframework.stereotype.Controller; -import org.springframework.ui.ModelMap; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.servlet.ModelAndView; - -import com.chatopera.cc.util.Menu; -import com.chatopera.cc.app.persistence.repository.LogRepository; -import com.chatopera.cc.app.handler.Handler; - -@Controller -@RequestMapping("/admin/log") -public class LogController extends Handler{ - - - @Autowired - private LogRepository logRes; - - @RequestMapping("/index") - @Menu(type = "admin" , subtype = "syslog") - public ModelAndView index(ModelMap map , HttpServletRequest request) { - map.addAttribute("logList", logRes.findByOrgi(MainContext.SYSTEM_ORGI , new PageRequest(super.getP(request), super.getPs(request) , Direction.DESC , "createdate"))); - return request(super.createAdminTempletResponse("/admin/system/log/index")); - } - - @RequestMapping("/levels") - @Menu(type = "admin" , subtype = "levels") - public ModelAndView levels(ModelMap map , HttpServletRequest request , @Valid String levels) { - map.addAttribute("logList", logRes.findByOrgiAndLevels(MainContext.SYSTEM_ORGI , levels , new PageRequest(super.getP(request), super.getPs(request) , Direction.DESC , "createdate"))); - map.addAttribute("levels" , levels) ; - return request(super.createAdminTempletResponse("/admin/system/log/levels")); - } - - @RequestMapping("/detail") - @Menu(type = "admin" , subtype = "detail") - public ModelAndView detail(ModelMap map , HttpServletRequest request , @Valid String id) { - map.addAttribute("log", logRes.findOne(id)); - return request(super.createRequestPageTempletResponse("/admin/system/log/detail")); - } -} \ No newline at end of file diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/handler/admin/system/SysDicController.java b/contact-center/app/src/main/java/com/chatopera/cc/app/handler/admin/system/SysDicController.java deleted file mode 100644 index 985beb99..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/handler/admin/system/SysDicController.java +++ /dev/null @@ -1,240 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.handler.admin.system; - -import java.util.Date; -import java.util.List; - -import javax.servlet.http.HttpServletRequest; -import javax.validation.Valid; - -import com.chatopera.cc.app.cache.CacheHelper; -import com.chatopera.cc.app.persistence.repository.SysDicRepository; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Sort.Direction; -import org.springframework.stereotype.Controller; -import org.springframework.ui.ModelMap; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.servlet.ModelAndView; - -import com.chatopera.cc.util.Menu; -import com.chatopera.cc.app.handler.Handler; -import com.chatopera.cc.app.model.SysDic; - -@Controller -@RequestMapping("/admin/sysdic") -public class SysDicController extends Handler{ - - - @Autowired - private SysDicRepository sysDicRes; - - @RequestMapping("/index") - @Menu(type = "admin" , subtype = "sysdic") - public ModelAndView index(ModelMap map , HttpServletRequest request) { - map.addAttribute("sysDicList", sysDicRes.findByParentid( "0" , new PageRequest(super.getP(request), super.getPs(request) , Direction.DESC , "createtime"))); - return request(super.createAdminTempletResponse("/admin/system/sysdic/index")); - } - - @RequestMapping("/add") - @Menu(type = "admin" , subtype = "sysdic") - public ModelAndView add(ModelMap map , HttpServletRequest request) { - return request(super.createRequestPageTempletResponse("/admin/system/sysdic/add")); - } - - @RequestMapping("/save") - @Menu(type = "admin" , subtype = "sysdic") - public ModelAndView save(HttpServletRequest request ,@Valid SysDic dic) { - List sysDicList = sysDicRes.findByCodeOrName(dic.getCode() , dic.getName()) ; - String msg = null ; - if(sysDicList.size() == 0){ - dic.setParentid("0"); - dic.setHaschild(true); - dic.setCreater(super.getUser(request).getId()); - dic.setCreatetime(new Date()); - sysDicRes.save(dic) ; - reloadSysDicItem(dic , request); - }else{ - msg = "exist" ; - } - return request(super.createRequestPageTempletResponse("redirect:/admin/sysdic/index.html"+(msg!=null ? "?msg="+msg : ""))); - } - - @RequestMapping("/edit") - @Menu(type = "admin" , subtype = "sysdic") - public ModelAndView edit(ModelMap map , HttpServletRequest request , @Valid String id , @Valid String p) { - map.addAttribute("sysDic", sysDicRes.findById(id)) ; - map.addAttribute("p", p) ; - return request(super.createRequestPageTempletResponse("/admin/system/sysdic/edit")); - } - - @RequestMapping("/update") - @Menu(type = "admin" , subtype = "sysdic") - public ModelAndView update(HttpServletRequest request ,@Valid SysDic dic, @Valid String p) { - List sysDicList = sysDicRes.findByCodeOrName(dic.getCode() , dic.getName()) ; - if(sysDicList.size() == 0 || (sysDicList.size() ==1 && sysDicList.get(0).getId().equals(dic.getId()))){ - SysDic sysDic = sysDicRes.findById(dic.getId()) ; - sysDic.setName(dic.getName()); - sysDic.setCode(dic.getCode()); - sysDic.setCtype(dic.getCtype()); - sysDic.setIconskin(dic.getIconskin()); - sysDic.setIconstr(dic.getIconstr()); - sysDic.setDescription(dic.getDescription()); - sysDicRes.save(sysDic) ; - - reloadSysDicItem(sysDic, request); - } - return request(super.createRequestPageTempletResponse("redirect:/admin/sysdic/index.html?p="+p)); - } - - @RequestMapping("/delete") - @Menu(type = "admin" , subtype = "sysdic") - public ModelAndView delete(ModelMap map , HttpServletRequest request , @Valid String id, @Valid String p) { - SysDic sysDic = sysDicRes.findById(id); - sysDicRes.delete(sysDicRes.findByDicid(id) ); - sysDicRes.delete(sysDic); - - reloadSysDicItem(sysDic, request); - - return request(super.createRequestPageTempletResponse("redirect:/admin/sysdic/index.html?p="+p)); - } - - @RequestMapping("/dicitem") - @Menu(type = "admin" , subtype = "sysdic") - public ModelAndView dicitem(ModelMap map , HttpServletRequest request , @Valid String id) { - map.addAttribute("sysDic", sysDicRes.findById(id)) ; - map.addAttribute("sysDicList", sysDicRes.findByParentid( id , new PageRequest(super.getP(request), super.getPs(request) , Direction.DESC , "createtime"))); - return request(super.createAdminTempletResponse("/admin/system/sysdic/dicitem")); - } - - @RequestMapping("/dicitem/add") - @Menu(type = "admin" , subtype = "sysdic") - public ModelAndView dicitemadd(ModelMap map , HttpServletRequest request , @Valid String id , @Valid String p) { - map.addAttribute("sysDic", sysDicRes.findById(id)) ; - map.addAttribute("p", p) ; - return request(super.createRequestPageTempletResponse("/admin/system/sysdic/dicitemadd")); - } - - @RequestMapping("/dicitem/save") - @Menu(type = "admin" , subtype = "sysdic") - public ModelAndView dicitemsave(HttpServletRequest request ,@Valid SysDic dic , @Valid String p) { - List sysDicList = sysDicRes.findByDicidAndName(dic.getDicid() , dic.getName()) ; - String msg = null ; - if(sysDicList.size() == 0){ - dic.setHaschild(true); - dic.setOrgi(super.getOrgi(request)); - dic.setCreater(super.getUser(request).getId()); - dic.setCreatetime(new Date()); - sysDicRes.save(dic) ; - reloadSysDicItem(dic, request); - }else{ - msg = "exist" ; - } - return request(super.createRequestPageTempletResponse("redirect:/admin/sysdic/dicitem.html?id="+dic.getParentid()+(msg!=null ? "&p="+p+"&msg="+msg : ""))); - } - - private void reloadSysDicItem(SysDic dic , HttpServletRequest request ){ - CacheHelper.getSystemCacheBean().put(dic.getId(), dic,super.getOrgi(request)); - if(dic.getDicid()!=null){ - SysDic root = (SysDic) CacheHelper.getSystemCacheBean().getCacheObject(dic.getDicid(), super.getOrgi(request)) ; - List sysDicList = sysDicRes.findByDicid(dic.getDicid()) ; - CacheHelper.getSystemCacheBean().put(root.getCode(), sysDicList,super.getOrgi(request)); - }else if(dic.getParentid().equals("0")){ - List sysDicList = sysDicRes.findByDicid(dic.getId()) ; - CacheHelper.getSystemCacheBean().put(dic.getCode(), sysDicList,super.getOrgi(request)); - } - } - - @RequestMapping("/dicitem/batadd") - @Menu(type = "admin" , subtype = "sysdic") - public ModelAndView dicitembatadd(ModelMap map , HttpServletRequest request , @Valid String id , @Valid String p) { - map.addAttribute("sysDic", sysDicRes.findById(id)) ; - map.addAttribute("p", p) ; - return request(super.createRequestPageTempletResponse("/admin/system/sysdic/batadd")); - } - - @RequestMapping("/dicitem/batsave") - @Menu(type = "admin" , subtype = "sysdic") - public ModelAndView dicitembatsave(HttpServletRequest request ,@Valid SysDic sysDic , @Valid String content , @Valid String p) { - String[] dicitems = content.split("[\n\r\n]") ; - int count = 0 ; - for(String dicitem : dicitems){ - String[] dicValues = dicitem.split("[\t, ;]{1,}") ; - if(dicValues.length == 2 && dicValues[0].length()>0 && dicValues[1].length() >0){ - SysDic dic = new SysDic() ; - dic.setOrgi(super.getOrgi(request)); - - dic.setName(dicValues[0]); - dic.setCode(dicValues[1]); - dic.setCreater(super.getUser(request).getId()); - dic.setParentid(sysDic.getParentid()); - dic.setDicid(sysDic.getDicid()); - dic.setSortindex(++count); - dic.setCreatetime(new Date()); - dic.setUpdatetime(new Date()); - if(sysDicRes.findByDicidAndName(dic.getDicid(), dic.getName()).size() == 0){ - sysDicRes.save(dic) ; - } - - } - } - reloadSysDicItem(sysDicRes.getOne(sysDic.getParentid()), request); - - return request(super.createRequestPageTempletResponse("redirect:/admin/sysdic/dicitem.html?id="+sysDic.getParentid()+"&p="+p)); - } - - @RequestMapping("/dicitem/edit") - @Menu(type = "admin" , subtype = "sysdic") - public ModelAndView dicitemedit(ModelMap map , HttpServletRequest request , @Valid String id , @Valid String p) { - map.addAttribute("sysDic", sysDicRes.findById(id)) ; - map.addAttribute("p", p) ; - return request(super.createRequestPageTempletResponse("/admin/system/sysdic/dicitemedit")); - } - - @RequestMapping("/dicitem/update") - @Menu(type = "admin" , subtype = "sysdic") - public ModelAndView dicitemupdate(HttpServletRequest request ,@Valid SysDic dic, @Valid String p) { - List sysDicList = sysDicRes.findByDicidAndName(dic.getDicid() , dic.getName()) ; - if(sysDicList.size() == 0 || (sysDicList.size() ==1 && sysDicList.get(0).getId().equals(dic.getId()))){ - SysDic sysDic = sysDicRes.findById(dic.getId()) ; - sysDic.setName(dic.getName()); - sysDic.setCode(dic.getCode()); - sysDic.setCtype(dic.getCtype()); - sysDic.setOrgi(super.getOrgi(request)); - sysDic.setIconskin(dic.getIconskin()); - sysDic.setIconstr(dic.getIconstr()); - sysDic.setDiscode(dic.isDiscode()); - sysDic.setDescription(dic.getDescription()); - sysDicRes.save(sysDic) ; - - reloadSysDicItem(sysDic, request); - } - return request(super.createRequestPageTempletResponse("redirect:/admin/sysdic/dicitem.html?id="+dic.getParentid()+"&p="+p)); - } - - @RequestMapping("/dicitem/delete") - @Menu(type = "admin" , subtype = "sysdic") - public ModelAndView dicitemdelete(ModelMap map , HttpServletRequest request , @Valid String id, @Valid String p) { - sysDicRes.delete(sysDicRes.findByDicid(id)); - SysDic dic = sysDicRes.getOne(id) ; - sysDicRes.delete(dic); - reloadSysDicItem(dic, request); - return request(super.createRequestPageTempletResponse("redirect:/admin/sysdic/dicitem.html?id="+dic.getParentid()+"&p="+p)); - } - -} \ No newline at end of file diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/handler/api/ApiLoginController.java b/contact-center/app/src/main/java/com/chatopera/cc/app/handler/api/ApiLoginController.java deleted file mode 100644 index 6d7c1e43..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/handler/api/ApiLoginController.java +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.handler.api; - -import com.chatopera.cc.app.basic.MainUtils; -import com.chatopera.cc.util.Menu; -import com.chatopera.cc.app.cache.CacheHelper; -import com.chatopera.cc.app.persistence.repository.UserRoleRepository; -import com.chatopera.cc.app.model.User; -import com.chatopera.cc.app.model.UserRole; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; - -import java.util.Date; -import java.util.List; - -import javax.servlet.http.Cookie; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; - -import org.apache.commons.lang.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.RequestHeader; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RestController; - -import com.chatopera.cc.app.basic.MainContext; -import com.chatopera.cc.app.persistence.repository.UserRepository; -import com.chatopera.cc.app.handler.Handler; - -@RestController -@RequestMapping("/tokens") -@Api(value = "登录服务", description = "账号密码登录") -public class ApiLoginController extends Handler{ - @Autowired - private UserRepository userRepository; - - @Autowired - private UserRoleRepository userRoleRes ; - - @SuppressWarnings("rawtypes") - @RequestMapping(method = RequestMethod.POST) - @Menu(type = "apps" , subtype = "token" , access = true) - @ApiOperation("登录服务,传入登录账号和密码") - public ResponseEntity login(HttpServletRequest request , HttpServletResponse response , @Valid String username, @Valid String password) { - User loginUser = userRepository.findByUsernameAndPassword(username , MainUtils.md5(password)) ; - ResponseEntity entity = null ; - if(loginUser!=null && !StringUtils.isBlank(loginUser.getId())){ - loginUser.setLogin(true); - List userRoleList = userRoleRes.findByOrgiAndUser(loginUser.getOrgi(), loginUser); - if(userRoleList!=null && userRoleList.size()>0){ - for(UserRole userRole : userRoleList){ - loginUser.getRoleList().add(userRole.getRole()) ; - } - } - loginUser.setLastlogintime(new Date()); - if(!StringUtils.isBlank(loginUser.getId())){ - userRepository.save(loginUser) ; - } - String auth = MainUtils.getUUID(); - CacheHelper.getApiUserCacheBean().put(auth, loginUser, MainContext.SYSTEM_ORGI); - entity = new ResponseEntity<>(auth, HttpStatus.OK) ; - response.addCookie(new Cookie("authorization",auth)); - }else{ - entity = new ResponseEntity<>(HttpStatus.UNAUTHORIZED) ; - } - return entity; - } - - @SuppressWarnings("rawtypes") - @RequestMapping(method = RequestMethod.GET) - @Menu(type = "apps" , subtype = "token" , access = true) - public ResponseEntity error(HttpServletRequest request) { - User data = super.getUser(request); - return new ResponseEntity<>(data , data!=null ? HttpStatus.OK : HttpStatus.UNAUTHORIZED); - } - - @SuppressWarnings("rawtypes") - @RequestMapping(method = RequestMethod.DELETE) - public ResponseEntity logout(HttpServletRequest request , @RequestHeader(value="authorization") String authorization) { - CacheHelper.getApiUserCacheBean().delete(authorization, MainContext.SYSTEM_ORGI); - return new ResponseEntity<>(HttpStatus.OK); - } - -} \ No newline at end of file diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/handler/api/rest/ApiAgentUserController.java b/contact-center/app/src/main/java/com/chatopera/cc/app/handler/api/rest/ApiAgentUserController.java deleted file mode 100644 index f1d67e7c..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/handler/api/rest/ApiAgentUserController.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.handler.api.rest; - -import com.chatopera.cc.util.RestResult; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; - -import javax.servlet.http.HttpServletRequest; -import javax.validation.Valid; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Sort; -import org.springframework.data.domain.Sort.Direction; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RestController; - -import com.chatopera.cc.util.Menu; -import com.chatopera.cc.app.persistence.repository.AgentUserRepository; -import com.chatopera.cc.util.RestResultType; -import com.chatopera.cc.app.handler.Handler; - -@RestController -@RequestMapping("/api/agentuser") -@Api(value = "ACD服务", description = "获取当前对话中的访客") -public class ApiAgentUserController extends Handler{ - - @Autowired - private AgentUserRepository agentUserRepository ; - - /** - * 获取当前对话中的访客 - * @param request - * @return - */ - @RequestMapping( method = RequestMethod.GET) - @Menu(type = "apps" , subtype = "agentuser" , access = true) - @ApiOperation("获取当前正在对话的访客信息,包含多种渠道来源的访客") - public ResponseEntity list(HttpServletRequest request , @Valid String q) { - return new ResponseEntity<>(new RestResult(RestResultType.OK , agentUserRepository.findByAgentnoAndOrgi(super.getUser(request).getId() , super.getOrgi(request) , new Sort(Direction.ASC,"status"))), HttpStatus.OK); - } -} \ No newline at end of file diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/handler/api/rest/ApiContactsController.java b/contact-center/app/src/main/java/com/chatopera/cc/app/handler/api/rest/ApiContactsController.java deleted file mode 100644 index bc2e9cae..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/handler/api/rest/ApiContactsController.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.handler.api.rest; - -import com.chatopera.cc.util.Menu; -import com.chatopera.cc.app.persistence.es.ContactsRepository; -import com.chatopera.cc.util.RestResult; -import com.chatopera.cc.util.RestResultType; -import com.chatopera.cc.app.handler.Handler; -import com.chatopera.cc.app.model.Contacts; -import com.chatopera.cc.app.model.User; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; - -import java.util.Date; - -import javax.servlet.http.HttpServletRequest; -import javax.validation.Valid; - -import org.apache.commons.lang.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RestController; - -@RestController -@RequestMapping("/api/contacts") -@Api(value = "联系人服务", description = "联系人管理功能") -public class ApiContactsController extends Handler { - - @Autowired - private ContactsRepository contactsRepository; - - /** - * 返回用户列表,支持分页,分页参数为 p=1&ps=50,默认分页尺寸为 20条每页 - * @param request - * @param username 搜索用户名,精确搜索 - * @return - */ - @RequestMapping( method = RequestMethod.GET) - @Menu(type = "apps" , subtype = "contacts" , access = true) - @ApiOperation("返回联系人列表,支持分页,分页参数为 p=1&ps=50,默认分页尺寸为 20条每页") - public ResponseEntity list(HttpServletRequest request , @Valid String creater , @Valid String q) { - Page contactsList = null ; - if(!StringUtils.isBlank(creater)){ - User user = super.getUser(request) ; - contactsList = contactsRepository.findByCreaterAndSharesAndOrgi(user.getId(), user.getId(),super.getOrgi(request), false, q, new PageRequest(super.getP(request), super.getPs(request))) ; - }else{ - contactsList = contactsRepository.findByOrgi(super.getOrgi(request), false , q , new PageRequest(super.getP(request), super.getPs(request))) ; - } - return new ResponseEntity<>(new RestResult(RestResultType.OK, contactsList), HttpStatus.OK); - } - - /** - * 新增或修改用户用户 ,在修改用户信息的时候,如果用户 密码未改变,请设置为 NULL - * @param request - * @param user - * @return - */ - @RequestMapping(method = RequestMethod.PUT) - @Menu(type = "apps" , subtype = "contacts" , access = true) - @ApiOperation("新增或修改联系人,联系人部分字段是字典选项,请从字典接口获取数据") - public ResponseEntity put(HttpServletRequest request , @Valid Contacts contacts) { - if(contacts != null && !StringUtils.isBlank(contacts.getName())){ - - contacts.setOrgi(super.getOrgi(request)); - contacts.setCreater(super.getUser(request).getId()); - contacts.setUsername(super.getUser(request).getUsername()); - - contacts.setOrgan(super.getUser(request).getOrgan()); - contacts.setCreatetime(new Date()); - contacts.setUpdatetime(new Date()); - - contactsRepository.save(contacts) ; - } - return new ResponseEntity<>(new RestResult(RestResultType.OK), HttpStatus.OK); - } - - /** - * 删除用户,只提供 按照用户ID删除 , 并且,不能删除系统管理员 - * @param request - * @param id - * @return - */ - @RequestMapping(method = RequestMethod.DELETE) - @Menu(type = "apps" , subtype = "contacts" , access = true) - @ApiOperation("删除联系人,联系人删除是逻辑删除,将 datastatus字段标记为 true,即已删除") - public ResponseEntity delete(HttpServletRequest request , @Valid String id) { - RestResult result = new RestResult(RestResultType.OK) ; - if(!StringUtils.isBlank(id)){ - Contacts contacts = contactsRepository.findOne(id) ; - if(contacts!=null){ //系统管理员, 不允许 使用 接口删除 - contacts.setDatastatus(true); - contactsRepository.save(contacts) ; - } - } - return new ResponseEntity<>(result, HttpStatus.OK); - } -} \ No newline at end of file diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/handler/api/rest/ApiServiceQueneController.java b/contact-center/app/src/main/java/com/chatopera/cc/app/handler/api/rest/ApiServiceQueneController.java deleted file mode 100644 index 836d1435..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/handler/api/rest/ApiServiceQueneController.java +++ /dev/null @@ -1,165 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.handler.api.rest; - -import java.util.Date; -import java.util.List; - -import javax.servlet.http.HttpServletRequest; -import javax.validation.Valid; - -import com.chatopera.cc.app.algorithm.AutomaticServiceDist; -import com.chatopera.cc.app.basic.MainContext; -import com.chatopera.cc.util.Menu; -import com.chatopera.cc.app.cache.CacheHelper; -import com.chatopera.cc.app.persistence.repository.AgentStatusRepository; -import com.chatopera.cc.app.persistence.repository.OrganRepository; -import com.chatopera.cc.util.RestResult; -import com.chatopera.cc.app.model.AgentStatus; -import com.chatopera.cc.app.model.User; -import org.apache.commons.lang.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RestController; - -import com.chatopera.cc.app.persistence.repository.AgentUserRepository; -import com.chatopera.cc.util.RestResultType; -import com.chatopera.cc.app.handler.Handler; -import com.chatopera.cc.app.model.Organ; -import com.chatopera.cc.app.model.SessionConfig; - -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; - -@RestController -@RequestMapping("/api/servicequene") -@Api(value = "ACD服务", description = "获取队列统计信息") -public class ApiServiceQueneController extends Handler{ - - @Autowired - private AgentStatusRepository agentStatusRepository ; - - - @Autowired - private AgentUserRepository agentUserRepository ; - - @Autowired - private OrganRepository organRes ; - /** - * 返回当前队列信息 - * @param request - * @return - */ - @RequestMapping( method = RequestMethod.GET) - @Menu(type = "apps" , subtype = "user" , access = true) - @ApiOperation("获取队列统计信息,包含当前队列服务中的访客数,排队人数,坐席数") - public ResponseEntity list(HttpServletRequest request) { - return new ResponseEntity<>(new RestResult(RestResultType.OK , AutomaticServiceDist.getAgentReport(super.getOrgi(request))), HttpStatus.OK); - } - - /** - * 返回当前队列信息 - * @param request - * @return - */ - @RequestMapping( method = RequestMethod.PUT) - @Menu(type = "apps" , subtype = "user" , access = true) - @ApiOperation("坐席状态操作,就绪、未就绪、忙") - public ResponseEntity agentStatus(HttpServletRequest request , @Valid String status) { - User user = super.getUser(request) ; - AgentStatus agentStatus = null ; - if(!StringUtils.isBlank(status) && status.equals(MainContext.AgentStatusEnum.READY.toString())) { - List agentStatusList = agentStatusRepository.findByAgentnoAndOrgi(user.getId() , super.getOrgi(request)); - if(agentStatusList.size() > 0){ - agentStatus = agentStatusList.get(0) ; - }else{ - agentStatus = new AgentStatus() ; - agentStatus.setUserid(user.getId()); - agentStatus.setUsername(user.getUname()); - agentStatus.setAgentno(user.getId()); - agentStatus.setLogindate(new Date()); - - if(!StringUtils.isBlank(user.getOrgan())){ - Organ organ = organRes.findByIdAndOrgi(user.getOrgan(), super.getOrgiByTenantshare(request)) ; - if(organ!=null && organ.isSkill()){ - agentStatus.setSkill(organ.getId()); - agentStatus.setSkillname(organ.getName()); - } - } - - SessionConfig sessionConfig = AutomaticServiceDist.initSessionConfig(super.getOrgi(request)) ; - - agentStatus.setUsers(agentUserRepository.countByAgentnoAndStatusAndOrgi(user.getId(), MainContext.AgentUserStatusEnum.INSERVICE.toString(), super.getOrgi(request))); - - agentStatus.setUpdatetime(new Date()); - - agentStatus.setOrgi(super.getOrgi(request)); - agentStatus.setMaxusers(sessionConfig.getMaxuser()); - agentStatusRepository.save(agentStatus) ; - - } - if(agentStatus!=null){ - /** - * 更新当前用户状态 - */ - agentStatus.setUsers(AutomaticServiceDist.getAgentUsers(agentStatus.getAgentno(), super.getOrgi(request))); - agentStatus.setStatus(MainContext.AgentStatusEnum.READY.toString()); - CacheHelper.getAgentStatusCacheBean().put(agentStatus.getAgentno(), agentStatus, super.getOrgi(request)); - AutomaticServiceDist.recordAgentStatus(agentStatus.getAgentno(),agentStatus.getUsername(),agentStatus.getAgentno(), agentStatus.getSkill(),"0".equals(super.getUser(request).getUsertype()), agentStatus.getAgentno(), MainContext.AgentStatusEnum.OFFLINE.toString(), MainContext.AgentStatusEnum.READY.toString(), MainContext.AgentWorkType.MEIDIACHAT.toString() , agentStatus.getOrgi() , null); - - AutomaticServiceDist.allotAgent(agentStatus.getAgentno(), super.getOrgi(request)); - } - }else if(!StringUtils.isBlank(status)) { - if(status.equals(MainContext.AgentStatusEnum.NOTREADY.toString())) { - List agentStatusList = agentStatusRepository.findByAgentnoAndOrgi(user.getId() , super.getOrgi(request)); - for(AgentStatus temp : agentStatusList){ - AutomaticServiceDist.recordAgentStatus(temp.getAgentno(),temp.getUsername(),temp.getAgentno(), temp.getSkill(),"0".equals(super.getUser(request).getUsertype()), temp.getAgentno(), temp.isBusy() ? MainContext.AgentStatusEnum.BUSY.toString(): MainContext.AgentStatusEnum.READY.toString(), MainContext.AgentStatusEnum.NOTREADY.toString(), MainContext.AgentWorkType.MEIDIACHAT.toString() , temp.getOrgi() , temp.getUpdatetime()); - agentStatusRepository.delete(temp); - } - CacheHelper.getAgentStatusCacheBean().delete(super.getUser(request).getId(),super.getOrgi(request)); - }else if(!StringUtils.isBlank(status) && status.equals(MainContext.AgentStatusEnum.BUSY.toString())) { - List agentStatusList = agentStatusRepository.findByAgentnoAndOrgi(user.getId() , super.getOrgi(request)); - if(agentStatusList.size() > 0){ - agentStatus = agentStatusList.get(0) ; - agentStatus.setBusy(true); - AutomaticServiceDist.recordAgentStatus(agentStatus.getAgentno(),agentStatus.getUsername(), agentStatus.getAgentno(),agentStatus.getSkill(), "0".equals(super.getUser(request).getUsertype()),agentStatus.getAgentno(), MainContext.AgentStatusEnum.READY.toString(), MainContext.AgentStatusEnum.BUSY.toString(), MainContext.AgentWorkType.MEIDIACHAT.toString() , agentStatus.getOrgi() , agentStatus.getUpdatetime()); - agentStatus.setUpdatetime(new Date()); - - agentStatusRepository.save(agentStatus); - CacheHelper.getAgentStatusCacheBean().put(agentStatus.getAgentno(), agentStatus, super.getOrgi(request)); - } - }else if(!StringUtils.isBlank(status) && status.equals(MainContext.AgentStatusEnum.NOTBUSY.toString())) { - List agentStatusList = agentStatusRepository.findByAgentnoAndOrgi(user.getId() , super.getOrgi(request)); - if(agentStatusList.size() > 0){ - agentStatus = agentStatusList.get(0) ; - agentStatus.setBusy(false); - AutomaticServiceDist.recordAgentStatus(agentStatus.getAgentno(),agentStatus.getUsername(), agentStatus.getAgentno(),agentStatus.getSkill(), "0".equals(super.getUser(request).getUsertype()),agentStatus.getAgentno(), MainContext.AgentStatusEnum.BUSY.toString(), MainContext.AgentStatusEnum.READY.toString(), MainContext.AgentWorkType.MEIDIACHAT.toString() , agentStatus.getOrgi() , agentStatus.getUpdatetime()); - - agentStatus.setUpdatetime(new Date()); - agentStatusRepository.save(agentStatus); - CacheHelper.getAgentStatusCacheBean().put(agentStatus.getAgentno(), agentStatus,super.getOrgi(request)); - } - AutomaticServiceDist.allotAgent(agentStatus.getAgentno(), super.getOrgi(request)); - } - AutomaticServiceDist.publishMessage(super.getOrgi(request) , "agent" , "api" , super.getUser(request).getId()); - } - return new ResponseEntity<>(new RestResult(RestResultType.OK , agentStatus), HttpStatus.OK); - } -} \ No newline at end of file diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/handler/api/rest/ApiSysDicController.java b/contact-center/app/src/main/java/com/chatopera/cc/app/handler/api/rest/ApiSysDicController.java deleted file mode 100644 index 1637b2fc..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/handler/api/rest/ApiSysDicController.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.handler.api.rest; - -import javax.servlet.http.HttpServletRequest; -import javax.validation.Valid; - -import com.chatopera.cc.util.RestResult; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RestController; - -import com.chatopera.cc.util.Menu; -import com.chatopera.cc.util.RestResultType; -import com.chatopera.cc.app.handler.Handler; -import com.chatopera.cc.app.model.UKeFuDic; - -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; - -@RestController -@RequestMapping("/api/sysdic") -@Api(value = "数据字典" , description = "数据字典功能") -public class ApiSysDicController extends Handler{ - - /** - * 返回所有部门 - * @param request - * @param username 搜索用户名,精确搜索 - * @return - */ - @RequestMapping( method = RequestMethod.GET) - @Menu(type = "apps" , subtype = "sysdic" , access = true) - @ApiOperation("获取在线客服") - public ResponseEntity list(HttpServletRequest request , @Valid String code) { - return new ResponseEntity<>(new RestResult(RestResultType.OK, UKeFuDic.getInstance().getDic(code)), HttpStatus.OK); - } -} \ No newline at end of file diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/handler/apps/AppsController.java b/contact-center/app/src/main/java/com/chatopera/cc/app/handler/apps/AppsController.java deleted file mode 100644 index 3c18b864..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/handler/apps/AppsController.java +++ /dev/null @@ -1,273 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.handler.apps; - -import java.util.ArrayList; -import java.util.Date; -import java.util.List; - -import javax.servlet.http.HttpServletRequest; -import javax.validation.Valid; - -import com.chatopera.cc.app.basic.MainContext; -import com.chatopera.cc.app.basic.MainUtils; -import com.chatopera.cc.util.Menu; -import com.chatopera.cc.app.algorithm.AutomaticServiceDist; -import com.chatopera.cc.app.cache.CacheHelper; -import com.chatopera.cc.app.persistence.es.ContactsRepository; -import com.chatopera.cc.util.OnlineUserUtils; -import com.chatopera.cc.app.handler.Handler; -import org.apache.commons.lang.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Sort; -import org.springframework.stereotype.Controller; -import org.springframework.ui.ModelMap; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.servlet.ModelAndView; - -import com.chatopera.cc.app.persistence.repository.InviteRecordRepository; -import com.chatopera.cc.app.persistence.repository.OnlineUserRepository; -import com.chatopera.cc.app.persistence.repository.OrgiSkillRelRepository; -import com.chatopera.cc.app.persistence.repository.UserEventRepository; -import com.chatopera.cc.app.persistence.repository.UserRepository; -import com.chatopera.cc.app.model.AgentStatus; -import com.chatopera.cc.app.model.Contacts; -import com.chatopera.cc.app.model.InviteRecord; -import com.chatopera.cc.app.model.OnlineUser; -import com.chatopera.cc.app.model.OrgiSkillRel; -import com.chatopera.cc.app.model.User; - -@Controller -public class AppsController extends Handler { - - @Autowired - private UserRepository userRes; - - @Autowired - private OnlineUserRepository onlineUserRes; - - @Autowired - private UserEventRepository userEventRes ; - - @Autowired - private InviteRecordRepository inviteRecordRes ; - - @Autowired - private ContactsRepository contactsRes ; - - @Autowired - private OrgiSkillRelRepository orgiSkillRelService; - - @RequestMapping({"/apps/content"}) - @Menu(type="apps", subtype="content") - public ModelAndView content(ModelMap map , HttpServletRequest request,@Valid String msg){ - - Page onlineUserList = this.onlineUserRes.findByOrgiAndStatus(super.getOrgi(request), MainContext.OnlineUserOperatorStatus.ONLINE.toString(), new PageRequest(super.getP(request), super.getPs(request), Sort.Direction.DESC, new String[] { "createtime" })) ; - List ids = new ArrayList(); - for(OnlineUser onlineUser : onlineUserList.getContent()){ - onlineUser.setBetweentime((int) (System.currentTimeMillis() - onlineUser.getLogintime().getTime())); - if(!StringUtils.isBlank(onlineUser.getContactsid())){ - ids.add(onlineUser.getContactsid()) ; - } - } - if(ids.size() > 0){ - Iterable contactsList = contactsRes.findAll(ids) ; - for(OnlineUser onlineUser : onlineUserList.getContent()){ - if(!StringUtils.isBlank(onlineUser.getContactsid())){ - for(Contacts contacts : contactsList){ - if(onlineUser.getContactsid().equals(contacts.getId())){ - onlineUser.setContacts(contacts); - } - } - } - } - } - map.put("onlineUserList", onlineUserList); - map.put("msg", msg); - aggValues(map, request); - - return request(super.createAppsTempletResponse("/apps/desktop/index")); - } - - private void aggValues(ModelMap map , HttpServletRequest request){ - map.put("agentReport", AutomaticServiceDist.getAgentReport(super.getOrgi(request))) ; - map.put("webIMReport", MainUtils.getWebIMReport(userEventRes.findByOrgiAndCreatetimeRange(super.getOrgi(request), MainUtils.getStartTime() , MainUtils.getEndTime()))) ; - - map.put("agents",getUsers(request).size()) ; - - map.put("webIMInvite", MainUtils.getWebIMInviteStatus(onlineUserRes.findByOrgiAndStatus(super.getOrgi(request), MainContext.OnlineUserOperatorStatus.ONLINE.toString()))) ; - - map.put("inviteResult", MainUtils.getWebIMInviteResult(onlineUserRes.findByOrgiAndAgentnoAndCreatetimeRange(super.getOrgi(request), super.getUser(request).getId() , MainUtils.getStartTime() , MainUtils.getEndTime()))) ; - - map.put("agentUserCount", onlineUserRes.countByAgentForAgentUser(super.getOrgi(request), MainContext.AgentUserStatusEnum.INSERVICE.toString(),super.getUser(request).getId() , MainUtils.getStartTime() , MainUtils.getEndTime())) ; - - map.put("agentServicesCount", onlineUserRes.countByAgentForAgentUser(super.getOrgi(request), MainContext.AgentUserStatusEnum.END.toString(),super.getUser(request).getId() , MainUtils.getStartTime() , MainUtils.getEndTime())) ; - - map.put("agentServicesAvg", onlineUserRes.countByAgentForAvagTime(super.getOrgi(request), MainContext.AgentUserStatusEnum.END.toString(),super.getUser(request).getId() , MainUtils.getStartTime() , MainUtils.getEndTime())) ; - - } - @RequestMapping({"/apps/onlineuser"}) - @Menu(type="apps", subtype="onlineuser") - public ModelAndView onlineuser(ModelMap map , HttpServletRequest request){ - Page onlineUserList = this.onlineUserRes.findByOrgiAndStatus(super.getOrgi(request), MainContext.OnlineUserOperatorStatus.ONLINE.toString(), new PageRequest(super.getP(request), super.getPs(request), Sort.Direction.DESC, new String[] { "createtime" })) ; - List ids = new ArrayList(); - for(OnlineUser onlineUser : onlineUserList.getContent()){ - onlineUser.setBetweentime((int) (System.currentTimeMillis() - onlineUser.getLogintime().getTime())); - if(!StringUtils.isBlank(onlineUser.getContactsid())){ - ids.add(onlineUser.getContactsid()) ; - } - } - if(ids.size() > 0){ - Iterable contactsList = contactsRes.findAll(ids) ; - for(OnlineUser onlineUser : onlineUserList.getContent()){ - if(!StringUtils.isBlank(onlineUser.getContactsid())){ - for(Contacts contacts : contactsList){ - if(onlineUser.getContactsid().equals(contacts.getId())){ - onlineUser.setContacts(contacts); - } - } - } - } - } - map.put("onlineUserList", onlineUserList); - aggValues(map, request); - - return request(super.createAppsTempletResponse("/apps/desktop/onlineuser")); - } - - @RequestMapping({"/apps/invite"}) - @Menu(type="apps", subtype="invite") - public ModelAndView invite(ModelMap map , HttpServletRequest request , @Valid String id) throws Exception{ - OnlineUser onlineUser = onlineUserRes.findOne(id) ; - if(onlineUser!=null){ - onlineUser.setInvitestatus(MainContext.OnlineUserInviteStatus.INVITE.toString()); - onlineUser.setInvitetimes(onlineUser.getInvitetimes()+1); - onlineUserRes.save(onlineUser) ; - OnlineUserUtils.sendWebIMClients(onlineUser.getUserid() , "invite"); - InviteRecord record = new InviteRecord() ; - record.setAgentno(super.getUser(request).getId()); - record.setUserid(onlineUser.getUserid()); - record.setAppid(onlineUser.getAppid()); - record.setOrgi(super.getOrgi(request)); - inviteRecordRes.save(record) ; - } - - return request(super.createRequestPageTempletResponse("redirect:/apps/content.html")); - } - - @RequestMapping({"/apps/profile"}) - @Menu(type="apps", subtype="content") - public ModelAndView profile(ModelMap map , HttpServletRequest request,@Valid String index){ - map.addAttribute("userData",super.getUser(request)) ; - map.addAttribute("index",index) ; - return request(super.createRequestPageTempletResponse("/apps/desktop/profile")); - } - - @RequestMapping({"/apps/profile/save"}) - @Menu(type="apps", subtype="content") - public ModelAndView profile(ModelMap map , HttpServletRequest request , @Valid User user, @Valid String index){ - User tempUser = userRes.getOne(user.getId()) ; - if(tempUser != null){ - String msg = validUserUpdate(user,tempUser); - if(!StringUtils.isBlank(msg)){ - if(StringUtils.isBlank(index)) { - return request(super.createRequestPageTempletResponse("redirect:/apps/content.html?msg="+msg)); - } - return request(super.createRequestPageTempletResponse("redirect:/apps/tenant/index.html?msg="+msg)); - } - tempUser.setUname(user.getUname()); - tempUser.setEmail(user.getEmail()); - tempUser.setMobile(user.getMobile()); - //切换成非坐席 判断是否坐席 以及 是否有对话 - if(!user.isAgent()) { - AgentStatus agentStatus = (AgentStatus) CacheHelper.getAgentStatusCacheBean().getCacheObject((super.getUser(request)).getId(), super.getOrgi(request)); - if(!(agentStatus==null && AutomaticServiceDist.getAgentUsers(super.getUser(request).getId(), super.getOrgi(request))==0)) { - if(StringUtils.isBlank(index)) { - return request(super.createRequestPageTempletResponse("redirect:/apps/content.html?msg=t1")); - } - return request(super.createRequestPageTempletResponse("redirect:/apps/tenant/index.html?msg=t1")); - } - } - tempUser.setAgent(user.isAgent()); - tempUser.setOrgi(super.getOrgiByTenantshare(request)); - if(!StringUtils.isBlank(user.getPassword())){ - tempUser.setPassword(MainUtils.md5(user.getPassword())); - } - if(tempUser.getCreatetime() == null){ - tempUser.setCreatetime(new Date()); - } - tempUser.setUpdatetime(new Date()); - userRes.save(tempUser) ; - User sessionUser = super.getUser(request) ; - tempUser.setRoleList(sessionUser.getRoleList()) ; - tempUser.setRoleAuthMap(sessionUser.getRoleAuthMap()); - tempUser.setMyorgans(sessionUser.getMyorgans()); - User u = tempUser; - u.setOrgi(super.getOrgi(request)); - super.setUser(request, u); - } - if(StringUtils.isBlank(index)) { - return request(super.createRequestPageTempletResponse("redirect:/apps/content.html")); - } - return request(super.createRequestPageTempletResponse("redirect:/apps/tenant/index.html")); - } - - private String validUserUpdate(User user,User oldUser) { - String msg = ""; - User tempUser = userRes.findByUsernameAndDatastatus(user.getUsername(),false) ; - if(tempUser!=null&&!user.getUsername().equals(oldUser.getUsername())) { - msg = "username_exist"; - return msg; - } - tempUser = userRes.findByEmailAndDatastatus(user.getEmail(),false) ; - if(tempUser!=null&&!user.getEmail().equals(oldUser.getEmail())) { - msg = "email_exist"; - return msg; - } - tempUser = userRes.findByMobileAndDatastatus(user.getMobile(),false) ; - if(tempUser!=null&&!user.getMobile().equals(oldUser.getMobile())) { - msg = "mobile_exist"; - return msg; - } - return msg; - } - /** - * 获取当前产品下人员信息 - * @param request - * @param q - * @return - */ - private List getUsers(HttpServletRequest request){ - List userList = null; - if(super.isTenantshare()) { - List organIdList = new ArrayList<>(); - List orgiSkillRelList = orgiSkillRelService.findByOrgi(super.getOrgi(request)) ; - if(!orgiSkillRelList.isEmpty()) { - for(OrgiSkillRel rel:orgiSkillRelList) { - organIdList.add(rel.getSkillid()); - } - } - userList=userRes.findByOrganInAndAgentAndDatastatus(organIdList,true,false); - }else { - userList=userRes.findByOrgiAndAgentAndDatastatus(super.getOrgi(request), true,false) ; - } - return userList; - } - -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/handler/apps/agent/AgentController.java b/contact-center/app/src/main/java/com/chatopera/cc/app/handler/apps/agent/AgentController.java deleted file mode 100644 index 70ff8b17..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/handler/apps/agent/AgentController.java +++ /dev/null @@ -1,1336 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.handler.apps.agent; - -import com.chatopera.cc.app.algorithm.AutomaticServiceDist; -import com.chatopera.cc.app.basic.MainContext; -import com.chatopera.cc.app.basic.MainUtils; -import com.chatopera.cc.app.cache.CacheHelper; -import com.chatopera.cc.app.handler.Handler; -import com.chatopera.cc.app.im.client.NettyClients; -import com.chatopera.cc.app.im.message.ChatMessage; -import com.chatopera.cc.app.im.router.OutMessageRouter; -import com.chatopera.cc.app.model.*; -import com.chatopera.cc.app.persistence.blob.JpaBlobHelper; -import com.chatopera.cc.app.persistence.es.ContactsRepository; -import com.chatopera.cc.app.persistence.es.QuickReplyRepository; -import com.chatopera.cc.app.persistence.repository.*; -import com.chatopera.cc.exception.CSKefuException; -import com.chatopera.cc.exchange.DataExchangeInterface; -import com.chatopera.cc.util.*; -import com.chatopera.cc.util.mobile.MobileAddress; -import com.chatopera.cc.util.mobile.MobileNumberUtils; -import freemarker.template.TemplateException; -import org.apache.commons.io.FileUtils; -import org.apache.commons.lang.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Sort; -import org.springframework.data.domain.Sort.Direction; -import org.springframework.data.domain.Sort.Order; -import org.springframework.stereotype.Controller; -import org.springframework.ui.ModelMap; -import org.springframework.util.FileCopyUtils; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.multipart.MultipartFile; -import org.springframework.web.servlet.ModelAndView; - -import javax.servlet.http.Cookie; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; -import java.io.File; -import java.io.IOException; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; - -@Controller -@RequestMapping("/agent") -public class AgentController extends Handler { - - static final Logger logger = LoggerFactory.getLogger(AgentController.class); - - @Autowired - private ContactsRepository contactsRes; - - @Autowired - private PropertiesEventRepository propertiesEventRes; - - @Autowired - private AgentUserRepository agentUserRepository; - - - @Autowired - private AgentUserContactsRepository agentUserContactsRepository; - - @Autowired - private AgentStatusRepository agentStatusRepository; - - @Autowired - private AgentServiceRepository agentServiceRepository; - - @Autowired - private OnlineUserRepository onlineUserRes; - - @Autowired - private WeiXinUserRepository weiXinUserRes; - - @Autowired - private ServiceSummaryRepository serviceSummaryRes; - - @Autowired - private ChatMessageRepository chatMessageRepository; - - @Autowired - private AttachmentRepository attachementRes; - - @Autowired - private BlackListRepository blackListRes; - - @Autowired - private TagRepository tagRes; - - @Autowired - private OrganRepository organRes; - - @Autowired - private TagRelationRepository tagRelationRes; - - @Autowired - private QuickReplyRepository quickReplyRes; - - @Autowired - private QuickTypeRepository quickTypeRes; - - @Autowired - private AgentUserTaskRepository agentUserTaskRes; - - @Autowired - private SNSAccountRepository snsAccountRes; - - @Autowired - private UserRepository userRes; - - - @Autowired - private StatusEventRepository statusEventRes; - - @Autowired - private PbxHostRepository pbxHostRes; - - - @Autowired - private AgentUserContactsRepository agentUserContactsRes; - - - @Autowired - private ConsultInviteRepository inviteRepository; - - @Autowired - private StreamingFileRepository streamingFileRepository; - - @Autowired - private JpaBlobHelper jpaBlobHelper; - - @Value("${web.upload-path}") - private String path; - - @RequestMapping("/index") - @Menu(type = "apps", subtype = "agent") - public ModelAndView index(ModelMap map, HttpServletRequest request, HttpServletResponse response, @Valid String sort) throws IOException, TemplateException { - ModelAndView view = request(super.createAppsTempletResponse("/apps/agent/index")); - User user = super.getUser(request); - Sort defaultSort = null; - if (StringUtils.isBlank(sort)) { - Cookie[] cookies = request.getCookies();//这样便可以获取一个cookie数组 - if (cookies != null) { - for (Cookie cookie : cookies) { - if (cookie.getName().equals("sort")) { - sort = cookie.getValue(); - break; - } - } - } - } - if (StringUtils.isNotBlank(sort)) { - List list = new ArrayList(); - if (sort.equals("lastmessage")) { - list.add(new Order(Direction.DESC, "status")); - list.add(new Order(Direction.DESC, "lastmessage")); - } else if (sort.equals("logintime")) { - list.add(new Order(Direction.DESC, "status")); - list.add(new Order(Direction.DESC, "createtime")); - } else if (sort.equals("default")) { - defaultSort = new Sort(Direction.DESC, "status"); - Cookie name = new Cookie("sort", null); - name.setMaxAge(0); - response.addCookie(name); - } - if (list.size() > 0) { - defaultSort = new Sort(list); - Cookie name = new Cookie("sort", sort); - name.setMaxAge(60 * 60 * 24 * 365); - response.addCookie(name); - map.addAttribute("sort", sort); - } - } else { - defaultSort = new Sort(Direction.DESC, "status"); - } - List agentUserList = agentUserRepository.findByAgentnoAndOrgi(user.getId(), super.getOrgi(request), defaultSort); - view.addObject("agentUserList", agentUserList); - - SessionConfig sessionConfig = AutomaticServiceDist.initSessionConfig(super.getOrgi(request)); - - view.addObject("sessionConfig", sessionConfig); - if (sessionConfig.isOtherquickplay()) { - view.addObject("topicList", OnlineUserUtils.search(null, super.getOrgi(request), super.getUser(request))); - } - - if (agentUserList.size() > 0) { - AgentUser agentUser = agentUserList.get(0); - agentUser = (AgentUser) agentUserList.get(0); - view.addObject("curagentuser", agentUser); - view.addObject("inviteData", OnlineUserUtils.cousult(agentUser.getAppid(), agentUser.getOrgi(), inviteRepository)); - if (StringUtils.isNotBlank(agentUser.getAgentserviceid())) { - List summarizes = this.serviceSummaryRes.findByAgentserviceidAndOrgi(agentUser.getAgentserviceid(), super.getOrgi(request)); - if (summarizes.size() > 0) { - view.addObject("summary", summarizes.get(0)); - } - } - - view.addObject("agentUserMessageList", this.chatMessageRepository.findByUsessionAndOrgi(agentUser.getUserid(), super.getOrgi(request), new PageRequest(0, 20, Direction.DESC, "updatetime"))); - AgentService agentService = null; - if (StringUtils.isNotBlank(agentUser.getAgentserviceid())) { - agentService = this.agentServiceRepository.findOne(agentUser.getAgentserviceid()); - view.addObject("curAgentService", agentService); - - if (agentService != null) { - /** - * 获取关联数据 - */ - processRelaData(request, agentService, map); - } - } - - if (MainContext.ChannelTypeEnum.WEIXIN.toString().equals(agentUser.getChannel())) { - List weiXinUserList = weiXinUserRes.findByOpenidAndOrgi(agentUser.getUserid(), super.getOrgi(request)); - if (weiXinUserList.size() > 0) { - WeiXinUser weiXinUser = weiXinUserList.get(0); - view.addObject("weiXinUser", weiXinUser); - } - } else if (MainContext.ChannelTypeEnum.WEBIM.toString().equals(agentUser.getChannel())) { - List onlineUserList = this.onlineUserRes.findByUseridAndOrgi(agentUser.getUserid(), super.getOrgi(request)); - if (onlineUserList.size() > 0) { - OnlineUser onlineUser = onlineUserList.get(0); - if (MainContext.OnlineUserOperatorStatus.OFFLINE.toString().equals(onlineUser.getStatus())) { - onlineUser.setBetweentime((int) (onlineUser.getUpdatetime().getTime() - onlineUser.getLogintime().getTime())); - } else { - onlineUser.setBetweentime((int) (System.currentTimeMillis() - onlineUser.getLogintime().getTime())); - } - view.addObject("onlineUser", onlineUser); - } - } else if (MainContext.ChannelTypeEnum.PHONE.toString().equals(agentUser.getChannel())) { - if (agentService != null && StringUtils.isNotBlank(agentService.getOwner())) { - StatusEvent statusEvent = this.statusEventRes.findById(agentService.getOwner()); - if (statusEvent != null) { - if (StringUtils.isNotBlank(statusEvent.getHostid())) { - PbxHost pbxHost = pbxHostRes.findById(statusEvent.getHostid()); - view.addObject("pbxHost", pbxHost); - } - view.addObject("statusEvent", statusEvent); - } - MobileAddress ma = MobileNumberUtils.getAddress(agentUser.getPhone()); - view.addObject("mobileAddress", ma); - } - } - - view.addObject("serviceCount", Integer - .valueOf(this.agentServiceRepository - .countByUseridAndOrgiAndStatus(agentUser - .getUserid(), super.getOrgi(request), - MainContext.AgentUserStatusEnum.END.toString()))); - - view.addObject("tags", tagRes.findByOrgiAndTagtype(super.getOrgi(request), MainContext.ModelType.USER.toString())); - view.addObject("tagRelationList", tagRelationRes.findByUserid(agentUser.getUserid())); - view.addObject("quickReplyList", quickReplyRes.findByOrgiAndCreater(super.getOrgi(request), super.getUser(request).getId(), null)); - List quickTypeList = quickTypeRes.findByOrgiAndQuicktype(super.getOrgi(request), MainContext.QuickTypeEnum.PUB.toString()); - List priQuickTypeList = quickTypeRes.findByOrgiAndQuicktypeAndCreater(super.getOrgi(request), MainContext.QuickTypeEnum.PRI.toString(), super.getUser(request).getId()); - quickTypeList.addAll(priQuickTypeList); - view.addObject("pubQuickTypeList", quickTypeList); - } - return view; - } - - @RequestMapping("/agentusers") - @Menu(type = "apps", subtype = "agent") - public ModelAndView agentusers(HttpServletRequest request, String userid) { - ModelAndView view = request(super.createRequestPageTempletResponse("/apps/agent/agentusers")); - User user = super.getUser(request); - view.addObject("agentUserList", agentUserRepository.findByAgentnoAndOrgi(user.getId(), super.getOrgi(request), new Sort(Direction.DESC, "status"))); - List agentUserList = agentUserRepository.findByUseridAndOrgi(userid, super.getOrgi(request)); - view.addObject("curagentuser", agentUserList != null && agentUserList.size() > 0 ? agentUserList.get(0) : null); - - return view; - } - - private void processRelaData(HttpServletRequest request, AgentService agentService, ModelMap map) { - Sort defaultSort = null; - defaultSort = new Sort(Direction.DESC, "servicetime"); - map.addAttribute("agentServiceList", - agentServiceRepository.findByUseridAndOrgiAndStatus( - agentService.getUserid(), - super.getOrgi(request), - MainContext.AgentUserStatusEnum.END.toString(), - defaultSort - ) - ); - - if (StringUtils.isNotBlank(agentService.getAppid())) { - map.addAttribute("snsAccount", snsAccountRes.findBySnsidAndOrgi(agentService.getAppid(), super.getOrgi(request))); - } - List relaList = agentUserContactsRes.findByUseridAndOrgi(agentService.getUserid(), agentService.getOrgi()); - if (relaList.size() > 0) { - AgentUserContacts agentUserContacts = relaList.get(0); - if (MainContext.model.get("contacts") != null && StringUtils.isNotBlank(agentUserContacts.getContactsid())) { - DataExchangeInterface dataExchange = (DataExchangeInterface) MainContext.getContext().getBean("contacts"); - if (dataExchange != null) { - map.addAttribute("contacts", dataExchange.getDataByIdAndOrgi(agentUserContacts.getContactsid(), super.getOrgi(request))); - } - } - if (MainContext.model.get("workorders") != null && StringUtils.isNotBlank(agentUserContacts.getContactsid())) { - DataExchangeInterface dataExchange = (DataExchangeInterface) MainContext.getContext().getBean("workorders"); - if (dataExchange != null) { - map.addAttribute("workOrdersList", dataExchange.getListDataByIdAndOrgi(agentUserContacts.getContactsid(), super.getUser(request).getId(), super.getOrgi(request))); - } - map.addAttribute("contactsid", agentUserContacts.getContactsid()); - } - } - } - - @RequestMapping("/agentuser") - @Menu(type = "apps", subtype = "agent") - public ModelAndView agentuser(ModelMap map, - HttpServletRequest request, - String id, - String channel) throws IOException, TemplateException { - String mainagentuser = "/apps/agent/mainagentuser"; - if (channel.equals("phone")) { - mainagentuser = "/apps/agent/mainagentuser_callout"; - } - ModelAndView view = request(super.createRequestPageTempletResponse(mainagentuser)); - AgentUser agentUser = agentUserRepository.findByIdAndOrgi(id, super.getOrgi(request)); - if (agentUser != null) { - view.addObject("curagentuser", agentUser); - view.addObject("inviteData", OnlineUserUtils.cousult(agentUser.getAppid(), agentUser.getOrgi(), inviteRepository)); - List agentUserTaskList = agentUserTaskRes.findByIdAndOrgi(id, super.getOrgi(request)); - if (agentUserTaskList.size() > 0) { - AgentUserTask agentUserTask = agentUserTaskList.get(0); - agentUserTask.setTokenum(0); - agentUserTaskRes.save(agentUserTask); - } - - if (StringUtils.isNotBlank(agentUser.getAgentserviceid())) { - List summarizes = this.serviceSummaryRes.findByAgentserviceidAndOrgi(agentUser.getAgentserviceid(), super.getOrgi(request)); - if (summarizes.size() > 0) { - view.addObject("summary", summarizes.get(0)); - } - } - - view.addObject("agentUserMessageList", this.chatMessageRepository.findByUsessionAndOrgi(agentUser.getUserid(), super.getOrgi(request), new PageRequest(0, 20, Direction.DESC, "updatetime"))); - AgentService agentService = null; - if (StringUtils.isNotBlank(agentUser.getAgentserviceid())) { - agentService = this.agentServiceRepository.findOne(agentUser.getAgentserviceid()); - view.addObject("curAgentService", agentService); - if (agentService != null) { - /** - * 获取关联数据 - */ - processRelaData(request, agentService, map); - } - } - if (MainContext.ChannelTypeEnum.WEIXIN.toString().equals(agentUser.getChannel())) { - List weiXinUserList = weiXinUserRes.findByOpenidAndOrgi(agentUser.getUserid(), super.getOrgi(request)); - if (weiXinUserList.size() > 0) { - WeiXinUser weiXinUser = weiXinUserList.get(0); - view.addObject("weiXinUser", weiXinUser); - } - } else if (MainContext.ChannelTypeEnum.WEBIM.toString().equals(agentUser.getChannel())) { - List onlineUserList = this.onlineUserRes.findByUseridAndOrgi(agentUser.getUserid(), super.getOrgi(request)); - if (onlineUserList.size() > 0) { - OnlineUser onlineUser = onlineUserList.get(0); - if (onlineUser.getLogintime() != null) { - if (MainContext.OnlineUserOperatorStatus.OFFLINE.toString().equals(onlineUser.getStatus())) { - onlineUser.setBetweentime((int) (onlineUser.getUpdatetime().getTime() - onlineUser.getLogintime().getTime())); - } else { - onlineUser.setBetweentime((int) (System.currentTimeMillis() - onlineUser.getLogintime().getTime())); - } - } - view.addObject("onlineUser", onlineUser); - } - } else if (MainContext.ChannelTypeEnum.PHONE.toString().equals(agentUser.getChannel())) { - if (agentService != null && StringUtils.isNotBlank(agentService.getOwner())) { - StatusEvent statusEvent = this.statusEventRes.findById(agentService.getOwner()); - if (statusEvent != null) { - if (StringUtils.isNotBlank(statusEvent.getHostid())) { - PbxHost pbxHost = pbxHostRes.findById(statusEvent.getHostid()); - view.addObject("pbxHost", pbxHost); - } - view.addObject("statusEvent", statusEvent); - } - } - } - - - view.addObject("serviceCount", Integer - .valueOf(this.agentServiceRepository - .countByUseridAndOrgiAndStatus(agentUser - .getUserid(), super.getOrgi(request), - MainContext.AgentUserStatusEnum.END - .toString()))); - view.addObject("tagRelationList", tagRelationRes.findByUserid(agentUser.getUserid())); - } - - SessionConfig sessionConfig = AutomaticServiceDist.initSessionConfig(super.getOrgi(request)); - - view.addObject("sessionConfig", sessionConfig); - if (sessionConfig.isOtherquickplay()) { - view.addObject("topicList", OnlineUserUtils.search(null, super.getOrgi(request), super.getUser(request))); - } - - - view.addObject("tags", tagRes.findByOrgiAndTagtype(super.getOrgi(request), MainContext.ModelType.USER.toString())); - view.addObject("quickReplyList", quickReplyRes.findByOrgiAndCreater(super.getOrgi(request), super.getUser(request).getId(), null)); - List quickTypeList = quickTypeRes.findByOrgiAndQuicktype(super.getOrgi(request), MainContext.QuickTypeEnum.PUB.toString()); - List priQuickTypeList = quickTypeRes.findByOrgiAndQuicktypeAndCreater(super.getOrgi(request), MainContext.QuickTypeEnum.PRI.toString(), super.getUser(request).getId()); - quickTypeList.addAll(priQuickTypeList); - view.addObject("pubQuickTypeList", quickTypeList); - - return view; - } - - @RequestMapping("/other/topic") - @Menu(type = "apps", subtype = "othertopic") - public ModelAndView othertopic(ModelMap map, HttpServletRequest request, String q) throws IOException, TemplateException { - SessionConfig sessionConfig = AutomaticServiceDist.initSessionConfig(super.getOrgi(request)); - - map.put("sessionConfig", sessionConfig); - if (sessionConfig.isOtherquickplay()) { - map.put("topicList", OnlineUserUtils.search(q, super.getOrgi(request), super.getUser(request))); - } - - return request(super.createRequestPageTempletResponse("/apps/agent/othertopic")); - } - - @RequestMapping("/other/topic/detail") - @Menu(type = "apps", subtype = "othertopicdetail") - public ModelAndView othertopicdetail(ModelMap map, HttpServletRequest request, String id) throws IOException, TemplateException { - SessionConfig sessionConfig = AutomaticServiceDist.initSessionConfig(super.getOrgi(request)); - - map.put("sessionConfig", sessionConfig); - if (sessionConfig.isOtherquickplay()) { - map.put("topic", OnlineUserUtils.detail(id, super.getOrgi(request), super.getUser(request))); - } - - return request(super.createRequestPageTempletResponse("/apps/agent/topicdetail")); - } - - - @RequestMapping("/workorders/list") - @Menu(type = "apps", subtype = "workorderslist") - public ModelAndView workorderslist(HttpServletRequest request, String contactsid, ModelMap map) { - if (MainContext.model.get("workorders") != null && StringUtils.isNotBlank(contactsid)) { - DataExchangeInterface dataExchange = (DataExchangeInterface) MainContext.getContext().getBean("workorders"); - if (dataExchange != null) { - map.addAttribute("workOrdersList", dataExchange.getListDataByIdAndOrgi(contactsid, super.getUser(request).getId(), super.getOrgi(request))); - } - map.addAttribute("contactsid", contactsid); - } - return request(super.createRequestPageTempletResponse("/apps/agent/workorders")); - } - - - @RequestMapping(value = "/ready") - @Menu(type = "apps", subtype = "agent") - public ModelAndView ready(HttpServletRequest request) { - User user = super.getUser(request); - List agentStatusList = agentStatusRepository.findByAgentnoAndOrgi(user.getId(), super.getOrgi(request)); - AgentStatus agentStatus = null; - if (agentStatusList.size() > 0) { - agentStatus = agentStatusList.get(0); - } else { - agentStatus = new AgentStatus(); - agentStatus.setUserid(user.getId()); - agentStatus.setUsername(user.getUname()); - agentStatus.setAgentno(user.getId()); - agentStatus.setLogindate(new Date()); - - if (StringUtils.isNotBlank(user.getOrgan())) { - Organ organ = organRes.findByIdAndOrgi(user.getOrgan(), super.getOrgiByTenantshare(request)); - if (organ != null && organ.isSkill()) { - agentStatus.setSkill(organ.getId()); - agentStatus.setSkillname(organ.getName()); - } - } - agentStatus.setUpdatetime(new Date()); - SessionConfig sessionConfig = AutomaticServiceDist.initSessionConfig(super.getOrgi(request)); - - agentStatus.setUsers(agentUserRepository.countByAgentnoAndStatusAndOrgi(user.getId(), MainContext.AgentUserStatusEnum.INSERVICE.toString(), super.getOrgi(request))); - - agentStatus.setOrgi(super.getOrgi(request)); - agentStatus.setMaxusers(sessionConfig.getMaxuser()); - agentStatusRepository.save(agentStatus); - } - if (agentStatus != null) { - /** - * 更新当前用户状态 - */ - agentStatus.setUsers(AutomaticServiceDist.getAgentUsers(agentStatus.getAgentno(), super.getOrgi(request))); - agentStatus.setStatus(MainContext.AgentStatusEnum.READY.toString()); - CacheHelper.getAgentStatusCacheBean().put(agentStatus.getAgentno(), agentStatus, super.getOrgi(request)); - - AutomaticServiceDist.allotAgent(agentStatus.getAgentno(), super.getOrgi(request)); - - AutomaticServiceDist.recordAgentStatus(agentStatus.getAgentno(), agentStatus.getUsername(), agentStatus.getAgentno(), agentStatus.getSkill(), "0".equals(super.getUser(request).getUsertype()), agentStatus.getAgentno(), MainContext.AgentStatusEnum.OFFLINE.toString(), MainContext.AgentStatusEnum.READY.toString(), MainContext.AgentWorkType.MEIDIACHAT.toString(), agentStatus.getOrgi(), null); - } - - return request(super.createRequestPageTempletResponse("/public/success")); - } - - @RequestMapping(value = "/notready") - @Menu(type = "apps", subtype = "agent") - public ModelAndView notready(HttpServletRequest request) { - User user = super.getUser(request); - if (user != null) { - AutomaticServiceDist.deleteAgentStatus(user.getId(), user.getOrgi(), "0".equals(user.getUsertype())); - } - return request(super.createRequestPageTempletResponse("/public/success")); - } - - @RequestMapping(value = "/busy") - @Menu(type = "apps", subtype = "agent") - public ModelAndView busy(HttpServletRequest request) { - User user = super.getUser(request); - List agentStatusList = agentStatusRepository.findByAgentnoAndOrgi(user.getId(), super.getOrgi(request)); - AgentStatus agentStatus = null; - if (agentStatusList.size() > 0) { - agentStatus = agentStatusList.get(0); - agentStatus.setBusy(true); - AutomaticServiceDist.recordAgentStatus(agentStatus.getAgentno(), agentStatus.getUsername(), agentStatus.getAgentno(), agentStatus.getSkill(), "0".equals(super.getUser(request).getUsertype()), agentStatus.getAgentno(), MainContext.AgentStatusEnum.READY.toString(), MainContext.AgentStatusEnum.BUSY.toString(), MainContext.AgentWorkType.MEIDIACHAT.toString(), agentStatus.getOrgi(), agentStatus.getUpdatetime()); - agentStatus.setUpdatetime(new Date()); - agentStatusRepository.save(agentStatus); - CacheHelper.getAgentStatusCacheBean().put(agentStatus.getAgentno(), agentStatus, super.getOrgi(request)); - } - AutomaticServiceDist.publishMessage(super.getOrgi(request), "agent", "busy", user.getId()); - - return request(super.createRequestPageTempletResponse("/public/success")); - } - - @RequestMapping(value = "/notbusy") - @Menu(type = "apps", subtype = "agent") - public ModelAndView notbusy(HttpServletRequest request) { - User user = super.getUser(request); - List agentStatusList = agentStatusRepository.findByAgentnoAndOrgi(user.getId(), super.getOrgi(request)); - AgentStatus agentStatus = null; - if (agentStatusList.size() > 0) { - agentStatus = agentStatusList.get(0); - agentStatus.setBusy(false); - AutomaticServiceDist.recordAgentStatus(agentStatus.getAgentno(), agentStatus.getUsername(), agentStatus.getAgentno(), agentStatus.getSkill(), "0".equals(super.getUser(request).getUsertype()), agentStatus.getAgentno(), MainContext.AgentStatusEnum.BUSY.toString(), MainContext.AgentStatusEnum.READY.toString(), MainContext.AgentWorkType.MEIDIACHAT.toString(), agentStatus.getOrgi(), agentStatus.getUpdatetime()); - - agentStatus.setUpdatetime(new Date()); - agentStatusRepository.save(agentStatus); - CacheHelper.getAgentStatusCacheBean().put(agentStatus.getAgentno(), agentStatus, super.getOrgi(request)); - AutomaticServiceDist.allotAgent(agentStatus.getAgentno(), super.getOrgi(request)); - } - return request(super.createRequestPageTempletResponse("/public/success")); - } - - @RequestMapping(value = "/clean") - @Menu(type = "apps", subtype = "clean", access = false) - public ModelAndView clean(HttpServletRequest request) throws Exception { - List agentUserList = agentUserRepository.findByAgentnoAndStatusAndOrgi(super.getUser(request).getId(), MainContext.AgentUserStatusEnum.END.toString(), super.getOrgi(request)); - List agentServiceList = new ArrayList(); - for (AgentUser agentUser : agentUserList) { - if (agentUser != null && super.getUser(request).getId().equals(agentUser.getAgentno())) { - AutomaticServiceDist.deleteAgentUser(agentUser, super.getOrgi(request)); - AgentService agentService = agentServiceRepository.findByIdAndOrgi(agentUser.getAgentserviceid(), super.getOrgi(request)); - if (agentService != null) { - agentService.setStatus(MainContext.AgentUserStatusEnum.END.toString()); - agentServiceList.add(agentService); - } - } - } - agentServiceRepository.save(agentServiceList); - return request(super - .createRequestPageTempletResponse("redirect:/agent/index.html")); - } - - - @RequestMapping({"/end"}) - @Menu(type = "apps", subtype = "agent") - public ModelAndView end(HttpServletRequest request, @Valid String userid) - throws Exception { - AgentUser agentUser = agentUserRepository.findByIdAndOrgi(userid, super.getOrgi(request)); - if (agentUser != null && super.getUser(request).getId().equals(agentUser.getAgentno())) { - AutomaticServiceDist.deleteAgentUser(agentUser, super.getOrgi(request)); - if (StringUtils.isNotBlank(agentUser.getAgentserviceid())) { - AgentService agentService = agentServiceRepository.findByIdAndOrgi(agentUser.getAgentserviceid(), super.getOrgi(request)); - agentService.setStatus(MainContext.AgentUserStatusEnum.END.toString()); - agentServiceRepository.save(agentService); - } - } - return request(super - .createRequestPageTempletResponse("redirect:/agent/index.html")); - } - - @RequestMapping({"/readmsg"}) - @Menu(type = "apps", subtype = "agent") - public ModelAndView readmsg(HttpServletRequest request, @Valid String userid) - throws Exception { - List agentUserTaskList = agentUserTaskRes.findByIdAndOrgi(userid, super.getOrgi(request)); - if (agentUserTaskList.size() > 0) { - AgentUserTask agentUserTask = agentUserTaskList.get(0); - agentUserTask.setTokenum(0); - agentUserTaskRes.save(agentUserTask); - } - return request(super.createRequestPageTempletResponse("/public/success")); - } - - @RequestMapping({"/blacklist/add"}) - @Menu(type = "apps", subtype = "blacklist") - public ModelAndView blacklistadd(ModelMap map, HttpServletRequest request, @Valid String agentuserid, @Valid String agentserviceid, @Valid String userid) - throws Exception { - map.addAttribute("agentuserid", agentuserid); - map.addAttribute("agentserviceid", agentserviceid); - map.addAttribute("userid", userid); - map.addAttribute("agentUser", agentUserRepository.findByIdAndOrgi(userid, super.getOrgi(request))); - return request(super.createRequestPageTempletResponse("/apps/agent/blacklistadd")); - } - - @RequestMapping({"/blacklist/save"}) - @Menu(type = "apps", subtype = "blacklist") - public ModelAndView blacklist(HttpServletRequest request, @Valid String agentuserid, @Valid String agentserviceid, @Valid String userid, @Valid BlackEntity blackEntity) - throws Exception { - User user = super.getUser(request); - List agentUserList = this.agentUserRepository.findByUseridAndOrgi(userid, super.getOrgi(request)); - if (agentUserList.size() > 0) { - AgentUser agentUser = agentUserList.get(0); - BlackEntity tempBlackEntiry = blackListRes.findByUseridAndOrgi(agentUser.getUserid(), super.getOrgi(request)); - if (tempBlackEntiry == null) { - blackEntity.setUserid(userid); - blackEntity.setCreater(user.getId()); - blackEntity.setOrgi(super.getOrgi(request)); - if (blackEntity.getControltime() > 0) { - blackEntity.setEndtime(new Date(System.currentTimeMillis() + blackEntity.getControltime() * 3600 * 1000L)); - } - blackEntity.setAgentid(user.getId()); - blackEntity.setAgentuser(agentUser.getUsername()); - blackEntity.setSessionid(agentUser.getSessionid()); - blackEntity.setAgentserviceid(agentserviceid); - blackEntity.setChannel(agentUser.getChannel()); - blackListRes.save(blackEntity); - } else { - if (blackEntity.getControltime() > 0) { - tempBlackEntiry.setEndtime(new Date(System.currentTimeMillis() + blackEntity.getControltime() * 3600 * 1000L)); - } - tempBlackEntiry.setDescription(tempBlackEntiry.getDescription()); - tempBlackEntiry.setControltime(blackEntity.getControltime()); - tempBlackEntiry.setAgentuser(agentUser.getUsername()); - blackListRes.save(tempBlackEntiry); - blackEntity = tempBlackEntiry; - } - if (StringUtils.isNotBlank(userid)) { - CacheHelper.getSystemCacheBean().put(userid, blackEntity, super.getOrgi(request)); - } - } - return end(request, agentuserid); - } - - @RequestMapping("/tagrelation") - @Menu(type = "apps", subtype = "tagrelation") - public ModelAndView tagrelation(ModelMap map, HttpServletRequest request, @Valid String userid, @Valid String tagid, @Valid String dataid) { - TagRelation tagRelation = tagRelationRes.findByUseridAndTagid(userid, tagid); - if (tagRelation == null) { - tagRelation = new TagRelation(); - tagRelation.setUserid(userid); - tagRelation.setTagid(tagid); - tagRelation.setDataid(dataid); - tagRelationRes.save(tagRelation); - } else { - tagRelationRes.delete(tagRelation); - } - return request(super - .createRequestPageTempletResponse("/public/success")); - } - - @RequestMapping("/image/upload") - @Menu(type = "im", subtype = "image", access = false) - public ModelAndView upload(ModelMap map, - HttpServletRequest request, - @RequestParam(value = "imgFile", required = false) MultipartFile multipart, - @Valid String id, - @Valid String paste) throws IOException { - ModelAndView view = request(super.createRequestPageTempletResponse("/apps/agent/upload")); - UploadStatus notify = null; - if (multipart != null && multipart.getOriginalFilename().lastIndexOf(".") > 0) { - File uploadDir = new File(path, "upload"); - if (!uploadDir.exists()) { - uploadDir.mkdirs(); - } - String fileid = MainUtils.getUUID(); - String fileURL = null; - ChatMessage data = new ChatMessage(); - StreamingFile sf = new StreamingFile(); - - if (multipart.getContentType() != null && multipart.getContentType().indexOf(Constants.ATTACHMENT_TYPE_IMAGE) >= 0) { - // process thumbnail - File original = new File(path, "upload/" + fileid + "_original"); - File thumbnail = new File(path, "upload/" + fileid); - FileCopyUtils.copy(multipart.getBytes(), original); - MainUtils.processImage(thumbnail, original); - sf.setThumbnail(jpaBlobHelper.createBlobWithFile(thumbnail)); - fileURL = "/res/image.html?id=" + fileid; - } else { - String attachid = processAttachmentFile(multipart, fileid, request); - fileURL = "/res/file.html?id=" + attachid; - } - - sf.setId(fileid); - sf.setData(jpaBlobHelper.createBlob(multipart.getInputStream(), multipart.getSize())); - sf.setName(multipart.getOriginalFilename()); - sf.setMime(multipart.getContentType()); - streamingFileRepository.save(sf); - - data.setFilename(multipart.getOriginalFilename()); - data.setFilesize((int) multipart.getSize()); - data.setAttachmentid(fileid); - - notify = new UploadStatus("0", fileURL); - - AgentUser agentUser = agentUserRepository.findByIdAndOrgi(id, super.getOrgi(request)); - - if (agentUser != null && paste == null) { // 发送消息 - OutMessageRouter router = (OutMessageRouter) MainContext.getContext().getBean(agentUser.getChannel()); - MessageOutContent outMessage = new MessageOutContent(); - if (router != null) { // 发送消息给访客 - outMessage.setMessage(fileURL); - outMessage.setFilename(multipart.getOriginalFilename()); - outMessage.setFilesize((int) multipart.getSize()); - if (multipart.getContentType() != null && multipart.getContentType().indexOf(Constants.ATTACHMENT_TYPE_IMAGE) >= 0) { - outMessage.setMessageType(MainContext.MediaTypeEnum.IMAGE.toString()); - data.setMsgtype(MainContext.MediaTypeEnum.IMAGE.toString()); - } else { - outMessage.setMessageType(MainContext.MediaTypeEnum.FILE.toString()); - data.setMsgtype(MainContext.MediaTypeEnum.FILE.toString()); - } - outMessage.setCalltype(MainContext.CallTypeEnum.OUT.toString()); - outMessage.setCreatetime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); - outMessage.setNickName(super.getUser(request).getUname()); - - router.handler(agentUser.getUserid(), MainContext.MessageTypeEnum.MESSAGE.toString(), agentUser.getAppid(), outMessage); - } - //同时发送消息给 坐席 - data.setMessage(fileURL); - data.setId(MainUtils.getUUID()); - data.setContextid(agentUser.getContextid()); - - data.setAgentserviceid(agentUser.getAgentserviceid()); - - data.setCalltype(MainContext.CallTypeEnum.OUT.toString()); - if (StringUtils.isNotBlank(agentUser.getAgentno())) { - data.setTouser(agentUser.getUserid()); - } - data.setChannel(agentUser.getChannel()); - - data.setUsession(agentUser.getUserid()); - data.setAppid(agentUser.getAppid()); - data.setUserid(super.getUser(request).getId()); - - data.setOrgi(super.getUser(request).getOrgi()); - - data.setCreater(super.getUser(request).getId()); - data.setUsername(super.getUser(request).getUname()); - - chatMessageRepository.save(data); - // 通知文件上传消息 - NettyClients.getInstance().publishAgentEventMessage(agentUser.getAgentno(), MainContext.MessageTypeEnum.MESSAGE.toString(), data); - } - } else { - notify = new UploadStatus("请选择图片文件"); - } - map.addAttribute("upload", notify); - return view; - } - - @RequestMapping("/message/image") - @Menu(type = "resouce", subtype = "image", access = true) - public ModelAndView messageimage(HttpServletResponse response, ModelMap map, @Valid String id, @Valid String t) throws IOException { - ChatMessage message = chatMessageRepository.findById(id); - map.addAttribute("chatMessage", message); - map.addAttribute("agentUser", CacheHelper.getAgentUserCacheBean().getCacheObject(message.getUserid(), message.getOrgi())); - /*if(StringUtils.isNotBlank(t)){ - map.addAttribute("t", t) ; - }*/ - map.addAttribute("t", true); - return request(super.createRequestPageTempletResponse("/apps/agent/media/messageimage")); - } - - @RequestMapping("/message/image/upload") - @Menu(type = "im", subtype = "image", access = false) - public ModelAndView messageimage(ModelMap map, - HttpServletRequest request, - @RequestParam(value = "image", required = false) MultipartFile image, - @Valid String id, - @Valid String userid, - @Valid String fileid) throws IOException { - logger.info("messageimage id {}, fileid {}", id, fileid); - if (image != null && StringUtils.isNotBlank(fileid)) { - File tempFile = File.createTempFile(fileid, ".png"); - try { - // 创建临时图片文件 - if (!tempFile.getParentFile().exists()) { - tempFile.getParentFile().mkdirs(); - } - // 写入临时文件 - FileCopyUtils.copy(image.getBytes(), tempFile); - ChatMessage chatMessage = chatMessageRepository.findById(id); - chatMessage.setCooperation(true); - chatMessageRepository.save(chatMessage); - - // 写入协作文件 - String fileName = "upload/" + fileid + "_cooperation"; - File imageFile = new File(path, fileName); - MainUtils.scaleImage(imageFile, tempFile, 0.1F); - - // 保存到数据库 - StreamingFile sf = streamingFileRepository.findOne(fileid); - if (sf != null) { - sf.setCooperation(jpaBlobHelper.createBlobWithFile(imageFile)); - streamingFileRepository.save(sf); - } - - OutMessageRouter router = null; - AgentUser agentUser = (AgentUser) CacheHelper.getAgentUserCacheBean().getCacheObject(chatMessage.getUserid(), chatMessage.getOrgi()); - - if (agentUser != null) { - router = (OutMessageRouter) MainContext.getContext().getBean(agentUser.getChannel()); - MessageOutContent outMessage = new MessageOutContent(); - if (router != null) { - outMessage.setMessage("/res/image.html?id=" + fileid + "&cooperation=true"); - outMessage.setFilename(imageFile.getName()); - - outMessage.setAttachmentid(chatMessage.getAttachmentid()); - - outMessage.setFilesize((int) imageFile.length()); - outMessage.setMessageType(MainContext.MediaTypeEnum.ACTION.toString()); - outMessage.setCalltype(MainContext.CallTypeEnum.INVITE.toString()); - outMessage.setCreatetime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); - outMessage.setNickName(super.getUser(request).getUname()); - - router.handler(agentUser.getUserid(), MainContext.MessageTypeEnum.MESSAGE.toString(), agentUser.getAppid(), outMessage); - } - } - } finally { - if (tempFile.exists()) { - tempFile.delete(); - } - } - } - return request(super.createRequestPageTempletResponse("/public/success")); - } - - private String processAttachmentFile(final MultipartFile multipart, final String fileid, HttpServletRequest request) throws IOException { - String id = null; - if (multipart.getSize() > 0) { //文件尺寸 限制 ?在 启动 配置中 设置 的最大值,其他地方不做限制 - AttachmentFile attachmentFile = new AttachmentFile(); - attachmentFile.setCreater(super.getUser(request).getId()); - attachmentFile.setOrgi(super.getOrgi(request)); - attachmentFile.setOrgan(super.getUser(request).getOrgan()); - attachmentFile.setModel(MainContext.ModelType.WEBIM.toString()); - attachmentFile.setFilelength((int) multipart.getSize()); - if (multipart.getContentType() != null && multipart.getContentType().length() > 255) { - attachmentFile.setFiletype(multipart.getContentType().substring(0, 255)); - } else { - attachmentFile.setFiletype(multipart.getContentType()); - } - File uploadFile = new File(multipart.getOriginalFilename()); - if (uploadFile.getName() != null && uploadFile.getName().length() > 255) { - attachmentFile.setTitle(uploadFile.getName().substring(0, 255)); - } else { - attachmentFile.setTitle(uploadFile.getName()); - } - if (StringUtils.isNotBlank(attachmentFile.getFiletype()) && attachmentFile.getFiletype().indexOf(Constants.ATTACHMENT_TYPE_IMAGE) >= 0) { - attachmentFile.setImage(true); - } - attachmentFile.setFileid(fileid); - attachementRes.save(attachmentFile); - FileUtils.writeByteArrayToFile(new File(path, "upload/" + fileid), multipart.getBytes()); - id = attachmentFile.getId(); - } - return id; - } - - - @RequestMapping(value = "/contacts") - @Menu(type = "apps", subtype = "contacts") - public ModelAndView contacts(ModelMap map, HttpServletRequest request, @Valid String contactsid, @Valid String userid, @Valid String agentserviceid, @Valid String agentuserid) { - if (StringUtils.isNotBlank(userid) && StringUtils.isNotBlank(contactsid)) { - List onlineUserList = this.onlineUserRes.findByUseridAndOrgi(userid, super.getOrgi(request)); - if (onlineUserList.size() > 0) { - OnlineUser onlineUser = onlineUserList.get(0); - onlineUser.setContactsid(contactsid); - this.onlineUserRes.save(onlineUser); - } - AgentService agentService = this.agentServiceRepository.findOne(agentserviceid); - if (agentService != null) { - agentService.setContactsid(contactsid); - this.agentServiceRepository.save(agentService); - - List agentUserContactsList = agentUserContactsRes.findByUseridAndOrgi(userid, super.getOrgi(request)); - if (agentUserContactsList.size() == 0) { - AgentUserContacts agentUserContacts = new AgentUserContacts(); - agentUserContacts.setAppid(agentService.getAppid()); - agentUserContacts.setChannel(agentService.getChannel()); - agentUserContacts.setContactsid(contactsid); - agentUserContacts.setUserid(userid); - agentUserContacts.setCreater(super.getUser(request).getId()); - agentUserContacts.setOrgi(super.getOrgi(request)); - agentUserContacts.setCreatetime(new Date()); - agentUserContactsRes.save(agentUserContacts); - } else { - AgentUserContacts agentUserContacts = agentUserContactsList.get(0); - agentUserContacts.setContactsid(contactsid); - agentUserContactsRes.save(agentUserContacts); - } - } - DataExchangeInterface dataExchange = (DataExchangeInterface) MainContext.getContext().getBean("contacts"); - if (dataExchange != null) { - map.addAttribute("contacts", dataExchange.getDataByIdAndOrgi(contactsid, super.getOrgi(request))); - } - } - - return request(super.createRequestPageTempletResponse("/apps/agent/contacts")); - } - - @RequestMapping(value = "/summary") - @Menu(type = "apps", subtype = "summary") - public ModelAndView summary(ModelMap map, - HttpServletRequest request, - @Valid String userid, - @Valid String agentserviceid, - @Valid String agentuserid, - @Valid String channel) { - if (StringUtils.isNotBlank(userid) && StringUtils.isNotBlank(agentuserid)) { - AgentUser agentUser = this.agentUserRepository.findByIdAndOrgi(agentuserid, super.getOrgi(request)); - if (agentUser != null && StringUtils.isNotBlank(agentUser.getAgentserviceid())) { - List summaries = this.serviceSummaryRes.findByAgentserviceidAndOrgi(agentUser.getAgentserviceid(), super.getOrgi(request)); - if (summaries.size() > 0) { - map.addAttribute("summary", summaries.get(0)); - } - } - - map.addAttribute("tags", tagRes.findByOrgiAndTagtype(super.getOrgi(request), MainContext.ModelType.SUMMARY.toString())); - map.addAttribute("userid", userid); - map.addAttribute("agentserviceid", agentserviceid); - map.addAttribute("agentuserid", agentuserid); - map.addAttribute("channel", channel); - - } - - return request(super.createRequestPageTempletResponse("/apps/agent/summary")); - } - - @RequestMapping(value = "/summary/save") - @Menu(type = "apps", subtype = "summarysave") - public ModelAndView summarysave(ModelMap map, - HttpServletRequest request, - @Valid AgentServiceSummary summary, - @Valid String contactsid, - @Valid String userid, - @Valid String agentserviceid, - @Valid String agentuserid, - @Valid String channel) { - if (StringUtils.isNotBlank(userid) && StringUtils.isNotBlank(agentuserid)) { - summary.setOrgi(super.getOrgi(request)); - summary.setCreater(super.getUser(request).getId()); - - summary.setCreatetime(new Date()); - - AgentService service = agentServiceRepository.findByIdAndOrgi(agentserviceid, super.getOrgi(request)); - summary.setAgent(service.getAgentno()); - summary.setAgentno(service.getAgentno()); - summary.setUsername(service.getUsername()); - summary.setAgentusername(service.getAgentusername()); - summary.setChannel(service.getChannel()); - summary.setContactsid(contactsid); - summary.setLogindate(service.getLogindate()); - summary.setContactsid(service.getContactsid()); - summary.setEmail(service.getEmail()); - summary.setPhonenumber(service.getPhone()); - serviceSummaryRes.save(summary); - } - - return request(super.createRequestPageTempletResponse("redirect:/agent/agentuser.html?id=" + agentuserid + "&channel=" + channel)); - } - - @RequestMapping(value = "/transfer") - @Menu(type = "apps", subtype = "transfer") - public ModelAndView transfer(ModelMap map, HttpServletRequest request, @Valid String userid, @Valid String agentserviceid, @Valid String agentuserid) { - if (StringUtils.isNotBlank(userid) && StringUtils.isNotBlank(agentuserid)) { - //map.addAttribute("organList", organRes.findByOrgiAndOrgid(super.getOrgi(request),super.getOrgid(request))) ; - - List skillList = OnlineUserUtils.organ(super.getOrgi(request), true); - String currentOrgan = super.getUser(request).getOrgan(); - if (StringUtils.isBlank(currentOrgan)) { - if (!skillList.isEmpty()) { - currentOrgan = skillList.get(0).getId(); - } - } - List agentStatusList = AutomaticServiceDist.getAgentStatus(null, super.getOrgi(request)); - List usersids = new ArrayList(); - if (!agentStatusList.isEmpty()) { - for (AgentStatus agentStatus : agentStatusList) { - if (agentStatus != null && !agentStatus.getAgentno().equals(super.getUser(request).getId())) { - usersids.add(agentStatus.getAgentno()); - } - } - - } - List userList = userRes.findAll(usersids); - for (User user : userList) { - user.setAgentStatus((AgentStatus) CacheHelper.getAgentStatusCacheBean().getCacheObject(user.getId(), super.getOrgi(request))); - } - map.addAttribute("userList", userList); - map.addAttribute("userid", userid); - map.addAttribute("agentserviceid", agentserviceid); - map.addAttribute("agentuserid", agentuserid); - - map.addAttribute("skillList", skillList); - - map.addAttribute("agentservice", this.agentServiceRepository.findByIdAndOrgi(agentserviceid, super.getOrgi(request))); - map.addAttribute("currentorgan", currentOrgan); - } - - return request(super.createRequestPageTempletResponse("/apps/agent/transfer")); - } - - @RequestMapping(value = "/transfer/agent") - @Menu(type = "apps", subtype = "transferagent") - public ModelAndView transferagent(ModelMap map, HttpServletRequest request, @Valid String organ) { - if (StringUtils.isNotBlank(organ)) { - List usersids = new ArrayList(); - List agentStatusList = AutomaticServiceDist.getAgentStatus(organ, super.getOrgi(request)); - if (!agentStatusList.isEmpty()) { - for (AgentStatus agentStatus : agentStatusList) { - if (agentStatus != null && !agentStatus.getAgentno().equals(super.getUser(request).getId())) { - usersids.add(agentStatus.getAgentno()); - } - } - - } - List userList = userRes.findAll(usersids); - for (User user : userList) { - user.setAgentStatus((AgentStatus) CacheHelper.getAgentStatusCacheBean().getCacheObject(user.getId(), super.getOrgi(request))); - } - map.addAttribute("userList", userList); - map.addAttribute("currentorgan", organ); - } - return request(super.createRequestPageTempletResponse("/apps/agent/transferagentlist")); - } - - - @RequestMapping(value = "/transfer/save") - @Menu(type = "apps", subtype = "transfersave") - public ModelAndView transfersave(ModelMap map, HttpServletRequest request, @Valid String userid, @Valid String agentserviceid, @Valid String agentuserid, @Valid String agentno, @Valid String memo) { - if (StringUtils.isNotBlank(userid) && StringUtils.isNotBlank(agentuserid) && StringUtils.isNotBlank(agentno)) { - AgentUser agentUser = (AgentUser) CacheHelper.getAgentUserCacheBean().getCacheObject(userid, super.getOrgi(request)); - AgentService agentService = this.agentServiceRepository.findByIdAndOrgi(agentserviceid, super.getOrgi(request)); - if (agentUser != null) { - - agentUser.setAgentno(agentno); - CacheHelper.getAgentUserCacheBean().put(userid, agentUser, super.getOrgi(request)); - agentUserRepository.save(agentUser); - if (MainContext.AgentUserStatusEnum.INSERVICE.toString().equals(agentUser.getStatus())) { //转接 , 发送消息给 目标坐席 - AgentStatus agentStatus = (AgentStatus) CacheHelper.getAgentStatusCacheBean().getCacheObject(super.getUser(request).getId(), super.getOrgi(request)); - - if (agentStatus != null) { - AutomaticServiceDist.updateAgentStatus(agentStatus, agentUser, super.getOrgi(request), false); - } - - AgentStatus transAgentStatus = (AgentStatus) CacheHelper.getAgentStatusCacheBean().getCacheObject(agentno, super.getOrgi(request)); - if (transAgentStatus != null) { - AutomaticServiceDist.updateAgentStatus(transAgentStatus, agentUser, super.getOrgi(request), true); - agentService.setAgentno(agentno); - agentService.setAgentusername(transAgentStatus.getUsername()); - } - // 通知转接消息 - NettyClients.getInstance().publishAgentEventMessage(agentno, MainContext.MessageTypeEnum.NEW.toString(), agentUser); - } - } else { - agentUser = agentUserRepository.findByIdAndOrgi(agentuserid, super.getOrgi(request)); - if (agentUser != null) { - agentUser.setAgentno(agentno); - agentUserRepository.save(agentUser); - } - } - - if (agentService != null) { - agentService.setAgentno(agentno); - if (StringUtils.isNotBlank(memo)) { - agentService.setTransmemo(memo); - } - agentService.setTrans(true); - agentService.setTranstime(new Date()); - agentServiceRepository.save(agentService); - } - } - - return request(super.createRequestPageTempletResponse("redirect:/agent/index.html")); - } - - - @RequestMapping("/quicklist") - @Menu(type = "setting", subtype = "quickreply", admin = true) - public ModelAndView quicklist(ModelMap map, HttpServletRequest request, @Valid String typeid) { - map.addAttribute("quickReplyList", quickReplyRes.findByOrgiAndCreater(super.getOrgi(request), super.getUser(request).getId(), null)); - List quickTypeList = quickTypeRes.findByOrgiAndQuicktype(super.getOrgi(request), MainContext.QuickTypeEnum.PUB.toString()); - List priQuickTypeList = quickTypeRes.findByOrgiAndQuicktypeAndCreater(super.getOrgi(request), MainContext.QuickTypeEnum.PRI.toString(), super.getUser(request).getId()); - quickTypeList.addAll(priQuickTypeList); - map.addAttribute("pubQuickTypeList", quickTypeList); - - if (StringUtils.isNotBlank(typeid)) { - map.addAttribute("quickType", quickTypeRes.findByIdAndOrgi(typeid, super.getOrgi(request))); - } - - return request(super.createRequestPageTempletResponse("/apps/agent/quicklist")); - } - - - @RequestMapping("/quickreply/add") - @Menu(type = "setting", subtype = "quickreplyadd", admin = true) - public ModelAndView quickreplyadd(ModelMap map, HttpServletRequest request, @Valid String parentid) { - if (StringUtils.isNotBlank(parentid)) { - map.addAttribute("quickType", quickTypeRes.findByIdAndOrgi(parentid, super.getOrgi(request))); - } - map.addAttribute("quickTypeList", quickTypeRes.findByOrgiAndQuicktypeAndCreater(super.getOrgi(request), MainContext.QuickTypeEnum.PRI.toString(), super.getUser(request).getId())); - return request(super.createRequestPageTempletResponse("/apps/agent/quickreply/add")); - } - - @RequestMapping("/quickreply/save") - @Menu(type = "setting", subtype = "quickreply", admin = true) - public ModelAndView quickreplysave(ModelMap map, HttpServletRequest request, @Valid QuickReply quickReply) { - if (StringUtils.isNotBlank(quickReply.getTitle()) && StringUtils.isNotBlank(quickReply.getContent())) { - quickReply.setOrgi(super.getOrgi(request)); - quickReply.setCreater(super.getUser(request).getId()); - quickReply.setType(MainContext.QuickTypeEnum.PRI.toString()); - quickReplyRes.save(quickReply); - } - return request(super.createRequestPageTempletResponse("redirect:/agent/quicklist.html?typeid=" + quickReply.getCate())); - } - - @RequestMapping("/quickreply/delete") - @Menu(type = "setting", subtype = "quickreply", admin = true) - public ModelAndView quickreplydelete(ModelMap map, HttpServletRequest request, @Valid String id) { - QuickReply quickReply = quickReplyRes.findOne(id); - if (quickReply != null) { - quickReplyRes.delete(quickReply); - } - return request(super.createRequestPageTempletResponse("redirect:/agent/quicklist.html?typeid=" + quickReply.getCate())); - } - - @RequestMapping("/quickreply/edit") - @Menu(type = "setting", subtype = "quickreply", admin = true) - public ModelAndView quickreplyedit(ModelMap map, HttpServletRequest request, @Valid String id) { - QuickReply quickReply = quickReplyRes.findOne(id); - map.put("quickReply", quickReply); - if (quickReply != null) { - map.put("quickType", quickTypeRes.findByIdAndOrgi(quickReply.getCate(), super.getOrgi(request))); - } - map.addAttribute("quickTypeList", quickTypeRes.findByOrgiAndQuicktype(super.getOrgi(request), MainContext.QuickTypeEnum.PUB.toString())); - return request(super.createRequestPageTempletResponse("/apps/agent/quickreply/edit")); - } - - @RequestMapping("/quickreply/update") - @Menu(type = "setting", subtype = "quickreply", admin = true) - public ModelAndView quickreplyupdate(ModelMap map, HttpServletRequest request, @Valid QuickReply quickReply) { - if (StringUtils.isNotBlank(quickReply.getId())) { - QuickReply temp = quickReplyRes.findOne(quickReply.getId()); - quickReply.setOrgi(super.getOrgi(request)); - quickReply.setCreater(super.getUser(request).getId()); - if (temp != null) { - quickReply.setCreatetime(temp.getCreatetime()); - } - quickReply.setType(MainContext.QuickTypeEnum.PUB.toString()); - quickReplyRes.save(quickReply); - } - return request(super.createRequestPageTempletResponse("redirect:/agent/quicklist.html?typeid=" + quickReply.getCate())); - } - - @RequestMapping({"/quickreply/addtype"}) - @Menu(type = "apps", subtype = "kbs") - public ModelAndView addtype(ModelMap map, HttpServletRequest request, @Valid String typeid) { - map.addAttribute("quickTypeList", quickTypeRes.findByOrgiAndQuicktypeAndCreater(super.getOrgi(request), MainContext.QuickTypeEnum.PRI.toString(), super.getUser(request).getId())); - if (StringUtils.isNotBlank(typeid)) { - map.addAttribute("quickType", quickTypeRes.findByIdAndOrgi(typeid, super.getOrgi(request))); - } - return request(super.createRequestPageTempletResponse("/apps/agent/quickreply/addtype")); - } - - @RequestMapping("/quickreply/type/save") - @Menu(type = "apps", subtype = "kbs") - public ModelAndView typesave(HttpServletRequest request, @Valid QuickType quickType) { - int count = quickTypeRes.countByOrgiAndNameAndParentid(super.getOrgi(request), quickType.getName(), quickType.getParentid()); - if (count == 0) { - quickType.setOrgi(super.getOrgi(request)); - quickType.setCreater(super.getUser(request).getId()); - quickType.setCreatetime(new Date()); - quickType.setQuicktype(MainContext.QuickTypeEnum.PRI.toString()); - quickTypeRes.save(quickType); - } - return request(super.createRequestPageTempletResponse("redirect:/agent/quicklist.html?typeid=" + quickType.getParentid())); - } - - @RequestMapping({"/quickreply/edittype"}) - @Menu(type = "apps", subtype = "kbs") - public ModelAndView edittype(ModelMap map, HttpServletRequest request, String id) { - map.addAttribute("quickType", quickTypeRes.findByIdAndOrgi(id, super.getOrgi(request))); - map.addAttribute("quickTypeList", quickTypeRes.findByOrgiAndQuicktypeAndCreater(super.getOrgi(request), MainContext.QuickTypeEnum.PRI.toString(), super.getUser(request).getId())); - return request(super.createRequestPageTempletResponse("/apps/agent/quickreply/edittype")); - } - - @RequestMapping("/quickreply/type/update") - @Menu(type = "apps", subtype = "kbs") - public ModelAndView typeupdate(HttpServletRequest request, @Valid QuickType quickType) { - QuickType tempQuickType = quickTypeRes.findByIdAndOrgi(quickType.getId(), super.getOrgi(request)); - if (tempQuickType != null) { - tempQuickType.setName(quickType.getName()); - tempQuickType.setDescription(quickType.getDescription()); - tempQuickType.setInx(quickType.getInx()); - tempQuickType.setParentid(quickType.getParentid()); - quickTypeRes.save(tempQuickType); - } - return request(super.createRequestPageTempletResponse("redirect:/agent/quicklist.html?typeid=" + quickType.getId())); - } - - @RequestMapping({"/quickreply/deletetype"}) - @Menu(type = "apps", subtype = "kbs") - public ModelAndView deletetype(ModelMap map, HttpServletRequest request, @Valid String id) { - QuickType tempQuickType = quickTypeRes.findByIdAndOrgi(id, super.getOrgi(request)); - if (tempQuickType != null) { - quickTypeRes.delete(tempQuickType); - - Page quickReplyList = quickReplyRes.getByOrgiAndCate(super.getOrgi(request), id, null, new PageRequest(0, 10000)); - - quickReplyRes.delete(quickReplyList.getContent()); - } - return request(super.createRequestPageTempletResponse("redirect:/agent/quicklist.html" + (tempQuickType != null ? "?typeid=" + tempQuickType.getParentid() : ""))); - } - - @RequestMapping({"/quickreply/content"}) - @Menu(type = "apps", subtype = "quickreply") - public ModelAndView quickreplycontent(ModelMap map, HttpServletRequest request, @Valid String id) { - QuickReply quickReply = quickReplyRes.findOne(id); - if (quickReply != null) { - map.addAttribute("quickReply", quickReply); - } - return request(super.createRequestPageTempletResponse("/apps/agent/quickreplycontent")); - } - - @RequestMapping("/calloutcontact/add") - @Menu(type = "apps", subtype = "calloutcontact", admin = true) - public ModelAndView add(ModelMap map, HttpServletRequest request, @Valid String ckind) { - map.addAttribute("ckind", ckind); - return request(super.createRequestPageTempletResponse("/apps/agent/calloutcontact/add")); - } - - @RequestMapping(value = "/calloutcontact/save") - @Menu(type = "apps", subtype = "calloutcontact") - public ModelAndView calloutcontactsave(ModelMap map, - HttpServletRequest request, - @RequestParam(value = "agentuser", required = true) String agentuser, - @Valid Contacts contacts) throws CSKefuException { - logger.info("[agent ctrl] calloutcontactsave agentuser [{}]", agentuser); - AgentUser au = agentUserRepository.findOne(agentuser); - if (au == null) - throw new CSKefuException("不存在该服务记录"); - - User curruser = super.getUser(request); - contacts.setId(MainUtils.getUUID()); - contacts.setCreater(curruser.getId()); - contacts.setOrgi(curruser.getOrgi()); - contacts.setOrgan(curruser.getOrgan()); - contacts.setPinyin(PinYinTools.getInstance().getFirstPinYin(contacts.getName())); - if (StringUtils.isBlank(contacts.getCusbirthday())) { - contacts.setCusbirthday(null); - } - contactsRes.save(contacts); - - AgentUserContacts auc = new AgentUserContacts(); - auc.setId(MainUtils.getUUID()); - auc.setUsername(au.getUsername()); - auc.setOrgi(MainContext.SYSTEM_ORGI); - auc.setUserid(au.getUserid()); - auc.setContactsid(contacts.getId()); - auc.setChannel(au.getChannel()); - auc.setCreatetime(new Date()); - auc.setAppid(au.getAppid()); - auc.setCreater(curruser.getId()); - agentUserContactsRepository.save(auc); - return request(super.createRequestPageTempletResponse("redirect:/agent/index.html")); - } - - @RequestMapping("/calloutcontact/update") - @Menu(type = "apps", subtype = "calloutcontact") - public ModelAndView update(HttpServletRequest request, @Valid Contacts contacts) { - Contacts data = contactsRes.findOne(contacts.getId()); - if (data != null) { - List events = PropertiesEventUtils.processPropertiesModify(request, contacts, data, "id", "orgi", "creater", "createtime", "updatetime"); //记录 数据变更 历史 - if (events.size() > 0) { - String modifyid = MainUtils.getUUID(); - Date modifytime = new Date(); - for (PropertiesEvent event : events) { - event.setDataid(contacts.getId()); - event.setCreater(super.getUser(request).getId()); - event.setOrgi(super.getOrgi(request)); - event.setModifyid(modifyid); - event.setCreatetime(modifytime); - propertiesEventRes.save(event); - } - } - - User curruser = super.getUser(request); - - contacts.setCreater(data.getCreater()); - contacts.setCreatetime(data.getCreatetime()); - contacts.setOrgi(curruser.getOrgi()); - contacts.setOrgan(curruser.getOrgan()); - contacts.setPinyin(PinYinTools.getInstance().getFirstPinYin(contacts.getName())); - if (StringUtils.isBlank(contacts.getCusbirthday())) { - contacts.setCusbirthday(null); - } - contactsRes.save(contacts); - } - - return request(super.createRequestPageTempletResponse("redirect:/agent/index.html")); - } -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/handler/apps/callcenter/SipTrunkController.java b/contact-center/app/src/main/java/com/chatopera/cc/app/handler/apps/callcenter/SipTrunkController.java deleted file mode 100644 index 573d594c..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/handler/apps/callcenter/SipTrunkController.java +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.chatopera.cc.app.handler.apps.callcenter; - -import java.io.IOException; -import java.util.List; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; - -import com.chatopera.cc.app.basic.MainContext; -import com.chatopera.cc.util.es.SearchTools; -import com.chatopera.cc.util.es.UKDataBean; -import com.chatopera.cc.app.cache.CacheHelper; -import com.chatopera.cc.util.CallCenterUtils; -import com.chatopera.cc.app.model.User; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.PageImpl; -import org.springframework.stereotype.Controller; -import org.springframework.ui.ModelMap; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.servlet.ModelAndView; - -import com.chatopera.cc.util.Menu; -import com.chatopera.cc.util.freeswitch.model.CallCenterAgent; -import com.chatopera.cc.app.persistence.impl.CallOutQuene; -import com.chatopera.cc.app.persistence.repository.ExtentionRepository; -import com.chatopera.cc.app.persistence.repository.SipTrunkRepository; -import com.chatopera.cc.app.persistence.repository.UserRepository; -import com.chatopera.cc.app.handler.Handler; -import com.chatopera.cc.app.model.SipTrunk; - -import freemarker.template.TemplateException; - -@Controller -@RequestMapping("/apps/callcenter") -public class SipTrunkController extends Handler{ - - @Autowired - private ExtentionRepository extentionRes; - - @Autowired - private UserRepository userRepository; - - @Autowired - private SipTrunkRepository sipTrunkRes ; - - @RequestMapping(value = "/siptrunk") - @Menu(type = "callcenter" , subtype = "extention" , access = true) - public ModelAndView detail(ModelMap map , HttpServletRequest request , HttpServletResponse response ,@Valid String extno) throws IOException, TemplateException { - SipTrunk sipTrunk = CallCenterUtils.siptrunk(extno, sipTrunkRes, extentionRes) ; - map.addAttribute("siptrunk" , sipTrunk); - response.setContentType("Content-type: text/plain; charset=utf-8"); - return request(super.createRequestPageTempletResponse("/apps/business/callcenter/extention/siptrunk")); - } - - @RequestMapping(value = "/agent") - @Menu(type = "callcenter" , subtype = "agent" , access = true) - public ModelAndView agent(ModelMap map , HttpServletRequest request , HttpServletResponse response ,@Valid String ani ,@Valid String dest,@Valid String sip) throws IOException, TemplateException { - SipTrunk sipTrunk = CallCenterUtils.siptrunk(sip, sipTrunkRes) ; - map.addAttribute("siptrunk" , sipTrunk); - String agent = null ; - response.setContentType("Content-type: text/plain; charset=utf-8"); - if(sipTrunk!=null) { - PageImpl dataBeanList = SearchTools.namesearch(sipTrunk.getOrgi(), ani) ; - if(dataBeanList!=null && dataBeanList.getContent().size() > 0) { - UKDataBean dataBean = dataBeanList.getContent().get(0) ; - if(dataBean.getValues().get(MainContext.UKEFU_SYSTEM_DIS_AGENT)!=null) { - String disagent = (String) dataBean.getValues().get(MainContext.UKEFU_SYSTEM_DIS_AGENT) ; - /** - * 找到了 坐席 - */ - CallCenterAgent callCenterAgent = (CallCenterAgent) CacheHelper.getCallCenterAgentCacheBean().getCacheObject(disagent, sipTrunk.getOrgi()) ; - if(callCenterAgent!=null) { - /** - * 坐席在线 - */ - agent = callCenterAgent.getExtno() ; - }else if(sipTrunk.isEnablecallagent()){//坐席不在线 - User user = userRepository.findById(disagent) ; - if(!StringUtils.isBlank(user.getMobile())) { - agent = user.getMobile() ; - } - } - }else { - /** - * 名单未分配 , 转给网关进来的任何一个坐席 , 从当前登录系统的 坐席中选取一个 - */ - List agentList = CallOutQuene.service(sipTrunk.getId()) ; - if(agentList.size() > 0) { - CallCenterAgent callCenterAgent = agentList.get(0) ; - agent = callCenterAgent.getExtno() ; - }else if(!StringUtils.isBlank(sipTrunk.getNotready())){ - agent = sipTrunk.getNotready() ; - } - } - } - if(StringUtils.isBlank(agent) && !StringUtils.isBlank(sipTrunk.getNoname())){ - /** - * 未找到名单,从 SIPTrunk里选取一个 转移号码 - */ - agent = sipTrunk.getNoname() ; - } - } - map.addAttribute("agent" , agent); - - return request(super.createRequestPageTempletResponse("/apps/business/callcenter/extention/agent")); - } -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/handler/apps/contacts/ContactsController.java b/contact-center/app/src/main/java/com/chatopera/cc/app/handler/apps/contacts/ContactsController.java deleted file mode 100644 index 373a0c7f..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/handler/apps/contacts/ContactsController.java +++ /dev/null @@ -1,433 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.chatopera.cc.app.handler.apps.contacts; - -import com.chatopera.cc.util.Menu; -import com.chatopera.cc.util.PinYinTools; -import com.chatopera.cc.app.basic.MainUtils; -import com.chatopera.cc.exception.CSKefuException; -import com.chatopera.cc.concurrent.dsdata.DSData; -import com.chatopera.cc.concurrent.dsdata.DSDataEvent; -import com.chatopera.cc.concurrent.dsdata.ExcelImportProecess; -import com.chatopera.cc.concurrent.dsdata.export.ExcelExporterProcess; -import com.chatopera.cc.concurrent.dsdata.process.ContactsProcess; -import com.chatopera.cc.app.model.Contacts; -import com.chatopera.cc.app.model.MetadataTable; -import com.chatopera.cc.app.model.PropertiesEvent; -import com.chatopera.cc.app.persistence.es.ContactsRepository; -import com.chatopera.cc.app.persistence.repository.MetadataRepository; -import com.chatopera.cc.app.persistence.repository.PropertiesEventRepository; -import com.chatopera.cc.app.persistence.repository.ReporterRepository; -import com.chatopera.cc.util.PropertiesEventUtils; -import com.chatopera.cc.app.handler.Handler; -import org.apache.commons.io.FileUtils; -import org.apache.commons.lang.StringUtils; -import org.elasticsearch.index.query.BoolQueryBuilder; -import org.elasticsearch.index.query.QueryBuilders; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.data.domain.PageRequest; -import org.springframework.stereotype.Controller; -import org.springframework.ui.ModelMap; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.multipart.MultipartFile; -import org.springframework.web.servlet.ModelAndView; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; -import java.io.File; -import java.io.IOException; -import java.text.SimpleDateFormat; -import java.util.*; - -import static org.elasticsearch.index.query.QueryBuilders.termQuery; -import static org.elasticsearch.index.query.QueryBuilders.termsQuery; - -@Controller -@RequestMapping("/apps/contacts") -public class ContactsController extends Handler { - private final static Logger logger = LoggerFactory.getLogger(ContactsController.class); - - @Autowired - private ContactsRepository contactsRes; - - @Autowired - private PropertiesEventRepository propertiesEventRes; - - @Autowired - private ReporterRepository reporterRes; - - @Autowired - private MetadataRepository metadataRes; - - @Value("${web.upload-path}") - private String path; - - @RequestMapping("/index") - @Menu(type = "customer", subtype = "index") - public ModelAndView index(ModelMap map, HttpServletRequest request, @Valid String q, @Valid String ckind) throws CSKefuException { - BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); - - if(!super.esOrganFilter(request, boolQueryBuilder)){ - return request(super.createAppsTempletResponse("/apps/business/contacts/index")); - } - - if (!StringUtils.isBlank(q)) { - map.put("q", q); - } - - if (!StringUtils.isBlank(ckind)) { - boolQueryBuilder.must(termQuery("ckind", ckind)); - map.put("ckind", ckind); - } - - map.addAttribute("contactsList", contactsRes.findByCreaterAndSharesAndOrgi(super.getUser(request).getId(), super.getUser(request).getId(), super.getOrgi(request), null, null, false, boolQueryBuilder, q, new PageRequest(super.getP(request), super.getPs(request)))); - - return request(super.createAppsTempletResponse("/apps/business/contacts/index")); - } - - @RequestMapping("/today") - @Menu(type = "customer", subtype = "today") - public ModelAndView today(ModelMap map, HttpServletRequest request, @Valid String q, @Valid String ckind) throws CSKefuException { - BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); - if(!super.esOrganFilter(request, boolQueryBuilder)){ - return request(super.createAppsTempletResponse("/apps/business/contacts/index")); - } - - if (!StringUtils.isBlank(q)) { - map.put("q", q); - } - if (!StringUtils.isBlank(ckind)) { - boolQueryBuilder.must(termQuery("ckind", ckind)); - map.put("ckind", ckind); - } - map.addAttribute("contactsList", contactsRes.findByCreaterAndSharesAndOrgi(super.getUser(request).getId(), super.getUser(request).getId(), super.getOrgi(request), MainUtils.getStartTime(), null, false, boolQueryBuilder, q, new PageRequest(super.getP(request), super.getPs(request)))); - - return request(super.createAppsTempletResponse("/apps/business/contacts/index")); - } - - @RequestMapping("/week") - @Menu(type = "customer", subtype = "week") - public ModelAndView week(ModelMap map, HttpServletRequest request, @Valid String q, @Valid String ckind) throws CSKefuException { - BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); - if(!super.esOrganFilter(request, boolQueryBuilder)){ - return request(super.createAppsTempletResponse("/apps/business/contacts/index")); - } - - if (!StringUtils.isBlank(q)) { - map.put("q", q); - } - if (!StringUtils.isBlank(ckind)) { - boolQueryBuilder.must(termQuery("ckind", ckind)); - map.put("ckind", ckind); - } - map.addAttribute("contactsList", contactsRes.findByCreaterAndSharesAndOrgi(super.getUser(request).getId(), super.getUser(request).getId(), super.getOrgi(request), MainUtils.getWeekStartTime(), null, false, boolQueryBuilder, q, new PageRequest(super.getP(request), super.getPs(request)))); - - return request(super.createAppsTempletResponse("/apps/business/contacts/index")); - } - - @RequestMapping("/creater") - @Menu(type = "customer", subtype = "creater") - public ModelAndView creater(ModelMap map, HttpServletRequest request, @Valid String q, @Valid String ckind) throws CSKefuException { - BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); - if(!super.esOrganFilter(request, boolQueryBuilder)){ - return request(super.createAppsTempletResponse("/apps/business/contacts/index")); - } - - boolQueryBuilder.must(termQuery("creater", super.getUser(request).getId())); - - if (!StringUtils.isBlank(ckind)) { - boolQueryBuilder.must(termQuery("ckind", ckind)); - map.put("ckind", ckind); - } - if (!StringUtils.isBlank(q)) { - map.put("q", q); - } - - map.addAttribute("contactsList", contactsRes.findByCreaterAndSharesAndOrgi(super.getUser(request).getId(), super.getUser(request).getId(), super.getOrgi(request), null, null, false, boolQueryBuilder, q, new PageRequest(super.getP(request), super.getPs(request)))); - return request(super.createAppsTempletResponse("/apps/business/contacts/index")); - } - - @RequestMapping("/delete") - @Menu(type = "contacts", subtype = "contacts") - public ModelAndView delete(HttpServletRequest request, @Valid Contacts contacts, @Valid String p) { - if (contacts != null) { - contacts = contactsRes.findOne(contacts.getId()); - contacts.setDatastatus(true); //客户和联系人都是 逻辑删除 - contactsRes.save(contacts); - } - return request(super.createRequestPageTempletResponse("redirect:/apps/contacts/index.html?p=" + p + "&ckind=" + contacts.getCkind())); - } - - @RequestMapping("/add") - @Menu(type = "contacts", subtype = "add") - public ModelAndView add(ModelMap map, HttpServletRequest request, @Valid String ckind) { - map.addAttribute("ckind", ckind); - return request(super.createRequestPageTempletResponse("/apps/business/contacts/add")); - } - - @RequestMapping("/save") - @Menu(type = "contacts", subtype = "save") - public ModelAndView save(HttpServletRequest request, @Valid Contacts contacts) { - contacts.setCreater(super.getUser(request).getId()); - contacts.setOrgi(super.getOrgi(request)); - contacts.setOrgan(super.getUser(request).getOrgan()); - contacts.setPinyin(PinYinTools.getInstance().getFirstPinYin(contacts.getName())); - if (StringUtils.isBlank(contacts.getCusbirthday())) { - contacts.setCusbirthday(null); - } - contactsRes.save(contacts); - return request(super.createRequestPageTempletResponse("redirect:/apps/contacts/index.html?ckind=" + contacts.getCkind())); - } - - @RequestMapping("/edit") - @Menu(type = "contacts", subtype = "contacts") - public ModelAndView edit(ModelMap map, HttpServletRequest request, @Valid String id) { - map.addAttribute("contacts", contactsRes.findOne(id)); - return request(super.createRequestPageTempletResponse("/apps/business/contacts/edit")); - } - - @RequestMapping("/detail") - @Menu(type = "customer" , subtype = "index") - public ModelAndView detail(ModelMap map , HttpServletRequest request , @Valid String id) { - map.addAttribute("contacts", contactsRes.findOne(id)) ; - return request(super.createAppsTempletResponse("/apps/business/contacts/detail")); - } - - - @RequestMapping("/update") - @Menu(type = "contacts", subtype = "contacts") - public ModelAndView update(HttpServletRequest request, @Valid Contacts contacts) { - Contacts data = contactsRes.findOne(contacts.getId()); - if (data != null) { - List events = PropertiesEventUtils.processPropertiesModify(request, contacts, data, "id", "orgi", "creater", "createtime", "updatetime"); //记录 数据变更 历史 - if (events.size() > 0) { - String modifyid = MainUtils.getUUID(); - Date modifytime = new Date(); - for (PropertiesEvent event : events) { - event.setDataid(contacts.getId()); - event.setCreater(super.getUser(request).getId()); - event.setOrgi(super.getOrgi(request)); - event.setModifyid(modifyid); - event.setCreatetime(modifytime); - propertiesEventRes.save(event); - } - } - - contacts.setCreater(data.getCreater()); - contacts.setCreatetime(data.getCreatetime()); - contacts.setOrgi(super.getOrgi(request)); - contacts.setOrgan(super.getUser(request).getOrgan()); - contacts.setPinyin(PinYinTools.getInstance().getFirstPinYin(contacts.getName())); - if (StringUtils.isBlank(contacts.getCusbirthday())) { - contacts.setCusbirthday(null); - } - contactsRes.save(contacts); - } - - return request(super.createRequestPageTempletResponse("redirect:/apps/contacts/index.html?ckind=" + contacts.getCkind())); - } - - @RequestMapping("/imp") - @Menu(type = "contacts", subtype = "contacts") - public ModelAndView imp(ModelMap map, HttpServletRequest request, @Valid String ckind) { - map.addAttribute("ckind", ckind); - return request(super.createRequestPageTempletResponse("/apps/business/contacts/imp")); - } - - @RequestMapping("/impsave") - @Menu(type = "contacts", subtype = "contacts") - public ModelAndView impsave(ModelMap map, HttpServletRequest request, @RequestParam(value = "cusfile", required = false) MultipartFile cusfile, @Valid String ckind) throws IOException { - DSDataEvent event = new DSDataEvent(); - String fileName = "contacts/" + MainUtils.getUUID() + cusfile.getOriginalFilename().substring(cusfile.getOriginalFilename().lastIndexOf(".")); - File excelFile = new File(path, fileName); - if (!excelFile.getParentFile().exists()) { - excelFile.getParentFile().mkdirs(); - } - MetadataTable table = metadataRes.findByTablename("uk_contacts"); - if (table != null) { - FileUtils.writeByteArrayToFile(new File(path, fileName), cusfile.getBytes()); - event.setDSData(new DSData(table, excelFile, cusfile.getContentType(), super.getUser(request))); - event.getDSData().setClazz(Contacts.class); - event.getDSData().setProcess(new ContactsProcess(contactsRes)); - event.setOrgi(super.getOrgi(request)); - /*if(!StringUtils.isBlank(ckind)){ - exchange.getValues().put("ckind", ckind) ; - }*/ - event.getValues().put("creater", super.getUser(request).getId()); - reporterRes.save(event.getDSData().getReport()); - new ExcelImportProecess(event).process(); //启动导入任务 - } - - return request(super.createRequestPageTempletResponse("redirect:/apps/contacts/index.html")); - } - - @RequestMapping("/expids") - @Menu(type = "contacts", subtype = "contacts") - public void expids(ModelMap map, HttpServletRequest request, HttpServletResponse response, @Valid String[] ids) throws IOException { - if (ids != null && ids.length > 0) { - Iterable contactsList = contactsRes.findAll(Arrays.asList(ids)); - MetadataTable table = metadataRes.findByTablename("uk_contacts"); - List> values = new ArrayList>(); - for (Contacts contacts : contactsList) { - values.add(MainUtils.transBean2Map(contacts)); - } - - response.setHeader("content-disposition", "attachment;filename=CSKefu-Contacts-" + new SimpleDateFormat("yyyy-MM-dd").format(new Date()) + ".xls"); - - ExcelExporterProcess excelProcess = new ExcelExporterProcess(values, table, response.getOutputStream()); - excelProcess.process(); - } - - return; - } - - @RequestMapping("/expall") - @Menu(type = "contacts", subtype = "contacts") - public void expall(ModelMap map, HttpServletRequest request, HttpServletResponse response) throws IOException, CSKefuException { - BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); - if(!super.esOrganFilter(request, boolQueryBuilder)){ - return; - } - boolQueryBuilder.must(termQuery("datastatus", false)); //只导出 数据删除状态 为 未删除的 数据 - Iterable contactsList = contactsRes.findByCreaterAndSharesAndOrgi(super.getUser(request).getId(), super.getUser(request).getId(), super.getOrgi(request), null, null, false, boolQueryBuilder, null, new PageRequest(super.getP(request), super.getPs(request))); - - MetadataTable table = metadataRes.findByTablename("uk_contacts"); - List> values = new ArrayList>(); - for (Contacts contacts : contactsList) { - values.add(MainUtils.transBean2Map(contacts)); - } - - response.setHeader("content-disposition", "attachment;filename=CSKefu-Contacts-" + new SimpleDateFormat("yyyy-MM-dd").format(new Date()) + ".xls"); - - ExcelExporterProcess excelProcess = new ExcelExporterProcess(values, table, response.getOutputStream()); - excelProcess.process(); - return; - } - - @RequestMapping("/expsearch") - @Menu(type = "contacts", subtype = "contacts") - public void expall(ModelMap map, HttpServletRequest request, HttpServletResponse response, @Valid String q, @Valid String ekind) throws IOException { - BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); - if (!StringUtils.isBlank(q)) { - map.put("q", q); - } - if (!StringUtils.isBlank(ekind)) { - boolQueryBuilder.must(termQuery("ekind", ekind)); - map.put("ekind", ekind); - } - - Iterable contactsList = contactsRes.findByCreaterAndSharesAndOrgi(super.getUser(request).getId(), super.getUser(request).getId(), super.getOrgi(request), null, null, false, boolQueryBuilder, q, new PageRequest(super.getP(request), super.getPs(request))); - MetadataTable table = metadataRes.findByTablename("uk_contacts"); - List> values = new ArrayList>(); - for (Contacts contacts : contactsList) { - values.add(MainUtils.transBean2Map(contacts)); - } - - response.setHeader("content-disposition", "attachment;filename=CSKefu-Contacts-" + new SimpleDateFormat("yyyy-MM-dd").format(new Date()) + ".xls"); - - ExcelExporterProcess excelProcess = new ExcelExporterProcess(values, table, response.getOutputStream()); - excelProcess.process(); - - return; - } - - - @RequestMapping("/embed/index") - @Menu(type = "customer", subtype = "embed") - public ModelAndView embed(ModelMap map, HttpServletRequest request, @Valid String q, @Valid String ckind) throws CSKefuException { - BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); - if(!super.esOrganFilter(request, boolQueryBuilder)){ - return request(super.createAppsTempletResponse("/apps/business/contacts/embed/index")); - } - if (!StringUtils.isBlank(q)) { - map.put("q", q); - } - if (!StringUtils.isBlank(ckind)) { - boolQueryBuilder.must(termQuery("ckind", ckind)); - map.put("ckind", ckind); - } - map.addAttribute("contactsList", contactsRes.findByCreaterAndSharesAndOrgi(super.getUser(request).getId(), super.getUser(request).getId(), super.getOrgi(request), null, null, false, boolQueryBuilder, q, new PageRequest(super.getP(request), super.getPs(request)))); - - return request(super.createRequestPageTempletResponse("/apps/business/contacts/embed/index")); - } - - @RequestMapping("/embed/add") - @Menu(type = "contacts", subtype = "embedadd") - public ModelAndView embedadd(ModelMap map, HttpServletRequest request) { - return request(super.createRequestPageTempletResponse("/apps/business/contacts/embed/add")); - } - - @RequestMapping("/embed/save") - @Menu(type = "contacts", subtype = "embedsave") - public ModelAndView embedsave(HttpServletRequest request, @Valid Contacts contacts) { - contacts.setCreater(super.getUser(request).getId()); - contacts.setOrgi(super.getOrgi(request)); - contacts.setOrgan(super.getUser(request).getOrgan()); - contacts.setPinyin(PinYinTools.getInstance().getFirstPinYin(contacts.getName())); - if (StringUtils.isBlank(contacts.getCusbirthday())) { - contacts.setCusbirthday(null); - } - contactsRes.save(contacts); - return request(super.createRequestPageTempletResponse("redirect:/apps/contacts/embed/index.html")); - } - - @RequestMapping("/embed/edit") - @Menu(type = "contacts", subtype = "embededit") - public ModelAndView embededit(ModelMap map, HttpServletRequest request, @Valid String id) { - map.addAttribute("contacts", contactsRes.findOne(id)); - return request(super.createRequestPageTempletResponse("/apps/business/contacts/embed/edit")); - } - - @RequestMapping("/embed/update") - @Menu(type = "contacts", subtype = "embedupdate") - public ModelAndView embedupdate(HttpServletRequest request, @Valid Contacts contacts) { - Contacts data = contactsRes.findOne(contacts.getId()); - if (data != null) { - List events = PropertiesEventUtils.processPropertiesModify(request, contacts, data, "id", "orgi", "creater", "createtime", "updatetime"); //记录 数据变更 历史 - if (events.size() > 0) { - String modifyid = MainUtils.getUUID(); - Date modifytime = new Date(); - for (PropertiesEvent event : events) { - event.setDataid(contacts.getId()); - event.setCreater(super.getUser(request).getId()); - event.setOrgi(super.getOrgi(request)); - event.setModifyid(modifyid); - event.setCreatetime(modifytime); - propertiesEventRes.save(event); - } - } - - contacts.setCreater(data.getCreater()); - contacts.setCreatetime(data.getCreatetime()); - contacts.setOrgi(super.getOrgi(request)); - contacts.setOrgan(super.getUser(request).getOrgan()); - contacts.setPinyin(PinYinTools.getInstance().getFirstPinYin(contacts.getName())); - if (StringUtils.isBlank(contacts.getCusbirthday())) { - contacts.setCusbirthday(null); - } - contactsRes.save(contacts); - } - - return request(super.createRequestPageTempletResponse("redirect:/apps/contacts/embed/index.html")); - } -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/handler/apps/customer/CustomerController.java b/contact-center/app/src/main/java/com/chatopera/cc/app/handler/apps/customer/CustomerController.java deleted file mode 100644 index eaa5abbb..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/handler/apps/customer/CustomerController.java +++ /dev/null @@ -1,407 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.chatopera.cc.app.handler.apps.customer; - -import static org.elasticsearch.index.query.QueryBuilders.termQuery; - -import java.io.File; -import java.io.IOException; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Date; -import java.util.List; -import java.util.Map; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; - -import com.chatopera.cc.app.basic.MainContext; -import com.chatopera.cc.app.basic.MainUtils; -import com.chatopera.cc.util.Menu; -import com.chatopera.cc.util.PinYinTools; -import com.chatopera.cc.exception.CSKefuException; -import com.chatopera.cc.concurrent.dsdata.DSData; -import com.chatopera.cc.concurrent.dsdata.ExcelImportProecess; -import com.chatopera.cc.concurrent.dsdata.export.ExcelExporterProcess; -import com.chatopera.cc.concurrent.dsdata.process.EntCustomerProcess; -import com.chatopera.cc.app.persistence.es.ContactsRepository; -import com.chatopera.cc.app.persistence.es.EntCustomerRepository; -import com.chatopera.cc.app.persistence.repository.PropertiesEventRepository; -import com.chatopera.cc.util.PropertiesEventUtils; -import org.apache.commons.io.FileUtils; -import org.apache.commons.lang.StringUtils; -import org.elasticsearch.index.query.BoolQueryBuilder; -import org.elasticsearch.index.query.QueryBuilders; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.data.domain.PageRequest; -import org.springframework.stereotype.Controller; -import org.springframework.ui.ModelMap; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.multipart.MultipartFile; -import org.springframework.web.servlet.ModelAndView; - -import com.chatopera.cc.concurrent.dsdata.DSDataEvent; -import com.chatopera.cc.app.persistence.repository.MetadataRepository; -import com.chatopera.cc.app.persistence.repository.ReporterRepository; -import com.chatopera.cc.app.handler.Handler; -import com.chatopera.cc.app.model.CustomerGroupForm; -import com.chatopera.cc.app.model.EntCustomer; -import com.chatopera.cc.app.model.MetadataTable; -import com.chatopera.cc.app.model.PropertiesEvent; - -@Controller -@RequestMapping("/apps/customer") -public class CustomerController extends Handler{ - - @Autowired - private EntCustomerRepository entCustomerRes; - - @Autowired - private ContactsRepository contactsRes ; - - @Autowired - private ReporterRepository reporterRes ; - - @Autowired - private MetadataRepository metadataRes ; - - @Autowired - private PropertiesEventRepository propertiesEventRes ; - - @Value("${web.upload-path}") - private String path; - - @RequestMapping("/index") - @Menu(type = "customer" , subtype = "index") - public ModelAndView index(ModelMap map , HttpServletRequest request , @Valid String q , @Valid String ekind) throws CSKefuException { - BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); - - if(!super.esOrganFilter(request, boolQueryBuilder)){ - return request(super.createAppsTempletResponse("/apps/business/customer/index")); - } - - if(!StringUtils.isBlank(q)){ - map.put("q", q) ; - } - if(!StringUtils.isBlank(ekind)){ - boolQueryBuilder.must(termQuery("ekind" , ekind)) ; - map.put("ekind", ekind) ; - } - map.addAttribute("entCustomerList", entCustomerRes.findByCreaterAndSharesAndOrgi(super.getUser(request).getId(), super.getUser(request).getId(),super.getOrgi(request), null , null , false, boolQueryBuilder , q , new PageRequest(super.getP(request) , super.getPs(request)))) ; - - return request(super.createAppsTempletResponse("/apps/business/customer/index")); - } - - @RequestMapping("/today") - @Menu(type = "customer" , subtype = "today") - public ModelAndView today(ModelMap map , HttpServletRequest request , @Valid String q , @Valid String ekind) throws CSKefuException { - BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); - - if(!super.esOrganFilter(request, boolQueryBuilder)){ - return request(super.createAppsTempletResponse("/apps/business/customer/index")); - } - - if(!StringUtils.isBlank(q)){ - map.put("q", q) ; - } - - if(!StringUtils.isBlank(ekind)){ - boolQueryBuilder.must(termQuery("ekind" , ekind)) ; - map.put("ekind", ekind) ; - } - map.addAttribute("entCustomerList", entCustomerRes.findByCreaterAndSharesAndOrgi(super.getUser(request).getId(), super.getUser(request).getId(),super.getOrgi(request), MainUtils.getStartTime() , null , false, boolQueryBuilder ,q , new PageRequest(super.getP(request) , super.getPs(request)))) ; - - return request(super.createAppsTempletResponse("/apps/business/customer/index")); - } - - @RequestMapping("/week") - @Menu(type = "customer" , subtype = "week") - public ModelAndView week(ModelMap map , HttpServletRequest request , @Valid String q , @Valid String ekind) throws CSKefuException { - BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); - if(!super.esOrganFilter(request, boolQueryBuilder)){ - return request(super.createAppsTempletResponse("/apps/business/customer/index")); - } - - if(!StringUtils.isBlank(q)){ - map.put("q", q) ; - } - if(!StringUtils.isBlank(ekind)){ - boolQueryBuilder.must(termQuery("ekind" , ekind)) ; - map.put("ekind", ekind) ; - } - map.addAttribute("entCustomerList", entCustomerRes.findByCreaterAndSharesAndOrgi(super.getUser(request).getId(), super.getUser(request).getId(),super.getOrgi(request), MainUtils.getWeekStartTime() , null , false, boolQueryBuilder ,q , new PageRequest(super.getP(request) , super.getPs(request)))) ; - - return request(super.createAppsTempletResponse("/apps/business/customer/index")); - } - - @RequestMapping("/enterprise") - @Menu(type = "customer" , subtype = "enterprise") - public ModelAndView enterprise(ModelMap map , HttpServletRequest request , @Valid String q , @Valid String ekind) throws CSKefuException { - BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); - if(!super.esOrganFilter(request, boolQueryBuilder)){ - return request(super.createAppsTempletResponse("/apps/business/customer/index")); - } - - boolQueryBuilder.must(termQuery("etype" , MainContext.CustomerTypeEnum.ENTERPRISE.toString())) ; - if(!StringUtils.isBlank(ekind)){ - boolQueryBuilder.must(termQuery("ekind" , ekind)) ; - map.put("ekind", ekind) ; - } - if(!StringUtils.isBlank(q)){ - map.put("q", q) ; - } - map.addAttribute("entCustomerList", entCustomerRes.findByCreaterAndSharesAndOrgi(super.getUser(request).getId(), super.getUser(request).getId(),super.getOrgi(request), null , null , false, boolQueryBuilder ,q , new PageRequest(super.getP(request) , super.getPs(request)))) ; - return request(super.createAppsTempletResponse("/apps/business/customer/index")); - } - - @RequestMapping("/personal") - @Menu(type = "customer" , subtype = "personal") - public ModelAndView personal(ModelMap map , HttpServletRequest request , @Valid String q , @Valid String ekind) throws CSKefuException { - BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); - if(!super.esOrganFilter(request, boolQueryBuilder)){ - return request(super.createAppsTempletResponse("/apps/business/customer/index")); - } - - boolQueryBuilder.must(termQuery("etype" , MainContext.CustomerTypeEnum.PERSONAL.toString())) ; - - if(!StringUtils.isBlank(ekind)){ - boolQueryBuilder.must(termQuery("ekind" , ekind)) ; - map.put("ekind", ekind) ; - } - - if(!StringUtils.isBlank(q)){ - map.put("q", q) ; - } - map.addAttribute("entCustomerList", entCustomerRes.findByCreaterAndSharesAndOrgi(super.getUser(request).getId(), super.getUser(request).getId(),super.getOrgi(request), null , null , false, boolQueryBuilder ,q , new PageRequest(super.getP(request) , super.getPs(request)))) ; - return request(super.createAppsTempletResponse("/apps/business/customer/index")); - } - - @RequestMapping("/creater") - @Menu(type = "customer" , subtype = "creater") - public ModelAndView creater(ModelMap map , HttpServletRequest request , @Valid String q , @Valid String ekind) throws CSKefuException { - BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); - if(!super.esOrganFilter(request, boolQueryBuilder)){ - return request(super.createAppsTempletResponse("/apps/business/customer/index")); - } - - boolQueryBuilder.must(termQuery("creater" , super.getUser(request).getId())) ; - - if(!StringUtils.isBlank(ekind)){ - boolQueryBuilder.must(termQuery("ekind" , ekind)) ; - map.put("ekind", ekind) ; - } - if(!StringUtils.isBlank(q)){ - map.put("q", q) ; - } - - map.addAttribute("entCustomerList", entCustomerRes.findByCreaterAndSharesAndOrgi(super.getUser(request).getId(), super.getUser(request).getId(), super.getOrgi(request),null , null , false, boolQueryBuilder ,q , new PageRequest(super.getP(request) , super.getPs(request)))) ; - return request(super.createAppsTempletResponse("/apps/business/customer/index")); - } - - @RequestMapping("/add") - @Menu(type = "customer" , subtype = "customer") - public ModelAndView add(ModelMap map , HttpServletRequest request,@Valid String ekind) { - map.addAttribute("ekind", ekind); - return request(super.createRequestPageTempletResponse("/apps/business/customer/add")); - } - - @RequestMapping( "/save") - @Menu(type = "customer" , subtype = "customer") - public ModelAndView save(HttpServletRequest request , @Valid CustomerGroupForm customerGroupForm) { - customerGroupForm.getEntcustomer().setCreater(super.getUser(request).getId()); - customerGroupForm.getEntcustomer().setOrgi(super.getOrgi(request)); - customerGroupForm.getEntcustomer().setOrgan(super.getUser(request).getOrgan()); -// customerGroupForm.getEntcustomer().setEtype(MainContext.CustomerTypeEnum.ENTERPRISE.toString()); - customerGroupForm.getEntcustomer().setPinyin(PinYinTools.getInstance().getFirstPinYin(customerGroupForm.getEntcustomer().getName())); - entCustomerRes.save(customerGroupForm.getEntcustomer()); - if(customerGroupForm.getContacts()!=null && !StringUtils.isBlank(customerGroupForm.getContacts().getName())){ - customerGroupForm.getContacts().setEntcusid(customerGroupForm.getEntcustomer().getId()); - customerGroupForm.getContacts().setCreater(super.getUser(request).getId()); - customerGroupForm.getContacts().setOrgi(super.getOrgi(request)); - customerGroupForm.getContacts().setOrgan(super.getUser(request).getOrgan()); - customerGroupForm.getContacts().setPinyin(PinYinTools.getInstance().getFirstPinYin(customerGroupForm.getContacts().getName())); - if(StringUtils.isBlank(customerGroupForm.getContacts().getCusbirthday())) { - customerGroupForm.getContacts().setCusbirthday(null); - } - contactsRes.save(customerGroupForm.getContacts()) ; - } - return request(super.createRequestPageTempletResponse("redirect:/apps/customer/index.html?ekind="+customerGroupForm.getEntcustomer().getEkind())); - } - - @RequestMapping("/delete") - @Menu(type = "customer" , subtype = "customer") - public ModelAndView delete(HttpServletRequest request ,@Valid EntCustomer entCustomer ,@Valid String p) { - if(entCustomer!=null){ - entCustomer = entCustomerRes.findOne(entCustomer.getId()) ; - entCustomer.setDatastatus(true); //客户和联系人都是 逻辑删除 - entCustomerRes.save(entCustomer) ; - } - return request(super.createRequestPageTempletResponse("redirect:/apps/customer/index.html?p="+p+"&ekind="+entCustomer.getEkind())); - } - - @RequestMapping("/edit") - @Menu(type = "customer" , subtype = "customer") - public ModelAndView edit(ModelMap map , HttpServletRequest request , @Valid String id) { - map.addAttribute("entCustomer", entCustomerRes.findOne(id)) ; - return request(super.createRequestPageTempletResponse("/apps/business/customer/edit")); - } - - @RequestMapping( "/update") - @Menu(type = "customer" , subtype = "customer") - public ModelAndView update(HttpServletRequest request , @Valid CustomerGroupForm customerGroupForm) { - EntCustomer customer = entCustomerRes.findOne(customerGroupForm.getEntcustomer().getId()) ; - - List events = PropertiesEventUtils.processPropertiesModify(request, customerGroupForm.getEntcustomer() , customer , "id" , "orgi" , "creater" ,"createtime" , "updatetime") ; //记录 数据变更 历史 - if(events.size()>0){ - String modifyid = MainUtils.getUUID() ; - Date modifytime = new Date(); - for(PropertiesEvent event : events){ - event.setDataid(customerGroupForm.getEntcustomer().getId()); - event.setCreater(super.getUser(request).getId()); - event.setOrgi(super.getOrgi(request)); - event.setModifyid(modifyid); - event.setCreatetime(modifytime); - propertiesEventRes.save(event) ; - } - } - - customerGroupForm.getEntcustomer().setCreater(customer.getCreater()); - customerGroupForm.getEntcustomer().setCreatetime(customer.getCreatetime()); - customerGroupForm.getEntcustomer().setOrgi(super.getOrgi(request)); - customerGroupForm.getEntcustomer().setOrgan(super.getUser(request).getOrgan()); - customerGroupForm.getEntcustomer().setPinyin(PinYinTools.getInstance().getFirstPinYin(customerGroupForm.getEntcustomer().getName())); - entCustomerRes.save(customerGroupForm.getEntcustomer()); - - return request(super.createRequestPageTempletResponse("redirect:/apps/customer/index.html?ekind="+customerGroupForm.getEntcustomer().getEkind())); - } - - @RequestMapping("/imp") - @Menu(type = "customer" , subtype = "customer") - public ModelAndView imp(ModelMap map , HttpServletRequest request,@Valid String ekind) { - map.addAttribute("ekind",ekind); - return request(super.createRequestPageTempletResponse("/apps/business/customer/imp")); - } - - @RequestMapping("/impsave") - @Menu(type = "customer" , subtype = "customer") - public ModelAndView impsave(ModelMap map , HttpServletRequest request , @RequestParam(value = "cusfile", required = false) MultipartFile cusfile,@Valid String ekind) throws IOException { - DSDataEvent event = new DSDataEvent(); - String fileName = "customer/"+ MainUtils.getUUID()+cusfile.getOriginalFilename().substring(cusfile.getOriginalFilename().lastIndexOf(".")) ; - File excelFile = new File(path , fileName) ; - if(!excelFile.getParentFile().exists()){ - excelFile.getParentFile().mkdirs() ; - } - MetadataTable table = metadataRes.findByTablename("uk_entcustomer") ; - if(table!=null){ - FileUtils.writeByteArrayToFile(new File(path , fileName), cusfile.getBytes()); - event.setDSData(new DSData(table,excelFile , cusfile.getContentType(), super.getUser(request))); - event.getDSData().setClazz(EntCustomer.class); - event.getDSData().setProcess(new EntCustomerProcess(entCustomerRes)); - event.setOrgi(super.getOrgi(request)); - /*if(!StringUtils.isBlank(ekind)){ - exchange.getValues().put("ekind", ekind) ; - }*/ - event.getValues().put("creater", super.getUser(request).getId()) ; - reporterRes.save(event.getDSData().getReport()) ; - new ExcelImportProecess(event).process() ; //启动导入任务 - } - - return request(super.createRequestPageTempletResponse("redirect:/apps/customer/index.html")); - } - - @RequestMapping("/expids") - @Menu(type = "customer" , subtype = "customer") - public void expids(ModelMap map , HttpServletRequest request , HttpServletResponse response , @Valid String[] ids) throws IOException { - if(ids!=null && ids.length > 0){ - Iterable entCustomerList = entCustomerRes.findAll(Arrays.asList(ids)) ; - MetadataTable table = metadataRes.findByTablename("uk_entcustomer") ; - List> values = new ArrayList>(); - for(EntCustomer customer : entCustomerList){ - values.add(MainUtils.transBean2Map(customer)) ; - } - - response.setHeader("content-disposition", "attachment;filename=UCKeFu-EntCustomer-"+new SimpleDateFormat("yyyy-MM-dd").format(new Date())+".xls"); - - ExcelExporterProcess excelProcess = new ExcelExporterProcess( values, table, response.getOutputStream()) ; - excelProcess.process(); - } - - return ; - } - - @RequestMapping("/expall") - @Menu(type = "customer" , subtype = "customer") - public void expall(ModelMap map , HttpServletRequest request , HttpServletResponse response) throws IOException, CSKefuException { - BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); - if(!super.esOrganFilter(request, boolQueryBuilder)){ - // #TODO 提示没有部门 - return; - } - - boolQueryBuilder.must(termQuery("datastatus" , false)) ; //只导出 数据删除状态 为 未删除的 数据 - Iterable entCustomerList = entCustomerRes.findByCreaterAndSharesAndOrgi(super.getUser(request).getId(), super.getUser(request).getId(),super.getOrgi(request), null , null , false, boolQueryBuilder , null , new PageRequest(super.getP(request) , super.getPs(request))); - - MetadataTable table = metadataRes.findByTablename("uk_entcustomer") ; - List> values = new ArrayList>(); - for(EntCustomer customer : entCustomerList){ - values.add(MainUtils.transBean2Map(customer)) ; - } - - response.setHeader("content-disposition", "attachment;filename=UCKeFu-EntCustomer-"+new SimpleDateFormat("yyyy-MM-dd").format(new Date())+".xls"); - - ExcelExporterProcess excelProcess = new ExcelExporterProcess( values, table, response.getOutputStream()) ; - excelProcess.process(); - return ; - } - - @RequestMapping("/expsearch") - @Menu(type = "customer" , subtype = "customer") - public void expall(ModelMap map , HttpServletRequest request , HttpServletResponse response , @Valid String q , @Valid String ekind) throws IOException, CSKefuException { - BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); - if(!super.esOrganFilter(request, boolQueryBuilder)){ - // #TODO 提示没有部门 - return; - } - - if(!StringUtils.isBlank(q)){ - map.put("q", q) ; - } - if(!StringUtils.isBlank(ekind)){ - boolQueryBuilder.must(termQuery("ekind" , ekind)) ; - map.put("ekind", ekind) ; - } - - Iterable entCustomerList = entCustomerRes.findByCreaterAndSharesAndOrgi(super.getUser(request).getId(), super.getUser(request).getId(),super.getOrgi(request), null , null , false, boolQueryBuilder ,q , new PageRequest(super.getP(request) , super.getPs(request))); - MetadataTable table = metadataRes.findByTablename("uk_entcustomer") ; - List> values = new ArrayList>(); - for(EntCustomer customer : entCustomerList){ - values.add(MainUtils.transBean2Map(customer)) ; - } - - response.setHeader("content-disposition", "attachment;filename=UCKeFu-EntCustomer-"+new SimpleDateFormat("yyyy-MM-dd").format(new Date())+".xls"); - - ExcelExporterProcess excelProcess = new ExcelExporterProcess( values, table, response.getOutputStream()) ; - excelProcess.process(); - - return ; - } -} \ No newline at end of file diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/handler/apps/entim/EntIMController.java b/contact-center/app/src/main/java/com/chatopera/cc/app/handler/apps/entim/EntIMController.java deleted file mode 100644 index bb8926b2..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/handler/apps/entim/EntIMController.java +++ /dev/null @@ -1,231 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.chatopera.cc.app.handler.apps.entim; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; - -import com.chatopera.cc.app.basic.MainUtils; -import com.chatopera.cc.util.Menu; -import com.chatopera.cc.app.im.client.NettyClients; -import com.chatopera.cc.app.persistence.repository.IMGroupRepository; -import com.chatopera.cc.app.persistence.repository.IMGroupUserRepository; -import com.chatopera.cc.app.persistence.repository.OrganRepository; -import com.chatopera.cc.app.handler.Handler; -import com.chatopera.cc.app.model.IMGroupUser; -import com.chatopera.cc.app.model.RecentUser; -import com.chatopera.cc.app.model.User; -import org.apache.commons.lang.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Sort; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.servlet.ModelAndView; - -import com.chatopera.cc.app.persistence.repository.ChatMessageRepository; -import com.chatopera.cc.app.persistence.repository.RecentUserRepository; -import com.chatopera.cc.app.persistence.repository.UserRepository; -import com.chatopera.cc.app.model.IMGroup; - -@Controller -@RequestMapping("/ent/im") -public class EntIMController extends Handler { - - @Autowired - private OrganRepository organRes ; - - @Autowired - private UserRepository userRes ; - - @Autowired - private IMGroupRepository imGroupRes ; - - @Autowired - private IMGroupUserRepository imGroupUserRes ; - - @Autowired - private ChatMessageRepository chatMessageRes; - - @Autowired - private RecentUserRepository recentUserRes ; - - @RequestMapping("/index") - @Menu(type = "im" , subtype = "entim" , access = false) - public ModelAndView index(HttpServletRequest request , HttpServletResponse response) { - ModelAndView view = request(super.createEntIMTempletResponse("/apps/entim/index")) ; - view.addObject("organList", organRes.findByOrgi(super.getOrgi(request))) ; - view.addObject("userList", userRes.findByOrgiAndDatastatus(super.getOrgi(request) , false)) ; - - view.addObject("groupList", imGroupRes.findByCreaterAndOrgi(super.getUser(request).getId(), super.getOrgi(request))); - - view.addObject("joinGroupList", imGroupUserRes.findByUserAndOrgi(super.getUser(request), super.getOrgi(request))) ; - - view.addObject("recentUserList", recentUserRes.findByCreaterAndOrgi(super.getUser(request).getId(), super.getOrgi(request))) ; - - return view; - } - - @RequestMapping("/skin") - @Menu(type = "im" , subtype = "entim" , access = false) - public ModelAndView skin(HttpServletRequest request , HttpServletResponse response) { - ModelAndView view = request(super.createEntIMTempletResponse("/apps/entim/skin")) ; - - return view; - } - - @RequestMapping("/point") - @Menu(type = "im" , subtype = "entim" , access = false) - public ModelAndView point(HttpServletRequest request , HttpServletResponse response) { - ModelAndView view = request(super.createEntIMTempletResponse("/apps/entim/point")) ; - view.addObject("recentUserList", recentUserRes.findByCreaterAndOrgi(super.getUser(request).getId(), super.getOrgi(request))) ; - return view; - } - - @RequestMapping("/chat") - @Menu(type = "im" , subtype = "entim" , access = false) - public ModelAndView chat(HttpServletRequest request , HttpServletResponse response , @Valid String userid) { - ModelAndView view = request(super.createEntIMTempletResponse("/apps/entim/chat")) ; - view.addObject("entimuser", userRes.findByIdAndOrgi(userid, super.getOrgi(request))) ; - view.addObject("contextid", MainUtils.genNewID(super.getUser(request).getId(), userid)) ; - view.addObject("online", NettyClients.getInstance().getEntIMClientsNum(userid) > 0) ; - view.addObject("chatMessageList", chatMessageRes.findByContextidAndUseridAndOrgi(userid , super.getUser(request).getId(), super.getOrgi(request), new PageRequest(0, 20, Sort.Direction.DESC, "createtime"))) ; - - RecentUser recentUser = recentUserRes.findByCreaterAndUserAndOrgi(super.getUser(request).getId() , new User(userid), super.getOrgi(request)) ; - /** - * 我的最近联系人 - */ - if(recentUser == null){ - recentUser = new RecentUser(); - recentUser.setOrgi(super.getOrgi(request)); - recentUser.setCreater(super.getUser(request).getId()); - recentUser.setUser(new User(userid)); - }else{ - recentUser.setNewmsg(0); - } - recentUserRes.save(recentUser) ; - /** - * 对方的最近联系人 - */ - recentUser = recentUserRes.findByCreaterAndUserAndOrgi(userid , super.getUser(request), super.getOrgi(request)) ; - if(recentUser == null){ - recentUser = new RecentUser(); - recentUser.setOrgi(super.getOrgi(request)); - recentUser.setCreater(userid); - recentUser.setUser(super.getUser(request)); - recentUserRes.save(recentUser) ; - } - return view; - } - - @RequestMapping("/group") - @Menu(type = "im" , subtype = "entim" , access = false) - public ModelAndView group(HttpServletRequest request , HttpServletResponse response , @Valid String id) { - ModelAndView view = request(super.createEntIMTempletResponse("/apps/entim/group/index")) ; - IMGroup imGroup = imGroupRes.findById(id); - view.addObject("imGroup", imGroup) ; - view.addObject("imGroupUserList", imGroupUserRes.findByImgroupAndOrgi(imGroup, super.getOrgi(request))) ; - view.addObject("contextid", id) ; - view.addObject("chatMessageList", chatMessageRes.findByContextidAndOrgi(id, super.getOrgi(request), new PageRequest(0, 20, Sort.Direction.DESC, "createtime"))) ; - return view; - } - - @RequestMapping("/group/user") - @Menu(type = "im" , subtype = "entim" , access = false) - public ModelAndView user(HttpServletRequest request , HttpServletResponse response , @Valid String id) { - ModelAndView view = request(super.createEntIMTempletResponse("/apps/entim/group/user")) ; - IMGroup imGroup = imGroupRes.findById(id); - view.addObject("imGroup", imGroup) ; - view.addObject("organList", organRes.findByOrgi(super.getOrgi(request))) ; - view.addObject("userList", userRes.findByOrgiAndDatastatus(super.getOrgi(request) , false)) ; - - view.addObject("imGroupUserList", imGroupUserRes.findByImgroupAndOrgi(imGroup, super.getOrgi(request))) ; - - return view; - } - - @RequestMapping("/group/seluser") - @Menu(type = "im" , subtype = "entim" , access = false) - public void seluser(HttpServletRequest request , HttpServletResponse response , @Valid String id , @Valid String user) { - IMGroup imGroup = new IMGroup(); - imGroup.setId(id); - User curUser = new User(); - curUser.setId(user); - IMGroupUser imGroupUser = imGroupUserRes.findByImgroupAndUserAndOrgi(imGroup, curUser, super.getOrgi(request)) ; - if(imGroupUser == null){ - imGroupUser = new IMGroupUser() ; - imGroupUser.setImgroup(imGroup); - imGroupUser.setUser(curUser); - imGroupUser.setOrgi(super.getUser(request).getOrgi()); - imGroupUser.setCreater(super.getUser(request).getId()); - imGroupUserRes.save(imGroupUser) ; - } - } - - @RequestMapping("/group/rmuser") - @Menu(type = "im" , subtype = "entim" , access = false) - public void rmluser(HttpServletRequest request , HttpServletResponse response , @Valid String id , @Valid String user) { - IMGroup imGroup = new IMGroup(); - imGroup.setId(id); - User curUser = new User(); - curUser.setId(user); - IMGroupUser imGroupUser = imGroupUserRes.findByImgroupAndUserAndOrgi(imGroup, curUser, super.getOrgi(request)) ; - if(imGroupUser != null){ - imGroupUserRes.delete(imGroupUser); - } - } - - @RequestMapping("/group/tipmsg") - @Menu(type = "im" , subtype = "entim" , access = false) - public ModelAndView tipmsg(HttpServletRequest request , HttpServletResponse response , @Valid String id , @Valid String tipmsg) { - ModelAndView view = request(super.createRequestPageTempletResponse("/apps/entim/group/tipmsg")) ; - IMGroup imGroup = imGroupRes.findById(id) ; - if(imGroup != null){ - imGroup.setTipmessage(tipmsg); - imGroupRes.save(imGroup) ; - } - view.addObject("imGroup", imGroup) ; - return view ; - } - - - @RequestMapping("/group/save") - @Menu(type = "im" , subtype = "entim" , access = false) - public ModelAndView groupsave(HttpServletRequest request , HttpServletResponse response , @Valid IMGroup group) { - ModelAndView view = request(super.createRequestPageTempletResponse("/apps/entim/group/grouplist")) ; - if(!StringUtils.isBlank(group.getName()) && imGroupRes.countByNameAndOrgi(group.getName() , super.getOrgi(request)) == 0){ - group.setOrgi(super.getUser(request).getOrgi()); - group.setCreater(super.getUser(request).getId()); - imGroupRes.save(group) ; - - IMGroupUser imGroupUser = new IMGroupUser() ; - imGroupUser.setOrgi(super.getUser(request).getOrgi()); - imGroupUser.setUser(super.getUser(request)); - imGroupUser.setImgroup(group); - imGroupUser.setAdmin(true); - imGroupUser.setCreater(super.getUser(request).getId()); - imGroupUserRes.save(imGroupUser) ; - } - view.addObject("groupList", imGroupRes.findByCreaterAndOrgi(super.getUser(request).getId(), super.getOrgi(request))) ; - - view.addObject("joinGroupList", imGroupUserRes.findByUserAndOrgi(super.getUser(request), super.getOrgi(request))) ; - - return view; - } -} \ No newline at end of file diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/handler/apps/internet/IMController.java b/contact-center/app/src/main/java/com/chatopera/cc/app/handler/apps/internet/IMController.java deleted file mode 100644 index ea22db1e..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/handler/apps/internet/IMController.java +++ /dev/null @@ -1,829 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.chatopera.cc.app.handler.apps.internet; - -import com.chatopera.cc.app.algorithm.AutomaticServiceDist; -import com.chatopera.cc.app.basic.MainContext; -import com.chatopera.cc.app.basic.MainUtils; -import com.chatopera.cc.app.cache.CacheHelper; -import com.chatopera.cc.app.handler.Handler; -import com.chatopera.cc.app.im.util.RichMediaUtils; -import com.chatopera.cc.app.model.*; -import com.chatopera.cc.app.persistence.blob.JpaBlobHelper; -import com.chatopera.cc.app.persistence.es.ContactsRepository; -import com.chatopera.cc.app.persistence.repository.*; -import com.chatopera.cc.util.*; -import org.apache.commons.io.FileUtils; -import org.apache.commons.lang.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Sort.Direction; -import org.springframework.scheduling.annotation.EnableAsync; -import org.springframework.stereotype.Controller; -import org.springframework.ui.ModelMap; -import org.springframework.util.FileCopyUtils; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.multipart.MultipartFile; -import org.springframework.web.servlet.ModelAndView; -import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; - -import javax.servlet.http.Cookie; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; -import java.io.File; -import java.io.IOException; -import java.net.URLDecoder; -import java.net.URLEncoder; -import java.util.Date; -import java.util.HashMap; -import java.util.List; - -@Controller -@RequestMapping("/im") -@EnableAsync -public class IMController extends Handler { - private final static Logger logger = LoggerFactory.getLogger(IMController.class); - - - @Value("${uk.im.server.host}") - private String host; - - @Value("${uk.im.server.port}") - private Integer port; - - @Value("${cs.im.server.ssl.port}") - private Integer sslPort; - - @Value("${web.upload-path}") - private String path; - - @Autowired - private StreamingFileRepository streamingFileRepository; - - @Autowired - private JpaBlobHelper jpaBlobHelper; - - @Autowired - private ConsultInviteRepository inviteRepository; - - @Autowired - private ChatMessageRepository chatMessageRes; - - @Autowired - private AgentServiceSatisRepository agentServiceSatisRes; - - @Autowired - private InviteRecordRepository inviteRecordRes; - - @Autowired - private LeaveMsgRepository leaveMsgRes; - - - @Autowired - private AttachmentRepository attachementRes; - - @Autowired - private ContactsRepository contactsRes; - - @Autowired - private AgentUserContactsRepository agentUserContactsRes; - - @Autowired - private SNSAccountRepository snsAccountRepository; - - @RequestMapping("/{id}") - @Menu(type = "im", subtype = "point", access = true) - public ModelAndView point(HttpServletRequest request, HttpServletResponse response, - @PathVariable String id, - @Valid String orgi, - @Valid String userid, - @Valid String title, - @Valid String aiid) { - ModelAndView view = request(super.createRequestPageTempletResponse("/apps/im/point")); - String sessionid = request.getSession().getId(); - if (StringUtils.isNotBlank(id)) { - view.addObject("hostname", request.getServerName()); - - SystemConfig systemConfig = MainUtils.getSystemConfig(); - if (systemConfig != null && systemConfig.isEnablessl()) { - view.addObject("schema", "https"); - if (request.getServerPort() == 80) { - view.addObject("port", 443); - } else { - view.addObject("port", request.getServerPort()); - } - } else { - view.addObject("schema", request.getScheme()); - view.addObject("port", request.getServerPort()); - } - view.addObject("appid", id); - - - view.addObject("client", MainUtils.getUUID()); - view.addObject("sessionid", sessionid); - - view.addObject("ip", MainUtils.md5(request.getRemoteAddr())); - - view.addObject("mobile", CheckMobile.check(request.getHeader("User-Agent"))); - - CousultInvite invite = OnlineUserUtils.cousult(id, orgi, inviteRepository); - if (invite != null) { - orgi = invite.getOrgi(); - view.addObject("inviteData", invite); - view.addObject("orgi", invite.getOrgi()); - view.addObject("appid", id); - - if (StringUtils.isNotBlank(aiid)) { - view.addObject("aiid", aiid); - } else if (StringUtils.isNotBlank(invite.getAiid())) { - view.addObject("aiid", invite.getAiid()); - } - //记录用户行为日志 - UserHistory userHistory = new UserHistory(); - String url = request.getHeader("referer"); - if (StringUtils.isNotBlank(url)) { - if (url.length() > 255) { - userHistory.setUrl(url.substring(0, 255)); - } else { - userHistory.setUrl(url); - } - userHistory.setReferer(userHistory.getUrl()); - } - userHistory.setParam(MainUtils.getParameter(request)); - if (userHistory != null) { - userHistory.setMaintype("im"); - userHistory.setSubtype("point"); - userHistory.setName("online"); - userHistory.setAdmin(false); - userHistory.setAccessnum(true); - } - User imUser = super.getIMUser(request, userid, null); - if (imUser != null) { - userHistory.setCreater(imUser.getId()); - userHistory.setUsername(imUser.getUsername()); - userHistory.setOrgi(orgi); - } - if (StringUtils.isNotBlank(title)) { - if (title.length() > 255) { - userHistory.setTitle(title.substring(0, 255)); - } else { - userHistory.setTitle(title); - } - } - userHistory.setOrgi(invite.getOrgi()); - userHistory.setAppid(id); - userHistory.setSessionid(sessionid); - - String ip = MainUtils.getIpAddr(request); - userHistory.setHostname(ip); - userHistory.setIp(ip); - IP ipdata = IPTools.getInstance().findGeography(ip); - userHistory.setCountry(ipdata.getCountry()); - userHistory.setProvince(ipdata.getProvince()); - userHistory.setCity(ipdata.getCity()); - userHistory.setIsp(ipdata.getIsp()); - - BrowserClient client = MainUtils.parseClient(request); - userHistory.setOstype(client.getOs()); - userHistory.setBrowser(client.getBrowser()); - userHistory.setMobile(CheckMobile.check(request.getHeader("User-Agent")) ? "1" : "0"); - - if (invite.isSkill()) { - /*** - * 查询 技能组 , 缓存? - */ - view.addObject("skillList", OnlineUserUtils.organ(orgi, ipdata, invite, true)); - /** - * 查询坐席 , 缓存? - */ - view.addObject("agentList", OnlineUserUtils.agents(orgi, true)); - } - view.addObject("traceid", userHistory.getId()); - if (invite.isRecordhis()) { - MainUtils.published(userHistory); - } - - view.addObject("pointAd", MainUtils.getPointAdv(MainContext.AdPosEnum.POINT.toString(), orgi)); - view.addObject("inviteAd", MainUtils.getPointAdv(MainContext.AdPosEnum.INVITE.toString(), orgi)); - } - } - - return view; - } - - @RequestMapping("/{id}/userlist") - @Menu(type = "im", subtype = "inlist", access = true) - public void inlist(HttpServletRequest request, HttpServletResponse response, @PathVariable String id, @Valid String userid) throws IOException { - response.setHeader("Content-Type", "text/html;charset=utf-8"); - if (StringUtils.isNotBlank(userid)) { - BlackEntity black = (BlackEntity) CacheHelper.getSystemCacheBean().getCacheObject(userid, MainContext.SYSTEM_ORGI); - if ((black != null && (black.getEndtime() == null || black.getEndtime().after(new Date())))) { - response.getWriter().write("in"); - ; - } - } - } - - /** - * 延时获取用户端浏览器的跟踪ID - * - * @param request - * @param response - * @param orgi - * @param appid - * @param userid - * @param sign - * @return - */ - @RequestMapping("/online") - @Menu(type = "im", subtype = "online", access = true) - public SseEmitter callable(HttpServletRequest request, - HttpServletResponse response, - @Valid Contacts contacts, - final @Valid String orgi, - final @Valid String sessionid, - @Valid String appid, - final @Valid String userid, - @Valid String sign, - final @Valid String client, - final @Valid String title, - final @Valid String traceid) { - BlackEntity black = (BlackEntity) CacheHelper.getSystemCacheBean().getCacheObject(userid, orgi); - SseEmitter retSseEmitter = null; - if ((black == null || (black.getEndtime() != null && black.getEndtime().before(new Date())))) { - final SseEmitter emitter = new SseEmitter(30000L); - if (CacheHelper.getSystemCacheBean().getCacheObject(userid, orgi) == null) { - if (StringUtils.isNotBlank(userid)) { - emitter.onCompletion(new Runnable() { - @Override - public void run() { - try { - OnlineUserUtils.webIMClients.removeClient(userid, client, false); //执行了 邀请/再次邀请后终端的 - } catch (Exception e) { - e.printStackTrace(); - } - } - }); - emitter.onTimeout(new Runnable() { - @Override - public void run() { - try { - if (emitter != null) { - emitter.complete(); - } - OnlineUserUtils.webIMClients.removeClient(userid, client, true); //正常的超时断开 - } catch (Exception e) { - e.printStackTrace(); - } - } - }); - CousultInvite invite = OnlineUserUtils.cousult(appid, orgi, inviteRepository); - if (invite != null && invite.isTraceuser()) { - contacts = processContacts(orgi, contacts, appid, userid); - } - if (StringUtils.isNotBlank(sign)) { - OnlineUserUtils.online(super.getIMUser(request, sign, contacts != null ? contacts.getName() : null), - orgi, - sessionid, - MainContext.OnlineUserTypeStatus.WEBIM.toString(), - request, - MainContext.ChannelTypeEnum.WEBIM.toString(), - appid, - contacts, - invite); - - } - OnlineUserUtils.webIMClients.putClient(userid, new WebIMClient(userid, client, emitter)); - } - } - retSseEmitter = emitter; - } - return retSseEmitter; - } - - @RequestMapping("/index") - @Menu(type = "im", subtype = "index", access = true) - public ModelAndView index(ModelMap map, HttpServletRequest request, - HttpServletResponse response, - @Valid String orgi, - @Valid String aiid, - @Valid String traceid, - @Valid String exchange, - @Valid String title, - @Valid String url, - @Valid String mobile, - @Valid String phone, - @Valid String ai, - @Valid String client, - @Valid String type, - @Valid String appid, - @Valid String userid, - @Valid String sessionid, - @Valid String skill, - @Valid String agent, - @Valid Contacts contacts, - @Valid String product, - @Valid String description, - @Valid String imgurl, - @Valid String pid, - @Valid String purl) throws Exception { - ModelAndView view = request(super.createRequestPageTempletResponse("/apps/im/index")); - BlackEntity black = (BlackEntity) CacheHelper.getSystemCacheBean().getCacheObject(userid, MainContext.SYSTEM_ORGI); - if (StringUtils.isNotBlank(appid) && (black == null || (black.getEndtime() != null && black.getEndtime().before(new Date())))) { - CousultInvite invite = OnlineUserUtils.cousult(appid, orgi, inviteRepository); - String userID = null; - if (StringUtils.isNotBlank(userid)) { - userID = MainUtils.genIDByKey(userid); - } else { - userID = MainUtils.genIDByKey(sessionid); - } - String nickname = "Guest_" + userID; - boolean consult = true; //是否已收集用户信息 - SessionConfig sessionConfig = AutomaticServiceDist.initSessionConfig(orgi); - - map.addAttribute("sessionConfig", sessionConfig); - map.addAttribute("hostname", request.getServerName()); - - if (sslPort != null) { - map.addAttribute("port", sslPort); - } else { - map.addAttribute("port", port); - } - - map.addAttribute("appid", appid); - map.addAttribute("userid", userid); - map.addAttribute("schema", request.getScheme()); - map.addAttribute("sessionid", sessionid); - - view.addObject("product", product); - view.addObject("description", description); - view.addObject("imgurl", imgurl); - view.addObject("pid", pid); - view.addObject("purl", purl); - - map.addAttribute("ip", MainUtils.md5(request.getRemoteAddr())); - - if (StringUtils.isNotBlank(traceid)) { - map.addAttribute("traceid", traceid); - } - if (StringUtils.isNotBlank(exchange)) { - map.addAttribute("exchange", exchange); - } - if (StringUtils.isNotBlank(title)) { - map.addAttribute("title", title); - } - if (StringUtils.isNotBlank(traceid)) { - map.addAttribute("url", url); - } - - map.addAttribute("ukefport", request.getServerPort()); - /** - * 先检查 invite不为空 - */ - if (invite != null) { - map.addAttribute("orgi", invite.getOrgi()); - map.addAttribute("inviteData", invite); - - if (StringUtils.isNotBlank(aiid)) { - map.addAttribute("aiid", aiid); - } else if (StringUtils.isNotBlank(invite.getAiid())) { - map.addAttribute("aiid", invite.getAiid()); - } - - AgentReport report = AutomaticServiceDist.getAgentReport(invite.getOrgi()); - - if (report.getAgents() == 0 || (sessionConfig.isHourcheck() && !MainUtils.isInWorkingHours(sessionConfig.getWorkinghours()) && invite.isLeavemessage())) { - view = request(super.createRequestPageTempletResponse("/apps/im/leavemsg")); - } else if (invite.isConsult_info()) { //启用了信息收集 , 从Request获取 , 或从 Cookies 里去 - //验证 OnlineUser 信息 - if (contacts != null && StringUtils.isNotBlank(contacts.getName())) { //contacts用于传递信息,并不和 联系人表发生 关联,contacts信息传递给 Socket.IO,然后赋值给 AgentUser,最终赋值给 AgentService永久存储 - consult = true; - //存入 Cookies - if (invite.isConsult_info_cookies()) { - Cookie name = new Cookie("name", MainUtils.encryption(URLEncoder.encode(contacts.getName(), "UTF-8"))); - response.addCookie(name); - name.setMaxAge(3600); - if (StringUtils.isNotBlank(contacts.getPhone())) { - Cookie phonecookie = new Cookie("phone", MainUtils.encryption(URLEncoder.encode(contacts.getPhone(), "UTF-8"))); - phonecookie.setMaxAge(3600); - response.addCookie(phonecookie); - } - if (StringUtils.isNotBlank(contacts.getEmail())) { - Cookie email = new Cookie("email", MainUtils.encryption(URLEncoder.encode(contacts.getEmail(), "UTF-8"))); - email.setMaxAge(3600); - response.addCookie(email); - } - if (StringUtils.isNotBlank(contacts.getMemo())) { - Cookie memo = new Cookie("memo", MainUtils.encryption(URLEncoder.encode(contacts.getName(), "UTF-8"))); - memo.setMaxAge(3600); - response.addCookie(memo); - } - } - } else { - //从 Cookies里尝试读取 - if (invite.isConsult_info_cookies()) { - Cookie[] cookies = request.getCookies();//这样便可以获取一个cookie数组 - contacts = new Contacts(); - if (cookies != null) { - for (Cookie cookie : cookies) { - if (cookie != null && StringUtils.isNotBlank(cookie.getName()) && StringUtils.isNotBlank(cookie.getValue())) { - if (cookie.getName().equals("name")) { - contacts.setName(URLDecoder.decode(MainUtils.decryption(cookie.getValue()), "UTF-8")); - } - if (cookie.getName().equals("phone")) { - contacts.setPhone(URLDecoder.decode(MainUtils.decryption(cookie.getValue()), "UTF-8")); - } - if (cookie.getName().equals("email")) { - contacts.setEmail(URLDecoder.decode(MainUtils.decryption(cookie.getValue()), "UTF-8")); - } - if (cookie.getName().equals("memo")) { - contacts.setMemo(URLDecoder.decode(MainUtils.decryption(cookie.getValue()), "UTF-8")); - } - } - } - } - } - if (StringUtils.isBlank(contacts.getName())) { - consult = false; - view = request(super.createRequestPageTempletResponse("/apps/im/collecting")); - } - } - } else { - contacts = processContacts(invite.getOrgi(), contacts, appid, userid); - } - - if (StringUtils.isNotBlank(client)) { - map.addAttribute("client", client); - } - if (StringUtils.isNotBlank(skill)) { - map.addAttribute("skill", skill); - } - if (StringUtils.isNotBlank(agent)) { - map.addAttribute("agent", agent); - } - - map.addAttribute("contacts", contacts); - - if (StringUtils.isNotBlank(type)) { - map.addAttribute("type", type); - } - IP ipdata = IPTools.getInstance().findGeography(MainUtils.getIpAddr(request)); - map.addAttribute("skillList", OnlineUserUtils.organ(invite.getOrgi(), ipdata, invite, true)); - - if (invite != null && consult) { - if (contacts != null && StringUtils.isNotBlank(contacts.getName())) { - nickname = contacts.getName(); - } - map.addAttribute("username", nickname); - if (MainContext.model.get("chatbot") != null && - StringUtils.isNotBlank(invite.getAiid()) && - invite.isAi() && - ((StringUtils.equals(ai, "true")) || (invite.isAifirst() && ai == null))) { //启用 AI , 并且 AI优先 接待 - HashMap chatbotConfig = new HashMap(); - chatbotConfig.put("botname", invite.getAiname()); - chatbotConfig.put("botid", invite.getAiid()); - chatbotConfig.put("botwelcome", invite.getAimsg()); - chatbotConfig.put("botfirst", Boolean.toString(invite.isAifirst())); - chatbotConfig.put("isai", Boolean.toString(invite.isAi())); - if (chatbotConfig != null) { - map.addAttribute("chatbotConfig", chatbotConfig); - } - view = request(super.createRequestPageTempletResponse("/apps/im/chatbot/index")); - if (CheckMobile.check(request.getHeader("User-Agent")) || StringUtils.isNotBlank(mobile)) { - view = request(super.createRequestPageTempletResponse("/apps/im/chatbot/mobile")); //智能机器人 移动端 - } - } else { - if (CheckMobile.check(request.getHeader("User-Agent")) || StringUtils.isNotBlank(mobile)) { - view = request(super.createRequestPageTempletResponse("/apps/im/mobile")); //WebIM移动端。再次点选技能组? - } - } - map.addAttribute("chatMessageList", chatMessageRes.findByUsessionAndOrgi(userid, orgi, new PageRequest(0, 20, Direction.DESC, "updatetime"))); - } - view.addObject("commentList", UKeFuDic.getInstance().getDic(MainContext.UKEFU_SYSTEM_COMMENT_DIC)); - view.addObject("commentItemList", UKeFuDic.getInstance().getDic(MainContext.UKEFU_SYSTEM_COMMENT_ITEM_DIC)); - view.addObject("welcomeAd", MainUtils.getPointAdv(MainContext.AdPosEnum.WELCOME.toString(), orgi)); - view.addObject("imageAd", MainUtils.getPointAdv(MainContext.AdPosEnum.IMAGE.toString(), orgi)); - // OnlineUserUtils.sendWebIMClients(userid , "accept"); - - if (invite.isTraceuser()) { - Page inviteRecordList = inviteRecordRes.findByUseridAndOrgi(userid, orgi, new PageRequest(0, 1, Direction.DESC, "createtime")); - if (inviteRecordList.getContent() != null && inviteRecordList.getContent().size() > 0) { - InviteRecord record = inviteRecordList.getContent().get(0); - record.setUpdatetime(new Date()); - record.setTraceid(traceid); - record.setTitle(title); - record.setUrl(url); - record.setResponsetime((int) (System.currentTimeMillis() - record.getCreatetime().getTime())); - record.setResult(MainContext.OnlineUserInviteStatus.ACCEPT.toString()); - inviteRecordRes.save(record); - } - } - } - } - return view; - } - - private Contacts processContacts(String orgi, Contacts contacts, String appid, String userid) { - if (contacts != null) { - if (contacts != null && - (StringUtils.isNotBlank(contacts.getName()) || - StringUtils.isNotBlank(contacts.getPhone()) || - StringUtils.isNotBlank(contacts.getEmail()))) { - StringBuffer query = new StringBuffer(); - query.append(contacts.getName()); - if (StringUtils.isNotBlank(contacts.getPhone())) { - query.append(" OR ").append(contacts.getPhone()); - } - if (StringUtils.isNotBlank(contacts.getEmail())) { - query.append(" OR ").append(contacts.getEmail()); - } - Page contactsList = contactsRes.findByOrgi(orgi, false, query.toString(), new PageRequest(0, 1)); - if (contactsList.getContent().size() > 0) { - contacts = contactsList.getContent().get(0); - } else { -// contactsRes.save(contacts) ; //需要增加签名验证,避免随便产生垃圾信息,也可以自行修改? - contacts.setId(null); - } - } else { - contacts.setId(null); - } - if (contacts != null && StringUtils.isNotBlank(contacts.getId())) { - List agentUserContactsList = agentUserContactsRes.findByUseridAndOrgi(userid, orgi); - if (agentUserContactsList.size() == 0) { - AgentUserContacts agentUserContacts = new AgentUserContacts(); - agentUserContacts.setAppid(appid); - agentUserContacts.setChannel(MainContext.ChannelTypeEnum.WEBIM.toString()); - agentUserContacts.setContactsid(contacts.getId()); - agentUserContacts.setUserid(userid); - agentUserContacts.setOrgi(orgi); - agentUserContacts.setCreatetime(new Date()); - agentUserContactsRes.save(agentUserContacts); - } - } else if (StringUtils.isNotBlank(userid)) { - List agentUserContactsList = agentUserContactsRes.findByUseridAndOrgi(userid, orgi); - if (agentUserContactsList.size() > 0) { - AgentUserContacts agentUserContacts = agentUserContactsList.get(0); - contacts = contactsRes.findOne(agentUserContacts.getContactsid()); - } - } - } - return contacts; - } - - @RequestMapping("/text/{appid}") - @Menu(type = "im", subtype = "index", access = true) - public ModelAndView text(HttpServletRequest request, HttpServletResponse response, @PathVariable String appid, @Valid String traceid, @Valid String aiid, @Valid String exchange, @Valid String title, @Valid String url, @Valid String skill, @Valid String id, @Valid String userid, @Valid String agent, @Valid String name, @Valid String email, @Valid String phone, @Valid String ai, @Valid String orgi, @Valid String product, @Valid String description, @Valid String imgurl, @Valid String pid, @Valid String purl) throws Exception { - ModelAndView view = request(super.createRequestPageTempletResponse("/apps/im/text")); - - view.addObject("hostname", request.getServerName()); - view.addObject("port", request.getServerPort()); - view.addObject("schema", request.getScheme()); - view.addObject("appid", appid); - - - view.addObject("ip", MainUtils.md5(request.getRemoteAddr())); - - if (StringUtils.isNotBlank(skill)) { - view.addObject("skill", skill); - } - if (StringUtils.isNotBlank(agent)) { - view.addObject("agent", agent); - } - - view.addObject("client", MainUtils.getUUID()); - view.addObject("sessionid", request.getSession().getId()); - - view.addObject("id", id); - if (StringUtils.isNotBlank(ai)) { - view.addObject("ai", ai); - } - if (StringUtils.isNotBlank(exchange)) { - view.addObject("exchange", exchange); - } - - view.addObject("name", name); - view.addObject("email", email); - view.addObject("phone", phone); - view.addObject("userid", userid); - - view.addObject("product", product); - view.addObject("description", description); - view.addObject("imgurl", imgurl); - view.addObject("pid", pid); - view.addObject("purl", purl); - - - if (StringUtils.isNotBlank(traceid)) { - view.addObject("traceid", traceid); - } - if (StringUtils.isNotBlank(title)) { - view.addObject("title", title); - } - if (StringUtils.isNotBlank(traceid)) { - view.addObject("url", url); - } - CousultInvite invite = OnlineUserUtils.cousult(appid, orgi, inviteRepository); - if (invite != null) { - view.addObject("inviteData", invite); - view.addObject("orgi", invite.getOrgi()); - view.addObject("appid", appid); - - if (StringUtils.isNotBlank(aiid)) { - view.addObject("aiid", aiid); - } else if (StringUtils.isNotBlank(invite.getAiid())) { - view.addObject("aiid", invite.getAiid()); - } - } - - return view; - } - - - @RequestMapping("/leavemsg/save") - @Menu(type = "admin", subtype = "user") - public ModelAndView leavemsgsave(HttpServletRequest request, @Valid String appid, @Valid LeaveMsg msg) { - if (StringUtils.isNotBlank(appid)) { - SNSAccount snsAccount = snsAccountRepository.findBySnsid(appid); - String orgi = snsAccount.getOrgi(); - CousultInvite invite = inviteRepository.findBySnsaccountidAndOrgi(appid, orgi); - ; - List msgList = leaveMsgRes.findByOrgiAndUserid(invite.getOrgi(), msg.getUserid()); - // if(msg!=null && msgList.size() == 0){ - if (msg != null) { - msg.setOrgi(invite.getOrgi()); - leaveMsgRes.save(msg); - } - } - return request(super.createRequestPageTempletResponse("/apps/im/leavemsgsave")); - } - - @RequestMapping("/refuse") - @Menu(type = "im", subtype = "refuse", access = true) - public void refuse(HttpServletRequest request, HttpServletResponse response, @Valid String orgi, @Valid String appid, @Valid String userid, @Valid String sessionid, @Valid String client) throws Exception { - OnlineUserUtils.refuseInvite(userid, orgi); -// OnlineUserUtils.sendWebIMClients(userid , "refuse"); - Page inviteRecordList = inviteRecordRes.findByUseridAndOrgi(userid, orgi, new PageRequest(0, 1, Direction.DESC, "createtime")); - if (inviteRecordList.getContent() != null && inviteRecordList.getContent().size() > 0) { - InviteRecord record = inviteRecordList.getContent().get(0); - record.setUpdatetime(new Date()); - record.setResponsetime((int) (System.currentTimeMillis() - record.getCreatetime().getTime())); - record.setResult(MainContext.OnlineUserInviteStatus.REFUSE.toString()); - inviteRecordRes.save(record); - } - return; - } - - @RequestMapping("/satis") - @Menu(type = "im", subtype = "satis", access = true) - public void satis(HttpServletRequest request, HttpServletResponse response, @Valid AgentServiceSatis satis) throws Exception { - if (satis != null && StringUtils.isNotBlank(satis.getId())) { - int count = agentServiceSatisRes.countById(satis.getId()); - if (count == 1) { - if (StringUtils.isNotBlank(satis.getSatiscomment()) && satis.getSatiscomment().length() > 255) { - satis.setSatiscomment(satis.getSatiscomment().substring(0, 255)); - } - satis.setSatisfaction(true); - satis.setSatistime(new Date()); - agentServiceSatisRes.save(satis); - } - } - return; - } - - @RequestMapping("/image/upload") - @Menu(type = "im", subtype = "image", access = true) - public ModelAndView upload(ModelMap map, HttpServletRequest request, - @RequestParam(value = "imgFile", required = false) MultipartFile multipart, - @Valid String channel, - @Valid String userid, - @Valid String username, - @Valid String appid, - @Valid String orgi, - @Valid String paste) throws IOException { - ModelAndView view = request(super.createRequestPageTempletResponse("/apps/im/upload")); - UploadStatus upload = null; - String fileName = null; - if (multipart != null - && multipart.getOriginalFilename().lastIndexOf(".") > 0 - && StringUtils.isNotBlank(userid)) { - File uploadDir = new File(path, "upload"); - if (!uploadDir.exists()) { - uploadDir.mkdirs(); - } - - String fileid = MainUtils.getUUID(); - StreamingFile sf = new StreamingFile(); - sf.setId(fileid); - sf.setName(multipart.getOriginalFilename()); - sf.setMime(multipart.getContentType()); - if (multipart.getContentType() != null - && multipart.getContentType().indexOf(Constants.ATTACHMENT_TYPE_IMAGE) >= 0) { - // 检查文件格式 - String invalid = StreamingFileUtils.getInstance().validate(Constants.ATTACHMENT_TYPE_IMAGE, multipart.getOriginalFilename()); - if (invalid == null) { - fileName = "upload/" + fileid + "_original"; - File imageFile = new File(path, fileName); - FileCopyUtils.copy(multipart.getBytes(), imageFile); - String thumbnailsFileName = "upload/" + fileid; - File thumbnail = new File(path, thumbnailsFileName); - MainUtils.processImage(thumbnail, imageFile); - - // 存储数据库 - sf.setData(jpaBlobHelper.createBlob(multipart.getInputStream(), multipart.getSize())); - sf.setThumbnail(jpaBlobHelper.createBlobWithFile(thumbnail)); - streamingFileRepository.save(sf); - String fileUrl = "/res/image.html?id=" + fileid; - upload = new UploadStatus("0", fileUrl); - - if (paste == null) { - if (StringUtils.isNotBlank(channel)) { - RichMediaUtils.uploadImageWithChannel(fileUrl, fileid, (int) multipart.getSize(), multipart.getName(), channel, userid, username, appid, orgi); - } else { - RichMediaUtils.uploadImage(fileUrl, fileid, (int) multipart.getSize(), multipart.getName(), userid); - } - } - } else { - upload = new UploadStatus(invalid); - } - } else { - String invalid = StreamingFileUtils.getInstance().validate(Constants.ATTACHMENT_TYPE_FILE, multipart.getOriginalFilename()); - if (invalid == null) { - // 存储数据库 - sf.setData(jpaBlobHelper.createBlob(multipart.getInputStream(), multipart.getSize())); - streamingFileRepository.save(sf); - - // 存储到本地硬盘 - String id = processAttachmentFile(multipart, fileid, request); - upload = new UploadStatus("0", "/res/file.html?id=" + id); - String file = "/res/file.html?id=" + id; - - File tempFile = new File(multipart.getOriginalFilename()); - if (StringUtils.isNotBlank(channel)) { - RichMediaUtils.uploadFileWithChannel(file, (int) multipart.getSize(), tempFile.getName(), channel, userid, username, appid, orgi, id); - } else { - RichMediaUtils.uploadFile(file, (int) multipart.getSize(), tempFile.getName(), userid, id); - } - } else { - upload = new UploadStatus(invalid); - } - } - } else { - upload = new UploadStatus("请选择文件"); - } - map.addAttribute("upload", upload); - return view; - } - - private String processAttachmentFile(final MultipartFile file, final String fileid, HttpServletRequest request) throws IOException { - String id = null; - if (file.getSize() > 0) { //文件尺寸 限制 ?在 启动 配置中 设置 的最大值,其他地方不做限制 - AttachmentFile attachmentFile = new AttachmentFile(); - attachmentFile.setCreater(super.getUser(request).getId()); - attachmentFile.setOrgi(super.getOrgi(request)); - attachmentFile.setOrgan(super.getUser(request).getOrgan()); - attachmentFile.setModel(MainContext.ModelType.WEBIM.toString()); - attachmentFile.setFilelength((int) file.getSize()); - if (file.getContentType() != null && file.getContentType().length() > 255) { - attachmentFile.setFiletype(file.getContentType().substring(0, 255)); - } else { - attachmentFile.setFiletype(file.getContentType()); - } - File uploadFile = new File(file.getOriginalFilename()); - if (uploadFile.getName() != null && uploadFile.getName().length() > 255) { - attachmentFile.setTitle(uploadFile.getName().substring(0, 255)); - } else { - attachmentFile.setTitle(uploadFile.getName()); - } - if (StringUtils.isNotBlank(attachmentFile.getFiletype()) && attachmentFile.getFiletype().indexOf("image") >= 0) { - attachmentFile.setImage(true); - } - attachmentFile.setFileid(fileid); - attachementRes.save(attachmentFile); - FileUtils.writeByteArrayToFile(new File(path, "upload/" + fileid), file.getBytes()); - id = attachmentFile.getId(); - } - return id; - } -} \ No newline at end of file diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/handler/apps/quality/AgentQualityController.java b/contact-center/app/src/main/java/com/chatopera/cc/app/handler/apps/quality/AgentQualityController.java deleted file mode 100644 index 0a7177e2..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/handler/apps/quality/AgentQualityController.java +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.chatopera.cc.app.handler.apps.quality; - -import java.util.ArrayList; -import java.util.List; - -import javax.servlet.http.HttpServletRequest; -import javax.validation.Valid; - -import com.chatopera.cc.app.algorithm.AutomaticServiceDist; -import com.chatopera.cc.util.Menu; -import com.chatopera.cc.app.cache.CacheHelper; -import com.chatopera.cc.app.persistence.repository.SessionConfigRepository; -import com.chatopera.cc.app.persistence.repository.TagRepository; -import com.chatopera.cc.app.model.Quality; -import com.chatopera.cc.app.model.QualityRequest; -import com.chatopera.cc.app.model.Tag; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.ui.ModelMap; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.servlet.ModelAndView; - -import com.chatopera.cc.app.basic.MainContext; -import com.chatopera.cc.app.persistence.repository.QualityRepository; -import com.chatopera.cc.app.handler.Handler; -import com.chatopera.cc.app.model.SessionConfig; - -@Controller -@RequestMapping("/apps/quality") -public class AgentQualityController extends Handler{ - - - @Autowired - private QualityRepository qualityRes ; - - @Autowired - private SessionConfigRepository sessionConfigRes ; - - @Autowired - private TagRepository tagRes ; - - - @RequestMapping(value = "/index") - @Menu(type = "agent" , subtype = "quality" , access = false) - public ModelAndView index(ModelMap map , HttpServletRequest request ) { - map.addAttribute("sessionConfig", AutomaticServiceDist.initSessionConfig(super.getOrgi(request))) ; - map.addAttribute("qualityList", qualityRes.findByQualitytypeAndOrgi(MainContext.QualityType.CHAT.toString(), super.getOrgi(request))) ; - map.addAttribute("tagList", tagRes.findByOrgiAndTagtype(super.getOrgi(request), MainContext.TagTypeEnum.QUALITY.toString())) ; - return request(super.createAppsTempletResponse("/apps/quality/index")); - } - - - @RequestMapping(value = "/save") - @Menu(type = "agent" , subtype = "quality" , access = false) - public ModelAndView save(ModelMap map , HttpServletRequest request ,@Valid QualityRequest qualityArray) { - if(qualityArray!=null && qualityArray.getTitle()!=null) { - List qualityList = qualityRes.findByQualitytypeAndOrgi(MainContext.QualityType.CHAT.toString(), super.getOrgi(request)) ; - qualityRes.delete(qualityList); - List tempList = new ArrayList(); - for(int i=0 ; i 0) { - qualityRes.save(tempList) ; - } - SessionConfig config = AutomaticServiceDist.initSessionConfig(super.getOrgi(request)) ; - if(config!=null) { - if("points".equals(request.getParameter("qualityscore"))) { - config.setQualityscore("points"); - }else { - config.setQualityscore("score"); - } - - sessionConfigRes.save(config) ; - - CacheHelper.getSystemCacheBean().put(MainContext.SYSTEM_CACHE_SESSION_CONFIG+"_"+super.getOrgi(request),config, super.getOrgi(request)) ; - - CacheHelper.getSystemCacheBean().delete(MainContext.SYSTEM_CACHE_SESSION_CONFIG_LIST , MainContext.SYSTEM_ORGI) ; - } - if(qualityArray!=null && qualityArray.getTag()!=null && qualityArray.getTag().length > 0) { - List tagList = tagRes.findByOrgiAndTagtype(super.getOrgi(request), MainContext.TagTypeEnum.QUALITY.toString()) ; - if(tagList.size() > 0) { - tagRes.delete(tagList); - } - List tagTempList = new ArrayList() ; - for(String tag : qualityArray.getTag()) { - Tag temp = new Tag(); - temp.setOrgi(super.getOrgi(request)); - temp.setCreater(super.getUser(request).getId()); - temp.setTag(tag); - temp.setCreater(super.getOrgi(request)); - temp.setTagtype(MainContext.TagTypeEnum.QUALITY.toString()); - tagTempList.add(temp) ; - } - if(tagTempList.size() > 0) { - tagRes.save(tagTempList) ; - } - } - } - return request(super.createRequestPageTempletResponse("redirect:/apps/quality/index.html")); - } -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/handler/apps/service/StatsController.java b/contact-center/app/src/main/java/com/chatopera/cc/app/handler/apps/service/StatsController.java deleted file mode 100644 index 06247668..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/handler/apps/service/StatsController.java +++ /dev/null @@ -1,166 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.handler.apps.service; - -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.List; -import java.util.Map; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; - -import com.chatopera.cc.app.basic.MainContext; -import com.chatopera.cc.util.bi.ReportData; -import com.chatopera.cc.app.persistence.repository.DataSourceService; -import org.apache.commons.lang.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Controller; -import org.springframework.ui.ModelMap; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.servlet.ModelAndView; - -import com.chatopera.cc.util.Menu; -import com.chatopera.cc.app.basic.MainUtils; -import com.chatopera.cc.util.bi.UKExcelUtil; -import com.chatopera.cc.util.bi.model.Level; -import com.chatopera.cc.app.persistence.repository.CubeService; -import com.chatopera.cc.util.OnlineUserUtils; -import com.chatopera.cc.app.handler.Handler; -import com.chatopera.cc.app.model.SysDic; -import com.chatopera.cc.app.model.UKeFuDic; - -@Controller -@RequestMapping("/service") -public class StatsController extends Handler{ - - @Value("${web.upload-path}") - private String path; - - @Autowired - private DataSourceService dataSource ; - - @RequestMapping("/stats/coment") - @Menu(type = "service" , subtype = "statcoment" , admin= true) - public ModelAndView statcoment(ModelMap map , HttpServletRequest request , @Valid String agent , @Valid String skill , @Valid String begin ,@Valid String end) throws Exception { - Map mapR = MainUtils.getRequestParam(request); - mapR.put("orgi",super.getOrgi(request)); - ReportData reportData = new CubeService("coment.xml", path, dataSource ,mapR ).execute("SELECT [comment].[满意度].members on columns , NonEmptyCrossJoin([time].[日期].members , NonEmptyCrossJoin([skill].[技能组].members,[agent].[坐席].members)) on rows FROM [满意度]") ; - - List dicList = UKeFuDic.getInstance().getDic(MainContext.UKEFU_SYSTEM_COMMENT_DIC) ; - for(Level title : reportData.getCol().getChilderen()){ - for(SysDic dic : dicList){ - if(dic.getCode().equals(title.getName())){ - title.setName(dic.getName()); - } - } - } - - map.addAttribute("reportData", reportData); - if(!StringUtils.isBlank(agent)){ - map.addAttribute("agent", agent); - } - if(!StringUtils.isBlank(skill)){ - map.addAttribute("skill", skill); - } - if(!StringUtils.isBlank(begin)){ - map.addAttribute("begin", begin); - } - if(!StringUtils.isBlank(end)){ - map.addAttribute("end", end); - } - map.addAttribute("orgi",super.getOrgi(request)); - /*** - * 查询 技能组 , 缓存? - */ - map.addAttribute("skillList", OnlineUserUtils.organ(super.getOrgi(request),true)) ; - /** - * 查询坐席 , 缓存? - */ - map.addAttribute("agentList", OnlineUserUtils.agents(super.getOrgi(request),true)) ; - - return request(super.createAppsTempletResponse("/apps/service/stats/coment")); - } - - @RequestMapping("/stats/coment/exp") - @Menu(type = "service" , subtype = "statcoment" , admin= true) - public void statcomentexp(ModelMap map , HttpServletRequest request , HttpServletResponse response , @Valid String agent , @Valid String skill , @Valid String begin ,@Valid String end) throws Exception { - Map mapR = MainUtils.getRequestParam(request); - mapR.put("orgi",super.getOrgi(request)); - ReportData reportData = new CubeService("coment.xml", path, dataSource , mapR).execute("SELECT [comment].[满意度].members on columns , NonEmptyCrossJoin([time].[日期].members , NonEmptyCrossJoin([skill].[技能组].members,[agent].[坐席].members)) on rows FROM [满意度]") ; - - List dicList = UKeFuDic.getInstance().getDic(MainContext.UKEFU_SYSTEM_COMMENT_DIC) ; - for(Level title : reportData.getCol().getChilderen()){ - for(SysDic dic : dicList){ - if(dic.getCode().equals(title.getName())){ - title.setName(dic.getName()); - } - } - } - - response.setHeader("content-disposition", "attachment;filename=UCKeFu-Report-"+new SimpleDateFormat("yyyy-MM-dd").format(new Date())+".xls"); - new UKExcelUtil(reportData , response.getOutputStream() , "满意度统计").createFile() ; - - return ; - } - - @RequestMapping("/stats/agent") - @Menu(type = "service" , subtype = "statagent" , admin= true) - public ModelAndView statagent(ModelMap map , HttpServletRequest request , @Valid String agent , @Valid String skill , @Valid String begin ,@Valid String end) throws Exception { - Map mapR = MainUtils.getRequestParam(request); - mapR.put("orgi",super.getOrgi(request)); - ReportData reportData = new CubeService("consult.xml", path, dataSource , mapR).execute("SELECT {[Measures].[咨询数量],[Measures].[平均等待时长(秒)],[Measures].[平均咨询时长(秒)]} on columns , NonEmptyCrossJoin([time].[日期].members , NonEmptyCrossJoin([skill].[技能组].members,[agent].[坐席].members)) on rows FROM [咨询]") ; - map.addAttribute("reportData", reportData); - - if(!StringUtils.isBlank(agent)){ - map.addAttribute("agent", agent); - } - if(!StringUtils.isBlank(skill)){ - map.addAttribute("skill", skill); - } - if(!StringUtils.isBlank(begin)){ - map.addAttribute("begin", begin); - } - if(!StringUtils.isBlank(end)){ - map.addAttribute("end", end); - } - /*** - * 查询 技能组 , 缓存? - */ - map.addAttribute("skillList", OnlineUserUtils.organ(super.getOrgi(request),true)) ; - /** - * 查询坐席 , 缓存? - */ - map.addAttribute("agentList", OnlineUserUtils.agents(super.getOrgi(request),true)) ; - - return request(super.createAppsTempletResponse("/apps/service/stats/consult")); - } - - @RequestMapping("/stats/agent/exp") - @Menu(type = "service" , subtype = "statagent" , admin= true) - public void statagentexp(ModelMap map , HttpServletRequest request , HttpServletResponse response ,@Valid String agent , @Valid String skill , @Valid String begin ,@Valid String end) throws Exception { - Map mapR = MainUtils.getRequestParam(request); - mapR.put("orgi",super.getOrgi(request)); - ReportData reportData = new CubeService("consult.xml", path, dataSource , mapR).execute("SELECT {[Measures].[咨询数量],[Measures].[平均等待时长(秒)],[Measures].[平均咨询时长(秒)]} on columns , NonEmptyCrossJoin([time].[日期].members , NonEmptyCrossJoin([skill].[技能组].members,[agent].[坐席].members)) on rows FROM [咨询]") ; - response.setHeader("content-disposition", "attachment;filename=UCKeFu-Report-"+new SimpleDateFormat("yyyy-MM-dd").format(new Date())+".xls"); - new UKExcelUtil(reportData , response.getOutputStream() , "客服坐席统计").createFile() ; - - return ; - } -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/handler/apps/tenant/TenantController.java b/contact-center/app/src/main/java/com/chatopera/cc/app/handler/apps/tenant/TenantController.java deleted file mode 100644 index 7769ff1d..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/handler/apps/tenant/TenantController.java +++ /dev/null @@ -1,305 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.handler.apps.tenant; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.UnsupportedEncodingException; -import java.net.URLDecoder; -import java.net.URLEncoder; -import java.security.NoSuchAlgorithmException; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; - -import javax.servlet.http.HttpServletRequest; -import javax.validation.Valid; - -import com.chatopera.cc.app.basic.MainContext; -import com.chatopera.cc.util.Menu; -import com.chatopera.cc.app.algorithm.AutomaticServiceDist; -import com.chatopera.cc.app.cache.CacheHelper; -import com.chatopera.cc.util.OnlineUserUtils; -import org.apache.commons.lang.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Controller; -import org.springframework.ui.ModelMap; -import org.springframework.util.FileCopyUtils; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.multipart.MultipartFile; -import org.springframework.web.servlet.ModelAndView; - -import com.chatopera.cc.app.persistence.repository.AgentUserRepository; -import com.chatopera.cc.app.persistence.repository.OrganRepository; -import com.chatopera.cc.app.persistence.repository.OrganizationRepository; -import com.chatopera.cc.app.persistence.repository.OrgiSkillRelRepository; -import com.chatopera.cc.app.persistence.repository.TenantRepository; -import com.chatopera.cc.app.handler.Handler; -import com.chatopera.cc.app.model.AgentStatus; -import com.chatopera.cc.app.model.AgentUser; -import com.chatopera.cc.app.model.Organ; -import com.chatopera.cc.app.model.OrgiSkillRel; -import com.chatopera.cc.app.model.Tenant; - -@Controller -@RequestMapping("/apps/tenant") -public class TenantController extends Handler{ - - @Autowired - private TenantRepository tenantRes; - - @Autowired - private OrgiSkillRelRepository orgiSkillRelRes; - - @Autowired - private OrganRepository organRes; - - @Autowired - private OrganizationRepository organizationRes; - - @Autowired - private AgentUserRepository agentUserRepository; - - @Value("${web.upload-path}") - private String path; - @RequestMapping("/index") - @Menu(type = "apps" , subtype = "tenant") - public ModelAndView index(ModelMap map , HttpServletRequest request,@Valid String msg,@Valid String currentorgi,@Valid String currentname) throws FileNotFoundException, IOException { - if(super.isEnabletneant()) { - if("0".equals(super.getUser(request).getUsertype())) { - map.addAttribute("tenantList", tenantRes.findByOrgid(super.getOrgid(request))); - }else { - List orgiSkillRelList = orgiSkillRelRes.findBySkillid((super.getUser(request)).getOrgan()); - List tenantList = null; - if(!orgiSkillRelList.isEmpty()) { - tenantList = new ArrayList(); - for(OrgiSkillRel orgiSkillRel:orgiSkillRelList) { - Tenant t = tenantRes.findById(orgiSkillRel.getOrgi()); - if(t!=null) { - tenantList.add(t); - } - } - } - map.addAttribute("tenantList", tenantList); - } - }else{ - map.addAttribute("tenantList", tenantRes.findById(super.getOrgi(request))); - } - map.addAttribute("organization", organizationRes.findById(super.getUser(request).getOrgid())); - map.addAttribute("msg",msg); - map.addAttribute("currentorgi",currentorgi); - if(currentname!=null) { - map.addAttribute("currentname",URLDecoder.decode(currentname,"UTF-8")); - } - return request(super.createRequestPageTempletResponse("/apps/tenant/index")); - } - - @RequestMapping("/add") - @Menu(type = "apps" , subtype = "tenant") - public ModelAndView add(ModelMap map , HttpServletRequest request) { - if(super.isTenantshare()) { - map.addAttribute("isShowSkillList",true); - List organList = organRes.findByOrgiAndOrgid(super.getOrgiByTenantshare(request),super.getOrgid(request)); - map.addAttribute("skillList",organList); - } - return request(super.createRequestPageTempletResponse("/apps/tenant/add")); - } - - @RequestMapping("/save") - @Menu(type = "apps" , subtype = "tenant") - public ModelAndView save(HttpServletRequest request ,@Valid Tenant tenant, @RequestParam(value = "tenantpic", required = false) MultipartFile tenantpic,@Valid String skills) throws NoSuchAlgorithmException, IOException { - Tenant tenanttemp = tenantRes.findByOrgidAndTenantname(super.getOrgid(request),tenant.getTenantname()); - if(tenanttemp!=null) { - return request(super.createRequestPageTempletResponse("redirect:/apps/tenant/index.html?msg=tenantexist")); - } - tenantRes.save(tenant) ; - if(tenantpic!=null && tenantpic.getOriginalFilename().lastIndexOf(".") > 0){ - File logoDir = new File(path , "tenantpic"); - if(!logoDir.exists()){ - logoDir.mkdirs() ; - } - String fileName = "tenantpic/"+tenant.getId()+tenantpic.getOriginalFilename().substring(tenantpic.getOriginalFilename().lastIndexOf(".")) ; - FileCopyUtils.copy(tenantpic.getBytes(), new File(path , fileName)); - tenant.setTenantlogo(fileName); - } - String tenantid = tenant.getId(); - List orgiSkillRelList = orgiSkillRelRes.findByOrgi(tenantid) ; - orgiSkillRelRes.delete(orgiSkillRelList); - if(!StringUtils.isBlank(skills)){ - String[] skillsarray = skills.split(",") ; - for(String skill : skillsarray){ - OrgiSkillRel rel = new OrgiSkillRel(); - rel.setOrgi(tenant.getId()); - rel.setSkillid(skill); - rel.setCreater(super.getUser(request).getId()); - rel.setCreatetime(new Date()); - orgiSkillRelRes.save(rel) ; - } - } - if(!StringUtils.isBlank(super.getUser(request).getOrgid())) { - tenant.setOrgid(super.getUser(request).getOrgid()); - }else { - tenant.setOrgid(MainContext.SYSTEM_ORGI); - } - tenantRes.save(tenant) ; - OnlineUserUtils.clean(tenantid); - return request(super.createRequestPageTempletResponse("redirect:/apps/tenant/index")); - } - - @RequestMapping("/edit") - @Menu(type = "apps" , subtype = "tenant") - public ModelAndView edit(ModelMap map , HttpServletRequest request , @Valid String id) { - if(super.isTenantshare()) { - map.addAttribute("isShowSkillList",true); - List organList = organRes.findByOrgiAndOrgid(super.getOrgiByTenantshare(request),super.getOrgid(request)); - map.addAttribute("skillList",organList); - List orgiSkillRelList = orgiSkillRelRes.findByOrgi(id) ; - map.addAttribute("orgiSkillRelList",orgiSkillRelList); - } - map.addAttribute("tenant", tenantRes.findById(id)) ; - return request(super.createRequestPageTempletResponse("/apps/tenant/edit")); - } - - @RequestMapping("/update") - @Menu(type = "apps" , subtype = "tenant" , admin = true) - public ModelAndView update(HttpServletRequest request ,@Valid Tenant tenant, @RequestParam(value = "tenantpic", required = false) MultipartFile tenantpic,@Valid String skills) throws NoSuchAlgorithmException, IOException { - Tenant temp = tenantRes.findById(tenant.getId()) ; - Tenant tenanttemp = tenantRes.findByOrgidAndTenantname(super.getOrgid(request),tenant.getTenantname()); - if(temp!=null&&tenanttemp!=null&&!temp.getId().equals(tenanttemp.getId())) { - return request(super.createRequestPageTempletResponse("redirect:/apps/tenant/index.html?msg=tenantexist")); - } - if(tenant!=null) { - tenant.setCreatetime(temp.getCreatetime()); - if(tenantpic!=null && tenantpic.getOriginalFilename().lastIndexOf(".") > 0){ - File logoDir = new File(path , "tenantpic"); - if(!logoDir.exists()){ - logoDir.mkdirs() ; - } - String fileName = "tenantpic/"+tenant.getId()+tenantpic.getOriginalFilename().substring(tenantpic.getOriginalFilename().lastIndexOf(".")) ; - FileCopyUtils.copy(tenantpic.getBytes(), new File(path , fileName)); - tenant.setTenantlogo(fileName); - }else { - tenant.setTenantlogo(temp.getTenantlogo()); - } - if(!StringUtils.isBlank(super.getUser(request).getOrgid())) { - tenant.setOrgid(super.getUser(request).getOrgid()); - }else { - tenant.setOrgid(MainContext.SYSTEM_ORGI); - } - tenantRes.save(tenant) ; - List orgiSkillRelList = orgiSkillRelRes.findByOrgi(tenant.getId()) ; - orgiSkillRelRes.delete(orgiSkillRelList); - if(!StringUtils.isBlank(skills)){ - String[] skillsarray = skills.split(",") ; - for(String skill : skillsarray){ - OrgiSkillRel rel = new OrgiSkillRel(); - rel.setOrgi(tenant.getId()); - rel.setSkillid(skill); - rel.setCreater(super.getUser(request).getId()); - rel.setCreatetime(new Date()); - orgiSkillRelRes.save(rel) ; - } - } - OnlineUserUtils.clean(tenant.getId()); - } - return request(super.createRequestPageTempletResponse("redirect:/apps/tenant/index")); - } - - @RequestMapping("/delete") - @Menu(type = "apps" , subtype = "tenant") - public ModelAndView delete(HttpServletRequest request ,@Valid Tenant tenant) { - Tenant temp = tenantRes.findById(tenant.getId()) ; - if(tenant!=null) { - tenantRes.delete(temp); - } - return request(super.createRequestPageTempletResponse("redirect:/apps/tenant/index")); - } - - @RequestMapping("/canswitch") - @Menu(type = "apps" , subtype = "tenant") - public ModelAndView canswitch(HttpServletRequest request ,@Valid Tenant tenant) throws UnsupportedEncodingException { - ModelAndView view = request(super.createRequestPageTempletResponse("redirect:/")); - AgentStatus agentStatus = (AgentStatus) CacheHelper.getAgentStatusCacheBean().getCacheObject((super.getUser(request)).getId(), super.getOrgi(request)); - if(agentStatus==null && AutomaticServiceDist.getAgentUsers(super.getUser(request).getId(), super.getOrgi(request))==0) { - Tenant temp = tenantRes.findById(tenant.getId()) ; - if(temp!=null) { - super.getUser(request).setOrgi(temp.getId()); - } - return view; - } - if(agentStatus!=null) { - if(tenant.getId().equals(agentStatus.getOrgi())){ - Tenant temp = tenantRes.findById(tenant.getId()) ; - if(temp!=null) { - super.getUser(request).setOrgi(temp.getId()); - } - return view; - }else { - Tenant temp = tenantRes.findById(agentStatus.getOrgi()) ; - return request(super.createRequestPageTempletResponse("redirect:/apps/tenant/index.html?msg=t0"+"¤torgi="+agentStatus.getOrgi()+"¤tname="+URLEncoder.encode(temp!=null?temp.getTenantname():"","UTF-8"))); - } - } - AgentUser agentUser = agentUserRepository.findOneByAgentnoAndStatusAndOrgi(super.getUser(request).getId(), MainContext.AgentUserStatusEnum.INSERVICE.toString(), super.getOrgi(request)); - if(agentUser!=null) { - if(tenant.getId().equals(agentUser.getOrgi())){ - Tenant temp = tenantRes.findById(tenant.getId()) ; - if(temp!=null) { - super.getUser(request).setOrgi(temp.getId()); - } - return view; - }else { - Tenant temp = tenantRes.findById(agentUser.getOrgi()) ; - return request(super.createRequestPageTempletResponse("redirect:/apps/tenant/index.html?msg=t0"+"¤torgi="+agentUser.getOrgi()+"¤tname="+URLEncoder.encode(temp!=null?temp.getTenantname():"","UTF-8"))); - } - - } - return request(super.createRequestPageTempletResponse("redirect:/apps/tenant/index.html?msg=t0")); - } - - /*@RequestMapping("/switch") - @Menu(type = "apps" , subtype = "tenant") - public ModelAndView switchTenant(HttpServletRequest request ,@Valid Tenant tenant) { - ModelAndView view = request(super.createRequestPageTempletResponse("redirect:/")); - AgentStatus agentStatus = (AgentStatus)CacheHelper.getAgentStatusCacheBean().getCacheObject((super.getUser(request)).getId(), super.getOrgi(request)); - if(agentStatus==null && AutomaticServiceDist.getAgentUsers(super.getUser(request).getId(), super.getOrgi(request))==0) { - Tenant temp = tenantRes.findById(tenant.getId()) ; - if(temp!=null) { - super.getUser(request).setOrgi(temp.getId()); - } - return view; - } - if(agentStatus!=null && tenant.getId().equals(agentStatus.getOrgi())) { - Tenant temp = tenantRes.findById(tenant.getId()) ; - if(temp!=null) { - super.getUser(request).setOrgi(temp.getId()); - } - return view; - } - AgentUser agentUser = agentUserRepository.findOneByAgentnoAndStatusAndOrgi(super.getUser(request).getId(), MainContext.AgentUserStatusEnum.INSERVICE.toString(), super.getOrgi(request)); - if(agentUser!=null&&tenant.getId().equals(agentUser.getOrgi())) { - Tenant temp = tenantRes.findById(tenant.getId()) ; - if(temp!=null) { - super.getUser(request).setOrgi(temp.getId()); - } - return view; - } - return request(super.createRequestPageTempletResponse("redirect:/apps/tenant/index.html?msg=t0")); - }*/ -} \ No newline at end of file diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/handler/apps/test/TestController.java b/contact-center/app/src/main/java/com/chatopera/cc/app/handler/apps/test/TestController.java deleted file mode 100644 index 1acaa38d..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/handler/apps/test/TestController.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.handler.apps.test; - -import javax.servlet.http.HttpServletRequest; - -import com.chatopera.cc.app.basic.MainContext; -import com.chatopera.cc.app.basic.MainUtils; -import com.chatopera.cc.util.Menu; -import com.chatopera.cc.util.OnlineUserUtils; -import com.chatopera.cc.app.handler.Handler; -import org.springframework.stereotype.Controller; -import org.springframework.ui.ModelMap; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.servlet.ModelAndView; - -@Controller -public class TestController extends Handler { - - - @RequestMapping({"/test/demo"}) - @Menu(type="apps", subtype="test" , access=false , admin = true) - public ModelAndView content(ModelMap map , HttpServletRequest request){ - for(int i=0 ; i<500; i++){ - String user = MainUtils.getUUID(); - try { - OnlineUserUtils.newRequestMessage(user, "ukewo", "user", "system", "localhost" , "win10", "test" , MainContext.ChannelTypeEnum.WEBIM.toString() , null , null , "admin" , "标题" , "https://www.chatopera.com" , "12434" , MainContext.ChatInitiatorType.USER.toString()) ; - } catch (Exception e) { - e.printStackTrace(); - } - } - return request(super.createAppsTempletResponse("/public/success")); - } -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/handler/resource/UsersResourceController.java b/contact-center/app/src/main/java/com/chatopera/cc/app/handler/resource/UsersResourceController.java deleted file mode 100644 index 96fd5bb9..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/handler/resource/UsersResourceController.java +++ /dev/null @@ -1,144 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.handler.resource; - -import java.util.ArrayList; -import java.util.List; - -import javax.servlet.http.HttpServletRequest; -import javax.validation.Valid; - -import com.chatopera.cc.util.Menu; -import com.chatopera.cc.app.persistence.repository.OrganRepository; -import com.chatopera.cc.app.persistence.repository.OrgiSkillRelRepository; -import com.chatopera.cc.app.model.OrgiSkillRel; -import com.chatopera.cc.app.model.User; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; -import org.springframework.stereotype.Controller; -import org.springframework.ui.ModelMap; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.servlet.ModelAndView; - -import com.chatopera.cc.app.persistence.repository.UserRepository; -import com.chatopera.cc.app.handler.Handler; -import com.chatopera.cc.app.model.Organ; - -@Controller -@RequestMapping("/res") -public class UsersResourceController extends Handler { - @Autowired - private UserRepository userRes ; - - @Autowired - private OrgiSkillRelRepository orgiSkillRelService; - - @Autowired - private OrganRepository organRes ; - - @RequestMapping("/users") - @Menu(type = "res" , subtype = "users") - public ModelAndView add(ModelMap map , HttpServletRequest request , @Valid String q , @Valid String id) { - if(q==null){ - q = "" ; - } - map.addAttribute("usersList",getUsers(request, q)) ; - return request(super.createRequestPageTempletResponse("/public/users")); - } - - @RequestMapping("/bpm/users") - @Menu(type = "res" , subtype = "users") - public ModelAndView bpmusers(ModelMap map , HttpServletRequest request , @Valid String q , @Valid String id) { - if(q==null){ - q = "" ; - } - map.addAttribute("usersList", getUsers(request, q)) ; - return request(super.createRequestPageTempletResponse("/public/bpmusers")); - } - - @RequestMapping("/bpm/organ") - @Menu(type = "res" , subtype = "users") - public ModelAndView organ(ModelMap map , HttpServletRequest request , @Valid String q , @Valid String ids) { - map.addAttribute("organList", getOrgans(request)) ; - map.addAttribute("usersList", getUsers(request)) ; - map.addAttribute("ids", ids) ; - return request(super.createRequestPageTempletResponse("/public/organ")); - } - private List getUsers(HttpServletRequest request){ - List list = null; - if(super.isTenantshare()) { - List organIdList = new ArrayList<>(); - List orgiSkillRelList = orgiSkillRelService.findByOrgi(super.getOrgi(request)) ; - if(!orgiSkillRelList.isEmpty()) { - for(OrgiSkillRel rel:orgiSkillRelList) { - organIdList.add(rel.getSkillid()); - } - } - list = userRes.findByOrganInAndDatastatus(organIdList,false); - }else { - list = userRes.findByOrgiAndDatastatus(super.getOrgi(request),false) ; - } - return list; - } - /** - * 获取当前产品下人员信息 - * @param request - * @param q - * @return - */ - private Page getUsers(HttpServletRequest request,String q){ - if(q==null){ - q = "" ; - } - Page list = null; - if(super.isTenantshare()) { - List organIdList = new ArrayList<>(); - List orgiSkillRelList = orgiSkillRelService.findByOrgi(super.getOrgi(request)) ; - if(!orgiSkillRelList.isEmpty()) { - for(OrgiSkillRel rel:orgiSkillRelList) { - organIdList.add(rel.getSkillid()); - } - } - list = userRes.findByOrganInAndDatastatusAndUsernameLike(organIdList,false, "%"+q+"%", new PageRequest(0, 10) ); - }else { - list = userRes.findByDatastatusAndOrgiAndOrgidAndUsernameLike(false,super.getOrgi(request),super.getOrgid(request), "%"+q+"%" , new PageRequest(0, 10)) ; - } - return list; - } - /** - * 获取当前产品下 技能组 组织信息 - * @param request - * @return - */ - private List getOrgans(HttpServletRequest request){ - List list = null; - if(super.isTenantshare()) { - List organIdList = new ArrayList<>(); - List orgiSkillRelList = orgiSkillRelService.findByOrgi(super.getOrgi(request)) ; - if(!orgiSkillRelList.isEmpty()) { - for(OrgiSkillRel rel:orgiSkillRelList) { - organIdList.add(rel.getSkillid()); - } - } - list = organRes.findByIdInAndSkill(organIdList,true); - }else { - list = organRes.findByOrgiAndSkillAndOrgid(super.getOrgi(request),true,super.getOrgid(request)) ; - } - return list; - } -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/im/client/NettyAgentClient.java b/contact-center/app/src/main/java/com/chatopera/cc/app/im/client/NettyAgentClient.java deleted file mode 100644 index 5bb584c0..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/im/client/NettyAgentClient.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.im.client; - -import java.util.List; - -import com.corundumstudio.socketio.SocketIOClient; -import com.google.common.collect.ArrayListMultimap; -import com.chatopera.cc.app.basic.MainUtils; - -public class NettyAgentClient implements NettyClient{ - - private ArrayListMultimap agentClientsMap = ArrayListMultimap.create(); - - public List getClients(String key){ - return agentClientsMap.get(key) ; - } - - public void putClient(String key , SocketIOClient client){ - agentClientsMap.put(key, client) ; - } - - public void removeClient(String key , String id){ - List keyClients = this.getClients(key) ; - for(SocketIOClient client : keyClients){ - if(MainUtils.getContextID(client.getSessionId().toString()).equals(id)){ - keyClients.remove(client) ; - break ; - } - } - if(keyClients.size() == 0){ - agentClientsMap.removeAll(key) ; - } - } -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/im/client/NettyCalloutClient.java b/contact-center/app/src/main/java/com/chatopera/cc/app/im/client/NettyCalloutClient.java deleted file mode 100644 index f911e10f..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/im/client/NettyCalloutClient.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.im.client; - -import com.chatopera.cc.app.basic.MainUtils; -import com.corundumstudio.socketio.SocketIOClient; -import com.google.common.collect.ArrayListMultimap; - -import java.util.List; - -/** - * 呼叫中心登录坐席 - * @author iceworld - * - */ -public class NettyCalloutClient implements NettyClient{ - - private ArrayListMultimap _map = ArrayListMultimap.create(); - - public List getClients(String key){ - return _map.get(key) ; - } - - public void putClient(String key , SocketIOClient client){ - _map.put(key, client) ; - } - - public void removeClient(String key , String id){ - List keyClients = this.getClients(key) ; - for(SocketIOClient client : keyClients){ - if(MainUtils.getContextID(client.getSessionId().toString()).equals(id)){ - keyClients.remove(client) ; - break ; - } - } - if(keyClients.size() == 0){ - _map.removeAll(key) ; - } - } -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/im/client/NettyChatbotClient.java b/contact-center/app/src/main/java/com/chatopera/cc/app/im/client/NettyChatbotClient.java deleted file mode 100644 index 39e89d43..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/im/client/NettyChatbotClient.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.im.client; - -import com.chatopera.cc.app.basic.MainUtils; -import com.corundumstudio.socketio.SocketIOClient; -import com.google.common.collect.ArrayListMultimap; - -import java.util.List; - -/** - * 呼叫中心登录坐席 - * @author Hai Liang Wang - * @date - * - */ -public class NettyChatbotClient implements NettyClient{ - - private ArrayListMultimap _map = ArrayListMultimap.create(); - - public List getClients(String key){ - return _map.get(key) ; - } - - public void putClient(String key , SocketIOClient client){ - _map.put(key, client) ; - } - - public void removeClient(String key , String id){ - List keyClients = this.getClients(key) ; - for(SocketIOClient client : keyClients){ - if(MainUtils.getContextID(client.getSessionId().toString()).equals(id)){ - keyClients.remove(client) ; - break ; - } - } - if(keyClients.size() == 0){ - _map.removeAll(key) ; - } - } -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/im/client/NettyIMClient.java b/contact-center/app/src/main/java/com/chatopera/cc/app/im/client/NettyIMClient.java deleted file mode 100644 index 07cace39..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/im/client/NettyIMClient.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.im.client; - -import java.util.List; - -import com.corundumstudio.socketio.SocketIOClient; -import com.google.common.collect.ArrayListMultimap; -import com.chatopera.cc.app.basic.MainUtils; - -public class NettyIMClient implements NettyClient{ - - private ArrayListMultimap imClientsMap = ArrayListMultimap.create(); - - public int size(){ - return imClientsMap.size() ; - } - - public List getClients(String key){ - return imClientsMap.get(key) ; - } - - public void putClient(String key , SocketIOClient client){ - imClientsMap.put(key, client) ; - } - - public void removeClient(String key , String id){ - List keyClients = this.getClients(key) ; - for(SocketIOClient client : keyClients){ - if(MainUtils.getContextID(client.getSessionId().toString()).equals(id)){ - keyClients.remove(client) ; - break ; - } - } - if(keyClients.size() == 0){ - imClientsMap.removeAll(key) ; - } - } -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/im/handler/AgentEventHandler.java b/contact-center/app/src/main/java/com/chatopera/cc/app/im/handler/AgentEventHandler.java deleted file mode 100644 index 903f65c3..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/im/handler/AgentEventHandler.java +++ /dev/null @@ -1,227 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.im.handler; - -import com.chatopera.cc.app.algorithm.AutomaticServiceDist; -import com.chatopera.cc.app.basic.MainContext; -import com.chatopera.cc.app.basic.MainUtils; -import com.chatopera.cc.app.cache.CacheHelper; -import com.chatopera.cc.app.im.client.NettyClients; -import com.chatopera.cc.app.im.message.AgentServiceMessage; -import com.chatopera.cc.app.im.message.AgentStatusMessage; -import com.chatopera.cc.app.im.message.ChatMessage; -import com.chatopera.cc.app.im.router.OutMessageRouter; -import com.chatopera.cc.app.model.*; -import com.chatopera.cc.app.persistence.repository.*; -import com.corundumstudio.socketio.AckRequest; -import com.corundumstudio.socketio.SocketIOClient; -import com.corundumstudio.socketio.SocketIOServer; -import com.corundumstudio.socketio.annotation.OnConnect; -import com.corundumstudio.socketio.annotation.OnDisconnect; -import com.corundumstudio.socketio.annotation.OnEvent; -import org.apache.commons.lang.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; - -import java.net.InetSocketAddress; -import java.util.Date; -import java.util.List; - -public class AgentEventHandler { - protected SocketIOServer server; - - @Autowired - public AgentEventHandler(SocketIOServer server) { - this.server = server; - } - - @OnConnect - public void onConnect(SocketIOClient client) { - String user = client.getHandshakeData().getSingleUrlParam("userid"); - String orgi = client.getHandshakeData().getSingleUrlParam("orgi"); - String session = client.getHandshakeData().getSingleUrlParam("session"); - String admin = client.getHandshakeData().getSingleUrlParam("admin"); - if (StringUtils.isNotBlank(user) && StringUtils.isNotBlank(user)) { - client.set("agentno", user); - AgentStatusRepository agentStatusRepository = MainContext.getContext().getBean(AgentStatusRepository.class); - List agentStatusList = agentStatusRepository.findByAgentnoAndOrgi(user, orgi); - if (agentStatusList.size() > 0) { - AgentStatus agentStatus = agentStatusList.get(0); - agentStatus.setUpdatetime(new Date()); - agentStatusRepository.save(agentStatus); - if (CacheHelper.getAgentStatusCacheBean().getCacheObject(user, orgi) != null) { - CacheHelper.getAgentStatusCacheBean().put(user, agentStatus, orgi); - } - } - InetSocketAddress address = (InetSocketAddress) client.getRemoteAddress(); - String ip = MainUtils.getIpAddr(client.getHandshakeData().getHttpHeaders(), address.getHostString()); - - - WorkSessionRepository workSessionRepository = MainContext.getContext().getBean(WorkSessionRepository.class); - int count = workSessionRepository.countByAgentAndDatestrAndOrgi(user, MainUtils.simpleDateFormat.format(new Date()), orgi); - - workSessionRepository.save(MainUtils.createWorkSession(user, MainUtils.getContextID(client.getSessionId().toString()), session, orgi, ip, address.getHostName(), admin, count == 0)); - - NettyClients.getInstance().putAgentEventClient(user, client); - } - } - - //添加@OnDisconnect事件,客户端断开连接时调用,刷新客户端信息 - @OnDisconnect - public void onDisconnect(SocketIOClient client) { - String user = client.getHandshakeData().getSingleUrlParam("userid"); - String orgi = client.getHandshakeData().getSingleUrlParam("orgi"); - String admin = client.getHandshakeData().getSingleUrlParam("admin"); - if (StringUtils.isNotBlank(user)) { - AutomaticServiceDist.deleteAgentStatus(user, orgi, StringUtils.isNotBlank(admin) && admin.equals("true")); - NettyClients.getInstance().removeAgentEventClient(user, MainUtils.getContextID(client.getSessionId().toString())); - - WorkSessionRepository workSessionRepository = MainContext.getContext().getBean(WorkSessionRepository.class); - List workSessionList = workSessionRepository.findByOrgiAndClientid(orgi, MainUtils.getContextID(client.getSessionId().toString())); - if (workSessionList.size() > 0) { - WorkSession workSession = workSessionList.get(0); - workSession.setEndtime(new Date()); - if (workSession.getBegintime() != null) { - workSession.setDuration((int) (System.currentTimeMillis() - workSession.getBegintime().getTime())); - } else if (workSession.getCreatetime() != null) { - workSession.setDuration((int) (System.currentTimeMillis() - workSession.getCreatetime().getTime())); - } - if (workSession.isFirsttime()) { - workSession.setFirsttimes(workSession.getDuration()); - } - workSessionRepository.save(workSession); - } - } - } - - //消息接收入口,当接收到消息后,查找发送目标客户端,并且向该客户端发送消息,且给自己发送消息 - @OnEvent(value = "service") - public void onEvent(SocketIOClient client, AckRequest request, AgentServiceMessage data) { - - } - - //消息接收入口,当接收到消息后,查找发送目标客户端,并且向该客户端发送消息,且给自己发送消息 - @OnEvent(value = "status") - public void onEvent(SocketIOClient client, AckRequest request, AgentStatusMessage data) { - - } - - //消息接收入口,当接收到消息后,查找发送目标客户端,并且向该客户端发送消息,且给自己发送消息 - @OnEvent(value = "message") - public void onEvent(SocketIOClient client, AckRequest request, ChatMessage data) { - String user = client.getHandshakeData().getSingleUrlParam("userid"); - AgentUser agentUser = (AgentUser) CacheHelper.getAgentUserCacheBean().getCacheObject(data.getTouser(), data.getOrgi()); - MessageOutContent outMessage = new MessageOutContent(); - outMessage.setMessage(data.getMessage()); - if (MainContext.MediaTypeEnum.COOPERATION.toString().equals(data.getMsgtype())) { - outMessage.setMessageType(MainContext.MediaTypeEnum.COOPERATION.toString()); - } else { - outMessage.setMessageType(MainContext.MediaTypeEnum.TEXT.toString()); - } - - outMessage.setAttachmentid(data.getAttachmentid()); - - outMessage.setCalltype(MainContext.CallTypeEnum.OUT.toString()); - outMessage.setAgentUser(agentUser); - outMessage.setSnsAccount(null); - AgentStatus agentStatus = (AgentStatus) CacheHelper.getAgentStatusCacheBean().getCacheObject(data.getUserid(), data.getOrgi()); - - if (agentUser == null) { - agentUser = MainContext.getContext().getBean(AgentUserRepository.class).findByIdAndOrgi(data.getTouser(), data.getOrgi()); - try { - AutomaticServiceDist.serviceFinish(agentUser, data.getOrgi()); - } catch (Exception e) { - e.printStackTrace(); - } - } - - if (agentUser != null && user != null && user.equals(agentUser.getAgentno())) { - data.setId(MainUtils.getUUID()); - data.setContextid(agentUser.getContextid()); - - data.setAgentserviceid(agentUser.getAgentserviceid()); - data.setCreater(agentUser.getAgentno()); - - if (MainContext.MediaTypeEnum.COOPERATION.toString().equals(data.getMsgtype())) { - data.setMsgtype(MainContext.MediaTypeEnum.COOPERATION.toString()); - } else { - data.setMsgtype(MainContext.MediaTypeEnum.TEXT.toString()); - } - - data.setCalltype(MainContext.CallTypeEnum.OUT.toString()); - if (StringUtils.isNotBlank(agentUser.getAgentno())) { - data.setTouser(agentUser.getUserid()); - } - data.setChannel(agentUser.getChannel()); - - data.setUsession(agentUser.getUserid()); - - outMessage.setContextid(agentUser.getContextid()); - outMessage.setFromUser(data.getUserid()); - outMessage.setToUser(data.getTouser()); - outMessage.setChannelMessage(data); - if (agentStatus != null) { - data.setUsername(agentStatus.getUsername()); - outMessage.setNickName(agentStatus.getUsername()); - } else { - outMessage.setNickName(data.getUsername()); - } - outMessage.setCreatetime(data.getCreatetime()); - - AgentUserTaskRepository agentUserTaskRes = MainContext.getContext().getBean(AgentUserTaskRepository.class); - AgentUserTask agentUserTask = agentUserTaskRes.getOne(agentUser.getId()); - - if (agentUserTask != null) { - if (agentUserTask.getLastgetmessage() != null && agentUserTask.getLastmessage() != null) { - data.setLastagentmsgtime(agentUserTask.getLastgetmessage()); - data.setLastmsgtime(agentUserTask.getLastmessage()); - data.setAgentreplyinterval((int) ((System.currentTimeMillis() - agentUserTask.getLastgetmessage().getTime()) / 1000)); //坐席上次回复消息的间隔 - data.setAgentreplytime((int) ((System.currentTimeMillis() - agentUserTask.getLastmessage().getTime()) / 1000)); //坐席回复消息花费时间 - } - - agentUserTask.setAgentreplys(agentUserTask.getAgentreplys() + 1); //总咨询记录数量 - agentUserTask.setAgentreplyinterval(agentUserTask.getAgentreplyinterval() + data.getAgentreplyinterval()); //总时长 - if (agentUserTask.getAgentreplys() > 0) { - agentUserTask.setAvgreplyinterval(agentUserTask.getAgentreplyinterval() / agentUserTask.getAgentreplys()); - } - - agentUserTask.setLastgetmessage(new Date()); - -// agentUserTask.setReptime(null); -// agentUserTask.setReptimes("0"); - - agentUserTaskRes.save(agentUserTask); - } - - /** - * 保存消息 - */ - MainContext.getContext().getBean(ChatMessageRepository.class).save(data); - - client.sendEvent(MainContext.MessageTypeEnum.MESSAGE.toString(), data); - - if (StringUtils.isNotBlank(data.getTouser())) { - OutMessageRouter router = null; - router = (OutMessageRouter) MainContext.getContext().getBean(agentUser.getChannel()); - if (router != null) { - router.handler(data.getTouser(), MainContext.MessageTypeEnum.MESSAGE.toString(), agentUser.getAppid(), outMessage); - } - } - } else if (user != null && agentUser != null && !user.equals(agentUser.getAgentno())) { - client.sendEvent(MainContext.MessageTypeEnum.END.toString(), agentUser); - } - } -} \ No newline at end of file diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/im/handler/IMEventHandler.java b/contact-center/app/src/main/java/com/chatopera/cc/app/im/handler/IMEventHandler.java deleted file mode 100644 index ce649a21..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/im/handler/IMEventHandler.java +++ /dev/null @@ -1,209 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.im.handler; - -import com.chatopera.cc.app.algorithm.AutomaticServiceDist; -import com.chatopera.cc.app.basic.MainContext; -import com.chatopera.cc.app.basic.MainUtils; -import com.chatopera.cc.app.cache.CacheHelper; -import com.chatopera.cc.app.im.client.NettyClients; -import com.chatopera.cc.app.im.message.AgentStatusMessage; -import com.chatopera.cc.app.im.message.ChatMessage; -import com.chatopera.cc.app.im.message.NewRequestMessage; -import com.chatopera.cc.app.im.util.HumanUtils; -import com.chatopera.cc.app.im.util.IMServiceUtils; -import com.chatopera.cc.app.model.*; -import com.chatopera.cc.app.persistence.impl.AgentUserService; -import com.chatopera.cc.app.persistence.repository.AgentServiceRepository; -import com.chatopera.cc.app.persistence.repository.ConsultInviteRepository; -import com.chatopera.cc.util.OnlineUserUtils; -import com.corundumstudio.socketio.AckRequest; -import com.corundumstudio.socketio.SocketIOClient; -import com.corundumstudio.socketio.SocketIOServer; -import com.corundumstudio.socketio.annotation.OnConnect; -import com.corundumstudio.socketio.annotation.OnDisconnect; -import com.corundumstudio.socketio.annotation.OnEvent; -import org.apache.commons.lang.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; - -import java.io.UnsupportedEncodingException; -import java.net.InetSocketAddress; -import java.util.Date; -import java.util.List; - -public class IMEventHandler { - private final static Logger logger = LoggerFactory.getLogger(IMEventHandler.class); - protected SocketIOServer server; - - @Autowired - public IMEventHandler(SocketIOServer server) { - this.server = server; - } - - @OnConnect - public void onConnect(SocketIOClient client) { - try { - String user = client.getHandshakeData().getSingleUrlParam("userid"); - String orgi = client.getHandshakeData().getSingleUrlParam("orgi"); - String session = client.getHandshakeData().getSingleUrlParam("session"); - String appid = client.getHandshakeData().getSingleUrlParam("appid"); - String agent = client.getHandshakeData().getSingleUrlParam("agent"); - String skill = client.getHandshakeData().getSingleUrlParam("skill"); - - String title = client.getHandshakeData().getSingleUrlParam("title"); - String url = client.getHandshakeData().getSingleUrlParam("url"); - String traceid = client.getHandshakeData().getSingleUrlParam("traceid"); - - String nickname = client.getHandshakeData().getSingleUrlParam("nickname"); - - if (StringUtils.isNotBlank(user)) { - InetSocketAddress address = (InetSocketAddress) client.getRemoteAddress(); - String ip = MainUtils.getIpAddr(client.getHandshakeData().getHttpHeaders(), address.getHostString()); - - /** - * 加入到 缓存列表 - */ - NettyClients.getInstance().putIMEventClient(user, client); - - /** - * 更新坐席服务类型 - */ - IMServiceUtils.shiftOpsType(user, orgi, MainContext.OptTypeEnum.HUMAN); - - /** - * 用户进入到对话连接 , 排队用户请求 , 如果返回失败,表示当前坐席全忙,用户进入排队状态,当前提示信息 显示 当前排队的队列位置,不可进行对话,用户发送的消息作为留言处理 - */ - NewRequestMessage newRequestMessage = OnlineUserUtils.newRequestMessage(user, - orgi, - session, - appid, - ip, - client.getHandshakeData().getSingleUrlParam("osname"), - client.getHandshakeData().getSingleUrlParam("browser"), - MainContext.ChannelTypeEnum.WEBIM.toString(), - skill, - agent, - nickname, - title, - url, - traceid, - MainContext.ChatInitiatorType.USER.toString()); - - if (newRequestMessage != null && StringUtils.isNotBlank(newRequestMessage.getMessage())) { - MessageOutContent outMessage = new MessageOutContent(); - outMessage.setMessage(newRequestMessage.getMessage()); - outMessage.setMessageType(MainContext.MessageTypeEnum.MESSAGE.toString()); - outMessage.setCalltype(MainContext.CallTypeEnum.IN.toString()); - outMessage.setNickName(newRequestMessage.getUsername()); - outMessage.setCreatetime(MainUtils.dateFormate.format(new Date())); - outMessage.setAgentserviceid(newRequestMessage.getAgentserviceid()); - - outMessage.setNoagent(newRequestMessage.isNoagent()); - - client.sendEvent(MainContext.MessageTypeEnum.STATUS.toString(), outMessage); - } - } else {//非法链接 - client.disconnect(); - } - } catch (Exception e) { - e.printStackTrace(); - client.disconnect(); - } - } - - //添加@OnDisconnect事件,客户端断开连接时调用,刷新客户端信息 - @OnDisconnect - public void onDisconnect(SocketIOClient client) { - String user = client.getHandshakeData().getSingleUrlParam("userid"); - String orgi = client.getHandshakeData().getSingleUrlParam("orgi"); - if (user != null) { - try { - /** - * 用户主动断开服务 - */ - AutomaticServiceDist.serviceFinish((AgentUser) CacheHelper.getAgentUserCacheBean().getCacheObject(user, MainContext.SYSTEM_ORGI), orgi); - } catch (Exception e) { - e.printStackTrace(); - } - NettyClients.getInstance().removeIMEventClient(user, MainUtils.getContextID(client.getSessionId().toString())); - } - } - - //消息接收入口,用于接受网站资源用户传入的 个人信息 - @OnEvent(value = "new") - public void onEvent(SocketIOClient client, AckRequest request, Contacts contacts) { - String user = client.getHandshakeData().getSingleUrlParam("userid"); - String orgi = client.getHandshakeData().getSingleUrlParam("orgi"); - AgentUser agentUser = (AgentUser) CacheHelper.getAgentUserCacheBean().getCacheObject(user, orgi); - AgentUserService service = MainContext.getContext().getBean( - AgentUserService.class); - if (agentUser == null) { - agentUser = service.findByUseridAndOrgi(user, orgi); - } - if (agentUser != null) { - agentUser.setName(contacts.getName()); - agentUser.setPhone(contacts.getPhone()); - agentUser.setEmail(contacts.getEmail()); - agentUser.setChatbotops(false); // 非机器人客服 - agentUser.setOpttype(MainContext.OptTypeEnum.HUMAN.toString()); - service.save(agentUser); - CacheHelper.getAgentUserCacheBean().put(agentUser.getUserid(), agentUser, MainContext.SYSTEM_ORGI); - } - - AgentServiceRepository agentServiceRes = MainContext.getContext().getBean(AgentServiceRepository.class); - List agentServiceList = agentServiceRes.findByUseridAndOrgiOrderByLogindateDesc(user, orgi); - if (agentServiceList.size() > 0) { - AgentService agentService = agentServiceList.get(0); - agentService.setName(contacts.getName()); - agentService.setPhone(contacts.getPhone()); - agentService.setEmail(contacts.getEmail()); - agentServiceRes.save(agentService); - } - } - - //消息接收入口,坐席状态更新 - @OnEvent(value = "agentstatus") - public void onEvent(SocketIOClient client, AckRequest request, AgentStatusMessage data) { - System.out.println(data.getMessage()); - } - - //消息接收入口,收发消息,用户向坐席发送消息和 坐席向用户发送消息 - @OnEvent(value = "message") - public void onEvent(SocketIOClient client, AckRequest request, ChatMessage data) throws UnsupportedEncodingException { - if (data.getType() == null) { - data.setType("message"); - } - /** - * 以下代码主要用于检查 访客端的字数限制 - */ - CousultInvite invite = OnlineUserUtils.cousult(data.getAppid(), data.getOrgi(), MainContext.getContext().getBean(ConsultInviteRepository.class)); - if (invite != null && invite.getMaxwordsnum() > 0) { - if (!StringUtils.isBlank(data.getMessage()) && data.getMessage().length() > invite.getMaxwordsnum()) { - data.setMessage(data.getMessage().substring(0, invite.getMaxwordsnum())); - } - } else if (!StringUtils.isBlank(data.getMessage()) && data.getMessage().length() > 300) { - data.setMessage(data.getMessage().substring(0, 300)); - } - /** - * 处理表情 - */ - data.setMessage(MainUtils.processEmoti(data.getMessage())); - HumanUtils.createTextMessage(data, data.getUserid()); - } -} \ No newline at end of file diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/im/message/AgentServiceMessage.java b/contact-center/app/src/main/java/com/chatopera/cc/app/im/message/AgentServiceMessage.java deleted file mode 100644 index bdf1e265..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/im/message/AgentServiceMessage.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.im.message; - -import com.chatopera.cc.app.basic.MainUtils; - -public class AgentServiceMessage extends Message{ - /** - * - */ - private static final long serialVersionUID = 3520656734252136303L; - - private String type ; - private String id = MainUtils.getUUID(); - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/im/message/AgentStatusMessage.java b/contact-center/app/src/main/java/com/chatopera/cc/app/im/message/AgentStatusMessage.java deleted file mode 100644 index 449448ec..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/im/message/AgentStatusMessage.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.im.message; - -import com.chatopera.cc.app.basic.MainUtils; - -public class AgentStatusMessage extends Message{ - /** - * - */ - private static final long serialVersionUID = 3520656734252136303L; - - private String type ; - private String id = MainUtils.getUUID(); - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/im/message/ChatMessage.java b/contact-center/app/src/main/java/com/chatopera/cc/app/im/message/ChatMessage.java deleted file mode 100644 index d09e0ca9..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/im/message/ChatMessage.java +++ /dev/null @@ -1,425 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.im.message; - -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.Table; -import javax.persistence.Transient; - -import org.apache.commons.lang3.StringUtils; -import org.hibernate.annotations.GenericGenerator; - -import com.chatopera.cc.app.basic.MainUtils; -import com.chatopera.cc.exchange.UserEvent; -import com.chatopera.cc.util.OnlineUserUtils; - -@Entity -@Table(name = "uk_chat_message") -@org.hibernate.annotations.Proxy(lazy = false) -public class ChatMessage implements java.io.Serializable ,UserEvent{ - /** - * - */ - private static final long serialVersionUID = 3520656734252136303L; - - private String id = MainUtils.getUUID(); - private String appid ; - private String userid ; - private String username ; - - private String aiid ; - - - private String touser ; - private String tousername ; - - private boolean cooperation ; - - private String msgtype ; - private String creater; - private String usession ; - private String agentserviceid ; - - private String sessionid ; //增加记录 AI 的 Client Session ID - - private String topicid ; //命中的 知识库 ID - private String topicatid ; //命中的知识库分类ID - private boolean topic ; //是否命中知识库 - private boolean aichat ; //是否和AI提问 - - private String message ; - private String expmsg ; // 语音消息时,显示为ASR的识别结果,文字消息时,显示为附带的动态业务字段 - - private String orgi ; - private String channel ; - private String model ; //消息所属模块, WebIM/EntIM - private String chatype ; //对话类型,是私聊还是群聊 或者是智能机器人对话 - private Date lastagentmsgtime ; //前一条的坐席发送消息时间 - private Date lastmsgtime ; //前一条的访客发送消息时间 - private int agentreplytime ; //坐席回复消息时长 单位:秒 - private int agentreplyinterval ;//坐席回复消息时间间隔 , 单位:秒 - - private String batid ; //变更用处,修改为是否有协作保存的图片 - - private String headimgurl ; //用户头像 ,临时用 - - private String filename ; //文件名 - private int filesize ; //文件尺寸 - private String attachmentid ; //附件ID - - private boolean datastatus ; //数据状态,是否已撤回消息 - - private String mediaid ; - private String locx ; //location x - private String locy ; //location y - - private long updatetime = System.currentTimeMillis(); - - private int duration ; //音频时长 - - private String scale ; //地图级别 - private String suggestmsg ; //推荐消息 - - private int tokenum ; //当前未读消息数量 - private String agentuser ; - - public String getAppid() { - return appid; - } - public void setAppid(String appid) { - this.appid = appid; - } - public String getUserid() { - return userid; - } - public void setUserid(String userid) { - this.userid = userid; - } - public String getUsession() { - return usession; - } - public void setUsession(String usession) { - this.usession = usession; - } - public String getMessage() { - return message; - } - public void setMessage(String message) { - this.message = message; - } - - public String getOrgi() { - return orgi; - } - - public void setOrgi(String orgi) { - this.orgi = orgi; - } - - public String getTouser() { - return touser; - } - - public void setTouser(String touser) { - this.touser = touser; - } - - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } - - public String getTousername() { - return tousername; - } - - public void setTousername(String tousername) { - this.tousername = tousername; - } - - public String getChannel() { - return channel; - } - - public void setChannel(String channel) { - this.channel = channel; - } - private String type ; // 类型有两种 , 一种 message , 一种 writing - private String contextid ; - private String calltype ; - private String createtime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - - public String getContextid() { - return contextid; - } - - public void setContextid(String contextid) { - this.contextid = contextid; - } - - public String getCalltype() { - return calltype; - } - - public void setCalltype(String calltype) { - this.calltype = calltype; - } - - public String getCreatetime() { - return createtime; - } - public void setCreatetime(String createtime) { - this.createtime = createtime; - } - @Id - @Column(length = 32) - @GeneratedValue(generator = "system-uuid") - @GenericGenerator(name = "system-uuid", strategy = "assigned") - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - public String getModel() { - return model; - } - public void setModel(String model) { - this.model = model; - } - public String getChatype() { - return chatype; - } - public void setChatype(String chatype) { - this.chatype = chatype; - } - public String getAgentserviceid() { - return agentserviceid; - } - public void setAgentserviceid(String agentserviceid) { - this.agentserviceid = agentserviceid; - } - @Transient - public int getTokenum() { - return tokenum; - } - public void setTokenum(int tokenum) { - this.tokenum = tokenum; - } - @Transient - public String getAgentuser() { - return agentuser; - } - public void setAgentuser(String agentuser) { - this.agentuser = agentuser; - } - @Transient - public String getHeadimgurl() { - return headimgurl; - } - public void setHeadimgurl(String headimgurl) { - this.headimgurl = headimgurl; - } - public String getMsgtype() { - return msgtype; - } - public void setMsgtype(String msgtype) { - this.msgtype = msgtype; - } - public String getCreater() { - return creater; - } - public void setCreater(String creater) { - this.creater = creater; - } - public String getMediaid() { - return mediaid; - } - public void setMediaid(String mediaid) { - this.mediaid = mediaid; - } - public String getLocx() { - return locx; - } - public void setLocx(String locx) { - this.locx = locx; - } - public String getLocy() { - return locy; - } - public void setLocy(String locy) { - this.locy = locy; - } - public int getDuration() { - return duration; - } - public void setDuration(int duration) { - this.duration = duration; - } - public String getScale() { - return scale; - } - public void setScale(String scale) { - this.scale = scale; - } - public long getUpdatetime() { - return updatetime; - } - public void setUpdatetime(long updatetime) { - this.updatetime = updatetime; - } - public String getFilename() { - return filename; - } - public void setFilename(String filename) { - this.filename = filename; - } - public int getFilesize() { - return filesize; - } - public void setFilesize(int filesize) { - this.filesize = filesize; - } - public String getAttachmentid() { - return attachmentid; - } - public void setAttachmentid(String attachmentid) { - this.attachmentid = attachmentid; - } - public Date getLastagentmsgtime() { - return lastagentmsgtime; - } - public void setLastagentmsgtime(Date lastagentmsgtime) { - this.lastagentmsgtime = lastagentmsgtime; - } - public int getAgentreplytime() { - return agentreplytime; - } - public void setAgentreplytime(int agentreplytime) { - this.agentreplytime = agentreplytime; - } - public Date getLastmsgtime() { - return lastmsgtime; - } - public void setLastmsgtime(Date lastmsgtime) { - this.lastmsgtime = lastmsgtime; - } - public int getAgentreplyinterval() { - return agentreplyinterval; - } - public void setAgentreplyinterval(int agentreplyinterval) { - this.agentreplyinterval = agentreplyinterval; - } - public String getSessionid() { - return sessionid; - } - public void setSessionid(String sessionid) { - this.sessionid = sessionid; - } - public String getBatid() { - return batid; - } - public void setBatid(String batid) { - this.batid = batid; - } - public boolean isCooperation() { - return cooperation; - } - public void setCooperation(boolean cooperation) { - this.cooperation = cooperation; - } - public boolean isDatastatus() { - return datastatus; - } - public void setDatastatus(boolean datastatus) { - this.datastatus = datastatus; - } - public String getTopicid() { - return topicid; - } - public void setTopicid(String topicid) { - this.topicid = topicid; - } - public String getTopicatid() { - return topicatid; - } - public void setTopicatid(String topicatid) { - this.topicatid = topicatid; - } - public boolean isTopic() { - return topic; - } - public void setTopic(boolean topic) { - this.topic = topic; - } - public boolean isAichat() { - return aichat; - } - public void setAichat(boolean aichat) { - this.aichat = aichat; - } - public String getAiid() { - return aiid; - } - public void setAiid(String aiid) { - this.aiid = aiid; - } - public String getExpmsg() { - return expmsg; - } - public void setExpmsg(String expmsg) { - this.expmsg = expmsg; - } - public String getSuggestmsg() { - return suggestmsg; - } - public void setSuggestmsg(String suggestmsg) { - this.suggestmsg = suggestmsg; - } - @Transient - public List getSuggest(){ - List otherMessageItemList = null ; - if(!StringUtils.isBlank(this.getSuggestmsg())) { - try { - otherMessageItemList = OnlineUserUtils.objectMapper.readValue(this.getSuggestmsg(), OnlineUserUtils.getCollectionType(ArrayList.class, OtherMessageItem.class)) ; - } catch (Exception e) { - e.printStackTrace(); - } - } - return otherMessageItemList ; - } -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/im/message/ChatObject.java b/contact-center/app/src/main/java/com/chatopera/cc/app/im/message/ChatObject.java deleted file mode 100644 index cb159f91..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/im/message/ChatObject.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.im.message; - -public class ChatObject { - private String userName; - private String message; - - public ChatObject() { - } - - public ChatObject(String userName, String message) { - super(); - this.userName = userName; - this.message = message; - } - - public String getUserName() { - return userName; - } - - public void setUserName(String userName) { - this.userName = userName; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } -} \ No newline at end of file diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/im/message/Message.java b/contact-center/app/src/main/java/com/chatopera/cc/app/im/message/Message.java deleted file mode 100644 index b1f8131e..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/im/message/Message.java +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.im.message; - -import com.chatopera.cc.app.basic.MainUtils; - - -public abstract class Message implements java.io.Serializable{ - - /** - * - */ - private static final long serialVersionUID = 1872188129813937898L; - private String id = MainUtils.getUUID(); - private String appid ; - private String userid ; - private String username ; - - private String touser ; - private String tousername ; - private String session ; - private String sign ; - private String message ; - private String orgi ; - private String agentserviceid ; - private String channel ; - - public abstract String getType() ; - - public String getAppid() { - return appid; - } - public void setAppid(String appid) { - this.appid = appid; - } - public String getUserid() { - return userid; - } - public void setUserid(String userid) { - this.userid = userid; - } - public String getSession() { - return session; - } - public void setSession(String session) { - this.session = session; - } - public String getSign() { - return sign; - } - public void setSign(String sign) { - this.sign = sign; - } - public String getMessage() { - return message; - } - public void setMessage(String message) { - this.message = message; - } - - public String getOrgi() { - return orgi; - } - - public void setOrgi(String orgi) { - this.orgi = orgi; - } - - public String getTouser() { - return touser; - } - - public void setTouser(String touser) { - this.touser = touser; - } - - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } - - public String getTousername() { - return tousername; - } - - public void setTousername(String tousername) { - this.tousername = tousername; - } - - public String getChannel() { - return channel; - } - - public void setChannel(String channel) { - this.channel = channel; - } - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getAgentserviceid() { - return agentserviceid; - } - - public void setAgentserviceid(String agentserviceid) { - this.agentserviceid = agentserviceid; - } -} \ No newline at end of file diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/im/message/NewRequestMessage.java b/contact-center/app/src/main/java/com/chatopera/cc/app/im/message/NewRequestMessage.java deleted file mode 100644 index 67831373..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/im/message/NewRequestMessage.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.im.message; - -import com.chatopera.cc.app.basic.MainUtils; - -public class NewRequestMessage extends Message{ - /** - * - */ - private static final long serialVersionUID = 3520656734252136303L; - private String id = MainUtils.getUUID(); - private String type ; - private boolean noagent ; - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public boolean isNoagent() { - return noagent; - } - - public void setNoagent(boolean noagent) { - this.noagent = noagent; - } -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/im/message/OtherMessage.java b/contact-center/app/src/main/java/com/chatopera/cc/app/im/message/OtherMessage.java deleted file mode 100644 index fd3fc9f7..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/im/message/OtherMessage.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.im.message; - -import java.util.List; - -public class OtherMessage implements java.io.Serializable{ - /** - * - */ - private static final long serialVersionUID = 3520656734252136303L; - - private String msgtype ; - private String title; - private String message ; - private String id ; - private boolean detail ; - - private List items ; - - public String getMsgtype() { - return msgtype; - } - public void setMsgtype(String msgtype) { - this.msgtype = msgtype; - } - public String getTitle() { - return title; - } - public void setTitle(String title) { - this.title = title; - } - public List getItems() { - return items; - } - public void setItems(List items) { - this.items = items; - } - public String getMessage() { - return message; - } - public void setMessage(String message) { - this.message = message; - } - public String getId() { - return id; - } - public void setId(String id) { - this.id = id; - } - public boolean isDetail() { - return detail; - } - public void setDetail(boolean detail) { - this.detail = detail; - } -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/im/message/OtherMessageItem.java b/contact-center/app/src/main/java/com/chatopera/cc/app/im/message/OtherMessageItem.java deleted file mode 100644 index c93c2b7e..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/im/message/OtherMessageItem.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.im.message; - -public class OtherMessageItem implements java.io.Serializable{ - /** - * - */ - private static final long serialVersionUID = 3520656734252136303L; - - private String msgtype ; - private String title; - private String id ; - private String content ; - - public String getMsgtype() { - return msgtype; - } - public void setMsgtype(String msgtype) { - this.msgtype = msgtype; - } - public String getTitle() { - return title; - } - public void setTitle(String title) { - this.title = title; - } - public String getId() { - return id; - } - public void setId(String id) { - this.id = id; - } - public String getContent() { - return content; - } - public void setContent(String content) { - this.content = content; - } -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/im/router/AgentUserRouter.java b/contact-center/app/src/main/java/com/chatopera/cc/app/im/router/AgentUserRouter.java deleted file mode 100644 index 0f94352c..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/im/router/AgentUserRouter.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.im.router; - -import com.chatopera.cc.app.model.MessageDataBean; -import com.chatopera.cc.app.model.MessageOutContent; - -public class AgentUserRouter extends Router{ - - @Override - public MessageDataBean handler(MessageDataBean message) { - MessageDataBean outMessage = new MessageOutContent() ; - return outMessage; - } -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/im/router/CallOutMessageRouter.java b/contact-center/app/src/main/java/com/chatopera/cc/app/im/router/CallOutMessageRouter.java deleted file mode 100644 index 7ae24e01..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/im/router/CallOutMessageRouter.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.im.router; - -import com.chatopera.cc.app.model.MessageOutContent; -import org.springframework.context.annotation.Bean; -import org.springframework.stereotype.Component; - -@Component -public class CallOutMessageRouter implements OutMessageRouter{ - - @Bean(name="phone") - public CallOutMessageRouter initWebIMessageRouter(){ - return new CallOutMessageRouter() ; - } - @Override - public void handler(String touser, String msgtype, String appid, - MessageOutContent outMessage) { - //do nothing - //电话渠道通过TTS播放给电话系统 - } - -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/im/router/MessageRouter.java b/contact-center/app/src/main/java/com/chatopera/cc/app/im/router/MessageRouter.java deleted file mode 100644 index 647273d1..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/im/router/MessageRouter.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.im.router; - -import com.chatopera.cc.app.algorithm.AutomaticServiceDist; -import com.chatopera.cc.app.basic.MainContext; -import com.chatopera.cc.app.basic.MainUtils; -import com.chatopera.cc.app.im.client.NettyClients; -import com.chatopera.cc.app.model.AgentService; -import com.chatopera.cc.app.model.MessageDataBean; -import com.chatopera.cc.app.model.MessageOutContent; - -public class MessageRouter extends Router { - - @Override - public MessageDataBean handler(MessageDataBean inMessage) { - MessageOutContent outMessage = new MessageOutContent(); - try { - outMessage.setOrgi(inMessage.getOrgi()); - outMessage.setFromUser(inMessage.getToUser()); - outMessage.setToUser(inMessage.getFromUser()); - outMessage.setId(MainUtils.genID()); - outMessage.setMessageType(inMessage.getMessageType()); - outMessage.setUser(inMessage.getUser()); - outMessage.setAgentUser(inMessage.getAgentUser()); - /** - * 首先交由 IMR处理 MESSAGE指令 , 如果当前用户是在 坐席对话列表中, 则直接推送给坐席,如果不在,则执行 IMR - */ - if (outMessage.getAgentUser() != null && outMessage.getAgentUser().getStatus() != null) { - if (outMessage.getAgentUser().getStatus().equals(MainContext.AgentUserStatusEnum.INQUENE.toString())) { - int queneIndex = AutomaticServiceDist.getQueneIndex(inMessage.getAgentUser().getAgent(), inMessage.getOrgi(), inMessage.getAgentUser().getSkill()); - if (MainContext.AgentUserStatusEnum.INQUENE.toString().equals(outMessage.getAgentUser().getStatus())) { - outMessage.setMessage(AutomaticServiceDist.getQueneMessage(queneIndex, outMessage.getAgentUser().getChannel(), inMessage.getOrgi())); - } - } else if (outMessage.getAgentUser().getStatus().equals(MainContext.AgentUserStatusEnum.INSERVICE.toString())) { - - } - } else if (MainContext.MessageTypeEnum.NEW.toString().equals(inMessage.getMessageType())) { - /** - * 找到空闲坐席,如果未找到坐席, 则将该用户放入到 排队队列 - * - */ - AgentService agentService = AutomaticServiceDist.allotAgent(inMessage.getAgentUser(), inMessage.getOrgi()); - if (agentService != null && MainContext.AgentUserStatusEnum.INSERVICE.toString().equals(agentService.getStatus())) { - outMessage.setMessage(AutomaticServiceDist.getSuccessMessage(agentService, inMessage.getAgentUser().getChannel(), inMessage.getOrgi())); - // TODO #111 publish to redis - NettyClients.getInstance().publishAgentEventMessage(agentService.getAgentno(), MainContext.MessageTypeEnum.NEW.toString(), inMessage.getAgentUser()); - } else { - if (agentService.getQueneindex() > 0) { //当前有坐席 - outMessage.setMessage(AutomaticServiceDist.getQueneMessage(agentService.getQueneindex(), inMessage.getAgentUser().getChannel(), inMessage.getOrgi())); - } else { - outMessage.setMessage(AutomaticServiceDist.getNoAgentMessage(agentService.getQueneindex(), inMessage.getAgentUser().getChannel(), inMessage.getOrgi())); - } - } - } - } catch (Exception e1) { - e1.printStackTrace(); - } - return outMessage; - } - -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/im/router/OutMessageRouter.java b/contact-center/app/src/main/java/com/chatopera/cc/app/im/router/OutMessageRouter.java deleted file mode 100644 index b0a416a8..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/im/router/OutMessageRouter.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.im.router; - -import com.chatopera.cc.app.model.MessageOutContent; - -public interface OutMessageRouter { - - public void handler(String touser, String msgtype , String appid , MessageOutContent outMessage) ; -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/im/router/Router.java b/contact-center/app/src/main/java/com/chatopera/cc/app/im/router/Router.java deleted file mode 100644 index 5c55a308..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/im/router/Router.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.im.router; - -import com.chatopera.cc.app.model.MessageDataBean; - -public abstract class Router { - - public abstract MessageDataBean handler(MessageDataBean message) ; - -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/im/router/RouterHelper.java b/contact-center/app/src/main/java/com/chatopera/cc/app/im/router/RouterHelper.java deleted file mode 100644 index bac7bd3d..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/im/router/RouterHelper.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.im.router; - -public class RouterHelper { - private static Router router = new MessageRouter(); - - public static Router getRouteInstance(){ - return router ; - } -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/im/router/WebIMOutMessageRouter.java b/contact-center/app/src/main/java/com/chatopera/cc/app/im/router/WebIMOutMessageRouter.java deleted file mode 100644 index d9d5e790..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/im/router/WebIMOutMessageRouter.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.im.router; - -import com.chatopera.cc.app.im.client.NettyClients; -import org.springframework.context.annotation.Bean; -import org.springframework.stereotype.Component; - -import com.chatopera.cc.app.model.MessageOutContent; - -@Component -public class WebIMOutMessageRouter implements OutMessageRouter{ - - @Bean(name="webim") - public WebIMOutMessageRouter initWebIMessageRouter(){ - return new WebIMOutMessageRouter() ; - } - @Override - public void handler(String touser, String msgtype, String appid, - MessageOutContent outMessage) { - NettyClients.getInstance().publishIMEventMessage(touser, msgtype, outMessage); - } - -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/im/util/ChatbotUtils.java b/contact-center/app/src/main/java/com/chatopera/cc/app/im/util/ChatbotUtils.java deleted file mode 100644 index 228ff5f9..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/im/util/ChatbotUtils.java +++ /dev/null @@ -1,168 +0,0 @@ -/* - * Copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.im.util; - -import com.chatopera.cc.app.basic.MainContext; -import com.chatopera.cc.app.cache.CacheHelper; -import com.chatopera.cc.app.im.client.NettyClients; -import com.chatopera.cc.app.im.message.ChatMessage; -import com.chatopera.cc.app.model.AgentUser; -import com.chatopera.cc.app.model.Chatbot; -import com.chatopera.cc.app.model.MessageOutContent; -import com.chatopera.cc.app.persistence.repository.ChatMessageRepository; -import com.chatopera.cc.app.persistence.repository.ChatbotRepository; -import org.apache.commons.lang.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.Arrays; -import java.util.HashSet; - -public class ChatbotUtils { - private final static Logger logger = LoggerFactory.getLogger(ChatbotUtils.class); - public static final HashSet VALID_LANGS = new HashSet(Arrays.asList(new String[]{"zh_CN", "en_US"})); - public static final String CHATBOT_FIRST = "机器人客服优先"; - public static final String HUMAN_FIRST = "人工客服优先"; - public static final HashSet VALID_WORKMODELS = new HashSet(Arrays.asList(new String[]{CHATBOT_FIRST, HUMAN_FIRST})); - - public static final String SNS_TYPE_WEBIM = "webim"; - - private static ChatbotRepository chatbotRes; - - private static ChatMessageRepository chatMessageRes; - - /** - * 使用chatbotID得到snsid - * - * @param chatbotID - * @return - */ - public static String resolveSnsidWithChatbotID(String chatbotID, String clientId) { - return StringUtils.remove(chatbotID, clientId.toLowerCase() + "_"); - } - - /** - * @param data - * @param direction - * @param chatype - * @return - */ - private static MessageOutContent createMessage(ChatMessage data, String direction, String chatype) { - AgentUser agentUser = (AgentUser) CacheHelper.getAgentUserCacheBean().getCacheObject(data.getUserid(), data.getOrgi()); - if (agentUser == null) - return null; - - // 设置发送消息体 - MessageOutContent outMessage = new MessageOutContent(); - outMessage.setMessage(data.getMessage()); - outMessage.setMessageType(data.getMsgtype()); - outMessage.setCalltype(direction); - outMessage.setAgentUser(null); - outMessage.setSnsAccount(null); - if (StringUtils.isNotBlank(data.getSuggestmsg())) { - outMessage.setSuggest(data.getSuggest()); - } - - outMessage.setContextid(data.getContextid()); - outMessage.setFromUser(data.getUserid()); - outMessage.setToUser(data.getTouser()); - outMessage.setChannelMessage(data); - outMessage.setNickName(data.getUsername()); - outMessage.setCreatetime(data.getCreatetime()); - - /** - * 保存消息 - */ - getChatMessageRes().save(data); - - //将消息发送给 访客 - NettyClients.getInstance().sendChatbotEventMessage(data.getUserid(), MainContext.MessageTypeEnum.MESSAGE.toString(), data); - - return outMessage; - } - - - /** - * 发送聊天机器人消息 - * - * @param data - * @param appid - * @param channel - * @param direction - * @param chatype - * @param msgtype - * @param userid - * @return - */ - protected static MessageOutContent createMessage(final ChatMessage data, - final String appid, - final String channel, - final String direction, - final String chatype, - final String msgtype, - final String userid, - final String orgi) { - Chatbot c = getChatbotRes().findBySnsAccountIdentifierAndOrgi(appid, orgi); - if (c == null) // ignore event if chatbot not exist. - return null; - - data.setAiid(c.getId()); - data.setOrgi(orgi); - data.setUserid(userid); - data.setAgentserviceid(data.getContextid()); - data.setChatype(chatype); - data.setChannel(channel); - data.setMsgtype(msgtype); - data.setUsession(data.getUserid()); //agentUser作为 session id - data.setCalltype(direction); - data.setUpdatetime(System.currentTimeMillis()); - return createMessage(data, direction, chatype); - } - - /** - * 发送文字消息 - * - * @param data - * @param direction - * @param chatype - * @return - */ - public static MessageOutContent createTextMessage(ChatMessage data, String direction, String chatype) { - data.setMsgtype(MainContext.MediaTypeEnum.TEXT.toString()); - return createMessage(data, direction, chatype); - } - - private static ChatbotRepository getChatbotRes() { - if (chatbotRes == null) - chatbotRes = MainContext.getContext().getBean(ChatbotRepository.class); - return chatbotRes; - } - - private static ChatMessageRepository getChatMessageRes() { - if (chatMessageRes == null) - chatMessageRes = MainContext.getContext().getBean(ChatMessageRepository.class); - return chatMessageRes; - } - - /** - * 保存到数据库,发送到ChatMessage - * @param resp - */ - public static void saveAndPublish(ChatMessage resp) { - NettyClients.getInstance().sendChatbotEventMessage(resp.getUserid(), MainContext.MessageTypeEnum.MESSAGE.toString(), resp); - getChatMessageRes().save(resp); - } -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/im/util/HumanUtils.java b/contact-center/app/src/main/java/com/chatopera/cc/app/im/util/HumanUtils.java deleted file mode 100644 index 0d1ad19a..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/im/util/HumanUtils.java +++ /dev/null @@ -1,223 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.im.util; - -import com.chatopera.cc.app.basic.MainContext; -import com.chatopera.cc.app.im.client.NettyClients; -import com.chatopera.cc.app.im.message.ChatMessage; -import com.chatopera.cc.app.model.AgentUser; -import com.chatopera.cc.app.model.AgentUserTask; -import com.chatopera.cc.app.model.MessageOutContent; -import com.chatopera.cc.app.cache.CacheHelper; -import com.chatopera.cc.app.persistence.repository.AgentUserTaskRepository; -import com.chatopera.cc.app.persistence.repository.ChatMessageRepository; -import org.apache.commons.lang.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.Date; - -public class HumanUtils { - private final static Logger logger = LoggerFactory.getLogger(HumanUtils.class); - - /** - * 发送文本消息 - * - * @param data - * @param userid - */ - public static void createTextMessage(ChatMessage data, String userid) { - createMessage(data, MainContext.MediaTypeEnum.TEXT.toString(), userid); - } - - /** - * 发送各种消息的底层方法 - * - * @param data - * @param msgtype - * @param userid - */ - protected static void createMessage(ChatMessage data, String msgtype, String userid) { - AgentUser agentUser = (AgentUser) CacheHelper.getAgentUserCacheBean().getCacheObject(userid, MainContext.SYSTEM_ORGI); - MessageOutContent outMessage = new MessageOutContent(); - - outMessage.setMessage(data.getMessage()); - outMessage.setFilename(data.getFilename()); - outMessage.setFilesize(data.getFilesize()); - - outMessage.setMessageType(msgtype); - outMessage.setCalltype(MainContext.CallTypeEnum.IN.toString()); - outMessage.setAgentUser(agentUser); - outMessage.setSnsAccount(null); - - MessageOutContent statusMessage = null; - if (agentUser == null) { - statusMessage = new MessageOutContent(); - statusMessage.setMessage(data.getMessage()); - statusMessage.setMessageType(MainContext.MessageTypeEnum.STATUS.toString()); - statusMessage.setCalltype(MainContext.CallTypeEnum.OUT.toString()); - statusMessage.setMessage("当前坐席全忙,请稍候"); - } else { - data.setUserid(agentUser.getUserid()); - data.setUsername(agentUser.getUsername()); - data.setTouser(agentUser.getAgentno()); - data.setAgentuser(agentUser.getId()); - data.setAgentserviceid(agentUser.getAgentserviceid()); - data.setAppid(agentUser.getAppid()); - data.setOrgi(agentUser.getOrgi()); - data.setMsgtype(msgtype); - data.setUsername(agentUser.getUsername()); - data.setUsession(agentUser.getUserid()); //agentUser作为 session id - data.setContextid(agentUser.getContextid()); - data.setCalltype(MainContext.CallTypeEnum.IN.toString()); - if (!StringUtils.isBlank(agentUser.getAgentno())) { - data.setTouser(agentUser.getAgentno()); - } - data.setChannel(agentUser.getChannel()); - - outMessage.setContextid(agentUser.getContextid()); - outMessage.setFromUser(data.getUserid()); - outMessage.setToUser(data.getTouser()); - outMessage.setChannelMessage(data); - outMessage.setNickName(agentUser.getUsername()); - outMessage.setCreatetime(data.getCreatetime()); - - if (data.getType() != null && data.getType().equals(MainContext.MessageTypeEnum.MESSAGE.toString())) { - AgentUserTaskRepository agentUserTaskRes = MainContext.getContext().getBean(AgentUserTaskRepository.class); - AgentUserTask agentUserTask = agentUserTaskRes.getOne(agentUser.getId()); - if (agentUserTask != null) { - if (agentUserTask.getLastgetmessage() != null && agentUserTask.getLastmessage() != null) { - data.setLastagentmsgtime(agentUserTask.getLastgetmessage()); - data.setLastmsgtime(agentUserTask.getLastmessage()); - data.setAgentreplyinterval((int) ((System.currentTimeMillis() - agentUserTask.getLastgetmessage().getTime()) / 1000)); //坐席上次回复消息的间隔 - data.setAgentreplytime((int) ((System.currentTimeMillis() - agentUserTask.getLastmessage().getTime()) / 1000)); //坐席回复消息花费时间 - } - agentUserTask.setUserasks(agentUserTask.getUserasks() + 1); //总咨询记录数量 - agentUserTask.setAgentreplytime(agentUserTask.getAgentreplytime() + data.getAgentreplyinterval()); //总时长 - if (agentUserTask.getUserasks() > 0) { - agentUserTask.setAvgreplytime(agentUserTask.getAgentreplytime() / agentUserTask.getUserasks()); - } - - agentUserTask.setLastmessage(new Date()); - agentUserTask.setWarnings("0"); - agentUserTask.setWarningtime(null); - - /** - * 去掉坐席超时回复消息提醒 - */ - agentUserTask.setReptime(null); - agentUserTask.setReptimes("0"); - - agentUserTask.setLastmsg(data.getMessage().length() > 100 ? data.getMessage().substring(0, 100) : data.getMessage()); - agentUserTask.setTokenum(agentUserTask.getTokenum() + 1); - data.setTokenum(agentUserTask.getTokenum()); - agentUserTaskRes.save(agentUserTask); - } - } - - /** - * 保存消息 - */ - if (MainContext.MessageTypeEnum.MESSAGE.toString().equals(data.getType())) { - MainContext.getContext().getBean(ChatMessageRepository.class).save(data); - } - } - if (StringUtils.isNotBlank(data.getUserid()) && MainContext.MessageTypeEnum.MESSAGE.toString().equals(data.getType())) { - NettyClients.getInstance().publishIMEventMessage(data.getUserid(), MainContext.MessageTypeEnum.MESSAGE.toString(), outMessage); - if (statusMessage != null) { - NettyClients.getInstance().publishIMEventMessage(data.getUserid(), MainContext.MessageTypeEnum.STATUS.toString(), statusMessage); - } - } - if (agentUser != null && StringUtils.isNotBlank(agentUser.getAgentno())) { - // TODO 将消息发送给 坐席 - NettyClients.getInstance().publishAgentEventMessage(agentUser.getAgentno(), MainContext.MessageTypeEnum.MESSAGE.toString(), data); - } - } - - - -// /** -// * 发送消息 -// * -// * @param data -// * @param msgtype -// */ -// private static void sendMessage(ChatMessage data, String msgtype) { -// MessageOutContent outMessage = new MessageOutContent(); -// -// outMessage.setMessage(data.getMessage()); -// outMessage.setFilename(data.getFilename()); -// outMessage.setFilesize(data.getFilesize()); -// -// -// outMessage.setMessageType(msgtype); -// outMessage.setCalltype(MainContext.CallTypeEnum.IN.toString()); -// outMessage.setSnsAccount(null); -// -// outMessage.setContextid(data.getContextid()); -// outMessage.setFromUser(data.getUserid()); -// outMessage.setToUser(data.getTouser()); -// outMessage.setChannelMessage(data); -// outMessage.setNickName(data.getUsername()); -// outMessage.setCreatetime(data.getCreatetime()); -// -// if (!StringUtils.isBlank(data.getUserid()) && MainContext.MessageTypeEnum.MESSAGE.toString().equals(data.getType())) { -// NettyClients.getInstance().publishIMEventMessage(data.getUserid(), MainContext.MessageTypeEnum.MESSAGE.toString(), outMessage); -// } -// } - -// /** -// * -// * @param message -// * @param length -// * @param name -// * @param channel -// * @param msgtype -// * @param userid -// * @param username -// * @param appid -// * @param orgi -// * @param attachid -// * @param aiid -// * @return -// */ -// public static ChatMessage createRichMediaMessageWithChannel(String message, int length, String name, String channel, String msgtype, String userid, String username, String appid, String orgi, String attachid, String aiid) { -// ChatMessage data = new ChatMessage(); -// if (!StringUtils.isBlank(userid)) { -// data.setUserid(userid); -// data.setUsername(username); -// data.setTouser(userid); -// data.setAppid(appid); -// data.setOrgi(orgi); -// data.setChannel(channel); -// data.setMessage(message); -// -// data.setAiid(aiid); -// -// data.setFilesize(length); -// data.setFilename(name); -// data.setAttachmentid(attachid); -// -// data.setMsgtype(msgtype); -// -// data.setType(MainContext.MessageTypeEnum.MESSAGE.toString()); -// createChatbotMessage(data, appid, channel, MainContext.CallTypeEnum.IN.toString(), MainContext.ChatbotItemType.USERINPUT.toString(), msgtype, data.getUserid()); -// } -// return data; -// } - -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/im/util/IMServiceUtils.java b/contact-center/app/src/main/java/com/chatopera/cc/app/im/util/IMServiceUtils.java deleted file mode 100644 index d71df8df..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/im/util/IMServiceUtils.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.chatopera.cc.app.im.util; - -import com.chatopera.cc.app.basic.MainContext; -import com.chatopera.cc.app.cache.CacheHelper; -import com.chatopera.cc.app.model.AgentUser; -import com.chatopera.cc.app.persistence.impl.AgentUserService; -import org.apache.commons.lang.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.*; -import java.util.Base64; - -public class IMServiceUtils { - private final static Logger logger = LoggerFactory.getLogger(IMServiceUtils.class); - - public static void shiftOpsType(final String userId, final String orgi, final MainContext.OptTypeEnum opsType){ - AgentUser agentUser = (AgentUser) CacheHelper.getAgentUserCacheBean().getCacheObject(userId, orgi); - AgentUserService service = MainContext.getContext().getBean( - AgentUserService.class); - if (agentUser == null) { - agentUser = service.findByUseridAndOrgi(userId, orgi); - } - if (agentUser != null) { - switch (opsType){ - case CHATBOT: - agentUser.setOpttype(MainContext.OptTypeEnum.CHATBOT.toString()); - agentUser.setChatbotops(true); - break; - case HUMAN: - agentUser.setOpttype(MainContext.OptTypeEnum.HUMAN.toString()); - agentUser.setChatbotops(false); - break; - default: - logger.warn("shiftOpsType unknown type."); - break; - } - service.save(agentUser); - CacheHelper.getAgentUserCacheBean().put(agentUser.getUserid(), agentUser, orgi); - } - } - - /** - * Write the object to a Base64 string. - */ - public static String serialize(Serializable o) throws IOException { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - ObjectOutputStream oos = new ObjectOutputStream(baos); - oos.writeObject(o); - oos.close(); - return Base64.getEncoder().encodeToString(baos.toByteArray()); - } - - - /** - * Read the object from Base64 string. - */ - public static Object deserialize(String s) throws IOException, - ClassNotFoundException { - byte[] data = Base64.getDecoder().decode(s); - ObjectInputStream ois = new ObjectInputStream( - new ByteArrayInputStream(data)); - Object o = ois.readObject(); - ois.close(); - return o; - } - -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/interceptor/LogIntercreptorHandler.java b/contact-center/app/src/main/java/com/chatopera/cc/app/interceptor/LogIntercreptorHandler.java deleted file mode 100644 index 4b169a27..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/interceptor/LogIntercreptorHandler.java +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.interceptor; - -import java.util.Date; -import java.util.Enumeration; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import com.chatopera.cc.app.basic.MainUtils; -import com.chatopera.cc.util.Menu; -import com.chatopera.cc.app.model.User; -import org.apache.commons.lang3.StringUtils; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.method.HandlerMethod; -import org.springframework.web.servlet.ModelAndView; - -import com.chatopera.cc.app.basic.MainContext; -import com.chatopera.cc.app.handler.Handler; -import com.chatopera.cc.app.model.RequestLog; - -/** - * 系统访问记录 - * @author admin - * - */ -public class LogIntercreptorHandler implements org.springframework.web.servlet.HandlerInterceptor{ - @Override - public void afterCompletion(HttpServletRequest request, - HttpServletResponse arg1, Object arg2, Exception arg3) - throws Exception { - - } - - @Override - public void postHandle(HttpServletRequest request, HttpServletResponse response, - Object arg2, ModelAndView arg3) throws Exception { - HandlerMethod handlerMethod = (HandlerMethod ) arg2 ; - Object hander = handlerMethod.getBean() ; - RequestMapping obj = handlerMethod.getMethod().getAnnotation(RequestMapping.class) ; - if(!StringUtils.isBlank(request.getRequestURI()) && !(request.getRequestURI().startsWith("/message/ping") || request.getRequestURI().startsWith("/res/css") || request.getRequestURI().startsWith("/error") || request.getRequestURI().startsWith("/im/"))){ - RequestLog log = new RequestLog(); - log.setEndtime(new Date()) ; - - if(obj!=null) { - log.setName(obj.name()); - } - log.setMethodname(handlerMethod.toString()) ; - log.setIp(request.getRemoteAddr()) ; - if(hander!=null) { - log.setClassname(hander.getClass().toString()) ; - if(hander instanceof Handler && ((Handler)hander).getStarttime() != 0) { - log.setQuerytime(System.currentTimeMillis() - ((Handler)hander).getStarttime()); - } - } - log.setUrl(request.getRequestURI()); - - log.setHostname(request.getRemoteHost()) ; - log.setEndtime(new Date()); - log.setType(MainContext.LogTypeEnum.REQUEST.toString()) ; - User user = (User) request.getSession(true).getAttribute(MainContext.USER_SESSION_NAME) ; - if(user!=null){ - log.setUserid(user.getId()) ; - log.setUsername(user.getUsername()) ; - log.setUsermail(user.getEmail()) ; - log.setOrgi(user.getOrgi()); - } - StringBuffer str = new StringBuffer(); - Enumeration names = request.getParameterNames(); - while(names.hasMoreElements()){ - String paraName=(String)names.nextElement(); - if(paraName.indexOf("password") >= 0) { - str.append(paraName).append("=").append(MainUtils.encryption(request.getParameter(paraName))).append(","); - }else { - str.append(paraName).append("=").append(request.getParameter(paraName)).append(","); - } - } - - Menu menu = handlerMethod.getMethod().getAnnotation(Menu.class) ; - if(menu!=null){ - log.setFuntype(menu.type()); - log.setFundesc(menu.subtype()); - log.setName(menu.name()); - } - - log.setParameters(str.toString()); - MainUtils.published(log); - } - } - - @Override - public boolean preHandle(HttpServletRequest request, HttpServletResponse response, - Object arg2) throws Exception { - HandlerMethod handlerMethod = (HandlerMethod ) arg2 ; - Object hander = handlerMethod.getBean() ; - if(hander instanceof Handler) { - ((Handler)hander).setStarttime(System.currentTimeMillis()); - } - return true; - } -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/interceptor/UserInterceptorHandler.java b/contact-center/app/src/main/java/com/chatopera/cc/app/interceptor/UserInterceptorHandler.java deleted file mode 100644 index 0f1a2ac2..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/interceptor/UserInterceptorHandler.java +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.interceptor; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import com.chatopera.cc.app.algorithm.AutomaticServiceDist; -import com.chatopera.cc.app.basic.MainContext; -import com.chatopera.cc.util.Menu; -import com.chatopera.cc.app.cache.CacheHelper; -import com.chatopera.cc.app.model.User; -import org.apache.commons.lang.StringUtils; -import org.apache.log4j.LogManager; -import org.apache.log4j.Logger; -import org.springframework.boot.autoconfigure.web.BasicErrorController; -import org.springframework.web.method.HandlerMethod; -import org.springframework.web.servlet.ModelAndView; -import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; - -import com.chatopera.cc.app.basic.MainUtils; -import com.chatopera.cc.app.model.SystemConfig; -import com.chatopera.cc.app.model.UKeFuDic; - -public class UserInterceptorHandler extends HandlerInterceptorAdapter { - - public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) - throws Exception { - boolean filter = false; - User user = (User) request.getSession(true).getAttribute(MainContext.USER_SESSION_NAME) ; - if(handler instanceof HandlerMethod) { - HandlerMethod handlerMethod = (HandlerMethod ) handler ; - Menu menu = handlerMethod.getMethod().getAnnotation(Menu.class) ; - if(user != null || (menu!=null && menu.access()) || handlerMethod.getBean() instanceof BasicErrorController){ - filter = true; - } - - if(!filter){ - response.sendRedirect("/login.html"); - } - }else { - filter =true ; - } - return filter ; - } - - public void postHandle(HttpServletRequest arg0, HttpServletResponse response, Object arg2, - ModelAndView view) throws Exception { - User user = (User) arg0.getSession().getAttribute(MainContext.USER_SESSION_NAME) ; - String infoace = (String) arg0.getSession().getAttribute(MainContext.UKEFU_SYSTEM_INFOACQ) ; //进入信息采集模式 - SystemConfig systemConfig = MainUtils.getSystemConfig(); - if( view!=null){ - if(user!=null){ - view.addObject("user", user) ; - - if(systemConfig!=null && systemConfig.isEnablessl()) { - view.addObject("schema","https") ; - if(arg0.getServerPort() == 80) { - view.addObject("port", 443) ; - }else { - view.addObject("port", arg0.getServerPort()) ; - } - }else { - view.addObject("schema",arg0.getScheme()) ; - view.addObject("port",arg0.getServerPort()) ; - } - view.addObject("hostname",arg0.getServerName()) ; - - HandlerMethod handlerMethod = (HandlerMethod ) arg2 ; - Menu menu = handlerMethod.getMethod().getAnnotation(Menu.class) ; - if(menu!=null){ - view.addObject("subtype", menu.subtype()) ; - view.addObject("maintype", menu.type()) ; - view.addObject("typename", menu.name()) ; - } - view.addObject("orgi", user.getOrgi()) ; - } - if(!StringUtils.isBlank(infoace)){ - view.addObject("infoace", infoace) ; //进入信息采集模式 - } - view.addObject("webimport", MainContext.getWebIMPort()) ; - view.addObject("sessionid", MainUtils.getContextID(arg0.getSession().getId())) ; - - view.addObject("models", MainContext.model) ; - - if(user!=null){ - view.addObject("agentStatusReport", AutomaticServiceDist.getAgentReport(user.getOrgi())) ; - } - /** - * WebIM共享用户 - */ - User imUser = (User) arg0.getSession().getAttribute(MainContext.IM_USER_SESSION_NAME) ; - if(imUser == null && view!=null){ - imUser = new User(); - imUser.setUsername(MainContext.GUEST_USER) ; - imUser.setId(MainUtils.getContextID(arg0.getSession(true).getId())) ; - imUser.setSessionid(imUser.getId()) ; - view.addObject("imuser", imUser) ; - } - - if(arg0.getParameter("msg") != null){ - view.addObject("msg", arg0.getParameter("msg")) ; - } - view.addObject("uKeFuDic", UKeFuDic.getInstance()) ; //处理系统 字典数据 , 通过 字典code 获取 - - view.addObject("uKeFuSecField", CacheHelper.getSystemCacheBean().getCacheObject(MainContext.UKEFU_SYSTEM_SECFIELD, MainContext.SYSTEM_ORGI)) ; //处理系统 需要隐藏号码的字段, 启动的时候加载 - - if(systemConfig != null){ - view.addObject("systemConfig", systemConfig) ; - }else{ - view.addObject("systemConfig", new SystemConfig()) ; - } - view.addObject("tagTypeList", UKeFuDic.getInstance().getDic("com.dic.tag.type")) ; - - view.addObject("advTypeList", UKeFuDic.getInstance().getDic("com.dic.adv.type")) ; - - Logger logger = LogManager.getLogger("com.chatopera.cc.app.handler.apps.internet.UCKeFuWeiXinController") ; - if(logger!=null && logger.getLevel() != null){ - systemConfig.setLoglevel(logger.getLevel().toString()); - } - view.addObject("ip", arg0.getRemoteAddr()) ; - } - } - - public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) - throws Exception { - } - -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/model/AgentReport.java b/contact-center/app/src/main/java/com/chatopera/cc/app/model/AgentReport.java deleted file mode 100644 index 5cb7ebb9..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/model/AgentReport.java +++ /dev/null @@ -1,146 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.model; - -import java.text.SimpleDateFormat; -import java.util.Date; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.Table; - -import com.chatopera.cc.app.basic.MainUtils; -import org.hibernate.annotations.GenericGenerator; - -@Entity -@Table(name = "uk_webim_monitor") -@org.hibernate.annotations.Proxy(lazy = false) -public class AgentReport implements java.io.Serializable{ - - /** - * - */ - private static final long serialVersionUID = 5931219598388385394L; - - private String id ; - private Date createtime = new Date(); - private int agents ; //坐席数量 - private int users ; //服务中的用户 - private int inquene ; //队列中的用户 - private int busy ; //队列中忙的坐席 - private String orgi; - - private String worktype ; - private String workresult ; - private String dataid ; - - private String datestr = MainUtils.simpleDateFormat.format(new Date()); - private String hourstr = new SimpleDateFormat("HH").format(new Date()); - private String datehourstr = new SimpleDateFormat("yyyy-MM-dd HH").format(new Date()); - public String getOrgi() { - return orgi; - } - public void setOrgi(String orgi) { - this.orgi = orgi; - } - private String type = "status"; //坐席状态 - - public int getAgents() { - return agents; - } - public void setAgents(int agents) { - this.agents = agents; - } - public int getUsers() { - return users; - } - public void setUsers(int users) { - this.users = users; - } - public int getInquene() { - return inquene; - } - public void setInquene(int inquene) { - this.inquene = inquene; - } - public String getType() { - return type; - } - public void setType(String type) { - this.type = type; - } - public int getBusy() { - return busy; - } - public void setBusy(int busy) { - this.busy = busy; - } - @Id - @Column(length = 32) - @GeneratedValue(generator = "system-uuid") - @GenericGenerator(name = "system-uuid", strategy = "uuid") - public String getId() { - return id; - } - public void setId(String id) { - this.id = id; - } - public Date getCreatetime() { - return createtime; - } - public void setCreatetime(Date createtime) { - this.createtime = createtime; - } - public String getDatestr() { - return datestr; - } - public void setDatestr(String datestr) { - this.datestr = datestr; - } - public String getHourstr() { - return hourstr; - } - public void setHourstr(String hourstr) { - this.hourstr = hourstr; - } - public String getDatehourstr() { - return datehourstr; - } - public void setDatehourstr(String datehourstr) { - this.datehourstr = datehourstr; - } - public String getWorktype() { - return worktype; - } - public void setWorktype(String worktype) { - this.worktype = worktype; - } - public String getWorkresult() { - return workresult; - } - public void setWorkresult(String workresult) { - this.workresult = workresult; - } - public String getDataid() { - return dataid; - } - public void setDataid(String dataid) { - this.dataid = dataid; - } -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/model/AgentStatus.java b/contact-center/app/src/main/java/com/chatopera/cc/app/model/AgentStatus.java deleted file mode 100644 index e0ab9d85..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/model/AgentStatus.java +++ /dev/null @@ -1,216 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.model; - -import java.util.Date; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.Table; -import javax.persistence.Transient; - -import com.chatopera.cc.app.basic.MainContext; -import org.apache.commons.lang3.StringUtils; -import org.hibernate.annotations.GenericGenerator; - -import com.chatopera.cc.app.algorithm.AutomaticServiceDist; - -@Entity -@Table(name = "uk_agentstatus") -@org.hibernate.annotations.Proxy(lazy = false) -public class AgentStatus implements java.io.Serializable , Comparable{ - - /** - * - */ - private static final long serialVersionUID = 5883426846142132613L; - - private String id ; //坐席ID - private String agentno ; //坐席号码 - private Date logindate ; //登陆时间 - private String status = MainContext.AgentStatusEnum.NOTREADY.toString() ; //坐席状态 - private String orgi ; //租户ID - private String agentserviceid ; //会话ID - private int serusernum = 10 ; //最大服务用户数量 - private String skill ; //接入的 技能组ID - - private boolean busy ; //是否忙 - - private Date createtime = new Date(); - private String skillname ; //接入的技能组 名称 - private int users ; //已接入的 用户数量 - @SuppressWarnings("unused") - private int maxusers; //最大允许接入的用户数量 - @SuppressWarnings("unused") - private int initmaxusers; //最大允许接入的用户数量 - private boolean pulluser ; //是否允许坐席自己拉取用户 - private String username ; //坐席用户名 - private String name ; //坐席姓名 - - private Date updatetime ; //最后一次状态更新时间,通常是 坐席 接入新客户的时候更新 - - private String workstatus ; //工作状态 , 坐席的工作状态,计算绩效用 , 示忙、示闲对应的更详细的 工作状态 - - private String userid ; - @Id - @Column(length = 32) - @GeneratedValue(generator = "system-uuid") - @GenericGenerator(name = "system-uuid", strategy = "uuid") - public String getId() { - return id; - } - public void setId(String id) { - this.id = id; - } - public String getAgentno() { - return agentno; - } - public void setAgentno(String agentno) { - this.agentno = agentno; - } - public Date getLogindate() { - return logindate; - } - public void setLogindate(Date logindate) { - this.logindate = logindate; - } - public String getStatus() { - return status; - } - public void setStatus(String status) { - this.status = status; - } - public String getOrgi() { - return orgi; - } - public void setOrgi(String orgi) { - this.orgi = orgi; - } - public String getAgentserviceid() { - return agentserviceid; - } - public void setAgentserviceid(String agentserviceid) { - this.agentserviceid = agentserviceid; - } - public int getSerusernum() { - return serusernum; - } - public void setSerusernum(int serusernum) { - this.serusernum = serusernum; - } - public String getUserid() { - return userid; - } - public void setUserid(String userid) { - this.userid = userid; - } - public String getSkill() { - return skill; - } - public void setSkill(String skill) { - this.skill = skill; - } - public String getSkillname() { - return skillname; - } - public void setSkillname(String skillname) { - this.skillname = skillname; - } - public int getUsers() { - return users; - } - public void setUsers(int users) { - this.users = users; - } - public Date getCreatetime() { - return createtime; - } - public void setCreatetime(Date createtime) { - this.createtime = createtime; - } - @Transient - public int getMaxusers() { - SessionConfig sessionConfig = AutomaticServiceDist.initSessionConfig(this.orgi) ; - return sessionConfig!=null ? sessionConfig.getMaxuser() : MainContext.AGENT_STATUS_MAX_USER ; - } - public void setMaxusers(int maxusers) { - this.maxusers = maxusers; - } - @Transient - public int getInitmaxusers() { - SessionConfig sessionConfig = AutomaticServiceDist.initSessionConfig(this.orgi) ; - return sessionConfig!=null ? sessionConfig.getInitmaxuser() : getMaxusers(); - } - public void setInitmaxusers(int initmaxusers) { - this.initmaxusers = initmaxusers; - } - public boolean isPulluser() { - return pulluser; - } - public void setPulluser(boolean pulluser) { - this.pulluser = pulluser; - } - public Date getUpdatetime() { - return updatetime; - } - public void setUpdatetime(Date updatetime) { - this.updatetime = updatetime; - } - public String getUsername() { - return username; - } - public void setUsername(String username) { - this.username = username; - } - public String getName() { - return name; - } - public void setName(String name) { - this.name = name; - } - @Override - public int compareTo(AgentStatus o) { - int retValue = 0 ; - SessionConfig sessionConfig = AutomaticServiceDist.initSessionConfig(this.orgi) ; - if(sessionConfig!=null && !StringUtils.isBlank(sessionConfig.getDistribution()) && sessionConfig.getDistribution().equals("0")) { - if(this.getUpdatetime()!=null && o.getUpdatetime()!=null) { - retValue = (int) (this.getUpdatetime().getTime() - o.getUpdatetime().getTime()); - }else if(o.getUpdatetime()!=null) { - retValue = -1; - }else { - retValue = 1; - } - }else { - retValue = this.users - o.users ; - } - return retValue; - } - public boolean isBusy() { - return busy; - } - public void setBusy(boolean busy) { - this.busy = busy; - } - public String getWorkstatus() { - return workstatus; - } - public void setWorkstatus(String workstatus) { - this.workstatus = workstatus; - } -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/model/AiUser.java b/contact-center/app/src/main/java/com/chatopera/cc/app/model/AiUser.java deleted file mode 100644 index 99e8e2a7..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/model/AiUser.java +++ /dev/null @@ -1,231 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.model; - -import com.chatopera.cc.util.IP; - -public class AiUser implements java.io.Serializable{ - /** - * - */ - private static final long serialVersionUID = 1L; - private String id ; - private String userid ; - private long time ; - private IP ipdata ; - private String orgi; - private String agentserviceid ; - private String sessionid ; - - private String contextid ; - private String appid ; - private String channel ; - private String username ; - private String aiid ; - - private String busstype ; - private String aitype ; - private String bussid ; - private String dataid ; - private boolean bussend; - - private int userask ; //访客提问数量 - private boolean agent ; //直接转人工 - - private int timeoutnums ; //超时次数 - private int retimes ; //重复次数 - private int errortimes ; //错误次数 - - public AiUser(String id , String userid, long time,String orgi , IP ipdata){ - this.id = id.replace("-", "") ; - this.userid = userid ; - this.time = time ; - this.ipdata = ipdata ; - this.orgi = orgi; - } - - public String getOrgi() { - return orgi; - } - - public void setOrgi(String orgi) { - this.orgi = orgi; - } - - public String getId() { - return id; - } - public void setId(String id) { - this.id = id; - } - public long getTime() { - return time; - } - public void setTime(long time) { - this.time = time; - } - public String getUserid() { - return userid; - } - public void setUserid(String userid) { - this.userid = userid; - } - - public IP getIpdata() { - return ipdata; - } - - public void setIpdata(IP ipdata) { - this.ipdata = ipdata; - } - - public String getAgentserviceid() { - return agentserviceid; - } - - public void setAgentserviceid(String agentserviceid) { - this.agentserviceid = agentserviceid; - } - - public String getSessionid() { - return sessionid; - } - - public void setSessionid(String sessionid) { - this.sessionid = sessionid; - } - - public int getUserask() { - return userask; - } - - public void setUserask(int userask) { - this.userask = userask; - } - - public boolean isAgent() { - return agent; - } - - public void setAgent(boolean agent) { - this.agent = agent; - } - - public String getAppid() { - return appid; - } - - public void setAppid(String appid) { - this.appid = appid; - } - - public String getAiid() { - return aiid; - } - - public void setAiid(String aiid) { - this.aiid = aiid; - } - - public String getChannel() { - return channel; - } - - public void setChannel(String channel) { - this.channel = channel; - } - - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } - - public String getContextid() { - return contextid; - } - - public void setContextid(String contextid) { - this.contextid = contextid; - } - - public String getBusstype() { - return busstype; - } - - public void setBusstype(String busstype) { - this.busstype = busstype; - } - - public String getAitype() { - return aitype; - } - - public void setAitype(String aitype) { - this.aitype = aitype; - } - - public String getBussid() { - return bussid; - } - - public void setBussid(String bussid) { - this.bussid = bussid; - } - - public String getDataid() { - return dataid; - } - - public void setDataid(String dataid) { - this.dataid = dataid; - } - - public boolean isBussend() { - return bussend; - } - - public void setBussend(boolean bussend) { - this.bussend = bussend; - } - - public int getTimeoutnums() { - return timeoutnums; - } - - public void setTimeoutnums(int timeoutnums) { - this.timeoutnums = timeoutnums; - } - - public int getRetimes() { - return retimes; - } - - public void setRetimes(int retimes) { - this.retimes = retimes; - } - - public int getErrortimes() { - return errortimes; - } - - public void setErrortimes(int errortimes) { - this.errortimes = errortimes; - } -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/model/InviteRecord.java b/contact-center/app/src/main/java/com/chatopera/cc/app/model/InviteRecord.java deleted file mode 100644 index 9f5f3d43..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/model/InviteRecord.java +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.chatopera.cc.app.model; - -import java.util.Date; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.Table; - -import org.hibernate.annotations.GenericGenerator; - -import com.chatopera.cc.app.basic.MainContext; - -@Entity -@Table(name = "uk_inviterecord") -@org.hibernate.annotations.Proxy(lazy = false) -public class InviteRecord { - private String id ; - private String orgi ; - private String userid ; - private String title ; - private String traceid ; - private String url ; - private String appid ; - private String agentno ; - private Date createtime = new Date(); - private Date updatetime ; - private String result = MainContext.OnlineUserInviteStatus.DEFAULT.toString(); //邀请结果, 拒绝 /接受 - private int responsetime ; //响应时间 - - @Id - @Column(length = 32) - @GeneratedValue(generator = "system-uuid") - @GenericGenerator(name = "system-uuid", strategy = "uuid") - public String getId() { - return id; - } - public void setId(String id) { - this.id = id; - } - public String getOrgi() { - return orgi; - } - public void setOrgi(String orgi) { - this.orgi = orgi; - } - public String getUserid() { - return userid; - } - public void setUserid(String userid) { - this.userid = userid; - } - public String getAgentno() { - return agentno; - } - public void setAgentno(String agentno) { - this.agentno = agentno; - } - public Date getCreatetime() { - return createtime; - } - public void setCreatetime(Date createtime) { - this.createtime = createtime; - } - public String getResult() { - return result; - } - public void setResult(String result) { - this.result = result; - } - public int getResponsetime() { - return responsetime; - } - public void setResponsetime(int responsetime) { - this.responsetime = responsetime; - } - public Date getUpdatetime() { - return updatetime; - } - public void setUpdatetime(Date updatetime) { - this.updatetime = updatetime; - } - public String getAppid() { - return appid; - } - public void setAppid(String appid) { - this.appid = appid; - } - public String getTitle() { - return title; - } - public void setTitle(String title) { - this.title = title; - } - public String getTraceid() { - return traceid; - } - public void setTraceid(String traceid) { - this.traceid = traceid; - } - public String getUrl() { - return url; - } - public void setUrl(String url) { - this.url = url; - } -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/model/JobDetail.java b/contact-center/app/src/main/java/com/chatopera/cc/app/model/JobDetail.java deleted file mode 100644 index f6c07a62..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/model/JobDetail.java +++ /dev/null @@ -1,823 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -package com.chatopera.cc.app.model; - -import java.io.Serializable; -import java.util.Date; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.Table; -import javax.persistence.Transient; - -import org.hibernate.annotations.GenericGenerator; - -/** - * 批次表,导入批次 - * @author iceworld - * - */ -@Entity -@Table(name = "uk_jobdetail") -@org.hibernate.annotations.Proxy(lazy = false) -public class JobDetail implements Serializable{ - - /** - * - */ - private static final long serialVersionUID = -2258870729818431384L; - - private String id ; - - private String orgi ; //租户ID - private String organ ; //创建部门 - private String creater ; //创建人 - private String batchtype ; //导入类型(计划批次/临时批次) - private String imptype ; //导入方式:本地文件导入/远程文件导入/数据库导入/手动上传导入 - - private String actype ; //活动类型 - private String filterid ; //筛选表单ID - - private String parentid ; //目录ID - - private int threads ; //并发限制 - - private String impurl ; - private String filetype ; - private String dbtype ; //数据库类型 - private String jdbcurl ; - private String driverclazz ; - private String username ; - private String password ; - - private String clazz ; //结算表的时候,危险操作提示 - private String taskid ; //任务目标id - private String tasktype ; //table 模型任务 、report报表计划任务 - private boolean plantask; // true后台任务,false交互式任务 - private String source ; //File source eg:e:\document - private String userid; //schedule user - private String email; - private String nickname; - private String crawltaskid ;//用来标记是手动点击的还是到了执行时间执行的,手动:operation,自动:auto或null - private long lastindex = 0 ; - private String dataid;//为了在状态中检索,存放了报表的id集合 - private String dicid;//存放了报表所在目录 - - private Date taskfiretime ; - private String crawltask ; - private String targettask ; - private boolean createtable; - private String taskstatus = "0"; - private long startindex ; //数据更新位置 - private Date lastdate ; //数据更新时间 - private Date nextfiretime ; //数据更新时间 - private String cronexp ; - private boolean fetcher = true ; - private boolean pause = false; - private boolean plantaskreadtorun = false ; - - private boolean mapping ; //是否已经映射数据结构 - - - private String memo ; //任务类型,如果是 cubedata , 则在执行完毕后更新cube信息 , 导出任务时改变用处,用于导出是的 导出格式 - private long fetchSize ; - private String usearea ; //启用分区采集 , 改变用处,在 导出文件的时候,用于记录当前导出的 数据集的 total - private String areafield ; //分区字段 - private String areafieldtype ; //字段类型 - private String arearule ; //分区递增规则 - private String minareavalue ; //最小值 - private String maxareavalue ; //最大值 - private String formatstr ; //格式化字符串 - private String taskinfo; //序列化以后的结果,JSON格式 - private int priority; //优先级 - private String runserver ; //执行此任务的 服务器 - - private String actid ; //元数据ID - private String distype ; //名单分配方式 - private String distpolicy ; //分配策略 - private int policynum ; //策略数量 - private String busstype ; //业务类型 - - private int disnum ; //默认分配数量 - - private String siptrunk ; //线路资源 - private String province ; //线路省份 - private String city ; //线路地区 - private boolean prefix ; //异地号码加拨前缀 0 - - private Date createtime = new Date(); //创建时间 - - private Date updatetime = new Date(); - - private String datastatus; //数据状态(逻辑删除) - private String status ; //状态 正常,已处理完,已过期 - - private int namenum ; //名单总数 - private int validnum ; //有效名单 - private int invalidnum ; //无效名单 - - private int execnum ; //执行次数 - - private int assigned ; //已分配 - private int notassigned; //未分配 - private String description ; //备注 - - private String execmd ; //执行的指令:分配|回收 - private String exectype; //回收的类型 - private String exectarget; //回收的对象 - - private String execto ; //回收到部门对象 - - private String reportid ; //当前正在执行的 ReportID - - private String name; //导入的批次名称 , 自动生成, 规则为 yyyyMMdd--ORDER - - @Transient - private String exceptionMsg = null; - - @Transient - private Reporter report ; - - @Id - @Column(length = 32) - @GeneratedValue(generator = "system-uuid") - @GenericGenerator(name = "system-uuid", strategy = "uuid") - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getOrgi() { - return orgi; - } - - public void setOrgi(String orgi) { - this.orgi = orgi; - } - - public String getOrgan() { - return organ; - } - - public void setOrgan(String organ) { - this.organ = organ; - } - public String getCreater() { - return creater; - } - - public void setCreater(String creater) { - this.creater = creater; - } - public String getBatchtype() { - return batchtype; - } - - public void setBatchtype(String batchtype) { - this.batchtype = batchtype; - } - - public String getImptype() { - return imptype; - } - - public void setImptype(String imptype) { - this.imptype = imptype; - } - - public String getImpurl() { - return impurl; - } - - public void setImpurl(String impurl) { - this.impurl = impurl; - } - - public String getFiletype() { - return filetype; - } - - public void setFiletype(String filetype) { - this.filetype = filetype; - } - - public String getDbtype() { - return dbtype; - } - - public void setDbtype(String dbtype) { - this.dbtype = dbtype; - } - - public String getJdbcurl() { - return jdbcurl; - } - - public void setJdbcurl(String jdbcurl) { - this.jdbcurl = jdbcurl; - } - - public String getDriverclazz() { - return driverclazz; - } - - public void setDriverclazz(String driverclazz) { - this.driverclazz = driverclazz; - } - - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } - - public String getPassword() { - return password; - } - - public void setPassword(String password) { - this.password = password; - } - - public Date getCreatetime() { - return createtime; - } - - public void setCreatetime(Date createtime) { - this.createtime = createtime; - } - - public Date getUpdatetime() { - return updatetime; - } - - public void setUpdatetime(Date updatetime) { - this.updatetime = updatetime; - } - - public String getDatastatus() { - return datastatus; - } - - public void setDatastatus(String datastatus) { - this.datastatus = datastatus; - } - - public String getStatus() { - return status; - } - - public void setStatus(String status) { - this.status = status; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public int getNamenum() { - return namenum; - } - - public void setNamenum(int namenum) { - this.namenum = namenum; - } - - public int getValidnum() { - return validnum; - } - - public void setValidnum(int validnum) { - this.validnum = validnum; - } - - public int getInvalidnum() { - return invalidnum; - } - - public void setInvalidnum(int invalidnum) { - this.invalidnum = invalidnum; - } - - public int getAssigned() { - return assigned; - } - - public void setAssigned(int assigned) { - this.assigned = assigned; - } - - public int getNotassigned() { - return notassigned; - } - - public void setNotassigned(int notassigned) { - this.notassigned = notassigned; - } - - public String getActid() { - return actid; - } - - public void setActid(String actid) { - this.actid = actid; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - public int getExecnum() { - return execnum; - } - - public void setExecnum(int execnum) { - this.execnum = execnum; - } - - public String getParentid() { - return parentid; - } - - public void setParentid(String parentid) { - this.parentid = parentid; - } - - public String getClazz() { - return clazz; - } - - public void setClazz(String clazz) { - this.clazz = clazz; - } - - public String getTaskid() { - return taskid; - } - - public void setTaskid(String taskid) { - this.taskid = taskid; - } - - public String getTasktype() { - return tasktype; - } - - public void setTasktype(String tasktype) { - this.tasktype = tasktype; - } - - public boolean isPlantask() { - return plantask; - } - - public void setPlantask(boolean plantask) { - this.plantask = plantask; - } - - public String getSource() { - return source; - } - - public void setSource(String source) { - this.source = source; - } - - public String getUserid() { - return userid; - } - - public void setUserid(String userid) { - this.userid = userid; - } - - public String getEmail() { - return email; - } - - public void setEmail(String email) { - this.email = email; - } - - public String getNickname() { - return nickname; - } - - public void setNickname(String nickname) { - this.nickname = nickname; - } - - public String getCrawltaskid() { - return crawltaskid; - } - - public void setCrawltaskid(String crawltaskid) { - this.crawltaskid = crawltaskid; - } - - public long getLastindex() { - return lastindex; - } - - public void setLastindex(long lastindex) { - this.lastindex = lastindex; - } - - public String getDataid() { - return dataid; - } - - public void setDataid(String dataid) { - this.dataid = dataid; - } - - public String getDicid() { - return dicid; - } - - public void setDicid(String dicid) { - this.dicid = dicid; - } - - public Date getTaskfiretime() { - return taskfiretime; - } - - public void setTaskfiretime(Date taskfiretime) { - this.taskfiretime = taskfiretime; - } - - public String getCrawltask() { - return crawltask; - } - - public void setCrawltask(String crawltask) { - this.crawltask = crawltask; - } - - public String getTargettask() { - return targettask; - } - - public void setTargettask(String targettask) { - this.targettask = targettask; - } - - public boolean isCreatetable() { - return createtable; - } - - public void setCreatetable(boolean createtable) { - this.createtable = createtable; - } - - public String getTaskstatus() { - return taskstatus; - } - - public void setTaskstatus(String taskstatus) { - this.taskstatus = taskstatus; - } - - public long getStartindex() { - return startindex; - } - - public void setStartindex(long startindex) { - this.startindex = startindex; - } - - public Date getLastdate() { - return lastdate; - } - - public void setLastdate(Date lastdate) { - this.lastdate = lastdate; - } - - public Date getNextfiretime() { - return nextfiretime; - } - - public void setNextfiretime(Date nextfiretime) { - this.nextfiretime = nextfiretime; - } - - public String getCronexp() { - return cronexp; - } - - public void setCronexp(String cronexp) { - this.cronexp = cronexp; - } - - public boolean isFetcher() { - return fetcher; - } - - public void setFetcher(boolean fetcher) { - this.fetcher = fetcher; - } - - public boolean isPause() { - return pause; - } - - public void setPause(boolean pause) { - this.pause = pause; - } - - public boolean isPlantaskreadtorun() { - return plantaskreadtorun; - } - - public void setPlantaskreadtorun(boolean plantaskreadtorun) { - this.plantaskreadtorun = plantaskreadtorun; - } - - public String getMemo() { - return memo; - } - - public void setMemo(String memo) { - this.memo = memo; - } - - public long getFetchSize() { - return fetchSize; - } - - public void setFetchSize(long fetchSize) { - this.fetchSize = fetchSize; - } - - public String getUsearea() { - return usearea; - } - - public void setUsearea(String usearea) { - this.usearea = usearea; - } - - public String getAreafield() { - return areafield; - } - - public void setAreafield(String areafield) { - this.areafield = areafield; - } - - public String getAreafieldtype() { - return areafieldtype; - } - - public void setAreafieldtype(String areafieldtype) { - this.areafieldtype = areafieldtype; - } - - public String getArearule() { - return arearule; - } - - public void setArearule(String arearule) { - this.arearule = arearule; - } - - public String getMinareavalue() { - return minareavalue; - } - - public void setMinareavalue(String minareavalue) { - this.minareavalue = minareavalue; - } - - public String getMaxareavalue() { - return maxareavalue; - } - - public void setMaxareavalue(String maxareavalue) { - this.maxareavalue = maxareavalue; - } - - public String getFormatstr() { - return formatstr; - } - - public void setFormatstr(String formatstr) { - this.formatstr = formatstr; - } - - public String getTaskinfo() { - return taskinfo; - } - - public void setTaskinfo(String taskinfo) { - this.taskinfo = taskinfo; - } - - public int getPriority() { - return priority; - } - - public void setPriority(int priority) { - this.priority = priority; - } - - public String getRunserver() { - return runserver; - } - - public void setRunserver(String runserver) { - this.runserver = runserver; - } - - public String getActype() { - return actype; - } - - public void setActype(String actype) { - this.actype = actype; - } - - public String getFilterid() { - return filterid; - } - - public void setFilterid(String filterid) { - this.filterid = filterid; - } - - public String getDistype() { - return distype; - } - - public void setDistype(String distype) { - this.distype = distype; - } - - public String getDistpolicy() { - return distpolicy; - } - - public void setDistpolicy(String distpolicy) { - this.distpolicy = distpolicy; - } - - public int getPolicynum() { - return policynum; - } - - public void setPolicynum(int policynum) { - this.policynum = policynum; - } - - public String getBusstype() { - return busstype; - } - - public void setBusstype(String busstype) { - this.busstype = busstype; - } - @Transient - public String getExceptionMsg() { - return exceptionMsg; - } - - public void setExceptionMsg(String exceptionMsg) { - this.exceptionMsg = exceptionMsg; - } - @Transient - public Reporter getReport() { - return report; - } - public void setReport(Reporter report) { - this.report = report; - } - - public String getExecmd() { - return execmd; - } - - public void setExecmd(String execmd) { - this.execmd = execmd; - } - - public int getDisnum() { - return disnum; - } - - public void setDisnum(int disnum) { - this.disnum = disnum; - } - - public String getExectarget() { - return exectarget; - } - - public void setExectarget(String exectarget) { - this.exectarget = exectarget; - } - - public String getExectype() { - return exectype; - } - - public void setExectype(String exectype) { - this.exectype = exectype; - } - - public String getExecto() { - return execto; - } - - public void setExecto(String execto) { - this.execto = execto; - } - - public int getThreads() { - return threads; - } - - public void setThreads(int threads) { - this.threads = threads; - } - - public String getSiptrunk() { - return siptrunk; - } - - public void setSiptrunk(String siptrunk) { - this.siptrunk = siptrunk; - } - - public String getProvince() { - return province; - } - - public void setProvince(String province) { - this.province = province; - } - - public String getCity() { - return city; - } - - public void setCity(String city) { - this.city = city; - } - - public boolean isPrefix() { - return prefix; - } - - public void setPrefix(boolean prefix) { - this.prefix = prefix; - } - - public String getReportid() { - return reportid; - } - - public void setReportid(String reportid) { - this.reportid = reportid; - } - - public boolean isMapping() { - return mapping; - } - - public void setMapping(boolean mapping) { - this.mapping = mapping; - } -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/model/Log.java b/contact-center/app/src/main/java/com/chatopera/cc/app/model/Log.java deleted file mode 100644 index 73c7ac12..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/model/Log.java +++ /dev/null @@ -1,237 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.chatopera.cc.app.model; - -import java.io.Serializable; -import java.util.Date; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.Table; - -import org.hibernate.annotations.GenericGenerator; - -@Entity -@Table(name = "uk_log") -@org.hibernate.annotations.Proxy(lazy = false) -public class Log implements Serializable{ - - /** - * - */ - private static final long serialVersionUID = 4749028407912157882L; - private String id ; - private String orgi; - private String flowid; - private String logtype ; - private Date createdate ; - private String msg; - private String levels ; - private String thread ; - private String clazz ; - private String files ; - private String linenumber ; - private String method ; - private String startid ; - private String errorinfo ; - private String triggerwarning = "false"; - private String triggertime ; - private int triggertimes ; - private String logtime ; - - private String name; //备用字段 - private String code ; //备用字段 - private String userid; //备用字段 - private String username; //备用字段 - private String memo ; //备用字段 - private String ipaddr; //ip - private String port ; - public Log(){} - public Log(String orgi , String flowid , String msg,String levels , String thread){ - this.id = String.valueOf(System.nanoTime()) ; - this.orgi = orgi ; - this.flowid = flowid ; - this.createdate = new Date(); - this.msg = msg ; - this.levels = levels; - this.thread = thread ; - } - /** - * @return the id - */ - @Id - @Column(length = 32) - @GeneratedValue(generator = "system-uuid") - @GenericGenerator(name = "system-uuid", strategy = "uuid") - public String getId() { - return id; - } - public void setId(String id) { - this.id = id; - } - public String getOrgi() { - return orgi; - } - public void setOrgi(String orgi) { - this.orgi = orgi; - } - public String getFlowid() { - return flowid; - } - public void setFlowid(String flowid) { - this.flowid = flowid; - } - - public Date getCreatedate() { - return createdate; - } - public void setCreatedate(Date createdate) { - this.createdate = createdate; - } - public String getMsg() { - return msg ; - } - public void setMsg(String msg) { - this.msg = msg; - } - public String getLevels() { - return levels; - } - public void setLevels(String levels) { - this.levels = levels; - } - public String getThread() { - return thread; - } - public void setThread(String thread) { - this.thread = thread; - } - public String getClazz() { - return clazz; - } - public void setClazz(String clazz) { - this.clazz = clazz; - } - public String getFiles() { - return files; - } - public void setFiles(String files) { - this.files = files; - } - public String getLinenumber() { - return linenumber; - } - public void setLinenumber(String linenumber) { - this.linenumber = linenumber; - } - public String getMethod() { - return method; - } - public void setMethod(String method) { - if(method!=null && method.length() > 255){ - method = method.substring(0 , 255) ; - } - this.method = method; - } - public String getLogtype() { - return logtype; - } - public void setLogtype(String logtype) { - this.logtype = logtype; - } - public String getStartid() { - return startid; - } - public void setStartid(String startid) { - this.startid = startid; - } - public String getErrorinfo() { - return errorinfo; - } - public void setErrorinfo(String errorinfo) { - this.errorinfo = errorinfo; - } - public String getTriggerwarning() { - return triggerwarning; - } - public void setTriggerwarning(String triggerwarning) { - this.triggerwarning = triggerwarning; - } - public String getTriggertime() { - return triggertime; - } - public void setTriggertime(String triggertime) { - this.triggertime = triggertime; - } - public int getTriggertimes() { - return triggertimes; - } - public void setTriggertimes(int triggertimes) { - this.triggertimes = triggertimes; - } - 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 String getUserid() { - return userid; - } - public void setUserid(String userid) { - this.userid = userid; - } - public String getUsername() { - return username; - } - public void setUsername(String username) { - this.username = username; - } - public String getMemo() { - return memo; - } - public void setMemo(String memo) { - this.memo = memo; - } - public String getLogtime() { - return logtime; - } - public void setLogtime(String logtime) { - this.logtime = logtime; - } - public String getIpaddr() { - return ipaddr; - } - public void setIpaddr(String ipaddr) { - this.ipaddr = ipaddr; - } - public String getPort() { - return port; - } - public void setPort(String port) { - this.port = port; - } -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/model/MessageDataBean.java b/contact-center/app/src/main/java/com/chatopera/cc/app/model/MessageDataBean.java deleted file mode 100644 index 5749b4b5..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/model/MessageDataBean.java +++ /dev/null @@ -1,82 +0,0 @@ - -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.chatopera.cc.app.model; - - -public interface MessageDataBean { - - public String getId() ; - - public String getNickName(); - - - public String getOrgi() ; - - /** - * 对话的文本内容 - * @return - */ - public String getMessage() ; - - /** - * 消息类型 - * @return - */ - public String getMessageType() ; - - /** - * 来源用户 - * @return - */ - public String getFromUser() ; - - /** - * 目标用户 - * @return - */ - public String getToUser(); - /** - * 渠道信息 - * @return - */ - public SNSAccount getSnsAccount(); - /** - * 坐席用户信息 - * @return - */ - public AgentUser getAgentUser() ; - - /** - * 获取渠道来源的消息信息 - * @return - */ - public Object getChannelMessage() ; - - /** - * 渠道上对应的用户信息 - * @return - */ - public Object getUser(); - - - public void setContextid(String contextid) ; - - public String getContextid() ; - -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/model/MessageInContent.java b/contact-center/app/src/main/java/com/chatopera/cc/app/model/MessageInContent.java deleted file mode 100644 index d604dee2..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/model/MessageInContent.java +++ /dev/null @@ -1,199 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.chatopera.cc.app.model; - -import com.chatopera.cc.app.basic.MainContext; - - -public class MessageInContent implements MessageDataBean, java.io.Serializable { - - public String id; - private String nickName; - private String orgi; - private String message; - private String filename; - private int filesize; - private String messageType; - private String fromUser; - private String calltype = MainContext.CallTypeEnum.IN.toString(); - private String toUser; - private SNSAccount snsAccount; - private AgentUser agentUser; - private Object channelMessage; - private String agentserviceid; - - private String attachmentid; - - private boolean noagent; - - private Object user; - private String contextid; - private String createtime; - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getNickName() { - return nickName; - } - - public void setNickName(String nickName) { - this.nickName = nickName; - } - - public String getOrgi() { - return orgi; - } - - public void setOrgi(String orgi) { - this.orgi = orgi; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - public String getMessageType() { - return messageType; - } - - public void setMessageType(String messageType) { - this.messageType = messageType; - } - - public String getFromUser() { - return fromUser; - } - - public void setFromUser(String fromUser) { - this.fromUser = fromUser; - } - - public String getToUser() { - return toUser; - } - - public void setToUser(String toUser) { - this.toUser = toUser; - } - - public SNSAccount getSnsAccount() { - return snsAccount; - } - - public void setSnsAccount(SNSAccount snsAccount) { - this.snsAccount = snsAccount; - } - - public AgentUser getAgentUser() { - return agentUser; - } - - public void setAgentUser(AgentUser agentUser) { - this.agentUser = agentUser; - } - - public Object getChannelMessage() { - return channelMessage; - } - - public void setChannelMessage(Object channelMessage) { - this.channelMessage = channelMessage; - } - - public Object getUser() { - return user; - } - - public void setUser(Object user) { - this.user = user; - } - - public String getContextid() { - return contextid; - } - - public void setContextid(String contextid) { - this.contextid = contextid; - } - - public String getCalltype() { - return calltype; - } - - public void setCalltype(String calltype) { - this.calltype = calltype; - } - - public String getCreatetime() { - return createtime; - } - - public void setCreatetime(String createtime) { - this.createtime = createtime; - } - - public String getFilename() { - return filename; - } - - public void setFilename(String filename) { - this.filename = filename; - } - - public int getFilesize() { - return filesize; - } - - public void setFilesize(int filesize) { - this.filesize = filesize; - } - - public String getAgentserviceid() { - return agentserviceid; - } - - public void setAgentserviceid(String agentserviceid) { - this.agentserviceid = agentserviceid; - } - - public String getAttachmentid() { - return attachmentid; - } - - public void setAttachmentid(String attachmentid) { - this.attachmentid = attachmentid; - } - - public boolean isNoagent() { - return noagent; - } - - public void setNoagent(boolean noagent) { - this.noagent = noagent; - } -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/model/MessageOutContent.java b/contact-center/app/src/main/java/com/chatopera/cc/app/model/MessageOutContent.java deleted file mode 100644 index 6f9d2b6e..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/model/MessageOutContent.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -package com.chatopera.cc.app.model; - -import java.util.List; - -import com.chatopera.cc.app.im.message.OtherMessageItem; - -public class MessageOutContent extends MessageInContent{ - private List suggest = null ; - - public List getSuggest() { - return suggest; - } - - public void setSuggest(List suggest) { - this.suggest = suggest; - } -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/model/OnlineUser.java b/contact-center/app/src/main/java/com/chatopera/cc/app/model/OnlineUser.java deleted file mode 100644 index 565e2bf5..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/model/OnlineUser.java +++ /dev/null @@ -1,472 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.chatopera.cc.app.model; - -import java.util.Date; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.Table; -import javax.persistence.Transient; - -import com.chatopera.cc.exchange.UserEvent; -import org.hibernate.annotations.GenericGenerator; -import org.hibernate.annotations.Proxy; - -@Entity -@Table(name = "uk_onlineuser") -@Proxy(lazy = false) -public class OnlineUser implements UserEvent { - /** - * - */ - private static final long serialVersionUID = -5919027181023620097L; - private String creater; - private String datastatus; - private String id; - private String impid; - private String appid ; - private String ipcode; - private String orgi; - private String channel; - private String owner; - private String processid; - private String shares; - private Date updatetime = new Date(); - private String updateuser; - private String username; - private String wfstatus; - private String resolution; - private String opersystem; - - private String browser; - private String status; - private String userid; - private Date logintime; - private String sessionid; - private Date createtime = new Date(); - private String usertype; - private String optype; - private String mobile; - private String olduser; - private String ip; - private String hostname; - private String country; - private String region; - private String city; - private String isp; - private String province; - private int betweentime; - private String datestr; - private String keyword; - private String source; - private String title; - private String url; - private String useragent; - private String phone; - private String contactsid ; - - - private int invitetimes; // 邀请次数 - private String invitestatus; // 邀请状态 - private int refusetimes ; - - private Contacts contacts ; - - public String getCreater() { - return this.creater; - } - - public void setCreater(String creater) { - this.creater = creater; - } - - public String getDatastatus() { - return this.datastatus; - } - - public void setDatastatus(String datastatus) { - this.datastatus = datastatus; - } - - @Id - @Column(length = 32) - @GeneratedValue(generator = "system-uuid") - @GenericGenerator(name = "system-uuid", strategy = "assigned") - public String getId() { - return this.id; - } - - public void setId(String id) { - this.id = id; - } - - public String getImpid() { - return this.impid; - } - - public void setImpid(String impid) { - this.impid = impid; - } - - public String getIpcode() { - return this.ipcode; - } - - public void setIpcode(String ipcode) { - this.ipcode = ipcode; - } - - public String getOrgi() { - return this.orgi; - } - - public void setOrgi(String orgi) { - this.orgi = orgi; - } - - public String getOwner() { - return this.owner; - } - - public void setOwner(String owner) { - this.owner = owner; - } - - public String getProcessid() { - return this.processid; - } - - public void setProcessid(String processid) { - this.processid = processid; - } - - public String getShares() { - return this.shares; - } - - public void setShares(String shares) { - this.shares = shares; - } - - public String getUsername() { - return this.username; - } - - public void setUsername(String username) { - this.username = username; - } - - public String getWfstatus() { - return this.wfstatus; - } - - public void setWfstatus(String wfstatus) { - this.wfstatus = wfstatus; - } - - public String getResolution() { - return this.resolution; - } - - public void setResolution(String resolution) { - this.resolution = resolution; - } - - public String getIp() { - return this.ip; - } - - public void setIp(String ip) { - this.ip = ip; - } - - public String getHostname() { - return this.hostname; - } - - public void setHostname(String hostname) { - this.hostname = hostname; - } - - public String getBrowser() { - return this.browser; - } - - public void setBrowser(String browser) { - this.browser = browser; - } - - public String getStatus() { - return this.status; - } - - public void setStatus(String status) { - this.status = status; - } - - public Date getLogintime() { - return this.logintime; - } - - public void setLogintime(Date logintime) { - this.logintime = logintime; - } - - public String getSessionid() { - return this.sessionid; - } - - public void setSessionid(String sessionid) { - this.sessionid = sessionid; - } - - public Date getCreatetime() { - return this.createtime; - } - - public void setCreatetime(Date createtime) { - this.createtime = createtime; - } - - public String getUsertype() { - return this.usertype; - } - - public void setUsertype(String usertype) { - this.usertype = usertype; - } - - public String getOptype() { - return this.optype; - } - - public void setOptype(String optype) { - this.optype = optype; - } - - public String getMobile() { - return this.mobile; - } - - public void setMobile(String mobile) { - this.mobile = mobile; - } - - public String getOlduser() { - return this.olduser; - } - - public void setOlduser(String olduser) { - this.olduser = olduser; - } - - public String getCountry() { - return this.country; - } - - public void setCountry(String country) { - this.country = country; - } - - public String getRegion() { - return this.region; - } - - public void setRegion(String region) { - this.region = region; - } - - public String getCity() { - return this.city; - } - - public void setCity(String city) { - this.city = city; - } - - public String getIsp() { - return this.isp; - } - - public void setIsp(String isp) { - this.isp = isp; - } - - public String getProvince() { - return this.province; - } - - public void setProvince(String province) { - this.province = province; - } - - public String getDatestr() { - return this.datestr; - } - - public void setDatestr(String datestr) { - this.datestr = datestr; - } - - public String getKeyword() { - return this.keyword; - } - - public void setKeyword(String keyword) { - this.keyword = keyword; - } - - public String getSource() { - return this.source; - } - - public void setSource(String source) { - this.source = source; - } - - public String getTitle() { - return this.title; - } - - public void setTitle(String title) { - this.title = title; - } - - public String getUrl() { - return this.url; - } - - public void setUrl(String url) { - this.url = url; - } - - public String getUseragent() { - return this.useragent; - } - - public void setUseragent(String useragent) { - this.useragent = useragent; - } - - public Date getUpdatetime() { - return this.updatetime; - } - - public void setUpdatetime(Date updatetime) { - this.updatetime = updatetime; - } - - public String getUpdateuser() { - return this.updateuser; - } - - public void setUpdateuser(String updateuser) { - this.updateuser = updateuser; - } - - public String getOpersystem() { - return this.opersystem; - } - - public void setOpersystem(String opersystem) { - this.opersystem = opersystem; - } - - public String getUserid() { - return this.userid; - } - - public void setUserid(String userid) { - this.userid = userid; - } - - public int getBetweentime() { - return this.betweentime; - } - - public void setBetweentime(int betweentime) { - this.betweentime = betweentime; - } - - public int getInvitetimes() { - return invitetimes; - } - - public void setInvitetimes(int invitetimes) { - this.invitetimes = invitetimes; - } - - public String getInvitestatus() { - return invitestatus; - } - - public void setInvitestatus(String invitestatus) { - this.invitestatus = invitestatus; - } - - public int getRefusetimes() { - return refusetimes; - } - - public void setRefusetimes(int refusetimes) { - this.refusetimes = refusetimes; - } - - public String getChannel() { - return channel; - } - - public void setChannel(String channel) { - this.channel = channel; - } - - public String getAppid() { - return appid; - } - - public void setAppid(String appid) { - this.appid = appid; - } - - public String getContactsid() { - return contactsid; - } - - public void setContactsid(String contactsid) { - this.contactsid = contactsid; - } - @Transient - public Contacts getContacts() { - return contacts; - } - - public void setContacts(Contacts contacts) { - this.contacts = contacts; - } - - public String getPhone() { - return phone; - } - - public void setPhone(String phone) { - this.phone = phone; - } -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/model/Organ.java b/contact-center/app/src/main/java/com/chatopera/cc/app/model/Organ.java deleted file mode 100644 index af90c645..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/model/Organ.java +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.chatopera.cc.app.model; - -import java.util.Date; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.Table; - -import org.hibernate.annotations.GenericGenerator; - -@Entity -@Table(name = "uk_organ") -@org.hibernate.annotations.Proxy(lazy = false) -public class Organ implements java.io.Serializable{ - - /** - * - */ - private static final long serialVersionUID = 1115593425069549681L; - - private String id ; - private String name ; - private String code ; - private String parent ; - private Date createtime ; - private String creater; - private boolean skill ; - private String area ; - private String username ; - private Date updatetime ; - private String orgi ; - private String orgid ; //企业ID - - @Id - @Column(length = 32) - @GeneratedValue(generator = "system-uuid") - @GenericGenerator(name = "system-uuid", strategy = "uuid") - public String getId() { - return id; - } - public void setId(String 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 String getCreater() { - return creater; - } - public void setCreater(String creater) { - this.creater = creater; - } - public String getUsername() { - return username; - } - public void setUsername(String username) { - this.username = username; - } - public String getOrgi() { - return orgi; - } - public void setOrgi(String orgi) { - this.orgi = orgi; - } - public Date getCreatetime() { - return createtime; - } - public void setCreatetime(Date createtime) { - this.createtime = createtime; - } - public Date getUpdatetime() { - return updatetime; - } - public void setUpdatetime(Date updatetime) { - this.updatetime = updatetime; - } - public String getParent() { - return parent; - } - public void setParent(String parent) { - this.parent = parent; - } - public boolean isSkill() { - return skill; - } - public void setSkill(boolean skill) { - this.skill = skill; - } - public String getArea() { - return area; - } - public void setArea(String area) { - this.area = area; - } - public String getOrgid() { - return orgid; - } - public void setOrgid(String orgid) { - this.orgid = orgid; - } -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/model/Organization.java b/contact-center/app/src/main/java/com/chatopera/cc/app/model/Organization.java deleted file mode 100644 index 6c9ea604..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/model/Organization.java +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -package com.chatopera.cc.app.model; - -import java.util.Date; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.Table; - -import org.hibernate.annotations.GenericGenerator; - -/** - * @author ricy Tenant.java 2010-3-17 - * - */ -@Entity -@Table(name = "uk_organization") -@org.hibernate.annotations.Proxy(lazy = false) -public class Organization implements java.io.Serializable{ - /** - * - */ - private static final long serialVersionUID = 1L; - - private String id ; - private String name; - private String code; - private String orgtype ; //机构类型 - private String orgscale;//规模 - private String orgindustry;//行业 - private Date createtime = new Date();//创建时间 - private String logo ; - private String memo ;// - - - @Id - @Column(length = 32) - @GeneratedValue(generator = "system-uuid") - @GenericGenerator(name = "system-uuid", strategy = "uuid") - public String getId() { - return id; - } - public void setId(String 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 String getOrgtype() { - return orgtype; - } - public void setOrgtype(String orgtype) { - this.orgtype = orgtype; - } - public Date getCreatetime() { - return createtime; - } - public void setCreatetime(Date createtime) { - this.createtime = createtime; - } - public String getLogo() { - return logo; - } - public void setLogo(String logo) { - this.logo = logo; - } - public String getMemo() { - return memo; - } - public void setMemo(String memo) { - this.memo = memo; - } - public String getOrgscale() { - return orgscale; - } - public void setOrgscale(String orgscale) { - this.orgscale = orgscale; - } - public String getOrgindustry() { - return orgindustry; - } - public void setOrgindustry(String orgindustry) { - this.orgindustry = orgindustry; - } -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/model/SNSAccount.java b/contact-center/app/src/main/java/com/chatopera/cc/app/model/SNSAccount.java deleted file mode 100644 index fc1f0902..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/model/SNSAccount.java +++ /dev/null @@ -1,352 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.model; - - -import java.util.Date; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.Table; -import javax.persistence.Transient; - -import org.hibernate.annotations.GenericGenerator; - -@Entity -@Table(name = "uk_snsaccount") -@org.hibernate.annotations.Proxy(lazy = false) -public class SNSAccount{ - private String id ; - - @Column(unique=true) - private String snsid ; //表示 SNSAccount - private String name ; - private String code ; - private String username ; - private String password ; - private String snstype ;//改字段为为大类 微信/微博/易信等 - private Date createtime = new Date(); //创建时间 - private Date updatetime; //更新时间 - private int expirestime ; //过期时间 - private String account ; //该字段修改为子类型 订阅号(sub)/服务号(sev)/企业号(enpt) - - private String verify ; // 是否认证 - private String headimg; - private String qrcode; - private String alias; - private String openpay; - private String openshake; - private String oepnscan; - private String opencard ; - private String openstore ; - private String refreshtoken; - private String authaccesstoken ; - - - private String allowremote ; - private String email ; - private String userno ; - private String token ; - private String apipoint ; - private String appkey ; - private String secret ; - private String aeskey ; - - - private String baseURL ; //网站URL - - private String apptoken ; - private String sessionkey ; - private boolean defaultaccount ; - private String moreparam ; //改变用处,用于记录 爬虫的 爬取位置(微博)/如果是微信记录Secret - private String orgi ; - private String organ; - private String creater; - private String lastatupdate ; - private String lastprimsgupdate ; - - private String status = "0"; - private boolean agent = false ; - - @Id - @Column(length = 32) - @GeneratedValue(generator = "system-uuid") - @GenericGenerator(name = "system-uuid", strategy = "uuid") - public String getId() { - return id; - } - public void setId(String 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 String getUsername() { - return username; - } - public void setUsername(String username) { - this.username = username; - } - public String getPassword() { - return password; - } - public void setPassword(String password) { - this.password = password; - } - public String getSnstype() { - return snstype; - } - public void setSnstype(String snstype) { - this.snstype = snstype; - } - public Date getCreatetime() { - return createtime; - } - public void setCreatetime(Date createtime) { - this.createtime = createtime; - } - public String getAccount() { - return account; - } - public void setAccount(String account) { - this.account = account; - } - - public String getAllowremote() { - return allowremote; - } - public void setAllowremote(String allowremote) { - this.allowremote = allowremote; - } - public String getEmail() { - return email; - } - public void setEmail(String email) { - this.email = email; - } - public String getUserno() { - return userno; - } - public void setUserno(String userno) { - this.userno = userno; - } - public String getToken() { - return token; - } - public void setToken(String token) { - this.token = token; - } - public String getAppkey() { - return appkey; - } - public void setAppkey(String appkey) { - this.appkey = appkey; - } - public String getApptoken() { - return apptoken; - } - public void setApptoken(String apptoken) { - this.apptoken = apptoken; - } - public String getSessionkey() { - return sessionkey; - } - public void setSessionkey(String sessionkey) { - this.sessionkey = sessionkey; - } - public String getMoreparam() { - return moreparam; - } - public void setMoreparam(String moreparam) { - this.moreparam = moreparam; - } - public String getOrgi() { - return orgi; - } - public void setOrgi(String orgi) { - this.orgi = orgi; - } - public String getApipoint() { - return apipoint; - } - public void setApipoint(String apipoint) { - this.apipoint = apipoint; - } - public boolean isDefaultaccount() { - return defaultaccount; - } - public void setDefaultaccount(boolean defaultaccount) { - this.defaultaccount = defaultaccount; - } - public String getLastatupdate() { - return lastatupdate; - } - public void setLastatupdate(String lastatupdate) { - this.lastatupdate = lastatupdate; - } - public String getLastprimsgupdate() { - return lastprimsgupdate; - } - public void setLastprimsgupdate(String lastprimsgupdate) { - this.lastprimsgupdate = lastprimsgupdate; - } - public boolean isAgent() { - return agent; - } - public void setAgent(boolean agent) { - this.agent = agent; - } - @Transient - public String getStatus() { - return status; - } - public void setStatus(String status) { - this.status = status; - } - public String getVerify() { - return verify; - } - public void setVerify(String verify) { - this.verify = verify; - } - public String getHeadimg() { - return headimg; - } - public void setHeadimg(String headimg) { - this.headimg = headimg; - } - public String getQrcode() { - return qrcode; - } - public void setQrcode(String qrcode) { - this.qrcode = qrcode; - } - public String getAlias() { - return alias; - } - public void setAlias(String alias) { - this.alias = alias; - } - public String getOpenpay() { - return openpay; - } - public void setOpenpay(String openpay) { - this.openpay = openpay; - } - public String getOpenshake() { - return openshake; - } - public void setOpenshake(String openshake) { - this.openshake = openshake; - } - public String getOpencard() { - return opencard; - } - public void setOpencard(String opencard) { - this.opencard = opencard; - } - public String getOpenstore() { - return openstore; - } - public void setOpenstore(String openstore) { - this.openstore = openstore; - } - public String getOepnscan() { - return oepnscan; - } - public void setOepnscan(String oepnscan) { - this.oepnscan = oepnscan; - } - public String getRefreshtoken() { - return refreshtoken; - } - public void setRefreshtoken(String refreshtoken) { - this.refreshtoken = refreshtoken; - } - public String getAuthaccesstoken() { - return authaccesstoken; - } - public void setAuthaccesstoken(String authaccesstoken) { - this.authaccesstoken = authaccesstoken; - } - public Date getUpdatetime() { - return updatetime; - } - public void setUpdatetime(Date updatetime) { - this.updatetime = updatetime; - } - public int getExpirestime() { - return expirestime; - } - public void setExpirestime(int expirestime) { - this.expirestime = expirestime; - } - public String toString(){ - return this.id ; - } - public String getSecret() { - return secret; - } - public void setSecret(String secret) { - this.secret = secret; - } - public String getAeskey() { - return aeskey; - } - public void setAeskey(String aeskey) { - this.aeskey = aeskey; - } - public String getSnsid() { - return snsid; - } - public void setSnsid(String snsid) { - this.snsid = snsid; - } - public String getBaseURL() { - return baseURL; - } - public void setBaseURL(String baseURL) { - this.baseURL = baseURL; - } - - public String getOrgan() { - return organ; - } - - public void setOrgan(String organ) { - this.organ = organ; - } - - public String getCreater() { - return creater; - } - - public void setCreater(String creater) { - this.creater = creater; - } -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/model/UKFacet.java b/contact-center/app/src/main/java/com/chatopera/cc/app/model/UKFacet.java deleted file mode 100644 index 89200003..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/model/UKFacet.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.model; - -import java.io.Serializable; - -public class UKFacet implements Serializable{ - /** - * - */ - private static final long serialVersionUID = -358074853896203559L; - private String key ; - private int value ; - private User user ; - - public UKFacet(){} - - public UKFacet(String key , int value){ - this.key = key ; - this.value = value ; - } - public String getKey() { - return key; - } - public void setKey(String key) { - this.key = key; - } - public int getValue() { - return value; - } - public void setValue(int value) { - this.value = value; - } - public User getUser() { - return user; - } - public void setUser(User user) { - this.user = user; - } -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/model/UKeFuDic.java b/contact-center/app/src/main/java/com/chatopera/cc/app/model/UKeFuDic.java deleted file mode 100644 index bfeb9511..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/model/UKeFuDic.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.model; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -import com.chatopera.cc.app.basic.MainContext; -import com.chatopera.cc.app.cache.CacheHelper; - -public class UKeFuDic extends HashMap{ - - /** - * - */ - private static final long serialVersionUID = 2110217015030751243L; - private static UKeFuDic uKeFuDic = new UKeFuDic(); - - public static UKeFuDic getInstance(){ - return uKeFuDic ; - } - - @SuppressWarnings("unchecked") - public List getSysDic(String key){ - return (List) CacheHelper.getSystemCacheBean().getCacheObject(key, MainContext.SYSTEM_ORGI) ; - } - - @Override - @SuppressWarnings("unchecked") - public V get(Object key) { - Object obj = CacheHelper.getSystemCacheBean().getCacheObject(String.valueOf(key), MainContext.SYSTEM_ORGI) ; - if(obj!=null && obj instanceof List){ - obj = getDic((String) key) ; - }else if(obj == null && (String.valueOf(key)).endsWith(".subdic") && (String.valueOf(key)).lastIndexOf(".subdic") > 0){ - String id = (String.valueOf(key)).substring(0 , (String.valueOf(key)).lastIndexOf(".subdic")) ; - SysDic dic = (SysDic) CacheHelper.getSystemCacheBean().getCacheObject(id, MainContext.SYSTEM_ORGI) ; - if(dic!=null){ - SysDic sysDic = (SysDic) CacheHelper.getSystemCacheBean().getCacheObject(dic.getDicid(), MainContext.SYSTEM_ORGI) ; - obj = getDic(sysDic.getCode(), dic.getParentid()) ; - } - } - return (V) obj; - } - - @SuppressWarnings("unchecked") - public List getDic(String code){ - List dicList = new ArrayList() ; - List sysDicList = (List) CacheHelper.getSystemCacheBean().getCacheObject(code, MainContext.SYSTEM_ORGI) ; - if(sysDicList!=null){ - for(SysDic dic : sysDicList){ - if(dic.getParentid().equals(dic.getDicid())){ - dicList.add(dic) ; - } - } - } - return dicList ; - } - - @SuppressWarnings("unchecked") - public List getDic(String code , String id){ - List dicList = new ArrayList() ; - List sysDicList = (List) CacheHelper.getSystemCacheBean().getCacheObject(code, MainContext.SYSTEM_ORGI) ; - if(sysDicList!=null){ - for(SysDic dic : sysDicList){ - if(dic.getParentid().equals(id)){ - dicList.add(dic) ; - } - } - } - return dicList ; - } - - - - public List getEpt(){ - return new ArrayList() ; - } - - public SysDic getDicItem(String id){ - return (SysDic) CacheHelper.getSystemCacheBean().getCacheObject(id, MainContext.SYSTEM_ORGI) ; - } -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/model/User.java b/contact-center/app/src/main/java/com/chatopera/cc/app/model/User.java deleted file mode 100644 index 7691b2fa..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/model/User.java +++ /dev/null @@ -1,530 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.model; - - -import java.util.*; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.Table; -import javax.persistence.Transient; - -import org.hibernate.annotations.GenericGenerator; - - -/** - * @author jaddy0302 Rivulet User.java 2010-3-17 - * - */ -@Entity -@Table(name = "uk_user") -@org.hibernate.annotations.Proxy(lazy = false) -public class User implements java.io.Serializable{ - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * - */ - @Id - private String id; - - private String sessionid; - - private String username; - private String password; - private String email; - private String uname; - private String firstname; - private String midname; - private String lastname; - private String language; - private String jobtitle; - private String department; - private String gender; - private String mobile; - private String birthday; - private String nickname; - private String secureconf = "5"; - private String usertype; // 0 Admin User : !0 Other User - - private boolean superuser = false; //是否是超级管理员 - - private String orgi; - private String orgid; - - private String creater; - private Date createtime = new Date(); - private Date passupdatetime = new Date(); - private Date updatetime = new Date(); - private String memo; - private String organ; - private boolean agent; //是否开通坐席功能 - private boolean callcenter; //是否启用呼叫中心 坐席功能 - private String sipaccount; - private String skill; - private String city; //城市 - private String province;//省份 - private boolean login; //是否登录 - private boolean online; //是否在线 - private String status; // - private boolean datastatus;//数据状态,是否已删除 - - private int maxuser; //排队队列最大数值 , 开启坐席功能后启用 - private String ordertype; //坐席的工作队列排序方式 - - - private Date lastlogintime = new Date(); //最后登录时间 - - private AgentStatus agentStatus; - - private int fans; //粉丝 - private int follows; //关注 - private int integral; //积分 - private HashSet myorgans = new HashSet<>(); - private List roleList = new ArrayList(); - private Map roleAuthMap = new HashMap(); - - public User(){} - public User(String id){ - this.id = id; - } - - - /** - * @return the id - */ - @Id - @Column(length = 32) - @GeneratedValue(generator = "system-uuid") - @GenericGenerator(name = "system-uuid", strategy = "uuid") - public String getId() { - return id; - } - - @Transient - public String getSessionid() { - return sessionid; - } - - - public void setSessionid(String sessionid) { - this.sessionid = sessionid; - } - - - public String getUsername() { - return username; - } - - - public void setUsername(String username) { - this.username = username; - } - - - public String getPassword() { - return password; - } - - - public void setPassword(String password) { - this.password = password; - } - - - public String getEmail() { - return email; - } - - - public void setEmail(String email) { - this.email = email; - } - - - public String getUname() { - return uname; - } - - - public void setUname(String uname) { - this.uname = uname; - } - - - public String getFirstname() { - return firstname; - } - - - public void setFirstname(String firstname) { - this.firstname = firstname; - } - - - public String getMidname() { - return midname; - } - - - public void setMidname(String midname) { - this.midname = midname; - } - - - public String getLastname() { - return lastname; - } - - - public void setLastname(String lastname) { - this.lastname = lastname; - } - - - public String getLanguage() { - return language; - } - - - public void setLanguage(String language) { - this.language = language; - } - - - public String getJobtitle() { - return jobtitle; - } - - - public void setJobtitle(String jobtitle) { - this.jobtitle = jobtitle; - } - - - public String getDepartment() { - return department; - } - - - public void setDepartment(String department) { - this.department = department; - } - - - public String getGender() { - return gender; - } - - - public void setGender(String gender) { - this.gender = gender; - } - - - public String getBirthday() { - return birthday; - } - - - public void setBirthday(String birthday) { - this.birthday = birthday; - } - - - public String getNickname() { - return nickname; - } - - - public void setNickname(String nickname) { - this.nickname = nickname; - } - - - public String getSecureconf() { - return secureconf; - } - - - public void setSecureconf(String secureconf) { - this.secureconf = secureconf; - } - - - public String getUsertype() { - return usertype; - } - - - public void setUsertype(String usertype) { - this.usertype = usertype; - } - - - - public String getOrgi() { - return orgi; - } - - - public void setOrgi(String orgi) { - this.orgi = orgi; - } - - - public String getCreater() { - return creater; - } - - - public void setCreater(String creater) { - this.creater = creater; - } - - - public Date getCreatetime() { - return createtime; - } - - - public void setCreatetime(Date createtime) { - this.createtime = createtime; - } - - - public Date getPassupdatetime() { - return passupdatetime; - } - - - public void setPassupdatetime(Date passupdatetime) { - this.passupdatetime = passupdatetime; - } - - - public Date getUpdatetime() { - return updatetime; - } - - - public void setUpdatetime(Date updatetime) { - this.updatetime = updatetime; - } - - - public String getMemo() { - return memo; - } - - - public void setMemo(String memo) { - this.memo = memo; - } - - - public String getOrgan() { - return organ; - } - - - public void setOrgan(String organ) { - this.organ = organ; - } - - - public void setId(String id) { - this.id = id; - } - - public String getMobile() { - return mobile; - } - - public void setMobile(String mobile) { - this.mobile = mobile; - } - - public boolean isAgent() { - return agent; - } - - public void setAgent(boolean agent) { - this.agent = agent; - } - - public String getSkill() { - return skill; - } - - public void setSkill(String skill) { - this.skill = skill; - } - - public String getCity() { - return city; - } - - public void setCity(String city) { - this.city = city; - } - - public String getProvince() { - return province; - } - - public void setProvince(String province) { - this.province = province; - } - - public String getSipaccount() { - return sipaccount; - } - - public void setSipaccount(String sipaccount) { - this.sipaccount = sipaccount; - } - @Transient - public boolean isLogin() { - return login; - } - - public void setLogin(boolean login) { - this.login = login; - } - - public int getFans() { - return fans; - } - - public void setFans(int fans) { - this.fans = fans; - } - - public int getFollows() { - return follows; - } - - public void setFollows(int follows) { - this.follows = follows; - } - - public int getIntegral() { - return integral; - } - - public void setIntegral(int integral) { - this.integral = integral; - } - - public Date getLastlogintime() { - return lastlogintime; - } - - public void setLastlogintime(Date lastlogintime) { - this.lastlogintime = lastlogintime; - } - @Transient - public boolean isOnline() { - return online; - } - public void setOnline(boolean online) { - this.online = online; - } - @Transient - public List getRoleList() { - return roleList; - } - public void setRoleList(List roleList) { - this.roleList = roleList; - } - public String getStatus() { - return status; - } - public void setStatus(String status) { - this.status = status; - } - public boolean isDatastatus() { - return datastatus; - } - public void setDatastatus(boolean datastatus) { - this.datastatus = datastatus; - } - @Transient - public AgentStatus getAgentStatus() { - return agentStatus; - } - public void setAgentStatus(AgentStatus agentStatus) { - this.agentStatus = agentStatus; - } - public boolean isCallcenter() { - return callcenter; - } - public void setCallcenter(boolean callcenter) { - this.callcenter = callcenter; - } - public boolean isSuperuser() { - return superuser; - } - @Transient - public Map getRoleAuthMap() { - return roleAuthMap; - } - public void setRoleAuthMap(Map roleAuthMap) { - this.roleAuthMap = roleAuthMap; - } - public void setSuperuser(boolean superuser) { - this.superuser = superuser; - } - public String getOrgid() { - return orgid; - } - public void setOrgid(String orgid) { - this.orgid = orgid; - } - public int getMaxuser() { - return maxuser; - } - public void setMaxuser(int maxuser) { - this.maxuser = maxuser; - } - public String getOrdertype() { - return ordertype; - } - public void setOrdertype(String ordertype) { - this.ordertype = ordertype; - } - - public boolean inMyorgans(final String organ){ - return myorgans.contains(organ); - } - - @Transient - public HashSet getMyorgans() { - return myorgans; - } - - public void setMyorgans(HashSet myorgans) { - this.myorgans = myorgans; - } -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/model/UserHistory.java b/contact-center/app/src/main/java/com/chatopera/cc/app/model/UserHistory.java deleted file mode 100644 index 18a3a514..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/model/UserHistory.java +++ /dev/null @@ -1,254 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.model; - -import java.util.Date; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.Table; - -import com.chatopera.cc.exchange.UserEvent; -import com.chatopera.cc.app.basic.MainUtils; -import org.hibernate.annotations.GenericGenerator; -import org.hibernate.annotations.Proxy; - -@Entity -@Table(name="uk_userevent") -@Proxy(lazy=false) -public class UserHistory implements UserEvent { - /** - * - */ - private static final long serialVersionUID = -9167939944520945485L; - private String id = MainUtils.getUUID(); - private String username; - private String creater; - private Date createtime = new Date(); - private String orgi; - private String title ; - private Date updatetime = new Date(); - private String maintype; - private String subtype; - private String ostype ; - private String browser ; - private String appid ; - private String mobile ; - private String referer ; - private String name; - private boolean admin; - private boolean accessnum; - private String ip; - private String hostname; - private String country; - private String region; - private String city; - private String isp; - private String province; - private String url ; - private String sessionid ; - private String param ; - private int times ; - private String createdate = MainUtils.simpleDateFormat.format(new Date()); - private String model = "app"; - @Id - @Column(length=32) - @GeneratedValue(generator="system-uuid") - @GenericGenerator(name="system-uuid", strategy="assigned") - public String getId() { - return id; - } - public void setId(String id) { - this.id = id; - } - public String getUsername() { - return username; - } - public void setUsername(String username) { - this.username = username; - } - public String getCreater() { - return creater; - } - public void setCreater(String creater) { - this.creater = creater; - } - public Date getCreatetime() { - return createtime; - } - public void setCreatetime(Date createtime) { - this.createtime = createtime; - } - public String getOrgi() { - return orgi; - } - public void setOrgi(String orgi) { - this.orgi = orgi; - } - public Date getUpdatetime() { - return updatetime; - } - public void setUpdatetime(Date updatetime) { - this.updatetime = updatetime; - } - public String getMaintype() { - return maintype; - } - public void setMaintype(String maintype) { - this.maintype = maintype; - } - public String getSubtype() { - return subtype; - } - public void setSubtype(String subtype) { - this.subtype = subtype; - } - public String getName() { - return name; - } - public void setName(String name) { - this.name = name; - } - public boolean isAdmin() { - return admin; - } - public void setAdmin(boolean admin) { - this.admin = admin; - } - public boolean isAccessnum() { - return accessnum; - } - public void setAccessnum(boolean accessnum) { - this.accessnum = accessnum; - } - public String getIp() { - return ip; - } - public void setIp(String ip) { - this.ip = ip; - } - public String getHostname() { - return hostname; - } - public void setHostname(String hostname) { - this.hostname = hostname; - } - public String getCountry() { - return country; - } - public void setCountry(String country) { - this.country = country; - } - public String getRegion() { - return region; - } - public void setRegion(String region) { - this.region = region; - } - public String getCity() { - return city; - } - public void setCity(String city) { - this.city = city; - } - public String getIsp() { - return isp; - } - public void setIsp(String isp) { - this.isp = isp; - } - public String getProvince() { - return province; - } - public void setProvince(String province) { - this.province = province; - } - public String getUrl() { - return url; - } - public void setUrl(String url) { - this.url = url; - } - public String getParam() { - return param; - } - public void setParam(String param) { - this.param = param; - } - public int getTimes() { - return times; - } - public void setTimes(int times) { - this.times = times; - } - public String getSessionid() { - return sessionid; - } - public void setSessionid(String sessionid) { - this.sessionid = sessionid; - } - public String getTitle() { - return title; - } - public void setTitle(String title) { - this.title = title; - } - public String getOstype() { - return ostype; - } - public void setOstype(String ostype) { - this.ostype = ostype; - } - public String getBrowser() { - return browser; - } - public void setBrowser(String browser) { - this.browser = browser; - } - public String getMobile() { - return mobile; - } - public void setMobile(String mobile) { - this.mobile = mobile; - } - public String getModel() { - return model; - } - public void setModel(String model) { - this.model = model; - } - public String getAppid() { - return appid; - } - public void setAppid(String appid) { - this.appid = appid; - } - public String getCreatedate() { - return createdate; - } - public void setCreatedate(String createdate) { - this.createdate = createdate; - } - public String getReferer() { - return referer; - } - public void setReferer(String referer) { - this.referer = referer; - } -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/model/UserRole.java b/contact-center/app/src/main/java/com/chatopera/cc/app/model/UserRole.java deleted file mode 100644 index e460aca3..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/model/UserRole.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.model; - -import java.util.Date; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.OneToOne; -import javax.persistence.Table; - -import org.hibernate.annotations.GenericGenerator; - -@Entity -@Table(name = "uk_userrole") -@org.hibernate.annotations.Proxy(lazy = false) -public class UserRole implements java.io.Serializable{ - /** - * - */ - private static final long serialVersionUID = 707069993826500239L; - private String id ; - private User user ; - private Role role ; - private String creater ; - private String orgi ; - private Date createtime = new Date(); - - @Id - @Column(length = 32) - @GeneratedValue(generator = "system-uuid") - @GenericGenerator(name = "system-uuid", strategy = "uuid") - public String getId() { - return id; - } - public void setId(String id) { - this.id = id; - } - @OneToOne(optional = true) - public User getUser() { - return user; - } - public void setUser(User user) { - this.user = user; - } - @OneToOne(optional = true) - public Role getRole() { - return role; - } - public void setRole(Role role) { - this.role = role; - } - public String getCreater() { - return creater; - } - public void setCreater(String creater) { - this.creater = creater; - } - public Date getCreatetime() { - return createtime; - } - public void setCreatetime(Date createtime) { - this.createtime = createtime; - } - public String getOrgi() { - return orgi; - } - public void setOrgi(String orgi) { - this.orgi = orgi; - } -} \ No newline at end of file diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/es/ContactsRepository.java b/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/es/ContactsRepository.java deleted file mode 100644 index 5b6fde4a..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/es/ContactsRepository.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.persistence.es; - -import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; - -import com.chatopera.cc.app.model.Contacts; - -import java.util.List; - -public interface ContactsRepository extends ElasticsearchRepository , ContactsEsCommonRepository { - public int countByDatastatusIsFalseAndPhoneAndOrgi(String phone,String orgi); - public List findOneByDatastatusIsFalseAndPhoneAndOrgi(String phone, String orgi); -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/es/ContactsRepositoryImpl.java b/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/es/ContactsRepositoryImpl.java deleted file mode 100644 index 52437ace..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/es/ContactsRepositoryImpl.java +++ /dev/null @@ -1,198 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.persistence.es; - -import static org.elasticsearch.index.query.QueryBuilders.termQuery; - -import java.util.ArrayList; -import java.util.Date; -import java.util.List; - -import com.chatopera.cc.app.model.User; -import org.apache.commons.lang.StringUtils; -import org.elasticsearch.index.query.BoolQueryBuilder; -import org.elasticsearch.index.query.QueryBuilders; -import org.elasticsearch.index.query.QueryStringQueryBuilder; -import org.elasticsearch.index.query.QueryStringQueryBuilder.Operator; -import org.elasticsearch.index.query.RangeQueryBuilder; -import org.elasticsearch.search.sort.FieldSortBuilder; -import org.elasticsearch.search.sort.SortOrder; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; -import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; -import org.springframework.stereotype.Component; - -import com.chatopera.cc.app.persistence.repository.UserRepository; -import com.chatopera.cc.app.model.Contacts; - -@Component -public class ContactsRepositoryImpl implements ContactsEsCommonRepository{ - @Autowired - private UserRepository userRes ; - - private ElasticsearchTemplate elasticsearchTemplate; - - @Autowired - public void setElasticsearchTemplate(ElasticsearchTemplate elasticsearchTemplate) { - this.elasticsearchTemplate = elasticsearchTemplate; - } - - @Override - public Page findByCreaterAndSharesAndOrgi(String creater, String shares ,String orgi, boolean includeDeleteData ,String q , Pageable page) { - - BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); - BoolQueryBuilder boolQueryBuilder1 = new BoolQueryBuilder(); - boolQueryBuilder1.should(termQuery("creater" , creater)) ; - boolQueryBuilder1.should(termQuery("shares" , creater)) ; - boolQueryBuilder1.should(termQuery("shares" , "all")) ; - boolQueryBuilder.must(boolQueryBuilder1) ; - boolQueryBuilder.must(termQuery("orgi" ,orgi)) ; - if(includeDeleteData){ - boolQueryBuilder.must(termQuery("datastatus" , true)) ; - }else{ - boolQueryBuilder.must(termQuery("datastatus" , false)) ; - } - if(!StringUtils.isBlank(q)){ - boolQueryBuilder.must(new QueryStringQueryBuilder(q).defaultOperator(Operator.AND)) ; - } - return processQuery(boolQueryBuilder , page); - } - - @Override - public Page findByCreaterAndSharesAndOrgi(String creater, - String shares,String orgi, Date begin, Date end, boolean includeDeleteData, - BoolQueryBuilder boolQueryBuilder , String q, Pageable page) { - BoolQueryBuilder boolQueryBuilder1 = new BoolQueryBuilder(); - boolQueryBuilder1.should(termQuery("creater" , creater)) ; - boolQueryBuilder1.should(termQuery("shares" , creater)) ; - boolQueryBuilder1.should(termQuery("shares" , "all")) ; - boolQueryBuilder.must(boolQueryBuilder1) ; - boolQueryBuilder.must(termQuery("orgi" ,orgi)) ; - if(includeDeleteData){ - boolQueryBuilder.must(termQuery("datastatus" , true)) ; - }else{ - boolQueryBuilder.must(termQuery("datastatus" , false)) ; - } - RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery("createtime") ; - if(begin!=null){ - rangeQuery.from(begin.getTime()) ; - } - if(end!=null){ - rangeQuery.to(end.getTime()) ; - }else{ - rangeQuery.to(new Date().getTime()) ; - } - if(begin!=null || end!=null){ - boolQueryBuilder.must(rangeQuery) ; - } - if(!StringUtils.isBlank(q)){ - boolQueryBuilder.must(new QueryStringQueryBuilder(q).defaultOperator(Operator.AND)) ; - } - return processQuery(boolQueryBuilder , page); - } - - @Override - public Page findByOrgi(String orgi, boolean includeDeleteData, - String q, Pageable page) { - BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); - boolQueryBuilder.must(termQuery("orgi" ,orgi)) ; - if(includeDeleteData){ - boolQueryBuilder.must(termQuery("datastatus" , true)) ; - }else{ - boolQueryBuilder.must(termQuery("datastatus" , false)) ; - } - if(!StringUtils.isBlank(q)){ - boolQueryBuilder.must(new QueryStringQueryBuilder(q).defaultOperator(Operator.AND)) ; - } - return processQuery(boolQueryBuilder , page); - } - - @Override - public Page findByCreaterAndSharesAndOrgi(String creater,String shares,String orgi, Date begin, Date end, boolean includeDeleteData,String q, Pageable page) { - BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); - BoolQueryBuilder boolQueryBuilder1 = new BoolQueryBuilder(); - boolQueryBuilder1.should(termQuery("creater" , creater)) ; - boolQueryBuilder1.should(termQuery("shares" , creater)) ; - boolQueryBuilder1.should(termQuery("shares" , "all")) ; - boolQueryBuilder.must(boolQueryBuilder1) ; - boolQueryBuilder.must(termQuery("orgi" ,orgi)) ; - if(includeDeleteData){ - boolQueryBuilder.must(termQuery("datastatus" , true)) ; - }else{ - boolQueryBuilder.must(termQuery("datastatus" , false)) ; - } - RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery("createtime") ; - if(begin!=null){ - rangeQuery.from(begin.getTime()) ; - } - if(end!=null){ - rangeQuery.to(end.getTime()) ; - }else{ - rangeQuery.to(new Date().getTime()) ; - } - if(begin!=null || end!=null){ - boolQueryBuilder.must(rangeQuery) ; - } - if(!StringUtils.isBlank(q)){ - boolQueryBuilder.must(new QueryStringQueryBuilder(q).defaultOperator(Operator.AND)) ; - } - return processQuery(boolQueryBuilder , page); - } - - - private Page processQuery(BoolQueryBuilder boolQueryBuilder, Pageable page){ - NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder().withQuery(boolQueryBuilder).withSort(new FieldSortBuilder("creater").unmappedType("boolean").order(SortOrder.DESC)).withSort(new FieldSortBuilder("name").unmappedType("string").order(SortOrder.DESC)); - - searchQueryBuilder.withPageable(page) ; - - Page entCustomerList = null ; - if(elasticsearchTemplate.indexExists(Contacts.class)){ - entCustomerList = elasticsearchTemplate.queryForPage(searchQueryBuilder.build() , Contacts.class) ; - } - if(entCustomerList.getContent().size() > 0){ - List ids = new ArrayList() ; - for(Contacts contacts : entCustomerList.getContent()){ - if(contacts.getCreater()!=null && ids.size() < 1024){ - ids.add(contacts.getCreater()) ; - } - } - List users = userRes.findAll(ids) ; - for(Contacts contacts : entCustomerList.getContent()){ - for(User user : users){ - if(user.getId().equals(contacts.getCreater())){ - contacts.setUser(user); - break ; - } - } - } - } - return entCustomerList; - } - - @Override - public Page findByDataAndOrgi(String orgi, String q, Pageable page) { - BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); - boolQueryBuilder.must(termQuery("datastatus" , false)) ; - boolQueryBuilder.must(termQuery("orgi" ,orgi)) ; - if(!StringUtils.isBlank(q)){ - boolQueryBuilder.must(new QueryStringQueryBuilder(q).defaultOperator(Operator.AND)) ; - } - return processQuery(boolQueryBuilder , page); - } -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/hibernate/BaseService.java b/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/hibernate/BaseService.java deleted file mode 100644 index 9cd9be43..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/hibernate/BaseService.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.persistence.hibernate; - -import java.util.List; - -import javax.persistence.EntityManagerFactory; - -import org.hibernate.Session; -import org.hibernate.SessionFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -@Component -public class BaseService { - - private SessionFactory hibernateFactory; - - @Autowired - public BaseService(EntityManagerFactory factory) { - if (factory.unwrap(SessionFactory.class) == null) { - throw new NullPointerException("factory is not a hibernate factory"); - } - this.hibernateFactory = factory.unwrap(SessionFactory.class); - } - - - public void save(Object t){ - Session session = hibernateFactory.openSession() ; - try{ - session.save(t) ; - }catch(Exception ex){ - ex.printStackTrace(); - }finally{ - session.flush(); - session.close(); - } - } - - public void delete(Object object){ - Session session = hibernateFactory.openSession() ; - try{ - session.delete(session.merge(object)); - }catch(Exception ex){ - ex.printStackTrace(); - }finally{ - session.flush(); - session.close(); - } - } - - @SuppressWarnings("unchecked") - public List list(String bean){ - List dataList = null ; - Session session = hibernateFactory.openSession() ; - try{ - dataList = session.createCriteria(Class.forName(bean)).list() ; - }catch(Exception ex){ - ex.printStackTrace(); - }finally{ - session.flush(); - session.close(); - } - return dataList; - } -} \ No newline at end of file diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/impl/AgentUserService.java b/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/impl/AgentUserService.java deleted file mode 100644 index 251585ba..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/impl/AgentUserService.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.persistence.impl; - -import java.util.List; - -import com.chatopera.cc.app.persistence.repository.AgentUserRepository; -import com.chatopera.cc.app.model.AgentUser; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -@Service -public class AgentUserService { - - @Autowired - private AgentUserRepository agentUserRepository; - - public AgentUser findByUseridAndOrgi(String userid , String orgi){ - List agentUsers = agentUserRepository.findByUseridAndOrgi(userid , orgi) ; - return agentUsers.size()> 0 ? agentUsers.get(0) : null ; - } - - public void save(AgentUser agentUser){ - agentUserRepository.save(agentUser) ; - } - - public void delete(String id){ - agentUserRepository.delete(id); - } -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/impl/CallOutQuene.java b/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/impl/CallOutQuene.java deleted file mode 100644 index 36dbcc0f..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/impl/CallOutQuene.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.persistence.impl; - -import java.util.ArrayList; -import java.util.List; - -import com.chatopera.cc.app.cache.CacheHelper; -import com.chatopera.cc.aggregation.filter.AgentCallOutFilter; -import org.springframework.stereotype.Service; - -import com.hazelcast.core.IMap; -import com.hazelcast.mapreduce.aggregation.Aggregations; -import com.hazelcast.mapreduce.aggregation.Supplier; -import com.hazelcast.query.PagingPredicate; -import com.hazelcast.query.SqlPredicate; -import com.chatopera.cc.util.freeswitch.model.CallCenterAgent; -import com.chatopera.cc.aggregation.filter.AiCallOutFilter; -import com.chatopera.cc.app.model.UKefuCallOutNames; - -@SuppressWarnings("deprecation") -@Service("calloutquene") -public class CallOutQuene { - /** - * 为外呼坐席分配名单 - * @param agentStatus - */ - @SuppressWarnings("unchecked") - public static List service(){ - List agentList = new ArrayList(); - if(CacheHelper.getCallCenterAgentCacheBean()!=null && CacheHelper.getCallCenterAgentCacheBean().getCache()!=null) { - PagingPredicate pagingPredicate = new PagingPredicate( new SqlPredicate( "workstatus = 'callout'") , 10 ) ; - agentList.addAll(((IMap) CacheHelper.getCallCenterAgentCacheBean().getCache()).values(pagingPredicate)) ; - } - return agentList ; - } - - /** - * 为外呼坐席分配名单 - * @param agentStatus - */ - @SuppressWarnings("unchecked") - public static List service(String sip){ - List agentList = new ArrayList(); - if(CacheHelper.getCallCenterAgentCacheBean()!=null && CacheHelper.getCallCenterAgentCacheBean().getCache()!=null) { - PagingPredicate pagingPredicate = new PagingPredicate( new SqlPredicate( "siptrunk = '"+sip+"'") , 10 ) ; - agentList.addAll(((IMap) CacheHelper.getCallCenterAgentCacheBean().getCache()).values(pagingPredicate)) ; - } - return agentList ; - } - - /** - * 为外呼坐席分配名单 - * @param agentStatus - */ - @SuppressWarnings("unchecked") - public static List extention(String extno){ - List agentList = new ArrayList(); - if(CacheHelper.getCallCenterAgentCacheBean()!=null && CacheHelper.getCallCenterAgentCacheBean().getCache()!=null) { - PagingPredicate pagingPredicate = new PagingPredicate( new SqlPredicate( "extno = '"+extno+"'") , 10 ) ; - agentList.addAll(((IMap) CacheHelper.getCallCenterAgentCacheBean().getCache()).values(pagingPredicate)) ; - } - return agentList ; - } - - @SuppressWarnings({ "unchecked", "rawtypes" }) - public static int countAiCallOut(String orgi) { - /** - * 统计当前在线的坐席数量 - */ - IMap callOutMap = (IMap) CacheHelper.getCallOutCacheBean().getCache() ; - AiCallOutFilter filter = new AiCallOutFilter(orgi) ; - Long names = (Long) callOutMap.aggregate(Supplier.fromKeyPredicate(filter), Aggregations.count()) ; - return names!=null ? names.intValue() : 0 ; - } - - @SuppressWarnings({ "unchecked", "rawtypes" }) - public static int countAgentCallOut(String orgi) { - /** - * 统计当前在线的坐席数量 - */ - IMap callOutMap = (IMap) CacheHelper.getCallOutCacheBean().getCache() ; - AgentCallOutFilter filter = new AgentCallOutFilter(orgi) ; - Long names = (Long) callOutMap.aggregate(Supplier.fromKeyPredicate(filter), Aggregations.count()) ; - return names!=null ? names.intValue() : 0 ; - } - - - /** - * 外呼监控,包含机器人和人工两个部分 - * @param agentStatus - */ - @SuppressWarnings("unchecked") - public static List callOutNames(String calltype , int p , int ps){ - List ukefuCallOutNamesList = new ArrayList(); - if(CacheHelper.getCallOutCacheBean()!=null && CacheHelper.getCallOutCacheBean().getCache()!=null) { - PagingPredicate pagingPredicate = new PagingPredicate( new SqlPredicate( "calltype = '"+calltype+"'") , 10 ) ; - pagingPredicate.setPage(p); - ukefuCallOutNamesList.addAll(((IMap) CacheHelper.getCallOutCacheBean().getCache()).values(pagingPredicate)) ; - } - return ukefuCallOutNamesList; - } -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/impl/ContactsDataExchangeImpl.java b/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/impl/ContactsDataExchangeImpl.java deleted file mode 100644 index 82aaf58a..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/impl/ContactsDataExchangeImpl.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.persistence.impl; - -import java.io.Serializable; -import java.util.List; - -import com.chatopera.cc.exchange.DataExchangeInterface; -import com.chatopera.cc.app.persistence.es.ContactsRepository; -import com.chatopera.cc.app.model.Contacts; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -@Service("contacts") -public class ContactsDataExchangeImpl implements DataExchangeInterface { - @Autowired - private ContactsRepository contactsRes ; - - public Contacts getDataByIdAndOrgi(String id, String orgi){ - return contactsRes.findOne(id) ; - } - - @Override - public List getListDataByIdAndOrgi(String id , String creater, String orgi) { - return null ; - } - - public void process(Object data , String orgi) { - - } -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/impl/HazelcastService.java b/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/impl/HazelcastService.java deleted file mode 100644 index 262a3b06..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/impl/HazelcastService.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.persistence.impl; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import com.hazelcast.core.HazelcastInstance; - -@Service -public class HazelcastService { - @Autowired - public HazelcastInstance hazelcastInstance; -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/impl/UserService.java b/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/impl/UserService.java deleted file mode 100644 index f5e447b1..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/impl/UserService.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.persistence.impl; - -import org.springframework.stereotype.Service; - -@Service -public class UserService { - -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/AgentServiceRepository.java b/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/AgentServiceRepository.java deleted file mode 100644 index 10f897ee..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/AgentServiceRepository.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.persistence.repository; - -import java.util.List; - -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.data.domain.Sort; -import org.springframework.data.jpa.domain.Specification; -import org.springframework.data.jpa.repository.JpaRepository; - -import com.chatopera.cc.app.model.AgentService; - -public abstract interface AgentServiceRepository - extends JpaRepository -{ - public abstract AgentService findByIdAndOrgi(String paramString , String orgi); - - public abstract List findByUseridAndOrgiOrderByLogindateDesc(String paramString, String orgi); - - public abstract Page findByOrgi(String orgi, Pageable paramPageable); - - public abstract Page findByOrgiAndSatisfaction(String orgi , boolean satisfaction, Pageable paramPageable); - - public abstract Page findByOrgiAndStatus(String orgi ,String status , Pageable paramPageable); - - public abstract List findByAgentnoAndStatusAndOrgi(String agentno, String status , String orgi); - - public abstract int countByUseridAndOrgiAndStatus(String userid, String orgi, String status); - - public abstract List findByUseridAndOrgiAndStatus(String userid, String orgi, String status, Sort sort); - - public Page findAll(Specification spec, Pageable pageable); //分页按条件查询 -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/AgentUserContactsRepository.java b/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/AgentUserContactsRepository.java deleted file mode 100644 index 47f9a394..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/AgentUserContactsRepository.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.persistence.repository; - -import java.util.List; - -import com.chatopera.cc.app.model.AgentUserContacts; -import org.springframework.data.jpa.repository.JpaRepository; - -public interface AgentUserContactsRepository extends JpaRepository{ - public List findByUseridAndOrgi(String userid , String orgi) ; - - public List findByContactsidAndOrgi(String contactsid, String orgi) ; -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/AgentUserRepository.java b/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/AgentUserRepository.java deleted file mode 100644 index e974be16..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/AgentUserRepository.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.persistence.repository; - -import java.util.List; - -import com.chatopera.cc.app.model.AgentUser; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.data.domain.Sort; -import org.springframework.data.jpa.repository.JpaRepository; - -public abstract interface AgentUserRepository extends JpaRepository -{ - public abstract AgentUser findByIdAndOrgi(String paramString, String orgi); - - public abstract List findByUseridAndOrgi(String userid, String orgi); - - public abstract List findByUseridAndStatus(String userid, String status); - - public abstract List findByAgentnoAndOrgi(String agentno , String orgi , Sort sort); - - public abstract Page findByOrgiAndStatus(String orgi ,String status , Pageable page); - - public abstract List findByAgentnoAndStatusAndOrgi(String agentno ,String status , String orgi); - - public abstract int countByAgentnoAndStatusAndOrgi(String agentno ,String status , String orgi); - - public abstract AgentUser findOneByAgentnoAndStatusAndOrgi(String id, String status, String orgi); -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/AgentUserTaskRepository.java b/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/AgentUserTaskRepository.java deleted file mode 100644 index 93e08fde..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/AgentUserTaskRepository.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.persistence.repository; - -import java.util.Date; -import java.util.List; - -import org.springframework.data.jpa.repository.JpaRepository; - -import com.chatopera.cc.app.model.AgentUserTask; - -public abstract interface AgentUserTaskRepository extends JpaRepository{ - - public List findByIdAndOrgi(String id , String orgi); - - public List findByLastmessageLessThanAndStatusAndOrgi(Date start , String status , String orgi) ; - - public List findByLastgetmessageLessThanAndStatusAndOrgi(Date start , String status , String orgi) ; - - public List findByLogindateLessThanAndStatusAndOrgi(Date start , String status , String orgi) ; -} - diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/CallAgentRepository.java b/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/CallAgentRepository.java deleted file mode 100644 index bbb25da1..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/CallAgentRepository.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.persistence.repository; - -import java.util.List; - -import com.chatopera.cc.app.model.CallAgent; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.data.jpa.repository.JpaRepository; - -public abstract interface CallAgentRepository extends JpaRepository { - - public abstract CallAgent findByIdAndOrgi(String id, String orgi); - - public abstract List findByNameAndOrgi(String name, String orgi); - - public abstract Page findByOrgi(String orgi , Pageable page) ; - - public abstract List findByOrgi(String orgi) ; - - public abstract List findByActidAndOrgi(String actid ,String orgi) ; - - public abstract List findByOrgiAndActid(String orgi , String actid) ; -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/ChatMessageRepository.java b/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/ChatMessageRepository.java deleted file mode 100644 index c02efb83..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/ChatMessageRepository.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.persistence.repository; - -import java.util.List; - -import com.chatopera.cc.app.im.message.ChatMessage; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.data.jpa.repository.JpaRepository; - -public abstract interface ChatMessageRepository - extends JpaRepository -{ - public abstract List findByUsessionAndOrgi(String usession , String orgi); - - public abstract ChatMessage findById(String id); - - public abstract Page findByUsessionAndOrgi(String usession, String orgi , Pageable page ); - - public abstract Page findByUseridAndOrgi(String userid, String orgi , Pageable page ); - - public abstract List findByContextidAndOrgi(String contextid , String orgi); - - public abstract Page findByContextidAndOrgi(String contextid , String orgi, Pageable page ); - - public abstract Page findByChatypeAndOrgi(String chatype , String orgi, Pageable page ); - - public abstract Page findByAgentserviceidAndOrgi(String agentserviceid, String orgi , Pageable page ); - - public abstract Page findByContextidAndUseridAndOrgi(String contextid ,String userid , String orgi, Pageable page); -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/ChatbotRepository.java b/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/ChatbotRepository.java deleted file mode 100644 index 910639f9..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/ChatbotRepository.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.chatopera.cc.app.persistence.repository; - -import com.chatopera.cc.app.model.Chatbot; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; - -import java.util.List; - -public abstract interface ChatbotRepository extends JpaRepository { - - public abstract boolean existsByClientIdAndOrgi(String clientId, String orgi); - - public abstract boolean existsBySnsAccountIdentifierAndOrgi(String snsid, String orgi); - - public abstract List findByIdAndOrgi(String id, String orgi); - - public abstract Chatbot findBySnsAccountIdentifierAndOrgi(String snsid, String orgi); - - @Query(value = "select c from Chatbot c where " + - "(:myorgans is null or c.organ IN :myorgans)") - public Page findByOrgans(@Param("myorgans") List myorgans, Pageable pageRequest); -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/ColumnPropertiesRepository.java b/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/ColumnPropertiesRepository.java deleted file mode 100644 index fffff8ee..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/ColumnPropertiesRepository.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.persistence.repository; - -import java.util.List; - -import com.chatopera.cc.app.model.ColumnProperties; -import org.springframework.data.jpa.repository.JpaRepository; - -public abstract interface ColumnPropertiesRepository extends JpaRepository { - - public List findByDataid(String id); - - public List findByModelid(String id); - - public List findByModelidAndCurOrderBySortindexAsc(String id, String cur); - - public ColumnProperties findByIdAndOrgi(String id, String orgi); - -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/CubeMetadataRepository.java b/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/CubeMetadataRepository.java deleted file mode 100644 index 9fa14145..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/CubeMetadataRepository.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.persistence.repository; - -import java.util.List; - -import org.springframework.data.jpa.repository.JpaRepository; - -import com.chatopera.cc.app.model.CubeMetadata; -import com.chatopera.cc.app.model.MetadataTable; - -public abstract interface CubeMetadataRepository extends JpaRepository { - - public List findByCubeid(String cubeid); - - public List findByCubeidAndMtype(String cubeid, String mtype); - - public List findByCubeidAndMtypeNot(String cubeid, String mtype); - - public int countByTbAndCubeid(MetadataTable tb, String cubeid); -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/InstructionRepository.java b/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/InstructionRepository.java deleted file mode 100644 index 7d009848..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/InstructionRepository.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.persistence.repository; - -import java.util.List; - -import com.chatopera.cc.app.model.Instruction; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.data.jpa.repository.JpaRepository; - -public abstract interface InstructionRepository extends JpaRepository -{ - public abstract Instruction findByIdAndOrgi(String id , String orgi); - - public abstract Page findByOrgi(String orgi , Pageable paramPageable); - - public abstract Instruction findByNameAndOrgi(String name, String orgi); - - public abstract List findByOrgi(String orgi); - - public abstract List findBySnsidAndOrgi(String snsid, String orgi); - - public abstract Page findBySnsidAndOrgi(String snsid, String orgi , Pageable paramPageable); - - public abstract long countByNameAndSnsidAndOrgi(String name , String snsid, String orgi); - - public abstract long countByNameAndSnsidAndOrgiAndIdNot(String name , String snsid, String orgi, String id); -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/JobDetailRepository.java b/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/JobDetailRepository.java deleted file mode 100644 index 4365869a..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/JobDetailRepository.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.persistence.repository; - -import java.util.Date; -import java.util.List; - -import com.chatopera.cc.app.model.JobDetail; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.data.jpa.domain.Specification; -import org.springframework.data.jpa.repository.JpaRepository; - -public abstract interface JobDetailRepository extends JpaRepository { - - public abstract JobDetail findByIdAndOrgi(String id, String orgi); - - public abstract Page findByTasktypeAndOrgi(String tasktype , String orgi , Pageable page) ; - - public abstract Page findByTaskstatus(String taskstatus , Pageable page) ; - - public abstract List findByTasktypeAndOrgi(String tasktype , String orgi) ; - - public abstract Page findByPlantaskAndTaskstatusAndNextfiretimeLessThan(boolean plantask ,String taskstatus,Date time , Pageable page) ; - - public abstract Page findAll(Specification spec, Pageable page) ; - - public abstract List findAll(Specification spec) ; - - public abstract List findByOrgiAndTasktypeAndOrganLike(String orgi, String tasktype, String organ); -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/KbsTypeRepository.java b/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/KbsTypeRepository.java deleted file mode 100644 index 82e9da23..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/KbsTypeRepository.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.persistence.repository; - -import java.util.List; - -import com.chatopera.cc.app.model.KbsType; -import org.springframework.data.jpa.repository.JpaRepository; - -public abstract interface KbsTypeRepository extends JpaRepository { - - public abstract KbsType findByIdAndOrgi(String id, String orgi); - - public abstract int countByNameAndOrgi(String name, String orgi); - - public abstract List findByOrgi(String orgi) ; - - public abstract int countByOrgiAndNameAndParentid(String orgi , String name , String parentid) ; - -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/KnowledgeTypeRepository.java b/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/KnowledgeTypeRepository.java deleted file mode 100644 index 6195a51d..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/KnowledgeTypeRepository.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.persistence.repository; - -import java.util.List; - -import com.chatopera.cc.app.model.KnowledgeType; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.data.jpa.domain.Specification; -import org.springframework.data.jpa.repository.JpaRepository; - -public abstract interface KnowledgeTypeRepository extends - JpaRepository { - - public abstract KnowledgeType findByIdAndOrgi(String id, String orgi); - - public abstract int countByNameAndOrgiAndIdNot(String name, String orgi , String id); - - public abstract int countByNameAndOrgiAndParentidNot(String name, String orgi , String parentid); - - public abstract List findByOrgi(String orgi) ; - - public abstract List findByOrgiAndTypeid(String orgi ,String typeid) ; - - public abstract KnowledgeType findByNameAndOrgi(String name, String orgi); - - public abstract KnowledgeType findByNameAndOrgiAndIdNot(String name, String orgi, String id); - - public Page findAll(Specification spec, Pageable pageable); //分页按条件查询 -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/OnlineUserRepository.java b/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/OnlineUserRepository.java deleted file mode 100644 index adecec21..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/OnlineUserRepository.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.persistence.repository; - -import java.util.Date; -import java.util.List; - -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; - -import com.chatopera.cc.app.model.OnlineUser; - -public abstract interface OnlineUserRepository extends JpaRepository { - public abstract OnlineUser findBySessionidAndOrgi(String paramString, String orgi); - - public abstract List findByUseridAndOrgi(String userid, String orgi); - - public abstract int countByUseridAndOrgi(String userid, String orgi); - - public abstract Page findByUseridAndOrgi(String userid, String orgi , Pageable page); - - public abstract OnlineUser findByOrgiAndSessionid(String orgi , String sessionid); - - public abstract Page findByOrgiAndStatusAndCreatetimeLessThan(String orgi , String status , Date createtime , Pageable paramPageable); - - public abstract Page findByStatusAndCreatetimeLessThan(String status , Date createtime , Pageable paramPageable); - - public abstract Page findByOrgiAndStatus(String paramString1,String paramString2, Pageable paramPageable); - - public abstract OnlineUser findByPhoneAndOrgi(String mobile, String orgi); - - public abstract OnlineUser findByPhoneAndOrgiAndStatus(String mobile, String orgi, String status); - - @Query("select invitestatus , count(id) as users from OnlineUser where orgi = ?1 and status = ?2 group by invitestatus") - List findByOrgiAndStatus(String orgi ,String status); - - @Query("select result , count(id) as records from InviteRecord where orgi = ?1 and agentno = ?2 and createtime > ?3 and createtime < ?4 group by result") - List findByOrgiAndAgentnoAndCreatetimeRange(String orgi ,String agentno , Date start , Date end); - - @Query("select result , count(id) as records from InviteRecord where orgi = ?1 and agentno = ?2 group by result") - List findByOrgiAndUserid(String orgi ,String userid); - - @Query("select count(id) from AgentService where orgi = ?1 and status = ?2 and agentno = ?3 and createtime > ?4 and createtime < ?5") - Long countByAgentForAgentUser(String orgi ,String status,String agentno , Date start , Date end); - - @Query("select count(id) from AgentService where orgi = ?1 and status = ?2 and agentno = ?3 and createtime > ?4 and createtime < ?5") - Long countByAgentForAgentService(String orgi ,String status,String agentno , Date start , Date end); - - @Query("select avg(sessiontimes) from AgentService where orgi = ?1 and status = ?2 and agentno = ?3 and createtime > ?4 and createtime < ?5") - Long countByAgentForAvagTime(String orgi ,String status,String agentno , Date start , Date end); - - - @Query("select avg(sessiontimes) from AgentService where orgi = ?1 and status = ?2 and userid = ?3") - Long countByUserForAvagTime(String orgi ,String status,String userid); - - @Query("select createdate as dt, count(distinct ip) as ips , count(id) as records from UserHistory where orgi = ?1 and model = ?2 and createtime > ?3 and createtime < ?4 group by createdate order by dt asc") - List findByOrgiAndCreatetimeRange(String orgi , String model ,Date start , Date end); - - @Query("select createdate as dt, count(id) as users from AgentService where orgi = ?1 and createtime > ?2 and createtime < ?3 group by createdate order by dt asc") - List findByOrgiAndCreatetimeRangeForAgent(String orgi , Date start , Date end); - - @Query("select osname, count(id) as users from AgentService where orgi = ?1 and createtime > ?2 and createtime < ?3 and channel = ?4 group by osname") - List findByOrgiAndCreatetimeRangeForClient(String orgi , Date start , Date end , String channel); - - @Query("select browser, count(id) as users from AgentService where orgi = ?1 and createtime > ?2 and createtime < ?3 and channel = ?4 group by browser") - List findByOrgiAndCreatetimeRangeForBrowser(String orgi , Date start , Date end , String channel); - - @Query("select agentno, count(id) as users from AgentService where orgi = ?1 and userid = ?2 group by agentno") - List findByOrgiForDistinctAgent(String orgi , String userid); - - @Query("select count(id) from AgentService where orgi = ?1 and appid = ?2 and createtime > ?3 and createtime < ?4") - Long countByOrgiAndAppidForCount(String orgi ,String appid ,Date start,Date end); - - @Query("select count(id) from StatusEvent where discaller = ?1 and misscall = false") - Long countByCallerFromCallCenter(String caller); - - @Query("select count(id) from StatusEvent where discalled = ?1 and misscall = false") - Long countByCalledFromCallCenter(String called); - - @Query("select count(id) from StatusEvent where (discaller = ?1 or discalled = ?1) and misscall = false") - Long countByAniFromCallCenter(String ani); - - - @Query("select avg(ringduration) from StatusEvent where ani = ?1") - Long avgByRingDurationFromCallCenter(String ani); - - @Query("select avg(duration) from StatusEvent where ani = ?1") - Long avgByDurationFromCallCenter(String ani); - - @Query("select hourstr as dt, count(id) as calls from StatusEvent where orgi = ?1 and datestr = ?2 group by hourstr order by dt asc") - List findByOrgiAndDatestrRangeForAgent(String orgi , String start ); - - @Query("select code as dt, count(id) as co from CallMonitor where orgi = ?1 group by code") - List findByOrgiAndStatusRangeForAgent(String orgi); - - @Query("select s from StatusEvent s where startrecord<= ?1 AND ORGI = ?2 AND (discalled = ?3 OR discaller= ?4 )") - List findByOrgiAndStartrecord(Date startrecord, String orgi, String discalled, String discaller); - - @Query("delete from UKefuCallOutNames where actid = ?2 AND ORGI = ?1") - void deleteByOrgiAndActid(String orgi, String actid); -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/OrganRepository.java b/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/OrganRepository.java deleted file mode 100644 index d348f095..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/OrganRepository.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.persistence.repository; - -import java.util.List; - -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.data.jpa.repository.JpaRepository; - -import com.chatopera.cc.app.model.Organ; - -public abstract interface OrganRepository - extends JpaRepository -{ - public abstract Organ findByIdAndOrgi(String paramString, String orgi); - - public abstract Page findByOrgi(String orgi , Pageable paramPageable); - - public abstract Page findByOrgiAndOrgid(String orgi ,String orgid, Pageable paramPageable); - - public abstract Organ findByNameAndOrgi(String paramString, String orgi); - - public abstract Organ findByNameAndOrgiAndOrgid(String paramString, String orgi,String orgid); - - - public abstract List findByOrgi(String orgi); - - public abstract List findByOrgiAndOrgid(String orgi ,String orgid); - - public abstract List findByOrgiAndSkill(String orgi , boolean skill); - - public abstract List findByOrgiAndSkillAndOrgid(String orgi , boolean skill,String orgid); - - public abstract List findByIdInAndSkill(List organIdList, boolean b); - - public abstract List findByOrgiAndParent(String orgi, String parent); - -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/QualityRepository.java b/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/QualityRepository.java deleted file mode 100644 index 0b4114a4..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/QualityRepository.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.persistence.repository; - -import java.util.List; - -import com.chatopera.cc.app.model.Quality; -import org.springframework.data.jpa.repository.JpaRepository; - -public abstract interface QualityRepository extends JpaRepository { - - public abstract Quality findByIdAndOrgi(String id, String orgi); - - public List findByOrgi(String orgi); - - public List findByQualitytypeAndOrgi(String qualitytype,String orgi); -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/QueSurveyAnswerRepository.java b/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/QueSurveyAnswerRepository.java deleted file mode 100644 index f95d06f9..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/QueSurveyAnswerRepository.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.persistence.repository; - -import java.util.List; - -import com.chatopera.cc.app.model.QueSurveyAnswer; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.data.jpa.domain.Specification; -import org.springframework.data.jpa.repository.JpaRepository; - -public abstract interface QueSurveyAnswerRepository extends JpaRepository{ - - public abstract Page findByOrgi(String orgi ,Pageable paramPageable); - - public abstract List findByOrgi(String orgi); - - public abstract List findByOrgiAndId(String orgi, String id); - - public abstract QueSurveyAnswer findById(String id); - - public abstract List findByOrgiAndProcessid(String orgi ,String processid); - - public abstract List findByOrgiAndQuestionid(String orgi, String questionid); - - public abstract List findAll(Specification spec) ; -} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/ReportCubeService.java b/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/ReportCubeService.java deleted file mode 100644 index ea0b417a..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/persistence/repository/ReportCubeService.java +++ /dev/null @@ -1,602 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.app.persistence.repository; - -import java.io.IOException; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import javax.servlet.http.HttpServletRequest; - -import com.chatopera.cc.app.basic.MainContext; -import com.chatopera.cc.app.basic.MainUtils; -import com.chatopera.cc.util.bi.ReportData; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Service; - -import com.chatopera.cc.app.model.ColumnProperties; -import com.chatopera.cc.app.model.Cube; -import com.chatopera.cc.app.model.CubeLevel; -import com.chatopera.cc.app.model.CubeMeasure; -import com.chatopera.cc.app.model.CubeMetadata; -import com.chatopera.cc.app.model.Dimension; -import com.chatopera.cc.app.model.MetadataTable; -import com.chatopera.cc.app.model.ReportFilter; -import com.chatopera.cc.app.model.ReportModel; -import com.chatopera.cc.app.model.SysDic; -import com.chatopera.cc.app.model.TableProperties; -import com.chatopera.cc.app.model.Template; -import com.chatopera.cc.app.model.UKeFuDic; - -import freemarker.template.TemplateException; - -@Service("reportCubeService") -public class ReportCubeService{ - - @Autowired - private TemplateRepository templateRes; - - @Value("${web.upload-path}") - private String path; - - @Autowired - private DataSourceService dataSource ; - - @Autowired - private ReportFilterRepository reportFilterRes; - - @Autowired - private MetadataRepository metadataRes; - /** - * - * @param report - * @return - * @throws Exception - */ - public ReportData getReportData(ReportModel model , Cube cube, HttpServletRequest request , boolean parseParam, HashMap semap) throws Exception { - - processFilter(model, cube, request); - - Template modeltp = templateRes.findByIdAndOrgi(model.getTempletid(), model.getOrgi()); - boolean isTable = modeltp!=null&&"数据表".equals(modeltp.getName()); - - cube.setSql(createCubeSQL(model, cube, request , true,semap)) ; - - Template tp = null; - - List tpDicList = UKeFuDic.getInstance().getDic(MainContext.UKEFU_SYSTEM_DIC) ; - for(SysDic sysDic : tpDicList) { - if(sysDic.getCode().equals("reportquery")) { - List