tangyp a33575c169 init 二期后端 3 månader sedan
..
bin cdba2e0898 init 一期 3 månader sedan
doc cdba2e0898 init 一期 3 månader sedan
sql cdba2e0898 init 一期 3 månader sedan
src a33575c169 init 二期后端 3 månader sedan
.gitignore a33575c169 init 二期后端 3 månader sedan
LICENSE cdba2e0898 init 一期 3 månader sedan
README.md a33575c169 init 二期后端 3 månader sedan
pom.xml a33575c169 init 二期后端 3 månader sedan
ry.bat cdba2e0898 init 一期 3 månader sedan
ry.sh cdba2e0898 init 一期 3 månader sedan

README.md

后端通用方法

1.获取登录用户权限字段

//获取带逗号的权限字符
String res = SecurityUtils.getPermissionCharSea();
例如: ,1,
//获取不带逗号的权限
String ress = SecurityUtils.getPermissionCharIns();
例如: 1

2.用户数据权限查询视图

使用方法
SELECT p.premession_char FROM (SELECT @premessionStr:=',1,' p) param , getpremessionview p


2024修改,个人权限可以选择多个
使用新方法 getpremessionview_chars, 传参处需修改, 权限字符以 A,B,C 的形式传入
SELECT p.premession_char FROM (SELECT @premessionStr:='120,119' p) param , getpremessionview_chars p


其中,1,为登录用户的权限字符串,直接获取传入。

在查询用户数据列表时
select s.*
from XXX s (数据源表)
inner join (
SELECT p.premession_char FROM (SELECT @premessionStr:=',1,' p) param , getpremessionview p
) permission on permission.premession_char = s.premession_char  (关联用户权限表。只查询出带有权限的数据列)
where .........

3.区域代理商采番

使用commonService下的getCommonID
commonService.getCommonID("seq_area_agent")
传人参数为固定值 seq_area_agent

5.时区转换

获取当前登录用户时区
String ss = SecurityUtils.getTimeZone();

此方法为 时间字符串 获取 UTC时间字符串 的方法
参数:time 为当地时间 ; Asia/Shanghai为当前时区
String UTC_Time = DateUtils.UTCTimeStr(Object time,"Asia/Shanghai");

方法优化现拆分为两个方法,传入time参数可输入日期或string,返回类型根据需要调用不同方法
UTCTimeStr(Object time,"Asia/Shanghai") 返回string
UTCTimeDate(Object time,"Asia/Shanghai") 返回Date

此方法为 UTC时间字符串 转 当地时间字符串 的方法
参数:time 为UTC时间 ; Asia/Shanghai为要转换的时区
String LOCAL_Time = DateUtils.LocalTime(Object time,"Asia/Shanghai");

6.消息推送

在需要推送消息时
需调用 sseEmitterService.sendSaveMessage(ids,message);方法

例如:
  List<Long> ids = new ArrayList<>();
        ids.add(1L);
        Message message = new Message();
        message.setMessageContent("测试推送消息");
        sseEmitterService.sendSaveMessage(ids,message);
其中 ids为需要发送的人员id,
message为消息实体,具体内容按需填充。其中消息内容和消息类型需设置。

7.业务流水采番

String No = RedisCache.generateSerialNumber(业务前缀)

8.导入excel

导入主要修改文件 ExcelRestController / TableTypeEnum
1.首先修改TableTypeEnum枚举类,新增你需要的导入文件类型
2.在/resources/excelTemplate,放入模板文件,注意名称要和枚举类/前端传入文件名相同
3.修改ExcelRestController-downloadTemplate方法,将枚举类填入switch中,此方法为下载模板方法
4.新增导入实体类,参考 CustomerInfoHelper 。其中导入文件字段顺序需和实体中index保持一致。
其余详细配置项参考官方文档
5..修改ExcelRestController-check方法,将验证导入数据是否正确的方法写在checkSheets()方法中。
此方法在运行时会调用传入的验证方法。
6..修改ExcelRestController-saveBatch方法,此方法为保存数据方法。增加新的类型并填入保存方法完成保存。

详细代码及实例见ExcelRestController

9. 后台推送站内信或微信等

①根据i18n中的msg,分别获取多种语言的msg内容。
例:
MessageSource messageSource = SpringUtils.getBean(MessageSource.class);
String messageContent = messageSource.getMessage("message.reminderNotFollowingProject", args, new Locale("zh","CN"));
String messageContentUS = messageSource.getMessage("message.reminderNotFollowingProject", args,new Locale("en","US"));
String messageContentRU = messageSource.getMessage("message.reminderNotFollowingProject", args,new Locale("ru","RU"));
String messageContentES = messageSource.getMessage("message.reminderNotFollowingProject", args,new Locale("es","ES"));

②MessageType用字典中的value设定,便于前端国际化。
例:
message.setMessageType(MessageTypeEnum.PROJECT_UN_FOLLOW.getValue());   <--  项目跟踪提醒

③定时任务的场合,创建人必须设定。
message.setCreateBy("1");        <--  项目创建人设为admin

10.业务排他校验

在更新接口处加入如下注解 @DataUpdateCheck

例:@PutMapping
    @DataUpdateCheck(key = "id", tableName ="tp_elevator_model")
    public AjaxResult edit(@RequestBody TpElevatorModel tpElevatorModel)
    {
        return toAjax(tpElevatorModelService.updateTpElevatorModel(tpElevatorModel));
    }
其中key 为数据表主键字段
tableName 为修改表名
注意 
1.该注解只针对传入实体对应的表,key字段在传入实体中必须要存在,且字段名一致。
2.还需传入updateTime字段,作为判断依据

11.处理查询时的一些特殊字符转义

可以使用com.ruoyi.common.utils.SpecialCharacterEscaper.escapeSpecialCharacters(R r, SFunction<R, Object>... consumers)方法 第一个参数是要处理的参数对象, 第二个参数是可变参数,需要处理的字段, 取对应字段的get方法引用即可。

使用方法如下:

public List<TcLead> selectTcLeadList(LeadListReq tcLead) {
    SpecialCharacterEscaper.escapeSpecialCharacters(tcLead, LeadListReq::getLeadNo, LeadListReq::getAccountNo,
            LeadListReq::getCompany, LeadListReq::getOwnerName, LeadListReq::getContact, LeadListReq::getRequirement,
            LeadListReq::getAddress, LeadListReq::getCreateByName);
    
    return tcLeadMapper.selectTcLeadList(tcLead);
}

12.代理商销售之间数据隔离

修改点有2个
1. impl 参数中追加 loginUserId(该项目在BaseEnatity里已追加)
        Long loginUserId = SecurityUtils.getUserId();
        // 代理商销售经理的场合
        if(SecurityUtils.hasRole("agent_sales")){
            tcFollow.setLoginUserId(loginUserId);
        }
2. Mapper.xml里追加检索条件
        <where>
            <if test="loginUserId != null  and loginUserId != ''">
                and (sub1.permission_char &lt;&gt; #{permissionChar} or sub1.create_by = #{loginUserId})
            </if>