| 
					
				 | 
			
			
				@ -0,0 +1,638 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				package com.yihu.jw.hospital.prescription.service; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import com.yihu.jw.entity.base.org.BaseOrgDO; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import com.yihu.jw.entity.hospital.prescription.*; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import com.yihu.jw.hospital.prescription.dao.*; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import com.yihu.jw.hospital.prescription.service.entrance.util.SFUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import com.yihu.jw.org.dao.BaseOrgDao; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import com.yihu.jw.util.date.DateUtil; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import com.yihu.jw.util.http.HttpClientKit; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import com.yihu.mysql.query.BaseJpaService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import org.apache.commons.lang3.StringUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import org.apache.http.NameValuePair; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import org.apache.http.message.BasicNameValuePair; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import org.dom4j.Document; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import org.dom4j.DocumentHelper; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import org.dom4j.Element; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				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.orm.jpa.JpaTransactionManager; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import org.springframework.stereotype.Service; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import org.springframework.transaction.TransactionDefinition; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import org.springframework.transaction.TransactionStatus; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import org.springframework.transaction.support.DefaultTransactionDefinition; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import java.util.*; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 *  门诊物流服务 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 * lith 2019.06.04 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				@Service 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				public class PrescriptionExpressageService extends BaseJpaService<WlyyPrescriptionExpressageDO, PrescriptionExpressageDao> { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    private static Logger logger = LoggerFactory.getLogger(PrescriptionExpressageService.class); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    //顺丰快递接口请求地址 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    @Value("${express.sf_url}") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    private String sf_url; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    //顺丰快递接口接入编码 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    @Value("${express.sf_code}") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    private String sf_code; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    //顺丰快递接口checkword 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    @Value("${express.sf_check_word}") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    private String sf_check_word; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    @Autowired 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    private SFUtils SFUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    @Autowired 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    private JpaTransactionManager transactionManager; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    //处方日志 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    @Autowired 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    private WlyyOutpatientExpressageLogDao outpatientExpressageLogDao; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    @Autowired 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    private PrescriptionDao prescriptionDao; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    @Autowired 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    private WlyyExpressagePriceDao expressagePriceDao; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    @Autowired 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    private PrescriptionExpressageLogDao prescriptionExpressageLogDao; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    @Autowired 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    private PrescriptionExpressageDao prescriptionExpressageDao; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    @Autowired 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    private BaseOrgDao baseOrgDao; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * 组装请求参数,发送请求 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param xml 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @throws Exception 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    private String SFExpressPost(String xml)throws Exception{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        String verifyCode = SFUtils.verifyCodeSFXmlStr(xml,sf_check_word); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        List<NameValuePair> params = new ArrayList<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        params.add(new BasicNameValuePair("xml", xml)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        params.add(new BasicNameValuePair("verifyCode", verifyCode)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        String re = HttpClientKit.post(sf_url, params, "UTF-8"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        return re; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * 校验返回的xml报文 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param responseXml 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param title 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    private void verificationResponXml(String responseXml,String title) throws Exception { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        String error = ""; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        if (StringUtils.isBlank(responseXml)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            // 如果返回的XML报文为空,请求也算失败 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            //保存http日志 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            error = title + ",返回的XML为空!"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            logger.info(error); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            throw new Exception(error); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        }else{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				//          报错的报文示例<Response service="ScopeService"><Head>ERR</Head><ERROR code="8014">校验码错误 </ERROR></Response> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            Document doc = DocumentHelper.parseText(responseXml); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            String headvalue = doc.selectSingleNode("/Response/Head").getText(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            if(StringUtils.isNotBlank(headvalue) && "ERR".equals(headvalue)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                //错误代码 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                String errorCode = ""; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                //错误代对应的文字 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                String errorMessage = doc.selectSingleNode("/Response/ERROR").getText(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                Document error_doc = doc.selectSingleNode("/Response/ERROR").getDocument(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                Element root = error_doc.getRootElement(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                List<?> child = root.elements(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                for (Object o : child){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    Element e = (Element) o; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    errorCode = e.attributeValue("code"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                error = title+","+errorCode+","+errorMessage; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                logger.info(error); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                throw new Exception(error); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * 查询派送地址是否属于顺丰的派送范围 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param d_address 派送地址 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    public Boolean getSFOrderFilterService(String d_address) throws Exception { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        boolean result = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        String xml = SFUtils.getSFOrderFilterXml(d_address,sf_code,"","","",""); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        String re = this.SFExpressPost(xml); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				//        String re = "<Response service=\"OrderFilterService\"><Head>OK</Head><Body><OrderFilterResponse orderid=\"TE201407020016\" filter_result=\"2\" origincode=\"755\" remark=\"2\"/></Body></Response>"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        //xml验证 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        verificationResponXml(re,"查询派送地址是否有效失败!"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        Document doc = DocumentHelper.parseText(re); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        String headvalue = doc.selectSingleNode("/Response/Head").getText(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        Element root = doc.getRootElement(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        if(StringUtils.isNotBlank(headvalue) && "OK".equals(headvalue)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            //是否能派送:1:人工确认;2:可收派;3:不可以收派 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            String filter_result = ""; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            Element firstWorldElement = root.element("Body"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            List<Element> elements = firstWorldElement.elements(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            for (Element o : elements){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                filter_result = o.attributeValue("filter_result"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            if(StringUtils.isNotBlank(filter_result) && "2".equals(filter_result)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                result = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        return result; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * 向顺丰快递下订单 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param sfexpress_obj 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @throws Exception 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    public WlyyPrescriptionExpressageDO postSFOrderService(WlyyPrescriptionExpressageDO sfexpress_obj) throws Exception { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        //获取医生所处的医院详细地址,作为寄件人地址 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        WlyyPrescriptionDO prescription = prescriptionDao.findOne(sfexpress_obj.getOutpatientId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        BaseOrgDO hospital = baseOrgDao.findByCode(prescription.getHospital()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        String xml = SFUtils.postSFOrderService(sfexpress_obj,hospital,sf_code); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        logger.info("顺丰快递下订单:xml"+xml); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        String re = this.SFExpressPost(xml); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				//        String re = "<Response service=\"OrderService\"><Head>OK</Head><Body><OrderResponse filter_result=\"2\" destcode=\"592\" mailno=\"444844978335\" origincode=\"592\" orderid=\"6daa6baec5fd4b65a1b023a8b60e2e91\"/></Body></Response>"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        //xml验证 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        logger.info("顺丰快递下订单:re"+re); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        verificationResponXml(re,"向顺丰快递下订单失败!"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        Document doc = DocumentHelper.parseText(re); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        String headvalue = doc.selectSingleNode("/Response/Head").getText(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        if(StringUtils.isNotBlank(headvalue) && "OK".equals(headvalue)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            Element root = doc.getRootElement(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            if (root.element("Body") != null)     //包含OrderResponse节点 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                root = root.element("Body"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            //是否能派送:1:人工确认;2:可收派;3:不可以收派 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            String filter_result = ""; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            String orderid = "";//业务订单号 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            String mailno = "";//顺丰运单号 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            String destCode = "";//目的地区域代码 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            List<?> child = root.elements(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            for (Object o : child) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                Element e = (Element) o; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                filter_result = e.attributeValue("filter_result"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                orderid = e.attributeValue("orderid"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                mailno = e.attributeValue("mailno"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                destCode = e.attributeValue("destcode"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            if(StringUtils.isNotBlank(filter_result) && "3".equals(filter_result)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                logger.info("顺丰快递下订单失败:派送地址不可派送,门诊编号:"+sfexpress_obj.getOutpatientId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                throw new Exception("顺丰快递下订单失败:派送地址不可派送"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            if(StringUtils.isBlank(mailno)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                logger.info("顺丰快递下订单失败:未获取到快递单号!门诊编号:"+sfexpress_obj.getOutpatientId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                throw new Exception("顺丰快递下订单失败:未获取到快递单号!"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            sfexpress_obj.setMailno(mailno); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            sfexpress_obj.setCityCode(destCode); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        return sfexpress_obj; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * 调用顺丰接口获取物流路由日志,与本地匹配,进行增量修改,并返回完整日志列表 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param prescription 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param sfexpress_obj 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param sfexpresslogList 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    public List<WlyyPrescriptionExpressageLogDO> getRoutInfos(WlyyPrescriptionDO prescription, WlyyPrescriptionExpressageDO sfexpress_obj, List<WlyyPrescriptionExpressageLogDO> sfexpresslogList) throws Exception { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        String xml = SFUtils.getRoutInfos(sfexpress_obj,sf_code); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        String re = this.SFExpressPost(xml); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        //xml验证 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        verificationResponXml(re,"查询顺丰快递路由信息失败!"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        Document doc = DocumentHelper.parseText(re); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        String headvalue = doc.selectSingleNode("/Response/Head").getText(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        if(StringUtils.isNotBlank(headvalue) && "OK".equals(headvalue)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            Element root = doc.getRootElement(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            if (root.element("Body") != null)     //取报文根节点 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                root = root.element("Body"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            List<?> child = root.elements(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            String mailno = ""; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            Map<String,List<WlyyPrescriptionExpressageLogDO>> wayroutlsit = new HashMap<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            for (Object o : child) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                Element e = (Element) o; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                mailno = e.attributeValue("mailno"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                //判断快递单号不为空,且和我们本地的一致 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                if(StringUtils.isNotBlank(mailno) && 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        sfexpress_obj.getMailno().equals(mailno)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    //解析报文,结合本地数据返回最终的日志结果 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    return this.xmltologlist(e,sfexpresslogList,sfexpress_obj); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                }else{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    continue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        return null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    private List<WlyyPrescriptionExpressageLogDO> xmltologlist(Element e, List<WlyyPrescriptionExpressageLogDO> sfexpresslogList, WlyyPrescriptionExpressageDO sfexpress_obj)throws Exception{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        //获取本地所有路由信息的时间集 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        Set<String> routAcceptTimeSet = new HashSet<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        for (WlyyPrescriptionExpressageLogDO log: sfexpresslogList) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            routAcceptTimeSet.add(DateUtil.dateToStrLong(log.getAcceptTime())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        List<?> child = e.elements(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        List<WlyyPrescriptionExpressageLogDO> newroutinfolist = new ArrayList<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        //用于判断新节点是否包含了"已收件"的节点 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        boolean isContainEndRoutInfo = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        for (Object o : child) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            Element routinfoe = (Element) o; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            String accept_time = routinfoe.attributeValue("accept_time"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            String accept_address = routinfoe.attributeValue("accept_address"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            String accept_remark = routinfoe.attributeValue("remark"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            String opcode = routinfoe.attributeValue("opcode"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            //和时间集作比对,过滤已存在的 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            if(!routAcceptTimeSet.contains(accept_time)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                WlyyPrescriptionExpressageLogDO newlogobj = new WlyyPrescriptionExpressageLogDO(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                newlogobj.setAcceptTime(DateUtil.strToDate(accept_time)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                newlogobj.setAcceptAddress(accept_address); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                newlogobj.setAcceptRemark(accept_remark); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                newlogobj.setOpCode(opcode); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                newlogobj.setId(UUID.randomUUID().toString().replace("-","")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                newlogobj.setOutpatientId(sfexpress_obj.getOutpatientId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                newlogobj.setExpressageId(sfexpress_obj.getId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                newlogobj.setCreateTime(new Date()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                newroutinfolist.add(newlogobj); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                sfexpresslogList.add(newlogobj); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                //aopcode=80,为已签收 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                if("80".equals(opcode)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    isContainEndRoutInfo = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        DefaultTransactionDefinition def = new DefaultTransactionDefinition(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); // 事物隔离级别,开启新事务 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        TransactionStatus status = transactionManager.getTransaction(def); // 获得事务状态 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            //如果有新增的路由信息,则添加到数据库 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            if(!newroutinfolist.isEmpty()){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                prescriptionExpressageLogDao.save(newroutinfolist); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            //如果路由信息节点包含了"已收件"节点,这修改处方派送状态为完成,增加物流派送日志为完成 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            if(isContainEndRoutInfo){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                //修改处方状态为完成 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                prescriptionDao.updateStatus(sfexpress_obj.getId(), 100,new Date()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                //保存门诊处方配送成功的日志 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                WlyyOutpatientExpressageLogDO outpatiExpressLog = new WlyyOutpatientExpressageLogDO(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                outpatiExpressLog.setOutpatientId(sfexpress_obj.getOutpatientId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                outpatiExpressLog.setId(UUID.randomUUID().toString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                outpatiExpressLog.setType(8); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                outpatiExpressLog.setCreateTime(new Date()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                outpatiExpressLog.setFlag(1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                outpatiExpressLog.setStatus(100); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                outpatientExpressageLogDao.save(outpatiExpressLog); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            //事务提交 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            transactionManager.commit(status); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } catch (Exception ex) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            //报错事务回滚 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            transactionManager.rollback(status); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        return sfexpresslogList; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * 解析顺丰推送过来的路由信息,和本地数据匹配并进行增量更新) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param xml 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @throws Exception 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    public void SFRoutePushService(String xml) throws Exception{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        Document doc = DocumentHelper.parseText(xml); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        Element root = doc.getRootElement(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        if (root.element("Body") != null)     //包含WaybillRoute节点 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            root = root.element("Body"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        List<?> child = root.elements(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        Map<String,List<WlyyPrescriptionExpressageLogDO>> wayroutlsit = new HashMap<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        for (Object o : child) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            Element routinfoe = (Element) o; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            WlyyPrescriptionExpressageLogDO sflog = new WlyyPrescriptionExpressageLogDO(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            String accept_time = routinfoe.attributeValue("accepttime"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            String accept_address = routinfoe.attributeValue("acceptaddress"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            String accept_remark = routinfoe.attributeValue("remark"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            String opcode = routinfoe.attributeValue("opcode"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            String mailno = routinfoe.attributeValue("mailno"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            String orderid = routinfoe.attributeValue("orderid"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            sflog.setAcceptTime(DateUtil.strToDate(accept_time)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            sflog.setAcceptAddress(accept_address); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            sflog.setAcceptRemark(accept_remark); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            sflog.setOpCode(opcode); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            sflog.setExpressageId(orderid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            sflog.setId(UUID.randomUUID().toString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            sflog.setCreateTime(new Date()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            if(wayroutlsit.keySet().contains(mailno)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                wayroutlsit.get(mailno).add(sflog); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            }else{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                List<WlyyPrescriptionExpressageLogDO> newsflogs = new ArrayList<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                newsflogs.add(sflog); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                wayroutlsit.put(mailno,newsflogs); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        if(!wayroutlsit.keySet().isEmpty()){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            for (String mailno:wayroutlsit.keySet()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                List<WlyyPrescriptionExpressageLogDO> pushSFLogs = wayroutlsit.get(mailno); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                //同一个快递单号的执行一个事务操作 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                this.saveSFPushRoutInfos(mailno,pushSFLogs); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * 同一个快递单号的执行一个事务操作 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param mailno 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param pushSFLogs 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    public void saveSFPushRoutInfos(String mailno,List<WlyyPrescriptionExpressageLogDO> pushSFLogs){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        //根据快递单号获取处方配送详细信息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        WlyyPrescriptionExpressageDO sfexpress = prescriptionExpressageDao.findByPrescriptionExpressMailno(mailno); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        //根据快递单号获取本地的路由信息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        List<WlyyPrescriptionExpressageLogDO> localroutinfos = prescriptionExpressageLogDao.queryByOutpatientId(sfexpress.getOutpatientId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        //需要增量更新到本地的路由信息集合 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        List<WlyyPrescriptionExpressageLogDO> newroutinfolist = new ArrayList<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        DefaultTransactionDefinition def = new DefaultTransactionDefinition(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); // 事务隔离级别,开启新事务 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        TransactionStatus status = transactionManager.getTransaction(def); // 获得事务状态 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            //用于判断新节点是否包含了"已收件"的节点 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            boolean isContainEndRoutInfo = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            //获取本地所有路由信息的时间集 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            Set<String> routAcceptTimeSet = new HashSet<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            for (WlyyPrescriptionExpressageLogDO log: localroutinfos) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                routAcceptTimeSet.add(DateUtil.dateToStrLong(log.getAcceptTime())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            for (WlyyPrescriptionExpressageLogDO pushlog: pushSFLogs) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                //判断是否有已收件的路由节点 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                if("80".equals(pushlog.getOpCode())){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    isContainEndRoutInfo = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                if(routAcceptTimeSet.contains(DateUtil.dateToStrLong(pushlog.getAcceptTime()))){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    continue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                }else{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    pushlog.setOutpatientId(sfexpress.getOutpatientId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    newroutinfolist.add(pushlog); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            //如果有新增的路由信息,则添加到数据库 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            if(!newroutinfolist.isEmpty()){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                prescriptionExpressageLogDao.save(newroutinfolist); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            //如果路由信息节点包含了"已收件"节点,则修改处方状态为完成,增加物流派送日志为完成 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            if(isContainEndRoutInfo){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                //修改处方状态为完成 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                prescriptionDao.updateStatus(sfexpress.getOutpatientId(), 100,new Date()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                //保存配送成功的日志 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                WlyyOutpatientExpressageLogDO outpatiExpressLog = new WlyyOutpatientExpressageLogDO(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                outpatiExpressLog.setOutpatientId(sfexpress.getOutpatientId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                outpatiExpressLog.setId(UUID.randomUUID().toString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                outpatiExpressLog.setType(8); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                outpatiExpressLog.setCreateTime(new Date()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                outpatiExpressLog.setFlag(1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                outpatiExpressLog.setStatus(100); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                outpatientExpressageLogDao.save(outpatiExpressLog); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            //事务提交 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            transactionManager.commit(status); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } catch (Exception ex) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            //报错事务回滚 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            transactionManager.rollback(status); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * 根据收寄地址获取快递费用 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param d_province 省份名称 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param d_city     城市名称 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    public WlyyExpressagePriceDO getSFExpressPrice(String d_province, String d_city) throws Exception{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        String end_address_name = ""; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        if("厦门市".equals(d_city)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            end_address_name = "同城"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        }else{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            if("福建省".equals(d_province)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                end_address_name = "省内"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            }else{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                end_address_name = d_province; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        end_address_name = "%"+end_address_name.replaceAll("省","").replaceAll("市","")+"%"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        WlyyExpressagePriceDO sfprice =  expressagePriceDao.getExprePriceByIdAndEndAdressName("shunfeng",end_address_name); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        return sfprice; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * 根据处方快递订单号判断是否下单成功 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * 如果下单成功,保存处方物流记录,保存配送日志 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param sfexpress_obj 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @throws Exception 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    public boolean sfOrderSearchService(WlyyPrescriptionExpressageDO sfexpress_obj)  throws Exception{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        boolean go_on = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        String xml = SFUtils.sfOrderSearchService(sfexpress_obj.getId(),sf_code); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        String re = this.SFExpressPost(xml); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            //xml验证 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            verificationResponXml(re,"订单处理失败!"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            Document doc = DocumentHelper.parseText(re); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            String headvalue = doc.selectSingleNode("/Response/Head").getText(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            if(StringUtils.isNotBlank(headvalue) && "OK".equals(headvalue)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                //是否能派送:1:人工确认;2:可收派;3:不可以收派 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                String filter_result = ""; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                String orderid = "";//业务订单号 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                String mailno = "";//顺丰运单号 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                String destCode = "";//目的地区域代码 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                //错误代对应的文字 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                Document redoc = doc.selectSingleNode("/Response/Body/Orderresponse").getDocument(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                Element root = redoc.getRootElement(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                List<?> child = root.elements(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                for (Object o : child) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    Element e = (Element) o; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    filter_result = e.attributeValue("filter_result"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    orderid = e.attributeValue("orderid"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    mailno = e.attributeValue("mailno"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    destCode = e.attributeValue("destCode"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                if(StringUtils.isBlank(mailno)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    logger.info("顺丰快递下订单失败:未获取到快递单号!"+sfexpress_obj.getOutpatientId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    return true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                if(StringUtils.isNotBlank(filter_result) && "3".equals(filter_result)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    logger.info("顺丰快递下订单失败:派送地址不可派送,处方编号:"+sfexpress_obj.getOutpatientId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    return true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                sfexpress_obj.setMailno(mailno); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                sfexpress_obj.setCityCode(destCode); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            //如果成功获取到快递单号,则保存处方物流记录,保存配送日志 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            //修改处方状态为配送中 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            prescriptionDao.updateStatus(sfexpress_obj.getOutpatientId(),65); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            //保存处方物流记录 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            prescriptionExpressageDao.save(sfexpress_obj); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            //保存配送日志 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            WlyyOutpatientExpressageLogDO outpatiExpressLog = new WlyyOutpatientExpressageLogDO(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            outpatiExpressLog.setOutpatientId(sfexpress_obj.getOutpatientId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            outpatiExpressLog.setId(UUID.randomUUID().toString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            outpatiExpressLog.setType(8); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            outpatiExpressLog.setCreateTime(new Date()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            outpatiExpressLog.setFlag(1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            outpatiExpressLog.setStatus(100); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            outpatientExpressageLogDao.save(outpatiExpressLog); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        }catch (Exception ex){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            logger.info("顺丰快递下订单失败:派送地址不可派送,处方编号:"+sfexpress_obj.getOutpatientId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            //如果订单处理失败,则可以继续下单 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            go_on = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        return go_on; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    public boolean sfOrderSearchServiceJustSearch(WlyyPrescriptionExpressageDO sfexpress_obj)  throws Exception{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        String xml = SFUtils.sfOrderSearchService(sfexpress_obj.getId(),sf_code); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        String re = this.SFExpressPost(xml); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        boolean reslut = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            //xml验证 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            verificationResponXml(re,"订单处理失败!"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            Document doc = DocumentHelper.parseText(re); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            String headvalue = doc.selectSingleNode("/Response/Head").getText(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            if(StringUtils.isNotBlank(headvalue) && "OK".equals(headvalue)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                Element root = doc.getRootElement(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                if (root.element("Body") != null)     //包含OrderResponse节点 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    root = root.element("Body"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                //是否能派送:1:人工确认;2:可收派;3:不可以收派 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                String filter_result = ""; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                String orderid = "";//业务订单号 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                String mailno = "";//顺丰运单号 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                List<?> child = root.elements(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                for (Object o : child) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    Element e = (Element) o; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    filter_result = e.attributeValue("filter_result"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    orderid = e.attributeValue("orderid"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    mailno = e.attributeValue("mailno"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                if(StringUtils.isNotBlank(filter_result) && "3".equals(filter_result)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    logger.info("顺丰快递下订单失败:派送地址不可派送,处方编号:"+sfexpress_obj.getOutpatientId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    throw new Exception("顺丰快递下订单失败:派送地址不可派送"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                if(StringUtils.isBlank(mailno)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    logger.info("顺丰快递下订单失败:未获取到快递单号!"+sfexpress_obj.getOutpatientId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    throw new Exception("顺丰快递下订单失败:未获取到快递单号!"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        }catch (Exception ex){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            logger.info("顺丰快递下订单失败:派送地址不可派送,处方编号:"+sfexpress_obj.getOutpatientId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            //如果订单处理失败,则可以继续下单 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            throw new Exception(ex.getMessage()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        return reslut; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    public String getRoutInfosSearch(WlyyPrescriptionExpressageDO sfexpress_obj)throws Exception { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        String xml = SFUtils.getRoutInfos(sfexpress_obj,sf_code); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        String re = this.SFExpressPost(xml); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        return xml; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				} 
			 |