cc 3 miesięcy temu
rodzic
commit
32b3853ce7

+ 6 - 3
sql/case_table.sql

@@ -117,7 +117,8 @@ create table call_record
     otherPhoneArea         VARCHAR,
     otherCertNo            VARCHAR,
     remark                 VARCHAR,
-    personLibId            VARCHAR
+    personLibId            VARCHAR,
+    callLocal              VARCHAR
 );
 CREATE INDEX idx_call_record_person_name ON call_record (personName);
 CREATE INDEX idx_call_record_person_phone ON call_record (personPhone);
@@ -152,7 +153,8 @@ create table call_record_all
     otherPhoneArea         VARCHAR,
     otherCertNo            VARCHAR,
     remark                 VARCHAR,
-    personLibId            VARCHAR
+    personLibId            VARCHAR,
+    callLocal              VARCHAR
 );
 
 DROP TABLE IF EXISTS use_open_info_call_record;
@@ -182,7 +184,8 @@ create table use_open_info_call_record
     otherPhoneArea         VARCHAR,
     otherCertNo            VARCHAR,
     remark                 VARCHAR,
-    personLibId            VARCHAR
+    personLibId            VARCHAR,
+    callLocal              VARCHAR
 );
 
 DROP TABLE IF EXISTS account_opening_info;

+ 3 - 0
src/main/java/com/qingjian/common/model/call/entity/CallRecord.java

@@ -169,6 +169,8 @@ public class CallRecord extends Cleaned implements Serializable {
      */
     @TableField(exist = false)
     private String festivalName;
+    @TableField("callLocal")
+    private String callLocal;
 
     public String str() {
         String durationStr = Convert.toStr(duration);
@@ -185,6 +187,7 @@ public class CallRecord extends Cleaned implements Serializable {
                 , personStationLongitude
                 , personStationLatitude
                 , durationStr
+                , callLocal
                 , callType
                 , callDirection
                 , otherName

+ 3 - 0
src/main/java/com/qingjian/common/model/call/entity/CallRecordAll.java

@@ -165,6 +165,8 @@ public class CallRecordAll extends Cleaned implements Serializable {
      */
     @TableField(exist = false)
     private String festivalName;
+    @TableField("callLocal")
+    private String callLocal;
 
     public String str() {
         String durationStr = Convert.toStr(duration);
@@ -181,6 +183,7 @@ public class CallRecordAll extends Cleaned implements Serializable {
                 , personStationLongitude
                 , personStationLatitude
                 , durationStr
+                , callLocal
                 , callType
                 , callDirection
                 , otherName

+ 3 - 0
src/main/java/com/qingjian/common/model/call/entity/UseOpenInfoCallRecord.java

@@ -159,4 +159,7 @@ public class UseOpenInfoCallRecord extends Cleaned implements Serializable {
     @TableField("personLibId")
     private String personLibId;
 
+    @TableField("callLocal")
+    private String callLocal;
+
 }

+ 1 - 0
src/main/java/com/qingjian/module/dm/clean/AbstractCallRecordDataLoader.java

@@ -141,6 +141,7 @@ public abstract class AbstractCallRecordDataLoader<S> extends AbstractDataLoader
             duckDBAppender.append(record.getOtherCertNo());
             duckDBAppender.append(record.getRemark());
             duckDBAppender.append(record.getPersonLibId());
+            duckDBAppender.append(record.getCallLocal());
             duckDBAppender.endRow();
         } catch (SQLException e) {
             log.error("[数据入库]追加通信数据异常", e);

+ 2 - 0
src/main/java/com/qingjian/module/dm/clean/CleanFactory.java

@@ -23,6 +23,7 @@ public class CleanFactory {
         // 注册策略A的创建器:每次调用get()都会new一个新的ConcreteStrategyA
         //cleaner
         DATA_CLEANER_MAP.put(StrategyType.CALL_DATA, CallDataCleaner::new);
+        DATA_CLEANER_MAP.put(StrategyType.CALL_DATA1, CallDataCleaner1::new);
         DATA_CLEANER_MAP.put(StrategyType.TRANS_STD, TransStdDataCleaner::new);
         DATA_CLEANER_MAP.put(StrategyType.TRANS_STD1, TransStdDataCleaner1::new);
         DATA_CLEANER_MAP.put(StrategyType.CALL_OPEN_INFO, CallOpenInfoDataCleaner::new);
@@ -51,6 +52,7 @@ public class CleanFactory {
         DATA_CLEANER_MAP.put(StrategyType.TRANS_DEBIT_CREDIT_2, TransDebitCreditDataCleaner2::new);
         //loader
         DATA_LOADER_MAP.put(StrategyType.CALL_DATA, CallStdDataLoader::new);
+        DATA_LOADER_MAP.put(StrategyType.CALL_DATA1, CallStdDataLoader::new);
         DATA_LOADER_MAP.put(StrategyType.TRANS_STD, TransStdDataLoader::new);
         DATA_LOADER_MAP.put(StrategyType.TRANS_STD1, TransStdDataLoader::new);
         DATA_LOADER_MAP.put(StrategyType.CALL_OPEN_INFO, CallOpenInfoDataLoader::new);

+ 1 - 0
src/main/java/com/qingjian/module/dm/clean/StrategyType.java

@@ -10,6 +10,7 @@ import lombok.Getter;
 public enum StrategyType {
     // 通话数据相关策略
     CALL_DATA(1, "通话数据清洗"),
+    CALL_DATA1(64, "通话数据清洗(日期时间)"),
     CALL_OPEN_INFO(3, "通话开通信息清洗"),
     CALL_IN_OUT(10, "主叫被叫通信数据清洗"),
 

+ 110 - 0
src/main/java/com/qingjian/module/dm/clean/impl/cleaner/CallDataCleaner1.java

@@ -0,0 +1,110 @@
+package com.qingjian.module.dm.clean.impl.cleaner;
+
+import cn.hutool.core.date.DatePattern;
+import cn.hutool.core.date.LocalDateTimeUtil;
+import cn.hutool.core.text.StrPool;
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.ReUtil;
+import cn.hutool.core.util.ReflectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.qingjian.common.cache.GlobalCache;
+import com.qingjian.common.model.call.entity.CallRecord;
+import com.qingjian.common.model.dm.dto.TableRuleDTO;
+import com.qingjian.common.model.dm.entity.CleanErrorLog;
+import com.qingjian.module.dm.clean.AbstractDataCleaner;
+import com.qingjian.module.dm.clean.CleanResult;
+import com.qingjian.module.dm.clean.func.Fun;
+import com.qingjian.module.dm.clean.func.FunProcess;
+import lombok.extern.slf4j.Slf4j;
+
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Map;
+
+@Slf4j
+public class CallDataCleaner1 extends AbstractDataCleaner<CallRecord> {
+
+    @Override
+    public CleanResult<CallRecord> doClean(Map<Integer, String> rowData, Integer lineNo) {
+        CleanResult<CallRecord> cleanResult = new CleanResult<>();
+        CallRecord callRecord = new CallRecord();
+        String callDate = "";
+        String callTime = "";
+        // 遍历表格规则列表
+        for (TableRuleDTO rule : tableRules) {
+            // 获取当前规则对应的文件名索引
+            int fileColIndex = rule.getFileColIndex();
+            // 根据行数据和文件名索引获取对应的内容
+            String content = getContent(rowData, fileColIndex, rule.getColumnRule());
+            content = getRegexContent(rule.getFieldNameEn(), content);
+            // 如果获取的内容为空,则将对应字段名的映射值设为 null 并跳过当前规则
+            if (StrUtil.isEmpty(content) && rule.getRequired() == 1) {
+                String errMsg = StrUtil.format("第{}行,第{}列 [{}] 数据为空", lineNo, fileColIndex, rule.getFileColName());
+                CleanErrorLog cleanErrorLog = buildLog(errMsg);
+                cleanResult.setError(cleanErrorLog);
+                cleanResult.setValid(false);
+                callRecord = null;
+                break;
+            }
+            if (StrUtil.isEmpty(content)) {
+                continue;
+            }
+            content = content.trim();
+            //去除特殊字符/空白字符
+            String copyContent = ReUtil.replaceAll(content, GlobalCache.SPECIAL_CHARS_PATTERN, "");
+            // 创建一个函数处理对象,并设置异常处理逻辑,当处理过程中出现异常时记录日志
+            String finalContent = content;
+            FunProcess funProcess = FunProcess.create().onException((e) -> log.error("清洗函数字段处理异常: {}", finalContent, e));
+            // 遍历选中的规则视图映射
+            List<Fun> funList = defaultDateFunMap.getOrDefault(fileColIndex, List.of());
+            funProcess.addAll(funList);
+            // 根据字段类型进行不同的处理
+            // 根据字段类型进行不同的处理
+            switch (rule.getFieldType()) {
+                case CALL_DIRECTION -> {
+                    String newKey = rule.getTableId() + StrPool.UNDERLINE + copyContent;
+                    copyContent = GlobalCache.DIRECTION_CONF_MAP.getOrDefault(newKey, copyContent);
+                }
+                case PHONE ->
+                    // 如果字段类型是电话,去除内容中的中国区号
+                        copyContent = ReUtil.replaceAll(copyContent, GlobalCache.CHINA_PREFIX_PATTERN, "");
+                default -> // 默认情况,不做处理
+                {
+                }
+            }
+            //判断函数是否可以执行
+            if (funProcess.isExecute()) {
+                // 使用函数处理对象处理内容
+                copyContent = funProcess.process(copyContent);
+            }
+            if (StrUtil.isEmpty(content) && rule.getRequired() == 1) {
+                String errMsg = StrUtil.format("第{}行,第{}列 [{}] 数据清洗后为空,该内容是必填!", lineNo, fileColIndex, rule.getFileColName());
+                if (fileColIndex == -1) {
+                    errMsg = StrUtil.format("第{}行,[{}] 数据为空", lineNo, rule.getFileColName());
+                }
+                CleanErrorLog cleanErrorLog = buildLog(errMsg);
+                cleanResult.setError(cleanErrorLog);
+                cleanResult.setValid(false);
+                callRecord = null;
+                break;
+            }
+            if ("callDate".equals(rule.getFieldNameEn())) {
+                callDate = copyContent;
+            }
+            if ("callTime".equals(rule.getFieldNameEn())) {
+                callTime = copyContent;
+            }
+            ReflectUtil.setFieldValue(callRecord, rule.getFieldNameEn(), copyContent);
+        }
+        if (cleanResult.isValid()) {
+            callRecord.setId(IdUtil.getSnowflakeNextId());
+            callRecord.setFileId(fileId);
+            callRecord.setSheetId(sheetId);
+            String transDateTimeStr = callDate + " " + StrUtil.emptyToDefault(callTime, "00:00:00");
+            LocalDateTime transDateTime = LocalDateTimeUtil.parse(transDateTimeStr.trim(), DatePattern.NORM_DATETIME_FORMATTER);
+            callRecord.setCallDateTime(transDateTime);
+            cleanResult.setData(callRecord);
+        }
+        return cleanResult;
+    }
+}

+ 3 - 1
src/main/resources/mappers/call/CallRecordMapper.xml

@@ -26,6 +26,7 @@
         <result column="otherCertNo" property="otherCertNo"/>
         <result column="remark" property="remark"/>
         <result column="operatorId" property="operatorId"/>
+        <result column="callLocal" property="callLocal"/>
     </resultMap>
 
     <!-- 全字段动态条件查询:所有字段均可作为查询条件,空值自动忽略 -->
@@ -52,7 +53,8 @@
         otherPhoneArea,
         otherCertNo,
         remark,
-        operatorId
+        operatorId,
+        callLocal
         FROM ${query.tableName}
         <where>
             <if test="query.ids != null and query.ids.size>0">