第一步:根據提供的 業務受理.pdm 文件生成建表文件 bos_qp.sql
第二步:因爲業務受理.pdm 文件中有僞表,因此咱們須要修改生成的建表文件,修改以下圖所示:javascript
qp_noticebill(業務通知單)、qp_workbill(工單)、qp_workordermanage(工做單)
,注意:因爲表的數量及表的關係增多,咱們要有意識的檢查生成的表中外鍵名是否有重複,有重複的咱們須要進行修改。
CustomerService接口:css
package cn.itcast.crm.service;
import java.util.List;
import cn.itcast.crm.domain.Customer;
// 客戶服務接口
public interface CustomerService {
// 未關聯定區客戶
public List<Customer> findnoassociationCustomers();
// 查詢已經關聯指定定區的客戶
public List<Customer> findhasassociationCustomers(String decidedZoneId);
// 將未關聯定區客戶關聯到定區上
public void assignCustomersToDecidedZone(Integer[] customerIds, String decidedZoneId);
// 根據手機號查詢客戶信息
public Customer findCustomerByTelephone(String telephone);
}
CustomerServiceImpl實現類:html
public Customer findCustomerByTelephone(String telephone) {
Session session = HibernateUtils.openSession();
session.beginTransaction();
String hql = "from Customer where telephone=?";
List<Customer> customers = session.createQuery(hql).setParameter(0, telephone).list();
session.getTransaction().commit();
session.close();
if (customers != null && customers.size() > 0) {
return customers.get(0);
}
return null;
}
注意:須要將crm中接口擴展的方法複製到bos的接口中
業務受理頁面:WEB-INF/pages/qupai/noticebill_add.jsp
第一步:爲手機號輸入框綁定離焦事件
,發送ajax請求,提交輸入的手機號到Action中,在Action中調用crm的代理對象,訪問crm服務,根據手機號查詢客戶信息,返回json數據前端
<td>來電號碼:</td>
<td>
<input type="text" class="easyui-validatebox" name="telephone" required="true"/>
<script type="text/javascript">
$(function() {
$("input[name=telephone]").blur(function() {
// alert("曉藝微信把我刪了,想o(╥﹏╥)o");
// 獲取輸入框的值(手機號)
var telephone = this.value;
// 發送ajax請求,帶上參數:手機號
var url = "${pageContext.request.contextPath}/noticebillAction_findCustomerByTelephone.action";
$.post(url, {"telephone":telephone}, function(data) {
alert(data);
}, 'json');
});
});
</script>
</td>
瀏覽器效果截圖以下:java
加註解、加註釋、繼承BaseAction<Noticebill>、配置struts.xml
package com.itheima.bos.web.action;
import java.io.IOException;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import com.itheima.bos.domain.Noticebill;
import com.itheima.bos.web.action.base.BaseAction;
import cn.itcast.crm.domain.Customer;
/**
* 業務通知單設置
* @author Bruce
*
*/
@Controller
@Scope("prototype")
public class NoticebillAction extends BaseAction<Noticebill> {
/**
* 調用代理對象,根據手機號查詢客戶信息
* @return
* @throws IOException
*/
public String findCustomerByTelephone() throws IOException {
Customer customer = remoteProxy.findCustomerByTelephone(model.getTelephone());
String[] excludes = new String[] {};
this.writeObject2Json(customer, excludes);
return "none";
// 注意:咱們發的是ajax請求,返回的是json數據,解析的也是json數據,因此返回的是"none"
// 若是返回的是"list",就是說咱們查詢到的結果變成HTML頁面,我用解析json數據的方式根本解析不出來啊!
}
}
第三步:完善頁面中ajax方法的回調函數jquery
<td>來電號碼:</td>
<td>
<input type="text" class="easyui-validatebox" name="telephone" required="true"/>
<script type="text/javascript">
$(function() {
$("input[name=telephone]").blur(function() {
// alert("曉藝微信把我刪了,想o(╥﹏╥)o");
// 獲取輸入框的值(手機號)
var telephone = this.value;
// 發送ajax請求,帶上參數:手機號
var url = "${pageContext.request.contextPath}/noticebillAction_findCustomerByTelephone.action";
$.post(url, {"telephone":telephone}, function(data) {
// alert(data);
if (data != null) {
// 查詢到客戶,能夠進行回顯
var customerId = data.id;
var customerName = data.name;
var customerAddress = data.address;
$("input[name=customerId]").val(customerId);
$("input[name=customerName]").val(customerName);
$("input[name=delegater]").val(customerName);
$("input[name=pickaddress]").val(customerAddress);
} else {
// 清除數據
var customerId = data.id;
var customerName = data.name;
var customerAddress = data.address;
$("input[name=customerId]").val("");
$("input[name=customerName]").val("");
$("input[name=delegater]").val("");
$("input[name=pickaddress]").val("");
}
}, 'json');
});
});
</script>
</td>
第四步:爲「新單」按鈕綁定保存事件web
<script type="text/javascript">
$(function() {
$("body").css({
visibility : "visible"
});
// 對save按鈕綁定點擊事件
$('#save').click(function() {
// 對form表單進行校驗
if ($('#noticebillForm').form('validate')) {
$('#noticebillForm').submit();
}
});
});
</script>
第五步:在NoticebillAction中提供add()方法,保存一個業務通知單數據,並根據取件地址嘗試自動分單,注入NoticebillService、加註解、加註釋、等等
NoticebillAction.javaajax
/**
* 保存業務通知單,並根據取件地址嘗試自動分單
* @return
*/
public String add() {
// 從session中獲取當前登陸用戶,即業務員(業務受理員)
User user = BOSContext.getLoginUser();
// 設置用戶
model.setUser(user);
noticebillService.save(model);
return "addUI";
}
第六步:在crm服務中擴展方法,根據取件地址查詢定區idspring
public String findDecidedzoneIdByPickaddress(String address) {
Session session = HibernateUtils.openSession();
session.beginTransaction();
String hql = "select decidedzone_id from Customer where address=?";
List<String> decidedzoneId = session.createQuery(hql).setParameter(0, address).list();
session.getTransaction().commit();
session.close();
if (decidedzoneId != null && decidedzoneId.size() > 0) {
return decidedzoneId.get(0);
}
return null;
}
第七步:在NoticebillService中提供save方法
NoticebillServiceImpl.javasql
package com.itheima.bos.service.impl;
import java.sql.Timestamp;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.itheima.bos.crm.CustomerService;
import com.itheima.bos.dao.IDecidedzoneDao;
import com.itheima.bos.dao.INoticebillDao;
import com.itheima.bos.dao.IWorkbillDao;
import com.itheima.bos.domain.Decidedzone;
import com.itheima.bos.domain.Noticebill;
import com.itheima.bos.domain.Staff;
import com.itheima.bos.domain.Workbill;
import com.itheima.bos.service.INoticebillService;
@Service
@Transactional
public class NoticebillServiceImpl implements INoticebillService {
// 注入業務通知單dao
@Autowired
private INoticebillDao noticebillDao;
// 注入遠程訪問的代理對象
@Autowired
private CustomerService remoteProxy;
// 注入定區dao
@Autowired
private IDecidedzoneDao decidedzoneDao;
// 注入工單dao
@Autowired
private IWorkbillDao workbillDao;
/**
* 保存業務通知單,並根據取件地址嘗試自動分單
*/
public void save(Noticebill model) {
// 先保存業務通知單(多個業務通知單屬於一個取派員)
noticebillDao.save(model); // 持久化對象
// 獲取取件地址
String pickaddress = model.getPickaddress();
// 根據取件地址查找定區id
String decidedzoneId = remoteProxy.findDecidedzoneIdByPickaddress(pickaddress);
if (decidedzoneId != null) {
// 查詢到定區id,能夠進行自動分單
Decidedzone decidedzone = decidedzoneDao.findById(decidedzoneId); // 持久化對象
// 獲取取派員
Staff staff = decidedzone.getStaff();
// 設置業務通知單關聯匹配到的取派員
model.setStaff(staff);
// 設置分單類型爲「自動分單」
model.setOrdertype("自動分單");
// 爲取派員建立一個工單並設置值
Workbill workbill = new Workbill();
workbill.setNoticebill(model); // 工單關聯業務通知單
workbill.setStaff(staff); // 工單關聯取派員
workbill.setType("新單");
workbill.setPickstate("未取件");
workbill.setBuildtime(new Timestamp(System.currentTimeMillis()));
workbill.setAttachbilltimes(0);
workbill.setRemark(model.getRemark());
// 保存工單
workbillDao.save(workbill);
// 調用短信平臺服務,給取派員發送短信
// ......
} else {
// 沒有查詢到定區id,設置分單類型爲「人工分單」(進入調度環節)
model.setOrdertype("人工分單");
// 調度
// ......
}
}
}
列(Column)屬性:數據網格(DataGrid) 的列(Column)是一個數組對象,它的每一個元素也是一個數組。元素數組的元素是一個配置對象,它定義了每一個列的字段。
數據網格的方法:
數據網格的事件:
示例代碼以下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>datagrid_edit---數據網格的編輯功能</title>
<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath }/js/easyui/themes/default/easyui.css">
<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath }/js/easyui/themes/icon.css">
<script type="text/javascript" src="${pageContext.request.contextPath }/js/jquery-1.8.3.js"></script>
<script type="text/javascript" src="${pageContext.request.contextPath }/js/easyui/jquery.easyui.min.js"></script>
<script type="text/javascript" src="${pageContext.request.contextPath }/js/easyui/locale/easyui-lang-zh_CN.js"></script>
</head>
<body>
<h3>方式三:經過js代碼,使用插件提供的API動態建立datagrid,大量使用</h3>
<table id="grid"></table>
<script type="text/javascript">
$(function() {
// 全局的行索引
var index;
$("#grid").datagrid({
columns:[[ // 定義標題行全部的列,是一個二維數組
{field:'id',title:'編號',checkbox:true}, // 是否複選框
{field:'name',title:'姓名',editor:{ // 指定當前列具備編輯功能
type:'validatebox',
options:{
}
}},
{field:'age',title:'年齡',editor:{ // 指定當前列具備編輯功能
type:'validatebox',
options:{
}
}}
]],
url:'/bos19/json/data.json', // 指定URL地址,datagrid控件會自動發送ajax請求獲取數據
onAfterEdit:function(rowIndex,rowData,changes) { // 數據網格的事件:當前行結束編輯狀態時觸發
alert("更新後的姓名爲:" + rowData.name);
},
toolbar:[ // 工具欄按鈕
{text:'保存',iconCls:'icon-save',handler:function() {
// 結束當前行的編輯狀態
$("#grid").datagrid("endEdit",index);
}},
{text:'添加',iconCls:'icon-add',handler:function() {
// 動態添加一行
$("#grid").datagrid("insertRow",{
index:0, // 在索引爲0的位置插入,即在第一行插入
row:{} // 空的json表示空行
});
// 讓第一行開啓編輯狀態
index = 0;
$("#grid").datagrid("beginEdit",index);
}},
{text:'刪除',iconCls:'icon-remove',handler:function() {
// 得到當前選中的行
var row = $("#grid").datagrid("getSelected");
// 獲取當前選中的行的索引
index = $("#grid").datagrid("getRowIndex",row);
// 刪除當前行
$("#grid").datagrid("deleteRow",index);
}},
{text:'修改',iconCls:'icon-edit',handler:function() {
// 得到當前選中的全部行
// $("#grid").datagrid("getSelections");
// 得到當前選中的行
var row = $("#grid").datagrid("getSelected");
// 獲取當前選中的行的索引
index = $("#grid").datagrid("getRowIndex",row);
// 開啓當前選中行的編輯狀態
$("#grid").datagrid("beginEdit",index);
}}
],
singleSelect:true, // 是否能夠單選
pagination:true, // 分頁條
pageList:[3,5,7] // 自定義分頁條中的下拉框選項
});
});
</script>
</body>
</html>
示例動圖以下:
第一步:在quickworkorder.jsp頁面中增長髮送ajax請求,提交當前結束編輯行的數據到服務器,完成保存操做的代碼,以下:
位置:/bos19/WebContent/WEB-INF/pages/qupai/quickworkorder.jsp
// 發送ajax請求,提交當前結束編輯行的數據到服務器,完成保存操做
var url = "${pageContext.request.contextPath}/workordermanageAction_add.action";
$.post(url,rowData,function(data) {
if (data == 1) {
// 工做單信息錄入成功
$.messager.alert("提示信息","工做單信息錄入成功!","warning");
} else {
// 工做單信息錄入失敗
$.messager.alert("提示信息","工做單信息錄入失敗!","warning");
}
});
第二步:建立新的WorkordermanageAction,提供add()方法,加註解、加註釋、繼承BaseAction<Workordermanage>、配置struts.xml、等等
package com.itheima.bos.web.action;
import java.io.IOException;
import org.apache.struts2.ServletActionContext;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import com.itheima.bos.domain.Workordermanage;
import com.itheima.bos.web.action.base.BaseAction;
/**
* 工做單設置
* @author Bruce
*
*/
@Controller
@Scope("prototype")
public class WorkordermanageAction extends BaseAction<Workordermanage> {
public String add() throws IOException {
String flag = "1";
try {
// 工做單信息錄入成功
workordermanageService.save(model);
} catch (Exception e) {
// 工做單信息錄入失敗
flag = "0";
}
// 響應給瀏覽器一個狀態碼,這種手法經常使用
ServletActionContext.getResponse().setContentType("text/html;charset=UTF-8");
ServletActionContext.getResponse().getWriter().print(flag);
return "none"; }}