Package: duyan-download-task
1、介绍本项目是对通用文件导出任务的抽象组件提取，通过使用本项目，可以简化通用文件导相关业务的开发。2、使用方式数据库表:CREATETABLE`download_task_main`(`id`bigintunsignedNOTNULLAUTO_INCREMENT,`org_id`bigintunsignedNOTNULL,`task_name`varchar(64)DEFAULTNULLCOMMENT'任务名称',`platform`intNOTNULLCOMMENT' 生成平台 ， 1 ：cfg , 2:cti , 3 : open , 4: crm ',`type`intNOTNULLCOMMENT'导出类型 1: 导出联系人 ， 2 ：公司对账单导出 3 ： 导出 计划item 4 ：导出 通话记录统计分析 5 ： 录音下载 6 ：信修下载 7 .通话记录加录音下载',`sub_type`intNOTNULLCOMMENT'导出子类型 导出类型下 分出来的子类型 ',`description`varchar(255)DEFAULTNULLCOMMENT'描述',`status`intDEFAULT'0'COMMENT' 0 :任务创建中 , 1 : 文件上传中 ，2 ：文件上传完成 ,-1 :文件上传失败 3 : 任务失效  4：取消任务',`top`intDEFAULT'0'COMMENT'是否置顶   0：否  1：是',`data`varchar(1024)DEFAULTNULLCOMMENT'序列化字段',`notify`tinyintDEFAULT'0'COMMENT'是否通知 0：否 1：是',`remark`varchar(256)DEFAULTNULLCOMMENT'备注',`created_by`bigintDEFAULT'0'COMMENT'创建人 , agent org id ',`created_time`timestamp(3)NOTNULLDEFAULTCURRENT_TIMESTAMP(3)COMMENT'创建时间',`last_updated_time`timestamp(3)NOTNULLDEFAULTCURRENT_TIMESTAMP(3)ONUPDATECURRENT_TIMESTAMP(3)COMMENT'最后更新时间',PRIMARYKEY(`id`)USINGBTREE,KEY`index_created_time`(`created_time`),KEY`index_org_id_created_time`(`org_id`,`created_time`),KEY`index_type`(`type`),KEY`index_type_org_id`(`type`,`org_id`),KEY`index_org_id_platform`(`org_id`,`platform`),KEY`index_task_name_org_id`(`task_name`,`org_id`),KEY`index_sub_type_status`(`sub_type`,`status`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COMMENT='下载任务表';CREATETABLE`download_item`(`id`bigintunsignedNOTNULLAUTO_INCREMENTCOMMENT'主键 ',`task_id`bigintNOTNULLCOMMENT'主任务id',`org_id`bigintunsignedNOTNULLCOMMENT' 公司ID ',`type`intDEFAULTNULLCOMMENT'下载类型。一般跟 task的 子类型相同 ',`file_name`varchar(256)DEFAULTNULLCOMMENT'文件名称',`target_id`bigintDEFAULTNULLCOMMENT'关联id',`expire_time`timestampNULLDEFAULTNULLCOMMENT'过期时间',`download_times`intDEFAULTNULLCOMMENT'下载次数',`url`varchar(1024)DEFAULTNULLCOMMENT'文件下载地址',`status`intDEFAULT'0'COMMENT'0 :未开始 ， 1: 进行中 ，2:已完成 ，3 ：失效(针对下载次数超限) -1 :任务失败  4：取消任务',`data`varchar(1024)DEFAULTNULLCOMMENT'序列化字段',`remark`varchar(256)DEFAULTNULLCOMMENT'备注',`md5_value`varchar(45)DEFAULTNULLCOMMENT'文件MD5',`created_time`timestamp(3)NOTNULLDEFAULTCURRENT_TIMESTAMP(3)COMMENT'创建时间',`last_updated_time`timestamp(3)NOTNULLDEFAULTCURRENT_TIMESTAMP(3)ONUPDATECURRENT_TIMESTAMP(3)COMMENT'最后更新时间',PRIMARYKEY(`id`)USINGBTREE,KEY`index_created_time`(`created_time`),KEY`index_task_id`(`task_id`),KEY`index_task_id_org_id`(`task_id`,`org_id`),KEY`index_org_id_target_id`(`org_id`,`target_id`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COMMENT='下载任务明细';示例：1、配置文件[download_task]dbHost=localhostdbPort=3306dbUser=rootdbPassword=12345678dbName=ctiredisHost=localhostredisPort=6379redisDb=02、任务分发调度及状态管理fromduyan_download_taskimportDownloadTaskSchedulerdeftest_scheduler():scheduler=DownloadTaskScheduler('config.ini','download_task_scheduler')scheduler.start()if__name__=='__main__':test_scheduler()3、自定义导出业务逻辑-单个子任务importjsonfromduyan_download_taskimportDownloadTaskBase,SubTypeInfofromduyan_download_task.modelimportDownloadTaskMain,DownloadItemclassDemoTask(DownloadTaskBase):def__init__(self,task_info:SubTypeInfo,config_path:str,logger_name:str):super().__init__(task_info,config_path,logger_name)defget_validated_data_params(self,task_item_id:int,data:str)->dictorNone:self._logger.info(f"校验数据:[ID:{task_item_id}],data:{data}")returnjson.loads(data)defexport(self,task_item:DownloadItem,data_obj:dict)->tuple:self._logger.info(f"校验导出:[item:{data_obj}],data:{data_obj}")returnNone,None,Nonedefsplit_task(self,task:DownloadTaskMain)->list:passdeftask_test():info=SubTypeInfo(task_name='DemoTask',type=10,sub_type=15,queue_key='demo_task_queue',is_multi_task=False)task=DemoTask(info,'config.ini','demo_task')task.start()if__name__=='__main__':task_test()4、自定义导出业务逻辑-多个子任务importjsonimportdatetimefromduyan_download_taskimportDownloadTaskBase,SubTypeInfofromduyan_download_task.modelimportDownloadTaskMain,DownloadItemfromduyan_download_task.constantsimportItemStatusclassDemoMultiItemTask(DownloadTaskBase):task_info=SubTypeInfo(task_name='DemoMultiItemTask',type=11,sub_type=11,queue_key='demo_multi_item_task_queue',is_multi_task=True)def__init__(self,config_path:str,logger_name:str):super().__init__(self.task_info,config_path,logger_name)defget_validated_data_params(self,task_item_id:int,data:str)->dictorNone:self._logger.info(f"校验数据:[ID:{task_item_id}],data:{data}")returnjson.loads(data)defexport(self,task_item:DownloadItem,data_obj:dict)->tuple:self._logger.info(f"校验导出:[item:{data_obj}],data:{data_obj}")url='http://duyan-record-download.oss-cn-hangzhou.aliyuncs.com/100757218773722020-04-27.zip?OSSAccessKeyId=LTAI4GFAeToJVw9E8eoLK8Wu&Expires=1968908476&Signature=KugYlSKBX6d6ExiDWcJKk4KoA1Y%3D'md5='f9d991b4a0522dfa77da67d68c675261'file_name='100757218773722020-04-27.zip'returnurl,md5,file_namedefsplit_task(self,task:DownloadTaskMain)->list:items=[]now=datetime.datetime.now()foriinrange(2):item=DownloadItem()item.org_id=task.org_iditem.task_id=task.iditem.type=self.task_info.sub_typeitem.data=task.dataitem.status=ItemStatus.READY.valueitem.created_time=nowitem.last_updated_time=nowitems.append(item)returnitemsdefmulti_item_task_test():task=DemoMultiItemTask('config.ini','demo_task')task.start()if__name__=='__main__':multi_item_task_test()任务参数classDownloadTaskBase:def__init__(self,task_info:SubTypeInfo,config_path:str,logger_name:str,max_job=1,cron="0 0-59/2 * * * *"):"""init task:param task_info:SubTypeInfo 任务级别信息包括 名称、类型、子任务类型、任务队列、是否是多任务定义task_name 名称 type 类型 sub_type 子任务类型 queue_key 任务队列 is_multi_task 是否是多任务定义任务队列维护在redis中:param config_path:配置文件所在路径 如 ./config.ini:param logger_name:日志文件名称， 日志文件默认在./log目录下:param max_job:最大支持并发数量:param cron:任务执行周期cron表达式秒 分 时 日 月 年*       表示所有值*/a     表示每隔a时间a-b     表示a-b之间任何一个时间a-b/c   表示a-b之间每隔c时间取值范围：秒 0-59分 0-59时 0-23日 1-31月 1-12年 四位数字示例：0 */2 * * * * 每2分钟执行一次*/1 * * * * * 每2秒执行一次"""