-
营销机会管理功能实现
1.准备工作 生成代码 通过mybatis-generator生成代码。能够生成JavaBean对象、mapper映射文件以及mapper接口。 IDEA创建MYSQL链接 2.营销机会数据查询 1.后端代码实现 layui框架通过表格展示后端表数据 1.查询条件 创建query包,新建SaleChanceQuery.java查询类并且继承BaseQuery,设置对应的查询条件。 2.设置SQL 在由逆向工程下生成的SaleChanceMapper.xml内设置SQL查询语句。 3.Dao 在dao包下新建接口SaleChanceMapper.java并且继承BaseService
,在其中定义查询方法。 4.Service 在service包下新建SaleChanceService.java并且继承BaseMapper ,在其中实现查询方法(BaseService中有对应的方法)。 5.Controller 在controller包下新建SaleChanceController.java并且继承BaseController,在其中连接SaleChanceService中的查询方法。 6.时间格式化 在SaleChance实体类中的时间字段上添加注解,用来格式化时间。 @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date assignTime; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date createDate; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date updateDate; 2.前端核心代码 1.页面模板 在resources/views/saleChance目录创建sale_chance.ftl模块文件,其中模板依赖的layui文件由common.ftl文件提供。 2.页面入口 SaleChanceController后台设置对应的接口。 @RequestMapping("index") public String index () { return "saleChance/sale_chance"; } 3.核心JS public/js/saleChance目录下创建sale.chance.js文件,初始化layui表格数据。 4.多条件查询 使用layui表格reload重载基础方法实现。sale.chance.js添加搜索点击事件。 $(".search_btn").click(function () { table.reload('saleChanceListTable', { where: { //设定异步数据接口的额外参数,任意设 customerName: $("input[name='customerName']").val(), // 客户名 createMan: $("input[name='createMan']").val(), // 创建人 state: $("#state").val() // 状态 } ,page: { curr: 1 // 重新从第 1 页开始 } }); // 只重载数据 }); -
营销机会数据添加
1.后端代码实现 1.实现思路 1.参数校验 customerName:非空 linkMan:非空 linkPhone:非空 11位手机号 2.设置相关参数默认值 state:默认未分配 如果选择分配人 state 为已分配 assignTime:如果 如果选择分配人 时间为当前系统时间 devResult:默认未开发 如果选择分配人devResult为开发中 0-未开发 1-开发中 2-开发成功 3-开发失败 isValid:默认有效数据(1-有效 0-无效) createDate updateDate:默认当前系统时间 3.执行添加 判断结果 2.核心代码 SaleChanceService.java中使用@Transactional(propagation = Propagation.REQUIRED)定义在方法级别上。 1.参数校验 封装一个checkParams方法,其中使用AssertUtil.isTrue(StringUtils.isBlank())来判断参数是否非空。 2.设置相关参数默认值 未选择分配人 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()); } 3.执行添加 判断结果 AssertUtil.isTrue(insertSelective(saleChance) < 1, "营销机会数据添加失败!"); 3.方法调用 SaleChanceController.java中使用@RequestMapping("save")和@ResponseBody定义在方法级别上。 //获取用户ID Integer userId = LoginUserUtil.releaseUserIdFromCookie(request); //获取用户的真实姓名 String trueName = userService.selectByPrimaryKey(userId).getTrueName(); //设置营销机会的创建人 saleChance.setCreateMan(trueName); //添加营销机会的数据 saleChanceService.saveSaleChance(saleChance); return success("营销机会数据添加成功!"); 4.页面转发 SaleChanceController.java中使用@RequestMapping("toAppUpdatePage")定义在方法级别上。 return "saleChance/add_update"; 2.前端核心代码 1.页面模板 views/saleChance目录下添加add_update.ftl页面模板。 2.工具栏事件 sale_chance.ftl 这里对于对话框打开方法代码。 sale_chancel.js 监听头部工具栏事件 table.on('toolbar(saleChances)', function(obj){ var checkStatus = table.checkStatus(obj.config.id); switch(obj.event){ case 'add': // 点击添加按钮,打开添加营销机会的对话框 openAddOrUpdateSaleChanceDialog(); break; }; }); 3.核心JS js/saleChance目录下添加add.update.js文件,完成机会数据添加与更新表单提交操作。监听submit提交。 form.on("submit(addOrUpdateSaleChance)", function (data) 4.关闭弹出层 add_update.ftl 给按钮设置id属性值,通过id绑定点击事件。 add.update.js 关闭弹出层 $("#closeBtn").click(function () { //先得到当前iframe层的索引 var index = parent.layer.getFrameIndex(window.name); //再执行关闭 parent.layer.close(index); }); -
营销机会数据更新
1.后端代码实现 1.实现思路 1.参数校验 id:记录必须存在 customerName:非空 linkMan:非空 linkPhone:非空,11位手机号 2.设置相关参数值 update_date 修改时间 判断是否指派了工作人员 1.修改前没有分配人 修改后没有分配人 不做任何操作 修改后有分配人 dev_result 开发状态 assign_time 分配时间 state 分配状态 2.修改前有分配人 修改后没有分配人 dev_result 开发状态 state 分配状态 0 修改后有分配人 判断更改后的人员和更改前的人员有没有变动 没有变动不做操作 有变动,assign_time最新的时间 3.执行修改操作,判断是否修改成功 2.核心代码 SaleChanceService.java中使用@Transactional(propagation = Propagation.REQUIRED)定义在方法级别上。 1.参数校验 判断id是否存在 AssertUtil.isTrue(saleChance.getId() == null,"数据异常,请重试"); 校验非空参数 封装一个checkParams方法,其中使用AssertUtil.isTrue(StringUtils.isBlank())来判断参数是否非空。 2.设置相关参数值 设置默认值 saleChance.setUpdateDate(new Date()); 通过现有的id查询修改之前的数据 SaleChance dbSaleChance = saleChanceMapper.selectByPrimaryKey(saleChance.getId()); AssertUtil.isTrue(dbSaleChance == null,"数据异常,请重试"); //判断原有数据中是否有分配人 if(StringUtils.isBlank(dbSaleChance.getAssignMan())){ //进入当前判断说明修改前没有分配人 //判断修改后是否有分配人 if(!StringUtils.isBlank(saleChance.getAssignMan())){ //修改后有分配人 saleChance.setAssignTime(new Date()); saleChance.setState(1); saleChance.setDevResult(1); } //修改后没有分配人,什么都不做 }else{ //进入当前判断说明修改前有分配人 //判断修改后是否有分配人 if(StringUtils.isBlank(saleChance.getAssignMan())){ //修改后没有分配人 saleChance.setAssignTime(null); saleChance.setState(0); saleChance.setDevResult(0); }else{ //修改后有分配人 //判断前后的分配人是否有变化 if(!dbSaleChance.getAssignMan().equals(saleChance.getAssignMan())){ //不是一个人,有变化 saleChance.setAssignTime(new Date()); }else{ //相同的分配人 那么前台后台都没有设置分配的时间,那么结合刚修改的sql条件,那么原有的数据机会被更改 saleChance.setAssignTime(new Date()); } } } 3.执行修改操作 AssertUtil.isTrue(saleChanceMapper.updateByPrimaryKeySelective(saleChance) < 1,"营销数据修改失败"); 3.方法调用 这里机会数据更新与添加操作实现代码共用,修改原有的添加方法。 SaleChanceController.java中使用@RequestMapping("update")和@ResponseBody定义在方法级别上。 saleChanceService.updateSaleChance(saleChance); return success(); 4.页面转发 id为空 添加操作 id非空 修改操作 SaleChanceController.java使用@RequestMapping("addOrUpdateSaleChancePage")定义在方法级别上。 //如果是修改操作那么需要将修改的数据映射在页面中 if(id != null){ SaleChance saleChance = saleChanceService.selectByPrimaryKey(id); AssertUtil.isTrue(saleChance == null,"数据异常,请重试"); request.setAttribute("saleChance",saleChance); } return "saleChance/add_update"; 2.前端核心代码 1.表格行事件 sale_chance.ftl 这里对于对话框打开方法代码。 sale.chance.js 表格添加行监听事件。 table.on('tool(saleChances)', function(obj){ var data = obj.data; //获得当前行数据 var layEvent = obj.event; //获得 lay-event 对应的值(也可以是表头的 event 参数对应的 值) //判断事件类型 if(layEvent === 'edit'){ //编辑操作 //获取当前要修改的行的id var saleChanceId = data.id; //点击表格行的编辑按钮,打开更新营销机会的对话框 openAddOrUpdateSaleChanceDialog(saleChanceId); } }); add_update.ftl 在页面中通过EL表达式获取作用域中的数据。 添加隐藏域,存放营销机会的ID。 2.核心JS 修改操作的JS与添加操作的可共用,通过隐藏域中存放的营销机会ID,来判断当前的操作行为。 form.on("submit(addOrUpdateSaleChance)", function (data) 3.加载下拉框 SaleChanceMapper.java // 查询所有的销售人员 public List



