suntianwu %!s(int64=4) %!d(string=hai) anos
pai
achega
7434c6c637

+ 18 - 10
src/main/java/com/care/bigscreen/entity/StStation.java

@@ -111,43 +111,51 @@ public class StStation implements Serializable {
     @TableField("outdoor_offline_amount")
     private Long outdoorOfflineAmount;
 
-    @ApiModelProperty(value = "实时_跌倒人数")
+    @ApiModelProperty(value = "实时安全事件数")
+    @TableField("rt_event_amount")
+    private Long rtEventAmount;
+
+    @ApiModelProperty(value = "实时_跌倒事件数")
     @TableField("rt_fall_amount")
     private Long rtFallAmount;
 
-    @ApiModelProperty(value = "实时_久滞人数")
+    @ApiModelProperty(value = "实时_久滞事件数")
     @TableField("rt_stagnation_amount")
     private Long rtStagnationAmount;
 
-    @ApiModelProperty(value = "实时_坠床数")
+    @ApiModelProperty(value = "实时_坠床事件数")
     @TableField("rt_falling_bed_amount")
     private Long rtFallingBedAmount;
 
-    @ApiModelProperty(value = "实时_主动呼叫数")
+    @ApiModelProperty(value = "实时_主动呼叫事件数")
     @TableField("rt_active_call_amount")
     private Long rtActiveCallAmount;
 
-    @ApiModelProperty(value = "实时_户外呼叫数")
+    @ApiModelProperty(value = "实时_户外呼叫事件数")
     @TableField("rt_outdoors_call_amount")
     private Long rtOutdoorsCallAmount;
 
-    @ApiModelProperty(value = "历史_跌倒人数")
+    @ApiModelProperty(value = "历史安全事件数")
+    @TableField("his_event_amount")
+    private Long hisEventAmount;
+
+    @ApiModelProperty(value = "历史_跌倒事件数")
     @TableField("his_fall_amount")
     private Long hisFallAmount;
 
-    @ApiModelProperty(value = "历史_久滞人数")
+    @ApiModelProperty(value = "历史_久滞事件数")
     @TableField("his_stagnation_amount")
     private Long hisStagnationAmount;
 
-    @ApiModelProperty(value = "历史_坠床数")
+    @ApiModelProperty(value = "历史_坠床事件数")
     @TableField("his_falling_bed_amount")
     private Long hisFallingBedAmount;
 
-    @ApiModelProperty(value = "历史_主动呼叫数")
+    @ApiModelProperty(value = "历史_主动呼叫事件数")
     @TableField("his_active_call_amount")
     private Long hisActiveCallAmount;
 
-    @ApiModelProperty(value = "历史_户外呼叫数")
+    @ApiModelProperty(value = "历史_户外呼叫事件数")
     @TableField("his_outdoors_call_amount")
     private Long hisOutdoorsCallAmount;
 

+ 16 - 10
src/main/java/com/care/bigscreen/vo/BigScreenStatisticsVO.java

@@ -96,34 +96,40 @@ public class BigScreenStatisticsVO {
     @ApiModelProperty(value = "户外离线总数")
     private Long outdoorOfflineAmount;
 
-    @ApiModelProperty(value = "实时_跌倒人数")
+    @ApiModelProperty(value = "实时安全事件数")
+    private Long rtEventAmount;
+
+    @ApiModelProperty(value = "实时_跌倒事件数")
     private Long rtFallAmount;
 
-    @ApiModelProperty(value = "实时_久滞人数")
+    @ApiModelProperty(value = "实时_久滞事件数")
     private Long rtStagnationAmount;
 
-    @ApiModelProperty(value = "实时_坠床数")
+    @ApiModelProperty(value = "实时_坠床事件数")
     private Long rtFallingBedAmount;
 
-    @ApiModelProperty(value = "实时_主动呼叫数")
+    @ApiModelProperty(value = "实时_主动呼叫事件数")
     private Long rtActiveCallAmount;
 
-    @ApiModelProperty(value = "实时_户外呼叫数")
+    @ApiModelProperty(value = "实时_户外呼叫事件数")
     private Long rtOutdoorsCallAmount;
 
-    @ApiModelProperty(value = "历史_跌倒人数")
+    @ApiModelProperty(value = "历史安全事件数")
+    private Long hisEventAmount;
+
+    @ApiModelProperty(value = "历史_跌倒事件数")
     private Long hisFallAmount;
 
-    @ApiModelProperty(value = "历史_久滞人数")
+    @ApiModelProperty(value = "历史_久滞事件数")
     private Long hisStagnationAmount;
 
-    @ApiModelProperty(value = "历史_坠床数")
+    @ApiModelProperty(value = "历史_坠床事件数")
     private Long hisFallingBedAmount;
 
-    @ApiModelProperty(value = "历史_主动呼叫数")
+    @ApiModelProperty(value = "历史_主动呼叫事件数")
     private Long hisActiveCallAmount;
 
-    @ApiModelProperty(value = "历史_户外呼叫数")
+    @ApiModelProperty(value = "历史_户外呼叫事件数")
     private Long hisOutdoorsCallAmount;
 
     @ApiModelProperty(value = "坐席总人数")

+ 44 - 0
src/main/java/com/care/call/controller/KoalaOutCallLogRecordController.java

@@ -0,0 +1,44 @@
+package com.care.call.controller;
+
+
+import com.care.call.entity.KoalaLoggerEntity;
+import com.care.call.service.KoalaOutCallLogRecordService;
+import com.care.util.JsonUtil;
+import com.care.util.Result;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author stw
+ * @version 2.7.0 创建于 2019/7/15
+ **/
+@Api(value = "外呼操作-->考拉外呼日志记录", description = "外呼操作-->考拉外呼日志记录")
+@RestController
+@RequestMapping("/mcdcc/outcall/")
+public class KoalaOutCallLogRecordController {
+    private static final Logger logger = LogManager.getLogger(KoalaOutCallLogRecordController.class);
+
+    @Autowired
+    private KoalaOutCallLogRecordService koalaOutCallLogRecordService;
+
+    @ApiOperation(value = "记录呼叫中心日志API", notes = "记录呼叫中心日志")
+    @PostMapping(value = "/koala/addOptLog", produces = "application/json;charset=UTF-8", consumes = "application/json;charset=UTF-8")
+    public Result addOptLog(@RequestBody KoalaLoggerEntity koalaLoggerEntity) {
+        try {
+            if (logger.isDebugEnabled()) {
+                logger.debug(JsonUtil.toJson(koalaLoggerEntity));
+            }
+            koalaOutCallLogRecordService.addOptLog(koalaLoggerEntity);
+        } catch (Exception e) {
+            logger.error("记录日志接口异常,异常信息:" + e.getMessage());
+        }
+        return Result.success();
+    }
+}

+ 168 - 0
src/main/java/com/care/call/entity/KoalaLogDomain.java

@@ -0,0 +1,168 @@
+package com.care.call.entity;
+
+import lombok.Data;
+
+/**
+ * @author stw
+ * @version 2.7.0 创建于 2019/7/15
+ **/
+public class KoalaLogDomain extends KoalaLoggerEntity {
+    private String id;
+    private String entId;
+    private String entNo;
+    private String tenantId;
+    private String agentId;
+    private String agentNumber;
+    private String sessionId;
+
+    private String calledNumber;
+    private String calledOriginalNumber;
+    private String receiveTime;
+    private String eventStatus;
+    private String computeTraffic;
+
+    private String taskId;
+    private String disNumber;
+    private String md5FlowNo;
+
+    private String createTime;
+    private String updateTime;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getEntId() {
+        return entId;
+    }
+
+    public void setEntId(String entId) {
+        this.entId = entId;
+    }
+
+    public String getAgentId() {
+        return agentId;
+    }
+
+    public void setAgentId(String agentId) {
+        this.agentId = agentId;
+    }
+
+    public String getAgentNumber() {
+        return agentNumber;
+    }
+
+    public void setAgentNumber(String agentNumber) {
+        this.agentNumber = agentNumber;
+    }
+
+    public String getTenantId() {
+        return tenantId;
+    }
+
+    public void setTenantId(String tenantId) {
+        this.tenantId = tenantId;
+    }
+
+    public String getSessionId() {
+        return sessionId;
+    }
+
+    public void setSessionId(String sessionId) {
+        this.sessionId = sessionId;
+    }
+
+    public String getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(String createTime) {
+        this.createTime = createTime;
+    }
+
+    public String getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(String updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    public String getCalledNumber() {
+        return calledNumber;
+    }
+
+    public void setCalledNumber(String calledNumber) {
+        this.calledNumber = calledNumber;
+    }
+
+    public String getCalledOriginalNumber() {
+        return calledOriginalNumber;
+    }
+
+    public void setCalledOriginalNumber(String calledOriginalNumber) {
+        this.calledOriginalNumber = calledOriginalNumber;
+    }
+
+    public String getReceiveTime() {
+        return receiveTime;
+    }
+
+    public void setReceiveTime(String receiveTime) {
+        this.receiveTime = receiveTime;
+    }
+
+    public String getEventStatus() {
+        return eventStatus;
+    }
+
+    public void setEventStatus(String eventStatus) {
+        this.eventStatus = eventStatus;
+    }
+
+    public String getComputeTraffic() {
+        return computeTraffic;
+    }
+
+    public void setComputeTraffic(String computeTraffic) {
+        this.computeTraffic = computeTraffic;
+    }
+
+    public String getTaskId() {
+        return taskId;
+    }
+
+    public void setTaskId(String taskId) {
+        this.taskId = taskId;
+    }
+
+    public String getDisNumber() {
+        return disNumber;
+    }
+
+    public void setDisNumber(String disNumber) {
+        this.disNumber = disNumber;
+    }
+
+    public String getMd5FlowNo() {
+        return md5FlowNo;
+    }
+
+    public void setMd5FlowNo(String md5FlowNo) {
+        this.md5FlowNo = md5FlowNo;
+    }
+
+    @Override
+    public String getEntNo() {
+        return entNo;
+    }
+
+    @Override
+    public void setEntNo(String entNo) {
+        this.entNo = entNo;
+    }
+}

+ 98 - 0
src/main/java/com/care/call/entity/KoalaLoggerEntity.java

@@ -0,0 +1,98 @@
+package com.care.call.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * @author stw
+ * @version 2.7.0 创建于 2019/7/15
+ **/
+@ApiModel(description = "日志实体类")
+public class KoalaLoggerEntity implements Serializable {
+    @ApiModelProperty(dataType = "String", name = "apiMethod", value = "接口方法,直接写接口名称")
+    private String apiMethod;
+    @ApiModelProperty(dataType = "String", name = "apiEvent", value = "事件状态,1.坐席振铃,2.坐席接通,3.客户振铃,4.客户接通,5.坐席挂断,6.客户挂断,7.未接通")
+    private String apiEventStatus;
+    @ApiModelProperty(dataType = "String", name = "agentId", value = "坐席id")
+    private String agentId;
+    @ApiModelProperty(dataType = "String", name = "taskId", value = "任务id")
+    private String taskId;
+    @ApiModelProperty(dataType = "String", name = "outCallNumber", value = "外呼流水号")
+    private String outCallNumber;
+    @ApiModelProperty(dataType = "String", name = "disNumber", value = "外显号码")
+    private String disNumber;
+    @ApiModelProperty(dataType = "String", name = "entId", value = "企业编码")
+    private String entNo;
+    @ApiModelProperty(dataType = "String", name = "result", value = "接口请求返回结果")
+    private String result;
+
+    public String getApiMethod() {
+        return apiMethod;
+    }
+
+    public void setApiMethod(String apiMethod) {
+        this.apiMethod = apiMethod;
+    }
+
+    public String getApiEventStatus() {
+        return apiEventStatus;
+    }
+
+    public void setApiEventStatus(String apiEventStatus) {
+        this.apiEventStatus = apiEventStatus;
+    }
+
+    public String getResult() {
+        return result;
+    }
+
+    public void setResult(String result) {
+        this.result = result;
+    }
+
+    public String getAgentId() {
+        return agentId;
+    }
+
+    public void setAgentId(String agentId) {
+        this.agentId = agentId;
+    }
+
+    public String getTaskId() {
+        return taskId;
+    }
+
+    public void setTaskId(String taskId) {
+        this.taskId = taskId;
+    }
+
+    public String getOutCallNumber() {
+        return outCallNumber;
+    }
+
+    public void setOutCallNumber(String outCallNumber) {
+        this.outCallNumber = outCallNumber;
+    }
+
+    public String getDisNumber() {
+        return disNumber;
+    }
+
+    public void setDisNumber(String disNumber) {
+        this.disNumber = disNumber;
+    }
+
+    public String getEntNo() {
+        return entNo;
+    }
+
+    public void setEntNo(String entNo) {
+        this.entNo = entNo;
+    }
+}

+ 20 - 0
src/main/java/com/care/call/mapper/KoalaOutCallLogRecordDao.java

@@ -0,0 +1,20 @@
+package com.care.call.mapper;
+
+
+import com.care.call.entity.KoalaLogDomain;
+import org.springframework.stereotype.Repository;
+
+/**
+ * @author stw
+ * @version 2.7.0 创建于 2019/7/15
+ **/
+@Repository
+public interface KoalaOutCallLogRecordDao {
+
+    /**
+     * 记录考拉外呼日志
+     * @param kaoLaLogDomain
+     */
+    void addOptLog(KoalaLogDomain kaoLaLogDomain);
+
+}

+ 13 - 0
src/main/java/com/care/call/service/KoalaOutCallLogRecordService.java

@@ -0,0 +1,13 @@
+package com.care.call.service;
+
+
+import com.care.call.entity.KoalaLoggerEntity;
+
+/**
+ * @author stw
+ * @version 2.7.0 创建于 2019/7/15
+ **/
+public interface KoalaOutCallLogRecordService {
+
+    void addOptLog(KoalaLoggerEntity koalaLoggerEntity) throws Exception;
+}

+ 106 - 0
src/main/java/com/care/call/service/impl/KoalaOutCallLogRecordServiceImpl.java

@@ -0,0 +1,106 @@
+package com.care.call.service.impl;
+
+
+import com.care.call.entity.KoalaLogDomain;
+import com.care.call.entity.KoalaLoggerEntity;
+import com.care.call.mapper.KoalaOutCallLogRecordDao;
+import com.care.call.service.KoalaOutCallLogRecordService;
+import com.care.util.DateUtils;
+import com.care.util.JsonUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Map;
+
+/**
+ * @author stw
+ * @version 2.7.0 创建于 2019/7/15
+ **/
+@Service
+public class KoalaOutCallLogRecordServiceImpl implements KoalaOutCallLogRecordService {
+
+    @Autowired
+    private KoalaOutCallLogRecordDao koalaOutCallLogRecordDao;
+
+    @Override
+    public void addOptLog(KoalaLoggerEntity koalaLoggerEntity) throws Exception {
+        koalaOutCallLogRecordDao.addOptLog(makeLog(koalaLoggerEntity));
+    }
+
+    private static Map<String, Object> parseJson(String json) throws Exception {
+        return JsonUtil.fromJson(json, Map.class);
+    }
+
+    private KoalaLogDomain makeLog(KoalaLoggerEntity koalaLoggerEntity) throws Exception {
+        //前端调用接口即触发日志记录事件
+        KoalaLogDomain domain = new KoalaLogDomain();
+        domain.setResult(koalaLoggerEntity.getResult());
+        domain.setApiMethod(koalaLoggerEntity.getApiMethod());
+        domain.setComputeTraffic("0");//话单未被计算
+
+        domain.setAgentId(koalaLoggerEntity.getAgentId());
+        domain.setEntNo(koalaLoggerEntity.getEntNo());
+        domain.setTaskId(koalaLoggerEntity.getTaskId());
+        domain.setDisNumber(koalaLoggerEntity.getDisNumber());
+
+        //解析请求结果,获取sessionId和坐席分机号等
+        Map<String, Object> map = parseJson(koalaLoggerEntity.getResult());
+        Object sessionId = map.get("callID");
+        Object agentNumber = map.get("thisDN");
+        Object receiveTime = map.get("creationTime");
+        Object tenantId = map.get("tenantID");
+        Object messageId = map.get("messageId");
+        Object callState = map.get("callState");//0:被叫挂断,1:主叫挂断
+        Object calledNumber = map.get("otherDN");//被叫号码
+        if(sessionId != null){
+            domain.setSessionId(sessionId.toString());
+        }
+        if(agentNumber != null){
+            domain.setAgentNumber(agentNumber.toString());
+        }
+        if(receiveTime != null){
+            domain.setReceiveTime(DateUtils.formatMillisecondTime(receiveTime.toString()));
+        }
+        if(tenantId != null){
+            domain.setTenantId(tenantId.toString());
+        }
+        if(messageId != null){
+            //根据考拉外呼messageId确定事件状态
+            //1.坐席振铃,2.坐席接通,3.客户振铃,4.客户接通,5.坐席挂断,6.客户挂断,7.未接通'
+            //callState为空,默认认为是被叫挂断(用于挂断状态处理)
+            domain.setEventStatus(formatOutCallEvent(messageId.toString(), (callState != null) ? callState.toString() : "1"));
+        }
+        if(calledNumber != null){
+            domain.setCalledNumber(calledNumber.toString());
+        }
+        return domain;
+    }
+
+    /**
+     * 根据考拉外呼messageId确定事件状态
+     * @param messageId
+     * @return
+     */
+    private String formatOutCallEvent(String messageId, String callState){
+        //1.坐席振铃,2.坐席接通,3.客户振铃,4.客户接通,5.坐席挂断,6.客户挂断,7.未接通'
+        String eventStatus = "";
+        switch (messageId){
+            case "505":
+                eventStatus = "1";
+                break;
+            case "506":
+                eventStatus = "4";
+                break;
+            case "515":
+                eventStatus = "6";
+                if("1".equals(callState)){
+                    eventStatus = "5";
+                }
+                break;
+            default:
+                eventStatus = "7";
+                break;
+        }
+        return eventStatus;
+    }
+}

+ 16 - 0
src/main/java/com/care/util/DateUtils.java

@@ -10,6 +10,12 @@ import java.util.Date;
  * @author make Java
  */
 public class DateUtils {
+    private static final SimpleDateFormat yyyyMMddHHmmss = new SimpleDateFormat("yyyyMMddHHmmss");
+    private static final SimpleDateFormat yyyyMMdd = new SimpleDateFormat("yyyyMMdd");
+    private static final SimpleDateFormat yyyyMM = new SimpleDateFormat("yyyyMM");
+    private static final SimpleDateFormat yyyy_MM_dd_HH_mm_ss = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+    private static final SimpleDateFormat yyyy_MM_dd = new SimpleDateFormat("yyyy-MM-dd");
+
     /**
      * 一天毫秒数
      */
@@ -119,4 +125,14 @@ public class DateUtils {
         }
         return true;
     }
+    /**
+     * 根据毫秒数获取时间字符串
+     * yyyy-MM-dd HH:mm:ss
+     * @param millisecondTime
+     * @return
+     */
+    public static String formatMillisecondTime(String millisecondTime){
+        String time = String.valueOf(Long.valueOf(millisecondTime));
+        return yyyy_MM_dd_HH_mm_ss.format(new Date(Long.valueOf(time)));
+    }
 }

+ 19 - 0
src/main/java/com/care/util/JsonUtil.java

@@ -0,0 +1,19 @@
+package com.care.util;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+/**
+ * @author 许明
+ * @version 1.0.0 创建于 2019/8/6
+ **/
+public final class JsonUtil {
+    private JsonUtil(){}
+    private static ObjectMapper objectMapper = new ObjectMapper();
+
+    public static String toJson(Object obj) throws Exception {
+        return objectMapper.writeValueAsString(obj);
+    }
+    public static <T> T fromJson(String jsonStr,Class<T> clazz) throws Exception {
+        return objectMapper.readValue(jsonStr,clazz);
+    }
+}

+ 2 - 0
src/main/resources/mybatis/StStationMapper.xml

@@ -31,11 +31,13 @@
         convert(sum(outdoor_online_amount)/(sum(outdoor_online_amount) + sum(outdoor_offline_amount)),decimal(20,2)) outdoorOnlineRate,
         sum(outdoor_online_amount) outdoorOnlineAmount,
         sum(outdoor_offline_amount) outdoorOfflineAmount,
+        sum(rt_event_amount) rtEventAmount,
         sum(rt_fall_amount) rtFallAmount,
         sum(rt_stagnation_amount) rtStagnationAmount,
         sum(rt_falling_bed_amount) rtFallingBedAmount,
         sum(rt_active_call_amount) rtActiveCallAmount,
         sum(rt_outdoors_call_amount) rtOutdoorsCallAmount,
+        sum(his_event_amount) hisEventAmount,
         sum(his_fall_amount) hisFallAmount,
         sum(his_stagnation_amount) hisStagnationAmount,
         sum(his_falling_bed_amount) hisFallingBedAmount,