crm添加营销机会
思路分析:
1.service接口调用dao层方法
2.sevice实现类继承接口方法
3.控制层调用service层方法返回baseresult
1.service层接口
package com.shsxt.crm.sales.service;
import com.shsxt.crm.base.BaseService;
import com.shsxt.crm.sales.pojo.SaleChance;
/**
* 营销机会管理service
*/
public abstract class SaleChanceService extends BaseService<SaleChance> {
/**
* 添加或修改营销机会
*
* @param saleChance
* @param userId
*/
public abstract void saveOrUpdateSaleChance(SaleChance saleChance, Integer userId);
}
2.sevice实现类继承接口方法
package com.shsxt.crm.sales.service.impl;
import com.shsxt.crm.base.constants.CrmConstants;
import com.shsxt.crm.base.util.AssertUtil;
import com.shsxt.crm.sales.dao.SaleChanceMapper;
import com.shsxt.crm.sales.pojo.SaleChance;
import com.shsxt.crm.sales.service.SaleChanceService;
import com.shsxt.crm.system.pojo.User;
import com.shsxt.crm.system.service.UserServiceI;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
/**
* 营销机会管理service实现
* Created by Administrator on 2019/8/29.
*/
@Service
public class SaleChanceServiceImpl extends SaleChanceService {
@Autowired
private SaleChanceMapper saleChanceMapper;
@Autowired
private UserServiceI userServiceI;
/**
* 添加或修改营销机会管理
*
* @param saleChance
* @param userId
*/
@Override
public void saveOrUpdateSaleChance(SaleChance saleChance, Integer userId) {
//校验参数
AssertUtil.isTrue(StringUtils.isBlank(saleChance.getCustomerName()), "客户空");
AssertUtil.isTrue(StringUtils.isBlank(saleChance.getLinkMan()), "联系人能为空");
AssertUtil.isTrue(StringUtils.isBlank(saleChance.getLinkPhone()), "电话为空");
//先判断是否有分配人
String assignMan = saleChance.getAssignMan();
if (StringUtils.isNotBlank(assignMan)){
saleChance.setState(1);//1代表以分配
saleChance.setAssignTime(new Date());//分配时间
}else{
saleChance.setState(0);//0代表未分配
}
User user=userServiceI.selectUserById(userId);
//判断
AssertUtil.isNotLogin(null==user);
saleChance.setCreateMan(user.getUserName());//创建人
saleChance.setCreateDate(new Date());
saleChance.setUpdateDate(new Date());
//添加营销机会
AssertUtil.isTrue(saleChanceMapper.save(saleChance<1,
CrmConstants.OPS_FAILED_MESSAGE);
}
}
3.控制层
package com.shsxt.crm.sales.controller;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.shsxt.crm.base.BaseController;
import com.shsxt.crm.base.BaseResult;
import com.shsxt.crm.base.util.Base64Util;
import com.shsxt.crm.base.util.CookieUtil;
import com.shsxt.crm.sales.pojo.SaleChance;
import com.shsxt.crm.sales.query.SaleChanceQuery;
import com.shsxt.crm.sales.service.SaleChanceService;
import org.omg.CORBA.Request;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import java.util.Map;
/**
* 营销机会Contoller
* Created by Administrator on 2019/8/29.
*/
@Controller
@RequestMapping("/saleChance")
public class SaleChanceController extends BaseController {
@Autowired
private SaleChanceService saleChanceService;
/**
* 跳转页面
*
* @return
*/
@RequestMapping("/index")
public String index() {
return "sale_chance";
}
/**
* 分页查询营销机会
*
* @param query
* @return
*/
@RequestMapping("/selectSaleChanceByParams")
@ResponseBody
public Map<String, Object> selectSaleChanceByParams(SaleChanceQuery query,
@RequestParam(defaultValue = "1") Integer page,
@RequestParam(defaultValue = "10") Integer rows) {
query.setPageNum(page);
query.setPageSize(rows);
return saleChanceService.selectForPage(query);
}
/**
* 添加或修改营销机会
*
* @param saleChance
* @return
*/
@RequestMapping("/saveOrUpdateSaleChance")
@ResponseBody
public BaseResult saveOrUpdateSaleChance(SaleChance saleChance, HttpServletRequest request) {
//获取cookie中的用户id信息
String userIdStr = CookieUtil.getCookieValue(request, "userIdStr");
//用户id解密
Integer userId= Integer.valueOf(Base64Util.decoder(userIdStr));
//添加或修改
saleChanceService.saveOrUpdateSaleChance(saleChance, userId);
return BaseResult.success();
}
}
页面操作sale_chance.js
//格式化的处理(分配状态)
function formatterState(value,row,index){
if(0==value){
return"未分配";
}
if(1==value){
return"已分配";
}
}
//客户开发状态
function formatterDevResult(value,row,index){
if(0==value){
return"未开发";
}
if(1==value){
return"开发中";
}
if(2==value){
return"开发成功";
}
if(3==value){
return"开发失败";
}
}
//进入页面执行,根据开发状态返回不同的颜色
$(function () {
$('#dg').datagrid({
rowStyler: function (index, row) {
// 获取开发状态字段的值
var devResult = row.devResult;
if (0 == devResult) {
return "background-color:#5bc0de;"; // 蓝色
} else if (1 == devResult) {
return "background-color:#f0ad4e;"; // 黄色
} else if (2 == devResult) {
return "background-color:#5cb85c;"; // 绿色
} else if (3 == devResult) {
return "background-color:#d9534f;"; // 红色
}
}
});
});
//搜索
function querySaleChancesByParams() {
$('#dg').datagrid('load', {
customerName: $('#customerName').val(),
state: $('#state').combobox('getValue'),
devResult: $('#devResult').combobox('getValue'),
createDate: $('#time').datebox('getValue')
});
}
//打开添加对话框
function openAddSaleChacneDialog(){
//清空表单
$("#fm").form("clear");
$("#dlg").dialog("open");
}
//关闭对话框
function closeDlg() {
$("#dlg").dialog("close");
}
//添加或修改营销机会
function saveOrUpdateSaleChance() {
$('#fm').form('submit', {
url: ctx + '/saleChance/saveOrUpdateSaleChance',
onSubmit: function () {
return $(this).form('validate');
},
success: function (data) {
//返回的是json格式的字符串,转成json
var result=JSON.parse(data);
$.messager.show({
title: '系统提示',
msg: result.message,
timeout: 2000,
showType: 'slide'
});
if (200 == result.code) {
$("#fm").form("clear"); // 清空表单
$("#dlg").dialog("close");// 关闭对话框
$('#dg').datagrid('load');// 重新加载表单
}
}
})
}
要点:处理分配人(只有客户经理这个角色才可以当分配人)
分配人从数据库中抓取数据,返回到前台选择,
分析:1.sql,3表联查,查出用户角色(用户表,角色表,中间表用户角色表)
select
u.id,
u.true_name trueName
from
t_user u
left join t_user_role ur on u.id=ur.user_id
left join t_role r on r.id=ur.role_id
where
r.role_name='客户经理'
2.在用户模块里操作UserMapper.xml
<!--查询所有客户经理-->
<select id="selectCustomerLists" resultType="map">
select
u.id,
u.true_name trueName
from
t_user u
left join t_user_role ur on u.id=ur.user_id
left join t_role r on r.id=ur.role_id
where
r.role_name='客户经理'
</select>
3.dao层调用sql
package com.shsxt.crm.system.dao;
import com.shsxt.crm.system.pojo.User;
import java.util.List;
import java.util.Map;
public interface UserMapper {
List<Map<Object,Object>>selectCustomerLists();//查询所有客户经理
int deleteByPrimaryKey(Integer id); //根据主键删除
int insert(User record);//插入数据,必须满足所有的字段
int insertSelective(User record);//插入数据,选择插入
User selectByPrimaryKey(Integer id); //根据主键查询
int updateByPrimaryKeySelective(User record); //根据主键选择修改
int updateByPrimaryKey(User record);//根据主键修改所有字段
User selectUserByUserName(String userName); //根据用户名查询用户
}
4.用户service层接口UserServiceI.java
package com.shsxt.crm.system.service;
import com.shsxt.crm.system.model.UserModel;
import com.shsxt.crm.system.pojo.User;
import java.util.List;
import java.util.Map;
/**
* 用户service
* Created by Administrator on 2019/8/26.
*/
public interface UserServiceI {
/**
* 根据用户名查询用户
* @param user
* @return
*/
UserModel userLogin(User user,String rememberMe);
/**
* 修改密码
*/
void updateUserPwd(Integer id,String oldPassword,String newPassword,String confirmPassword);
/**
* 根据主键查询id
* @param id
* @return
*/
User selectUserById(Integer id);
/**
* 查询所有客户经理
* @return
*/
List<Map<Object,Object>> selectCustomerLists();
}
userservice层实现类
package com.shsxt.crm.system.service.impl;
import com.shsxt.crm.base.util.AssertUtil;
import com.shsxt.crm.base.util.Base64Util;
import com.shsxt.crm.base.util.Md5Util;
import com.shsxt.crm.system.dao.UserMapper;
import com.shsxt.crm.system.model.UserModel;
import com.shsxt.crm.system.pojo.User;
import com.shsxt.crm.system.service.UserServiceI;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
/**
* 用户service
* Created by Administrator on 2019/8/26.
*/
@Service
public class UserServiceImpl implements UserServiceI {
@Autowired
private UserMapper userMapper;
/**
* 根据用户名查询用户===优化
*
* @return
*/
@Override
public UserModel userLogin(User user, String rememberMe) {
/**
* 1.校验数据的合法性
* 2.根据用户名查询用户
* 3.密码对比
*/
String userName = user.getUserName();
String userPwd = user.getUserPwd();
//1.校验数据合法性
//校验用户名
//优化,增强工具类StringUtils.isBlank()
AssertUtil.isTrue(StringUtils.isBlank(userName), "用户名不能为空");
AssertUtil.isTrue(StringUtils.isBlank(userPwd), "密码不能为空");
//用户名存在,根据用户名查询用户信息
User u = userMapper.selectUserByUserName(user.getUserName().trim());
//判断用户是否存在
AssertUtil.isTrue(null == u, "该用户名不存在");
//用户存在,比对密码
AssertUtil.isTrue(!u.getUserPwd().equals(Md5Util.encode(userPwd)), "密码输入错误");
//登录成功,构建返回对象
return buildUserModel(u, userPwd, rememberMe);
}
/**
* 修改密码
*
* @param id
* @param oldPassword
* @param newPassword
* @param confirmPassword
*/
@Override
public void updateUserPwd(Integer id, String oldPassword, String newPassword, String confirmPassword) {
//数据的合法性校验
AssertUtil.isTrue(StringUtils.isBlank(oldPassword), "原密码不可以为空");
AssertUtil.isTrue(StringUtils.isBlank(newPassword), "新密码不可以为空");
//直接比对两次密码
AssertUtil.isTrue(!newPassword.equals(confirmPassword), "两次密码不一致");
//根据主键查询用户
User user = userMapper.selectByPrimaryKey(id);
AssertUtil.isTrue(null == user, "用户未登录或不存在");
//密码比对
AssertUtil.isTrue(!user.getUserPwd().equals(Md5Util.encode(oldPassword)), "原密码输入错误");
//根据主键修改用户密码
user.setUserPwd(Md5Util.encode(newPassword));
AssertUtil.isTrue(userMapper.updateByPrimaryKeySelective(user) < 1, "修改密码失败");
}
/**
* 根据主键查询id
* @param id
* @return
*/
@Override
public User selectUserById(Integer id) {
return userMapper.selectByPrimaryKey(id);
}
/**
* 查询所有客户经理
* @return
*/
@Override
public List<Map<Object, Object>> selectCustomerLists() {
return userMapper.selectCustomerLists();
}
//构建返回对象模型
private UserModel buildUserModel(User user, String userPwd, String rememberMe) {
UserModel userModel = new UserModel();
//拷贝属性,将user属性拷贝到userModel
BeanUtils.copyProperties(user, userModel);
//处理加密的属性,将加密的属性放入对象模型中
userModel.setUserIdStr(Base64Util.encoder(String.valueOf(user.getId())));
//前台传值不为空时
if (StringUtils.isNotBlank(rememberMe))
//如果记住我有值,则将密码放入对象模型中
userModel.setUserInfo(Base64Util.encoder(userPwd));
return userModel;
}
}
重点
SaleChanceServiceImpl.java掉用户模块的查询方法
package com.shsxt.crm.sales.service.impl;
import com.shsxt.crm.base.constants.CrmConstants;
import com.shsxt.crm.base.util.AssertUtil;
import com.shsxt.crm.sales.dao.SaleChanceMapper;
import com.shsxt.crm.sales.pojo.SaleChance;
import com.shsxt.crm.sales.service.SaleChanceService;
import com.shsxt.crm.system.pojo.User;
import com.shsxt.crm.system.service.UserServiceI;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
/**
* 营销机会管理service实现
* Created by Administrator on 2019/8/29.
*/
@Service
public class SaleChanceServiceImpl extends SaleChanceService {
@Autowired
private SaleChanceMapper saleChanceMapper;
@Autowired
private UserServiceI userServiceI;
/**
* 添加或修改营销机会管理
*
* @param saleChance
* @param userId
*/
@Override
public void saveOrUpdateSaleChance(SaleChance saleChance, Integer userId) {
//校验参数
AssertUtil.isTrue(StringUtils.isBlank(saleChance.getCustomerName()), "客户名称为空");
AssertUtil.isTrue(StringUtils.isBlank(saleChance.getLinkMan()), "联系人不能为空");
AssertUtil.isTrue(StringUtils.isBlank(saleChance.getLinkPhone()), "联系电话为空");
//先判断是否有分配人
String assignMan = saleChance.getAssignMan();
if (StringUtils.isNotBlank(assignMan)){
saleChance.setState(1);//1代表以分配
saleChance.setAssignTime(new Date());//分配时间
}else{
saleChance.setState(0);//0代表未分配
}
User user=userServiceI.selectUserById(userId);
//判断
AssertUtil.isNotLogin(null==user);
saleChance.setCreateMan(user.getUserName());//创建人
saleChance.setCreateDate(new Date());
saleChance.setUpdateDate(new Date());
//添加营销机会
AssertUtil.isTrue(saleChanceMapper.save(saleChance)<1, CrmConstants.OPS_FAILED_MESSAGE);
}
}
UserController.java
package com.shsxt.crm.system.controller;
import com.shsxt.crm.base.BaseController;
import com.shsxt.crm.base.BaseResult;
import com.shsxt.crm.base.util.Base64Util;
import com.shsxt.crm.base.util.CookieUtil;
import com.shsxt.crm.system.model.UserModel;
import com.shsxt.crm.system.pojo.User;
import com.shsxt.crm.system.service.UserServiceI;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Map;
/**
* 用户controller
* Created by Administrator on 2019/8/26.
*/
@Controller
@RequestMapping("/user")
public class UserController extends BaseController{
@Autowired
private UserServiceI userServiceI;
/**
* 用户登录
*
* @param request
* @return
*/
@RequestMapping("/login")
@ResponseBody
public BaseResult userLogin(HttpServletRequest request, User user, String rememberMe) {
UserModel userModel = userServiceI.userLogin(user, rememberMe);
//将用户信息存入session
request.getSession().setAttribute("user", userModel);
return BaseResult.success("登录成功",userModel);
}
/**
* 安全退出
*
* @param request
* @return
*/
@RequestMapping("/logout")
public String userLogout(HttpServletRequest request) {
//清除session信息
request.getSession().removeAttribute("user");
return "login";
}
@RequestMapping("/updateUserPwd")
@ResponseBody
public BaseResult updateUserPwd(HttpServletRequest request, String oldPassword,
String newPassword, String confirmPassword) {
//从cookie获取用户加密id
String userIdStr = CookieUtil.getCookieValue(request, "userIdStr");
//将获取的加密id解密
Integer id = Integer.valueOf(Base64Util.decoder(userIdStr));
//修改密码
userServiceI.updateUserPwd(id, oldPassword, newPassword, confirmPassword);
return BaseResult.success("修改成功");
}
/**
* 查询所有客户经理信息
* @return
*/
@RequestMapping("/selectCustomerLists")
@ResponseBody
public List<Map<Object,Object>> selectCustomerLists(){
return userServiceI.selectCustomerLists();
}
}
打开添加的表格
<html>
<head>
<#include "common.ftl" >
<script type="text/javascript" src="${ctx}/js/sale.chance.js"></script>
</head>
<body style="margin: 1px">
<table id="dg" class="easyui-datagrid"
pagination="true" rownumbers="true"
url="${ctx}/saleChance/selectSaleChanceByParams" 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="trueName" 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">
<a href="javascript:openAddSaleChacneDialog()" class="easyui-linkbutton" iconCls="icon-save" plain="true">添加</a>
<a href="javascript:openModifySaleChanceDialog()" class="easyui-linkbutton" iconCls="icon-edit" plain="true">更新</a>
<a href="javascript:deleteSaleChance()" class="easyui-linkbutton" iconCls="icon-remove" plain="true">删除</a>
<br/>
客户名称:<input type="text" id="customerName"/>
状态:
<select class="easyui-combobox" name="state" id="state" panelHeight="auto">
<option value="">全部</option>
<option value="0">未分配</option>
<option value="1">已分配</option>
</select>
开发结果:
<select class="easyui-combobox" id="devResult" panelHeight="auto">
<option value="">全部</option>
<option value="0">未开发</option>
<option value="1">开发中</option>
<option value="2">开发成功</option>
<option value="3">开发失败</option>
</select>
创建时间:<input id="time" type="text" class="easyui-datebox"></input>
<a href="javascript:querySaleChancesByParams()" class="easyui-linkbutton" iconCls="icon-search" plain="true">搜索</a>
</div>
<div id="dlg" class="easyui-dialog" title="添加营销记录" closed="true"
style="width: 500px;height:300px" buttons="#bt">
<form id="fm" method="post">
<table style="font-size: 12px;">
<tr>
<td>机会来源:</td>
<td><input type="text" id="chanceSource" name="chanceSource"/></td>
</tr>
<tr>
<td>客户名称:</td>
<td><input type="text" id="customerName02" class="easyui-validatebox" name="customerName" required="required"/></td>
</tr>
<tr>
<td>成功几率:</td>
<td><input type="text" id="cgjl" name="cgjl"/></td>
</tr>
<tr>
<td>联系人:</td>
<td><input type="text" name="linkMan" id="linkMan" class="easyui-validatebox" required="required"/></td>
</tr>
<tr>
<td>联系电话:</td>
<td><input type="text" name="linkPhone" id="linkPhone" class="easyui-validatebox" required="required"/></td>
</tr>
<tr>
<td>描述信息:</td>
<td><input type="text" id="description" name="description"/></td>
</tr>
<tr>
<td>分配人:</td>
<td>
<#--<input type="text" id="assignMan" name="assignMan"/>-->
<input class="easyui-combobox" id="assignMan" name="assignMan"
valueField="id" textField="trueName" editable="false"
url="${ctx}/user/selectCustomerLists" panelHeight="auto"/>
</td>
</tr>
</table>
<input name="id" id="id" type="hidden"/>
</form>
</div>
<div id="bt">
<a href="javascript:saveOrUpdateSaleChance()" class="easyui-linkbutton" plain="true" iconCls="icon-save">保存</a>
<a href="javascript:closeDlg()" class="easyui-linkbutton" plain="true" iconCls="icon-cancel">取消</a>
</div>
</body>
</html>