SSH综合项目实战(快递) -- day09 收派业务、客户在线下单

一、取派业务

1、创建取派业务模块,导入实体类


package com.itheima.bos.domain.take_delivery;

import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;

import com.itheima.bos.domain.base.Area;
import com.itheima.bos.domain.base.Courier;

/**
 * @description:订单实体类
 */
@Entity
@Table(name = "T_ORDER")
public class Order {
	@Id
	@GeneratedValue
	@Column(name = "C_ID")
	private Integer id;// 主键
	@Column(name = "C_ORDER_NUM")
	private String orderNum;// 订单号

	@Column(name = "C_TELEPHONE")
	private String telephone; // 来电号码

	@Column(name = "C_CUSTOMER_ID")
	private Integer customer_id; // 客户编号

	@Column(name = "C_SEND_NAME")
	private String sendName; // 寄件人姓名
	@Column(name = "C_SEND_MOBILE")
	private String sendMobile;// 寄件人电话
	@Column(name = "C_SEND_COMPANY")
	private String sendCompany;// 寄件人公司
	@OneToOne
	@JoinColumn(name = "C_SEND_AREA_ID")
	private Area sendArea; // 寄件人省市区信息
	@Column(name = "C_SEND_ADDRESS")
	private String sendAddress;// 寄件人详细地址信息

	@Column(name = "C_REC_NAME")
	private String recName;// 收件人姓名
	@Column(name = "C_REC_MOBILE")
	private String recMobile;// 收件人电话
	@Column(name = "C_REC_COMPANY")
	private String recCompany;// 收件人公司
	@OneToOne
	@JoinColumn(name = "C_REC_AREA_ID")
	private Area recArea; // 收件人省市区信息
	@Column(name = "C_REC_ADDRESS")
	private String recAddress;// 收件人详细地址信息

	@Column(name = "C_SEND_PRO_NUM")
	private String sendProNum; // 快递产品类型编号:速运当日、速运次日、速运隔日
	@Column(name = "C_GOODS_TYPE")
	private String goodsType;// 托寄物类型:文件、衣服 、食品、电子商品
	@Column(name = "C_PAY_TYPE_NUM")
	private String payTypeNum;// 支付类型编号:寄付日结、寄付月结、到付
	@Column(name = "C_WEIGHT")
	private Double weight;// 托寄物重量
	@Column(name = "C_REMARK")
	private String remark; // 备注

	@Column(name = "C_SEND_MOBILE_MSG")
	private String sendMobileMsg; // 给快递员捎话

	// 分单类型 1 自动分单 2 人工分单
	@Column(name = "C_ORDER_TYPE")
	private String orderType;

	// 订单状态 1 待取件 2 运输中 3 已签收 4 异常
	@Column(name = "C_STATUS")
	private String status;

	// 下单时间
	@Column(name = "C_ORDER_TIME")
	private Date orderTime;

	// 运单
	@OneToOne(mappedBy = "order")
	private WayBill wayBill;

	// 工单
	@OneToMany(mappedBy = "order")
	private Set<WorkBill> workBills = new HashSet<WorkBill>(0);

	@ManyToOne
	@JoinColumn(name = "C_COURIER_ID")
	private Courier courier;

	public Integer getId() {
		return id;
	}

	public Integer getCustomer_id() {
		return customer_id;
	}

	public void setCustomer_id(Integer customer_id) {
		this.customer_id = customer_id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getOrderNum() {
		return orderNum;
	}

	public void setOrderNum(String orderNum) {
		this.orderNum = orderNum;
	}

	public String getSendName() {
		return sendName;
	}

	public void setSendName(String sendName) {
		this.sendName = sendName;
	}

	public String getSendMobile() {
		return sendMobile;
	}

	public void setSendMobile(String sendMobile) {
		this.sendMobile = sendMobile;
	}

	public String getSendCompany() {
		return sendCompany;
	}

	public void setSendCompany(String sendCompany) {
		this.sendCompany = sendCompany;
	}

	public Area getSendArea() {
		return sendArea;
	}

	public void setSendArea(Area sendArea) {
		this.sendArea = sendArea;
	}

	public String getSendAddress() {
		return sendAddress;
	}

	public void setSendAddress(String sendAddress) {
		this.sendAddress = sendAddress;
	}

	public String getRecName() {
		return recName;
	}

	public void setRecName(String recName) {
		this.recName = recName;
	}

	public String getRecMobile() {
		return recMobile;
	}

	public void setRecMobile(String recMobile) {
		this.recMobile = recMobile;
	}

	public String getRecCompany() {
		return recCompany;
	}

	public void setRecCompany(String recCompany) {
		this.recCompany = recCompany;
	}

	public Area getRecArea() {
		return recArea;
	}

	public void setRecArea(Area recArea) {
		this.recArea = recArea;
	}

	public String getRecAddress() {
		return recAddress;
	}

	public void setRecAddress(String recAddress) {
		this.recAddress = recAddress;
	}

	public String getSendProNum() {
		return sendProNum;
	}

	public void setSendProNum(String sendProNum) {
		this.sendProNum = sendProNum;
	}

	public String getGoodsType() {
		return goodsType;
	}

	public void setGoodsType(String goodsType) {
		this.goodsType = goodsType;
	}

	public String getPayTypeNum() {
		return payTypeNum;
	}

	public void setPayTypeNum(String payTypeNum) {
		this.payTypeNum = payTypeNum;
	}

	public Double getWeight() {
		return weight;
	}

	public void setWeight(Double weight) {
		this.weight = weight;
	}

	public String getRemark() {
		return remark;
	}

	public void setRemark(String remark) {
		this.remark = remark;
	}

	public Date getOrderTime() {
		return orderTime;
	}

	public void setOrderTime(Date orderTime) {
		this.orderTime = orderTime;
	}

	public WayBill getWayBill() {
		return wayBill;
	}

	public void setWayBill(WayBill wayBill) {
		this.wayBill = wayBill;
	}

	public Set<WorkBill> getWorkBills() {
		return workBills;
	}

	public void setWorkBills(Set<WorkBill> workBills) {
		this.workBills = workBills;
	}

	public String getTelephone() {
		return telephone;
	}

	public void setTelephone(String telephone) {
		this.telephone = telephone;
	}

	public String getSendMobileMsg() {
		return sendMobileMsg;
	}

	public void setSendMobileMsg(String sendMobileMsg) {
		this.sendMobileMsg = sendMobileMsg;
	}

	@Override
	public String toString() {
		return "Order [id=" + id + ", orderNum=" + orderNum + ", telephone="
				+ telephone + ", customer_id=" + customer_id + ", sendName="
				+ sendName + ", sendMobile=" + sendMobile + ", sendCompany="
				+ sendCompany + ", sendArea=" + sendArea + ", sendAddress="
				+ sendAddress + ", recName=" + recName + ", recMobile="
				+ recMobile + ", recCompany=" + recCompany + ", recArea="
				+ recArea + ", recAddress=" + recAddress + ", sendProNum="
				+ sendProNum + ", goodsType=" + goodsType + ", payTypeNum="
				+ payTypeNum + ", weight=" + weight + ", remark=" + remark
				+ ", sendMobileMsg=" + sendMobileMsg + ", orderTime="
				+ orderTime + ", wayBill=" + wayBill + ", workBills="
				+ workBills + "]";
	}

	public Courier getCourier() {
		return courier;
	}

	public void setCourier(Courier courier) {
		this.courier = courier;
	}

	public String getOrderType() {
		return orderType;
	}

	public void setOrderType(String orderType) {
		this.orderType = orderType;
	}

	public String getStatus() {
		return status;
	}

	public void setStatus(String status) {
		this.status = status;
	}

}

package com.itheima.bos.domain.take_delivery;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;

import com.itheima.bos.domain.base.Area;

/**
 * @description:运单实体类
 */
@Entity
@Table(name = "T_WAY_BILL")
public class WayBill {

	@Id
	@GeneratedValue
	@Column(name = "C_ID")
	private Integer id;
	@Column(name = "C_WAY_BILL_NUM", unique = true)
	private String wayBillNum; // 运单编号
	@OneToOne
	@JoinColumn(name = "C_ORDER_ID")
	private Order order; // 订单信息

	@Column(name = "C_SEND_NAME")
	private String sendName; // 寄件人姓名
	@Column(name = "C_SEND_MOBILE")
	private String sendMobile;// 寄件人电话
	@Column(name = "C_SEND_COMPANY")
	private String sendCompany;// 寄件人公司
	@OneToOne
	@JoinColumn(name = "C_SEND_AREA_ID")
	private Area sendArea; // 寄件人省市区信息
	@Column(name = "C_SEND_ADDRESS")
	private String sendAddress;// 寄件人详细地址信息

	@Column(name = "C_REC_NAME")
	private String recName;// 收件人姓名
	@Column(name = "C_REC_MOBILE")
	private String recMobile;// 收件人电话
	@Column(name = "C_REC_COMPANY")
	private String recCompany;// 收件人公司
	@OneToOne
	@JoinColumn(name = "C_REC_AREA_ID")
	private Area recArea; // 收件人省市区信息
	@Column(name = "C_REC_ADDRESS")
	private String recAddress;// 收件人详细地址信息

	@Column(name = "C_SEND_PRO_NUM")
	private String sendProNum; // 快递产品类型编号:速运当日、速运次日、速运隔日
	@Column(name = "C_GOODS_TYPE")
	private String goodsType;// 托寄物类型:文件、衣服 、食品、电子商品
	@Column(name = "C_PAY_TYPE_NUM")
	private String payTypeNum;// 支付类型编号:寄付日结、寄付月结、到付
	@Column(name = "C_WEIGHT")
	private Double weight;// 托寄物重量
	@Column(name = "C_REMARK")
	private String remark; // 备注
	@Column(name = "C_NUM")
	private Integer num; // 原件数

	@Column(name = "C_ARRIVE_CITY")
	private String arriveCity; // 到达地

	@Column(name = "C_FEEITEMNUM")
	private Integer feeitemnum; // 实际件数
	@Column(name = "C_ACTLWEIT")
	private Double actlweit; // 实际重量
	@Column(name = "C_VOL")
	private String vol; // 体积 输入格式为1*1*1*1,表示长*宽*高*数量
	@Column(name = "C_FLOADREQR")
	private String floadreqr; // 配载要求 (比如录入1=无,2=禁航,4=禁航空铁路)

	@Column(name = "C_WAY_BILL_TYPE")
	private String wayBillType; // 运单类型(类型包括:正常单据、异单、调单)
	/*
	 * 运单状态: 1 待发货、 2 派送中、3 已签收、4 异常
	 */
	@Column(name = "C_SIGN_STATUS")
	private Integer signStatus; // 签收状态

	/*
	 * 1、新增修改单据状态为“否” 2、作废时需将状态置为“是” 3、取消作废时需要将状态置为“否”
	 */
	@Column(name = "C_DELTAG")
	private String delTag; // 作废标志

	public String getArriveCity() {
		return arriveCity;
	}

	public void setArriveCity(String arriveCity) {
		this.arriveCity = arriveCity;
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getWayBillNum() {
		return wayBillNum;
	}

	public void setWayBillNum(String wayBillNum) {
		this.wayBillNum = wayBillNum;
	}

	public Order getOrder() {
		return order;
	}

	public void setOrder(Order order) {
		this.order = order;
	}

	public String getSendName() {
		return sendName;
	}

	public void setSendName(String sendName) {
		this.sendName = sendName;
	}

	public String getSendMobile() {
		return sendMobile;
	}

	public void setSendMobile(String sendMobile) {
		this.sendMobile = sendMobile;
	}

	public String getSendCompany() {
		return sendCompany;
	}

	public void setSendCompany(String sendCompany) {
		this.sendCompany = sendCompany;
	}

	public Area getSendArea() {
		return sendArea;
	}

	public void setSendArea(Area sendArea) {
		this.sendArea = sendArea;
	}

	public String getSendAddress() {
		return sendAddress;
	}

	public void setSendAddress(String sendAddress) {
		this.sendAddress = sendAddress;
	}

	public String getRecName() {
		return recName;
	}

	public void setRecName(String recName) {
		this.recName = recName;
	}

	public String getRecMobile() {
		return recMobile;
	}

	public void setRecMobile(String recMobile) {
		this.recMobile = recMobile;
	}

	public String getRecCompany() {
		return recCompany;
	}

	public void setRecCompany(String recCompany) {
		this.recCompany = recCompany;
	}

	public Area getRecArea() {
		return recArea;
	}

	public void setRecArea(Area recArea) {
		this.recArea = recArea;
	}

	public String getRecAddress() {
		return recAddress;
	}

	public void setRecAddress(String recAddress) {
		this.recAddress = recAddress;
	}

	public String getSendProNum() {
		return sendProNum;
	}

	public void setSendProNum(String sendProNum) {
		this.sendProNum = sendProNum;
	}

	public String getGoodsType() {
		return goodsType;
	}

	public void setGoodsType(String goodsType) {
		this.goodsType = goodsType;
	}

	public String getPayTypeNum() {
		return payTypeNum;
	}

	public void setPayTypeNum(String payTypeNum) {
		this.payTypeNum = payTypeNum;
	}

	public Double getWeight() {
		return weight;
	}

	public void setWeight(Double weight) {
		this.weight = weight;
	}

	public String getRemark() {
		return remark;
	}

	public void setRemark(String remark) {
		this.remark = remark;
	}

	public Integer getNum() {
		return num;
	}

	public void setNum(Integer num) {
		this.num = num;
	}

	public Integer getFeeitemnum() {
		return feeitemnum;
	}

	public void setFeeitemnum(Integer feeitemnum) {
		this.feeitemnum = feeitemnum;
	}

	public Double getActlweit() {
		return actlweit;
	}

	public void setActlweit(Double actlweit) {
		this.actlweit = actlweit;
	}

	public String getVol() {
		return vol;
	}

	public void setVol(String vol) {
		this.vol = vol;
	}

	public String getFloadreqr() {
		return floadreqr;
	}

	public void setFloadreqr(String floadreqr) {
		this.floadreqr = floadreqr;
	}

	public String getWayBillType() {
		return wayBillType;
	}

	public void setWayBillType(String wayBillType) {
		this.wayBillType = wayBillType;
	}

	public Integer getSignStatus() {
		return signStatus;
	}

	public void setSignStatus(Integer signStatus) {
		this.signStatus = signStatus;
	}

	public String getDelTag() {
		return delTag;
	}

	public void setDelTag(String delTag) {
		this.delTag = delTag;
	}

}

package com.itheima.bos.domain.take_delivery;

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.Table;

import com.itheima.bos.domain.base.Courier;

/**
 * @description:工单
 */
@Entity
@Table(name = "T_WORK_BILL")
public class WorkBill {
	@Id
	@GeneratedValue
	@Column(name = "C_ID")
	private Integer id; // 主键
	@Column(name = "C_TYPE")
	private String type; // 工单类型 新,追,销
	/*
	 * 新单:没有确认货物状态的 已通知:自动下单下发短信 已确认:接到短信,回复收信确认信息 已取件:已经取件成功,发回确认信息 生成工作单
	 * 已取消:销单
	 * 
	 */
	@Column(name = "C_PICKSTATE")
	private String pickstate; // 取件状态
	@Column(name = "C_BUILDTIME")
	private Date buildtime; // 工单生成时间
	@Column(name = "C_ATTACHBILLTIMES")
	private Integer attachbilltimes; // 追单次数
	@Column(name = "C_REMARK")
	private String remark; // 订单备注
	@Column(name = "C_SMSNUMBER")
	private String smsNumber; // 短信序号

	@OneToOne
	@JoinColumn(name = "C_COURIER")
	private Courier courier;// 快递员

	@ManyToOne
	@JoinColumn(name = "C_ORDER_ID")
	private Order order; // 订单

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getType() {
		return type;
	}

	public void setType(String type) {
		this.type = type;
	}

	public String getPickstate() {
		return pickstate;
	}

	public void setPickstate(String pickstate) {
		this.pickstate = pickstate;
	}

	public Date getBuildtime() {
		return buildtime;
	}

	public void setBuildtime(Date buildtime) {
		this.buildtime = buildtime;
	}

	public Integer getAttachbilltimes() {
		return attachbilltimes;
	}

	public void setAttachbilltimes(Integer attachbilltimes) {
		this.attachbilltimes = attachbilltimes;
	}

	public String getRemark() {
		return remark;
	}

	public void setRemark(String remark) {
		this.remark = remark;
	}

	public String getSmsNumber() {
		return smsNumber;
	}

	public void setSmsNumber(String smsNumber) {
		this.smsNumber = smsNumber;
	}

	public Courier getCourier() {
		return courier;
	}

	public void setCourier(Courier courier) {
		this.courier = courier;
	}

	public Order getOrder() {
		return order;
	}

	public void setOrder(Order order) {
		this.order = order;
	}

}

2、启动项目,自动建表


二、客户在线下单功能

1、在线下单页面 -- order.html


2、基于百度地图实现客户下单页面详细地址自动补全

(1)、导入百度地图的js资源文件

		<script type="text/javascript" 
			src="http://api.map.baidu.com/api?v=2.0&ak=4IU3oIAMpZhfWZsMu7xzqBBAf6vMHcoa">
		</script>

(2)、在页面中提供input输入框,并编写js代码

	<input name="sendAddress" id="sendAddress" type="text" class="form-control" 
			placeholder="街道详细(精确到门牌号) " required="required">
	<!-- 使用百度地图api实现自动补全功能 -->
	<script type="text/javascript">
		$(function(){
			//使用百度地图的自动补全控件
			var ac = new BMap.Autocomplete({
				input:"sendAddress"
			});
		});
	</script>


(3)、页面实现的效果


3、省市区三级联动效果实现

(1)、引入city-picker相关的资源文件


(2)、使用data-toggle方式实现三级联动的html页面代码


4、给页面的提交按钮绑定点击事件


5、编写后台Dao层代码

(1)、orderDao


package com.itheima.bos.dao.take_delivery;

import org.springframework.data.jpa.repository.JpaRepository;

import com.itheima.bos.domain.take_delivery.Order;

public interface OrderDao extends JpaRepository<Order, Integer> {

}

(2)、扩展AreaDao中的方法

	//根据省市地区获取区域对象
	public Area findByProvinceAndCityAndDistrict(String province, String city, String district);

(3)、扩展CRM系统中的CustomerDao中的方法

	/**
	 * 根据客户住址查询定区id
	 * @param telephone
	 * @param password
	 * @return
	 */
	@Query("select fixedAreaId from Customer where address = ?")
	public String findFixedAreaIdByAddress(String address);

(4)、编写WorkBillDao接口


package com.itheima.bos.dao.take_delivery;

import org.springframework.data.jpa.repository.JpaRepository;

import com.itheima.bos.domain.take_delivery.WorkBill;

public interface WorkBillDao extends JpaRepository<WorkBill, Integer> {

}

6、编写后台bos_management_service系统中Service层发布服务的代码

(1)、扩展CRM系统中的service方法

接口:

	/**
	 * 根据客户住址查询定区id
	 * @param telephone
	 * @param password
	 * @return
	 */
	public String findFixedAreaIdByAddress(String address);

实现类:

	/**
	 * 根据客户住址查询定区id
	 * @param telephone
	 * @param password
	 * @return
	 */
	public String findFixedAreaIdByAddress(String address) {
		return dao.findFixedAreaIdByAddress(address);
	}

(2)、创建订单接口和实现类


(3)、OrderService接口

package com.itheima.bos.service.take_delivery;

import javax.jws.WebService;

import com.itheima.bos.domain.take_delivery.Order;

@WebService
public interface OrderService {

	/**
	 * 保存订单,实现自动分单的功能
	 * @param order
	 */
	public void saveOrder(Order order);
}

(4)、OrderServiceImpl实现类

package com.itheima.bos.service.take_delivery.impl;

import java.util.Date;
import java.util.Iterator;
import java.util.Set;
import java.util.UUID;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.itheima.bos.dao.base.AreaDao;
import com.itheima.bos.dao.base.FixedAreaDao;
import com.itheima.bos.dao.take_delivery.OrderDao;
import com.itheima.bos.dao.take_delivery.WorkBillDao;
import com.itheima.bos.domain.base.Area;
import com.itheima.bos.domain.base.Courier;
import com.itheima.bos.domain.base.FixedArea;
import com.itheima.bos.domain.base.SubArea;
import com.itheima.bos.domain.take_delivery.Order;
import com.itheima.bos.domain.take_delivery.WorkBill;
import com.itheima.bos.service.take_delivery.OrderService;
import com.itheima.crm.service.CustomerService;

/**
 * 订单管理的服务层实现类
 * @author Administrator
 *
 */
@Service
@Transactional
public class OrderServiceImpl implements OrderService {

	@Autowired
	private OrderDao orderDao;
	
	@Autowired
	private AreaDao areaDao;
	
	@Autowired
	private CustomerService crmProxy;
	
	@Autowired
	private FixedAreaDao fixedAreaDao;
	
	@Autowired
	private WorkBillDao workBillDao;
	/**
	 * 保存订单,实现自动分单的功能
	 * @param order
	 */
	public void saveOrder(Order order) {
		//1、根据订单中区域信息(省市地区)查询数据库,获取持久态区域对象
		Area sendArea = order.getSendArea();
		Area recArea = order.getRecArea();
		//查询发件人地址
		if(sendArea != null){
			Area osendArea = areaDao.findByProvinceAndCityAndDistrict(sendArea.getProvince(),sendArea.getCity(),sendArea.getDistrict());
			order.setSendArea(osendArea);
		}
		//查询收件人地址
		if(recArea != null){
			Area orecArea = areaDao.findByProvinceAndCityAndDistrict(recArea.getProvince(), recArea.getCity(), recArea.getDistrict());
			order.setRecArea(orecArea);
		}
		//2、保存订单信息
		order.setOrderTime(new Date());
		order.setOrderNum(UUID.randomUUID().toString());
		orderDao.save(order);
		
		//3、基于CRM地址库完全匹配法实现自动分单
		if(StringUtils.isNotBlank(order.getSendAddress())){
			//根据发件人地址获取定区id
			String fixedAreaId = crmProxy.findFixedAreaIdByAddress(order.getSendAddress());
			if(fixedAreaId != null){
				//根据定区id获取定区对象
				FixedArea fixedArea = fixedAreaDao.findOne(fixedAreaId);
				Set<Courier> couriers = fixedArea.getCouriers();//获取定区关联的快递员集合
				Iterator<Courier> iterator = couriers.iterator();
				if(iterator.hasNext()){
					//查询到定区id,可以完成自动分单
					order.setOrderType("自动分单");//设置分单类型
					Courier courier = iterator.next();
					order.setCourier(courier);
					//为快递员生成一个工单
					WorkBill workBill = new WorkBill();
					workBill.setAttachbilltimes(0);
					workBill.setBuildtime(new Date());
					workBill.setCourier(courier);
					workBill.setOrder(order);
					workBill.setPickstate("新单");
					workBill.setRemark(order.getRemark());
					workBill.setSmsNumber("123");
					workBill.setType("新");
					//保存工单
					workBillDao.save(workBill);
					//调用短信平台,为快递员发送短信 -- 略
					// TODO
					return; //如果基于CRM地址库实现自动分单成立,则直接退出方法
				}
			}
		}
		//4、如果基于CRM地址库分区实现自动分单不成立,则进行基于分区关键字匹配法实现自动分单
		if(order.getSendArea() != null){
			//获得指定区域中包含的所有分区
			Set<SubArea> subareas = order.getSendArea().getSubareas();
			for (SubArea subArea : subareas) {
				String keyWords = subArea.getKeyWords();//获取分区关键字
				String assistKeyWords = subArea.getAssistKeyWords();//获取辅助关键字
				if(order.getSendAddress().contains(keyWords) || order.getSendAddress().contains(assistKeyWords)){
					//用户输入的地址,在指定分区内,根据分区,获取当前分区内的定区
					FixedArea fixedArea = subArea.getFixedArea();
					//根据定区找到当前定区中的快递员
					Set<Courier> couriers = fixedArea.getCouriers();
					Iterator<Courier> iterator = couriers.iterator();
					if(iterator.hasNext()){
						//查询到定区id,可以完成自动分单
						order.setOrderType("自动分单");//设置分单类型
						Courier courier = iterator.next();
						order.setCourier(courier);
						//为快递员生成一个工单
						WorkBill workBill = new WorkBill();
						workBill.setAttachbilltimes(0);
						workBill.setBuildtime(new Date());
						workBill.setCourier(courier);
						workBill.setOrder(order);
						workBill.setPickstate("新单");
						workBill.setRemark(order.getRemark());
						workBill.setSmsNumber("123");
						workBill.setType("新");
						//保存工单
						workBillDao.save(workBill);
						//调用短信平台,为快递员发送短信 -- 略
						// TODO
						return; //如果基于CRM地址库实现自动分单成立,则直接退出方法
					}
				}
				
			}
		}
		
		//5、如果以上两种方式都没有完成自动分单,转入人工调整
		order.setOrderType("人工分单");
		
	}

}

7、在后台项目bos_web中编写发布webService服务的配置

(1)、在web.xml中配置CXFServlet


(2)、在spring的核心配置文件中引入约束,并配置注册服务

	<!-- 注册订单服务 -->
	<jaxws:server id="orderService" address="/order">
		<jaxws:serviceBean>
			<ref bean="orderServiceImpl" />
		</jaxws:serviceBean>
	</jaxws:server>

8、生成CRM服务系统的客户端代码以及bos_management_web服务的客户端代码
9、前台系统中编写OrderAction中添加订单的方法

(1)、依赖domain项目

(2)、导入生成的订单服务代码并注册订单服务的客户端配置


	<!-- 注册订单服务的客户端代理对象,用于通过WebService访问订单服务 -->
	<jaxws:client id="orderClient" address="http://localhost:8080/bos_management_web/service/order"
				serviceClass="com.itheima.bos_fore.service.OrderService">
	</jaxws:client>

(3)、编写OrderAciton

package com.itheima.bos_fore.action.take_delivery;

import org.apache.commons.lang3.StringUtils;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import com.itheima.bos.domain.base.Area;
import com.itheima.bos.domain.take_delivery.Order;
import com.itheima.bos_fore.service.OrderService;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

/**
 * 订单业务的动作类
 * 
 * @author Administrator
 *
 */
@Controller
@Namespace("/")
@ParentPackage("struts-default")
@Scope("prototype")
public class OrderAction extends ActionSupport implements ModelDriven<Order> {

	private Order model = new Order();

	public Order getModel() {
		return model;
	}

	// 属性驱动,封装页面传递的发件人和收件人的地址信息
	private String recAreaInfo;
	private String sendAreaInfo;

	public void setRecAreaInfo(String recAreaInfo) {
		this.recAreaInfo = recAreaInfo;
	}

	public void setSendAreaInfo(String sendAreaInfo) {
		this.sendAreaInfo = sendAreaInfo;
	}

	// 注入订单服务的代理对象
	@Autowired
	private OrderService orderProxy;

	/**
	 * 保存订单,并实现自动分单功能
	 */
	@Action(value = "orderAction_add", results = { @Result(name = "success", type = "redirect", location = "/order-success.html") })
	public String add() {
		// 封装寄件人信息到model对象中
		if (StringUtils.isNotBlank(sendAreaInfo)) {
			String[] info = sendAreaInfo.split("/");
			String province = info[0];
			String city = info[1];
			String district = info[2];
			// 封装寄件人地址信息
			Area sendArea = new Area();
			sendArea.setProvince(province);
			sendArea.setCity(city);
			sendArea.setDistrict(district);
			model.setSendArea(sendArea);
		}

		// 封装收件人信息到model对象中
		if (StringUtils.isNotBlank(recAreaInfo)) {
			String[] info = recAreaInfo.split("/");
			String province = info[0];
			String city = info[1];
			String district = info[2];
			// 封装寄件人地址信息
			Area recArea = new Area();
			recArea.setProvince(province);
			recArea.setCity(city);
			recArea.setDistrict(district);
			model.setRecArea(recArea);
		}

		// 通过webService调用后台系统,保存订单信息
		orderProxy.saveOrder(model);
		return SUCCESS;
	}
}


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值