|
|
@@ -0,0 +1,165 @@
|
|
|
+package com.adx.tencent.baiduclue.storage;
|
|
|
+
|
|
|
+import com.adx.tencent.baiduclue.storage.mapper.BaiduClueApiLogMapper;
|
|
|
+import com.adx.tencent.baiduclue.storage.mapper.BaiduClueDisclosureDetailMapper;
|
|
|
+import com.adx.tencent.baiduclue.storage.mapper.BaiduClueLeadMapper;
|
|
|
+import com.adx.tencent.baiduclue.storage.model.BaiduClueApiLogRecord;
|
|
|
+import com.adx.tencent.baiduclue.storage.model.BaiduClueDisclosureDetailRecord;
|
|
|
+import com.adx.tencent.baiduclue.storage.model.BaiduClueLeadRecord;
|
|
|
+import org.apache.ibatis.session.SqlSession;
|
|
|
+import org.apache.ibatis.session.SqlSessionFactory;
|
|
|
+
|
|
|
+import java.sql.Statement;
|
|
|
+import java.sql.Timestamp;
|
|
|
+import java.time.Instant;
|
|
|
+
|
|
|
+public class BaiduClueColdStore {
|
|
|
+
|
|
|
+ private final SqlSessionFactory sqlSessionFactory;
|
|
|
+
|
|
|
+ public BaiduClueColdStore(SqlSessionFactory sqlSessionFactory) {
|
|
|
+ this.sqlSessionFactory = sqlSessionFactory;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void migrate() {
|
|
|
+ String[] ddls = {
|
|
|
+ """
|
|
|
+ CREATE TABLE IF NOT EXISTS baidu_clue_leads (
|
|
|
+ id BIGINT AUTO_INCREMENT PRIMARY KEY,
|
|
|
+ clue_id VARCHAR(64) NOT NULL,
|
|
|
+ appsid VARCHAR(64) NOT NULL,
|
|
|
+ tu_id VARCHAR(64),
|
|
|
+ post_time BIGINT NOT NULL,
|
|
|
+ query_words JSON NOT NULL,
|
|
|
+ trade_level1 INT NOT NULL,
|
|
|
+ trade_level2 INT NOT NULL,
|
|
|
+ trade_type INT,
|
|
|
+ trade_info JSON,
|
|
|
+ form_detail JSON,
|
|
|
+ consult_str JSON,
|
|
|
+ media_info JSON,
|
|
|
+ pid INT NOT NULL,
|
|
|
+ cid INT NOT NULL,
|
|
|
+ info_linker VARCHAR(64) NOT NULL,
|
|
|
+ info_phone VARCHAR(32) NOT NULL,
|
|
|
+ ip VARCHAR(64) NOT NULL,
|
|
|
+ user_agent TEXT,
|
|
|
+ prefetch_biz_code INT,
|
|
|
+ prefetch_code INT,
|
|
|
+ prefetch_msg VARCHAR(255),
|
|
|
+ submit_code INT,
|
|
|
+ submit_msg VARCHAR(255),
|
|
|
+ disclosure_status INT,
|
|
|
+ disclosure_time VARCHAR(32),
|
|
|
+ last_submit_at TIMESTAMP(3) NULL,
|
|
|
+ last_prefetch_at TIMESTAMP(3) NULL,
|
|
|
+ last_disclosure_at TIMESTAMP(3) NULL,
|
|
|
+ created_at TIMESTAMP(3) NOT NULL,
|
|
|
+ updated_at TIMESTAMP(3) NOT NULL,
|
|
|
+ UNIQUE KEY uk_baidu_clue_leads_clue_id (clue_id),
|
|
|
+ KEY idx_baidu_clue_leads_appsid_post_time (appsid, post_time),
|
|
|
+ KEY idx_baidu_clue_leads_phone_post_time (info_phone, post_time),
|
|
|
+ KEY idx_baidu_clue_leads_status_updated_at (submit_code, disclosure_status, updated_at)
|
|
|
+ )
|
|
|
+ """,
|
|
|
+ """
|
|
|
+ CREATE TABLE IF NOT EXISTS baidu_clue_api_logs (
|
|
|
+ id BIGINT AUTO_INCREMENT PRIMARY KEY,
|
|
|
+ api_type VARCHAR(32) NOT NULL,
|
|
|
+ clue_id VARCHAR(64),
|
|
|
+ appsid VARCHAR(64) NOT NULL,
|
|
|
+ request_url VARCHAR(255) NOT NULL,
|
|
|
+ request_timestamp VARCHAR(32) NOT NULL,
|
|
|
+ access_type INT NOT NULL DEFAULT 4,
|
|
|
+ encrypted_data MEDIUMTEXT,
|
|
|
+ signature VARCHAR(64),
|
|
|
+ request_body MEDIUMTEXT,
|
|
|
+ http_status INT,
|
|
|
+ response_body MEDIUMTEXT,
|
|
|
+ response_code INT,
|
|
|
+ response_msg VARCHAR(255),
|
|
|
+ biz_code INT,
|
|
|
+ success TINYINT(1) NOT NULL DEFAULT 0,
|
|
|
+ error_message TEXT,
|
|
|
+ created_at TIMESTAMP(3) NOT NULL,
|
|
|
+ KEY idx_baidu_clue_api_logs_api_type_created_at (api_type, created_at),
|
|
|
+ KEY idx_baidu_clue_api_logs_clue_id_api_type (clue_id, api_type),
|
|
|
+ KEY idx_baidu_clue_api_logs_response_code_created_at (response_code, created_at)
|
|
|
+ )
|
|
|
+ """,
|
|
|
+ """
|
|
|
+ CREATE TABLE IF NOT EXISTS baidu_clue_disclosure_details (
|
|
|
+ id BIGINT AUTO_INCREMENT PRIMARY KEY,
|
|
|
+ query_begin_time BIGINT NOT NULL,
|
|
|
+ query_end_time BIGINT NOT NULL,
|
|
|
+ clue_time VARCHAR(32),
|
|
|
+ clue_id VARCHAR(64) NOT NULL,
|
|
|
+ status INT NOT NULL,
|
|
|
+ raw_message TEXT,
|
|
|
+ created_at TIMESTAMP(3) NOT NULL,
|
|
|
+ KEY idx_baidu_clue_disclosure_details_clue_id_created_at (clue_id, created_at),
|
|
|
+ KEY idx_baidu_clue_disclosure_details_status_created_at (status, created_at),
|
|
|
+ KEY idx_baidu_clue_disclosure_details_query_window (query_begin_time, query_end_time)
|
|
|
+ )
|
|
|
+ """
|
|
|
+ };
|
|
|
+
|
|
|
+ try (SqlSession session = sqlSessionFactory.openSession(true)) {
|
|
|
+ Statement stmt = session.getConnection().createStatement();
|
|
|
+ for (String ddl : ddls) {
|
|
|
+ stmt.execute(ddl);
|
|
|
+ }
|
|
|
+ stmt.close();
|
|
|
+ } catch (Exception e) {
|
|
|
+ throw new RuntimeException("baidu clue migrate failed", e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public void saveLead(BaiduClueLeadRecord record) {
|
|
|
+ Instant now = Instant.now();
|
|
|
+ if (record.getCreatedAt() == null) record.setCreatedAt(now);
|
|
|
+ if (record.getUpdatedAt() == null) record.setUpdatedAt(now);
|
|
|
+ try (SqlSession session = sqlSessionFactory.openSession(true)) {
|
|
|
+ BaiduClueLeadMapper mapper = session.getMapper(BaiduClueLeadMapper.class);
|
|
|
+ mapper.insertOrUpdate(
|
|
|
+ record.getClueId(), record.getAppsid(), record.getTuId(), record.getPostTime(),
|
|
|
+ record.getQueryWords(), record.getTradeLevel1(), record.getTradeLevel2(), record.getTradeType(),
|
|
|
+ record.getTradeInfo(), record.getFormDetail(), record.getConsultStr(), record.getMediaInfo(),
|
|
|
+ record.getPid(), record.getCid(), record.getInfoLinker(), record.getInfoPhone(), record.getIp(), record.getUserAgent(),
|
|
|
+ record.getPrefetchBizCode(), record.getPrefetchCode(), record.getPrefetchMsg(),
|
|
|
+ record.getSubmitCode(), record.getSubmitMsg(), record.getDisclosureStatus(), record.getDisclosureTime(),
|
|
|
+ toTs(record.getLastSubmitAt()), toTs(record.getLastPrefetchAt()), toTs(record.getLastDisclosureAt()),
|
|
|
+ toTs(record.getCreatedAt()), toTs(record.getUpdatedAt())
|
|
|
+ );
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public void saveApiLog(BaiduClueApiLogRecord record) {
|
|
|
+ if (record.getCreatedAt() == null) record.setCreatedAt(Instant.now());
|
|
|
+ try (SqlSession session = sqlSessionFactory.openSession(true)) {
|
|
|
+ BaiduClueApiLogMapper mapper = session.getMapper(BaiduClueApiLogMapper.class);
|
|
|
+ mapper.insert(
|
|
|
+ record.getApiType(), record.getClueId(), record.getAppsid(), record.getRequestUrl(),
|
|
|
+ record.getRequestTimestamp(), record.getAccessType(), record.getEncryptedData(), record.getSignature(),
|
|
|
+ record.getRequestBody(), record.getHttpStatus(), record.getResponseBody(), record.getResponseCode(),
|
|
|
+ record.getResponseMsg(), record.getBizCode(), record.isSuccess() ? 1 : 0,
|
|
|
+ record.getErrorMessage(), toTs(record.getCreatedAt())
|
|
|
+ );
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public void saveDisclosureDetail(BaiduClueDisclosureDetailRecord record) {
|
|
|
+ if (record.getCreatedAt() == null) record.setCreatedAt(Instant.now());
|
|
|
+ try (SqlSession session = sqlSessionFactory.openSession(true)) {
|
|
|
+ BaiduClueDisclosureDetailMapper mapper = session.getMapper(BaiduClueDisclosureDetailMapper.class);
|
|
|
+ mapper.insert(
|
|
|
+ record.getQueryBeginTime(), record.getQueryEndTime(), record.getClueTime(),
|
|
|
+ record.getClueId(), record.getStatus(), record.getRawMessage(), toTs(record.getCreatedAt())
|
|
|
+ );
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private static Timestamp toTs(Instant instant) {
|
|
|
+ return instant == null ? null : Timestamp.from(instant);
|
|
|
+ }
|
|
|
+}
|