Crm项目总结
营销模块-机会数据管理
机会数据管理业务场景
为了提高客户购买公司产品的几率,对于客户的咨询需求(新产品 ,新客户转型),系统将该数据录入到数据库,后续对客户进行开发操作,录入的每一条数据成为机会数据,这些数据后续都有可能给公司产生效益。
机会数据管理表结构
这里机会数据管理主要维护主表 t_sale_chance (营销机会表)
机会管理模块功能实现
机会管理模块实现效果图
机会数据展示
机会数据添加
机会数据更新
机会数据删除
机会数据管理数据查询实现
前端EasyUI 表格数据Json格式
后端机会数据查询接口实现
SaleChanceMapper.Java & SaleChanceMapper.xml
- SaleChanceMapper.xml
<select id="selectByParams" parameterType="com.shsxt.crm.query.SaleChanceQuery" resultType="com.shsxt.crm.vo.SaleChance">
select <include refid="Base_Column_List"/>
from t_sale_chance
<where>
is_valid=1
<if test="null!=customerName and customerName !='' ">
and customer_name like concat('%',#{customerName},'%')
</if>
<if test="null !=createMan and createMan !=''">
and create_man=#{createMan}
</if>
<if test="null !=state and state !=''">
and state =#{state}
</if>
</where>
</select>
- SaleChanceMapper.java
public interface SaleChanceMapper extends BaseMapper<SaleChance,Integer>{
}
这里SaleChanceMapper 继承BaseMapper 接口,BaseMapper 接口中定义了基本的CRUD方法
SaleChanceService.java
提供多提交查询方法 方法返回Map 包含 total ,rows
@Service
public class SaleChanceService extends BaseService<SaleChance, Integer> {
public Map<String, Object> querySaleChancesByParams(SaleChanceQuery saleChanceQuery) {
Map<String, Object> result = new HashMap<String, Object>();
PageHelper.startPage(saleChanceQuery.getPage(), saleChanceQuery.getRows());
PageInfo<SaleChance> pageInfo = new PageInfo<>(selectByParams(saleChanceQuery));
result.put("total", pageInfo.getTotal());
result.put("rows", pageInfo.getList());
return result;
}
}
SaleChanceController.java
@Controller
@RequestMapping("sale_chance")
public class SaleChanceController extends BaseController {
@Resource
private SaleChanceService saleChanceService;
@RequestMapping("list")
@ResponseBody
public Map<String,Object> querySaleChancesByParams(SaleChanceQuery saleChanceQuery){
return saleChanceService.querySaleChancesByParams(saleChanceQuery);
}
- SaleChanceQuery 查询条件
public class SaleChanceQuery extends BaseQuery {
// 客户名
private String customerName;
// 创建人
private String createMan;
// 分配状态
private String state;
}
public class BaseQuery {
private Integer page=1;
private Integer rows=10;
}
机会数据查询前端实现
机会数据视图模板定义
<table id="dg" title="销售机会信息管理" class="easyui-datagrid"
fitColumns="true" pagination="true" rownumbers="true"
url="${ctx}/sale_chance/list" fit="true" toolbar="#tb">
<thead>
<tr>
<th field="cb" checkbox="true" align="center"></th>
<th field="id" width="50" align="center">编号</th>
<th field="chanceSource" width="200" align="center">机会来源</th>
<th field="customerName" width="50" align="center">客户名称</th>
<th field="cgjl" width="50" align="center">成功几率</th>
<th field="overview" width="200" align="center">概要</th>
<th field="linkMan" width="100" align="center">联系人</th>
<th field="linkPhone" width="100" align="center">联系电话</th>
<th field="description" width="200" align="center">机会描述</th>
<th field="createMan" width="100" align="center">创建人</th>
<th field="createDate" width="100" align="center">创建时间</th>
<th field="assignMan" width="200" align="center">指派人</th>
<th field="assignTime" width="200" align="center">指派时间</th>
<th field="state" width="100" align="center" formatter="formatterState">状态</th>
<th field="devResult" width="200" align="center" formatter="formatterDevResult">客户开发状态</th>
</tr>
</thead>
</table>
<div id="tb">
<div>
<a href="javascript:openSaleChanceAddDialog()" class="easyui-linkbutton" iconCls="icon-add"
plain="true">创建</a>
<a href="javascript:openSaleChanceModifyDialog()" class="easyui-linkbutton" iconCls="icon-edit"
plain="true">修改</a>
<a href="javascript:deleteSaleChance()" class="easyui-linkbutton" iconCls="icon-remove"
plain="true">删除</a>
</div>
<div>
客户名称: <input type="text" id="s_customerName" size="20"
onkeydown="if(event.keyCode==13) searchSaleChance()"/>
创建人: <input type="text" id="s_createMan" size="20"
onkeydown="if(event.keyCode==13) searchSaleChance()"/>
分配状态: <select class="easyui-combobox" id="s_state" editable="false" panelHeight="auto">
<option value="">请选择...</option>
<option value="0">未分配</option>
<option value="1">已分配</option>
</select>
<a href="javascript:searchSaleChance()" class="easyui-linkbutton" iconCls="icon-search"
plain="true">搜索</a>
</div>
- 列格式化
/*
分配状态格式化
*/
function formatterState(value) {
/**
* 0-未分配
* 1-已分配
*/
if(value==0){
return "未分配";
}else if(value==1){
return "已分配";
}else{
return "未知";
}
}
/*
开发状态格式化
*/
function formatterDevResult(value) {
/**
* 0-未开发
* 1-开发中
* 2-开发成功
* 3-开发失败
*/
if(value==0){
return "未开发";
}else if(value==1){
return "开发中";
}else if(value==2){
return "开发成功";
}else if(value==3){
return "开发失败";
}else {
return "未知"
}
}
机会数据管理查询事件添加
function searchSaleChance() {
var customerName=$("#s_customerName").val();
var createMan = $("#s_createMan").val();
var state =$("#s_state").combobox("getValue");
$("#dg").datagrid("load",{
customerName:customerName,
createMan:createMan,
state:state
})
}
机会据管理数据添加实现
机会数据添加思路
/**
* 1.参数校验
* customerName:非空
* linkMan:非空
* linkPhone:非空 11位手机号
* 2.设置相关参数默认值
* state:默认未分配 如果选择分配人 state 为已分配
* assignTime:如果 如果选择分配人 时间为当前系统时间
* devResult:默认未开发 如果选择分配人 devResult为开发中
* isValid :默认有效
* createDate updateDate:默认当前系统时间
* 3.执行添加 判断结果
*/
机会数据后端添加代码实现
- SaleChanceService.java
public void saveSaleChance(SaleChance saleChance) {
checkParams(saleChance.getCustomerName(), saleChance.getLinkMan(), saleChance.getLinkPhone());
saleChance.setState(StateStatus.UNSTATE.getType());
saleChance.setDevResult(DevResult.UNDEV.getStatus());
if(StringUtils.isNotBlank(saleChance.getAssignMan())){
saleChance.setState(StateStatus.STATED.getType());
saleChance.setDevResult(DevResult.DEVING.getStatus());
saleChance.setAssignTime(new Date());
}
saleChance.setIsValid(1);
saleChance.setCreateDate(new Date());
saleChance.setUpdateDate(new Date());
AssertUtil.isTrue(insertSelective(saleChance)<1,"机会数据添加失败!");
}
private void checkParams(String customerName, String linkMan, String linkPhone) {
AssertUtil.isTrue(StringUtils.isBlank(customerName),"请输入客户名!");
AssertUtil.isTrue(StringUtils.isBlank(linkMan),"请输入联系人!");
AssertUtil.isTrue(StringUtils.isBlank(linkPhone),"请输入联系电话!");
AssertUtil.isTrue(!(PhoneUtil.isMobile(linkPhone)),"手机号格式不合法!");
}
- SaleChanceController.java
@RequestMapping("save")
@ResponseBody
public ResultInfo saveSaleChance(SaleChance saleChance){
saleChance.setCreateMan(userService.selectByPrimaryKey(LoginUserUtil.releaseUserIdFromCookie(request)).getTrueName());
saleChanceService.saveSaleChance(saleChance);
return success("机会数据添加成功");
}
机会数据管理添加前端实现
添加对话框表单&事件定义
- 添加表单
<div id="dlg" class="easyui-dialog" style="width:700px;height:400px;padding: 10px 20px"
closed="true" buttons="#dlg-buttons">
<form id="fm" method="post">
<table cellspacing="8px">
<tr>
<td>客户名称:</td>
<td><input type="text" id="customerName" name="customerName" class="easyui-validatebox"
required="true"/> <font color="red">*</font></td>
<td></td>
<td>机会来源</td>
<td><input type="text" id="chanceSource" name="chanceSource"/></td>
</tr>
<tr>
<td>联系人:</td>
<td><input type="text" id="linkMan" name="linkMan" class="easyui-validatebox" required="true"/> <font
color="red">*</font></td>
<td></td>
<td>联系电话:</td>
<td><input type="text" id="linkPhone" name="linkPhone" class="easyui-validatebox" required="true"/><font
color="red">*</font></td>
</tr>
<tr>
<td>成功几率(%):</td>
<td><input type="text" id="cgjl" name="cgjl"/></td>
<td colspan="3"></td>
</tr>
<tr>
<td>概要:</td>
<td colspan="4"><input type="text" id="overview" name="overview" style="width: 420px"/></td>
</tr>
<tr>
<td>机会描述:</td>
<td colspan="4">
<textarea rows="5" cols="50" id="description" name="description"></textarea>
</td>
</tr>
<tr>
<td>指派给:</td>
<td><input class="easyui-combobox" id="assignMan" name="assignMan"
data-options="panelHeight:'auto',editable:false,valueField:'trueName',textField:'trueName',url:'${ctx}/user/queryCustomerManager.do'"/>
</td>
</tr>
</table>
<input name="id" type="hidden"/>
</form>
</div>
<div id="dlg-buttons">
<a href="javascript:saveOrUpdateSaleChance()" class="easyui-linkbutton" iconCls="icon-ok">保存</a>
<a href="javascript:closeSaleChanceDialog()" class="easyui-linkbutton" iconCls="icon-cancel">关闭</a>
</div>
- 添加按钮点击事件
function openSaleChanceAddDialog() {
$("#dlg").dialog("open").dialog("setTitle","机会数据添加");
}
添加表单提交核心代码
function closeSaleChanceDialog() {
$("#dlg").dialog("close");
}
/**
* 清空表单信息
*/
function clearFormData() {
$("#customerName").val("");
$("#chanceSource").val("");
$("#linkMan").val("");
$("#linkPhone").val("");
$("#cgjl").val("");
$("#overview").val("");
$("#assignMan").combobox("setValue","");
$("input[name='id']").val("");
}
function saveOrUpdateSaleChance() {
var url = ctx+"/sale_chance/save";
if(!(isEmpty($("input[name='id']").val()))){
url = ctx+"/sale_chance/update";
}
$("#fm").form("submit",{
url:url,
onSubmit:function () {
return $("#fm").form("validate");
},
success:function (data) {
data =JSON.parse(data);
if(data.code==200) {
closeSaleChanceDialog();
searchSaleChance();
clearFormData();
}
}
})
}
机会数据管理数据更新
思路书写参考添加操作
机会数据管理数据删除操作
机会数据删除后端实现
- SaleChanceController.java
@RequestMapping("delete")
@ResponseBody
public ResultInfo deleteSaleChance(Integer[] ids){
saleChanceService.deleteBatch(ids);
return success("机会数据删除成功");
}
- SaleChanceMapper.xml
<update id="deleteBatch">
update t_sale_chance
set is_valid=0
where id in
<foreach collection="array" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</update>
机会数据删除后端实现
添加删除按钮点击事件
function deleteSaleChance() {
var rows=$("#dg").datagrid("getSelections");
if(rows.length==0){
$.messager.alert("来自crm","请选择待修改的机会数据!","error");
return;
}
$.messager.confirm("来自crm","确定删除选中的记录?",function (r) {
if(r){
var ids= "ids=";
for(var i=0;i<rows.length;i++){
if(i<rows.length-1){
ids=ids+rows[i].id+"&ids=";
}else {
ids=ids+rows[i].id
}
}
$.ajax({
type:"post",
url:ctx+"/sale_chance/delete",
data:ids,
dataType:"json",
success:function (data) {
if(data.code==200){
searchSaleChance();
}else{
$.messager.alert("来自crm",data.msg,"error");
}
}
})
}
})
}
}
$.ajax({
type:"post",
url:ctx+"/sale_chance/delete",
data:ids,
dataType:"json",
success:function (data) {
if(data.code==200){
searchSaleChance();
}else{
$.messager.alert("来自crm",data.msg,"error");
}
}
})
}
})