后端通用方法
 
## 1.获取登录用户权限字段

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

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

```bash
使用方法
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.区域代理商采番

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

## 5.时区转换

```bash
获取当前登录用户时区
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.消息推送

```bash
在需要推送消息时
需调用 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.业务流水采番

```bash
String No = RedisCache.generateSerialNumber（业务前缀）
```

## 8.导入excel

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

详细代码及实例见ExcelRestController
```

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

```bash
①根据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.业务排他校验

```bash
在更新接口处加入如下注解 @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方法引用即可。

使用方法如下：

```bash
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.代理商销售之间数据隔离
```bash
修改点有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>
```



## 13.聊天室配置项
```bash
1. 如果以后涉及 服务器ip、nginx代理接口发生变化，需要变更yml中的(fileConfig.file-prefix)配置（一定要变更，否则聊天室图片功能将不能正常使用）
这个配置：
    (1): 前端访问的controller层接口 前的请求路径，端口后不跟“/”，
        例如 
          本地：“http://localhost:8080”
          高达测试环境：“http://139.196.75.129:8852”
    (2):上下文（/prod-api）已经在上传接口中处理,如果后期不需要上下文，则在 CommonController
        下的 /upload 接口中，去掉上下文拼接
2.nginx.conf文件限制了 文件上传的大小，
    （1）仅前端或者后端checkAllow单方面调整限制无效，需要同步至nginx.conf，
                  目前配置限制了5m,，如果后续要变更，需要同步ngxin配置；           
                  client_max_body_size 5m; 加在 http级别下


```



