CRM项目记录(八)


目录:

(1)crm删除市场备注活动

(2)crm实现删除市场活动备注实现M,apper层和Service层

(3)crm修改市场活动备注实现

(4)crm实现保存修改市场活动备注前台页面

(5)crm线索实现

(6)crm线索和市场活动之间的关联关系  查看线索明细


(1)crm删除市场备注活动

用户在市场活动明细页面,点击"删除"市场活动备注的图标,完成删除市场活动备注的功能.

         *删除成功之后,刷新备注列表

         *删除失败,提示信息,备注列表不刷新

 (2)crm实现删除市场活动备注实现

在ActivityRemarkMapper接口中添加: 

 在ActivityRemarkMapper.xml中添加:sql:

<!--根据id删除市场活动备注-->
  <delete id="deleteActivityRemarkById" parameterType="string">
    delete from tbl_activity_remark where id=#{id}
  </delete>

 在ActivityRemarkService接口:添加根据id删除市场活动备注

 实现类:

在ActivityRemarkController中添加:

//根据id删除市场活动备注
    @RequestMapping("/workbench/activity/deleteActivityRemarkById.do")
    public @ResponseBody Object deleteActivityRemarkById(String id){

        ReturnObject returnObject= new ReturnObject();
        try {
            //调用service层方法,删除备注
            int ret = activityRemarkService.deleteActivityRemarkById(id);

            if(ret>0){
                returnObject.setCode(Contants.RETURN_OBJECT_CODE_SUCCESS);
            }else{
                returnObject.setCode(Contants.RETURN_OBJECT_CODE_FAIL);
                returnObject.setMessage("系统忙,请稍后重试....");
            }
        }catch (Exception e){
            e.printStackTrace();
            returnObject.setCode(Contants.RETURN_OBJECT_CODE_FAIL);
            returnObject.setMessage("系统忙,请稍后重试....");
        }

        return returnObject;
    }

 给detail.jsp页面给修改删除a 连接加name属性:

 

 js代码:

	//给所有的"删除"图标添加单击事件  使用on这个点击事件
			$("#remarkDivList").on("click","a[name='deleteA']",function () {
				//收集参数
				var id=$(this).attr("remarkId");//获取自定义属性的id
				//发送请求
				$.ajax({
					url:'workbench/activity/deleteActivityRemarkById.do',
					data:{
						id:id
					},
					type:'post',
					dataType:'json',
					success:function (data) {
						if(data.code=="1"){
							//刷新备注列表 动态删除,而不是不去数据库查询
							$("#div_"+id).remove();
						}else{
							//提示信息
							alert(data.message);
						}
					}
				});
			});

 

先添加几条备注:

 删除刚添加的备注:

 

(3)crm修改市场活动备注实现

需求:

用户在市场活动明细页面,点击"修改"市场活动备注的图标,弹出修改市场活动备注的模态窗口;

         用户在修改市场活动备注的模态窗口,填写表单,点击"更新"按钮,完成修改市场活动备注的功能.

         *备注内容不能为空

         *修改成功之后,关闭模态窗口,刷新备注列表

         *修改失败,提示信息,模态窗口不关闭,列表也不刷新

 给修改图标添加事件:

//给所有市场活动备注后边的"修改"图标添加单击事件
			$("#remarkDivList").on("click","a[name='editA']",function () {
				//获取备注的id和noteContent
				var id=$(this).attr("remarkId"); //获取自定义属性的id
				var noteCotent=$("#div_"+id+" h5").text();// div下的子元素 h5 需要加一个空格
				//把备注的id和noteContent写到修改备注的模态窗口中
				$("#edit-id").val(id);//给隐藏域写入数据
				$("#edit-noteContent").val(noteCotent);
				//弹出修改市场活动备注的模态窗口
				$("#editRemarkModal").modal("show");
			});

<!-- 修改市场活动备注的模态窗口 -->
<div class="modal fade" id="editRemarkModal" role="dialog">
	<%-- 备注的id --%>
	<input type="hidden" id="remarkId">
	<div class="modal-dialog" role="document" style="width: 40%;">
		<div class="modal-content">
			<div class="modal-header">
				<button type="button" class="close" data-dismiss="modal">
					<span aria-hidden="true">×</span>
				</button>
				<h4 class="modal-title" id="myModalLabel">修改备注</h4>
			</div>
			<div class="modal-body">
				<form class="form-horizontal" role="form">
					<input type="hidden" id="edit-id">
					<div class="form-group">
						<label for="edit-noteContent" class="col-sm-2 control-label">内容</label>
						<div class="col-sm-10" style="width: 81%;">
							<textarea class="form-control" rows="3" id="edit-noteContent"></textarea>
						</div>
					</div>
				</form>
			</div>
			<div class="modal-footer">
				<button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
				<button type="button" class="btn btn-primary" id="updateRemarkBtn">更新</button>
			</div>
		</div>
	</div>
</div>

点击修改按钮:

在ActivityRemarkMapper接口:

 在ActivityRemarkMapper.xml中添加:

<!--保存修改的市场活动备注-->
    <update id="updateActivityRemark" parameterType="com.bjpowernode.crm.workbench.domain.ActivityRemark">
      update tbl_activity_remark
      set note_content=#{noteContent},edit_time=#{editTime},edit_by=#{editBy},edit_flag=#{editFlag}
      where id=#{id}
    </update>

 在ActivityRemarkSertvice接口:添加方法

 实现类:

 controller:

//保存修改的市场活动备注
    @RequestMapping("/workbench/activity/saveEditActivityRemark.do")
    public @ResponseBody Object saveEditActivityRemark(ActivityRemark remark,HttpSession session){
        User user=(User) session.getAttribute(Contants.SESSION_USER);
        //封装参数
        remark.setEditTime(DateUtils.formateDateTime(new Date()));
        remark.setEditBy(user.getId());
        remark.setEditFlag(Contants.REMARK_EDIT_FLAG_YES_EDITED);

        ReturnObject returnObject=new ReturnObject();
        try {
            //调用service层方法,保存修改的市场活动备注
            int ret = activityRemarkService.saveEditActivityRemark(remark);

            if(ret>0){
                returnObject.setCode(Contants.RETURN_OBJECT_CODE_SUCCESS);
                returnObject.setRetData(remark);
            }else{
                returnObject.setCode(Contants.RETURN_OBJECT_CODE_FAIL);
                returnObject.setMessage("系统忙,请稍后重试....");
            }
        }catch (Exception e){
            e.printStackTrace();
            returnObject.setCode(Contants.RETURN_OBJECT_CODE_FAIL);
            returnObject.setMessage("系统忙,请稍后重试....");
        }

        return returnObject;
    }

 (4)crm实现保存修改市场活动备注前台页面

detail.jsp:添加js事件:

//给“更新”按钮添加单击事件
			$("#updateRemarkBtn").click(function () {
				//收集参数
				var id=$("#edit-id").val();
				var noteContent=$.trim($("#edit-noteContent").val());
				//表单验证
				if(noteContent==""){
					alert("备注内容不能为空");
					return;
				}
				//发送请求
				$.ajax({
					url:'workbench/activity/saveEditActivityRemark.do',
					data:{
						id:id,
						noteContent:noteContent
					},
					type:'post',
					dataType:'json',
					success:function (data) {
						if(data.code=="1"){
							//关闭模态窗口
							$("#editRemarkModal").modal("hide");
							//刷新备注列表
							$("#div_"+data.retData.id+" h5").text(data.retData.noteContent);// div下的子元素 h5 需要加一个空格
							$("#div_"+data.retData.id+" small").text(" "+data.retData.editTime+" 由${sessionScope.sessionUser.name}修改");
						}else{
							//提示信息
							alert(data.message);
							//模态窗口不关闭
							$("#editRemarkModal").modal("show");
						}
					}
				});
			});

 

修改备注:

成功修改:

(5)crm线索实现

主要完成一下的功能 

2,创建线索:表分析

   tbl_dic_type code   存储下拉列表的类型的,每一个下拉列表在tbl_dic_type对应一条记录,主键值都是各自的编码,有含义的字段做主键,在程序如果需要用到这些主键值,可以直接使用。

   tbl_dic_value    type_code  存储每一个下拉列表中的选项值,通过type_code区分选项值属于哪一个下拉列表

   queryDicValueByTypeCode("type")

  通过Mybatis逆向工程生成DicValueMapper等代码:

修改生成代码的目录:

 

运行Mybatis逆向工程:生成代码:DicValueMapper接口,DicValueMappe.xml,实体类DicValue

 在DivValueMapper接口添加:根据typeCode查询数据字典值的方法

 DivValueMapper.xml中:添加sql语句:

 <!--根据typeCode查询数据字典值 <include refid="Base_Column_List"/>:使用sql语句片段-->
  <select id="selectDicValueByTypeCode" parameterType="string" resultMap="BaseResultMap">
    select
    <include refid="Base_Column_List"/>
    from tbl_dic_value
    where type_code=#{typeCode}
    order by order_no asc
  </select>

创建DicValueService接口和实现类。

 

package com.bjpowernode.crm.settings.service;

import com.bjpowernode.crm.settings.domain.DicValue;

import java.util.List;

public interface DicValueService {
    //根据typeCode查询数据字典值
    List<DicValue> queryDicValueByTypeCode(String typeCode);
}

实现类:

package com.bjpowernode.crm.settings.service.impl;

import com.bjpowernode.crm.settings.domain.DicValue;
import com.bjpowernode.crm.settings.mapper.DicValueMapper;
import com.bjpowernode.crm.settings.service.DicValueService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service("dicValueService")
public class DicValueServiceImpl implements DicValueService {

    @Autowired
    private DicValueMapper dicValueMapper;

    //根据typeCode查询数据字典值
    @Override
    public List<DicValue> queryDicValueByTypeCode(String typeCode) {
        return dicValueMapper.selectDicValueByTypeCode(typeCode);
    }
}

 

创建ClueController:

 

package com.bjpowernode.crm.workbench.web.controller;

import com.bjpowernode.crm.commons.contants.Contants;
import com.bjpowernode.crm.commons.domain.ReturnObject;
import com.bjpowernode.crm.commons.utils.DateUtils;
import com.bjpowernode.crm.commons.utils.UUIDUtils;
import com.bjpowernode.crm.settings.domain.DicValue;
import com.bjpowernode.crm.settings.domain.User;
import com.bjpowernode.crm.settings.service.DicValueService;
import com.bjpowernode.crm.settings.service.UserService;
import com.bjpowernode.crm.workbench.domain.Activity;

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 javax.servlet.http.HttpSession;
import java.util.*;

@Controller
public class ClueController {

    @Autowired
    private UserService userService;

    @Autowired
    private DicValueService dicValueService;



    //根据typeCode查询数据字典值
    @RequestMapping("/workbench/clue/index.do")
    public String index(HttpServletRequest request){
        //调用service层方法,查询动态数据
        List<User> userList=userService.queryAllUsers();//查询用户
        List<DicValue> appellationList=dicValueService.queryDicValueByTypeCode("appellation");//查询称呼
        List<DicValue> clueStateList=dicValueService.queryDicValueByTypeCode("clueState");//查询线索状态
        List<DicValue> sourceList=dicValueService.queryDicValueByTypeCode("source");//查询线索来源
        //把数据保存到request中
        request.setAttribute("userList",userList);
        request.setAttribute("appellationList",appellationList);
        request.setAttribute("clueStateList",clueStateList);
        request.setAttribute("sourceList",sourceList);
        //请求转发
        return "workbench/clue/index";
    }

   
}

 

修改称index.jsp:

在添加线索模态窗口修改:

 通过EL和JSTL遍历数据:

线索:

 称呼:

 线索状态:

 线索来源:

 修改线索模态窗口也进行以上的设置

主页面也要修改动态获取数据:

 

 在业务主页面修改超链接,点击线索,跳转到线索页面:

 运行项目:

点击线索 :

线索来源是动态的从数据库查询来的: 

 添加线索里面的数据也是动态的:

 

 通过MyBatis逆向工程生成线索的相关代码:

修改来配置文件修改生成代码的位置:

打开线索表: 

 运行逆向工程

 生成代码:ClueMapper接口,ClueMapper.xml文件、实体类Clue

 在ClueMapper添加方法:保存线索:

 ClueMapper.xml:添加sql:

<!--保存创建的线索-->
  <insert id="insertClue" parameterType="com.bjpowernode.crm.workbench.domain.Clue">
    insert into tbl_clue(id, fullname, appellation, owner, company, job, email, phone, website, mphone, state,source, create_by, create_time, description, contact_summary,next_contact_time, address)
    values (#{id},#{ fullname},#{ appellation},#{ owner},#{ company},#{ job},#{ email},#{ phone},#{ website},#{ mphone},#{ state},#{source},#{ createBy},#{ createTime},#{ description},#{ contactSummary},#{nextContactTime},#{ address})
  </insert>

 

在ClueService接口添加方法:

package com.bjpowernode.crm.workbench.service;

import com.bjpowernode.crm.workbench.domain.Clue;

import java.util.Map;

public interface ClueService {
    //保存创建的线索
    int saveCreateClue(Clue clue);

   
}

实现类:

 在ClueController中添加请求:

 

 //保存创建的线索
   @RequestMapping("/workbench/clue/saveCreateClue.do")
    public @ResponseBody Object saveCreateClue(Clue clue, HttpSession session){
        User user=(User)session.getAttribute(Contants.SESSION_USER);

        //自己封装封装参数
        clue.setId(UUIDUtils.getUUID());
        clue.setCreateTime(DateUtils.formateDateTime(new Date()));
        clue.setCreateBy(user.getId());

        ReturnObject returnObject=new ReturnObject();
        try {
            //调用service层方法,保存创建的线索
            int ret = clueService.saveCreateClue(clue);

            if(ret>0){
                returnObject.setCode(Contants.RETURN_OBJECT_CODE_SUCCESS);
            }else{
                returnObject.setCode(Contants.RETURN_OBJECT_CODE_FAIL);
                returnObject.setMessage("系统忙,请稍后重试....");
            }
        }catch (Exception e){
            e.printStackTrace();
            returnObject.setCode(Contants.RETURN_OBJECT_CODE_FAIL);
            returnObject.setMessage("系统忙,请稍后重试....");
        }

        return returnObject;
    }

在线索主页detail.js页面创建线索的模态窗口,给保存按钮添加点击事件:

先添加一个id属性

 

//给"保存"按钮添加单击事件
			$("#saveCreateClueBtn").click(function () {
				//收集参数
				var fullname       =$.trim($("#create-fullname").val());
				var appellation    =$("#create-appellation").val();
				var owner          =$("#create-owner").val();
				var company        =$.trim($("#create-company").val());
				var job            =$.trim($("#create-job").val());
				var email          =$.trim($("#create-email").val());
				var phone          =$.trim($("#create-phone").val());
				var website        =$.trim($("#create-website").val());
				var mphone         =$.trim($("#create-mphone").val());
				var state          =$("#create-state").val();
				var source         =$("#create-source").val();
				var description    =$.trim($("#create-description").val());
				var contactSummary =$.trim($("#create-contactSummary").val());
				var nextContactTime=$.trim($("#create-nextContactTime").val());
				var address        =$.trim($("#create-address").val());
				//表单验证(作业)
				//带*非空
				//正则表达式验证

				//发送请求
				$.ajax({
					url:'workbench/clue/saveCreateClue.do',
					data:{
						fullname       :fullname       ,
						appellation    :appellation    ,
						owner          :owner          ,
						company        :company        ,
						job            :job            ,
						email          :email          ,
						phone          :phone          ,
						website        :website        ,
						mphone         :mphone         ,
						state          :state          ,
						source         :source         ,
						description    :description    ,
						contactSummary :contactSummary ,
						nextContactTime:nextContactTime,
						address        :address
					},
					type:'post',
					dataType:'json',
					success:function (data) {
						if(data.code=="1"){
							//关闭模态窗口
							$("#createClueModal").modal("hide");
							//刷新线索列表,显示第一页数据,保持每页显示条数不变(作业)

						}else{
							//提示信息
							alert(data.message);
							//模态窗口不关闭
							$("#createClueModal").modal("show");
						}
					}
				});
			});

 

//给"创建"按钮添加单击事件
			$("#createClueBtn").click(function () {
				//初始化工作
				$("#createClueForm")[0].reset();
				//弹出模态窗口
				$("#createClueModal").modal("show");
			});

  

点击保存:

 

 (6)crm线索和市场活动之间的关联关系  查看线索明细

 

 

查询线索明细流程:

 

 

 

 首先在线索Mapper添加方法:ClueMapper:

 

 ClueMapper.xml中添加sql语句:

 <!--通过id查询线索详情-->
  <select id="selectClueForDetailById" parameterType="string" resultMap="BaseResultMap">
    select cl.id,cl.fullname,dicv1.value as appellation,u1.name as owner,cl.company,cl.job,cl.email,cl.phone,
           cl.website,cl.mphone,dicv2.value as state,dicv3.value as source,u2.name as create_by,cl.create_time,
           u3.name as edit_by,cl.edit_time,cl.description,cl.contact_summary,cl.next_contact_time,cl.address
    from tbl_clue cl
    left join tbl_dic_value dicv1 on cl.appellation=dicv1.id
    left join tbl_dic_value dicv2 on cl.state=dicv2.id
    left join tbl_dic_value dicv3 on cl.source=dicv3.id
    join tbl_user u1 on cl.owner=u1.id
    join tbl_user u2 on cl.create_by=u2.id
    left join tbl_user u3 on cl.edit_by=u3.id
    where cl.id = #{id,jdbcType=CHAR}
  </select>

 在ClueService接口添加:

 实现类:

 使用MyBatis逆向工程生成线索备注Mapper、线索备注实体类代码:

修改配置文件修改生成的表:

运行:就生成了线索备注的实体类ClueMark、ClueRemarkMapper接口、ClueRemarkMapper.xml

 

 

在 ClueRemarkMapper接口:添加

 ClueRemarkMapper.xm中添加sql语句:

<!--根据线索id查询该线索的所有备注详细信息-->
  <select id="selectClueRemarkForDetailByClueId" parameterType="string" resultMap="BaseResultMap">
    select cr.id,cr.note_content,u1.name as create_by,cr.create_time,u2.name as edit_by,cr.edit_time,cr.edit_flag
    from tbl_clue_remark cr
    join tbl_user u1 on cr.create_by=u1.id
    left join tbl_user u2 on cr.edit_by=u2.id
    where cr.clue_id=#{clueId}
  </select>

 

 

 创建ClueRemarkService接口:

package com.bjpowernode.crm.workbench.service;



import com.bjpowernode.crm.workbench.domain.ClueRemark;

import java.util.List;

public interface ClueRemarkService {
    //根据线索id查询该线索下的所有备注详细信息
    List<ClueRemark> queryClueRemarkForDetailByClueId(String clueId);

    
}

实现类:

在市场活动的Mapper:ActivityMapper:加一个方法:

 

 ActivityMapper.xml:添加sql语句

 

 <!--根据clueId查询该线索相关联的市场活动的明细信息-->
  <select id="selectActivityForDetailByClueId" parameterType="string" resultMap="BaseResultMap">
    select a.id,a.name,a.start_date,a.end_date,u.name as owner
    from tbl_activity a
    join tbl_user u on a.owner=u.id
    join tbl_clue_activity_relation car on car.activity_id=a.id
    where car.clue_id=#{clueId}
  </select>

在ActivityService接口:添加方法

//根据clueId查询该线索相关联的市场活动的明细信息
    List<Activity> queryActivityForDetailByClueId(String clueId);

 

 实现类:

//根据clueId查询该线索相关联的市场活动的明细信息
    @Override
    public List<Activity> queryActivityForDetailByClueId(String clueId) {
        return activityMapper.selectActivityForDetailByClueId(clueId);
    }

在ClueControoler:添加:

 //线索请求页面的跳转请求
   @RequestMapping("/workbench/clue/detailClue.do")
    public String detailClue(String id,HttpServletRequest request){
        //调用service层方法,查询数据
        Clue clue=clueService.queryClueForDetailById(id);
        List<ClueRemark> remarkList=clueRemarkService.queryClueRemarkForDetailByClueId(id);
        List<Activity> activityList=activityService.queryActivityForDetailByClueId(id);
        //把数据保存到request中
        request.setAttribute("clue",clue);
        request.setAttribute("remarkList",remarkList);
        request.setAttribute("activityList",activityList);
        //请求转发
        return "workbench/clue/detail";
    }

 

把修改线索下的详细页面为detial.jsp

 修改页面代码:

从作用域获取数据:

 

 注释备注,进行动态获取:

 

注释写死的市场活动,动态获取:

 

 运行项目:

 点击张三博士:

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喵俺第一专栏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值