需求:将指定格式的文本内容放入text area文本框,点击页面空白处,自动将文本内容处理到对应的表单中。
具体流程:
- 用户将指定格式的文本粘贴到文本框中,点击页面空白处,发起ajax请求,请求带上了该文本到后台。
- 后台接口获取该文本内容,进行处理,处理完成之后返回一个对象到前端
前端将获取到的对象动态赋值到表单中,完成订单自动识别
指定格式的文本 识别项:被识别的内容 回车符
订单编号(识别项):123456789(被识别的内容)
账号(识别项):xxxxxxx(被识别的内容)
密码(识别项):yyyyyy(被识别的内容)
后台处理:
1.生成一个对象(用于返回前端,对象属性对应前端表单name,便于赋值)
2.请求数据库,获取到自动识别设置表里的识别项和识别关键词(对象集合)
3.依次匹配识别项,将该识别项的关键词代入识别方法匹配,如果匹配成功,则返回该匹配到的值,将该值设置到最初生成的序列化对象中。
4.处理完成后将该对象返回前端。
// 订单自动识别方法。
public String orderIdentification(String identificationName, String identificationContent, String[] temp,
OrderBPo orderBPo, String keywordName) {
if (keywordName.equals(identificationName.trim())) {//如果传入的识别项和数据库获取到的识别项相同,往下执行,如果不同,直接返回null
String subTemp = identificationContent;//定义一个临时变量存识别关键词,(现在发现没什么必要。可以略过。。)
String keyWord[] = subTemp.split(",");//(识别关键词是一个字符串,如果有多个识别关键词,以,号隔开)拆分识别关键词
String indentName[];
for (int i = 0; i < temp.length; i++) {//遍历拆分后的文本内容 现在是 识别项:被识别的内容 字符串对象集合
indentName = temp[i].split(":");//拆分 识别项:被识别的内容。 此处是以中文冒号拆分
if (indentName.length == 1) {//如果拆分后的 识别项:被识别的内容 长度为1 则使用英文冒号重新拆分(没办法,用户肯定不知道你中文和英文冒号有啥区别)
indentName = temp[i].split(":");
}
for (int k = 0; k < keyWord.length; k++) {//遍历拆分后的识别关键词集合
if ((indentName[0].trim()).equals(keyWord[k])) {//拆分后的 识别项:被识别的内容为[识别项,被识别的内容]。所以取该集合的第一个关键词作识别,如果匹配上了,进行下一步
if (indentName.length == 1) {//拆分后的 识别项:被识别的内容 数组长度如果为1,那就是没有被识别的内容,此时应该直接返回空字符串
return "";
}
return indentName[1];//如果上面不执行,那就是有被识别的内容,此时就返回该内容
}
}
}
}
return null;
}
public OrderBPo orderAutoIdentification(String content){
AddorderServiceImpl addOrder = new AddorderServiceImpl();//new一个当前类的对象,用于调用上面的订单识别处理方法
OrderBPo orderBPo = new OrderBPo();//生成一个订单对象,用于存储识别到的内容,返回前端
List<OrderAutoIdentificationBPo> lists = addorderService.getOrderAutoIdentificationBPo();//获取到自动识别项和识别项对应的识别关键词的对象集合
String temp[] = content.split("\\n");//前端传入的文本内容为 识别项:被识别的内容 回车键。 所以这边就使用回车键为关键词拆分需要识别的内容
String resultTemp = "";//定义一个临时存储识别返回内容的变量
for (int j = 0; j < lists.size(); j++) {//遍历自动识别项和识别项对应的识别关键词的对象集合
resultTemp = addOrder.orderIdentification(lists.get(j).getIdentificationName(),
lists.get(j).getIdentificationContent(), temp, orderBPo, "来源单号");//传入IdentificationName识别项(和订单对象属性相同),IdentificationContent()识别关键词,以逗号分隔开,调用识别方法
if (null != resultTemp && !"".equals(resultTemp.trim())) {//调用识别方法的返回值如果不为null或者空字符串,说明匹配成功,将返回值设置到对象对应的属性中,
orderBPo.setOriginOrderId(resultTemp);
continue;//此处加一个continue,就不用再往下执行了,可以提升一点效率
}
resultTemp = addOrder.orderIdentification(lists.get(j).getIdentificationName(),
lists.get(j).getIdentificationContent(), temp, orderBPo, "游戏区服");
if (null != resultTemp && !"".equals(resultTemp.trim())) {
orderBPo.setGameServerName(resultTemp);
continue;
}
}
}
return orderBPo;
}
总结:该整套自动识别流程中,有几点需要注意的地方
1.前端传入的文本内容的格式是指定的, 识别项:被识别的内容 回车符
2.调用自动识别方法时,我都使用到了静态识别项,如:"来源单号" ,"游戏区服",
这些识别项字段要和数据库的识别项字段一一对应,如果识别项有偏差,就没法识别该项内容了
该套自动识别流程中,使用到的内容
1.自动识别的文本内容
2.有相应识别项的属性的对象(存入匹配到的值)
3.数据库中保存的识别项和识别关键词(识别项是固定不变的,识别关键词是识别项的别名,
因为很多用户不能完全按照识别项的要求填入数据,所以加识别关键词去满足不同用户的需求)
大家也可以通过自己的需求,修改相应的指定格式,然后在后台处理的时候根据自己指定的格式处理就好了。