一.Bug分析
1.现象
线索管理-线索池-线索捞取-提示信息异常:捞取失败!最大保有量(30),剩余可以捞取-209条线索" (剩余线索数为负数)
注:使用zhangsan的权限登录
2 定位接口
通过浏览器的开发者模式的Network选项卡,观察发送的请求和返回的响应
由上述图可解析到
请求路径: /clues/clue/gain
请求方式: PUT方式
请求参数:ids ,userId
3.查看接口代码
返回到idea中 双击shift 输入路径进入到该controller
进入三层调用
4.确定bug位置
5 修改bug
这是一个显示bug,规则保存在规则表里,规则表里定义了每个人拥有的线索的上限,当我们批量导入线索的时候是可以超过最大上限的,这是允许的情况,这里我们在捞取的时候,如果超过了上限,不用相减,直接返回0即可
二.Bug加特林
1 用户搜索
系统管理-权限管理-用户管理-高级搜索-手机号搜索不可用,需要修改为可以根据手机号模糊搜索
注: 使用admin账户登录
如上述所述,发现现象,定位接口
请求路径: /clues/clue/list
请求方式: GET方式
通过三层查看代码出现在sql层 没有phonenumber的模糊查询语句
在sql中添加即可
2.公海池搜索
创建时间搜索,没有效果
同上述1 的方法进行定位判断,可得知
同过三层判断后得知是sql中没有根据创建时间进行搜索
3.活动信息
线索管理-添加线索-活动信息-应该只展示 正在活动时间内的活动
定位接口
首先修改controller层,在构建活动类的时候初始化一个当前时间
在sql查询中添加一条
<if test="params.now != null and params.now != ''"><!-- 处理当前时间 -->
and #{params.now} between begin_time and end_time
</if>
5.任务分配
当线索转商机时,我们希望使用规则进行任务的分配,具体规则如下:
-
意向学科是java的分配给lisi商机专员
-
意向学科是前端的分配给lisi1商机专员
-
其他意向的等待主管来进行手动分配
-
点击转商机
-
现象:我们使用lifeng即主管来进行登录,发现数据并没有被分配给lisi
通过f12可得知对应的接口名
如上述相同的操作去定位后端代码
在这里我们看到了我们首先往商机表里添加了一条数据,并且设置了对应的状态是待跟进状态
接下来调用rule.transforBusiness(tbBusiness)方法将此商机分配给具体的员工去跟进,那么他是按照什么样的规则来进行分配的呢?
这个端逻辑就应该定义在rule的transforBusiness方法中,进一步跟代码发现rule是一个接口,而且有两个实现类
这两个实现类一个是AdminStrategy另一个是RuleStrategy
这两个实现类都实现了这个接口,而我们是注入的这个接口,具体我们是使用哪个类作为我们的实现类呢?
观察下这两个实现类我们发现每个实现类上都有一个@ConditionalOnProperty注解
该注解的主要意义是,读取配置文件application.yml文件中的rule.transfor字段,判断字段的内容与havingValue里的内容进行对比,
如果配置的内容与havingValue里的内容相同,则springboot会基于配置的内容,选择对应类作为接口的实现类
通过观察配置文件中的配置项,我们可以确定,当前项目使用的是RuleStrategy实现类定义的逻辑来处理业务的
可得知是从中出现了问题 接下来我们进入RuleStrategy去查看代码原由
mapper无法注入
静态成员属于类的,当类加载器加载静态变量时,Spring上下文尚未加载。所以类加载器不会在bean中正确注入静态类,并且会失败,@Autowired 不能给静态变量依赖注入
我们得知原由后,进行搜索得知可以用预加载数据的方法进行修改
@postConstruct修饰一个方法
将注入的static方法去掉改为预加载处理
注意这里还有一个小bug,就是在匹配学科字段的时候
-
我们比较的顺序应该调换一下,因为tbBusiness有可能为空 null.equals(xxx)会报错
比较的内容也有问题:tbBusiness.getSubject()得到的是dict_value,所以应该与字典表中的dict_value字段比较,而不是dict_label字段