1.项目进度
主要是营销管理模块包括营销机会管理模块和客户开发计划。营销机会管理包括所有人的客户信息,客户开发计划主要是当前登录用户的开发计划
2. 项目实现
2.1 营销机会管理
营销机会管理内容主要是对营销机会信息的展示、查询、编辑、添加、删除,并且删除支持多条记录一起删除。就是对营销机会信息的增删改查。
(1)营销机会管理内容展示
这里的查询就是查询数据库中sale_chance表中的所有内容,并展示到页面上就可,主要是dao层的数据库查询操作,service层没有别的业务逻辑。
(2)营销机会管理内容查询
主要是支持根据客户名、分配状态、创建人进行查询。
(3)营销机会管理内容添加
内容添加就是插入一条记录到数据库即可。页面如下:
dao层:主要是插入一条记录到数据库中
service层:
1.检验参数是否为空:比如客户名称、联系人、联系电话不能为空,同时联系电话需要符合电话的标准。
2.需要设置相关操作的默认值:
createMan:当前登录用户的名字
assignMan :
如果没有设置:默认state为0指派时间为null devResult开发状态:0
有设置:state为1,指派时间为当前系统的时间 devResult为1 isValid为1有效
@Transactional(propagation = Propagation.REQUIRED) public void addSaleChance(SaleChance saleChance){ checkSaleChanceParams(saleChance.getCustomerName(),saleChance.getLinkMan(),saleChance.getLinkPhone()); saleChance.setIsValid(1); saleChance.setCreateDate(new Date()); saleChance.setUpdateDate(new Date()); if(StringUtils.isBlank(saleChance.getAssignMan())){ saleChance.setState(StateStatus.UNSTATE.getType()); saleChance.setAssignTime(null); saleChance.setDevResult(DevResult.UNDEV.getStatus()); }else{ saleChance.setState(StateStatus.STATED.getType()); saleChance.setAssignTime(new Date()); saleChance.setDevResult(DevResult.DEVING.getStatus()); } AssertUtil.isTrue(saleChanceMapper.insertSelective(saleChance)!=1,"添加营销机会失败"); } private void checkSaleChanceParams(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),"联系号码格式不正确"); }
3. 调用dao层的插入操作
controller层:
调用service层的添加操作
@ResponseBody @PostMapping("add") public ResultInfo addSaleChance(SaleChance saleChance, HttpServletRequest request){ String userName= CookieUtil.getCookieValue(request,"userName"); saleChance.setCreateMan(userName); saleChanceService.addSaleChance(saleChance); return success("营销机会数据添加成功!"); }
(4)营销机会管理内容编辑
编辑与添加共享一个页面,主要的不同在于编辑直接update,同时通过当前id是否存在判断是编辑操作还是添加操作。
dao层:主要是update操作
service层:与添加一条记录的逻辑一致,主要是需要获取到当前记录的id用于where语句的判断
@Transactional(propagation = Propagation.REQUIRED) public void updateSaleChance(SaleChance saleChance){ AssertUtil.isTrue(null==saleChance.getId(),"待更新记录不存在"); SaleChance temp=saleChanceMapper.selectByPrimaryKey(saleChance.getId()); AssertUtil.isTrue(null==temp,"待更新记录不存在!"); checkSaleChanceParams(saleChance.getCustomerName(),saleChance.getLinkMan(),saleChance.getLinkPhone()); saleChance.setUpdateDate(new Date()); if(StringUtils.isBlank(temp.getAssignMan())){ if(!StringUtils.isBlank(saleChance.getAssignMan())) { //修改前不存在,修改后有值 saleChance.setAssignTime(new Date()); saleChance.setState(StateStatus.STATED.getType()); saleChance.setDevResult(DevResult.DEVING.getStatus()); } }else{ //修改前有值,修改后无值 if(StringUtils.isBlank(saleChance.getAssignMan())){ saleChance.setState(StateStatus.UNSTATE.getType()); saleChance.setAssignTime(null); saleChance.setDevResult(DevResult.UNDEV.getStatus()); }else{ //修改前后都有值 //判断修改前后是否是同一个指派人 if(!saleChance.getAssignMan().equals(temp.getAssignMan())){ saleChance.setAssignTime(new Date()); } } } AssertUtil.isTrue(saleChanceMapper.updateByPrimaryKeySelective(saleChance)!=1,"更新操作失败"); }
controller层:调用service层的方法
@ResponseBody @PostMapping("update") public ResultInfo updateSaleChance(SaleChance saleChance){ saleChanceService.updateSaleChance(saleChance); return success("营销机会数据更新成功!"); }
(5)营销机会管理内容删除
就是一条记录的删除操作
service层:传的参数是一个数组,支持多条记录的删除操作
@Transactional(propagation = Propagation.REQUIRED) public void deleteSaleChance(Integer[] ids){ AssertUtil.isTrue(null==ids || ids.length<1,"待删除记录不存在"); AssertUtil.isTrue(saleChanceMapper.deleteBatch(ids)!=ids.length,"营销机会数据删除失败"); }
controller层:
@ResponseBody @PostMapping("delete") public ResultInfo deleteSaleChance(Integer[] ids){ saleChanceService.deleteSaleChance(ids); return success("营销机会数据删除成功!"); }
2.2 客户开发计划
客户开发计划实际上就是营销机会信息中指派给当前登录用户且有效的营销机会信息。
(1)客户开发计划的展示、查询
实际上就是在查询营销机会信息时添加一个条件即查询指派人为当前用户的营销机会信息。
(2)客户开发计划详情及开发
当该条客户记录开发成功时,后面的操作显示为详情;当该条客户记录开发未成功时,后面的操作显示为开发。
当开发成功/失败时,显示详情即可
当开发中时,可以进行添加计划项,修改开发状态等操作
更新开发状态:注意这里是更新的sale_chance表
controller层:
@ResponseBody @PostMapping("updateSaleChanceDevResult") private ResultInfo updateSaleChanceDevResult(Integer id,Integer devResult){ saleChanceService.updateSaleChanceDevResult(id,devResult); return success("开发状态更新成功"); }
service层:
@Transactional(propagation = Propagation.REQUIRED) public void updateSaleChanceDevResult(Integer id,Integer devResult){ AssertUtil.isTrue(null==id,"待更新记录不存在"); SaleChance saleChance=saleChanceMapper.selectByPrimaryKey(id); AssertUtil.isTrue(null==saleChance,"待更新记录不存在"); saleChance.setDevResult(devResult); AssertUtil.isTrue(saleChanceMapper.updateByPrimaryKeySelective(saleChance)!=1,"开发状态更新失败"); }
添加/更新计划项:
向cus_dev_plan表中插入一条记录:
service层:
@Transactional(propagation = Propagation.REQUIRED) public void addCusDevPlan(CusDevPlan cusDevPlan){ checkCusDevPlanParams(cusDevPlan); cusDevPlan.setIsValid(1); cusDevPlan.setCreateDate(new Date()); cusDevPlan.setUpdateDate(new Date()); AssertUtil.isTrue(cusDevPlanMapper.insertSelective(cusDevPlan)!=1,"计划项插入失败"); } private void checkCusDevPlanParams(CusDevPlan cusDevPlan) { Integer sId=cusDevPlan.getSaleChanceId(); AssertUtil.isTrue(null==sId || saleChanceMapper.selectByPrimaryKey(sId)==null,"数据异常,请重试"); AssertUtil.isTrue(StringUtils.isBlank(cusDevPlan.getPlanItem()),"计划项内容不能为空"); AssertUtil.isTrue(null==cusDevPlan.getPlanDate(),"计划项时间不能为空"); } @Transactional(propagation = Propagation.REQUIRED) public void updateCusDevPlan(CusDevPlan cusDevPlan){ AssertUtil.isTrue(null==cusDevPlan.getId()||cusDevPlanMapper.selectByPrimaryKey(cusDevPlan.getId())==null,"数据异常请重试"); checkCusDevPlanParams(cusDevPlan); cusDevPlan.setUpdateDate(new Date()); AssertUtil.isTrue(cusDevPlanMapper.updateByPrimaryKeySelective(cusDevPlan)!=1,"更新记录失败"); }
controller层:
@ResponseBody @PostMapping("add") private ResultInfo addCusDevPlan(CusDevPlan cusDevPlan){ cusDevPlanService.addCusDevPlan(cusDevPlan); return success("添加计划项成功"); } @RequestMapping("addOrUpdateCusDevPlanPage") public String toAddOrUpdateCusDevPlanPage(Integer sId,HttpServletRequest request,Integer id){ request.setAttribute("sId",sId); CusDevPlan cusDevPlan=cusDevPlanService.selectByPrimaryKey(id); request.setAttribute("cusDevPlan",cusDevPlan); return "cusDevPlan/add_update"; } @ResponseBody @PostMapping("update") private ResultInfo updateCusDevPlan(CusDevPlan cusDevPlan){ cusDevPlanService.updateCusDevPlan(cusDevPlan); return success("更新计划项成功"); }
删除机会记录项:
就是在cus_dev_plan表中更新一下是否有效
service层:
@Transactional(propagation = Propagation.REQUIRED) public void deleteCusDevPlan(Integer id){ AssertUtil.isTrue(null==id ,"待删除记录不存在"); CusDevPlan cusDevPlan=cusDevPlanMapper.selectByPrimaryKey(id); cusDevPlan.setIsValid(0); cusDevPlan.setUpdateDate(new Date()); AssertUtil.isTrue(cusDevPlanMapper.updateByPrimaryKeySelective(cusDevPlan)!=1,"删除客户机会记录失败"); }
controller层:
@ResponseBody @PostMapping("delete") private ResultInfo deleteCusDevPlan(Integer id){ cusDevPlanService.deleteCusDevPlan(id); return success("删除计划项成功"); }