package com.hcicloud.sap.service.inspection.impl;
import com.alibaba.fastjson.JSONObject;
import com.csvreader.CsvReader;
import com.hcicloud.sap.common.web.ResultMessage;
import com.hcicloud.sap.service.inspection.TextUploadService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.nio.charset.Charset;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.*;
@Service
@Transactional
@PropertySource(value = {"classpath:application.properties"})
public class TextUploadServiceImpl implements TextUploadService {
//初始化日志对象
Logger logger = LoggerFactory.getLogger(TextUploadServiceImpl.class);
/**
* 文本编码格式
*/
@Value("${UPLOAD_TEXT_CHARSET:GBK}")
private String encoding;
/**
* 是否为一通对话标识
*/
@Value("${UPLOAD_TEXT_ID:connectId}")
private String pConnectId;
/**
* 注入jmsTemplate用来发送消息
*/
@Autowired
private JmsTemplate jmsTemplate;
@Value("${activemq.provider.sign}")
private String sign;
/**
* 通过文本路径解析文本
* @param path
* @param type
* @return
*/
public ResultMessage inspectText(String path,String type) {
//校验文件路径
if(path == null || path.equals("")) {
logger.error("待质检文件路径不存在");
return new ResultMessage(false,"待质检文件路径不存在");
}
//校验文本是否存在
File file = new File(path);
if(!file.exists()) {
logger.error("待质检文件不存在");
return new ResultMessage(false,"待质检文件不存在");
}
//校验文本类型
if(!TextUploadService.allowableFormat.contains(type)) {
logger.error("待质检文件格式不正确");
return new ResultMessage(false,"待质检文件格式不正确");
}
//根据文本类型进行不同形式的质检
ResultMessage resultMessage = null;
switch (type) {
case TXT :
resultMessage = inspectTxt(path);
case WORD :
resultMessage = inspectWord(path);
case CSV :
resultMessage = inspectCsv(path);
}
return resultMessage;
}
/**
* 质检csv格式的文本
* @param path
* @return
*/
public ResultMessage inspectCsv(String path) {
ResultMessage resultMessage = new ResultMessage(false,"发送解析文本发生异常");
//初始化通话标识
String connectId = "";
//初始化文件流
CsvReader csvReader = null;
try {
//获取读取Csv的对象
csvReader = new CsvReader(path,',',Charset.forName(encoding));
//csvReader = new CsvReader(path,',',Charset.forName("GBK"));
//获取表头
String[] headers = null;
//读取表头
csvReader.readHeaders();
//第一行有可能只是一个名字 [文字客服历史明细报表, , , , , , , , , , , , , , , , , , , , , , ]
if(!"".equals(csvReader.getHeaders()[1])) {
headers = csvReader.getHeaders();
} else {
//获取下一行
csvReader.readRecord();
headers = csvReader.getValues();
}
//初始化一个对话dialog 里面存储JsonObject格式 对话内容
List<JSONObject> dialog = new LinkedList<>();
//初始化 集合元素
String[] sentence = null;
//获取csv表格中内容 获取对话 进行格式转换
while(csvReader.readRecord()) {
//是否是同一次对话 当前一个标识和后一个标识不一样 并且标识不为空字符串
if(!connectId.equals(csvReader.get(headers.length-1)) && !connectId.equals("")) {
//此时获取csv中的数据属于下一次对话
String result = transferCsvToJson(dialog);
//发送消息
jmsTemplate.send(new MessageCreator() {
public Message createMessage(Session session) throws JMSException {
//直接传递文本格式的字符串
TextMessage message = session.createTextMessage(result);
//设置消息类型标志
message.setStringProperty("type", sign);
//返回消息对象
return message;
}
});
//handleMessageFromVoiceTransferSystem.handleMessage(message);
//处理结束 将集合清空
dialog.clear();
}
//获取当前行中对话的信息
sentence = csvReader.getValues();
//声明局部封装对象
JSONObject dialogItem = new JSONObject();
//遍历封装
for(int i = 0; i < headers.length; i++) {
dialogItem.put(headers[i],sentence[i]);
}
//添加到结果集中
dialog.add(dialogItem);
connectId = csvReader.get(headers.length-1);
}
//当读取结束后判断是否还含有对话
if(dialog.size() > 0) {
//此时获取csv中的数据属于下一次对话
String result = transferCsvToJson(dialog);
//发送消息
jmsTemplate.send(new MessageCreator() {
public Message createMessage(Session session) throws JMSException {
//直接传递文本格式的字符串
TextMessage message = session.createTextMessage(result);
//设置消息类型标志
message.setStringProperty("type", sign);
//返回消息对象
return message;
}
});
//handleMessageFromVoiceTransferSystem.handleMessage(message);
//处理结束 将集合清空
dialog.clear();
}
resultMessage.setMessage("发送解析文本成功");
resultMessage.setSuccess(true);
} catch (Exception e) {
e.printStackTrace();
logger.error("解析csv格式的文本过程中发生异常");
} finally {
//关流
csvReader.close();
}
return resultMessage;
}
/**
* 质检txt格式的文本
* @param path
* @return
*/
public ResultMessage inspectTxt(String path) {
return null;
}
/**
* 质检word格式的文本
* @param path
* @return
*/
public ResultMessage inspectWord(String path) {
return null;
}
/**
* 将 dialog 集合 转换成 json格式 文本进行质检操作
* @param dialog
* @return
*/
public String transferCsvToJson(List<JSONObject> dialog) throws Exception {
//声明结果
JSONObject result = new JSONObject();
//生成uuid
String uuid = UUID.randomUUID().toString().replace("-","");
//获取随录数据
JSONObject sourceData = dialog.get(0);
//拼接 relateData UUID sourceRelateData
JSONObject relateData = new JSONObject();
relateData.put("sourceId",sourceData.getString("connectId").replace("\t",""));
relateData.put("vtsId","VTS_SERVER_BEIJING");
relateData.put("audioFormat","text");
relateData.put("uuid",uuid);
relateData.put("fileUri","");
relateData.put("sourceFrom","uploadCsv");
relateData.put("customerAge","0");
relateData.put("audioPlayPath","");
//录音所占字节
relateData.put("billableseconds","0");
relateData.put("audioChannel","");
//拼接时间
String source = sourceData.getString("会话发起时间").equals("")?"2028/01/01 0:00:00":sourceData.getString("会话发起时间");
String target = transDateFormat("yyyy/MM/dd H:mm",source,"yyyy-MM-dd HH:mm:ss");
relateData.put("callTime",target);
//sourceRelateData
JSONObject sourceRelaData = new JSONObject();
sourceRelaData.put("sourceId",sourceData.getString("connectId").replace("\t",""));
sourceRelaData.put("worksheetagentid",sourceData.getString("服务人员工号").replace("\t",""));
sourceRelaData.put("worksheetNum",sourceData.getString("connectId").replace("\t",""));
sourceRelaData.put("createtime",target);
sourceRelaData.put("agentid",sourceData.getString("服务人员SAP号").replace("\t",""));
sourceRelaData.put("extensionno",sourceData.getString("客户手机号码").replace("\t",""));
sourceRelaData.put("audiochannel","0");
sourceRelaData.put("billableseconds","0");
sourceRelaData.put("source","uploadText");
sourceRelaData.put("worksheetstatus","FINISH");
sourceRelaData.put("voiceType","");
sourceRelaData.put("audioformat","");
sourceRelaData.put("calltime",target);
sourceRelaData.put("businesstype","uploadText");
sourceRelaData.put("worksheetaccepttime",target);
sourceRelaData.put("voicepath","");
sourceRelaData.put("customerid",sourceData.getString("客户号").replace("\t",""));
sourceRelaData.put("customerphoneno",sourceData.getString("客户手机号码").replace("\t",""));
sourceRelaData.put("calltype","uploadText");
sourceRelaData.put("endTime",sourceData.getString("挂机时间"));
sourceRelaData.put("callSender",sourceData.getString("会话发送方").replace("\t",""));
sourceRelaData.put("customerName",sourceData.getString("客户姓名").replace("\t",""));
sourceRelaData.put("ringOffWay",sourceData.getString("挂断方式").replace("\t",""));
sourceRelaData.put("ringOffOption",sourceData.getString("挂断方").replace("\t",""));
sourceRelaData.put("evaluateId",sourceData.getString("转评价标识").replace("\t",""));
sourceRelaData.put("customerIDNumber",sourceData.getString("客户身份证号").replace("\t",""));
sourceRelaData.put("customerDegree",sourceData.getString("客户等级").replace("\t",""));
sourceRelaData.put("userId",sourceData.getString("用户ID").replace("\t",""));
//开始拼接xml
//获取document工厂对象
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//创建DocumentBuilder
DocumentBuilder builder = factory.newDocumentBuilder();
//创建builder对象
Document document = builder.newDocument();
//创建根节点
Element root = document.createElement("result");
//创建duration节点
Element duration = document.createElement("duration");
//设置duration content值 毫秒值
duration.setTextContent(String.valueOf(Long.parseLong(sourceData.getString("通话时长").replace("\t",""))*1000));
//创建silence_list
Element silence_list = document.createElement("silence_list");
//创建第二个silence_list
Element sentence_list = document.createElement("sentence_list");
//初始化 total_time
long total_time = 0l;
int i = 0;
//遍历dialog 封装sentence_list
Iterator<JSONObject> iterator = dialog.iterator();
while(iterator.hasNext()) {
//获取对话对象
JSONObject dialogItem = iterator.next();
//创建silence对象
Element silence = document.createElement("silence");
//创建sentence对象
Element sentence = document.createElement("sentence");
//创建text对象
Element text = document.createElement("text");
//创建word_list对象
Element word_list = document.createElement("word_list");
//创建word对象
Element word = document.createElement("word");
//设置通用时间属性
silence.setAttribute("start",String.valueOf(total_time));
sentence.setAttribute("start",String.valueOf(total_time));
word.setAttribute("start",String.valueOf(total_time));
total_time += Long.parseLong(dialogItem.getString("会话处理时长").replace("\t",""))*1000;
silence.setAttribute("end",String.valueOf(total_time));
sentence.setAttribute("end",String.valueOf(total_time));
word.setAttribute("end",String.valueOf(total_time));
//给silence_list赋值
silence_list.appendChild(silence);
//设置sentence对象特有属性
sentence.setAttribute("index",String.valueOf(i++));
sentence.setAttribute("role",dialogItem.getString("会话发送方").equals("\t座席")?"AGENT":"USER");
//设置word 与 text content 值
text.setTextContent(dialogItem.getString("会话内容").replace("\t",""));
word.setTextContent(dialogItem.getString("会话内容").replace("\t",""));
//给sentence_list赋值
word_list.appendChild(word);
sentence.appendChild(text);
sentence.appendChild(word_list);
sentence_list.appendChild(sentence);
}
//设置total_time属性
silence_list.setAttribute("total_time",String.valueOf(total_time));
root.appendChild(duration);
root.appendChild(silence_list);
root.appendChild(sentence_list);
document.appendChild(root);
//将xml写入输出流中
TransformerFactory tff = TransformerFactory.newInstance();
Transformer tf = tff.newTransformer();
//声明内存输出流 解决中文乱码问题
ByteArrayOutputStream bos = new ByteArrayOutputStream();
tf.transform(new DOMSource(document), new StreamResult(bos));
//通过bytes数组设置编码
byte[] bytes = bos.toByteArray();
String xmlData = new String(bytes,"UTF-8");
//封装结果
result.put("relateData",relateData);
result.put("UUID",uuid);
result.put("sourceRelaData",sourceRelaData.toString());
result.put("xmlData",xmlData);
return result.toString();
}
/**
* 将指定格式的时间 转换为 目标格式的录音
* @param sourceFormat
* @param source
* @param target
* @return
*/
public String transDateFormat(String sourceFormat, String source,String target) {
try {
DateFormat df = new SimpleDateFormat(sourceFormat);
Date date = df.parse(source);
df = new SimpleDateFormat(target);
return df.format(date);
} catch (Exception e) {
e.printStackTrace();
logger.error("转换时间格式发生异常");
}
return "";
}
/**
* 将指定格式时间转换为毫秒值
* @param sourceFormat
* @param source
* @return
*/
public Long transDateToMillisecond(String sourceFormat, String source) {
try {
DateFormat df = new SimpleDateFormat(sourceFormat);
Date date = df.parse(source);
return date.getTime();
} catch (Exception e) {
e.printStackTrace();
logger.error("转换时间为毫秒值时发生异常");
}
return 0l;
}
}
csv转xml
最新推荐文章于 2024-05-06 07:25:20 发布