-
营销机会管理功能实现
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<SaleChance,Integer>,在其中定义查询方法。 4.Service 在service包下新建SaleChanceService.java并且继承BaseMapper<SaleChance,Integer>,在其中实现查询方法(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。 <input type="hidden" name="id" value="${(saleChance.id)!}"> 2.核心JS 修改操作的JS与添加操作的可共用,通过隐藏域中存放的营销机会ID,来判断当前的操作行为。 form.on("submit(addOrUpdateSaleChance)", function (data) 3.加载下拉框 SaleChanceMapper.java // 查询所有的销售人员 public List<Map<String, Object>> queryAllSales(); SaleChanceMapper.xml添加查询所有销售人员的SQL语句 SaleChanceService.java public List<Map<String, Object>> queryAllSales() { return userMapper.queryAllSales(); } SaleChanceController.java @RequestMapping("user/queryAllSales") @ResponseBody public List<Map<String, Object>> queryAllSales() { return userService.queryAllSales(); } add_update.ftl <#--设置营销人员的ID--> <input type="hidden" name="man" value="${(saleChance.assignMan)!}"> add.update.js 加载下拉框 $.post(ctx + "/user/queryAllSales",function (data) 显示指派人 1.修改查询的SQL语句 (SaleChanceMapper.xml) 2.JavaBean中添加属性字段 (SaleChance.java)
-
营销机会数据删除
1.后端代码实现 1.SaleChanceMapper.xml设置批量删除SQL语句,后端接收前端数组参数借助mybatis动态标签foreach实现记录批量删除 2.在BaseMapper中定义了删除的方法,无须在SaleChanceMapper类中再定义 3.SaleChanceService.java添加删除方法 4.SaleChanceController.java调用servicec层方法并且提供入口 2.前端核心代码 1.工具栏事件 sale_chance.ftl添加删除按钮 sale_chancel.js添加删除点击事件 2.表格行事件 sale.chance.js添加表格行删除监听事件
-
客户开发计划数据查询
1.后端代码实现 1.SaleChanceQuery.java新增分配人assignMan,开发状态devResult查询条件 2.SaleChanceMapper.xml查询语句中添加分配人与开发状态查询条件 3.SaleChanceController.java添加开发计划项数据查询标识flag, 如果前端页面查询参数flag=1,代表当前查询为开发计划数据,设置查询分配人参数 2.前端核心代码 1.views/cusDevPlan目录下创建cus_dev_plan.ftl文件,展示已分配计划项列表数据,这里对于机会数据展示行操作有两种状态: 详情:机会数据已开发结束,点击详情展示计划项相关数据 开发:机会数据处于开发中,点击开发添加计划项数据 2.CusDevPlanController后台设置对应的接口 3.js/cusDevPlan目录下新建cus.dev.plan.js文件 多条件查询 cus_dev_plan.ftl添加搜索按钮 cus.dev.plan.js添加搜索点击事件
-
营销机会数据开发与详情
1.行监听事件 cus_dev_plan.ftl添加开发和详情按钮 cus.dev.plan.js添加开发和详情点击事件 2.视图转发方法 CusDevPlanController.java 通过id查询营销机会数据 SaleChance saleChance = saleChanceService.selectByPrimaryKey(sid); 将数据存到作用域中 model.addAttribute("saleChance", saleChance); 转发到开发计划项数据视图页面 return "cusDevPlan/cus_dev_plan_data"; 3.视图添加 在views/cusDevPlan目录下添加cus_dev_plan_data.ftl视图模板,显示机会数据与计划项列表数据 这里是否显示视图中表格头工具栏与行按钮信息由机会数据开发状态决定 在js/cusDevPlan目录下添加cus.dev.plan.data.js 4.计划项数据列表查询 1.CusDevPlanQuery.java查询类定义 营销机会 id private Integer sid; 2.CusDevPlanMapper.xml配置查询营销机会的计划项数据列表SQL语句 3.CusDevPlanService.java使用多条件查询计划项列表方法 4.CusDevPlanController.java调用service层方法并且提供入口
-
客户开发计划项添加与更新
计划项添加 1.实现思路 1.参数校验 营销机会ID 非空 记录必须存在 计划项内容 非空 计划项时间 非空 2.设置参数默认值 is_valid crateDate updateDate 3.执行添加,判断结果 2.核心代码 1.CusDevPlanService.java 1.参数校验 封装一个checkParams方法判断非空 2.设置默认值 cusDevPlan.setIsValid(1); cusDevPlan.setCreateDate(new Date()); cusDevPlan.setUpdateDate(new Date()); 3.执行添加,判断结果 AssertUtil.isTrue(insertSelective(cusDevPlan) < 1, "计划项记录添加失败!"); 2.CusDevPlanController.java调用service层方法并且提供入口 3.前端核心代码 工具栏与行监听事件 cus.dev.plan.data.js 视图转发方法 CusDevPlanController.java添加addOrUpdateCusDevPlanPage方法用于转发计划项添加表单页面 页面 views/cusDevPlan目录下添加add_update.ftl文件 JS文件 js/cusDevPlan目录下添加add.update.js文件,实现计划项数据添加表单提交 计划项更新 1.实现思路 1.参数校验 id 非空 记录存在 营销机会id 非空 记录必须存在 计划项内容 非空 计划项时间 非空 2.参数默认值设置 updateDate 3.执行更新 判断结果 2.核心代码 1.CusDevPlanService.java 1.参数校验 封装一个checkParams方法判断非空 2.设置默认值 cusDevPlan.setUpdateDate(new Date()); 3.执行添加,判断结果 AssertUtil.isTrue(updateByPrimaryKeySelective(cusDevPlan)<1,"计划项记录更新失败!"); 2.CusDevPlanController.java调用service层方法并且提供入口 3.CusDevPlan.java设置参数为Date类型时,想要传入的时间格式 @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") @DateTimeFormat(pattern = "yyyy-MM-dd") private Date planDate; 3.前端核心代码 工具栏与行监听事件 cus.dev.plan.data.js 视图转发方法 CusDevPlanController.java添加addOrUpdateCusDevPlanPage方法用于转发计划项更新表单页面 页面 views/cusDevPlan目录下添加add_update.ftl文件 JS文件 js/cusDevPlan目录下添加add.update.js文件,实现计划项数据更新表单提交 关闭弹出层 add_update.ftl给按钮设置id属性值,通过id绑定点击事件 add.update.js添加取消点击事件
-
客户开发计划项删除
1.后端代码实现 CusDevPlanService.java添加删除方法 CusDevPlanController.java调用service层方法并且提供入口 2.前端核心代码 修改js/cusDevPlan目录下cus.dev.plan.data.js,添加删除行监听事件
-
营销机会数据开发状态更新
1.后端代码实现 状态更新的设计表为 t_sale_chance 营销机会表,所以更新的核心代码在营销机会模块。 SaleChanceService.java添加更新营销机会的状态的方法 SaleChanceController.java调用service层方法并且提供入口 2.前端核心代码 修改cus.dev.plan.data.js添加表格头监听事件(开发成功,开发失败)
CRM营销管理
于 2022-05-06 20:42:24 首次发布