Forráskód Böngészése

Merge branch 'master' into master_rule_engine

# Conflicts:
#	jeecg-boot-module-system/src/main/java/org/jeecg/modules/wps/controller/WpsFileController.java
#	jeecg-boot-module-system/src/test/java/org/jeecg/SampleTest.java
#	module-common/src/main/java/cn/com/ctop/common/module/entity/RuleDataTarget.java
#	module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/service/impl/ReportServiceImpl.java
yumeng 4 éve
szülő
commit
bc4a1cb8b9
85 módosított fájl, 2877 hozzáadás és 942 törlés
  1. 0 324
      jeecg-boot-module-activiti/db/create/activiti.mysql.create.engine.sql
  2. 0 155
      jeecg-boot-module-activiti/db/create/activiti.mysql.create.history.sql
  3. 0 46
      jeecg-boot-module-activiti/db/create/activiti.mysql.create.identity.sql
  4. 2 0
      jeecg-boot-module-system/src/main/java/org/jeecg/config/ShiroConfig.java
  5. 2 2
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/BytedanceMusicInfoController.java
  6. 42 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/TestController.java
  7. 27 4
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/YardController.java
  8. 1 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysBaseApiImpl.java
  9. 0 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/wps/controller/WpsFileController.java
  10. 2 3
      jeecg-boot-module-system/src/main/resources/application-wps.yml
  11. 109 118
      jeecg-boot-module-system/src/test/java/org/jeecg/SampleTest.java
  12. 5 10
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/constant/MatchLogic.java
  13. 3 3
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/entity/AlarmEventSend.java
  14. 4 4
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/mapper/xml/RuleAccountThresholdMapper.xml
  15. 4 4
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/service/impl/AlarmEventSendServiceImpl.java
  16. 4 1
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/service/impl/RuleAccountTemplateServiceImpl.java
  17. 172 91
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/service/impl/RuleGroupServiceImpl.java
  18. 5 0
      module-common/src/main/java/cn/com/ctop/common/module/entity/RuleDataTarget.java
  19. 18 0
      module-common/src/main/java/cn/com/ctop/common/module/entity/SysUser.java
  20. 5 1
      module-common/src/main/java/cn/com/ctop/common/module/service/impl/MessageTemplateImpl.java
  21. 11 3
      module-job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/ByteDancePlanRuleDataJob.java
  22. 12 7
      module-job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/RuleDataAccountCleanJob.java
  23. 2 3
      module-job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/WechatApproveAttendanceJob.java
  24. 1 3
      module-job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/WechatAttendanceJob.java
  25. 236 0
      module-job-distribute/pom.xml
  26. 13 0
      module-job-distribute/src/main/java/cn/com/ctop/module/job/distribute/ModuleJobDistributeApplication.java
  27. 27 0
      module-job-distribute/src/main/java/cn/com/ctop/module/job/distribute/config/AutoPoiConfig.java
  28. 97 0
      module-job-distribute/src/main/java/cn/com/ctop/module/job/distribute/config/BrowseLogHandelInterceptor.java
  29. 158 0
      module-job-distribute/src/main/java/cn/com/ctop/module/job/distribute/config/MybatisInterceptor.java
  30. 34 0
      module-job-distribute/src/main/java/cn/com/ctop/module/job/distribute/config/MybatisPlusConfig.java
  31. 97 0
      module-job-distribute/src/main/java/cn/com/ctop/module/job/distribute/config/RedisConfig.java
  32. 33 0
      module-job-distribute/src/main/java/cn/com/ctop/module/job/distribute/config/WebMvcConfiguration.java
  33. 71 0
      module-job-distribute/src/main/java/cn/com/ctop/module/job/distribute/config/XxlJobConfig.java
  34. 5 0
      module-job-distribute/src/main/java/cn/com/ctop/module/job/distribute/handler/BytedanceHourlyJob.java
  35. 154 0
      module-job-distribute/src/main/java/cn/com/ctop/module/job/distribute/handler/KuaishouHourlyJob.java
  36. 155 0
      module-job-distribute/src/main/resources/application-dev.yml
  37. 169 0
      module-job-distribute/src/main/resources/application-prod.yml
  38. 179 0
      module-job-distribute/src/main/resources/application-test.yml
  39. 24 0
      module-job-distribute/src/main/resources/application.yml
  40. 14 0
      module-job-distribute/src/main/resources/banner.txt
  41. 49 0
      module-job-distribute/src/main/resources/generatorConfig.xml
  42. 4 0
      module-job-distribute/src/main/resources/log4j.properties
  43. 57 0
      module-job-distribute/src/main/resources/logback-dev.xml
  44. 57 0
      module-job-distribute/src/main/resources/logback-prod.xml
  45. 57 0
      module-job-distribute/src/main/resources/logback-test.xml
  46. 13 0
      module-job-distribute/src/test/java/cn/com/ctop/module/job/distribute/ModuleJobDistributeApplicationTests.java
  47. 3 2
      module-job-kuaishou/src/main/resources/application-prod.yml
  48. 2 0
      module-job-kuaishou/src/main/resources/application.yml
  49. 2 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/entity/KuaiShouGroupTarget.java
  50. 2 1
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/mapper/xml/KuaiShouGroupTargetMapper.xml
  51. 46 38
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/impl/BatchServiceImpl.java
  52. 75 11
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/impl/KuaiShouGroupServiceImpl.java
  53. 1 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/impl/KuaiShouUpdateServiceImpl.java
  54. 6 3
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/impl/KuaishouInterfaceServiceImpl.java
  55. 2 2
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/impl/KuaishouTemplateServiceImpl.java
  56. 1 1
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/entity/KuaishouAgentAccount.java
  57. 15 3
      module-oa/src/main/java/cn/com/ctop/oa/modules/constant/QYWxConstant.java
  58. 2 1
      module-oa/src/main/java/cn/com/ctop/oa/modules/controller/WechatDepartmentController.java
  59. 48 5
      module-oa/src/main/java/cn/com/ctop/oa/modules/controller/WechatNoListController.java
  60. 2 0
      module-oa/src/main/java/cn/com/ctop/oa/modules/entity/WechatCheckinData.java
  61. 2 0
      module-oa/src/main/java/cn/com/ctop/oa/modules/entity/WechatDepartment.java
  62. 2 0
      module-oa/src/main/java/cn/com/ctop/oa/modules/entity/WechatNoList.java
  63. 2 0
      module-oa/src/main/java/cn/com/ctop/oa/modules/entity/WechatUserList.java
  64. 1 1
      module-oa/src/main/java/cn/com/ctop/oa/modules/enums/DepartEnum.java
  65. 1 1
      module-oa/src/main/java/cn/com/ctop/oa/modules/mapper/WechatDepartmentMapper.java
  66. 3 0
      module-oa/src/main/java/cn/com/ctop/oa/modules/mapper/WechatNoListMapper.java
  67. 3 0
      module-oa/src/main/java/cn/com/ctop/oa/modules/mapper/WechatUserListMapper.java
  68. 16 17
      module-oa/src/main/java/cn/com/ctop/oa/modules/mapper/xml/WechatCheckinDataMapper.xml
  69. 1 0
      module-oa/src/main/java/cn/com/ctop/oa/modules/mapper/xml/WechatDepartmentMapper.xml
  70. 91 0
      module-oa/src/main/java/cn/com/ctop/oa/modules/mapper/xml/WechatNoListMapper.xml
  71. 6 1
      module-oa/src/main/java/cn/com/ctop/oa/modules/mapper/xml/WechatUserListMapper.xml
  72. 3 0
      module-oa/src/main/java/cn/com/ctop/oa/modules/service/IWechatCheckinDataService.java
  73. 1 1
      module-oa/src/main/java/cn/com/ctop/oa/modules/service/IWechatDepartmentService.java
  74. 5 12
      module-oa/src/main/java/cn/com/ctop/oa/modules/service/IWechatNoListService.java
  75. 23 6
      module-oa/src/main/java/cn/com/ctop/oa/modules/service/IWechatTokenService.java
  76. 6 0
      module-oa/src/main/java/cn/com/ctop/oa/modules/service/IWechatUserListService.java
  77. 87 3
      module-oa/src/main/java/cn/com/ctop/oa/modules/service/impl/WechatCheckinDataServiceImpl.java
  78. 4 2
      module-oa/src/main/java/cn/com/ctop/oa/modules/service/impl/WechatDepartmentServiceImpl.java
  79. 75 41
      module-oa/src/main/java/cn/com/ctop/oa/modules/service/impl/WechatNoListServiceImpl.java
  80. 93 4
      module-oa/src/main/java/cn/com/ctop/oa/modules/service/impl/WechatTokenServiceImpl.java
  81. 58 1
      module-oa/src/main/java/cn/com/ctop/oa/modules/service/impl/WechatUserListServiceImpl.java
  82. 4 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/service/IByteDanceAdvertiserDataService.java
  83. 43 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/service/impl/ByteDanceAdvertiserDataServiceImpl.java
  84. 5 1
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/service/impl/ReportServiceImpl.java
  85. 1 0
      pom.xml

+ 0 - 324
jeecg-boot-module-activiti/db/create/activiti.mysql.create.engine.sql

@@ -1,324 +0,0 @@
-create table ACT_GE_PROPERTY (
-    NAME_ varchar(64),
-    VALUE_ varchar(300),
-    REV_ integer,
-    primary key (NAME_)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
-
-insert into ACT_GE_PROPERTY
-values ('schema.version', '5.22.0.0', 1);
-
-insert into ACT_GE_PROPERTY
-values ('schema.history', 'create(5.22.0.0)', 1);
-
-insert into ACT_GE_PROPERTY
-values ('next.dbid', '1', 1);
-
-create table ACT_GE_BYTEARRAY (
-    ID_ varchar(64),
-    REV_ integer,
-    NAME_ varchar(255),
-    DEPLOYMENT_ID_ varchar(64),
-    BYTES_ LONGBLOB,
-    GENERATED_ TINYINT,
-    primary key (ID_)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
-
-create table ACT_RE_DEPLOYMENT (
-    ID_ varchar(64),
-    NAME_ varchar(255),
-    CATEGORY_ varchar(255),
-    TENANT_ID_ varchar(255) default '',
-    DEPLOY_TIME_ timestamp(3) NULL,
-    primary key (ID_)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
-
-create table ACT_RE_MODEL (
-    ID_ varchar(64) not null,
-    REV_ integer,
-    NAME_ varchar(255),
-    KEY_ varchar(255),
-    CATEGORY_ varchar(255),
-    CREATE_TIME_ timestamp(3) null,
-    LAST_UPDATE_TIME_ timestamp(3) null,
-    VERSION_ integer,
-    META_INFO_ varchar(4000),
-    DEPLOYMENT_ID_ varchar(64),
-    EDITOR_SOURCE_VALUE_ID_ varchar(64),
-    EDITOR_SOURCE_EXTRA_VALUE_ID_ varchar(64),
-    TENANT_ID_ varchar(255) default '',
-    primary key (ID_)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
-
-create table ACT_RU_EXECUTION (
-    ID_ varchar(64),
-    REV_ integer,
-    PROC_INST_ID_ varchar(64),
-    BUSINESS_KEY_ varchar(255),
-    PARENT_ID_ varchar(64),
-    PROC_DEF_ID_ varchar(64),
-    SUPER_EXEC_ varchar(64),
-    ACT_ID_ varchar(255),
-    IS_ACTIVE_ TINYINT,
-    IS_CONCURRENT_ TINYINT,
-    IS_SCOPE_ TINYINT,
-    IS_EVENT_SCOPE_ TINYINT,
-    SUSPENSION_STATE_ integer,
-    CACHED_ENT_STATE_ integer,
-    TENANT_ID_ varchar(255) default '',
-    NAME_ varchar(255),
-    LOCK_TIME_ timestamp(3) NULL,
-    primary key (ID_)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
-
-create table ACT_RU_JOB (
-    ID_ varchar(64) NOT NULL,
-    REV_ integer,
-    TYPE_ varchar(255) NOT NULL,
-    LOCK_EXP_TIME_ timestamp(3) NULL,
-    LOCK_OWNER_ varchar(255),
-    EXCLUSIVE_ boolean,
-    EXECUTION_ID_ varchar(64),
-    PROCESS_INSTANCE_ID_ varchar(64),
-    PROC_DEF_ID_ varchar(64),
-    RETRIES_ integer,
-    EXCEPTION_STACK_ID_ varchar(64),
-    EXCEPTION_MSG_ varchar(4000),
-    DUEDATE_ timestamp(3) NULL,
-    REPEAT_ varchar(255),
-    HANDLER_TYPE_ varchar(255),
-    HANDLER_CFG_ varchar(4000),
-    TENANT_ID_ varchar(255) default '',
-    primary key (ID_)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
-
-create table ACT_RE_PROCDEF (
-    ID_ varchar(64) not null,
-    REV_ integer,
-    CATEGORY_ varchar(255),
-    NAME_ varchar(255),
-    KEY_ varchar(255) not null,
-    VERSION_ integer not null,
-    DEPLOYMENT_ID_ varchar(64),
-    RESOURCE_NAME_ varchar(4000),
-    DGRM_RESOURCE_NAME_ varchar(4000),
-    DESCRIPTION_ varchar(4000),
-    HAS_START_FORM_KEY_ TINYINT,
-    HAS_GRAPHICAL_NOTATION_ TINYINT,
-    SUSPENSION_STATE_ integer,
-    TENANT_ID_ varchar(255) default '',
-    primary key (ID_)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
-
-create table ACT_RU_TASK (
-    ID_ varchar(64),
-    REV_ integer,
-    EXECUTION_ID_ varchar(64),
-    PROC_INST_ID_ varchar(64),
-    PROC_DEF_ID_ varchar(64),
-    NAME_ varchar(255),
-    PARENT_TASK_ID_ varchar(64),
-    DESCRIPTION_ varchar(4000),
-    TASK_DEF_KEY_ varchar(255),
-    OWNER_ varchar(255),
-    ASSIGNEE_ varchar(255),
-    DELEGATION_ varchar(64),
-    PRIORITY_ integer,
-    CREATE_TIME_ timestamp(3) NULL,
-    DUE_DATE_ datetime(3),
-    CATEGORY_ varchar(255),
-    SUSPENSION_STATE_ integer,
-    TENANT_ID_ varchar(255) default '',
-    FORM_KEY_ varchar(255),
-    primary key (ID_)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
-
-create table ACT_RU_IDENTITYLINK (
-    ID_ varchar(64),
-    REV_ integer,
-    GROUP_ID_ varchar(255),
-    TYPE_ varchar(255),
-    USER_ID_ varchar(255),
-    TASK_ID_ varchar(64),
-    PROC_INST_ID_ varchar(64),
-    PROC_DEF_ID_ varchar(64),    
-    primary key (ID_)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
-
-create table ACT_RU_VARIABLE (
-    ID_ varchar(64) not null,
-    REV_ integer,
-    TYPE_ varchar(255) not null,
-    NAME_ varchar(255) not null,
-    EXECUTION_ID_ varchar(64),
-    PROC_INST_ID_ varchar(64),
-    TASK_ID_ varchar(64),
-    BYTEARRAY_ID_ varchar(64),
-    DOUBLE_ double,
-    LONG_ bigint,
-    TEXT_ varchar(4000),
-    TEXT2_ varchar(4000),
-    primary key (ID_)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
-
-create table ACT_RU_EVENT_SUBSCR (
-    ID_ varchar(64) not null,
-    REV_ integer,
-    EVENT_TYPE_ varchar(255) not null,
-    EVENT_NAME_ varchar(255),
-    EXECUTION_ID_ varchar(64),
-    PROC_INST_ID_ varchar(64),
-    ACTIVITY_ID_ varchar(64),
-    CONFIGURATION_ varchar(255),
-    CREATED_ timestamp(3) not null DEFAULT CURRENT_TIMESTAMP(3),
-    PROC_DEF_ID_ varchar(64),
-    TENANT_ID_ varchar(255) default '',
-    primary key (ID_)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
-
-create table ACT_EVT_LOG (
-    LOG_NR_ bigint auto_increment,
-    TYPE_ varchar(64),
-    PROC_DEF_ID_ varchar(64),
-    PROC_INST_ID_ varchar(64),
-    EXECUTION_ID_ varchar(64),
-    TASK_ID_ varchar(64),
-    TIME_STAMP_ timestamp(3) not null,
-    USER_ID_ varchar(255),
-    DATA_ LONGBLOB,
-    LOCK_OWNER_ varchar(255),
-    LOCK_TIME_ timestamp(3) null,
-    IS_PROCESSED_ tinyint default 0,
-    primary key (LOG_NR_)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
-
-create table ACT_PROCDEF_INFO (
-	ID_ varchar(64) not null,
-    PROC_DEF_ID_ varchar(64) not null,
-    REV_ integer,
-    INFO_JSON_ID_ varchar(64),
-    primary key (ID_)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
-
-create index ACT_IDX_EXEC_BUSKEY on ACT_RU_EXECUTION(BUSINESS_KEY_);
-create index ACT_IDX_TASK_CREATE on ACT_RU_TASK(CREATE_TIME_);
-create index ACT_IDX_IDENT_LNK_USER on ACT_RU_IDENTITYLINK(USER_ID_);
-create index ACT_IDX_IDENT_LNK_GROUP on ACT_RU_IDENTITYLINK(GROUP_ID_);
-create index ACT_IDX_EVENT_SUBSCR_CONFIG_ on ACT_RU_EVENT_SUBSCR(CONFIGURATION_);
-create index ACT_IDX_VARIABLE_TASK_ID on ACT_RU_VARIABLE(TASK_ID_);
-create index ACT_IDX_ATHRZ_PROCEDEF on ACT_RU_IDENTITYLINK(PROC_DEF_ID_);
-create index ACT_IDX_INFO_PROCDEF on ACT_PROCDEF_INFO(PROC_DEF_ID_);
-
-alter table ACT_GE_BYTEARRAY
-    add constraint ACT_FK_BYTEARR_DEPL 
-    foreign key (DEPLOYMENT_ID_) 
-    references ACT_RE_DEPLOYMENT (ID_);
-
-alter table ACT_RE_PROCDEF
-    add constraint ACT_UNIQ_PROCDEF
-    unique (KEY_,VERSION_, TENANT_ID_);
-    
-alter table ACT_RU_EXECUTION
-    add constraint ACT_FK_EXE_PROCINST 
-    foreign key (PROC_INST_ID_) 
-    references ACT_RU_EXECUTION (ID_) on delete cascade on update cascade;
-
-alter table ACT_RU_EXECUTION
-    add constraint ACT_FK_EXE_PARENT 
-    foreign key (PARENT_ID_) 
-    references ACT_RU_EXECUTION (ID_);
-    
-alter table ACT_RU_EXECUTION
-    add constraint ACT_FK_EXE_SUPER 
-    foreign key (SUPER_EXEC_) 
-    references ACT_RU_EXECUTION (ID_);
-
-alter table ACT_RU_EXECUTION
-    add constraint ACT_FK_EXE_PROCDEF 
-    foreign key (PROC_DEF_ID_) 
-    references ACT_RE_PROCDEF (ID_);
-    
-alter table ACT_RU_IDENTITYLINK
-    add constraint ACT_FK_TSKASS_TASK 
-    foreign key (TASK_ID_) 
-    references ACT_RU_TASK (ID_);
-    
-alter table ACT_RU_IDENTITYLINK
-    add constraint ACT_FK_ATHRZ_PROCEDEF 
-    foreign key (PROC_DEF_ID_) 
-    references ACT_RE_PROCDEF(ID_);
-    
-alter table ACT_RU_IDENTITYLINK
-    add constraint ACT_FK_IDL_PROCINST
-    foreign key (PROC_INST_ID_) 
-    references ACT_RU_EXECUTION (ID_);       
-    
-alter table ACT_RU_TASK
-    add constraint ACT_FK_TASK_EXE
-    foreign key (EXECUTION_ID_)
-    references ACT_RU_EXECUTION (ID_);
-    
-alter table ACT_RU_TASK
-    add constraint ACT_FK_TASK_PROCINST
-    foreign key (PROC_INST_ID_)
-    references ACT_RU_EXECUTION (ID_);
-    
-alter table ACT_RU_TASK
-  	add constraint ACT_FK_TASK_PROCDEF
-  	foreign key (PROC_DEF_ID_)
-  	references ACT_RE_PROCDEF (ID_);
-  
-alter table ACT_RU_VARIABLE 
-    add constraint ACT_FK_VAR_EXE 
-    foreign key (EXECUTION_ID_) 
-    references ACT_RU_EXECUTION (ID_);
-
-alter table ACT_RU_VARIABLE
-    add constraint ACT_FK_VAR_PROCINST
-    foreign key (PROC_INST_ID_)
-    references ACT_RU_EXECUTION(ID_);
-
-alter table ACT_RU_VARIABLE 
-    add constraint ACT_FK_VAR_BYTEARRAY 
-    foreign key (BYTEARRAY_ID_) 
-    references ACT_GE_BYTEARRAY (ID_);
-
-alter table ACT_RU_JOB 
-    add constraint ACT_FK_JOB_EXCEPTION 
-    foreign key (EXCEPTION_STACK_ID_) 
-    references ACT_GE_BYTEARRAY (ID_);
-
-alter table ACT_RU_EVENT_SUBSCR
-    add constraint ACT_FK_EVENT_EXEC
-    foreign key (EXECUTION_ID_)
-    references ACT_RU_EXECUTION(ID_);
-    
-alter table ACT_RE_MODEL 
-    add constraint ACT_FK_MODEL_SOURCE 
-    foreign key (EDITOR_SOURCE_VALUE_ID_) 
-    references ACT_GE_BYTEARRAY (ID_);
-
-alter table ACT_RE_MODEL 
-    add constraint ACT_FK_MODEL_SOURCE_EXTRA 
-    foreign key (EDITOR_SOURCE_EXTRA_VALUE_ID_) 
-    references ACT_GE_BYTEARRAY (ID_);
-    
-alter table ACT_RE_MODEL 
-    add constraint ACT_FK_MODEL_DEPLOYMENT 
-    foreign key (DEPLOYMENT_ID_) 
-    references ACT_RE_DEPLOYMENT (ID_);        
-
-alter table ACT_PROCDEF_INFO 
-    add constraint ACT_FK_INFO_JSON_BA 
-    foreign key (INFO_JSON_ID_) 
-    references ACT_GE_BYTEARRAY (ID_);
-
-alter table ACT_PROCDEF_INFO 
-    add constraint ACT_FK_INFO_PROCDEF 
-    foreign key (PROC_DEF_ID_) 
-    references ACT_RE_PROCDEF (ID_);
-    
-alter table ACT_PROCDEF_INFO
-    add constraint ACT_UNIQ_INFO_PROCDEF
-    unique (PROC_DEF_ID_);
-    

+ 0 - 155
jeecg-boot-module-activiti/db/create/activiti.mysql.create.history.sql

@@ -1,155 +0,0 @@
-create table ACT_HI_PROCINST (
-    ID_ varchar(64) not null,
-    PROC_INST_ID_ varchar(64) not null,
-    BUSINESS_KEY_ varchar(255),
-    PROC_DEF_ID_ varchar(64) not null,
-    START_TIME_ datetime(3) not null,
-    END_TIME_ datetime(3),
-    DURATION_ bigint,
-    START_USER_ID_ varchar(255),
-    START_ACT_ID_ varchar(255),
-    END_ACT_ID_ varchar(255),
-    SUPER_PROCESS_INSTANCE_ID_ varchar(64),
-    DELETE_REASON_ varchar(4000),
-    TENANT_ID_ varchar(255) default '',
-    NAME_ varchar(255),
-    primary key (ID_),
-    unique (PROC_INST_ID_)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
-
-create table ACT_HI_ACTINST (
-    ID_ varchar(64) not null,
-    PROC_DEF_ID_ varchar(64) not null,
-    PROC_INST_ID_ varchar(64) not null,
-    EXECUTION_ID_ varchar(64) not null,
-    ACT_ID_ varchar(255) not null,
-    TASK_ID_ varchar(64),
-    CALL_PROC_INST_ID_ varchar(64),
-    ACT_NAME_ varchar(255),
-    ACT_TYPE_ varchar(255) not null,
-    ASSIGNEE_ varchar(255),
-    START_TIME_ datetime(3) not null,
-    END_TIME_ datetime(3),
-    DURATION_ bigint,
-    TENANT_ID_ varchar(255) default '',
-    primary key (ID_)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
-
-create table ACT_HI_TASKINST (
-    ID_ varchar(64) not null,
-    PROC_DEF_ID_ varchar(64),
-    TASK_DEF_KEY_ varchar(255),
-    PROC_INST_ID_ varchar(64),
-    EXECUTION_ID_ varchar(64),
-    NAME_ varchar(255),
-    PARENT_TASK_ID_ varchar(64),
-    DESCRIPTION_ varchar(4000),
-    OWNER_ varchar(255),
-    ASSIGNEE_ varchar(255),
-    START_TIME_ datetime(3) not null,
-    CLAIM_TIME_ datetime(3),
-    END_TIME_ datetime(3),
-    DURATION_ bigint,
-    DELETE_REASON_ varchar(4000),
-    PRIORITY_ integer,
-    DUE_DATE_ datetime(3),
-    FORM_KEY_ varchar(255),
-    CATEGORY_ varchar(255),
-    TENANT_ID_ varchar(255) default '',
-    primary key (ID_)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
-
-create table ACT_HI_VARINST (
-    ID_ varchar(64) not null,
-    PROC_INST_ID_ varchar(64),
-    EXECUTION_ID_ varchar(64),
-    TASK_ID_ varchar(64),
-    NAME_ varchar(255) not null,
-    VAR_TYPE_ varchar(100),
-    REV_ integer,
-    BYTEARRAY_ID_ varchar(64),
-    DOUBLE_ double,
-    LONG_ bigint,
-    TEXT_ varchar(4000),
-    TEXT2_ varchar(4000),
-    CREATE_TIME_ datetime(3),
-    LAST_UPDATED_TIME_ datetime(3),
-    primary key (ID_)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
-
-create table ACT_HI_DETAIL (
-    ID_ varchar(64) not null,
-    TYPE_ varchar(255) not null,
-    PROC_INST_ID_ varchar(64),
-    EXECUTION_ID_ varchar(64),
-    TASK_ID_ varchar(64),
-    ACT_INST_ID_ varchar(64),
-    NAME_ varchar(255) not null,
-    VAR_TYPE_ varchar(255),
-    REV_ integer,
-    TIME_ datetime(3) not null,
-    BYTEARRAY_ID_ varchar(64),
-    DOUBLE_ double,
-    LONG_ bigint,
-    TEXT_ varchar(4000),
-    TEXT2_ varchar(4000),
-    primary key (ID_)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
-
-create table ACT_HI_COMMENT (
-    ID_ varchar(64) not null,
-    TYPE_ varchar(255),
-    TIME_ datetime(3) not null,
-    USER_ID_ varchar(255),
-    TASK_ID_ varchar(64),
-    PROC_INST_ID_ varchar(64),
-    ACTION_ varchar(255),
-    MESSAGE_ varchar(4000),
-    FULL_MSG_ LONGBLOB,
-    primary key (ID_)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
-
-create table ACT_HI_ATTACHMENT (
-    ID_ varchar(64) not null,
-    REV_ integer,
-    USER_ID_ varchar(255),
-    NAME_ varchar(255),
-    DESCRIPTION_ varchar(4000),
-    TYPE_ varchar(255),
-    TASK_ID_ varchar(64),
-    PROC_INST_ID_ varchar(64),
-    URL_ varchar(4000),
-    CONTENT_ID_ varchar(64),
-    TIME_ datetime(3),
-    primary key (ID_)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
-
-create table ACT_HI_IDENTITYLINK (
-    ID_ varchar(64),
-    GROUP_ID_ varchar(255),
-    TYPE_ varchar(255),
-    USER_ID_ varchar(255),
-    TASK_ID_ varchar(64),
-    PROC_INST_ID_ varchar(64),
-    primary key (ID_)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
-
-
-create index ACT_IDX_HI_PRO_INST_END on ACT_HI_PROCINST(END_TIME_);
-create index ACT_IDX_HI_PRO_I_BUSKEY on ACT_HI_PROCINST(BUSINESS_KEY_);
-create index ACT_IDX_HI_ACT_INST_START on ACT_HI_ACTINST(START_TIME_);
-create index ACT_IDX_HI_ACT_INST_END on ACT_HI_ACTINST(END_TIME_);
-create index ACT_IDX_HI_DETAIL_PROC_INST on ACT_HI_DETAIL(PROC_INST_ID_);
-create index ACT_IDX_HI_DETAIL_ACT_INST on ACT_HI_DETAIL(ACT_INST_ID_);
-create index ACT_IDX_HI_DETAIL_TIME on ACT_HI_DETAIL(TIME_);
-create index ACT_IDX_HI_DETAIL_NAME on ACT_HI_DETAIL(NAME_);
-create index ACT_IDX_HI_DETAIL_TASK_ID on ACT_HI_DETAIL(TASK_ID_);
-create index ACT_IDX_HI_PROCVAR_PROC_INST on ACT_HI_VARINST(PROC_INST_ID_);
-create index ACT_IDX_HI_PROCVAR_NAME_TYPE on ACT_HI_VARINST(NAME_, VAR_TYPE_);
-create index ACT_IDX_HI_PROCVAR_TASK_ID on ACT_HI_VARINST(TASK_ID_);
-create index ACT_IDX_HI_ACT_INST_PROCINST on ACT_HI_ACTINST(PROC_INST_ID_, ACT_ID_);
-create index ACT_IDX_HI_ACT_INST_EXEC on ACT_HI_ACTINST(EXECUTION_ID_, ACT_ID_);
-create index ACT_IDX_HI_IDENT_LNK_USER on ACT_HI_IDENTITYLINK(USER_ID_);
-create index ACT_IDX_HI_IDENT_LNK_TASK on ACT_HI_IDENTITYLINK(TASK_ID_);
-create index ACT_IDX_HI_IDENT_LNK_PROCINST on ACT_HI_IDENTITYLINK(PROC_INST_ID_);
-create index ACT_IDX_HI_TASK_INST_PROCINST on ACT_HI_TASKINST(PROC_INST_ID_);

+ 0 - 46
jeecg-boot-module-activiti/db/create/activiti.mysql.create.identity.sql

@@ -1,46 +0,0 @@
-create table ACT_ID_GROUP (
-    ID_ varchar(64),
-    REV_ integer,
-    NAME_ varchar(255),
-    TYPE_ varchar(255),
-    primary key (ID_)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
-
-create table ACT_ID_MEMBERSHIP (
-    USER_ID_ varchar(64),
-    GROUP_ID_ varchar(64),
-    primary key (USER_ID_, GROUP_ID_)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
-
-create table ACT_ID_USER (
-    ID_ varchar(64),
-    REV_ integer,
-    FIRST_ varchar(255),
-    LAST_ varchar(255),
-    EMAIL_ varchar(255),
-    PWD_ varchar(255),
-    PICTURE_ID_ varchar(64),
-    primary key (ID_)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
-
-create table ACT_ID_INFO (
-    ID_ varchar(64),
-    REV_ integer,
-    USER_ID_ varchar(64),
-    TYPE_ varchar(64),
-    KEY_ varchar(255),
-    VALUE_ varchar(255),
-    PASSWORD_ LONGBLOB,
-    PARENT_ID_ varchar(255),
-    primary key (ID_)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
-
-alter table ACT_ID_MEMBERSHIP 
-    add constraint ACT_FK_MEMB_GROUP 
-    foreign key (GROUP_ID_) 
-    references ACT_ID_GROUP (ID_);
-
-alter table ACT_ID_MEMBERSHIP 
-    add constraint ACT_FK_MEMB_USER 
-    foreign key (USER_ID_) 
-    references ACT_ID_USER (ID_);

+ 2 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/config/ShiroConfig.java

@@ -176,6 +176,8 @@ public class ShiroConfig {
         filterChainDefinitionMap.put("/ctop/checkTaskList/*", "anon");
         filterChainDefinitionMap.put("/ctop/report/bytedance/*", "anon");
         filterChainDefinitionMap.put("/shiwan/shiwanFileUpload/*", "anon");
+        filterChainDefinitionMap.put("/oa/wechatNoList/*", "anon");
+        filterChainDefinitionMap.put("/ruleGroup/*", "anon");
 
         // 添加自己的过滤器并且取名为jwt
         Map<String, Filter> filterMap = new HashMap<>(1);

+ 2 - 2
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/BytedanceMusicInfoController.java

@@ -39,7 +39,7 @@ public class BytedanceMusicInfoController {
     private IFileInfoService fileInfoService;
 
     @PostMapping(value = "/netEaseDownLoad")
-    public void netEasedownLoad(JSONObject data, HttpServletResponse response) throws Exception {
+    public void netEasedownLoad(@RequestBody JSONObject data, HttpServletResponse response) throws Exception {
         String fileName = data.getString("musicName");
         String fileUrl = data.getString("musicUrl");
         String filePath = fileInfoService.downLoadByUrl(fileUrl);
@@ -60,7 +60,7 @@ public class BytedanceMusicInfoController {
         toClient.close();
     }
 
-    @GetMapping(value = "/downLoad")
+    @PostMapping(value = "/downLoad")
     public void downLoad(Long id, HttpServletResponse response) throws Exception {
         if (null == id || id == 0) {
             log.error("抖音音乐文件下载异常:参数异常");

+ 42 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/TestController.java

@@ -99,6 +99,48 @@ public class TestController {
         }
     }
 
+    @GetMapping("getKuaishouPlanHourlyReport")
+    public Map<String,Object> getKuaishouPlanHourlyReport(String params){
+        Long start = System.currentTimeMillis();
+        Map<String,Object>result = new HashMap<>();
+        if(null == params||params.trim().equals("")){
+            ResultMapUtils.setResultMap(result,StatusCode.COMMON_PARAM_ERROR);
+            result.put("message","COMMON_PARAM_ERROR");
+            return result;
+        }
+        Long accountId = Long.parseLong(params);
+        CtopOauthToken token = tokenService.getTokenByAccountId(accountId);
+        if(null == token){
+            ResultMapUtils.setResultMap(result,StatusCode.COMMON_PARAM_ERROR);
+            result.put("message","TOKEN_IS_NULL");
+            return result;
+        }
+        Date getDate = new Date();
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH");
+        String hour = simpleDateFormat.format(getDate);
+        if ("00".equals(hour)) {
+            getDate = DateUtils.addDay(getDate, -1);
+        }
+        //1:查询当日数据
+        Date finalGetDate = getDate;
+        try {
+            kuaishouInterfaceService.getAdvertiserCampaignReportHourly(token, finalGetDate, finalGetDate);
+            ResultMapUtils.setResultMap(result,StatusCode.COMMON_SUCCESS);
+            result.put("message","SUCCESS");
+            long end = System.currentTimeMillis();
+            log.info("执行时长:{}毫秒",end-start);
+            return result;
+        }catch (Exception e){
+            e.printStackTrace();
+            ResultMapUtils.setResultMap(result,StatusCode.COMMON_SERVER_ERROR);
+            result.put("message","COMMON_SERVER_ERROR");
+            return result;
+        }
+    }
+
+
+
+
     @GetMapping(value = "/getMd5")
     public void getMd5() {
         kuaiShouHistoryReportTaskService.getMd5(null, null);

+ 27 - 4
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/YardController.java

@@ -1,9 +1,8 @@
 package org.jeecg.modules.ctop.controller;
 
-import cn.com.ctop.manage.modules.actor.entity.Yard;
-import cn.com.ctop.manage.modules.actor.entity.YardComment;
-import cn.com.ctop.manage.modules.actor.entity.YardPhoto;
-import cn.com.ctop.manage.modules.actor.entity.YardVideo;
+import cn.com.ctop.common.module.utils.Check;
+import cn.com.ctop.common.module.utils.KuaishouInterfaceConstant;
+import cn.com.ctop.manage.modules.actor.entity.*;
 import cn.com.ctop.manage.modules.actor.service.IYardCommentService;
 import cn.com.ctop.manage.modules.actor.service.IYardPhotoService;
 import cn.com.ctop.manage.modules.actor.service.IYardService;
@@ -49,7 +48,31 @@ public class YardController {
     public Result<Yard> add(@RequestBody Yard yard) {
         Result<Yard> result = new Result<>();
         try {
+            String coverUrl = yard.getCoverUrl();
+            if (!Check.isNull(coverUrl) && !coverUrl.contains(KuaishouInterfaceConstant.HTTPS_PREFIX)) {
+                yard.setCoverUrl(KuaishouInterfaceConstant.HTTPS_PREFIX + coverUrl);
+            }
             yardService.save(yard);
+            if (null != yard.getImageUrl() && !yard.getImageUrl().isEmpty()) {
+                for (String url : yard.getImageUrl()) {
+                    YardPhoto photo = new YardPhoto();
+                    photo.setYardId(yard.getId());
+                    if (!Check.isNull(url) && !url.contains(KuaishouInterfaceConstant.HTTPS_PREFIX)) {
+                        photo.setPhotoUrl(KuaishouInterfaceConstant.HTTPS_PREFIX + url);
+                    }
+                    yardPhotoService.save(photo);
+                }
+            }
+            if (yard.getVideoUrl() != null && !yard.getVideoUrl().isEmpty()) {
+                for (String url : yard.getVideoUrl()) {
+                    YardVideo video = new YardVideo();
+                    video.setYardId(yard.getId());
+                    if (!Check.isNull(url) && !url.contains(KuaishouInterfaceConstant.HTTPS_PREFIX)) {
+                        video.setVideoUrl(KuaishouInterfaceConstant.HTTPS_PREFIX + url);
+                    }
+                    yardVideoService.save(video);
+                }
+            }
             result.success("添加成功!");
         } catch (Exception e) {
             log.error(e.getMessage(), e);

+ 1 - 1
jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysBaseApiImpl.java

@@ -124,7 +124,7 @@ public class SysBaseApiImpl implements ISysBaseApi {
     }
 
     @Override
-//    @Cacheable(cacheNames = CacheConstant.SYS_USERS_CACHE, key = "#username")
+    @Cacheable(cacheNames = CacheConstant.SYS_USERS_CACHE, key = "#username")
     public LoginUser getUserByName(String username) {
         if (oConvertUtils.isEmpty(username)) {
             return null;

+ 0 - 1
jeecg-boot-module-system/src/main/java/org/jeecg/modules/wps/controller/WpsFileController.java

@@ -1,7 +1,6 @@
 package org.jeecg.modules.wps.controller;
 
 import cn.com.ctop.common.module.annotation.AutoLog;
-import cn.com.ctop.common.module.constant.CtopRoleCodeConstant;
 import cn.com.ctop.common.module.service.ISysRoleExtService;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;

+ 2 - 3
jeecg-boot-module-system/src/main/resources/application-wps.yml

@@ -57,7 +57,6 @@ spring:
     exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
   datasource:
     url: jdbc:mysql://139.186.27.96:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false
-#    url: jdbc:mysql://39.106.184.70:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false
     username: hcst
     password: test@20190531
     driver-class-name: com.mysql.jdbc.Driver
@@ -70,7 +69,8 @@ spring:
         enabled: true
     #      remove-abandoned: false
     dynamic:
-      druid: # 全局druid参数,绝大部分值和默认保持一致。(现已支持的参数如下,不清楚含义不要乱设置)
+      druid:
+        # 全局druid参数,绝大部分值和默认保持一致。(现已支持的参数如下,不清楚含义不要乱设置)
         # 连接池的配置信息
         # 初始化大小,最小,最大
         connection-init-sql: set names utf8mb4
@@ -97,7 +97,6 @@ spring:
       datasource:
         master:
           url: jdbc:mysql://139.186.27.96:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false
-#          url: jdbc:mysql://39.106.184.70:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false
           username: hcst
           password: test@20190531
           driver-class-name: com.mysql.jdbc.Driver

+ 109 - 118
jeecg-boot-module-system/src/test/java/org/jeecg/SampleTest.java

@@ -1,24 +1,27 @@
 package org.jeecg;
 
+import cn.com.ctop.alarm.modules.service.IAlarmEventSendService;
 import cn.com.ctop.common.module.entity.BindAccountLogin;
 import cn.com.ctop.common.module.entity.CtopOauthToken;
 import cn.com.ctop.common.module.entity.UserAllocation;
-import cn.com.ctop.common.module.message.handle.impl.EmailSendMsgHandle;
-import cn.com.ctop.common.module.service.*;
+import cn.com.ctop.common.module.service.IBindAccountLoginService;
+import cn.com.ctop.common.module.service.ICtopOauthTokenService;
+import cn.com.ctop.common.module.service.ISendMessageService;
+import cn.com.ctop.common.module.service.IUserAllocationService;
 import cn.com.ctop.common.module.utils.CtopAdConstant;
-import cn.com.ctop.common.module.utils.HttpUtils;
+import cn.com.ctop.kuaishou.modules.batch.service.IKuaiShouDailyReportTaskService;
 import cn.com.ctop.kuaishou.modules.batch.service.IKuaiShouHistoryReportTaskService;
 import cn.com.ctop.kuaishou.modules.batch.service.IKuaishouInterfaceService;
 import cn.com.ctop.kuaishou.modules.graphql.service.IKuaishouWebInterfaceService;
+import cn.com.ctop.kuaishou.modules.report.service.IKuaishouCostGroupService;
 import cn.com.ctop.kuaishou.modules.report.service.IKuaishouReportDailyAgentService;
+import cn.com.ctop.oa.modules.service.IWechatCheckinDataService;
+import cn.com.ctop.oa.modules.service.IWechatNoListService;
+import cn.com.ctop.oa.modules.service.IWechatUserListService;
 import cn.com.ctop.toutiao.modules.material.service.IByteDanceAdvertiserDataService;
 import cn.com.ctop.toutiao.modules.report.service.IBytedanceFundDailyService;
-import cn.com.ctop.toutiao.modules.report.service.IBytedanceReportService;
 import cn.com.ctop.toutiao.modules.report.service.IReportService;
-import cn.com.ctop.toutiao.modules.report.service.IRuleByteDanceAccountService;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.xxl.job.core.log.XxlJobLogger;
 import lombok.extern.slf4j.Slf4j;
 import org.jeecg.common.util.DateUtils;
 import org.junit.Test;
@@ -37,6 +40,8 @@ import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 
+import static org.jeecg.common.util.DateUtils.getAnotherDay;
+
 @RunWith(SpringRunner.class)
 @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
 @ActiveProfiles("wps")
@@ -76,9 +81,6 @@ public class SampleTest {
             int i = 0;
             for (BindAccountLogin login : list) {
                 if (null == login.getCookie() || "".equals(login.getCookie().trim())) {
-                    if (i > 5) {
-                        break;
-                    }
                     kuaishouWebInterfaceService.getkuaishouWebLoginCookie(login);
                     i++;
                 }
@@ -116,67 +118,25 @@ public class SampleTest {
         }
     }
 
-    @Test
-    public void testXxlJobDistribute(){
-        String url = "http://127.0.0.1:8090/xxl-job-admin/jobinfo/trigger?id=88&executorParam=";
-        for(int i=0;i<100;i++){
-            String result = HttpUtils.httpPostRequest(url+i,new HashMap<>(),new HashMap<>());
-            System.out.println(result);
-        }
-    }
-
-    @Test
-    public void testLoadRulePlanData(){
-        Date date = new Date();
-        List<CtopOauthToken> tokens = tokenService.selectToutiaoToken();
-        executorService = Executors.newFixedThreadPool(10);
-        countDownLatch = new CountDownLatch(tokens.size());
-        tokens.forEach(token -> executorService.submit(()->{
-            try {
-                Long start = System.currentTimeMillis();
-                reportService.getAdvertiserPlanRuleData(token,date,date,CtopAdConstant.BYTEDANCE_REPORT_TYPE_DAILY);
-                Long end = System.currentTimeMillis();
-                log.info("账户数据获取完成:accountId=>{},耗时{}毫秒",token.getAccountId(),end-start);
-            }catch (Exception e){
-                e.printStackTrace();
-            }finally {
-                countDownLatch.countDown();
-            }
-        }));
-
-        try {
-            countDownLatch.await();
-        } catch (InterruptedException e) {
-            e.printStackTrace();
-        }
-    }
-
-    @Test
-    public void testLoadRuleData(){
-        Date date = new Date();
-        CtopOauthToken token = tokenService.getTokenByAccountId(1678335716586632L);
-        reportService.getAdvertiserPlanRuleData(token,date,date,CtopAdConstant.BYTEDANCE_REPORT_TYPE_DAILY);
-    }
-
     @Autowired
     private IUserAllocationService allocationService;
 
     @Test
     public void testLoadBytedanceData() {
-        List<UserAllocation>allocations = allocationService.getByParams(273L,null,0);
-        if(null!=allocations&&!allocations.isEmpty()){
-            for(UserAllocation allocation:allocations){
+        List<UserAllocation> allocations = allocationService.getByParams(633L, null, 0);
+        if (null != allocations && !allocations.isEmpty()) {
+            for (UserAllocation allocation : allocations) {
                 CtopOauthToken token = tokenService.getTokenByAccountId(allocation.getAccountId());
-                String startDate = "2020-11-05";
-                String endDate = "2020-11-09";
-                reportService.getAdvertiserPlanReport(token, DateUtils.parseDate(startDate,"yyyy-MM-dd"), DateUtils.parseDate(endDate,"yyyy-MM-dd"), CtopAdConstant.BYTEDANCE_REPORT_TYPE_DAILY);
+                String startDate = "2020-11-10";
+                String endDate = "2020-11-10";
+                reportService.getAdvertiserReport(token, DateUtils.parseDate(startDate, "yyyy-MM-dd"), DateUtils.parseDate(endDate, "yyyy-MM-dd"), CtopAdConstant.BYTEDANCE_REPORT_TYPE_HOURLY);
             }
         }
         System.out.println("任务结束");
     }
 
     @Test
-    public void loadBytedancePlanData(){
+    public void loadBytedancePlanData() {
         CtopOauthToken token = tokenService.getTokenByAccountId(100198696723L);
 //        advertiserDataService.getAdvertiserPlan(token, "", null, null);
         Date getDate = DateUtils.addDay(new Date(), 0);
@@ -185,15 +145,16 @@ public class SampleTest {
 
     @Autowired
     private IBytedanceFundDailyService bytedanceFundDailyService;
+
     @Test
     public void loadFoudData() {
         List<CtopOauthToken> tokens = tokenService.selectToutiaoToken();
         for (CtopOauthToken token : tokens) {
-            System.out.println(token.getAccountId()+"############################");
-            for(int i=20;i<130;i++){
-                Date date = DateUtils.addDay(new Date(),-i);
-                bytedanceFundDailyService.loadFundDataByPage(token, DateUtils.formatDate(date), DateUtils.formatDate(date),1);
-                System.out.println(i+"############################");
+            System.out.println(token.getAccountId() + "############################");
+            for (int i = 20; i < 130; i++) {
+                Date date = DateUtils.addDay(new Date(), -i);
+                bytedanceFundDailyService.loadFundDataByPage(token, DateUtils.formatDate(date), DateUtils.formatDate(date), 1);
+                System.out.println(i + "############################");
             }
         }
     }
@@ -205,25 +166,42 @@ public class SampleTest {
      * 测试获取快手图片消耗数据任务
      */
     @Test
-    public void loadKuaishouImageTask(){
+    public void loadKuaishouImageTask() {
         List<CtopOauthToken> tokens = tokenService.selectKuaiShouToken();
-        for(int i=1;i<130;i++) {
+        for (int i = 1; i < 130; i++) {
             Date getDate = DateUtils.addDay(new Date(), -i);
             String getDateStr = DateUtils.formatDate(getDate);
             tokens.forEach(token -> reportTaskService.createTask(token.getAccountId(), token.getAccessToken(), getDateStr, getDateStr, CtopAdConstant.KUAISHOU_LOAD_JOB_TYPE_DAILY));
         }
     }
 
+    @Autowired
+    private IKuaiShouDailyReportTaskService dailyReportTaskService;
+
+    /**
+     * 测试获取快手图片消耗数据入库
+     */
+    @Test
+    public void loadKuaishouImageTaskFile() {
+        String nowDate = DateUtils.getDate("yyyy-MM-dd");
+        List<CtopOauthToken> tokens = tokenService.selectKuaiShouToken();
+        for (int i = 1; i < 15; i++) {
+            String statDate = getAnotherDay("yyyy-MM-dd", nowDate, -i);
+            tokens.forEach(token -> dailyReportTaskService.getTaskList(token.getAccountId(), token.getAccessToken(), statDate));
+        }
+        //  查询快手token
+    }
+
     @Test
-    public void testLoadBytedanceImageData(){
-        List<CtopOauthToken>tokens = tokenService.selectToutiaoToken();
+    public void testLoadBytedanceImageData() {
+        List<CtopOauthToken> tokens = tokenService.selectToutiaoToken();
         countDownLatch = new CountDownLatch(tokens.size());
         executorService = Executors.newFixedThreadPool(8);
-        tokens.forEach(token->executorService.submit(()->{
+        tokens.forEach(token -> executorService.submit(() -> {
             try {
                 advertiserDataService.getMaterialList(token);
-            }catch (Exception e){
-            }finally {
+            } catch (Exception e) {
+            } finally {
                 countDownLatch.countDown();
             }
         }));
@@ -235,17 +213,32 @@ public class SampleTest {
         System.out.println("素材数据获取完成");
 
     }
-
     @Autowired
     private IKuaishouReportDailyAgentService kuaishouReportDailyAgentService;
     @Test
-    public void loadKuaishouAgentData() throws JsonProcessingException {
+    public void testData(){
+        Date date = new Date();
+        List<CtopOauthToken> tokens = tokenService.selectToutiaoToken();
+        executorService = Executors.newFixedThreadPool(10);
+        countDownLatch = new CountDownLatch(tokens.size());
+        tokens.forEach(token -> executorService.submit(()->{
+            try {
+                reportService.getAdvertiserPlanRuleData(token,date,date,CtopAdConstant.BYTEDANCE_REPORT_TYPE_DAILY);
+            }catch (Exception e){
+
+            }finally {
+                countDownLatch.countDown();
+            }
+        }));
+        try {
+            countDownLatch.await();
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+    }
+    @Test
+    public void loadKuaishouAgentData() {
         kuaishouReportDailyAgentService.loginAgent();
-//        for (int i = 0; i < 20; i++) {
-//            String currentDate = DateUtils.formatDate(DateUtils.addDay(new Date(), -i));
-//            kuaishouReportDailyAgentService.getReport(currentDate, DateUtils.getNowDate("yyyy-MM-dd"));
-//        }
-//
         try {
             for (int i = 1; i < 30; i++) {
                 kuaishouReportDailyAgentService.getAccount(i);
@@ -254,6 +247,15 @@ public class SampleTest {
             e.printStackTrace();
         }
     }
+
+    @Autowired
+    private ISendMessageService sendMessageService;
+
+    @Test
+    public void testSendMessage() {
+        sendMessageService.sendMessage("c445fec9a80347aea54e8db66692ec03", "测试信息发送!");
+    }
+
     @Autowired
     private IKuaishouInterfaceService kuaishouInterfaceService;
 
@@ -268,52 +270,41 @@ public class SampleTest {
     }
 
 
-    @Autowired
-    IUReportExportService uReportExportService;
-    @Autowired
-    EmailSendMsgHandle emailSendMsgHandle;
-    @Autowired
-    IUReportService uReportService;
-
-    @Autowired
-    private IBytedanceReportService bytedanceReportService;
     @Test
-    public void loadMatData(){
-        List<UserAllocation> allocations = allocationService.getByParams(289L,null,0);
-        countDownLatch = new CountDownLatch(allocations.size());
-        executorService = Executors.newFixedThreadPool(2);
-        allocations.forEach(allocation -> {
-            executorService.submit(new Runnable() {
-                @Override
-                public void run() {
-                    try {
-                        CtopOauthToken token = tokenService.getTokenByAccountId(allocation.getAccountId());
-                        //获取全量视频素材数据
-                        advertiserDataService.getMaterialList(token);
-                    } catch (Exception e) {
-                        e.printStackTrace();
-                    } finally {
-                        countDownLatch.countDown();
-                    }
-                }
-            });
-        });
-        try {
-            countDownLatch.await();
-        } catch (InterruptedException e) {
-            e.printStackTrace();
+    public void loadAccountData() {
+//        List<UserAllocation> allocations = allocationService.getByParams(776L,null,0);
+//        for (UserAllocation allocation:allocations) {
+        CtopOauthToken token = tokenService.getTokenByAccountId(93238965516L);
+        for (int i = 92; i < 100; i++) {
+            Date getDate = DateUtils.addDay(new Date(), -i);
+            reportService.getAdvertiserReport(token, getDate, getDate, CtopAdConstant.BYTEDANCE_REPORT_TYPE_DAILY);
         }
-        XxlJobLogger.log("物料数据同步完成");
+//        }
     }
 
+
+    @Autowired
+    private IKuaishouCostGroupService kuaishouCostGroupService;
     @Autowired
-    IRuleByteDanceAccountService ruleByteDanceAccountService;
+    private IAlarmEventSendService alarmEventSendService;
 
     @Test
-    public void cleanRuleDataAccount(){
-        List<CtopOauthToken> tokens = oauthTokenService.selectToutiaoToken();
-        for(CtopOauthToken oauthToken:tokens){
-            ruleByteDanceAccountService.cleanRuleDataAccount(oauthToken.getAccountId());
-        }
+    public void addTest() {
+        kuaishouCostGroupService.saveInfo();
+    }
+
+    @Test
+    public void sendTest() {
+        //检查频率 HOUR - 每小时;HALF_HOUR-每半小时
+        alarmEventSendService.matchAlarmRules("HOUR");
     }
+
+    @Autowired
+    private IWechatCheckinDataService wechatCheckinDataService;
+    @Autowired
+    private IWechatUserListService wechatUserInfoService;
+    @Autowired
+    private IWechatNoListService wechatNoListService;
+
+
 }

+ 5 - 10
module-alarm/src/main/java/cn/com/ctop/alarm/modules/constant/MatchLogic.java

@@ -56,7 +56,7 @@ public class MatchLogic {
                     case "less_equal":
                         return bigVal.compareTo(bigThr) <= 0;
                     default:
-                        log.warn("关系不匹配");
+                        log.warn("关系不匹配 type={},condition={},threshold={},value={},", type, condition, threshold, value);
                         break;
                 }
             } else if ("string".equals(type)) {
@@ -66,11 +66,11 @@ public class MatchLogic {
                     case "not_equal":
                         return !value.equals(threshold);
                     case "contain":
-                        return !value.contains(threshold);
+                        return threshold.contains(value);
                     case "no_contain":
-                        return !value.contains(threshold);
+                        return !threshold.contains(value);
                     default:
-                        log.warn("关系不匹配");
+                        log.warn("关系不匹配 type={},condition={},threshold={},value={},", type, condition, threshold, value);
                         break;
                 }
             } else {
@@ -90,13 +90,8 @@ public class MatchLogic {
                         }
                     }
                 } else {
-                    List<String> thresholdArr = strToList(threshold);
                     if ("contain".equals(condition)) {
-                        for (String t : thresholdArr) {
-                            if (t.contains(value)) {
-                                return true;
-                            }
-                        }
+                        return threshold.contains(value);
                     } else {
                         return !threshold.contains(value);
                     }

+ 3 - 3
module-alarm/src/main/java/cn/com/ctop/alarm/modules/entity/AlarmEventSend.java

@@ -41,13 +41,13 @@ public class AlarmEventSend {
      */
     @Excel(name = "规则id", width = 15)
     @ApiModelProperty(value = "规则id")
-    private Long eventRuleId;
+    private Long groupId;
     /**
      * 预警指标
      */
     @Excel(name = "预警指标", width = 15)
     @ApiModelProperty(value = "预警指标")
-    private String metricValueCode;
+    private String groupName;
     /**
      * 预警发送内容
      */
@@ -61,7 +61,7 @@ public class AlarmEventSend {
     @ApiModelProperty(value = "预警发送状态 0未发送,1已发送")
     private String alarmStatus;
 
-    private String alarmCondition;
+    private String ruleDimension;
     /**
      * createTime
      */

+ 4 - 4
module-alarm/src/main/java/cn/com/ctop/alarm/modules/mapper/xml/RuleAccountThresholdMapper.xml

@@ -9,13 +9,13 @@
     </select>
     <select id="selectGroupIdsByAccountId" resultType="java.lang.Long">
        SELECT group_id FROM `ctop_rule_account_threshold`
-        WHERE (batch_no !='' and batch_no is null)
+        WHERE (batch_no !='' and batch_no is not null)
         and  account_id = #{accountId}
         group by group_id
     </select>
     <select id="selectbatchNosByGroupIdId" resultType="java.lang.String">
        SELECT batch_no FROM `ctop_rule_account_threshold`
-        WHERE  (batch_no !='' and batch_no is null)
+        WHERE  (batch_no !='' and batch_no is not null)
         and account_id = #{accountId}
         and group_id = #{groupId}
         GROUP BY batch_no
@@ -28,10 +28,10 @@
     </select>
 
     <select id="getBatchNo" resultType="java.lang.String">
-    select   batch_no from ctop_rule_account_threshold
+    select batch_no from ctop_rule_account_threshold
     where  account_id = #{accountId}
     and group_id = #{groupId}
-    and (batch_no !='' and batch_no is null)
+    and (batch_no !='' and batch_no is not null)
     group by batch_no
     </select>
 </mapper>

+ 4 - 4
module-alarm/src/main/java/cn/com/ctop/alarm/modules/service/impl/AlarmEventSendServiceImpl.java

@@ -279,10 +279,10 @@ public class AlarmEventSendServiceImpl extends ServiceImpl<AlarmEventSendMapper,
                     sendMessageService.sendMessage(rule.getUserId(), msg);
                     AlarmEventSend send = new AlarmEventSend();
                     send.setAlarmDetail(msg);
-                    send.setAlarmStatus(NoEn.NO1.valueStr());
-                    send.setMetricValueCode(rule.getMetricValueCode());
-                    send.setEventRuleId(rule.getEventRuleId());
-                    send.setAlarmCondition(rule.getMetricValueName().concat("预警:").concat(detail.replace("<br/>", ";")));
+
+                    send.setRuleDimension(rule.getMetricValueCode());send.setAlarmStatus(NoEn.NO1.valueStr());
+                    send.setGroupId(rule.getEventRuleId());
+                    send.setGroupName(rule.getMetricValueName().concat("预警:").concat(detail.replace("<br/>", ";")));
                     send.setUserId(rule.getUserId());
                     alarmEventSendMapper.insert(send);
                 }

+ 4 - 1
module-alarm/src/main/java/cn/com/ctop/alarm/modules/service/impl/RuleAccountTemplateServiceImpl.java

@@ -37,7 +37,7 @@ public class RuleAccountTemplateServiceImpl extends ServiceImpl<RuleAccountTempl
     private IRuleAccountThresholdService ruleAccountThresholdService;
 
     /**
-     * 推送模板到账
+     * 推送模板到账
      *
      * @param accountId
      * @param templateId
@@ -95,6 +95,9 @@ public class RuleAccountTemplateServiceImpl extends ServiceImpl<RuleAccountTempl
                 threshold.setAccountId(accountId);
                 threshold.setGroupId(groupId);
                 threshold.setRuleId(ruleBase.getId());
+                if (ruleBase.getVariableType() == 0) {
+                    threshold.setThreshold(ruleBase.getThreshold());
+                }
                 if (isCopy == 1) {
                     threshold.setBatchNo(batchId);
                 }

+ 172 - 91
module-alarm/src/main/java/cn/com/ctop/alarm/modules/service/impl/RuleGroupServiceImpl.java

@@ -25,6 +25,7 @@ import cn.com.ctop.common.module.service.ICtopOauthTokenService;
 import cn.com.ctop.common.module.service.IRuleDataAccountService;
 import cn.com.ctop.common.module.service.ISendMessageService;
 import cn.com.ctop.common.module.utils.Check;
+import cn.com.ctop.common.module.utils.SendMailUtil;
 import cn.com.ctop.kuaishou.modules.batch.service.IKuaiShouUpdateService;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
@@ -35,6 +36,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -82,8 +84,10 @@ public class RuleGroupServiceImpl extends ServiceImpl<RuleGroupMapper, RuleGroup
     private AlarmEventSendMapper alarmEventSendMapper;
     @Autowired
     private UserAllocationMapper userAllocationMapper;
-    ;
     private JSONObject userObj = null;
+    private final static String ACCOUNT = "account";
+    private final static String PLAN = "plan";
+    private final static String CREATIVE = "creative";
 
     @Override
     public void checkRules() {
@@ -92,24 +96,23 @@ public class RuleGroupServiceImpl extends ServiceImpl<RuleGroupMapper, RuleGroup
         //查询账户绑定过的规则模板
         List<RuleAccountTemplate> ruleAccountTemplates = ruleAccountTemplateMapper.selectByMap(null);
         if (Check.isNull(ruleAccountTemplates)) {
-            log.warn("查询账户绑定过的规则模板失败");
+            log.error("查询账户绑定过的规则模板失败");
             return;
         }
         //获取规则集
         Map<Long, Object> ruleGroupMap = getRuleGroupMap();
         if (Check.isNull(ruleGroupMap)) {
-            log.warn("获取规则集失败");
+            log.error("获取规则集失败");
             return;
         }
         //获取指标内容
         JSONObject indicators = getRuleIndicator();
         if (Check.isNull(indicators)) {
-            log.warn("获取指标内容失败");
+            log.error("获取指标内容失败");
             return;
         }
         for (RuleAccountTemplate templates : ruleAccountTemplates) {
-            if (templates.getAccountId() == 1681223758914574l)
-                matchAlarmRules(ruleGroupMap, indicators, templates);
+            matchAlarmRules(ruleGroupMap, indicators, templates);
         }
         Long endTime = System.currentTimeMillis();
         log.info("------end------共耗时: {} ms", endTime - startTime);
@@ -192,17 +195,20 @@ public class RuleGroupServiceImpl extends ServiceImpl<RuleGroupMapper, RuleGroup
                 for (Map.Entry<String, Object> entry : batchNo.entrySet()) {
                     JSONObject thresholdJn = (JSONObject) entry.getValue();
                     if (!Check.isNull(thresholdJn)) {
-                        CombinationRule(ruleGroup, ruleBaseList, thresholdJn, indicators, matchData, type, accountName, complianceList);
+                        CombinationRule(ruleBaseList, thresholdJn, indicators, matchData, complianceList);
                     }
                 }
             } else {
                 boolean isGroup = "group".equals(ruleGroup.getRuleType());
                 //匹配组合规则
                 if (isGroup) {
-                    CombinationRule(ruleGroup, ruleBaseList, thresholdObj, indicators, matchData, type, accountName, complianceList);
+                    CombinationRule(ruleBaseList, thresholdObj, indicators, matchData, complianceList);
                     //匹配单规则
                 } else {
                     RuleBase ruleBase = ruleBaseList.get(0);
+                    if (Check.isNull(ruleBase)) {
+                        continue;
+                    }
                     //指标对象
                     JSONObject indicator = indicators.getJSONObject(ruleBase.getIndicatorCode());
                     //指标阈值
@@ -219,14 +225,14 @@ public class RuleGroupServiceImpl extends ServiceImpl<RuleGroupMapper, RuleGroup
                             String value = obj.getString(ruleBase.getIndicatorCode());
                             if (MatchLogic.matchCondition(indicator.getString("dataType"), ruleBase.getRuleCondition(), threshold, value, obj)) {
                                 complianceList.add(obj);
-//                                sendMsg(ruleGroup, obj, type, accountName);
                             }
                         }
                     }
                 }
             }
-
-
+            if (!Check.isNull(complianceList)) {
+                getAndSendMessag(complianceList, ruleGroup, accountName);
+            }
         }
     }
 
@@ -244,7 +250,7 @@ public class RuleGroupServiceImpl extends ServiceImpl<RuleGroupMapper, RuleGroup
      * @throws
      * @author ZHAOXA
      */
-    private void CombinationRule(RuleGroup ruleGroup, List<RuleBase> ruleBaseList, JSONObject thresholdObj, JSONObject indicators, JSONObject matchData, Integer type, String accountName, JSONArray complianceList) {
+    private void CombinationRule(List<RuleBase> ruleBaseList, JSONObject thresholdObj, JSONObject indicators, JSONObject matchData, JSONArray complianceList) {
         //符合规则的数据集
         JSONArray targetDatas = new JSONArray();
         JSONArray planDatas = new JSONArray();
@@ -259,50 +265,113 @@ public class RuleGroupServiceImpl extends ServiceImpl<RuleGroupMapper, RuleGroup
             String threshold = thresholdObj.getString(ruleBase.getId().toString());
             //阈值为空时,或者阈值为“unlimited”(不限),不执行该规则
             if (Check.isNull(threshold) || "unlimited".equals(threshold)) {
-                continue;
+                if (!Check.isNull(accountDatas)) {
+                    accountDatas = null;
+                }
+                if (!Check.isNull(planDatas)) {
+                    planDatas = null;
+                }
+                if (!Check.isNull(creativeDatas)) {
+                    creativeDatas = null;
+                }
+                if (!Check.isNull(targetDatas)) {
+                    targetDatas = null;
+                }
+                break;
             }
             JSONArray dimensionData = matchData.getJSONArray(ruleBase.getRuleDimension());
             if (Check.isNull(dimensionData)) {
+                if (!Check.isNull(accountDatas)) {
+                    accountDatas = null;
+                }
+                if (!Check.isNull(planDatas)) {
+                    planDatas = null;
+                }
+                if (!Check.isNull(creativeDatas)) {
+                    creativeDatas = null;
+                }
+                if (!Check.isNull(targetDatas)) {
+                    targetDatas = null;
+                }
                 break;
             }
             //账户维度数据
-            if ("account".equals(ruleBase.getRuleDimension())) {
+            if (ACCOUNT.equals(ruleBase.getRuleDimension())) {
                 JSONObject accountEntity = dimensionData.getJSONObject(0);
                 if (MatchLogic.matchCondition(dataType, ruleBase.getRuleCondition(), threshold, accountEntity.getString(ruleBase.getIndicatorCode()), accountEntity)) {
                     accountDatas.add(accountEntity);
                 } else {
-                    log.warn("匹配规则组({}),账户维度数据不符合直接跳过", ruleGroup.getId());
-                    break;
-                }
-                if (Check.isNull(accountDatas)) {
+                    if (!Check.isNull(accountDatas)) {
+                        accountDatas = null;
+                    }
+                    if (!Check.isNull(planDatas)) {
+                        planDatas = null;
+                    }
+                    if (!Check.isNull(creativeDatas)) {
+                        creativeDatas = null;
+                    }
+                    if (!Check.isNull(targetDatas)) {
+                        targetDatas = null;
+                    }
                     break;
                 }
-            } else if ("plan".equals(ruleBase.getRuleDimension())) {
+            } else if (PLAN.equals(ruleBase.getRuleDimension())) {
                 planDatas = getOKData(planDatas, dimensionData, ruleBase, dataType, threshold);
                 if (Check.isNull(planDatas)) {
+                    if (!Check.isNull(accountDatas)) {
+                        accountDatas = null;
+                    }
+                    if (!Check.isNull(planDatas)) {
+                        planDatas = null;
+                    }
+                    if (!Check.isNull(creativeDatas)) {
+                        creativeDatas = null;
+                    }
+                    if (!Check.isNull(targetDatas)) {
+                        targetDatas = null;
+                    }
                     break;
                 }
-            } else if ("creative".equals(ruleBase.getRuleDimension())) {
+            } else if (CREATIVE.equals(ruleBase.getRuleDimension())) {
                 creativeDatas = getOKData(creativeDatas, dimensionData, ruleBase, dataType, threshold);
                 if (Check.isNull(creativeDatas)) {
+                    if (!Check.isNull(accountDatas)) {
+                        accountDatas = null;
+                    }
+                    if (!Check.isNull(planDatas)) {
+                        planDatas = null;
+                    }
+                    if (!Check.isNull(creativeDatas)) {
+                        creativeDatas = null;
+                    }
+                    if (!Check.isNull(targetDatas)) {
+                        targetDatas = null;
+                    }
                     break;
                 }
             } else if ("target".equals(ruleBase.getRuleDimension())) {
                 targetDatas = getOKData(targetDatas, dimensionData, ruleBase, dataType, threshold);
                 if (Check.isNull(targetDatas)) {
+                    if (!Check.isNull(accountDatas)) {
+                        accountDatas = null;
+                    }
+                    if (!Check.isNull(planDatas)) {
+                        planDatas = null;
+                    }
+                    if (!Check.isNull(creativeDatas)) {
+                        creativeDatas = null;
+                    }
+                    if (!Check.isNull(targetDatas)) {
+                        targetDatas = null;
+                    }
                     break;
                 }
             }
-
         }
         //获取达标可发送的数据
         JSONArray sendData = MatchLogic.getSendData(accountDatas, planDatas, creativeDatas, targetDatas);
         if (!Check.isNull(sendData)) {
             complianceList.addAll(sendData);
-//            //执行发送
-////            for (int i = 0; i < sendData.size(); i++) {
-////                sendMsg(ruleGroup, , type, accountName);
-////            }
         }
     }
 
@@ -338,7 +407,7 @@ public class RuleGroupServiceImpl extends ServiceImpl<RuleGroupMapper, RuleGroup
         return ruleDatas;
     }
 
-    private void sendMag2(JSONArray complianceList, RuleGroup ruleGroup, String accountName) {
+    private void getAndSendMessag(JSONArray complianceList, RuleGroup ruleGroup, String accountName) {
         Long accountId = complianceList.getJSONObject(0).getLong("accountId");
         if (Check.isNull(accountId)) {
             return;
@@ -353,65 +422,69 @@ public class RuleGroupServiceImpl extends ServiceImpl<RuleGroupMapper, RuleGroup
             boolean isNull = obj.getBoolean("isNull");
             if (isNull) {
                 if (!Check.isNull(obj.getString("creativeId"))) {
-                    //字节小于1900时
-                    if (isNullCreativeJoiner.toString().getBytes().length <= 1900) {
+                    //字节小于1800时
+                    if (isNullCreativeJoiner.toString().getBytes().length <= 1800) {
                         isNullCreativeJoiner.add(obj.getString("creativeId"));
                     } else {
-                        String message = MatchLogic.getMessage(ruleGroup.getGroupName(), accountId, accountName, "creative", isNullCreativeJoiner.toString(), false);
-                        sendMsg(message, ruleGroup, user);
+                        String message = MatchLogic.getMessage(ruleGroup.getGroupName(), accountId, accountName, CREATIVE, isNullCreativeJoiner.toString(), isNull);
+                        sendMsg(message, ruleGroup, user, CREATIVE);
                         isNullCreativeJoiner = new StringJoiner(",");
+                        isNullCreativeJoiner.add(obj.getString("creativeId"));
                     }
                 } else if (!Check.isNull(obj.getLong("planId"))) {
-                    if (isNullPlanJoiner.toString().getBytes().length <= 1900) {
+                    if (isNullPlanJoiner.toString().getBytes().length <= 1800) {
                         isNullPlanJoiner.add(obj.getString("planId"));
                     } else {
-                        String msg = MatchLogic.getMessage(ruleGroup.getGroupName(), accountId, accountName, "plan", isNullPlanJoiner.toString(), false);
-                        sendMsg(msg, ruleGroup, user);
+                        String msg = MatchLogic.getMessage(ruleGroup.getGroupName(), accountId, accountName, PLAN, isNullPlanJoiner.toString(), isNull);
+                        sendMsg(msg, ruleGroup, user, PLAN);
                         isNullPlanJoiner = new StringJoiner(",");
+                        isNullPlanJoiner.add(obj.getString("planId"));
                     }
                 } else {
-                    String msg = MatchLogic.getMessage(ruleGroup.getGroupName(), accountId, accountName, null, null, false);
-                    sendMsg(msg, ruleGroup, user);
+                    String msg = MatchLogic.getMessage(ruleGroup.getGroupName(), accountId, accountName, null, null, isNull);
+                    sendMsg(msg, ruleGroup, user, ACCOUNT);
                 }
             } else {
                 if (!Check.isNull(obj.getString("creativeId"))) {
-                    //字节小于1900时
-                    if (creativeJoiner.toString().getBytes().length <= 1900) {
+                    //字节小于1800时(消息支持最大2048字节)
+                    if (creativeJoiner.toString().getBytes().length <= 1800) {
                         creativeJoiner.add(obj.getString("creativeId"));
                     } else {
-                        String message = MatchLogic.getMessage(ruleGroup.getGroupName(), accountId, accountName, "creative", creativeJoiner.toString(), false);
-                        sendMsg(message, ruleGroup, user);
+                        String message = MatchLogic.getMessage(ruleGroup.getGroupName(), accountId, accountName, CREATIVE, creativeJoiner.toString(), isNull);
+                        sendMsg(message, ruleGroup, user, CREATIVE);
                         creativeJoiner = new StringJoiner(",");
+                        creativeJoiner.add(obj.getString("creativeId"));
                     }
                 } else if (!Check.isNull(obj.getLong("planId"))) {
-                    if (planJoiner.toString().getBytes().length <= 1900) {
+                    if (planJoiner.toString().getBytes().length <= 1800) {
                         planJoiner.add(obj.getString("planId"));
                     } else {
-                        String msg = MatchLogic.getMessage(ruleGroup.getGroupName(), accountId, accountName, "plan", planJoiner.toString(), false);
-                        sendMsg(msg, ruleGroup, user);
+                        String msg = MatchLogic.getMessage(ruleGroup.getGroupName(), accountId, accountName, PLAN, planJoiner.toString(), isNull);
+                        sendMsg(msg, ruleGroup, user, PLAN);
                         planJoiner = new StringJoiner(",");
+                        planJoiner.add(obj.getString("planId"));
                     }
                 } else {
-                    String msg = MatchLogic.getMessage(ruleGroup.getGroupName(), accountId, accountName, null, null, false);
-                    sendMsg(msg, ruleGroup, user);
+                    String msg = MatchLogic.getMessage(ruleGroup.getGroupName(), accountId, accountName, null, null, isNull);
+                    sendMsg(msg, ruleGroup, user, ACCOUNT);
                 }
             }
         }
-        String creativeMsg = MatchLogic.getMessage(ruleGroup.getGroupName(), accountId, "creative", creativeJoiner.toString(), accountName, false);
-        if (!Check.isNull(creativeMsg)) {
-            sendMsg(creativeMsg, ruleGroup, user);
+        if (!Check.isNull(creativeJoiner.toString())) {
+            String creativeMsg = MatchLogic.getMessage(ruleGroup.getGroupName(), accountId, accountName, CREATIVE, creativeJoiner.toString(), false);
+            sendMsg(creativeMsg, ruleGroup, user, CREATIVE);
         }
-        String planMsg = MatchLogic.getMessage(ruleGroup.getGroupName(), accountId, "creative", planJoiner.toString(), accountName, false);
-        if (!Check.isNull(planMsg)) {
-            sendMsg(planMsg, ruleGroup, user);
+        if (!Check.isNull(planJoiner.toString())) {
+            String planMsg = MatchLogic.getMessage(ruleGroup.getGroupName(), accountId, accountName, PLAN, planJoiner.toString(), false);
+            sendMsg(planMsg, ruleGroup, user, PLAN);
         }
-        String isNullCreativeMsg = MatchLogic.getMessage(ruleGroup.getGroupName(), accountId, "creative", isNullCreativeJoiner.toString(), accountName, false);
-        if (!Check.isNull(isNullCreativeMsg)) {
-            sendMsg(isNullCreativeMsg, ruleGroup, user);
+        if (!Check.isNull(isNullCreativeJoiner.toString())) {
+            String isNullCreativeMsg = MatchLogic.getMessage(ruleGroup.getGroupName(), accountId, accountName, CREATIVE, isNullCreativeJoiner.toString(), true);
+            sendMsg(isNullCreativeMsg, ruleGroup, user, CREATIVE);
         }
-        String isNullPlanMsg = MatchLogic.getMessage(ruleGroup.getGroupName(), accountId, "creative", isNullPlanJoiner.toString(), accountName, false);
-        if (!Check.isNull(isNullPlanMsg)) {
-            sendMsg(isNullPlanMsg, ruleGroup, user);
+        if (!Check.isNull(isNullPlanJoiner.toString())) {
+            String isNullPlanMsg = MatchLogic.getMessage(ruleGroup.getGroupName(), accountId, accountName, PLAN, isNullPlanJoiner.toString(), true);
+            sendMsg(isNullPlanMsg, ruleGroup, user, PLAN);
         }
     }
 
@@ -426,9 +499,10 @@ public class RuleGroupServiceImpl extends ServiceImpl<RuleGroupMapper, RuleGroup
      * @throws
      * @author ZHAOXA
      */
-    private void sendMsg(String msg, RuleGroup ruleGroup, JSONObject user) {
-        //TODO 关停操作
-        boolean isPause = false;
+    private void sendMsg(String msg, RuleGroup ruleGroup, JSONObject user, String type) {
+        try {
+            //TODO 关停操作
+            boolean isPause = false;
           /*      "PAUSE".equals(ruleGroup.getOperate());
         if (isPause) {
             if (shutDown(accountId, planId, creativeId, user.getString("id"))) {
@@ -437,42 +511,46 @@ public class RuleGroupServiceImpl extends ServiceImpl<RuleGroupMapper, RuleGroup
             type 1:头条2:快手
         }*/
 //        String msg = MatchLogic.getMsg(ruleGroup, user, obj, isPause, accountName);
-        if (isPause) {
-            msg += "现已被关停,请您及时查看并调整!";
-        } else {
-            msg += "请您及时查看并调整!";
-        }
-        String sendType = ruleGroup.getSendType();
-        if ("SMS".equals(sendType)) {
-
-        } else if ("EMAIL".equals(sendType)) {
+            if (isPause) {
+                msg += "现已被关停,请您及时查看并调整!";
+            } else {
+                msg += "请您及时查看并调整!";
+            }
+            String sendType = ruleGroup.getSendType();
+            if ("SMS".equals(sendType)) {
 
-        } else if ("TEL".equals(sendType)) {
+            } else if ("EMAIL".equals(sendType)) {
+                List<String> mailList = new ArrayList<>();
+                mailList.add(user.getString("email"));
+                SendMailUtil.sendMail(mailList, ruleGroup.getGroupName() + "预警", msg);
+            } else if ("TEL".equals(sendType)) {
 
-        } else {
-            //TODO
-            ISendMessageService sendMessageService = this.sendMessageService;
-//            sendMessageService.sendMessage(user.getString("id"), msg);
-            sendMessageService.sendMessage("1b3deb8258e84df994f1371a51cfc14a", msg);
-            //113dee46c7df464da78c07a985e92cd1 于蒙
-        }
-        if (!Check.isNull(msg)) {
-            AlarmEventSend send = new AlarmEventSend();
-            send.setAlarmDetail(msg);
-            send.setAlarmStatus(NoEn.NO1.valueStr());
-            send.setEventRuleId(ruleGroup.getId());
-            if (msg.contains("预警账户")) {
-                send.setMetricValueCode("account");
-                if (msg.contains("预警计划")) {
-                    send.setMetricValueCode("plan");
-                    if (msg.contains("预警创意")) {
-                        send.setMetricValueCode("creative");
-                    }
+            } else {
+//                for (int i = 0; i < 10000000; i++) {
+//                    sendMessageService.sendMessage("1b3deb8258e84df994f1371a51cfc14a", msg + i);
+//                    Thread.sleep(2000);
+//                }
+                sendMessageService.sendMessage("1b3deb8258e84df994f1371a51cfc14a", msg);
+                Thread.sleep(200);
+            }
+            if (!Check.isNull(msg)) {
+                AlarmEventSend send = new AlarmEventSend();
+                send.setUserId(user.getString("id"));
+                send.setAlarmDetail(msg.replace("<br/>", ""));
+                send.setAlarmStatus(NoEn.NO1.valueStr());
+                send.setGroupId(ruleGroup.getId());
+                send.setGroupName(ruleGroup.getGroupName());
+                if (CREATIVE.equals(type)) {
+                    send.setRuleDimension(CREATIVE);
+                } else if (PLAN.equals(type)) {
+                    send.setRuleDimension(PLAN);
+                } else {
+                    send.setRuleDimension(ACCOUNT);
                 }
+                alarmEventSendMapper.insert(send);
             }
-            send.setAlarmCondition(ruleGroup.getGroupName());
-            send.setUserId(user.getString("id"));
-            alarmEventSendMapper.insert(send);
+        } catch (Exception e) {
+            log.error("发送消息异常", e);
         }
     }
 
@@ -713,6 +791,9 @@ public class RuleGroupServiceImpl extends ServiceImpl<RuleGroupMapper, RuleGroup
                                     continue;
                                 }
                                 RuleAccountThreshold threshold = new RuleAccountThreshold();
+                                if (ruleBase.getVariableType() == 0) {
+                                    threshold.setThreshold(ruleBase.getThreshold());
+                                }
                                 threshold.setAccountId(accountId);
                                 if (isCopy == 1) {
                                     threshold.setBatchNo(batchId);

+ 5 - 0
module-common/src/main/java/cn/com/ctop/common/module/entity/RuleDataTarget.java

@@ -31,8 +31,13 @@ public class RuleDataTarget {
 	private Long planId;
 	private String planName;
 
+	/**retargetingTagsExclude*/
 	private String retargetingTagsExclude;
 	private String retargetingTagsInclude;
+
+	/**hideIfExists*/
+	@Excel(name = "hideIfExists", width = 15)
+    @ApiModelProperty(value = "hideIfExists")
 	private Integer hideIfExists;
 	/**inventoryType*/
 	@Excel(name = "inventoryType", width = 15)

+ 18 - 0
module-common/src/main/java/cn/com/ctop/common/module/entity/SysUser.java

@@ -2,6 +2,7 @@ package cn.com.ctop.common.module.entity;
 
 import cn.com.ctop.common.module.annotation.Dict;
 import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.fasterxml.jackson.annotation.JsonFormat;
@@ -180,4 +181,21 @@ public class SysUser implements Serializable {
      * (github/github,wechat_enterprise/企业微信,dingtalk/钉钉)
      */
     private String thirdType;
+
+    /**
+     * 职务
+     */
+    @TableField(exist = false)
+    private String position;
+    /**
+     * 区域
+     */
+    @TableField(exist = false)
+    private String area;
+    /**
+     * 部门
+     */
+    @TableField(exist = false)
+    private String depart;
+
 }

+ 5 - 1
module-common/src/main/java/cn/com/ctop/common/module/service/impl/MessageTemplateImpl.java

@@ -5,6 +5,9 @@ import cn.com.ctop.common.module.utils.Check;
 import com.alibaba.fastjson.JSONObject;
 import org.springframework.stereotype.Service;
 
+import java.util.Arrays;
+import java.util.List;
+
 @Service
 public class MessageTemplateImpl implements IMessageTemplate {
 
@@ -187,8 +190,9 @@ public class MessageTemplateImpl implements IMessageTemplate {
                 .append("下的账户:").append(advertiserId + ",").append("<br/>")
                 .append("广告组id为:").append(unitId).append("<br/>")
                 .append("广告组名称为:").append(unit_name).append("<br/>")
-                .append("出价设置过高。").append("<br/>")
+                .append("出价设置过高。").append("<br/>")
                 .append("系统已执行暂停此组操作,请您及时查看!");
         return text.toString();
     }
+
 }

+ 11 - 3
module-job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/ByteDancePlanRuleDataJob.java

@@ -11,6 +11,9 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import java.util.Date;
+import java.util.List;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
 
 @Component
 public class ByteDancePlanRuleDataJob {
@@ -18,16 +21,21 @@ public class ByteDancePlanRuleDataJob {
     private ICtopOauthTokenService tokenService;
     @Autowired
     private IReportService reportService;
+    private ExecutorService executorService = Executors.newFixedThreadPool(10);
 
-    @XxlJob("bytedancePlanLoadJob")
+    @XxlJob("bytedancePlanRuleLoadJob")
     public ReturnT<String> execute(String param) throws Exception {
         Date date = new Date();
         if(null!=param&&!"".equals(param.trim())){
             Long accountId = Long.parseLong(param);
             CtopOauthToken token = tokenService.getTokenByAccountId(accountId);
             reportService.getAdvertiserPlanRuleData(token,date,date,CtopAdConstant.BYTEDANCE_REPORT_TYPE_DAILY);
+            XxlJobLogger.log("头条计划数据清洗完成:accountId=>{}",param);
+            return ReturnT.SUCCESS;
+        }else{
+            List<CtopOauthToken> tokens = tokenService.selectToutiaoToken();
+            tokens.forEach(token -> executorService.submit(()->reportService.getAdvertiserPlanRuleData(token,date,date,CtopAdConstant.BYTEDANCE_REPORT_TYPE_DAILY)));
+            return ReturnT.SUCCESS;
         }
-        XxlJobLogger.log("头条计划数据清洗完成:accountId=>{}",param);
-        return ReturnT.SUCCESS;
     }
 }

+ 12 - 7
module-job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/RuleDataAccountCleanJob.java

@@ -3,6 +3,8 @@ package cn.com.ctop.job.bytedance.handler;
 /**
  *  Created by JQ.bi on 2020.11.16
  */
+
+import cn.com.ctop.common.module.entity.CtopOauthToken;
 import cn.com.ctop.common.module.service.ICtopOauthTokenService;
 import cn.com.ctop.toutiao.modules.report.service.IRuleByteDanceAccountService;
 import com.xxl.job.core.biz.model.ReturnT;
@@ -11,6 +13,7 @@ import com.xxl.job.core.log.XxlJobLogger;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import java.util.List;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 
@@ -23,18 +26,20 @@ public class RuleDataAccountCleanJob {
     @Autowired
     private IRuleByteDanceAccountService ruleByteDanceAccountService;
 
-    private ExecutorService executorPool = Executors.newFixedThreadPool(6);
+    private ExecutorService executorService = Executors.newFixedThreadPool(10);
 
     @XxlJob("ruleDataAccountCleanJob")
     public ReturnT<String> execute(String param) throws Exception {
         XxlJobLogger.log("规则预警账户维度数据开始清洗");
         if (null == param || "".equals(param.trim())) {
-            XxlJobLogger.log("参数异常");
-            return ReturnT.FAIL;
+            List<CtopOauthToken> tokens = oauthTokenService.selectToutiaoToken();
+            tokens.forEach(token -> executorService.submit(()->ruleByteDanceAccountService.cleanRuleDataAccount(token.getAccountId())));
+            return ReturnT.SUCCESS;
+        }else{
+            Long accountId = Long.parseLong(param);
+            ruleByteDanceAccountService.cleanRuleDataAccount(accountId);
+            XxlJobLogger.log("规则预警账户维度数据清洗结束");
+            return ReturnT.SUCCESS;
         }
-        Long accountId = Long.parseLong(param);
-        ruleByteDanceAccountService.cleanRuleDataAccount(accountId);
-        XxlJobLogger.log("规则预警账户维度数据清洗结束");
-        return ReturnT.SUCCESS;
     }
 }

+ 2 - 3
module-job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/WechatApproveAttendanceJob.java

@@ -3,6 +3,7 @@ package cn.com.ctop.job.bytedance.handler;
 
 import cn.com.ctop.oa.modules.service.IWechatNoListService;
 import com.xxl.job.core.biz.model.ReturnT;
+import com.xxl.job.core.enums.NoEn;
 import com.xxl.job.core.handler.annotation.XxlJob;
 import com.xxl.job.core.log.XxlJobLogger;
 import org.jeecg.common.util.DateUtils;
@@ -35,10 +36,8 @@ public class WechatApproveAttendanceJob {
     public ReturnT<String> execute(String param) throws Exception {
         XxlJobLogger.log("--------异常考勤审批数据入库 start ");
         String initMonth = DateUtils.initDateByMonth();
-        long starttime = DateUtils.timeToStamp(DateUtils.getMonthBefore(DateUtils.NEW_FORMAT, initMonth, -1));
-        long endtime = DateUtils.timeToStamp(initMonth);
         //更新审批状态表
-        wechatNoListService.getNoDateByNo(String.valueOf(starttime), String.valueOf(endtime));
+        wechatNoListService.getNoDateByNo(DateUtils.getMonthBefore(DateUtils.NEW_FORMAT, initMonth, -1), initMonth, NoEn.NO0.valueStr());
         XxlJobLogger.log("--------异常考勤审批数据入库 end ");
         return ReturnT.SUCCESS;
     }

+ 1 - 3
module-job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/WechatAttendanceJob.java

@@ -32,10 +32,8 @@ public class WechatAttendanceJob {
     public ReturnT<String> execute(String params) throws Exception {
         XxlJobLogger.log("--------考勤和人员数据入库 start ");
         String beforeDay = DateUtils.getLastDay(DateUtils.formatDate(new Date()), NoEn.NO1.valueInt());
-        long starttime = DateUtils.timeToStamp(beforeDay + " 00:00:00");
-        long endtime = DateUtils.timeToStamp(beforeDay + " 23:59:59");
         //更新员工打卡明细表
-        wechatCheckinDataService.getCheckinData(String.valueOf(starttime), String.valueOf(endtime));
+        wechatCheckinDataService.getCheckinData(beforeDay + " 00:00:00", beforeDay + " 23:59:59");
         XxlJobLogger.log("--------考勤数据入库 end ");
         //更新人员信息表
         wechatUserInfoService.getUserList();

+ 236 - 0
module-job-distribute/pom.xml

@@ -0,0 +1,236 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <artifactId>jeecg-boot-parent</artifactId>
+        <groupId>org.jeecgframework.boot</groupId>
+        <version>2.0.2</version>
+    </parent>
+    <groupId>cn.com.ctop</groupId>
+    <artifactId>module-job-distribute</artifactId>
+    <version>2.0.2</version>
+    <name>module-job-distribute</name>
+
+    <properties>
+        <java.version>1.8</java.version>
+        <spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
+    </properties>
+
+    <repositories>
+        <repository>
+            <id>aliyun</id>
+            <name>aliyun Repository</name>
+            <url>http://maven.aliyun.com/nexus/content/groups/public</url>
+            <snapshots>
+                <enabled>false</enabled>
+            </snapshots>
+        </repository>
+        <repository>
+            <id>jeecg</id>
+            <name>jeecg Repository</name>
+            <url>http://maven.jeecg.org/nexus/content/repositories/jeecg</url>
+            <snapshots>
+                <enabled>false</enabled>
+            </snapshots>
+        </repository>
+        <repository>
+            <id>com.e-iceblue</id>
+            <name>e-iceblue</name>
+            <url>http://repo.e-iceblue.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+
+    <dependencies>
+        <!-- rabbitmq 依赖jar包-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-amqp</artifactId>
+            <version>1.5.2.RELEASE</version>
+        </dependency>
+        <dependency>
+            <groupId>org.jeecgframework.boot</groupId>
+            <artifactId>jeecg-boot-base-common</artifactId>
+            <version>2.0.2</version>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>jcl-over-slf4j</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>cn.com.ctop</groupId>
+            <artifactId>module-media</artifactId>
+            <version>2.0.2</version>
+        </dependency>
+
+        <dependency>
+            <groupId>cn.com.ctop</groupId>
+            <artifactId>module-common</artifactId>
+            <version>2.0.2</version>
+        </dependency>
+        <dependency>
+            <groupId>cn.com.ctop</groupId>
+            <artifactId>module-kuaishou</artifactId>
+            <version>2.0.2</version>
+        </dependency>
+        <dependency>
+            <groupId>cn.com.ctop</groupId>
+            <artifactId>module-toutiao</artifactId>
+            <version>2.0.2</version>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>cn.com.ctop</groupId>
+            <artifactId>module-oa</artifactId>
+            <version>2.0.2</version>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.aliyun.oss</groupId>
+            <artifactId>aliyun-sdk-oss</artifactId>
+            <version>3.5.0</version>
+        </dependency>
+        <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-csv -->
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-csv</artifactId>
+            <version>1.5</version>
+        </dependency>
+        <!--签章-->
+        <dependency>
+            <groupId>org.bouncycastle</groupId>
+            <artifactId>bcprov-jdk15on</artifactId>
+            <version>1.49</version>
+        </dependency>
+        <dependency>
+            <groupId>org.bouncycastle</groupId>
+            <artifactId>bcpkix-jdk15on</artifactId>
+            <version>1.49</version>
+        </dependency>
+        <dependency>
+            <groupId>org.jeecgframework.boot</groupId>
+            <artifactId>module-ctop</artifactId>
+            <version>2.0.2</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi</artifactId>
+            <version>3.17</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml</artifactId>
+            <version>3.17</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml-schemas</artifactId>
+            <version>3.17</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>easyexcel</artifactId>
+            <version>1.1.2-beat1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>cn.com.ctop</groupId>
+            <artifactId>xxl-job-core</artifactId>
+            <version>2.0.2</version>
+        </dependency>
+        <dependency>
+            <groupId>cn.com.ctop</groupId>
+            <artifactId>module-check</artifactId>
+            <version>2.0.2</version>
+        </dependency>
+        <dependency>
+            <groupId>cn.com.ctop</groupId>
+            <artifactId>module-oa</artifactId>
+            <version>2.0.2</version>
+            <scope>compile</scope>
+        </dependency>
+    </dependencies>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.springframework.cloud</groupId>
+                <artifactId>spring-cloud-dependencies</artifactId>
+                <version>${spring-cloud.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.mybatis.generator</groupId>
+                <artifactId>mybatis-generator-maven-plugin</artifactId>
+                <version>1.3.6</version>
+                <configuration>
+                    <!-- 是否覆盖,true表示会替换生成的JAVA文件,false则不覆盖 -->
+                    <overwrite>true</overwrite>
+                </configuration>
+                <dependencies>
+                    <!--mysql驱动包-->
+                    <dependency>
+                        <groupId>mysql</groupId>
+                        <artifactId>mysql-connector-java</artifactId>
+                        <version>5.1.45</version>
+                    </dependency>
+                </dependencies>
+            </plugin>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+        </plugins>
+        <resources>
+            <!-- 解决MyBatis配置文件引入问题 -->
+            <resource>
+                <directory>src/main/java</directory>
+                <includes>
+                    <include>**/*.properties</include>
+                    <include>**/*.xml</include>
+                </includes>
+                <!-- 是否替换资源中的属性-->
+                <filtering>true</filtering>
+            </resource>
+            <resource>
+                <directory>src/main/resources</directory>
+                <filtering>true</filtering>
+            </resource>
+        </resources>
+    </build>
+
+    <profiles>
+        <profile>
+            <id>dev</id>
+            <properties>
+                <!-- 环境标识,需要与配置文件的名称相对应 -->
+                <activatedProperties>dev</activatedProperties>
+            </properties>
+            <activation>
+                <!-- 默认环境 -->
+                <activeByDefault>true</activeByDefault>
+            </activation>
+        </profile>
+        <profile>
+            <id>test</id>
+            <properties>
+                <activatedProperties>test</activatedProperties>
+            </properties>
+        </profile>
+        <profile>
+            <id>prod</id>
+            <properties>
+                <activatedProperties>prod</activatedProperties>
+            </properties>
+        </profile>
+    </profiles>
+</project>

+ 13 - 0
module-job-distribute/src/main/java/cn/com/ctop/module/job/distribute/ModuleJobDistributeApplication.java

@@ -0,0 +1,13 @@
+package cn.com.ctop.module.job.distribute;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class ModuleJobDistributeApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(ModuleJobDistributeApplication.class, args);
+    }
+
+}

+ 27 - 0
module-job-distribute/src/main/java/cn/com/ctop/module/job/distribute/config/AutoPoiConfig.java

@@ -0,0 +1,27 @@
+package cn.com.ctop.module.job.distribute.config;
+
+import org.jeecgframework.core.util.ApplicationContextUtil;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @Author: Scott
+ * @Date: 2018/2/7
+ * @description: autopoi 配置类
+ */
+@Configuration
+public class AutoPoiConfig {
+
+    /**
+	 * excel注解字典参数支持(导入导出字典值,自动翻译)
+	 * 举例: @Excel(name = "性别", width = 15, dicCode = "sex")
+	 * 1、导出的时候会根据字典配置,把值1,2翻译成:男、女;
+	 * 2、导入的时候,会把男、女翻译成1,2存进数据库;
+	 * @return
+	 */
+	@Bean
+	public ApplicationContextUtil applicationContextUtil() {
+		return new ApplicationContextUtil();
+	}
+
+}

+ 97 - 0
module-job-distribute/src/main/java/cn/com/ctop/module/job/distribute/config/BrowseLogHandelInterceptor.java

@@ -0,0 +1,97 @@
+package cn.com.ctop.module.job.distribute.config;
+
+import com.google.common.util.concurrent.ThreadFactoryBuilder;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.jeecg.common.system.util.JwtUtil;
+import org.jeecg.common.util.DateUtils;
+import org.springframework.stereotype.Component;
+import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Created by JQ.bi on 2020.5.8
+ */
+@Component
+@Slf4j
+public class BrowseLogHandelInterceptor extends HandlerInterceptorAdapter {
+
+    private static final String REQUEST_METHOD = "GET_POST_PUT_DELETE_OPTIONS";
+
+    private final static ExecutorService executorServicePool;
+
+    //加载一次
+    static {
+        int threadCount = Runtime.getRuntime().availableProcessors();
+        ThreadFactoryBuilder builder = new ThreadFactoryBuilder();
+        builder.setNameFormat("BrowseLogHandlerFactory");
+        builder.setDaemon(true);
+        builder.setUncaughtExceptionHandler((t, e) -> {
+        });//忽略异常
+        builder.setPriority(Thread.MIN_PRIORITY);
+        executorServicePool = new ThreadPoolExecutor(threadCount, threadCount,
+                0L, TimeUnit.MILLISECONDS,
+                new LinkedBlockingQueue<Runnable>(100000), builder.build(), new ThreadPoolExecutor.DiscardPolicy());
+    }
+
+
+    @Override
+    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
+        if (REQUEST_METHOD.contains(request.getMethod())) {
+            if (request.getRequestURI().endsWith("/sys/permission/getUserPermissionByToken")||request.getRequestURI().endsWith("/getEncryptedString")||request.getRequestURI().endsWith("/login")||request.getRequestURI().endsWith("/sys/annountCement/listByUser")) {
+                return;
+            }
+            boolean isSuccess = true;
+            if (response.getStatus() != 200) {
+                isSuccess = false;
+            }
+            String userName = JwtUtil.getUserNameByToken(request);
+            if (StringUtils.isEmpty(userName)) {
+                log.warn("登陆账号用户名为空");
+            }
+            String token = request.getHeader("X-Access-Token");
+            String uri = request.getRequestURI();
+            String currentDate = DateUtils.now();
+            BrowseLogRunnable runnable = new BrowseLogRunnable(userName, isSuccess,token, uri, currentDate);
+            executorServicePool.submit(runnable);
+        }
+    }
+
+
+    private static class BrowseLogRunnable implements Runnable {
+        String userName;
+        Boolean isSuccess;
+        String token;
+        String uri;
+        String currentDate;
+        BrowseLogRunnable(String userName, boolean isSuccess, String token, String uri, String currentDate) {
+            this.userName = userName;
+            this.isSuccess = isSuccess;
+            this.token = token;
+            this.uri = uri;
+            this.currentDate = currentDate;
+        }
+
+        @Override
+        public void run() {
+            try {
+                if (!StringUtils.isEmpty(token)) {
+                    if(isSuccess){
+                        log.info("-SUCCESS " + currentDate + " 用户:" + userName + " 访问了[" + uri + "]?token=\"" + token + "\"");
+                    }else {
+                        log.info("-FALSE " + currentDate + " 用户:" + userName + "” 访问了[" + uri + "]?token=\"" + token + "\"");
+                    }
+                }
+            } catch (Exception e) {
+                log.error(e.toString());
+            }
+        }
+    }
+}
+

+ 158 - 0
module-job-distribute/src/main/java/cn/com/ctop/module/job/distribute/config/MybatisInterceptor.java

@@ -0,0 +1,158 @@
+package cn.com.ctop.module.job.distribute.config;
+
+import lombok.extern.slf4j.Slf4j;
+import org.apache.ibatis.binding.MapperMethod.ParamMap;
+import org.apache.ibatis.executor.Executor;
+import org.apache.ibatis.mapping.MappedStatement;
+import org.apache.ibatis.mapping.SqlCommandType;
+import org.apache.ibatis.plugin.*;
+import org.apache.shiro.SecurityUtils;
+import org.jeecg.common.system.vo.LoginUser;
+import org.jeecg.common.util.oConvertUtils;
+import org.springframework.stereotype.Component;
+
+import java.lang.reflect.Field;
+import java.util.Date;
+import java.util.Properties;
+
+/**
+ * mybatis拦截器,自动注入创建人、创建时间、修改人、修改时间
+ * @Author scott
+ * @Date  2019-01-19
+ *
+ */
+@Slf4j
+@Component
+@Intercepts({ @Signature(type = Executor.class, method = "update", args = { MappedStatement.class, Object.class }) })
+public class MybatisInterceptor implements Interceptor {
+
+	@Override
+	public Object intercept(Invocation invocation) throws Throwable {
+		MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
+		String sqlId = mappedStatement.getId();
+		log.debug("------sqlId------" + sqlId);
+		SqlCommandType sqlCommandType = mappedStatement.getSqlCommandType();
+		Object parameter = invocation.getArgs()[1];
+		log.debug("------sqlCommandType------" + sqlCommandType);
+
+		if (parameter == null) {
+			return invocation.proceed();
+		}
+		if (SqlCommandType.INSERT == sqlCommandType) {
+			Field[] fields = oConvertUtils.getAllFields(parameter);
+			for (Field field : fields) {
+				log.debug("------field.name------" + field.getName());
+				try {
+					// 获取登录用户信息
+					LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+					if ("createBy".equals(field.getName())) {
+						field.setAccessible(true);
+                        Object localCreateBy = field.get(parameter);
+						field.setAccessible(false);
+                        if (localCreateBy == null || "".equals(localCreateBy)) {
+							String createBy = "jeecg";
+							if (sysUser != null) {
+								// 登录账号
+								createBy = sysUser.getUsername();
+							}
+							if (oConvertUtils.isNotEmpty(createBy)) {
+								field.setAccessible(true);
+								field.set(parameter, createBy);
+								field.setAccessible(false);
+							}
+						}
+					}
+					// 注入创建时间
+					if ("createTime".equals(field.getName())) {
+						field.setAccessible(true);
+                        Object localCreateDate = field.get(parameter);
+						field.setAccessible(false);
+                        if (localCreateDate == null || "".equals(localCreateDate)) {
+							field.setAccessible(true);
+							field.set(parameter, new Date());
+							field.setAccessible(false);
+						}
+					}
+					//注入部门编码
+					if ("sysOrgCode".equals(field.getName())) {
+						field.setAccessible(true);
+                        Object localSysOrgCode = field.get(parameter);
+						field.setAccessible(false);
+                        if (localSysOrgCode == null || "".equals(localSysOrgCode)) {
+							String sysOrgCode = "";
+							// 获取登录用户信息
+							if (sysUser != null) {
+								// 登录账号
+								sysOrgCode = sysUser.getOrgCode();
+							}
+							if (oConvertUtils.isNotEmpty(sysOrgCode)) {
+								field.setAccessible(true);
+								field.set(parameter, sysOrgCode);
+								field.setAccessible(false);
+							}
+						}
+					}
+				} catch (Exception e) {
+				}
+			}
+		}
+		if (SqlCommandType.UPDATE == sqlCommandType) {
+			Field[] fields = null;
+			if (parameter instanceof ParamMap) {
+				ParamMap<?> p = (ParamMap<?>) parameter;
+				parameter = p.get("param1");
+				fields = oConvertUtils.getAllFields(parameter);
+			} else {
+				fields = oConvertUtils.getAllFields(parameter);
+			}
+
+			for (Field field : fields) {
+				log.debug("------field.name------" + field.getName());
+				try {
+					if ("updateBy".equals(field.getName())) {
+						field.setAccessible(true);
+                        Object localUpdateBy = field.get(parameter);
+						field.setAccessible(false);
+                        if (localUpdateBy == null || "".equals(localUpdateBy)) {
+							String updateBy = "jeecg";
+							// 获取登录用户信息
+							LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+							if (sysUser != null) {
+								// 登录账号
+								updateBy = sysUser.getUsername();
+							}
+							if (oConvertUtils.isNotEmpty(updateBy)) {
+								field.setAccessible(true);
+								field.set(parameter, updateBy);
+								field.setAccessible(false);
+							}
+						}
+					}
+					if ("updateTime".equals(field.getName())) {
+						field.setAccessible(true);
+                        Object localUpdateDate = field.get(parameter);
+						field.setAccessible(false);
+                        if (localUpdateDate == null || "".equals(localUpdateDate)) {
+							field.setAccessible(true);
+							field.set(parameter, new Date());
+							field.setAccessible(false);
+						}
+					}
+				} catch (Exception e) {
+				}
+			}
+		}
+		return invocation.proceed();
+	}
+
+	@Override
+	public Object plugin(Object target) {
+		return Plugin.wrap(target, this);
+	}
+
+	@Override
+	public void setProperties(Properties properties) {
+		// TODO Auto-generated method stub
+	}
+
+}

+ 34 - 0
module-job-distribute/src/main/java/cn/com/ctop/module/job/distribute/config/MybatisPlusConfig.java

@@ -0,0 +1,34 @@
+package cn.com.ctop.module.job.distribute.config;
+
+import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * 单数据源配置(jeecg.datasource.open = false时生效)
+ * @Author zhoujf
+ *
+ */
+@Configuration
+@MapperScan(value = {"org.jeecg.modules.**.mapper*", "cn.com.ctop.**.mapper*"})
+public class MybatisPlusConfig {
+
+    /**
+         *  分页插件
+     */
+    @Bean
+    public PaginationInterceptor paginationInterceptor() {
+        return new PaginationInterceptor();
+    }
+
+//    /**
+//     * mybatis-plus SQL执行效率插件【生产环境可以关闭】
+//     */
+//    @Bean
+//    public PerformanceInterceptor performanceInterceptor() {
+//        return new PerformanceInterceptor();
+//    }
+
+
+}

+ 97 - 0
module-job-distribute/src/main/java/cn/com/ctop/module/job/distribute/config/RedisConfig.java

@@ -0,0 +1,97 @@
+package cn.com.ctop.module.job.distribute.config;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
+import com.fasterxml.jackson.annotation.PropertyAccessor;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.ObjectMapper.DefaultTyping;
+import org.springframework.cache.CacheManager;
+import org.springframework.cache.annotation.CachingConfigurerSupport;
+import org.springframework.cache.annotation.EnableCaching;
+import org.springframework.cache.interceptor.KeyGenerator;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.cache.RedisCacheConfiguration;
+import org.springframework.data.redis.cache.RedisCacheManager;
+import org.springframework.data.redis.cache.RedisCacheWriter;
+import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
+import org.springframework.data.redis.serializer.RedisSerializer;
+import org.springframework.data.redis.serializer.StringRedisSerializer;
+
+import javax.annotation.Resource;
+import java.lang.reflect.Method;
+import java.time.Duration;
+import java.util.Arrays;
+
+@Configuration
+@EnableCaching
+public class RedisConfig extends CachingConfigurerSupport {
+
+	@Resource
+	private LettuceConnectionFactory lettuceConnectionFactory;
+
+	/**
+	 * @description 自定义的缓存key的生成策略 若想使用这个key
+	 *              只需要讲注解上keyGenerator的值设置为keyGenerator即可</br>
+	 * @return 自定义策略生成的key
+	 */
+	@Override
+	@Bean
+	public KeyGenerator keyGenerator() {
+		return new KeyGenerator() {
+			@Override
+			public Object generate(Object target, Method method, Object... params) {
+
+				StringBuilder sb = new StringBuilder();
+				sb.append(target.getClass().getName());
+				sb.append(method.getDeclaringClass().getName());
+				Arrays.stream(params).map(Object::toString).forEach(sb::append);
+				return sb.toString();
+			}
+		};
+	}
+
+	/**
+	 * RedisTemplate配置
+	 */
+	@Bean
+	public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory) {
+		// 设置序列化
+		Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class);
+		ObjectMapper om = new ObjectMapper();
+		om.setVisibility(PropertyAccessor.ALL, Visibility.ANY);
+		om.enableDefaultTyping(DefaultTyping.NON_FINAL);
+		jackson2JsonRedisSerializer.setObjectMapper(om);
+		// 配置redisTemplate
+		RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
+		redisTemplate.setConnectionFactory(lettuceConnectionFactory);
+		RedisSerializer<?> stringSerializer = new StringRedisSerializer();
+        // key序列化
+        redisTemplate.setKeySerializer(stringSerializer);
+        // value序列化
+        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
+        // Hash key序列化
+        redisTemplate.setHashKeySerializer(stringSerializer);
+        // Hash value序列化
+        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
+		redisTemplate.afterPropertiesSet();
+		return redisTemplate;
+	}
+
+	/**
+	 * 缓存配置管理器
+	 */
+	@Bean
+	public CacheManager cacheManager(LettuceConnectionFactory factory) {
+		// 以锁写入的方式创建RedisCacheWriter对象
+		RedisCacheWriter writer = RedisCacheWriter.lockingRedisCacheWriter(factory);
+		// 创建默认缓存配置对象
+        //设置缓存默认有效期3小时;
+        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofHours(3));
+
+		RedisCacheManager cacheManager = new RedisCacheManager(writer, config);
+		return cacheManager;
+	}
+
+}

+ 33 - 0
module-job-distribute/src/main/java/cn/com/ctop/module/job/distribute/config/WebMvcConfiguration.java

@@ -0,0 +1,33 @@
+package cn.com.ctop.module.job.distribute.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.cors.CorsConfiguration;
+import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
+import org.springframework.web.filter.CorsFilter;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+/**
+ * Spring Boot 2.0 解决跨域问题
+ *
+ * @Author qinfeng
+ *
+ */
+@Configuration
+public class WebMvcConfiguration implements WebMvcConfigurer {
+	@Bean
+	public CorsFilter corsFilter() {
+		final UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();
+		final CorsConfiguration corsConfiguration = new CorsConfiguration();
+		/* 是否允许请求带有验证信息 */
+		corsConfiguration.setAllowCredentials(true);
+		/* 允许访问的客户端域名 */
+		corsConfiguration.addAllowedOrigin("*");
+		/* 允许服务端访问的客户端请求头 */
+		corsConfiguration.addAllowedHeader("*");
+		/* 允许访问的方法名,GET POST等 */
+		corsConfiguration.addAllowedMethod("*");
+		urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration);
+		return new CorsFilter(urlBasedCorsConfigurationSource);
+	}
+}

+ 71 - 0
module-job-distribute/src/main/java/cn/com/ctop/module/job/distribute/config/XxlJobConfig.java

@@ -0,0 +1,71 @@
+package cn.com.ctop.module.job.distribute.config;
+
+import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
+import com.xxl.job.core.log.XxlJobLogger;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * xxl-job config
+ *
+ * @author xuxueli 2017-04-28
+ */
+@Configuration
+public class XxlJobConfig {
+    @Value("${xxl.job.admin.addresses}")
+    private String adminAddresses;
+
+    @Value("${xxl.job.executor.appname}")
+    private String appName;
+
+    @Value("${xxl.job.executor.ip}")
+    private String ip;
+
+    @Value("${xxl.job.executor.port}")
+    private int port;
+
+    @Value("${xxl.job.accessToken}")
+    private String accessToken;
+
+    @Value("${xxl.job.executor.logpath}")
+    private String logPath;
+
+    @Value("${xxl.job.executor.logretentiondays}")
+    private int logRetentionDays;
+
+
+    @Bean
+    public XxlJobSpringExecutor xxlJobExecutor() {
+        XxlJobLogger.log(">>>>>>>>>>> xxl-job config init.");
+        XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
+        xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
+        xxlJobSpringExecutor.setAppName(appName);
+        xxlJobSpringExecutor.setIp(ip);
+        xxlJobSpringExecutor.setPort(port);
+        xxlJobSpringExecutor.setAccessToken(accessToken);
+        xxlJobSpringExecutor.setLogPath(logPath);
+        xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
+
+        return xxlJobSpringExecutor;
+    }
+
+    /**
+     * 针对多网卡、容器内部署等情况,可借助 "spring-cloud-commons" 提供的 "InetUtils" 组件灵活定制注册IP;
+     *
+     *      1、引入依赖:
+     *          <dependency>
+     *             <groupId>org.springframework.cloud</groupId>
+     *             <artifactId>spring-cloud-commons</artifactId>
+     *             <version>${version}</version>
+     *         </dependency>
+     *
+     *      2、配置文件,或者容器启动变量
+     *          spring.cloud.inetutils.preferred-networks: 'xxx.xxx.xxx.'
+     *
+     *      3、获取IP
+     *          String ip_ = inetUtils.findFirstNonLoopbackHostInfo().getIpAddress();
+     */
+
+
+}

+ 5 - 0
module-job-distribute/src/main/java/cn/com/ctop/module/job/distribute/handler/BytedanceHourlyJob.java

@@ -0,0 +1,5 @@
+package cn.com.ctop.module.job.distribute.handler;
+
+
+public class BytedanceHourlyJob {
+}

+ 154 - 0
module-job-distribute/src/main/java/cn/com/ctop/module/job/distribute/handler/KuaishouHourlyJob.java

@@ -0,0 +1,154 @@
+package cn.com.ctop.module.job.distribute.handler;
+
+import cn.com.ctop.common.module.entity.CtopOauthToken;
+import cn.com.ctop.common.module.service.ICtopOauthTokenService;
+import cn.com.ctop.kuaishou.modules.batch.service.IKuaishouInterfaceService;
+import com.xxl.job.core.biz.model.ReturnT;
+import com.xxl.job.core.handler.annotation.XxlJob;
+import com.xxl.job.core.log.XxlJobLogger;
+import org.jeecg.common.util.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+@Component
+public class KuaishouHourlyJob {
+
+    @Autowired
+    private ICtopOauthTokenService tokenService;
+    @Autowired
+    private IKuaishouInterfaceService kuaishouInterfaceService;
+    /**
+     * 快手账户时报
+     */
+    @XxlJob("kuaishouAccountHourlyJob")
+    public ReturnT<String> kuaishouAccountHourlyJob(String params) throws Exception {
+        if(null == params||params.trim().equals("")){
+            XxlJobLogger.log("获取快手账户时报数据异常:参数不存在");
+            return ReturnT.SUCCESS;
+        }
+        Long accountId = Long.parseLong(params);
+        CtopOauthToken token = tokenService.getTokenByAccountId(accountId);
+        if(null == token){
+            XxlJobLogger.log("获取快手账户时报数据异常:token数据不存在");
+            return ReturnT.SUCCESS;
+        }
+        Date getDate = new Date();
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH");
+        String hour = simpleDateFormat.format(getDate);
+        if ("00".equals(hour)) {
+            getDate = DateUtils.addDay(getDate, -1);
+        }
+        //1:查询当日数据
+        Date finalGetDate = getDate;
+        try {
+            kuaishouInterfaceService.getAdvertiserReportHourly(token, finalGetDate, finalGetDate);
+            XxlJobLogger.log("获取快手账户时报数据成功");
+            return ReturnT.SUCCESS;
+        }catch (Exception e){
+            XxlJobLogger.log("获取快手账户时报数据失败:服务器内部错误");
+            return ReturnT.FAIL;
+        }
+    }
+
+    /**
+     * 快手计划时报
+     */
+    @XxlJob("kuaishouPlanHourlyJob")
+    public ReturnT<String> kuaishouPlanHourlyJob(String params) throws Exception {
+        if(null == params||params.trim().equals("")){
+            XxlJobLogger.log("获取快手计划时报数据异常:参数不存在");
+            return ReturnT.SUCCESS;
+        }
+        Long accountId = Long.parseLong(params);
+        CtopOauthToken token = tokenService.getTokenByAccountId(accountId);
+        if(null == token){
+            XxlJobLogger.log("获取快手计划时报数据异常:token数据不存在");
+            return ReturnT.SUCCESS;
+        }
+        Date getDate = new Date();
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH");
+        String hour = simpleDateFormat.format(getDate);
+        if ("00".equals(hour)) {
+            getDate = DateUtils.addDay(getDate, -1);
+        }
+        //1:查询当日数据
+        Date finalGetDate = getDate;
+        try {
+            kuaishouInterfaceService.getAdvertiserCampaignReportHourly(token, finalGetDate, finalGetDate);
+            XxlJobLogger.log("获取快手计划时报数据成功");
+            return ReturnT.SUCCESS;
+        }catch (Exception e){
+            XxlJobLogger.log("获取快手计划时报数据失败:服务器内部错误");
+            return ReturnT.FAIL;
+        }
+    }
+
+    /**
+     * 快手组时报
+     */
+    @XxlJob("kuaishouGroupHourlyJob")
+    public ReturnT<String> kuaishouGroupHourlyJob(String params) throws Exception {
+        if(null == params||params.trim().equals("")){
+            XxlJobLogger.log("获取快手组时报数据异常:参数不存在");
+            return ReturnT.SUCCESS;
+        }
+        Long accountId = Long.parseLong(params);
+        CtopOauthToken token = tokenService.getTokenByAccountId(accountId);
+        if(null == token){
+            XxlJobLogger.log("获取快手组时报数据异常:token数据不存在");
+            return ReturnT.SUCCESS;
+        }
+        Date getDate = new Date();
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH");
+        String hour = simpleDateFormat.format(getDate);
+        if ("00".equals(hour)) {
+            getDate = DateUtils.addDay(getDate, -1);
+        }
+        //1:查询当日数据
+        Date finalGetDate = getDate;
+        try {
+            kuaishouInterfaceService.getAdvertiserGroupReportHourly(token, finalGetDate, finalGetDate);
+            XxlJobLogger.log("获取快手组时报数据成功");
+            return ReturnT.SUCCESS;
+        }catch (Exception e){
+            XxlJobLogger.log("获取快手组时报数据失败:服务器内部错误");
+            return ReturnT.FAIL;
+        }
+    }
+
+    /**
+     * 快手组时报
+     */
+    @XxlJob("kuaishouCreativeHourlyJob")
+    public ReturnT<String> kuaishouCreativeHourlyJob(String params) throws Exception {
+        if(null == params||params.trim().equals("")){
+            XxlJobLogger.log("获取快手创意时报数据异常:参数不存在");
+            return ReturnT.SUCCESS;
+        }
+        Long accountId = Long.parseLong(params);
+        CtopOauthToken token = tokenService.getTokenByAccountId(accountId);
+        if(null == token){
+            XxlJobLogger.log("获取快手创意时报数据异常:token数据不存在");
+            return ReturnT.SUCCESS;
+        }
+        Date getDate = new Date();
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH");
+        String hour = simpleDateFormat.format(getDate);
+        if ("00".equals(hour)) {
+            getDate = DateUtils.addDay(getDate, -1);
+        }
+        //1:查询当日数据
+        Date finalGetDate = getDate;
+        try {
+            kuaishouInterfaceService.getAdvertiserCreativeReportHourly(token, finalGetDate, finalGetDate);
+            XxlJobLogger.log("获取快手创意时报数据成功");
+            return ReturnT.SUCCESS;
+        }catch (Exception e){
+            XxlJobLogger.log("获取快手创意时报数据失败:服务器内部错误");
+            return ReturnT.FAIL;
+        }
+    }
+}

+ 155 - 0
module-job-distribute/src/main/resources/application-dev.yml

@@ -0,0 +1,155 @@
+management:
+  endpoints:
+    web:
+      exposure:
+        include: metrics,httptrace
+
+spring:
+  servlet:
+    multipart:
+      max-file-size: -1
+      max-request-size: -1
+  mail:
+    host: smtp.163.com
+    username: jeecgos@163.com
+    password: ??
+    properties:
+      mail:
+        smtp:
+          auth: true
+          starttls:
+            enable: true
+            required: true
+  #json 时间戳统一转换
+  jackson:
+    date-format:   yyyy-MM-dd HH:mm:ss
+    time-zone:   GMT+8
+  aop:
+    proxy-target-class: true
+  # 设置静态文件路径,js,css等
+  mvc:
+    static-path-pattern: /**
+  resource:
+    static-locations: classpath:/static/,classpath:/public/
+  autoconfigure:
+    exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
+  datasource:
+    druid:
+      removeAbandoned: true
+      removeAbandonedTimeout: 300
+      stat-view-servlet:
+        enabled: true
+        loginUsername: admin
+        loginPassword: 123456
+      web-stat-filter:
+        enabled: true
+    dynamic:
+      druid: # 全局druid参数,绝大部分值和默认保持一致。(现已支持的参数如下,不清楚含义不要乱设置)
+        # 连接池的配置信息
+        # 初始化大小,最小,最大
+        connection-init-sql: set names utf8mb4
+
+        initial-size: 5
+        min-idle: 5
+        maxActive: 20
+        # 配置获取连接等待超时的时间
+        maxWait: 60000
+        # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
+        timeBetweenEvictionRunsMillis: 60000
+        # 配置一个连接在池中最小生存的时间,单位是毫秒
+        minEvictableIdleTimeMillis: 300000
+        validationQuery: SELECT 1 FROM DUAL
+        testWhileIdle: true
+        testOnBorrow: false
+        testOnReturn: false
+        # 打开PSCache,并且指定每个连接上PSCache的大小
+        poolPreparedStatements: true
+        maxPoolPreparedStatementPerConnectionSize: 20
+        # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
+        filters: stat,slf4j
+        # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
+        connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
+      datasource:
+        master:
+          url: jdbc:mysql://39.106.184.70:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false
+          username: hcst
+          password: test@20190531
+          driver-class-name: com.mysql.jdbc.Driver
+  #redis 配置
+  redis:
+    database: 0
+    host: 127.0.0.1
+    lettuce:
+      pool:
+        max-active: 8   #最大连接数据库连接数,设 0 为没有限制
+        max-idle: 8     #最大等待连接中的数量,设 0 为没有限制
+        max-wait: -1ms  #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
+        min-idle: 0     #最小等待连接中的数量,设 0 为没有限制
+      shutdown-timeout: 100ms
+    password: ''
+    port: 6379
+#mybatis plus 设置
+mybatis-plus:
+  mapper-locations: classpath*:org/jeecg/modules/**/xml/*Mapper.xml,classpath*:cn/com/ctop/**/xml/*Mapper.xml
+  global-config:
+    # 关闭MP3.0自带的banner
+    banner: false
+    db-config:
+      #主键类型  0:"数据库ID自增",1:"该类型为未设置主键类型", 2:"用户输入ID",3:"全局唯一ID (数字类型唯一ID)", 4:"全局唯一ID UUID",5:"字符串全局唯一ID (idWorker 的字符串表示)";
+      id-type: 4
+      # 默认数据库表下划线命名
+      table-underline: true
+    configuration:
+      # 这个配置会将执行的sql打印出来,在开发或测试的时候可以用
+      log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+#jeecg专用配置
+jeecg:
+  elasticsearch:
+    cluster-nodes:
+    check-enabled: false
+  uploadType:
+  oss:
+    endpoint:
+    accessKey:
+    secretKey:
+    bucketName:
+    staticDomain:
+  sms:
+    accessKeyId:
+    accessKeySecret:
+  minio:
+    minio_url:
+    minio_name:
+    minio_pass:
+    bucketName:
+  ffmpeg:
+    bin: D:\java\ffmpeg\bin\ffmpeg.exe
+  path:
+    #文件上传根目录 设置
+    upload: D://upFiles
+    #webapp文件路径
+    webapp: D://webapp
+    video-upload: D://upFiles//video//
+    image-upload: D://upFiles//image//
+    chrome-driver: D://chromedriver.exe
+    csv-upload: D://upFiles//csv//
+    report-history: D://report//history//
+    report-daily: D://report//daily//
+kuaishou:
+  group-control:
+    path: http://39.106.184.70
+    port: 4723
+logging:
+  level:
+    root: info
+  config: classpath:logback-dev.xml
+chrome:
+  script:
+    clean: sh /mnt/webapp/cleanProcess.sh
+
+oss:
+  replace:
+    replace-value: oss-cn-beijing
+    replace-old-value: oss-cn-beijing
+    download: D:\mnt\file\video
+

+ 169 - 0
module-job-distribute/src/main/resources/application-prod.yml

@@ -0,0 +1,169 @@
+management:
+  endpoints:
+    web:
+      exposure:
+        include: metrics,httptrace
+spring:
+  servlet:
+    multipart:
+      max-file-size: -1
+      max-request-size: -1
+  mail:
+    host: smtp.163.com
+    username: jeecgos@163.com
+    password: ??
+    properties:
+      mail:
+        smtp:
+          auth: true
+          starttls:
+            enable: true
+            required: true
+  #json 时间戳统一转换
+  jackson:
+    date-format:   yyyy-MM-dd HH:mm:ss
+    time-zone:   GMT+8
+  aop:
+    proxy-target-class: true
+  #配置freemarker
+  freemarker:
+    # 设置模板后缀名
+    suffix: .ftl
+    # 设置文档类型
+    content-type: text/html
+    # 设置页面编码格式
+    charset: UTF-8
+    # 设置页面缓存
+    cache: false
+    prefer-file-system-access: false
+    # 设置ftl文件路径
+    template-loader-path:
+      - classpath:/templates
+  # 设置静态文件路径,js,css等
+  mvc:
+    static-path-pattern: /**
+  resource:
+    static-locations: classpath:/static/,classpath:/public/
+  autoconfigure:
+    exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
+  datasource:
+    url: jdbc:mysql://127.0.0.1:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false
+    username: hcst
+    password: test@20190531
+    driver-class-name: com.mysql.jdbc.Driver
+    druid:
+      stat-view-servlet:
+        loginUsername: admin
+        loginPassword: hcst2016
+        enabled: true
+      web-stat-filter:
+        enabled: true
+    #      remove-abandoned: false
+    dynamic:
+      druid: # 全局druid参数,绝大部分值和默认保持一致。(现已支持的参数如下,不清楚含义不要乱设置)
+        # 连接池的配置信息
+        # 初始化大小,最小,最大
+        connection-init-sql: set names utf8mb4
+        initial-size: 5
+        min-idle: 5
+        maxActive: 20
+        # 配置获取连接等待超时的时间
+        maxWait: 60000
+        # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
+        timeBetweenEvictionRunsMillis: 60000
+        # 配置一个连接在池中最小生存的时间,单位是毫秒
+        minEvictableIdleTimeMillis: 300000
+        validationQuery: SELECT 1 FROM DUAL
+        testWhileIdle: true
+        testOnBorrow: false
+        testOnReturn: false
+        # 打开PSCache,并且指定每个连接上PSCache的大小
+        poolPreparedStatements: true
+        maxPoolPreparedStatementPerConnectionSize: 20
+        # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
+        filters: stat,slf4j
+        # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
+        connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
+      datasource:
+        master:
+          url: jdbc:mysql://139.186.27.96:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false
+          username: hcst
+          password: test@20190531
+          driver-class-name: com.mysql.jdbc.Driver
+  #redis 配置
+  redis:
+    database: 0
+    host: 127.0.0.1
+    lettuce:
+      pool:
+        max-active: 8   #最大连接数据库连接数,设 0 为没有限制
+        max-idle: 8     #最大等待连接中的数量,设 0 为没有限制
+        max-wait: -1ms  #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
+        min-idle: 0     #最小等待连接中的数量,设 0 为没有限制
+      shutdown-timeout: 100ms
+    password: ''
+    port: 6379
+#mybatis plus 设置
+mybatis-plus:
+  mapper-locations: classpath*:org/jeecg/modules/**/xml/*Mapper.xml,classpath*:cn/com/ctop/**/xml/*Mapper.xml
+  global-config:
+    # 关闭MP3.0自带的banner
+    banner: false
+    db-config:
+      #主键类型  0:"数据库ID自增",1:"该类型为未设置主键类型", 2:"用户输入ID",3:"全局唯一ID (数字类型唯一ID)", 4:"全局唯一ID UUID",5:"字符串全局唯一ID (idWorker 的字符串表示)";
+      id-type: 4
+      # 默认数据库表下划线命名
+      table-underline: true
+#jeecg专用配置
+jeecg:
+  elasticsearch:
+    cluster-nodes:
+    check-enabled: false
+  uploadType:
+  oss:
+    endpoint:
+    accessKey:
+    secretKey:
+    bucketName:
+    staticDomain:
+  sms:
+    accessKeyId:
+    accessKeySecret:
+  minio:
+    minio_url:
+    minio_name:
+    minio_pass:
+    bucketName:
+  ffmpeg:
+    bin: ffmpeg
+  path:
+    #文件上传根目录 设置
+    upload: /data/upload
+    #webapp文件路径
+    webapp: /data/webapp
+    video-upload: /data/upload/video/
+    image-upload: /data/upload/image/
+    chrome-driver: /usr/bin/chromedriver
+    csv-upload: /data/upload/csv/
+    bak-database-file: /data/data/bak/
+    report-history: /data/upload/report/history/
+    report-daily: /data/upload/report/daily/
+    kuaishou-agent-image: /data/upload/image/temp.png
+    kuaishou-account-captcha-image: /data/upload/image/captcha.png
+kuaishou:
+  group-control:
+    path: http://39.106.184.70
+    port: 4723
+logging:
+  level:
+    root: info
+  config: classpath:logback-prod.xml
+chrome:
+  script:
+    clean: sh /data/webapp/cleanProcess.sh
+
+oss:
+  replace:
+    replace-value: oss-cn-beijing-internal
+    replace-old-value: oss-cn-beijing
+    download: /data/file/video/

+ 179 - 0
module-job-distribute/src/main/resources/application-test.yml

@@ -0,0 +1,179 @@
+management:
+  endpoints:
+    web:
+      exposure:
+        include: metrics,httptrace
+
+spring:
+  rabbitmq:
+    host: 39.106.184.70
+    port: 5672
+    username: guest
+    password: guest
+  servlet:
+    multipart:
+      max-file-size: -1
+      max-request-size: -1
+  mail:
+    host: smtp.163.com
+    username: jeecgos@163.com
+    password: ??
+    properties:
+      mail:
+        smtp:
+          auth: true
+          starttls:
+            enable: true
+            required: true
+  #json 时间戳统一转换
+  jackson:
+    date-format:   yyyy-MM-dd HH:mm:ss
+    time-zone:   GMT+8
+  aop:
+    proxy-target-class: true
+  #配置freemarker
+  freemarker:
+    # 设置模板后缀名
+    suffix: .ftl
+    # 设置文档类型
+    content-type: text/html
+    # 设置页面编码格式
+    charset: UTF-8
+    # 设置页面缓存
+    cache: false
+    prefer-file-system-access: false
+    # 设置ftl文件路径
+    template-loader-path:
+      - classpath:/templates
+  # 设置静态文件路径,js,css等
+  mvc:
+    static-path-pattern: /**
+  resource:
+    static-locations: classpath:/static/,classpath:/public/
+  autoconfigure:
+    exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
+  datasource:
+    druid:
+      stat-view-servlet:
+        enabled: true
+        loginUsername: admin
+        loginPassword: 123456
+      web-stat-filter:
+        enabled: true
+    dynamic:
+      druid: # 全局druid参数,绝大部分值和默认保持一致。(现已支持的参数如下,不清楚含义不要乱设置)
+        # 连接池的配置信息
+        # 初始化大小,最小,最大
+        connection-init-sql: set names utf8mb4
+
+        initial-size: 5
+        min-idle: 5
+        maxActive: 20
+        # 配置获取连接等待超时的时间
+        maxWait: 60000
+        # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
+        timeBetweenEvictionRunsMillis: 60000
+        # 配置一个连接在池中最小生存的时间,单位是毫秒
+        minEvictableIdleTimeMillis: 300000
+        validationQuery: SELECT 1 FROM DUAL
+        testWhileIdle: true
+        testOnBorrow: false
+        testOnReturn: false
+        # 打开PSCache,并且指定每个连接上PSCache的大小
+        poolPreparedStatements: true
+        maxPoolPreparedStatementPerConnectionSize: 20
+        # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
+        filters: stat,slf4j
+        # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
+        connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
+      datasource:
+        master:
+          url: jdbc:mysql://39.106.184.70:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false
+          username: hcst
+          password: test@20190531
+          driver-class-name: com.mysql.jdbc.Driver
+          # 多数据源配置
+          #multi-datasource1:
+          #url: jdbc:mysql://localhost:3306/jeecg-boot2?useUnicode=true&characterEncoding=utf8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true
+          #username: root
+          #password: root
+          #driver-class-name: com.mysql.jdbc.Driver
+  #redis 配置
+  redis:
+    database: 0
+    host: 127.0.0.1
+    lettuce:
+      pool:
+        max-active: 8   #最大连接数据库连接数,设 0 为没有限制
+        max-idle: 8     #最大等待连接中的数量,设 0 为没有限制
+        max-wait: -1ms  #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
+        min-idle: 0     #最小等待连接中的数量,设 0 为没有限制
+      shutdown-timeout: 100ms
+    password: ''
+    port: 6379
+#mybatis plus 设置
+mybatis-plus:
+  mapper-locations: classpath*:org/jeecg/modules/**/xml/*Mapper.xml,classpath*:cn/com/ctop/**/xml/*Mapper.xml
+  global-config:
+    # 关闭MP3.0自带的banner
+    banner: false
+    db-config:
+      #主键类型  0:"数据库ID自增",1:"该类型为未设置主键类型", 2:"用户输入ID",3:"全局唯一ID (数字类型唯一ID)", 4:"全局唯一ID UUID",5:"字符串全局唯一ID (idWorker 的字符串表示)";
+      id-type: 4
+      # 默认数据库表下划线命名
+      table-underline: true
+    configuration:
+      # 这个配置会将执行的sql打印出来,在开发或测试的时候可以用
+      log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+#jeecg专用配置
+jeecg:
+  elasticsearch:
+    cluster-nodes:
+    check-enabled: false
+  uploadType:
+  oss:
+    endpoint:
+    accessKey:
+    secretKey:
+    bucketName:
+    staticDomain:
+  sms:
+    accessKeyId:
+    accessKeySecret:
+  minio:
+    minio_url:
+    minio_name:
+    minio_pass:
+    bucketName:
+  ffmpeg:
+    bin: D:\java\ffmpeg\bin\ffmpeg.exe
+  path:
+    #文件上传根目录 设置
+    #文件上传根目录 设置
+    upload: /data/upload
+    #webapp文件路径
+    webapp: /data/webapp
+    video-upload: /data/upload/video/
+    image-upload: /data/upload/image/
+    chrome-driver: /usr/bin/chromedriver
+    csv-upload: /data/upload/csv/
+    report-history: /data/report/history/
+    report-daily: /data/report/daily/
+kuaishou:
+  group-control:
+    path: http://127.0.0.1
+    port: 4723
+logging:
+  level:
+    root: info
+  config: classpath:logback-test.xml
+chrome:
+  script:
+    clean: sh /mnt/webapp/cleanProcess.sh
+
+
+oss:
+  replace:
+    replace-value: oss-cn-beijing-internal
+    replace-old-value: oss-cn-beijing
+    download: /mnt/file/video/

+ 24 - 0
module-job-distribute/src/main/resources/application.yml

@@ -0,0 +1,24 @@
+server:
+  port: 8091
+spring:
+  profiles:
+    active: @activatedProperties@
+  application:
+    name: system-web
+swagger:
+  production: false
+  basic:
+    enable: true
+    username: jeecg
+    password: jeecg1314
+xxl:
+  job:
+    accessToken:
+    executor:
+      appname: module-job-distribute
+      port: 9998
+      ip:
+      logpath: /data/applogs/xxl-job/jobhandler
+      logretentiondays: 30
+    admin:
+      addresses: http://139.186.29.76:8090

+ 14 - 0
module-job-distribute/src/main/resources/banner.txt

@@ -0,0 +1,14 @@
+
+${AnsiColor.BRIGHT_BLUE}
+   (_)                          | |               | |
+    _  ___  ___  ___ __ _ ______| |__   ___   ___ | |_ 
+   | |/ _ \/ _ \/ __/ _` |______| '_ \ / _ \ / _ \| __|
+   | |  __/  __/ (_| (_| |      | |_) | (_) | (_) | |_ 
+   | |\___|\___|\___\__, |      |_.__/ \___/ \___/ \__|
+  _/ |               __/ |                             
+ |__/               |___/
+
+${AnsiColor.BRIGHT_GREEN}
+Jeecg  Boot Version: 2.0.2
+Spring Boot Version: ${spring-boot.version}${spring-boot.formatted-version}
+${AnsiColor.BLACK}

+ 49 - 0
module-job-distribute/src/main/resources/generatorConfig.xml

@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE generatorConfiguration
+        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
+        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
+<generatorConfiguration>
+    <!-- 导入配置文件 -->
+    <properties resource="application.properties"/>
+
+    <!-- defaultModelType="flat" 设置复合主键时不单独为主键创建实体 -->
+    <context id="MySql" defaultModelType="flat">
+
+        <!-- 生成的POJO实现java.io.Serializable接口 -->
+        <plugin type="org.mybatis.generator.plugins.SerializablePlugin"/>
+
+        <!--注释-->
+        <commentGenerator>
+            <!-- 将数据库中表的字段描述信息添加到注释 -->
+            <property name="addRemarkComments" value="true"/>
+            <!-- 注释里不添加日期 -->
+            <property name="suppressDate" value="true"/>
+        </commentGenerator>
+        <!-- 数据库连接,直接通过${}读取application.properties里的配置 -->
+        <jdbcConnection
+                driverClass="${spring.datasource.driver-class-name}"
+                connectionURL="${spring.datasource.url}"
+                userId="${spring.datasource.username}"
+                password="${spring.datasource.password}"/>
+
+        <!-- 生成POJO对象,并将类放到com.songguoliang.springboot.entity包下 -->
+        <javaModelGenerator targetPackage="com.songguoliang.springboot.entity"
+                            targetProject="src/main/java"></javaModelGenerator>
+        <!-- 生成mapper xml文件,并放到resources下的mapper文件夹下 -->
+        <sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources"></sqlMapGenerator>
+
+
+        <!-- 生成mapper xml对应dao接口,放到com.songguoliang.springboot.mapper包下-->
+        <javaClientGenerator targetPackage="com.songguoliang.springboot.mapper" targetProject="src/main/java"
+                             type="XMLMAPPER"></javaClientGenerator>
+
+        <!-- table标签可以有多个,至少一个,tableName指定表名,可以使用_和%通配符 -->
+        <table tableName="tbl_user">
+            <!-- 是否只生成POJO对象 -->
+            <property name="modelOnly" value="false"/>
+            <!-- 数据库中表名有时我们都会带个前缀,而实体又不想带前缀,这个配置可以把实体的前缀去掉 -->
+            <domainObjectRenamingRule searchString="^Tbl" replaceString=""/>
+
+        </table>
+    </context>
+</generatorConfiguration>

+ 4 - 0
module-job-distribute/src/main/resources/log4j.properties

@@ -0,0 +1,4 @@
+log4j.rootLogger=INFO,stdout
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss.SSS}-[%p] [%t] %-5l - %m%n

+ 57 - 0
module-job-distribute/src/main/resources/logback-dev.xml

@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration scan="true" scanPeriod="10 seconds">
+
+    <contextName>logback</contextName>
+
+
+    <!-- 格式化输出:%date表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %msg:日志消息,%n是换行符-->
+    <property name="LOG_PATTERN" value="%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"/>
+
+    <!-- 定义日志存储的路径,不要配置相对路径 -->
+    <property name="FILE_PATH" value="D:/Desktop/log/spring-log.%d{yyyy-MM-dd}.%i.log"/>
+
+    <!-- 控制台输出日志 -->
+    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
+        <!-- 日志级别过滤INFO以下 -->
+        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+            <level>INFO</level>
+        </filter>
+        <encoder>
+            <!-- 按照上面配置的LOG_PATTERN来打印日志 -->
+            <pattern>${LOG_PATTERN}</pattern>
+        </encoder>
+    </appender>
+
+    <!--每天生成一个日志文件,保存30天的日志文件。rollingFile用来切分文件的 -->
+    <appender name="rollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
+
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+
+            <fileNamePattern>${FILE_PATH}</fileNamePattern>
+
+            <!-- keep 15 days' worth of history -->
+            <maxHistory>30</maxHistory>
+
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <!-- 日志文件的最大大小 -->
+                <maxFileSize>2MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+
+            <!-- 超出删除老文件 -->
+            <totalSizeCap>1GB</totalSizeCap>
+        </rollingPolicy>
+
+        <encoder>
+            <pattern>${LOG_PATTERN}</pattern>
+        </encoder>
+    </appender>
+
+    <!-- project default level -->
+    <logger name="net.sh.rgface.serive" level="ERROR"/>
+
+    <!-- 日志输出级别 -->
+    <root level="INFO">
+        <appender-ref ref="console"/>
+        <appender-ref ref="rollingFile"/>
+    </root>
+</configuration>

+ 57 - 0
module-job-distribute/src/main/resources/logback-prod.xml

@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration scan="true" scanPeriod="10 seconds">
+
+    <contextName>logback</contextName>
+
+
+    <!-- 格式化输出:%date表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %msg:日志消息,%n是换行符-->
+    <property name="LOG_PATTERN" value="%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"/>
+
+    <!-- 定义日志存储的路径,不要配置相对路径 -->
+    <property name="FILE_PATH" value="/mnt/webapps/logs/spring-log.%d{yyyy-MM-dd}.%i.log"/>
+
+    <!-- 控制台输出日志 -->
+    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
+        <!-- 日志级别过滤INFO以下 -->
+        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+            <level>INFO</level>
+        </filter>
+        <encoder>
+            <!-- 按照上面配置的LOG_PATTERN来打印日志 -->
+            <pattern>${LOG_PATTERN}</pattern>
+        </encoder>
+    </appender>
+
+    <!--每天生成一个日志文件,保存30天的日志文件。rollingFile用来切分文件的 -->
+    <appender name="rollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
+
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+
+            <fileNamePattern>${FILE_PATH}</fileNamePattern>
+
+            <!-- keep 15 days' worth of history -->
+            <maxHistory>30</maxHistory>
+
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <!-- 日志文件的最大大小 -->
+                <maxFileSize>2MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+
+            <!-- 超出删除老文件 -->
+            <totalSizeCap>1GB</totalSizeCap>
+        </rollingPolicy>
+
+        <encoder>
+            <pattern>${LOG_PATTERN}</pattern>
+        </encoder>
+    </appender>
+
+    <!-- project default level -->
+    <logger name="net.sh.rgface.serive" level="ERROR"/>
+
+    <!-- 日志输出级别 -->
+    <root level="INFO">
+        <appender-ref ref="console"/>
+        <appender-ref ref="rollingFile"/>
+    </root>
+</configuration>

+ 57 - 0
module-job-distribute/src/main/resources/logback-test.xml

@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration scan="true" scanPeriod="10 seconds">
+
+    <contextName>logback</contextName>
+
+
+    <!-- 格式化输出:%date表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %msg:日志消息,%n是换行符-->
+    <property name="LOG_PATTERN" value="%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"/>
+
+    <!-- 定义日志存储的路径,不要配置相对路径 -->
+    <property name="FILE_PATH" value="/data/webapp/log/spring-log.%d{yyyy-MM-dd}.%i.log"/>
+
+    <!-- 控制台输出日志 -->
+    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
+        <!-- 日志级别过滤INFO以下 -->
+        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+            <level>INFO</level>
+        </filter>
+        <encoder>
+            <!-- 按照上面配置的LOG_PATTERN来打印日志 -->
+            <pattern>${LOG_PATTERN}</pattern>
+        </encoder>
+    </appender>
+
+    <!--每天生成一个日志文件,保存30天的日志文件。rollingFile用来切分文件的 -->
+    <appender name="rollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
+
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+
+            <fileNamePattern>${FILE_PATH}</fileNamePattern>
+
+            <!-- keep 15 days' worth of history -->
+            <maxHistory>30</maxHistory>
+
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <!-- 日志文件的最大大小 -->
+                <maxFileSize>2MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+
+            <!-- 超出删除老文件 -->
+            <totalSizeCap>1GB</totalSizeCap>
+        </rollingPolicy>
+
+        <encoder>
+            <pattern>${LOG_PATTERN}</pattern>
+        </encoder>
+    </appender>
+
+    <!-- project default level -->
+    <logger name="net.sh.rgface.serive" level="ERROR"/>
+
+    <!-- 日志输出级别 -->
+    <root level="INFO">
+        <appender-ref ref="console"/>
+        <appender-ref ref="rollingFile"/>
+    </root>
+</configuration>

+ 13 - 0
module-job-distribute/src/test/java/cn/com/ctop/module/job/distribute/ModuleJobDistributeApplicationTests.java

@@ -0,0 +1,13 @@
+package cn.com.ctop.module.job.distribute;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class ModuleJobDistributeApplicationTests {
+
+    @Test
+    void contextLoads() {
+    }
+
+}

+ 3 - 2
module-job-kuaishou/src/main/resources/application-prod.yml

@@ -98,7 +98,8 @@ spring:
   #redis 配置
   redis:
     database: 0
-    host: 172.30.0.17
+#    host: 172.30.0.17
+    host: 127.0.0.1
     lettuce:
       pool:
         max-active: 8   #最大连接数据库连接数,设 0 为没有限制
@@ -107,7 +108,7 @@ spring:
         min-idle: 0     #最小等待连接中的数量,设 0 为没有限制
       shutdown-timeout: 100ms
     password: foobared
-    port: 6379
+#    port: 6379
 #mybatis plus 设置
 mybatis-plus:
   mapper-locations: classpath*:org/jeecg/modules/**/xml/*Mapper.xml,classpath*:cn/com/ctop/**/xml/*Mapper.xml

+ 2 - 0
module-job-kuaishou/src/main/resources/application.yml

@@ -22,4 +22,6 @@ xxl:
       logpath: /data/applogs/xxl-job/jobhandler
       logretentiondays: 30
     admin:
+#      addresses: http://127.0.0.1:8090
       addresses: http://139.186.29.76:8090
+

+ 2 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/entity/KuaiShouGroupTarget.java

@@ -148,6 +148,8 @@ public class KuaiShouGroupTarget {
     @Excel(name = "APP行为-按APP名称", width = 15)
     @ApiModelProperty(value = "APP行为-按APP名称")
     private String appIds;
+
+    private Integer filterConvertedLevel;
     /**
      * 人群包定向
      */

+ 2 - 1
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/mapper/xml/KuaiShouGroupTargetMapper.xml

@@ -26,6 +26,7 @@
         app_ids,
         population,
         exclude_population,
+        filter_converted_level,
         is_open,
         no_age_break,
         no_gender_break,
@@ -34,7 +35,6 @@
         values
         <foreach collection="targets" item="targets" separator=",">
             (
-
             #{targets.accountId},
             #{targets.unitId},
             #{targets.region},
@@ -56,6 +56,7 @@
             #{targets.appIds},
             #{targets.population},
             #{targets.excludePopulation},
+            #{targets.filterConvertedLevel},
             #{targets.isOpen},
             #{targets.noAgeBreak},
             #{targets.noGenderBreak},

+ 46 - 38
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/impl/BatchServiceImpl.java

@@ -285,11 +285,15 @@ public class BatchServiceImpl implements IBatchService {
         if (!Check.isNull(requestJson.getJSONArray("deviceBrand"))) {
             targetJson.put("device_brand", requestJson.getJSONArray("deviceBrand"));
         }
+        //设备价格
+        if (!Check.isNull(requestJson.getJSONArray("devicePrice"))) {
+            targetJson.put("device_price", requestJson.getJSONArray("devicePrice"));
+        }
 
         if (sceneId != 5) {
-            //设备价格
-            if (!Check.isNull(requestJson.getJSONArray("devicePrice"))) {
-                targetJson.put("device_price", requestJson.getJSONArray("devicePrice"));
+            //过滤已转化人群纬度
+            if (!Check.isNull(requestJson.getInteger("filterConvertedLevel"))) {
+                targetJson.put("filter_converted_level", requestJson.getInteger("filterConvertedLevel"));
             }
             //商业兴趣类型
             if (!Check.isNull(requestJson.getInteger("businessInterestType"))) {
@@ -590,12 +594,14 @@ public class BatchServiceImpl implements IBatchService {
             if (!Check.isNull(requestJson.getJSONArray("deviceBrand"))) {
                 targetJson.put("device_brand", requestJson.getJSONArray("deviceBrand"));
             }
-            if (sceneId != 5) {
-
 
-                //设备价格
-                if (!Check.isNull(requestJson.getJSONArray("devicePrice"))) {
-                    targetJson.put("device_price", requestJson.getJSONArray("devicePrice"));
+            //设备价格
+            if (!Check.isNull(requestJson.getJSONArray("devicePrice"))) {
+                targetJson.put("device_price", requestJson.getJSONArray("devicePrice"));
+            }
+            if (sceneId != 5) {
+                if (!Check.isNull(requestJson.getInteger("filterConvertedLevel"))) {
+                    targetJson.put("filter_converted_level", requestJson.getInteger("filterConvertedLevel"));
                 }
                 //商业兴趣类型
                 if (!Check.isNull(requestJson.getInteger("businessInterestType"))) {
@@ -886,12 +892,15 @@ public class BatchServiceImpl implements IBatchService {
                     if (!Check.isNull(groupTarget.getDeviceBrand())) {
                         targetJson.put("device_brand", JSONArray.parseArray(groupTarget.getDeviceBrand()));
                     }
+                    //设备价格
+                    if (!Check.isNull(groupTarget.getDevicePrice())) {
+                        targetJson.put("device_price", JSONArray.parseArray(groupTarget.getDevicePrice()));
+                    }
                     if (sceneId != 5) {
-
-                        //设备价格
-                        if (!Check.isNull(groupTarget.getDevicePrice())) {
-                            targetJson.put("device_price", JSONArray.parseArray(groupTarget.getDevicePrice()));
+                        if (!Check.isNull(groupTarget.getFilterConvertedLevel())) {
+                            targetJson.put("filter_converted_level", groupTarget.getFilterConvertedLevel());
                         }
+
                         //商业兴趣类型
                         if (!Check.isNull(groupTarget.getBusinessInterestType())) {
                             targetJson.put("business_interest_type", groupTarget.getBusinessInterestType());
@@ -1596,25 +1605,18 @@ public class BatchServiceImpl implements IBatchService {
             if (Check.isNull(unitId)) {
                 throw new Exception("请选择广告组");
             }
-
-
             unitJson.put("unit_id", unitId);
-
-
             queryWrapper.eq("unit_id", unitId);
             queryWrapper.last("limit 1");
             KuaiShouGroup kuaiShouGroup = groupMapper.selectOne(queryWrapper);
             if (Check.isNull(kuaiShouGroup)) {
                 throw new Exception("未获取到组信息");
-
             }
-
             String sceneId = kuaiShouGroup.getSceneId();
             if (Check.isNull(sceneId)) {
                 throw new Exception("未获取资源位置");
             }
 
-
             //  JSONObject jsonObject = JSONArr(sceneId);
             Integer scene = (Integer) JSONArray.parseArray(sceneId).get(0);
 
@@ -1745,13 +1747,35 @@ public class BatchServiceImpl implements IBatchService {
             if (!Check.isNull(requestJson.getInteger("network"))) {
                 targetJson.put("network", requestJson.getInteger("network"));
             }
+            // 设备品牌
+            if (!Check.isNull(requestJson.getJSONArray("deviceBrand"))) {
+                targetJson.put("device_brand", requestJson.getJSONArray("deviceBrand"));
+            }
+            // 设备价格
+            if (!Check.isNull(requestJson.getJSONArray("devicePrice"))) {
+                targetJson.put("device_price", requestJson.getJSONArray("devicePrice"));
+            }
 
+            if (!Check.isNull(requestJson.getJSONArray("appInterest"))) {
+                targetJson.put("app_interest", requestJson.getJSONArray("appInterest"));
+            }
+            // APP行为-按APP名称
+            if (!Check.isNull(requestJson.getJSONArray("appIds"))) {
+                targetJson.put("app_ids", requestJson.getJSONArray("appIds"));
+            }
 
+            if (!Check.isNull(requestJson.getJSONArray("population"))) {
+                targetJson.put("population", requestJson.getJSONArray("population"));
+            }
+            // 人群包排除
+            if (!Check.isNull(requestJson.getJSONArray("excludePopulation"))) {
+                targetJson.put("exclude_population", requestJson.getJSONArray("excludePopulation"));
+            }
             if (scene != 5) {
-                //设备价格
-                if (!Check.isNull(requestJson.getJSONArray("devicePrice"))) {
-                    targetJson.put("device_price", requestJson.getJSONArray("devicePrice"));
+                if (!Check.isNull(requestJson.getInteger("filterConvertedLevel"))) {
+                    targetJson.put("filter_converted_level", requestJson.getInteger("filterConvertedLevel"));
                 }
+
                 //商业兴趣类型
                 if (!Check.isNull(requestJson.getInteger("businessInterestType"))) {
                     targetJson.put("business_interest_type", requestJson.getInteger("businessInterestType"));
@@ -1769,22 +1793,6 @@ public class BatchServiceImpl implements IBatchService {
                     targetJson.put("interest_video", requestJson.getJSONArray("interestVideo"));
                 }
             }
-            // APP行为-按分类
-            if (!Check.isNull(requestJson.getJSONArray("appInterest"))) {
-                targetJson.put("app_interest", requestJson.getJSONArray("appInterest"));
-            }
-            // APP行为-按APP名称
-            if (!Check.isNull(requestJson.getJSONArray("appIds"))) {
-                targetJson.put("app_ids", requestJson.getJSONArray("appIds"));
-            }
-            // 人群包定向
-            if (!Check.isNull(requestJson.getJSONArray("population"))) {
-                targetJson.put("population", requestJson.getJSONArray("population"));
-            }
-            // 人群包排除
-            if (!Check.isNull(requestJson.getJSONArray("excludePopulation"))) {
-                targetJson.put("exclude_population", requestJson.getJSONArray("excludePopulation"));
-            }
 
             if (scene != 5) {
                 JSONObject intelliExtendJson = new JSONObject();

+ 75 - 11
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/impl/KuaiShouGroupServiceImpl.java

@@ -12,6 +12,7 @@ import cn.com.ctop.kuaishou.modules.batch.mapper.KuaiShouScheduleMapper;
 import cn.com.ctop.kuaishou.modules.batch.service.IKuaiShouCampaignService;
 import cn.com.ctop.kuaishou.modules.batch.service.IKuaiShouCreativeService;
 import cn.com.ctop.kuaishou.modules.batch.service.IKuaiShouGroupService;
+import cn.com.ctop.kuaishou.modules.batch.service.IWarningOperationService;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -85,7 +86,7 @@ public class KuaiShouGroupServiceImpl extends ServiceImpl<KuaiShouGroupMapper, K
         JSONObject param = new JSONObject();
         param.put("advertiser_id", accountId);
         param.put("campaign_id", campaignId);
-        param.put("page_size", 200);
+        param.put("page_size", 500);
         param.put("page", page);
 
         Map<String, String> headers = new HashMap<>();
@@ -159,7 +160,7 @@ public class KuaiShouGroupServiceImpl extends ServiceImpl<KuaiShouGroupMapper, K
             headers.put("Access-Token", accessToken);
             JSONObject param = new JSONObject();
             param.put("advertiser_id", accountId);
-            param.put("page_size", 200);
+            param.put("page_size", 500);
 
 
             param.put("unit_id", unitId);
@@ -260,8 +261,19 @@ public class KuaiShouGroupServiceImpl extends ServiceImpl<KuaiShouGroupMapper, K
 
     }
 
+    static ExecutorService executorBidTypeService = Executors.newFixedThreadPool(20);
+    static ExecutorService executorMaxBidService = Executors.newFixedThreadPool(5);
+    @Autowired
+    private IWarningOperationService warningOperationService;
 
     private void addGroupV2(Long advertiserId, JSONArray details) {
+
+        JSONObject json = warningOperationService.getBidTypeAndMaxBid(advertiserId);
+        Long maxBid = json.getLong("maxBid");// 最高出价
+        String bidTypeStr = json.getString("bidType"); // 出价方式
+        JSONArray bidTypeArr = JSONArray.parseArray(bidTypeStr);
+        String ocpxActionTypeStr = json.getString("ocpxActionType"); // 优化目标
+        JSONArray bidArr = JSONArray.parseArray(ocpxActionTypeStr);
         if (!Check.isNull(details)) {
             List<KuaiShouGroup> groups = new ArrayList<>();
             List<KuaiShouAppInfo> appInfos = new ArrayList<>();
@@ -270,21 +282,69 @@ public class KuaiShouGroupServiceImpl extends ServiceImpl<KuaiShouGroupMapper, K
             for (int i = 0; i < details.size(); i++) {
                 JSONObject detail = JSONObject.parseObject(details.get(i).toString());
                 if (!Check.isNull(detail)) {
-                    KuaiShouGroup group = new KuaiShouGroup();
+                    Integer bid_type = detail.getInteger("bid_type");
+                    Long bid = detail.getLong("bid");
+                    Long cpa_bid = detail.getLong("cpa_bid");
+                    Long day_budget = detail.getLong("day_budget");
+                    Integer ocpx_action_type = detail.getInteger("ocpx_action_type");
                     Long unitId = detail.getLong("unit_id");
+                    String unit_name = detail.getString("unit_name");
+                    Integer status = detail.getInteger("status");
+                    Integer put_status = detail.getInteger("put_status");
+                    if (put_status == 1) { // 组状态为 投放中的
+                        if (status != 15) { // 广告组状态为非暂停
+                            Boolean ocpxTrueOrFalse = false;
+                            for (int j = 0; j < bidArr.size(); j++) {
+                                Integer ocpxActionType = (Integer) bidArr.get(j);
+                                if (ocpxActionType.equals(ocpx_action_type)) {
+                                    ocpxTrueOrFalse = true;
+                                    break;
+                                }
+                            }
+                            Boolean bidTypeTrueOrFalse = false;
+                            for (int j = 0; j < bidTypeArr.size(); j++) {
+                                Integer bidType = (Integer) bidTypeArr.get(j);
+                                if (bidType.equals(bid_type)) {
+                                    bidTypeTrueOrFalse = true;
+                                    break;
+                                }
+                            }
+                            if (!bidTypeTrueOrFalse || !ocpxTrueOrFalse) { // 出价方式设置非法
+                                if (day_budget > 500 * 1000 || day_budget == 0) { // 预算大于500 或者不限制预算 需要发送通知 并且进行暂停操作
+                                    executorBidTypeService.submit(new Runnable() {
+                                        @Override
+                                        public void run() {
+                                            warningOperationService.kuaiShouWarningOperation(json.getLong("projectId"), json.getString("projectName"), advertiserId, unitId, unit_name);
+                                        }
+                                    });
+                                }
+                            }
+                            if (bid > maxBid || cpa_bid > maxBid) {
+                                executorMaxBidService.submit(new Runnable() {
+                                    @Override
+                                    public void run() {
+                                        warningOperationService.kuaiShouBidWarningOperation(json.getLong("projectId"), json.getString("projectName"), advertiserId, unitId, unit_name);
+                                    }
+                                });
+                            }
+                        }
+                    }
+
+
+                    KuaiShouGroup group = new KuaiShouGroup();
                     group.setId("" + advertiserId + unitId);
                     group.setAccountId(advertiserId);
                     group.setCampaignId(detail.getLong("campaign_id"));
                     group.setUnitId(unitId);
-                    group.setUnitName(detail.getString("unit_name"));
-                    group.setStatus(detail.getInteger("status"));
-                    group.setPutStatus(detail.getInteger("put_status"));
+                    group.setUnitName(unit_name);
+                    group.setStatus(status);
+                    group.setPutStatus(put_status);
                     group.setCreateChannel(detail.getInteger("create_channel"));
                     group.setReviewDetail(detail.getString("review_detail"));
-                    group.setBidType(detail.getInteger("bid_type"));
-                    group.setBid(detail.getLong("bid"));
+                    group.setBidType(bid_type);
+                    group.setBid(bid);
                     group.setCpaBid(detail.getLong("cpa_bid"));
-                    group.setOcpxActionType(detail.getInteger("ocpx_action_type"));
+                    group.setOcpxActionType(ocpx_action_type);
                     group.setDeepConversionType(detail.getInteger("deep_conversion_type"));
                     group.setDeepConversionBid(detail.getLong("deep_conversion_bid"));
                     group.setDayBudget(detail.getLong("day_budget"));
@@ -308,7 +368,6 @@ public class KuaiShouGroupServiceImpl extends ServiceImpl<KuaiShouGroupMapper, K
                     group.setUpdateTime(new Date());
                     groups.add(group);
                     // 添加应用信息
-
                     JSONObject diverseJson = detail.getJSONObject("diverse_data");
                     if (!Check.isNull(diverseJson)) {
                         KuaiShouAppInfo appInfo = new KuaiShouAppInfo();
@@ -344,7 +403,6 @@ public class KuaiShouGroupServiceImpl extends ServiceImpl<KuaiShouGroupMapper, K
                         KuaiShouGroupTarget groupTarget = new KuaiShouGroupTarget();
                         groupTarget.setAccountId(advertiserId);
                         groupTarget.setUnitId(unitId);
-
                         if (!Check.isNull(targetJson.getJSONArray("region"))) {
                             groupTarget.setRegion(targetJson.getJSONArray("region").toJSONString());
                         }
@@ -392,6 +450,12 @@ public class KuaiShouGroupServiceImpl extends ServiceImpl<KuaiShouGroupMapper, K
                             groupTarget.setAppIds(targetJson.getJSONArray("app_ids").toJSONString());
                         }
 
+
+                        if (!Check.isNull(targetJson.getInteger("filter_converted_level"))) {
+                            groupTarget.setFilterConvertedLevel(targetJson.getInteger("filter_converted_level"));
+                        }
+
+
                         if (!Check.isNull(targetJson.getJSONArray("population"))) {
                             groupTarget.setPopulation(targetJson.getJSONArray("population").toJSONString());
                         }

+ 1 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/impl/KuaiShouUpdateServiceImpl.java

@@ -610,6 +610,7 @@ public class KuaiShouUpdateServiceImpl implements IKuaiShouUpdateService {
             headers.put("Content-Type", "application/json");
             String result = HttpUtils.kuaiShouhttpPostRequest(url, unitJson.toJSONString(), headers);
             JSONObject resultJson = JSONObject.parseObject(result);
+            log.info("修改广告组返回信息:{}", resultJson);
             if (!Check.isNull(resultJson)) {
                 Integer code = resultJson.getInteger("code");
                 if (code == 0) {

+ 6 - 3
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/impl/KuaishouInterfaceServiceImpl.java

@@ -3189,6 +3189,7 @@ public class KuaishouInterfaceServiceImpl implements IKuaishouInterfaceService {
      */
     @Autowired
     private IKuaiShouVideoGetService videoGetService;
+    static ExecutorService suZhaoService = Executors.newFixedThreadPool(15);
 
     @Override
     public void getSuZaoList(String token, Long accountId, int page, String startDate, String endDate) {
@@ -3253,13 +3254,15 @@ public class KuaishouInterfaceServiceImpl implements IKuaishouInterfaceService {
                     kuaiShouVideoGet.setMaterialType(type);
                 }
                 kuaiShouVideoGetService.saveOrUpdate(kuaiShouVideoGet);
-                Thread thread = new Thread() {
+                suZhaoService.submit(new Runnable() {
                     @Override
                     public void run() {
                         videoGetService.getKeyFrame(token, accountId, md5, String.valueOf(photo_id));
+
                     }
-                };
-                thread.start();
+                });
+
+
             }
         }
 

+ 2 - 2
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/impl/KuaishouTemplateServiceImpl.java

@@ -48,11 +48,11 @@ public class KuaishouTemplateServiceImpl extends ServiceImpl<KuaishouTemplateMap
             Integer code = resultJson.getInteger("code");
             if (code == 0) {
                 JSONObject dataJson = resultJson.getJSONObject("data");
-                if (!Check.isNull(dataJson)) {
+                if (Check.isNull(dataJson)) {
                     return;
                 }
                 JSONArray details = dataJson.getJSONArray("details");
-                if (!Check.isNull(details)) {
+                if (Check.isNull(details)) {
                     return;
                 }
                 for (int i = 0; i < details.size(); i++) {

+ 1 - 1
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/entity/KuaishouAgentAccount.java

@@ -30,7 +30,7 @@ public class KuaishouAgentAccount {
 	@TableId(type = IdType.INPUT)
     @ApiModelProperty(value = "id")
 	@JsonProperty("accountId")
-	private Integer id;
+	private Long id;
 	/**accountId*/
 	@Excel(name = "userId", width = 15)
     @ApiModelProperty(value = "userId")

+ 15 - 3
module-oa/src/main/java/cn/com/ctop/oa/modules/constant/QYWxConstant.java

@@ -1,13 +1,14 @@
 package cn.com.ctop.oa.modules.constant;
 
 public class QYWxConstant {
+    //企业ID
     public static final String QYWX_CORP_ID = "ww24b8a47826f5875f";
-    public static final Integer QYWX_AGENT_ID = 1000004;
+    //okr
     public static final String QYWX_CORP_SECRET = "1YWGDtuZWrQDl6US3OPHG8_pvuNgP1TeUsOmfRk6GmQ";
 
-
-    public static final Integer QYWX_OA_AGENT_ID = 3010011;
+    //打卡
     public static final String QYWX_OA_CORP_SECRET = "MDeiFSCwIlcmcR1zrYvmjNlsoYFGl8I770uuUezWgGE";
+    //审批
     public static final String QYWX_APPROVA_CORP_SECRET = "qlk4nSc1vjxy0AHyX1f5bnGh7y2WtqN9lR__0WJA6zM";
 
 
@@ -19,5 +20,16 @@ public class QYWxConstant {
     public static final String APP_ROVAL_INFO = "https://qyapi.weixin.qq.com/cgi-bin/oa/getapprovalinfo";  //批量获取审批单号
     public static final String APP_ROVAL_DETAIL = "https://qyapi.weixin.qq.com/cgi-bin/oa/getapprovaldetail";  //获取审批申请详情
 
+    /**
+     * 天津优容智汇 企业微信信息
+     */
+    //企业ID
+    public static final String YR_CORP_ID = "wwec72c7e61a7840b2";
+    //考勤统计
+    public static final String YR_CORP_SECRET = "AeykrKAY-OoEM7P46Xr6rJB9aa28BLK9VO2hrS0g3S8";
+    //打卡
+    public static final String YR_OA_CORP_SECRET = "AUhGy8TOTenCbdsxyW-QtrYN7mA5Pj7ou_YF52-M-GE";
+    //审批
+    public static final String YR_APPROVA_CORP_SECRET = "XRw6j6gVCV4oXfFDtheIanp0pf8QLuVgDLQiFx3Fa1E";
 
 }

+ 2 - 1
module-oa/src/main/java/cn/com/ctop/oa/modules/controller/WechatDepartmentController.java

@@ -8,6 +8,7 @@ import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.xxl.job.core.enums.NoEn;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
@@ -88,7 +89,7 @@ public class WechatDepartmentController {
     public Result<List<WechatDepartment>> queryList() {
         Result<List<WechatDepartment>> result = new Result<>();
         try {
-            List<WechatDepartment> pageList = wechatDepartmentService.queryList();
+            List<WechatDepartment> pageList = wechatDepartmentService.queryList(NoEn.NO0.valueInt());
             if (!Check.isNull(pageList)) {
                 result.setResult(pageList);
                 result.setSuccess(true);

+ 48 - 5
module-oa/src/main/java/cn/com/ctop/oa/modules/controller/WechatNoListController.java

@@ -46,6 +46,7 @@ import java.io.UnsupportedEncodingException;
 import java.net.URLDecoder;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -267,13 +268,24 @@ public class WechatNoListController {
      * @param requestBody
      * @param response
      */
-    @PostMapping("/excel")
-    public void getExcelReport(HttpServletResponse response, @RequestBody Map<String, Object> paramsMap) {
+    @GetMapping("/excel")
+    public void getExcelReport(HttpServletResponse response, String startTime, String stopTime, String departName, Long departId, String userName, String userId) {
+        Map<String, Object> paramsMap = new HashMap<>();
+        paramsMap.put("startTime", startTime);
+        paramsMap.put("stopTime", stopTime);
+        paramsMap.put("departName", departName);
+        paramsMap.put("departId", departId);
+        paramsMap.put("userName", userName);
+        paramsMap.put("userId", userId);
         List<WechatAttendance> excelData = wechatNoListService.queryAttendanceData(paramsMap);
+        List<WechatAttendance> excelYRData = wechatNoListService.queryYRAttendanceData(paramsMap);
         List<WechatAttendance> overtimeData = wechatNoListService.queryOverTimeData(paramsMap);
+        List<WechatAttendance> overtimeYRData = wechatNoListService.queryYROverTimeData(paramsMap);
         try {
             List<List<Object>> excelList = new ArrayList<>();
+            List<List<Object>> excelYRList = new ArrayList<>();
             List<List<Object>> overtimeExcelList = new ArrayList<>();
+            List<List<Object>> overtimeYRExcelList = new ArrayList<>();
             if (!excelData.isEmpty()) {
                 excelData.forEach(data -> {
                     List<Object> temp = new ArrayList<>();
@@ -303,14 +315,45 @@ public class WechatNoListController {
                     overtimeExcelList.add(temp);
                 });
             }
+            if (!excelYRData.isEmpty()) {
+                excelYRData.forEach(data -> {
+                    List<Object> temp = new ArrayList<>();
+                    temp.add(data.getUserName());
+                    temp.add(data.getDepartName());
+                    temp.add(data.getCheckinDate());
+                    temp.add(data.getCheckinType());
+                    temp.add(data.getExceptionType());
+                    temp.add(data.getCheckinTime());
+                    temp.add(data.getType());
+                    temp.add(data.getStateDuration());
+                    if (!Check.isNull(data.getStatus())) {
+                        temp.add("1".equals(data.getStatus()) ? "审批中" : "已通过");
+                    } else {
+                        temp.add("");
+                    }
+                    excelYRList.add(temp);
+                });
+            }
+            if (!overtimeYRData.isEmpty()) {
+                overtimeYRData.forEach(data -> {
+                    List<Object> temp = new ArrayList<>();
+                    temp.add(data.getUserName());
+                    temp.add(data.getDepartName());
+                    temp.add(data.getCheckinDate());
+                    temp.add(data.getOvertime());
+                    overtimeYRExcelList.add(temp);
+                });
+            }
             OutputStream os = response.getOutputStream();
             ExportExcelUtils eeu = new ExportExcelUtils();
             XSSFWorkbook workbook = new XSSFWorkbook();
             String[] titles = {"姓名", "部门", "考勤日期", "考勤类型", "考勤状态", "考勤时间", "审核状态", "状态时长", "审批状态"};
             String[] overtimeTitles = {"姓名", "部门", "加班日期", "加班时长"};
-            eeu.exportExcelForAttendance(workbook, 0, "异常考勤", titles, excelList);
-            eeu.exportExcel(workbook, 1, "加班考勤", overtimeTitles, overtimeExcelList);
-            HttpUtils.setResponseHeader(response, "考勤记录.xlsx");
+            eeu.exportExcelForAttendance(workbook, 0, "汇创异常考勤", titles, excelList);
+            eeu.exportExcel(workbook, 1, "汇创加班考勤", overtimeTitles, overtimeExcelList);
+            eeu.exportExcelForAttendance(workbook, 2, "优容异常考勤", titles, excelYRList);
+            eeu.exportExcel(workbook, 3, "优容加班考勤", overtimeTitles, overtimeYRExcelList);
+            HttpUtils.setResponseHeader(response, "clockIn.xlsx");
             workbook.write(os);
             os.flush();
             os.close();

+ 2 - 0
module-oa/src/main/java/cn/com/ctop/oa/modules/entity/WechatCheckinData.java

@@ -125,6 +125,8 @@ public class WechatCheckinData {
 
     private Integer overtimeOrNot; // 是否加班
     private Double overtime; // 加班时长
+    // 数据类型
+    private Integer dataType;
 
 
     /**

+ 2 - 0
module-oa/src/main/java/cn/com/ctop/oa/modules/entity/WechatDepartment.java

@@ -56,6 +56,8 @@ public class WechatDepartment {
     @Excel(name = "排序", width = 15)
     @ApiModelProperty(value = "排序")
     private String departOrder;
+    // 数据类型
+    private Integer dataType;
     /**
      * createTime
      */

+ 2 - 0
module-oa/src/main/java/cn/com/ctop/oa/modules/entity/WechatNoList.java

@@ -58,6 +58,8 @@ public class WechatNoList {
 	/**结束时间*/
     @ApiModelProperty(value = "结束时间")
 	private Date newEnd;
+	// 数据类型
+	private Integer dataType;
 	/**createTime*/
     @ApiModelProperty(value = "createTime")
 	private Date createTime;

+ 2 - 0
module-oa/src/main/java/cn/com/ctop/oa/modules/entity/WechatUserList.java

@@ -50,6 +50,8 @@ public class WechatUserList {
     @Excel(name = "部门id", width = 15)
     @ApiModelProperty(value = "部门id")
     private String departId;
+    // 数据类型
+    private Integer dataType;
     /**
      * createTime
      */

+ 1 - 1
module-oa/src/main/java/cn/com/ctop/oa/modules/enums/DepartEnum.java

@@ -10,7 +10,7 @@ public enum DepartEnum {
     depart2("头条事业部"),
     depart3("销售部"),
     depart4("研发中心部"),
-    depart5("内容中心部"),
+  //  depart5("内容中心部"),
     depart6("媒介部"),
     depart7("渠道部"),
     depart8("制片部"),

+ 1 - 1
module-oa/src/main/java/cn/com/ctop/oa/modules/mapper/WechatDepartmentMapper.java

@@ -14,5 +14,5 @@ import java.util.List;
  */
 public interface WechatDepartmentMapper extends BaseMapper<WechatDepartment> {
 
-    List<WechatDepartment> queryList();
+    List<WechatDepartment> queryList(Integer dataType);
 }

+ 3 - 0
module-oa/src/main/java/cn/com/ctop/oa/modules/mapper/WechatNoListMapper.java

@@ -18,6 +18,9 @@ public interface WechatNoListMapper extends BaseMapper<WechatNoList> {
 
     List<WechatAttendance> queryAttendanceData(Map<String, Object> paramsMap);
 
+    List<WechatAttendance> queryYRAttendanceData(Map<String, Object> paramsMap);
+
     List<WechatAttendance> queryOverTimeData(Map<String, Object> paramsMap);
 
+    List<WechatAttendance> queryYROverTimeData(Map<String, Object> paramsMap);
 }

+ 3 - 0
module-oa/src/main/java/cn/com/ctop/oa/modules/mapper/WechatUserListMapper.java

@@ -3,6 +3,8 @@ package cn.com.ctop.oa.modules.mapper;
 import cn.com.ctop.oa.modules.entity.WechatUserList;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 
+import java.util.List;
+
 /**
  * 企业微信用户
  *
@@ -12,4 +14,5 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  */
 public interface WechatUserListMapper extends BaseMapper<WechatUserList> {
 
+    List<WechatUserList> queryList(int dataType);
 }

+ 16 - 17
module-oa/src/main/java/cn/com/ctop/oa/modules/mapper/xml/WechatCheckinDataMapper.xml

@@ -49,22 +49,21 @@
         FROM ctop_wechat_checkin_data as ck
         LEFT JOIN ctop_wechat_user_list as us ON ck.user_id = us.user_id
         LEFT JOIN ctop_wechat_department as dpt ON dpt.depart_id = us.depart_id
-        <where>
-            <if test="userId != null and userId != '' ">
-                and ck.user_id = #{userId}
-            </if>
-            <if test="departId != null and departId != '' ">
-                and ck.depart_id = #{departId}
-            </if>
-            <if test="userName != null ">
-                and us.user_name like concat(#{userName},"%")
-            </if>
-            <if test="startTime != null">
-                and ck.checkin_time &gt;= #{startTime}
-            </if>
-            <if test="stopTime != null ">
-                and ck.checkin_time &lt;= #{stopTime}
-            </if>
-        </where>
+        where us.data_type = 0
+        <if test="userId != null and userId != '' ">
+            and ck.user_id = #{userId}
+        </if>
+        <if test="departId != null and departId != '' ">
+            and ck.depart_id = #{departId}
+        </if>
+        <if test="userName != null ">
+            and us.user_name like concat(#{userName},"%")
+        </if>
+        <if test="startTime != null">
+            and ck.checkin_time &gt;= #{startTime}
+        </if>
+        <if test="stopTime != null ">
+            and ck.checkin_time &lt;= #{stopTime}
+        </if>
     </select>
 </mapper>

+ 1 - 0
module-oa/src/main/java/cn/com/ctop/oa/modules/mapper/xml/WechatDepartmentMapper.xml

@@ -7,5 +7,6 @@
         SELECT
             *
         FROM ctop_wechat_department
+        where data_type = #{dataType}
     </select>
 </mapper>

+ 91 - 0
module-oa/src/main/java/cn/com/ctop/oa/modules/mapper/xml/WechatNoListMapper.xml

@@ -31,6 +31,60 @@
         LEFT JOIN ctop_wechat_no_list AS nl ON nl.user_id = us.user_id and
         nl.new_begin Like CONCAT(DATE_FORMAT(ck.checkin_time,'%Y-%m-%d'),'%')
         WHERE ck.exception_type!='' and ISNULL(ck.exception_type)= 0
+        and us.data_type = dpt.data_type
+        and us.data_type = 0
+        <if test="userId != null and userId != '' ">
+            and us.user_id = #{userId}
+        </if>
+        <if test="userName != null and userName != '' ">
+            and us.user_Name LIKE CONCAT("%",#{userName},"%")
+        </if>
+        <if test="departId != null and departId != '' ">
+            and dpt.depart_id = #{departId}
+        </if>
+        <if test="departName != null and departName != '' ">
+            and dpt.depart_name LIKE CONCAT("%",#{departName},"%")
+        </if>
+        <if test="startTime != null">
+            and ck.checkin_time &gt;= #{startTime}
+        </if>
+        <if test="stopTime != null ">
+            and ck.checkin_time &lt;= #{stopTime}
+        </if>
+        order by us.depart_id,us.user_name ,ck.checkin_time
+    </select>
+
+    <select id="queryYRAttendanceData" resultType="cn.com.ctop.oa.modules.entity.WechatAttendance">
+        SELECT DISTINCT
+        us.user_id AS userId,
+        us.user_name AS userName,
+        dpt.depart_id AS departId,
+        dpt.depart_name AS departName,
+        DATE_FORMAT(ck.checkin_time,'%Y-%m-%d') AS checkinDate,
+        ck.checkin_type AS checkinType,
+        ck.exception_type AS exceptionType,
+        nl.status as status,
+        DATE_FORMAT(ck.checkin_time, '%Y-%m-%d %H:%i:%s') AS checkinTime,
+        case when nl.type !='' THEN nl.type
+        when ck.checkin_type ='上班打卡' AND exception_type ='时间异常' then '迟到'
+        when ck.checkin_type ='下班打卡' AND exception_type ='时间异常' then '早退'
+        end AS type,
+        case when nl.type!=''and nl.type !='补卡' then CONCAT(nl.new_duration,' h')
+        when ck.checkin_type ='上班打卡'and ck.exception_type ='时间异常' then
+        CONCAT(TIMESTAMPDIFF(MINUTE,DATE_FORMAT(CONCAT(DATE_FORMAT(ck.checkin_time,'%Y-%m-%d '),'10:00:00'),'%Y-%m-%d
+        %H:%i:%s'),ck.checkin_time),' min')
+        when ck.checkin_type ='下班打卡'and ck.exception_type ='时间异常' then
+        CONCAT(TIMESTAMPDIFF(MINUTE,ck.checkin_time,DATE_FORMAT(CONCAT(DATE_FORMAT(ck.checkin_time,'%Y-%m-%d
+        '),'19:00:00'),'%Y-%m-%d %H:%i:%s')),' min')
+        end AS stateDuration
+        FROM ctop_wechat_user_list AS us
+        LEFT JOIN ctop_wechat_department AS dpt ON us.depart_id = dpt.depart_id
+        LEFT JOIN ctop_wechat_checkin_data AS ck ON ck.user_id = us.user_id
+        LEFT JOIN ctop_wechat_no_list AS nl ON nl.user_id = us.user_id and
+        nl.new_begin Like CONCAT(DATE_FORMAT(ck.checkin_time,'%Y-%m-%d'),'%')
+        WHERE ck.exception_type!='' and ISNULL(ck.exception_type)= 0
+        and us.data_type = dpt.data_type
+        and us.data_type = 1
         <if test="userId != null and userId != '' ">
             and us.user_id = #{userId}
         </if>
@@ -65,6 +119,43 @@
         LEFT JOIN ctop_wechat_user_list as us ON ck.user_id = us.user_id
         LEFT JOIN ctop_wechat_department as dpt ON dpt.depart_id = us.depart_id
         WHERE ck.overtime_or_not = 1
+        and us.data_type = dpt.data_type
+        and us.data_type = 0
+        <if test="userId != null and userId != '' ">
+            and us.user_id = #{userId}
+        </if>
+        <if test="userName != null and userName != '' ">
+            and us.user_Name LIKE CONCAT("%",#{userName},"%")
+        </if>
+        <if test="departId != null and departId != '' ">
+            and dpt.depart_id = #{departId}
+        </if>
+        <if test="departName != null and departName != '' ">
+            and dpt.depart_name LIKE CONCAT("%",#{departName},"%")
+        </if>
+        <if test="startTime != null">
+            and ck.checkin_time &gt;= #{startTime}
+        </if>
+        <if test="stopTime != null ">
+            and ck.checkin_time &lt;= #{stopTime}
+        </if>
+        order by us.depart_id,us.user_name ,ck.checkin_time
+    </select>
+
+    <select id="queryYROverTimeData" resultType="cn.com.ctop.oa.modules.entity.WechatAttendance">
+        SELECT
+        us.user_id AS userId,
+        us.user_name AS userName,
+        dpt.depart_id AS departId,
+        dpt.depart_name AS departName,
+        DATE_FORMAT(ck.checkin_time,'%Y-%m-%d') AS checkinDate,
+        CONCAT(ck.overtime,' h') AS overtime
+        FROM ctop_wechat_checkin_data as ck
+        LEFT JOIN ctop_wechat_user_list as us ON ck.user_id = us.user_id
+        LEFT JOIN ctop_wechat_department as dpt ON dpt.depart_id = us.depart_id
+        WHERE ck.overtime_or_not = 1
+        and us.data_type = dpt.data_type
+        and us.data_type = 1
         <if test="userId != null and userId != '' ">
             and us.user_id = #{userId}
         </if>

+ 6 - 1
module-oa/src/main/java/cn/com/ctop/oa/modules/mapper/xml/WechatUserListMapper.xml

@@ -1,5 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="cn.com.ctop.oa.modules.mapper.WechatUserListMapper">
-
+    <select id="queryList" resultType="cn.com.ctop.oa.modules.entity.WechatUserList">
+        SELECT
+            *
+        FROM ctop_wechat_user_list
+        where data_type = #{dataType}
+    </select>
 </mapper>

+ 3 - 0
module-oa/src/main/java/cn/com/ctop/oa/modules/service/IWechatCheckinDataService.java

@@ -14,7 +14,10 @@ import java.util.Map;
  * @Version: V1.0
  */
 public interface IWechatCheckinDataService extends IService<WechatCheckinData> {
+
     void getCheckinData(String starttime, String endtime);
 
+    void getYRCheckinData(String starttime, String endtime);
+
     PageInfo<WechatCheckinSubData> selectPageList(Map<String, Object> paramsMap);
 }

+ 1 - 1
module-oa/src/main/java/cn/com/ctop/oa/modules/service/IWechatDepartmentService.java

@@ -14,5 +14,5 @@ import java.util.List;
 public interface IWechatDepartmentService extends IService<WechatDepartment> {
     void getDepartment();
 
-    List<WechatDepartment> queryList();
+    List<WechatDepartment> queryList(Integer dataType);
 }

+ 5 - 12
module-oa/src/main/java/cn/com/ctop/oa/modules/service/IWechatNoListService.java

@@ -16,17 +16,6 @@ import java.util.Map;
  * @Version: V1.0
  */
 public interface IWechatNoListService extends IService<WechatNoList> {
-    /**
-     * 批量获取审批单号,单号!
-     *
-     * @param page      查询起始数,分页查询游标,默认为0
-     * @param starttime 审批单提交的时间范围,开始时间,UNix时间戳
-     * @param endtime   批单提交的时间范围,结束时间,Unix时间戳
-     * @return com.alibaba.fastjson.JSONObject
-     * @throws
-     * @author ZHAOXA
-     */
-    JSONObject getNoList(Integer page, String starttime, String endtime);
 
     /**
      * 审批申请数据入库
@@ -37,7 +26,7 @@ public interface IWechatNoListService extends IService<WechatNoList> {
      * @throws
      * @author ZHAOXA
      */
-    void getNoDateByNo(String starttime, String endtime);
+    void getNoDateByNo(String starttime, String endtime,String dataType);
 
     List<WechatAttendance> queryAttendanceData(Map<String, Object> paramsMap);
 
@@ -46,4 +35,8 @@ public interface IWechatNoListService extends IService<WechatNoList> {
     PageInfo<WechatAttendance> selectNoListPage(Map<String, Object> paramsMap);
 
     PageInfo<WechatAttendance> selectOverTimePage(Map<String, Object> paramsMap);
+
+    List<WechatAttendance> queryYRAttendanceData(Map<String, Object> paramsMap);
+
+    List<WechatAttendance> queryYROverTimeData(Map<String, Object> paramsMap);
 }

+ 23 - 6
module-oa/src/main/java/cn/com/ctop/oa/modules/service/IWechatTokenService.java

@@ -3,17 +3,34 @@ package cn.com.ctop.oa.modules.service;
 import java.util.Map;
 
 public interface IWechatTokenService {
+    /**
+     * 获取okr秘钥
+     */
     Map<String, Object> getQYWXAccessToken();
 
+    /**
+     * 打卡信息token
+     */
     Map<String, Object> getOAAccessToken();
 
     /**
-     * 审批token
-     *
-     * @return java.util.Map<java.lang.String, java.lang.Object>
-     * @throws
-     * @author ZHAOXA
-     * @Param []
+     * 审批信息token
      */
     Map<String, Object> getApprovaAccessToken();
+
+    /**
+     * 获取优容公司秘钥
+     */
+    Map<String, Object> getYRCompanyToken();
+
+    /**
+     * 优容打卡信息token
+     */
+    Map<String, Object> getYROAToken();
+
+    /**
+     * 优容审批信息token
+     */
+    Map<String, Object> getYRApprovaToken();
+
 }

+ 6 - 0
module-oa/src/main/java/cn/com/ctop/oa/modules/service/IWechatUserListService.java

@@ -3,6 +3,8 @@ package cn.com.ctop.oa.modules.service;
 import cn.com.ctop.oa.modules.entity.WechatUserList;
 import com.baomidou.mybatisplus.extension.service.IService;
 
+import java.util.List;
+
 /**
  * @Description: 企业微信用户
  * @Author: jeecg-boot
@@ -11,5 +13,9 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface IWechatUserListService extends IService<WechatUserList> {
     void getUserList();
+
+    void getYRUserList();
+
+    List<WechatUserList> queryList(int dataType);
 }
 

+ 87 - 3
module-oa/src/main/java/cn/com/ctop/oa/modules/service/impl/WechatCheckinDataServiceImpl.java

@@ -52,7 +52,7 @@ public class WechatCheckinDataServiceImpl extends ServiceImpl<WechatCheckinDataM
                 log.error("员工考勤获取token失败,返回信息:{}", qywxAccessToken.get(MESSAGE));
                 throw new Exception("员工考勤获取token失败");
             }
-            List<WechatUserList> list = userListService.list();
+            List<WechatUserList> list = userListService.queryList(NoEn.NO0.valueInt());
             if (Check.isNull(list)) {
                 return;
             }
@@ -64,8 +64,8 @@ public class WechatCheckinDataServiceImpl extends ServiceImpl<WechatCheckinDataM
                 JSONArray userArr = new JSONArray();
                 userArr.add(userId);
                 params.put("useridlist", userArr);
-                params.put(API_START_TIME, starttime);
-                params.put(API_END_TIME, endtime);
+                params.put(API_START_TIME, DateUtils.timeToStamp(starttime));
+                params.put(API_END_TIME, DateUtils.timeToStamp(endtime));
                 String resultStr = HttpUtils.httpPostRequestTest(QYWxConstant.QYWX_CHECKIN_DATA + "?access_token=" + qywxAccessToken.get(ACCESS_TOKEN), params.toJSONString(), null);
                 JSONObject resultJson = JSONObject.parseObject(resultStr);
                 if (resultJson.getInteger(ERR_CODE) == 0) {
@@ -125,6 +125,90 @@ public class WechatCheckinDataServiceImpl extends ServiceImpl<WechatCheckinDataM
         }
     }
 
+
+    @Override
+    public void getYRCheckinData(String starttime, String endtime) {
+        try {
+            Map<String, Object> qywxAccessToken = tokenService.getYROAToken();
+            if ((Integer) qywxAccessToken.get(CODE) != 0) {
+                log.error("员工考勤获取token失败,返回信息:{}", qywxAccessToken.get(MESSAGE));
+                throw new Exception("员工考勤获取token失败");
+            }
+            List<WechatUserList> list = userListService.queryList(NoEn.NO1.valueInt());
+            if (Check.isNull(list)) {
+                return;
+            }
+            for (WechatUserList userList : list) {
+                JSONObject params = new JSONObject();
+                String userId = userList.getUserId();
+                String departId = userList.getDepartId();
+                params.put("opencheckindatatype", 3);
+                JSONArray userArr = new JSONArray();
+                userArr.add(userId);
+                params.put("useridlist", userArr);
+                params.put(API_START_TIME, DateUtils.timeToStamp(starttime));
+                params.put(API_END_TIME, DateUtils.timeToStamp(endtime));
+                String resultStr = HttpUtils.httpPostRequestTest(QYWxConstant.QYWX_CHECKIN_DATA + "?access_token=" + qywxAccessToken.get(ACCESS_TOKEN), params.toJSONString(), null);
+                JSONObject resultJson = JSONObject.parseObject(resultStr);
+                if (resultJson.getInteger(ERR_CODE) == 0) {
+                    JSONArray checkindata = resultJson.getJSONArray("checkindata");
+                    if (!Check.isNull(checkindata)) {
+                        StringBuffer buf = null;
+                        String checkinType = "";
+                        String checkinTypeCode = "";
+                        for (int i = 0; i < checkindata.size(); i++) {
+                            JSONObject jsonObject = checkindata.getJSONObject(i);
+                            if (!Check.isNull(jsonObject)) {
+                                WechatCheckinData checkinData = new WechatCheckinData();
+                                checkinType = jsonObject.getString("checkin_type");
+                                //1上班,2下班
+                                checkinTypeCode = "上班打卡".equals(checkinType) ? NoEn.NO1.valueStr() : NoEn.NO2.valueStr();
+                                //下班打卡时间
+                                Long checkinTimeStamp = jsonObject.getLong("checkin_time");
+                                Date checkDate = DateUtils.stampToTime(checkinTimeStamp);
+                                String dateStr = DateUtils.formatDate(checkDate);
+                                long dateLong = DateUtils.timeToStamp(dateStr + DAY_BEGIN);
+                                buf = new StringBuffer();
+                                String id = buf.append(userId).append("_").append(checkinTypeCode).append("_").append(dateLong).toString();
+                                checkinData.setId(id);
+                                checkinData.setDepartId(departId);
+                                checkinData.setUserId(userId);
+                                checkinData.setCheckinType(checkinType);
+                                checkinData.setCheckinTime(checkDate);
+                                Long dateStamp = DateUtils.timeToStamp(dateStr + " 21:30:00"); // 每天九点半时间戳
+                                if (checkinTimeStamp >= dateStamp) {
+                                    checkinData.setOvertimeOrNot(1);
+                                    String overtimeStr = DateUtils.formatDate(checkDate) + " 19:00:00";
+                                    Long overtimeStamp = DateUtils.timeToStamp(overtimeStr); // 每天九点半时间戳
+                                    Double overtime = Double.valueOf(checkinTimeStamp - overtimeStamp) / 3600;
+                                    checkinData.setOvertime(overtime);
+                                }
+                                checkinData.setWifiname(jsonObject.getString("wifiname"));
+                                checkinData.setNotes(jsonObject.getString("notes"));
+                                checkinData.setLat(jsonObject.getString("lng"));
+                                checkinData.setLocationDetail(jsonObject.getString("location_detail"));
+                                checkinData.setGroupName(jsonObject.getString("groupname"));
+                                checkinData.setDeviceid(jsonObject.getString("deviceid"));
+                                checkinData.setExceptionType(jsonObject.getString("exception_type"));
+                                checkinData.setLocationTitle(jsonObject.getString("location_title"));
+                                checkinData.setWifimac(jsonObject.getString("wifimac"));
+                                checkinData.setMediaids(jsonObject.getJSONArray("mediaids").toJSONString());
+                                checkinData.setLat(jsonObject.getString("lat"));
+                                checkinData.setDataType(NoEn.NO1.valueInt());
+                                this.saveOrUpdate(checkinData);
+                            }
+                        }
+                    }
+                } else {
+                    log.error("获取打卡数据异常,返回数据-> {} ;入参-> {}", resultJson, params.toJSONString());
+                }
+            }
+        } catch (Exception e) {
+            log.error("员工考勤入库异常,", e);
+        }
+    }
+
+
     @Override
     public PageInfo<WechatCheckinSubData> selectPageList(Map<String, Object> paramsMap) {
         Integer pageNo = (Integer) paramsMap.get(PAGE_NO);

+ 4 - 2
module-oa/src/main/java/cn/com/ctop/oa/modules/service/impl/WechatDepartmentServiceImpl.java

@@ -11,6 +11,7 @@ import cn.com.ctop.oa.modules.service.IWechatTokenService;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xxl.job.core.enums.NoEn;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -79,7 +80,8 @@ public class WechatDepartmentServiceImpl extends ServiceImpl<WechatDepartmentMap
     }
 
     @Override
-    public List<WechatDepartment> queryList() {
-        return wechatDepartmentMapper.queryList();
+    public List<WechatDepartment> queryList(Integer dataType) {
+        return wechatDepartmentMapper.queryList(dataType);
     }
+
 }

+ 75 - 41
module-oa/src/main/java/cn/com/ctop/oa/modules/service/impl/WechatNoListServiceImpl.java

@@ -54,8 +54,11 @@ public class WechatNoListServiceImpl extends ServiceImpl<WechatNoListMapper, Wec
      * @author ZHAOXA
      * @Param []
      */
-    private String getToken() throws Exception {
+    private String getToken(String dataType) throws Exception {
         Map<String, Object> approvaAccessToken = tokenService.getApprovaAccessToken();
+        if (NoEn.NO1.valueStr().equals(dataType)) {
+            approvaAccessToken = tokenService.getYRApprovaToken();
+        }
         if ((Integer) approvaAccessToken.get("code") != 0) {
             log.error("企业微信获取token失败,返回信息:{}", approvaAccessToken.get("message"));
             throw new Exception("企业微信获取token失败");
@@ -64,47 +67,14 @@ public class WechatNoListServiceImpl extends ServiceImpl<WechatNoListMapper, Wec
     }
 
     @Override
-    public JSONObject getNoList(Integer page, String starttime, String endtime) {
-        try {
-            JSONObject params = new JSONObject();
-            params.put("starttime", starttime);
-            params.put("endtime", endtime);
-            params.put("cursor", page);
-            params.put("size", 100);
-            StringBuffer buf = new StringBuffer();
-            //批量获取审批单号 URL
-            buf.append(QYWxConstant.APP_ROVAL_INFO).append("?access_token=").append(getToken());
-            String resultStr = HttpUtils.httpPostRequestTest(buf.toString(), params.toJSONString(), null);
-            JSONObject resultJson = JSONObject.parseObject(resultStr);
-            Integer errcode = resultJson.getInteger("errcode");
-            if (errcode == 0) {
-                return resultJson;
-            } else {
-                throw new Exception("批量获取审批单号");
-            }
-        } catch (Exception e) {
-            log.error("批量获取审批单号异常", e);
-        }
-        return new JSONObject();
-    }
-
-    //递归获取审批数据
-    private JSONArray getAllNoList(Integer page, JSONArray spNoList, String starttime, String endtime) {
-        JSONObject data = getNoList(page, starttime, endtime);
-        spNoList.addAll(data.getJSONArray("sp_no_list"));
-        Integer nextCursor = data.getInteger("next_cursor");
-        if (!Check.isNull(nextCursor)) {
-            return getAllNoList(nextCursor, spNoList, starttime, endtime);
-        }
-        return spNoList;
-    }
-
-    @Override
-    public void getNoDateByNo(String starttime, String endtime) {
+    public void getNoDateByNo(String starttime, String endtime, String dataType) {
         Map<String, Object> returnMap = new HashMap<>();
         try {
+            long start = DateUtils.timeToStamp(starttime);
+            long end = DateUtils.timeToStamp(endtime);
+            String token = getToken(dataType);
             Integer page = 0;
-            JSONArray noList = getAllNoList(page, new JSONArray(), starttime, endtime);
+            JSONArray noList = getAllNoList(page, new JSONArray(), start, end, token);
             boolean sleep = false;
             if (noList.size() > 600) {
                 sleep = true;
@@ -112,14 +82,14 @@ public class WechatNoListServiceImpl extends ServiceImpl<WechatNoListMapper, Wec
             if (!Check.isNull(noList)) {
                 StringBuffer buf = new StringBuffer();
                 //获取审批申请详情 URL;
-                buf.append(QYWxConstant.APP_ROVAL_DETAIL).append("?access_token=").append(getToken());
+                buf.append(QYWxConstant.APP_ROVAL_DETAIL).append("?access_token=").append(token);
                 String userId = null;
                 Map<String, String> parameterMap = null;
                 for (Object spNo : noList) {
                     parameterMap = new HashMap<>();
                     //接口频率限制 600次/分钟
                     if (sleep) {
-                        Thread.sleep(100);
+                        Thread.sleep(105);
                     }
                     JSONObject params = new JSONObject();
                     params.put("sp_no", spNo);
@@ -156,6 +126,9 @@ public class WechatNoListServiceImpl extends ServiceImpl<WechatNoListMapper, Wec
                             }
                             noEntity.setType(parameterMap.get(TYPE));
                             noEntity.setNewDuration(parameterMap.get("newDuration"));
+                            if (NoEn.NO1.valueStr().equals(dataType)) {
+                                noEntity.setDataType(NoEn.NO1.valueInt());
+                            }
                             wechatNoListMapper.insert(noEntity);
                         }
                     }
@@ -168,6 +141,51 @@ public class WechatNoListServiceImpl extends ServiceImpl<WechatNoListMapper, Wec
         }
     }
 
+    //递归获取审批数据
+    private JSONArray getAllNoList(Integer page, JSONArray spNoList, Long starttime, Long endtime, String token) {
+        JSONObject data = getNoList(page, starttime, endtime, token);
+        spNoList.addAll(data.getJSONArray("sp_no_list"));
+        Integer nextCursor = data.getInteger("next_cursor");
+        if (!Check.isNull(nextCursor)) {
+            return getAllNoList(nextCursor, spNoList, starttime, endtime, token);
+        }
+        return spNoList;
+    }
+
+    /**
+     * 批量获取审批单号,单号!
+     *
+     * @param page      查询起始数,分页查询游标,默认为0
+     * @param starttime 审批单提交的时间范围,开始时间,UNix时间戳
+     * @param endtime   批单提交的时间范围,结束时间,Unix时间戳
+     * @return com.alibaba.fastjson.JSONObject
+     * @throws
+     * @author ZHAOXA
+     */
+    private JSONObject getNoList(Integer page, Long starttime, Long endtime, String token) {
+        try {
+            JSONObject params = new JSONObject();
+            params.put("starttime", starttime);
+            params.put("endtime", endtime);
+            params.put("cursor", page);
+            params.put("size", 100);
+            StringBuffer buf = new StringBuffer();
+            //批量获取审批单号 URL
+            buf.append(QYWxConstant.APP_ROVAL_INFO).append("?access_token=").append(token);
+            String resultStr = HttpUtils.httpPostRequestTest(buf.toString(), params.toJSONString(), null);
+            JSONObject resultJson = JSONObject.parseObject(resultStr);
+            Integer errcode = resultJson.getInteger("errcode");
+            if (errcode == 0) {
+                return resultJson;
+            } else {
+                throw new Exception("批量获取审批单号");
+            }
+        } catch (Exception e) {
+            log.error("批量获取审批单号异常", e);
+        }
+        return new JSONObject();
+    }
+
     /**
      * 获取审批状态数据
      *
@@ -291,6 +309,16 @@ public class WechatNoListServiceImpl extends ServiceImpl<WechatNoListMapper, Wec
         return list;
     }
 
+    @Override
+    public List<WechatAttendance> queryYRAttendanceData(Map<String, Object> paramsMap) {
+        finishingTime(paramsMap);
+        List<WechatAttendance> list = wechatNoListMapper.queryYRAttendanceData(paramsMap);
+        if (!Check.isNull(list)) {
+            checkOverTimeData(list);
+        }
+        return list;
+    }
+
     /**
      * 整理时间
      *
@@ -319,6 +347,12 @@ public class WechatNoListServiceImpl extends ServiceImpl<WechatNoListMapper, Wec
     }
 
     @Override
+    public List<WechatAttendance> queryYROverTimeData(Map<String, Object> paramsMap) {
+        finishingTime(paramsMap);
+        return wechatNoListMapper.queryYROverTimeData(paramsMap);
+    }
+
+    @Override
     public PageInfo<WechatAttendance> selectNoListPage(Map<String, Object> paramsMap) {
         finishingTime(paramsMap);
         Integer pageNo = (Integer) paramsMap.get(PAGE_NO);

+ 93 - 4
module-oa/src/main/java/cn/com/ctop/oa/modules/service/impl/WechatTokenServiceImpl.java

@@ -12,6 +12,10 @@ import java.util.TreeMap;
 
 @Service
 public class WechatTokenServiceImpl implements IWechatTokenService {
+    /**
+     * 获取okr秘钥
+     */
+    @Override
     public Map<String, Object> getQYWXAccessToken() {
         Map<String, Object> returnMap = new HashMap<>();
         try {
@@ -35,6 +39,10 @@ public class WechatTokenServiceImpl implements IWechatTokenService {
         return returnMap;
     }
 
+    /**
+     * 打卡信息token
+     */
+    @Override
     public Map<String, Object> getOAAccessToken() {
         Map<String, Object> returnMap = new HashMap<>();
         try {
@@ -59,10 +67,7 @@ public class WechatTokenServiceImpl implements IWechatTokenService {
     }
 
     /**
-     * @return java.util.Map<java.lang.String, java.lang.Object>
-     * @throws 获取审批
-     * @author ZHAOXA
-     * @Param []
+     * 审批信息token
      */
     @Override
     public Map<String, Object> getApprovaAccessToken() {
@@ -88,4 +93,88 @@ public class WechatTokenServiceImpl implements IWechatTokenService {
         return returnMap;
     }
 
+    //--------------↓-天津优容-↓--------------
+
+    /**
+     * 获取优容公司秘钥
+     */
+    @Override
+    public Map<String, Object> getYRCompanyToken() {
+        Map<String, Object> returnMap = new HashMap<>();
+        try {
+            TreeMap<String, Object> params = new TreeMap<>();
+            params.put("corpid", QYWxConstant.YR_CORP_ID);
+            params.put("corpsecret", QYWxConstant.YR_CORP_SECRET);
+            String resultStr = HttpUtils.httpGetRequest(QYWxConstant.QYWX_API_URL + QYWxConstant.QYWX_GET_TOKEN, null, params);
+            JSONObject resultJson = JSONObject.parseObject(resultStr);
+            Integer errcode = resultJson.getInteger("errcode");
+            if (errcode == 0) {
+                returnMap.put("code", 0);
+                returnMap.put("accessToken", resultJson.getString("access_token"));
+            } else {
+                returnMap.put("code", errcode);
+                returnMap.put("message", resultJson.getString("errmsg"));
+            }
+        } catch (Exception e) {
+            returnMap.put("code", -1);
+            returnMap.put("message", "系统错误");
+        }
+        return returnMap;
+    }
+
+    /**
+     * 优容打卡信息token
+     */
+    @Override
+    public Map<String, Object> getYROAToken() {
+        Map<String, Object> returnMap = new HashMap<>();
+        try {
+            TreeMap<String, Object> params = new TreeMap<>();
+            params.put("corpid", QYWxConstant.YR_CORP_ID);
+            params.put("corpsecret", QYWxConstant.YR_OA_CORP_SECRET);
+            String resultStr = HttpUtils.httpGetRequest(QYWxConstant.QYWX_API_URL + QYWxConstant.QYWX_GET_TOKEN, null, params);
+            JSONObject resultJson = JSONObject.parseObject(resultStr);
+            Integer errcode = resultJson.getInteger("errcode");
+            if (errcode == 0) {
+                returnMap.put("code", 0);
+                returnMap.put("accessToken", resultJson.getString("access_token"));
+            } else {
+                returnMap.put("code", errcode);
+                returnMap.put("message", resultJson.getString("errmsg"));
+            }
+        } catch (Exception e) {
+            returnMap.put("code", -1);
+            returnMap.put("message", "系统错误");
+        }
+        return returnMap;
+    }
+
+    /**
+     * 优容审批信息token
+     */
+    @Override
+    public Map<String, Object> getYRApprovaToken() {
+        Map<String, Object> returnMap = new HashMap<>();
+        try {
+            TreeMap<String, Object> params = new TreeMap<>();
+            params.put("corpid", QYWxConstant.YR_CORP_ID);
+            params.put("corpsecret", QYWxConstant.YR_APPROVA_CORP_SECRET);
+            String resultStr = HttpUtils.httpGetRequest(QYWxConstant.QYWX_API_URL + QYWxConstant.QYWX_GET_TOKEN, null, params);
+            JSONObject resultJson = JSONObject.parseObject(resultStr);
+            Integer errcode = resultJson.getInteger("errcode");
+            if (errcode == 0) {
+                returnMap.put("code", 0);
+                returnMap.put("accessToken", resultJson.getString("access_token"));
+            } else {
+                returnMap.put("code", errcode);
+                returnMap.put("message", resultJson.getString("errmsg"));
+            }
+        } catch (Exception e) {
+            returnMap.put("code", -1);
+            returnMap.put("message", "系统错误");
+        }
+        return returnMap;
+    }
+
+
 }

+ 58 - 1
module-oa/src/main/java/cn/com/ctop/oa/modules/service/impl/WechatUserListServiceImpl.java

@@ -12,6 +12,7 @@ import cn.com.ctop.oa.modules.service.IWechatUserListService;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xxl.job.core.enums.NoEn;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -34,6 +35,8 @@ public class WechatUserListServiceImpl extends ServiceImpl<WechatUserListMapper,
     private IWechatTokenService tokenService;
     @Autowired
     private IWechatDepartmentService departmentService;
+    @Autowired
+    private WechatUserListMapper wechatUserListMapper;
 
     @Override
     public void getUserList() {
@@ -45,7 +48,7 @@ public class WechatUserListServiceImpl extends ServiceImpl<WechatUserListMapper,
             }
             TreeMap<String, Object> params = new TreeMap<>();
             params.put("access_token", qywxAccessToken.get("accessToken"));
-            List<WechatDepartment> list = departmentService.list();
+            List<WechatDepartment> list = departmentService.queryList(NoEn.NO0.valueInt());
             if (Check.isNull(list)) {
                 return;
             }
@@ -81,4 +84,58 @@ public class WechatUserListServiceImpl extends ServiceImpl<WechatUserListMapper,
             e.printStackTrace();
         }
     }
+
+
+    @Override
+    public void getYRUserList() {
+        try {
+            Map<String, Object> qywxAccessToken = tokenService.getYRCompanyToken();
+            if ((Integer) qywxAccessToken.get("code") != 0) {
+                log.error("企业微信获取token失败,返回信息:{}", qywxAccessToken.get("message"));
+                throw new Exception("企业微信获取token失败");
+            }
+            TreeMap<String, Object> params = new TreeMap<>();
+            params.put("access_token", qywxAccessToken.get("accessToken"));
+            List<WechatDepartment> list = departmentService.queryList(NoEn.NO1.valueInt());
+            if (Check.isNull(list)) {
+                return;
+            }
+            for (WechatDepartment department : list) {
+                params.remove("department_id");
+                String departId = department.getDepartId();
+                params.put("department_id", departId);
+                String resultStr = HttpUtils.httpGetRequest(QYWxConstant.QYWX_USER_SIMPLELIST, null, params);
+                JSONObject resultJson = JSONObject.parseObject(resultStr);
+                Integer errcode = resultJson.getInteger("errcode");
+                if (errcode == 0) {
+                    JSONArray userlist = resultJson.getJSONArray("userlist");
+                    if (!Check.isNull(userlist)) {
+                        for (int i = 0; i < userlist.size(); i++) {
+                            JSONObject userJson = userlist.getJSONObject(i);
+                            if (!Check.isNull(userJson)) {
+                                String userid = userJson.getString("userid");
+                                String id = departId + "_" + userid;
+                                WechatUserList userList = new WechatUserList();
+                                userList.setId(id);
+                                userList.setDepartId(departId);
+                                userList.setUserId(userid);
+                                userList.setDataType(NoEn.NO1.valueInt());
+                                userList.setUserName(userJson.getString("name"));
+                                this.saveOrUpdate(userList);
+                            }
+                        }
+                    }
+                } else {
+                    throw new Exception("企业微信获取用户列表失败");
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Override
+    public List<WechatUserList> queryList(int dataType) {
+        return wechatUserListMapper.queryList(dataType);
+    }
 }

+ 4 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/service/IByteDanceAdvertiserDataService.java

@@ -41,4 +41,8 @@ public interface IByteDanceAdvertiserDataService {
     void getImageByPage(CtopOauthToken token, String imageIds, int page);
 
     JSONArray advertiserList(String token);
+
+
+    void getBytedancePlanList(String accountId, String accessToken, int pageNum, String createDate, String updateDate);
+
 }

+ 43 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/service/impl/ByteDanceAdvertiserDataServiceImpl.java

@@ -749,4 +749,47 @@ public class ByteDanceAdvertiserDataServiceImpl implements IByteDanceAdvertiserD
         params.put("page_size", 100);
         return HttpUtils.bytedanceGetRequest(token.getAccessToken(), url, params);
     }
+
+
+    public void getBytedancePlanList(String accountId, String accessToken, int pageNum, String createDate, String updateDate) {
+
+        // 请求地址
+        String url = PropertiesUtils.getValue("bytedance_config", "bytedance_api_url") + PropertiesUtils.getValue("bytedance_config", "bytedance_v2_ad_get");
+        // 请求参数
+        Map<String, Object> filtering = new HashMap<>();
+        if (null != createDate && !"".equals(createDate)) {
+            filtering.put("ad_create_time", createDate);
+        }
+        if (null != updateDate && !"".equals(updateDate)) {
+            filtering.put("ad_modify_time", updateDate);
+        }
+
+        JSONObject param = new JSONObject();
+        param.put("advertiser_id", accountId);
+        param.put("page", pageNum);
+        param.put("page_size", 1000);
+        param.put("filtering", filtering);
+        JSONObject resultObject = HttpUtils.bytedanceGetRequest(accessToken, url, param);
+        Integer code = resultObject.getInteger("code");
+        if (null == code || !code.equals(0)) {
+            log.error("获取广告计划信息接口异常==》accountId:{},message:{}", accountId, resultObject.getString("message"));
+            return;
+        }
+        JSONArray data = resultObject.getJSONObject("data").getJSONArray("list");
+        if (null == data || data.isEmpty()) {
+            return;
+        }
+        for (int i = 0; i < data.size(); i++) {
+            JSONObject dataObject = data.getJSONObject(i);
+            ByteDanceAdvertisePlan advertisePlan = new ByteDanceAdvertisePlan(dataObject, accountId);
+            BigDecimal deepCpabid = dataObject.getBigDecimal("deep_cpabid");
+            if (null != deepCpabid) {
+                advertisePlan.setDeepCpaBid(deepCpabid);
+            }
+            //   advertisePlanService.saveOrUpdate(advertisePlan);
+        }
+        getBytedancePlanList(accountId, accessToken, pageNum + 1, createDate, updateDate);
+    }
+
+
 }

+ 5 - 1
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/service/impl/ReportServiceImpl.java

@@ -199,6 +199,7 @@ public class ReportServiceImpl implements IReportService {
                 JSONObject audienceObject = JSONObject.parseObject(plan.getAudience());
                 target.setAccountId(token.getAccountId());
                 target.setAccountName(allocation.getAuthName());
+                target.setDeepBidType(plan.getDeepBidType());
                 target.setPlanId(ruleDataPlan.getPlanId());
                 target.setId(ruleDataPlan.getPlanId());
                 target.setCreateTime(new Date());
@@ -209,6 +210,9 @@ public class ReportServiceImpl implements IReportService {
                 if(null!=audienceObject.getString("retargeting_tags_include")){
                     target.setRetargetingTagsExclude(audienceObject.getString("retargeting_tags_include"));
                 }
+                if(null!=audienceObject.getString("retargeting_tags_include")){
+                    target.setRetargetingTagsInclude(audienceObject.getString("retargeting_tags_include"));
+                }
                 target.setHideIfConverted(plan.getHideIfConverted());
                 target.setHideIfExists(plan.getHideIfExists());
 
@@ -247,7 +251,7 @@ public class ReportServiceImpl implements IReportService {
     private void formatCreativeData(JSONObject detail, UserAllocation allocation, RuleDataPlan plan) {
         //广告来源
         String source = detail.getString("source");
-        Integer isPresentedVideo = detail.getInteger("is_presented_video");
+        Integer isPresentedVideo = detail.getInteger("isPresentedVideo");
         JSONArray creatives = detail.getJSONArray("creatives");
         if(null!=creatives&&!creatives.isEmpty()){
             for(int i=0;i<creatives.size();i++){

+ 1 - 0
pom.xml

@@ -31,6 +31,7 @@
         <module>module-job-bytedance</module>
         <module>module-job-kuaishou</module>
         <module>module-callback</module>
+        <module>module-job-distribute</module>
 
     </modules>