项目一:第九天 1、前台客户登录 2、Jquery citypicker省市区三级联动插件 4、业务受理(在线下单)
1、 前台客户登录
2、 Jquery citypicker省市区三级联动插件
3、 百度地图介绍
4、 业务受理(在线下单)
1 实现前台系统登录功能
1.1 Md5加密
admin(明文)---------Md5加密---------à(密文) 21232f297a57a5a743894a0e4a801fc3;
MD5加密算法公开,不可逆。
注册:将用户密码加密为 密文。在数据库中存密文
登陆:将用户输入明文加密 ,比对密文是否一致
1.2 前台系统页面调整
1、增加form的Action请求地址 ,修改表单Id
2、方式一:提交表单 注意:需要在action中配置结果视图


3、方式二:给登录按钮绑定点击事件,在单击后提交表单:ajax请求方式提交。 不需要结果视图
<script type="text/javascript">
//将表单中输入项(必须有name) 序列化为json对象
$.fn.serializeJson=function(){
var serializeObj={};
var array=this.serializeArray();
var str=this.serialize();
$(array).each(function(){
if(serializeObj[this.name]){
if($.isArray(serializeObj[this.name])){
serializeObj[this.name].push(this.value);
}else{
serializeObj[this.name]=[serializeObj[this.name],this.value];
}
}else{
serializeObj[this.name]=this.value;
}
});
return serializeObj;
};


1.3 CRM中扩展登陆方法
Service:

Dao:

重新发布服务,生成本地调用代码:
1.4 前台实现登陆
页面代码:

服务端代码:


2 JQuery citypicker省市区三级联动插件
引入文件:
<link rel="stylesheet" type="text/css" href="../plugins/city-picker.css">
<script src="../plugins/jquery.min.js"></script><!-- jQuery is required -->
<script src="../plugins/city-picker.data.js"></script>
<script src="../plugins/city-picker.js"></script>
1.1 Demo案例
<body>
<!-- html方式创建 -->
<div style="position: relative;">
<!-- container data-toggle:初始化省市区插件 -->
<input readonly type="text" data-toggle="city-picker">
</div>
<hr>
<!-- 通过js代码创建 -->
<div style="position: relative;">
<!-- container data-toggle:初始化省市区插件 提交值:北京市/北京市/昌平区 -->
<input id="city" readonly type="text" name="sendAreaInfo">
<script type="text/javascript">
$(function(){
//创建citypicker
$("#city").citypicker();
//调用citypicker的方法
$("#restBtn").click(function(){
$("#city").citypicker("reset");
})
$("#initBtn").click(function(){
$("#city").citypicker("reset");
$("#city").citypicker("destroy");
//指定为某个省市区
$("#city").citypicker({
province:"北京市",
city:"北京市",
district:"昌平区"
});
})
})
</script>
</div>
<input type="button" value="重置" id="restBtn">
<input type="button" value="初始化" id="initBtn">
</body>
1 业务受理需求
注要:通过客户提交信息自动找到快递员上门取件。

1、客户通过打电话,网络(前台系统)提交物流委托信息(寄件人地址,电话)到后台管理系统,后台管理系统会将客户物流委托信息保存到数据库中,这个物流委托信息称为:订单 Order
2、后台管理保存完订单数据后,系统根据取件地址自动匹配到快递员,系统会给快递员产生取件任务,系统会给快递员发送一条短信。。这个取件任务称为:工单 WorkBill。
3、快递员根据短信中取件信息上门取件,快递员会给客户提供纸质单据(快递单),填写详细信息(寄件人的信息,收件人信息,物流单号信息)。快递员将客户货物取回网点后,工作人员会将物流单详细信息录入后台系统。这个物流单信息称为:运单 WayBill;
2 引入实体



3 业务受
理-尝试自动分单(重点)
自动分单:系统自动找到快递员,通知快递员上门取件。

第一步:在bos系统中搭建CXF服务端环境,提供保存订单方法供前台系统调用
第二步:在前台系统订单页面中:封装订单对象,调用bos中提供保存订单方法
第三步:完善bos中保存订单方法
**通过两种策略尝试完成自动分单
**完成取派对象之间关联
**给快递员产生取件任务,发送短信
完成自动分单。
3.1 后台管理系统搭建CXF服务端环境
1、 web.xml中配置CXFServlet
<!-- cxfServlet 处理cxf客户端请求 -->
<servlet>
<servlet-name>cxf</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>cxf</servlet-name>
<url-pattern>/service/*</url-pattern>
</servlet-mapping>
2、 提供cxf配置文件(引入javxws名称空间)
3、 创建服务接口,实现类,在接口上使用注解@WebService

4、 在后台管理系统spring配置文件中配置CXF服务对象

5、 启动项目,进行测试
访问可用服务url,被struts2过滤器拦截到

6、 解决方案:strtus2框架处理.action 结尾请求

7、 重新启动项目:访问可用服务

3.2 前台系统调用后台管理系统保存订单
1、 生成前台系统调用代码
http://localhost:8080/bos_management_web/service/order?wsdl
2、 在前台关联系统中添加bos_managerment_domain依赖:同样的实体不能存在两份,保证有一个实体

3、 前台order.html中,使用citypicker插件,百度地图地址补全


4、 提交订单数据


5、 在OrderAction中调用后台管理系统,在前台系统spring配置文件配置客户端调用对象


配置远程调用代理对象:

1.1 完善后台管理系统保存订单方法:尝试自动分单
自动分单:系统自动匹配到快递员。
1.1.1 完善保存订单

1.1.2 策略一:根据客户详细地址找定区ID:完成自动分单(不会使用)

1.1.2.1 在CRM扩展方法:根据地址查询定区ID
Service:

Dao:

重新发布CRM服务,生成后台管理系统调用代码。
1.1.2.2 在后台调用CRM完成自动分单
/**
* @Description: 1、保存订单 2、尝试自动分单
* @return
*/
public void save(Order order) {
System.out.println("服务端保存订单方法被调用");
order.setOrderTime(new Date());
order.setOrderNum(UUID.randomUUID().toString());
//在前台系统中订单中封装区域对象,区域对象状态:瞬时态 问题:order对象引用瞬时态区域对象
//解决:方式一将区域对象置为null order.setRecArea(null); 将来订单表中区域id无值
//方式二:根据省市区查询区域对象(持久态)
Area sendArea = order.getSendArea();
sendArea = areaDao.findByProvinceAndCityAndDistrict(sendArea.getProvince(), sendArea.getCity(), sendArea.getDistrict());
Area recArea = order.getRecArea();
recArea = areaDao.findByProvinceAndCityAndDistrict(sendArea.getProvince(), sendArea.getCity(), sendArea.getDistrict());
order.setSendArea(sendArea);
order.setRecArea(recArea);
orderDao.save(order);
//尝试自动分单-两种策略
//根据寄件人详细地址 去 CRM中查询该地址对应定区ID
String fixedAreaId = customerProxy.findFixedAreaIdByAddress(order.getSendAddress());
if(StringUtils.isNotBlank(fixedAreaId)){
//查询定区对象
FixedArea fixedArea = fixedAreaDao.findOne(fixedAreaId);
if(fixedArea!=null){
//定区-快递员:多对多
Set<Courier> couriers = fixedArea.getCouriers();
//TODO 简化操作 判断上班时间 取件任务数量
for (Courier courier : couriers) {
//完成自动分单-1、产生快递员工单 2、发送取件短信
WorkBill workBill = new WorkBill();
workBill.setAttachbilltimes(0);//追单次数
workBill.setBuildtime(new Date());//工单时间
workBill.setCourier(courier); //工单关联快递员
workBill.setOrder(order); //工单关联订单
workBill.setPickstate("待取件");
workBill.setRemark(order.getRemark());
workBill.setType("新单");
workBillDao.save(workBill);
Map<String, Object> map = new HashMap<>();
map.put("customerAddress", order.getSendAddress());
map.put("customerName", order.getSendName());
map.put("customerTelephone", order.getSendMobile());
map.put("customerRemark", order.getSendMobileMsg());
//发送短信
Boolean flag = AliSmsUtil.sendMessage(courier.getTelephone(), "SMS_121136520", map);
workBill.setSmsNumber(flag.toString());
//自动分单
order.setOrderType("自动分单");
order.setStatus("待取件");
order.setCourier(courier); //订单关联快递员
return;
}
}
}
//策略二尝试自动分单
//人工分单
order.setOrderType("人工分单");
}
1.1.3 策略二:根据客户取件地址解析完成自动分单

//策略二:根据客户地址解析
if(sendArea!=null){
//根据省市区查询到持久态区域对象
Area area = areaDao.findByProvinceAndCityAndDistrict(sendArea.getProvince(), sendArea.getCity(), sendArea.getDistrict());
if(area!=null){
//查询当前区域下分区列表
Set<SubArea> subareas = area.getSubareas();
for (SubArea subArea : subareas) {
if(order.getSendAddress().contains(subArea.getKeyWords()) ||
order.getSendAddress().contains(subArea.getAssistKeyWords())){
//找到所在分区 分区:定区 多对一
FixedArea fixedArea = subArea.getFixedArea();
if(fixedArea!=null){
Set<Courier> couriers = fixedArea.getCouriers();
//找定区下快递员:根据快递员上上班时间点:参考资料中时间工具类:判断快递员是否在上班时间
for (Courier courier : couriers) {
if(courier!=null){
//给快递员创建工单
WorkBill workBill = new WorkBill();
workBill.setAttachbilltimes(0); //追单次数
workBill.setBuildtime(new Date());
workBill.setCourier(courier); //工单关联快递员
workBill.setPickstate("未取件");
workBill.setRemark(order.getRemark());
workBill.setType("新单");
workBill.setOrder(order); //工单关联订单
workBillDao.save(workBill); //保存工单
//给快递员发送短信 TODO 后期发短信使用activeMQ实现
String msg="【新单】新单到达,请及时取件。取件地址:"+order.getSendAddress()+",客户电话:"+order.getTelephone()+",备注:"+order.getSendMobileMsg();
String ret = SmsUtils.sendSmsByWebService(courier.getTelephone(), msg);
workBill.setSmsNumber(ret);
//完成自动分单
order.setCourier(courier);
order.setStatus("待取件");
order.setOrderType("自动分单");
break;
}
}
}
}
}
}
}else{
order.setOrderType("人工分单"); //需要客户人员在后台管理系统中进行人工分配: 调度---人工调度
项目一:第九天 1、前台客户登录 2、Jquery citypicker省市区三级联动插件 4、业务受理(在线下单)的更多相关文章
- Asp.Net Core 2.0 项目实战(10) 基于cookie登录授权认证并实现前台会员、后台管理员同时登录
1.登录的实现 登录功能实现起来有哪些常用的方式,大家首先想到的肯定是cookie或session或cookie+session,当然还有其他模式,今天主要探讨一下在Asp.net core 2.0下 ...
- 项目一:在线下单(补充) activeMQ使用(重点) 重构客户注册功能,发短信功能分离
1 课程计划 1.在线下单(补充) 2.activeMQ使用(重点) n 简介和安装 n activeMQ入门案例 n spring整合activeMQ应用 3.重构客户注册功能,发短信功能分离 n ...
- ASP.NET MVC搭建项目后台UI框架—6、客户管理(添加、修改、查询、分页)
目录 ASP.NET MVC搭建项目后台UI框架—1.后台主框架 ASP.NET MVC搭建项目后台UI框架—2.菜单特效 ASP.NET MVC搭建项目后台UI框架—3.面板折叠和展开 ASP.NE ...
- phpcms前台退出登录的时候提示信息'退出成功0'
问题背景: phpcms前台退出登录的时候,提示了一个退出成功0 让我很困惑为啥有个0呢? 问题分析: 进入 ./phpcms/modules/member/index.php 找到logout方法, ...
- Django商城项目笔记No.12用户部分-QQ登录2获取QQ用户openid
Django商城项目笔记No.12用户部分-QQ登录2获取QQ用户openid 上一步获取QQ登录网址之后,测试登录之后本该跳转到这个界面 但是报错了: 新建oauth_callback.html & ...
- Django商城项目笔记No.11用户部分-QQ登录1获取QQ登录网址
Django商城项目笔记No.11用户部分-QQ登录 QQ登录,亦即我们所说的第三方登录,是指用户可以不在本项目中输入密码,而直接通过第三方的验证,成功登录本项目. 若想实现QQ登录,需要成为QQ互联 ...
- vue大型电商项目尚品汇(前台篇)day04
这几天一直都在做项目,只是没有上传上来,即将把前台项目完结了.现在开始更新整个前台的部分 一.面包屑处理 1.分类操作 点击三级联动进入搜索产生面包屑,直接取参数中的name即可 点击x怎么干掉这个面 ...
- vue大型电商项目尚品汇(前台篇)day02
现在正式回归,开始好好做项目了,正好这一个项目也开始慢慢的开始起色了,前面的准备工作都做的差不多了. 而且我现在也开始慢慢了解到了一些项目才开始需要的一些什么东西了,vuex.router这些都是必备 ...
- JAVAEE——BOS物流项目09:业务受理需求分析、创建表、实现自动分单、数据表格编辑功能使用方法和工作单快速录入
1 学习计划 1.业务受理需求分析 n 业务通知单 n 工单 n 工作单 2.创建业务受理环节的数据表 n 业务通知单 n 工单 n 工作单 3.实现业务受理自动分单 n 在CRM服务端扩展方法根据手 ...
随机推荐
- element-ui中tabs页设置第一个页面不可关闭
element官网中,有说明添加这个属性,默认为false,但是这个是一个单属性,似乎没法赋值. 这个用css就行了嘛,没必要搞得那么复杂,也不需要设置close属性,按照官网的示例文档即可.css设 ...
- ES6 类(Class)基本用法和静态属性+方法详解
原文地址:http://blog.csdn.net/pcaxb/article/details/53759637 ES6 类(Class)基本用法和静态属性+方法详解 JavaScript语言的传统方 ...
- 【新手专属】IntelliJ IDEA删除项目
这两天刚从Eclipse转手IDEA,每次都是直接删项目文件,后来百度一下才明白原来应该这样~~~ IntelliJ IDEA 删除项目,共三步: 第一步:记住当前项目文件路径1,然后点击file-- ...
- hdoj-1031-Design T-Shirt
题目链接 /* 两次排序,搞定 */ #include <cstring> #include <iostream> #include <algorithm> usi ...
- mysql数据库优化。(强力推荐)
本文转自:https://m.aliyun.com/yunqi/articles/38809 一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架构才逐渐完善 ...
- Android 禁止屏幕旋转、避免转屏时重启Activity
一.禁止屏幕旋转 在AndroidManifest.xml的每一个需要禁止转向的Activity配置中加入android:screenOrientation属性: 可选项: landscape = 横 ...
- SQL Server 学习系列之五
SQL Server 学习系列之五 SQL Server 学习系列之一(薪酬方案+基础) SQL Server 学习系列之二(日期格式问题) SQL Server 学习系列之三(SQL 关键字) SQ ...
- Wireshark图解教程(简介、抓包、过滤器)【转载】
原文网址:http://blog.sina.com.cn/s/blog_5d527ff00100dwph.html Wireshark是世界上最流行的网络分析工具.这个强大的工具可以捕捉网络中的数据, ...
- Linux 终端 忽略大小写
忘了在哪里看到的了,记录一下. 在-/.inputrc中加入一行 set completion-ignore-case on 搞定! 这样在终端输入.补全时就忽略大小写了.当然,Linux本身还是区分 ...
- mysql 替换语句
将cdb_pms表subject字段中的Welcom to替换成 欢迎光临 UPDATE `cdb_pms` SET `subject` = REPLACE(`subject`, 'Welcome t ...