线索转商机,分配归属人失败
解决方法:将RuleStrategy策略类中的三个位置修改即可,下面有详细步骤
1.将自动装配的mapper类的static删除,静态无法自动装配
//第一个修改点:将自动装配的static删除
@Autowired
private TbAssignRecordMapper assignRecordMapper;
@Autowired
private SysUserMapper userMapper;
@Autowired
private SysDictDataMapper dictDataMapper;
2.将静态代码块改为使用@PostConstruct注解的方法即可
第二个修改点
@PostConstruct
public void init(){
try{
//空间换时间的方式将数据库中的学科读取到内存中,预加载学科数据到内存中
List<SysDictData> course_subject = dictDataMapper.selectDictDataByType("course_subject");
for (SysDictData index: course_subject) {
//找到java和前端两个学科对应的数值
if(index.getDictLabel().equals("Java")){
subjectJAVA = index;
}
if(index.getDictLabel().equals("前端")){
subjectHtml = index;
}
}
//预加载lisi和lisi1的数据到内存中
lisi = userMapper.selectUserByName("lisi");
lisi1 = userMapper.selectUserByName("lisi1");
}catch (Exception e){
}
}
3.将 自动分配的方法中if判断里的字段修改即可
//第三个修改点
@Override
public Integer transforBusiness(TbBusiness tbBusiness) {
//这里equal中换成getgetDictValue()即可
if(tbBusiness.getSubject().equals(subjectJAVA.getDictValue())){
//如果意向学科是java--分配给lisi
return distribute(tbBusiness,lisi);
}else if(tbBusiness.getSubject().equals(subjectHtml.getDictValue())){
//如果意向学科是前端--分配给lisi1
return distribute(tbBusiness,lisi1);
}else{
//不进行分配,不添加分配记录-----即待分配状态
return 1;
}
}
详细步骤
例如:zhangsan将某一个用户线索转化成商机,
应该分配给具体的商机专员进行跟进,分配失败
CRM系统使用zhangsan账号登录进行线索跟进时,注意看意向学科是哪个学科.
因为不同的学科会分配给不同的员工账户
当我们点击转商机后,显示操作成功
当我们更换lifeng账户查看 商机管理 时发现,郎旭奕的归属人为空
按照规则,意向学科为Java的自动分配给账号lisi,但是现在归属人为空,证明自动分配出现问题
打开f12查看请求为
--------------------------------------------------------------------------------------------------------------------------------
去idea中找到该请求的业务层代码
使用策略商机模式,选择了一个Rule对象进行线索的分配
第一个为Admin处理策略:把需要转商机的线索都交给由admin超级管理员账号来处理转换成商机,
第二个为rule处理策略:根据系统设置将线索转成商机自动分配对应的专员去处理
--------------------------------------------------------------------------------------------------------------------------------
根据要求得知我们需要使用第二个策略类,那我们怎么才能让系统使用第二个类呢?
使用@ConditionalOnProperty(name = "标签", havingValue = "标签的属性")注解
@ConditionalOnProperty
注解用于在指定的配置属性存在时才会启用一个配置类或配置方法。该注解可以在类上或方法上使用,并需要指定一个配置属性名称,以及该属性的期望值。如果指定的属性不存在或其值与期望值不匹配,则该配置类或配置方法将不会被启用。
此注解需要在yml配置文件中设置标签和属性,在yml中添加此内容(注意:先看一下自己yml文件中是否以及存在此标签)
这时我们去查看admin策略类和rule策略类的注解中都写了什么
通过注解:@ConditionalOnProperty(name="",havingValue="")
比较name和havingValue的属性值和yml配置文件中的是否一致
如果一致,spring容器选择创建此对象
(这里这么配置的原因是更换策略的时候,只需要把yml配置文件中的属性修改为其他策略类的即可,例如更换admin策略类只需要把yml中的rule改为admin即可)
---------------------------------------------------------------------------------------------------------------------------------
rule策略类中的错误
我们进入rule策略类中发现自动装配的mapper类都是static静态的,静态是无法自动装配注入的,使用我们需要把static删掉,不要静态的
修改后往下滑可以看到一个静态代码块,这个方法是为自动分配提供字段的(数据库中的Java和前端两个字段都塞到实体类中以备分配时直接取用节省时间)
这里是使用了空间换时间的方式,即在程序运行时就把需要的数据查询出来放入内存中以备后面使用时节省时间
空间换时间思想(重点)
在线索进行分配前,将分配时需要使用的四个对象,进行提前实例化
但是这里不应该用static静态代码块,因为使用静态代码块会导致上面的自动装配和实体类都还未初始化成功,会导致直接出现异常,所以我们应该使用另一种方式
@PostConstruct注解
@PostConstruct注解是Java中的一种注解,它用于在依赖注入完成后执行初始化方法。当一个Bean被创建并且所有的属性被赋值之后,该注解标注的方法会被自动调用。这样可以确保Bean在使用之前被正确初始化.
将静态代码块的static修改为一个方法,方法名随意,方法上加注解,这样就可以保证自动装配和实体类都初始化成功后在执行这里的代码,不会出现异常.
修改完这里后我们发现转商机还是无法自动分配给员工,那是因为前端传来的数据是数字,而不是java或者前端的字符串,所以我们看刚才的静态代码块下面的一个方法
我们发现这里对比的时候是用前端传来的数字和字符串java或者前端进行对比,那必定不可能成功,所以我们看数据库的字段
在判断当前学科时,选择的字典字段有误,更换字段即可
重启项目进行转商机我们发现已经正常了