liyuyi@c-top.com.cn 4 роки тому
батько
коміт
3bdf45184c
3 змінених файлів з 63 додано та 27 видалено
  1. 1 1
      .idea/ai_ads.iml
  2. 1 1
      .idea/misc.xml
  3. 61 25
      ai_strategy_request_handler.py

+ 1 - 1
.idea/ai_ads.iml

@@ -4,7 +4,7 @@
     <content url="file://$MODULE_DIR$">
       <excludeFolder url="file://$MODULE_DIR$/venv" />
     </content>
-    <orderEntry type="jdk" jdkName="Python 3.8 (base)" jdkType="Python SDK" />
+    <orderEntry type="jdk" jdkName="Python 3.8" jdkType="Python SDK" />
     <orderEntry type="sourceFolder" forTests="false" />
   </component>
   <component name="PyDocumentationSettings">

+ 1 - 1
.idea/misc.xml

@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project version="4">
-  <component name="ProjectRootManager" version="2" project-jdk-name="Python 3.8 (base)" project-jdk-type="Python SDK" />
+  <component name="ProjectRootManager" version="2" project-jdk-name="Python 3.8" project-jdk-type="Python SDK" />
 </project>

+ 61 - 25
ai_strategy_request_handler.py

@@ -31,20 +31,25 @@ class AiStrategyRequestParse(tornado.web.RequestHandler):
             inst = ParseModifyRequest(data)
 
 
-class ParseAddRequest(object):
+# 该类解析的是 手动请求的新增广告计划或者新增广告组的数据
+class ParseAddCampaignOrAddGroupRequest(object):
     def __init__(self, request_data):
         self.request_data = request_data
-        self.account_id = 9556344
+        self.video = self.request_data['video']
+        self.account_id = self.request_data['account_id']
+        self.campaign_info = self.request_data['campaign_info']
+        self.group_info = self.request_data['group_info']
+        self.operation_type = self.request_data['operation_type']
+
         self.advertiser_strategy_id = None
         self.ai_strategy_id = None
         self.advertiser_strategy = {}
-        self.campaign_dict = {}
         self.res_data = {}
 
     def get_advertiser_strategy_info(self):
         """
         获取指定账户下客户的策略信息
-        更新返回的拼接字典
+        为后续的写入库表,校验一致性做准备
         :return:
         """
         sql = """
@@ -56,12 +61,8 @@ class ParseAddRequest(object):
         engine = create_engine(db_con_str, connect_args={'charset': 'utf8'})
         advertiser_strategy_df = pd.read_sql(sql, engine)
 
-        self.advertiser_strategy_id = advertiser_strategy_df['id'].values[0]
-
-        advertiser_strategy_drop_cols = ['id', 'status', 'create_time', 'effective_time', 'expiry_time']
-        advertiser_strategy_df.drop(columns=advertiser_strategy_drop_cols, inplace=True)
         self.advertiser_strategy = advertiser_strategy_df.T.to_dict()[0]
-        self.res_data['advertiser_strategy_info'] = self.advertiser_strategy
+        self.advertiser_strategy_id = self.advertiser_strategy['id']
 
     def write_intelligence_strategy_table(self):
         """
@@ -73,29 +74,64 @@ class ParseAddRequest(object):
              'account_id': self.account_id,
              'ai_strategy_request_content': self.request_data,
              'create_time': datetime.datetime.now()}
+
         df = pd.DataFrame.from_dict(intelligence_strategy_dict, orient='index').T
         engine = create_engine(db_con_str, connect_args={'charset': 'utf8'})
         df.to_sql(name="ctop_ai_kuaishou_intelligence_strategy", con=engine, if_exists='append', index=False)
 
-    def get_campaign_dict(self):
+        # 获取新插入的 intelligence_strategy 的唯一标识ID
+        # TODO 这个方法的缺点是不适合高并发。如果同时插入的时候返回的值可能不准确。
+        sql = """
+        select max(id) from ctop_ai_kuaishou_intelligence_strategy where account_id = %d
+        """ % self.account_id
+        df = pd.read_sql(sql,engine)
+        self.ai_strategy_id = df['id'].values[0]
+
+    # 如果手动请求的数据结构中,"campaign" 中的 campaign_id 为空则调用该新增计划方法
+    def add_campaign(self):
         """
-        拼接计划层级的信息
+        新增广告计划
         :return:
         """
-        # 1、从客户策略信息中获取计划层级基本信息
-        self.campaign_dict['account_id'] = self.advertiser_strategy['account_id']
-        self.campaign_dict['campaign_id'] = ''
-        self.campaign_dict['campaign_name'] = ''
-        self.campaign_dict['day_budget'] = ''
-        self.campaign_dict['day_budget_schedule'] = ''
-        self.campaign_dict['operation_type'] = ''
-
-        # 2、从请求的信息中更新计划层级信息
-        if len(self.request_data['campaign']) > 0:
-            for key, value in self.request_data['campaign'].items():
-                self.campaign_dict.update({key: value})
-
-        # 3、计划层级的信息写入到数据库中
+        # 1、校验请求信息中 有没有 与客户策略信息 中存在冲突的地方 -- 计划层级只判断 campaign_type
+        if self.campaign_info['campaign_type'] != self.advertiser_strategy['campaign_type']:
+            # TODO 写入日志信息
+            return -1
+
+
+
+        # 3、从请求的信息中更新计划层级信息
+        # if len(self.request_data['campaign']) > 0:
+        #     for key, value in self.request_data['campaign'].items():
+        #         self.campaign_dict.update({key: value})
+
+        create_campaign_req_data = {'account_id': self.account_id,
+                                    'campaign_name': self.campaign_info['campaign_name'],
+                                    'type': self.campaign_info['campaign_type']}
+        url = "http://192.168.1.8:8080/jeecg-boot//jeecg-boot/kuaishou/create/campaignCreate"
+        request = requests.post(url, create_campaign_req_data)
+        res_data = simplejson.loads(request.text)
+
+        if res_data['code'] == 0:
+            campaign_info_to_db = {'account_id': self.account_id,
+                                   'ai_strategy_id': 1,
+                                   'campaign_name': self.campaign_info['campaign_name'],
+                                   'campaign_id': res_data['data']['campaign_id'],
+                                   'campaign_type': self.campaign_info['campaign_type'],
+                                   'operation_type': self.operation_type,
+                                   'campaign_create_time': res_data['data']['campaign_create_time'],
+                                   'create_time': datetime.datetime.now()}
+            df = pd.DataFrame.from_dict(campaign_info_to_db, orient='index').T
+            engine = create_engine(db_con_str, connect_args={'charset': 'utf8'})
+            df.to_sql(name="ctop_ai_kuaishou_campaign_level_operation_record", con=engine, if_exists='append', index=False)
+
+        else:
+            # TODO 写入计划创建失败的原因
+            return -1
+
+        # 写入数据库 ctop_ai_kuaishou_campaign_level_operation_record
+
+
 
 
         # 4、将计划层级的信息添加到 返回数据中