package lastkilometer.parse;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import lastkilometer.readCSV.BasicClass;
import lastkilometer.readCSV.ReadCSVForParse;
public class ParseXMLForPost_two extends BasicClass{
public int number=0;
/**
* 处理第二次配送结果,生成提交格式
*
* @param path 读取的xml文件目录
* @param number 计算快递员id时用
* @param iteration FleetSize.FINITE模式下迭代的次数
* @throws DocumentException
* @throws IOException
* */
public boolean savePostFormat(String pathAndName,int number,int iteration) throws DocumentException, IOException{
ReadCSVForParse read=new ReadCSVForParse();
Map<String, List<Object>> ESO=read.readElectricitySuppliersOrder();
Map<String, List<Object>> OO=read.readO2OOrder();
List<List<Map<String,Map<String,int[]>>>> parseResults=Parse(pathAndName);
if(parseResults!=null){
for(int i=0;i<parseResults.size();i++){
String cahce=(i+number+1)+"";
StringBuffer buffer = new StringBuffer("D0000");
buffer.replace(5-cahce.length(),5, cahce);
String Courier_id=buffer.toString();
//提取出list,既是快递员的配送路径
List<Map<String,Map<String,int[]>>> two=parseResults.get(i);
for(Map<String,Map<String,int[]>> three:two){
for(Entry<String, Map<String,int[]>> entry:three.entrySet()){
String Order_id=entry.getKey();//订单号
List<Object> list=null;
if(ESO.get(Order_id)!=null){
list=ESO.get(Order_id);
}else{
list=OO.get(Order_id);
}
int Num=(int) list.get(2);
Map<String,int[]> four=entry.getValue();
for(Entry<String, int[]> e:four.entrySet()){
String pickupORdeliver=e.getKey();
int[] time=e.getValue();
if("pickup".equals(pickupORdeliver)){
//根据订单号和pickup判断来取网点或商户id、 取/送货量(取为+,送为-)
String Addr=(String) list.get(0);
save("results_cache/", "post_2_"+iteration,Courier_id+","+Addr+","+time[0]+","+time[1]+","+Num+","+Order_id);
}else if("deliver".equals(pickupORdeliver)){
//根据订单号和deliver判断来取配送点、 取/送货量(取为+,送为-)
String Addr=(String) list.get(1);
save("results_cache/", "post_2_"+iteration,Courier_id+","+Addr+","+time[0]+","+time[1]+",-"+Num+","+Order_id);
}
}
}
}
}
}else{
return false;
}
this.number=number+parseResults.size();
return true;
}
/**
* 解析XML文件,并保存结果提交格式
*
* @return Map<int,List<Map<Order_id,Map<pickupORdeliver,int[]>>>
*
* @throws DocumentException
*
* */
List<List<Map<String,Map<String,int[]>>>> Parse(String pathAndName) throws DocumentException{
//List<List<Map<Order_id,Map<pickupORdeliver,int[]>>>> int[]--到达时间和结结束时间
List<List<Map<String,Map<String,int[]>>>> parseResults=new ArrayList<>();
// 创建saxReader对象
SAXReader reader = new SAXReader();
// 通过read方法读取一个文件 转换成Document对象
Document document = reader.read(new File(pathAndName));
// 获取根节点元素对象
Element node = document.getRootElement();
// 获取root-node中的solutions元素节点对象
Element solutions = node.element("solutions");
// 获取solutions中最后一个solution元素节点对象
Element xElement2 = (Element) solutions.elements().get(solutions.elements().size() - 1);
// 获取solution中的routes元素节点对象
Element routes = xElement2.element("routes");
if(routes!=null){
System.out.println("路径的数量:"+routes.elements().size());
// 遍历routes
for (int i = 0; i < routes.elements().size(); i++) {
//List<Map<Order_id,Map<pickupORdeliver,int[]>>> int[]--到达时间和结结束时间
List<Map<String,Map<String,int[]>>> one=new ArrayList<>();//保存special_Order_id的配送路径
// 获取路线route
Element route = (Element) routes.elements().get(i);//vrpBuilder.setFleetSize(FleetSize.FINITE);条件下只有固定的路径数
// 获取当前送货顺序
Iterator<?> eleIt = route.elementIterator();
while (eleIt.hasNext()) {
//Map<Order_id,Map<pickupORdeliver,int[]>>
Map<String,Map<String,int[]>> two=new TreeMap<>();
//Map<pickupORdeliver,int[]>
Map<String,int[]> three=new TreeMap<>();
Element e = (Element) eleIt.next();
if (e.getName() == "act") {
if (e.attributeValue("type").equals("pickupShipment")) {
Element shipmentId = e.element("shipmentId");//Order_id
Element arrTime = e.element("arrTime");
Element endTime = e.element("endTime");
String Order_id=shipmentId.getText();
int[] time=new int[2];
time[0]=(int)Math.rint(Double.parseDouble(arrTime.getText()));
time[1]=(int)Math.rint(Double.parseDouble(endTime.getText()));
three.put("pickup", time);
two.put(Order_id, three);
}else if (e.attributeValue("type").equals("deliverShipment")) {
Element shipmentId = e.element("shipmentId");//Order_id
Element arrTime = e.element("arrTime");
Element endTime = e.element("endTime");
String Order_id=shipmentId.getText();
int[] time=new int[2];
time[0]=(int)Math.rint(Double.parseDouble(arrTime.getText()));
time[1]=(int)Math.rint(Double.parseDouble(endTime.getText()));
three.put("deliver", time);
two.put(Order_id, three);
}
one.add(two);
}
}
parseResults.add(one);
}
}else{
System.out.println("没有配送的路径.................");
return null;
}
return parseResults;
}
/**
* 获取未配送的O2O订单id
* */
public List<String> getUnassignedO2OOrder(String path) throws DocumentException{
List<String> unassignedO2OOrder=new ArrayList<>();//存储未配送的O2O订单id
// 获取xml文件名
String[] name = getFileName(path);
for (String xml : name) {
// 创建saxReader对象
SAXReader reader = new SAXReader();
// 通过read方法读取一个文件 转换成Document对象
Document document = reader.read(new File(path+xml));
// 获取根节点元素对象
Element node = document.getRootElement();
// 获取root-node中的solutions元素节点对象
Element solutions = node.element("solutions");
// 获取solutions中最后一个solution元素节点对象
Element xElement2 = (Element) solutions.elements().get(solutions.elements().size() - 1);
// 获取</solution>中的unassignedJobs元素对象,含有未配送的商户id
Element unassignedJobs = xElement2.element("unassignedJobs");
if (unassignedJobs != null) {
for (int i = 0; i < unassignedJobs.elements().size(); i++) {
Element job = (Element) unassignedJobs.elements().get(i);
unassignedO2OOrder.add(job.attributeValue("id"));
}
}
}
return unassignedO2OOrder;
}
}