短信服务集成

This commit is contained in:
xy
2026-04-21 16:10:01 +08:00
parent 353a4cc83b
commit fed766bca4
39 changed files with 1325 additions and 37 deletions

View File

@@ -0,0 +1,24 @@
package com.njcn.cssystem.api;
import com.njcn.common.pojo.constant.ServerInfo;
import com.njcn.common.pojo.response.HttpResult;
import com.njcn.cssystem.api.fallback.AppMsgSetFeignClientFallbackFactory;
import com.njcn.cssystem.api.fallback.FeedBackFeignClientFallbackFactory;
import io.swagger.annotations.ApiOperation;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
/**
* @author xy
*/
@FeignClient(value = ServerInfo.CS_SYSTEM_BOOT, path = "/appMsgSet", fallbackFactory = AppMsgSetFeignClientFallbackFactory.class,contextId = "appMsgSet")
public interface AppMsgSetFeignClient {
@PostMapping("/queryUserIdsByDeviceId")
@ApiOperation("根据设备ID查询用户列表")
HttpResult<List<String>> queryUserIdsByDeviceId(@RequestParam("deviceId") @Validated String deviceId);
}

View File

@@ -0,0 +1,36 @@
package com.njcn.cssystem.api.fallback;
import com.njcn.common.pojo.enums.response.CommonResponseEnum;
import com.njcn.common.pojo.exception.BusinessException;
import com.njcn.common.pojo.response.HttpResult;
import com.njcn.cssystem.api.AppMsgSetFeignClient;
import feign.hystrix.FallbackFactory;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* @author xy
*/
@Slf4j
@Component
public class AppMsgSetFeignClientFallbackFactory implements FallbackFactory<AppMsgSetFeignClient> {
@Override
public AppMsgSetFeignClient create(Throwable cause) {
//判断抛出异常是否为解码器抛出的业务异常
Enum<?> exceptionEnum = CommonResponseEnum.SERVICE_FALLBACK;
if (cause.getCause() instanceof BusinessException) {
BusinessException businessException = (BusinessException) cause.getCause();
}
Enum<?> finalExceptionEnum = exceptionEnum;
return new AppMsgSetFeignClient() {
@Override
public HttpResult<List<String>> queryUserIdsByDeviceId(String deviceId) {
log.error("{}异常,降级处理,异常为:{}","根据设备ID查询用户列表数据异常",cause.toString());
throw new BusinessException(finalExceptionEnum);
}
};
}
}

View File

@@ -0,0 +1,17 @@
package com.njcn.cssystem.pojo.param;
import lombok.Data;
import java.util.List;
/**
* @author xy
*/
@Data
public class AppMsgSetParam {
private String userId;
private List<String> deviceIds;
}

View File

@@ -28,4 +28,13 @@ public class AppVersionParam implements Serializable {
@NotNull(message = "版本类型不能为空")
private String versionType;
@ApiModelProperty("安卓更新地址")
private String androidPath;
@ApiModelProperty("ios更新地址")
private String iosPath;
@ApiModelProperty("版本ID")
private String id;
}

View File

@@ -0,0 +1,40 @@
package com.njcn.cssystem.pojo.po;
import com.baomidou.mybatisplus.annotation.TableName;
import com.njcn.db.bo.BaseEntity;
import java.io.Serializable;
import lombok.Getter;
import lombok.Setter;
/**
* <p>
* 设备发送短信配置表
* </p>
*
* @author xy
* @since 2026-04-21
*/
@Getter
@Setter
@TableName("app_msg_set")
public class AppMsgSet implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
private String id;
/**
* 用户ID
*/
private String userId;
/**
* 设备ID
*/
private String deviceId;
}

View File

@@ -53,5 +53,14 @@ public class AppVersion extends BaseEntity implements Serializable {
*/
private String content;
/**
* 安卓更新地址
*/
private String androidPath;
/**
* ios更新地址
*/
private String iosPath;
}

View File

@@ -22,4 +22,10 @@ public class AppVersionVo implements Serializable {
@ApiModelProperty("严重度(0:优化 1:bug调整)")
private Integer sev;
@ApiModelProperty("安卓更新地址")
private String androidPath;
@ApiModelProperty("ios更新地址")
private String iosPath;
}

View File

@@ -30,6 +30,9 @@ public class WlUserVo implements Serializable {
@ApiModelProperty(value = "工程名称")
private String name;
@ApiModelProperty(value = "设备集合")
private List<portableDevVo> devList;
}
@Data

View File

@@ -0,0 +1,86 @@
package com.njcn.cssystem.controller;
import com.njcn.common.pojo.annotation.OperateInfo;
import com.njcn.common.pojo.constant.OperateType;
import com.njcn.common.pojo.enums.common.LogEnum;
import com.njcn.common.pojo.enums.response.CommonResponseEnum;
import com.njcn.common.pojo.response.HttpResult;
import com.njcn.common.utils.HttpResultUtil;
import com.njcn.common.utils.LogUtil;
import com.njcn.cssystem.pojo.param.AppMsgSetParam;
import com.njcn.cssystem.service.IAppMsgSetService;
import com.njcn.web.controller.BaseController;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* <p>
* 设备发送短信配置表 前端控制器
* </p>
*
* @author xy
* @since 2026-04-21
*/
@RestController
@RequestMapping("/appMsgSet")
@Slf4j
@Api(tags = "短信配置")
@AllArgsConstructor
public class AppMsgSetController extends BaseController {
private final IAppMsgSetService appMsgSetService;
@OperateInfo(info = LogEnum.SYSTEM_COMMON, operateType = OperateType.ADD)
@PostMapping("/addUserDevices")
@ApiOperation("新增用户设备关联")
@ApiImplicitParam(name = "param", value = "参数{userId:用户ID, deviceIds:设备ID列表}", required = true)
public HttpResult<Void> addUserDevices(@RequestBody @Validated AppMsgSetParam param) {
String methodDescribe = getMethodDescribe("addUserDevices");
LogUtil.njcnDebug(log, "{},参数:{}", methodDescribe, param);
appMsgSetService.addUserDevices(param.getUserId(), param.getDeviceIds());
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, null, methodDescribe);
}
@OperateInfo(info = LogEnum.SYSTEM_COMMON, operateType = OperateType.DELETE)
@PostMapping("/deleteByUserId")
@ApiOperation("根据用户ID删除设备关联")
@ApiImplicitParam(name = "userId", value = "用户ID", required = true)
public HttpResult<Void> deleteByUserId(@RequestParam @Validated String userId) {
String methodDescribe = getMethodDescribe("deleteByUserId");
LogUtil.njcnDebug(log, "{}用户ID{}", methodDescribe, userId);
appMsgSetService.deleteByUserId(userId);
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, null, methodDescribe);
}
@OperateInfo(info = LogEnum.SYSTEM_COMMON, operateType = OperateType.QUERY)
@PostMapping("/queryDeviceIdsByUserId")
@ApiOperation("根据用户ID查询设备列表")
@ApiImplicitParam(name = "userId", value = "用户ID", required = true)
public HttpResult<List<String>> queryDeviceIdsByUserId(@RequestParam @Validated String userId) {
String methodDescribe = getMethodDescribe("queryDeviceIdsByUserId");
LogUtil.njcnDebug(log, "{}用户ID{}", methodDescribe, userId);
List<String> deviceIds = appMsgSetService.queryDeviceIdsByUserId(userId);
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, deviceIds, methodDescribe);
}
@OperateInfo(info = LogEnum.SYSTEM_COMMON, operateType = OperateType.QUERY)
@PostMapping("/queryUserIdsByDeviceId")
@ApiOperation("根据设备ID查询用户列表")
@ApiImplicitParam(name = "deviceId", value = "设备ID", required = true)
public HttpResult<List<String>> queryUserIdsByDeviceId(@RequestParam @Validated String deviceId) {
String methodDescribe = getMethodDescribe("queryUserIdsByDeviceId");
LogUtil.njcnDebug(log, "{}设备ID{}", methodDescribe, deviceId);
List<String> userIds = appMsgSetService.queryUserIdsByDeviceId(deviceId);
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, userIds, methodDescribe);
}
}

View File

@@ -72,5 +72,34 @@ public class AppVersionController extends BaseController {
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, list, methodDescribe);
}
@OperateInfo(info = LogEnum.BUSINESS_COMMON)
@PostMapping("/update")
@ApiOperation("修改版本信息")
@ApiImplicitParam(name = "param", value = "app版本信息", required = true)
public HttpResult<String> update(@RequestBody @Validated AppVersionParam param){
String methodDescribe = getMethodDescribe("update");
boolean result = appVersionService.update(param);
if (result) {
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, "修改成功", methodDescribe);
} else {
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.FAIL, "修改失败", methodDescribe);
}
}
@OperateInfo(info = LogEnum.BUSINESS_COMMON)
@PostMapping("/delete")
@ApiOperation("删除版本信息")
@ApiImplicitParam(name = "id", value = "版本ID", required = true)
public HttpResult<String> delete(@RequestParam("id") String id){
String methodDescribe = getMethodDescribe("delete");
boolean result = appVersionService.delete(id);
if (result) {
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, "删除成功", methodDescribe);
} else {
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.FAIL, "删除失败", methodDescribe);
}
}
}

View File

@@ -0,0 +1,16 @@
package com.njcn.cssystem.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.njcn.cssystem.pojo.po.AppMsgSet;
/**
* <p>
* 设备发送短信配置表 Mapper 接口
* </p>
*
* @author xy
* @since 2026-04-21
*/
public interface AppMsgSetMapper extends BaseMapper<AppMsgSet> {
}

View File

@@ -0,0 +1,50 @@
package com.njcn.cssystem.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.njcn.cssystem.pojo.po.AppMsgSet;
import java.util.List;
/**
* <p>
* 设备发送短信配置表 服务类
* </p>
*
* @author xy
* @since 2026-04-21
*/
public interface IAppMsgSetService extends IService<AppMsgSet> {
/**
* 新增用户设备关联(先清空该用户的旧数据,再批量插入新数据)
*
* @param userId 用户ID
* @param deviceIds 设备ID列表
*/
void addUserDevices(String userId, List<String> deviceIds);
/**
* 根据用户ID删除设备关联
*
* @param userId 用户ID
*/
void deleteByUserId(String userId);
/**
* 根据用户ID查询设备列表
*
* @param userId 用户ID
* @return 设备ID列表
*/
List<String> queryDeviceIdsByUserId(String userId);
/**
* 根据设备ID查询用户列表
*
* @param deviceId 设备ID
* @return 用户ID列表
*/
List<String> queryUserIdsByDeviceId(String deviceId);
}

View File

@@ -22,4 +22,8 @@ public interface IAppVersionService extends IService<AppVersion> {
AppVersionVo getLastData(String versionType);
List<AppVersion> getAllData(String versionType);
boolean update(AppVersionParam param);
boolean delete(String id);
}

View File

@@ -0,0 +1,90 @@
package com.njcn.cssystem.service.impl;
import cn.hutool.core.util.IdUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.njcn.cssystem.mapper.AppMsgSetMapper;
import com.njcn.cssystem.pojo.po.AppMsgSet;
import com.njcn.cssystem.service.IAppMsgSetService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
/**
* <p>
* 设备发送短信配置表 服务实现类
* </p>
*
* @author xy
* @since 2026-04-21
*/
@Service
public class AppMsgSetServiceImpl extends ServiceImpl<AppMsgSetMapper, AppMsgSet> implements IAppMsgSetService {
@Override
@Transactional(rollbackFor = Exception.class)
public void addUserDevices(String userId, List<String> deviceIds) {
// 先删除该用户的所有设备关联
deleteByUserId(userId);
// 如果设备列表为空,直接返回
if (CollectionUtils.isEmpty(deviceIds)) {
return;
}
// 批量插入新的设备关联
List<AppMsgSet> relationList = new ArrayList<>();
for (String deviceId : deviceIds) {
AppMsgSet relation = new AppMsgSet();
relation.setId(IdUtil.fastSimpleUUID());
relation.setUserId(userId);
relation.setDeviceId(deviceId);
relationList.add(relation);
}
this.saveBatch(relationList);
}
@Override
public void deleteByUserId(String userId) {
LambdaQueryWrapper<AppMsgSet> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(AppMsgSet::getUserId, userId);
this.remove(wrapper);
}
@Override
public List<String> queryDeviceIdsByUserId(String userId) {
LambdaQueryWrapper<AppMsgSet> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(AppMsgSet::getUserId, userId);
wrapper.select(AppMsgSet::getDeviceId);
List<AppMsgSet> relationList = this.list(wrapper);
List<String> deviceIds = new ArrayList<>();
if (CollectionUtils.isNotEmpty(relationList)) {
for (AppMsgSet relation : relationList) {
deviceIds.add(relation.getDeviceId());
}
}
return deviceIds;
}
@Override
public List<String> queryUserIdsByDeviceId(String deviceId) {
LambdaQueryWrapper<AppMsgSet> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(AppMsgSet::getDeviceId, deviceId);
wrapper.select(AppMsgSet::getUserId);
List<AppMsgSet> relationList = this.list(wrapper);
List<String> userIds = new ArrayList<>();
if (CollectionUtils.isNotEmpty(relationList)) {
for (AppMsgSet relation : relationList) {
userIds.add(relation.getUserId());
}
}
return userIds;
}
}

View File

@@ -34,6 +34,8 @@ public class AppVersionServiceImpl extends ServiceImpl<AppVersionMapper, AppVers
appVersion.setSev(param.getSev());
appVersion.setVersionType(param.getVersionType());
appVersion.setContent(param.getContent());
appVersion.setAndroidPath(param.getAndroidPath());
appVersion.setIosPath(param.getIosPath());
return this.save(appVersion);
}
@@ -59,4 +61,22 @@ public class AppVersionServiceImpl extends ServiceImpl<AppVersionMapper, AppVers
queryWrapper.orderByDesc(AppVersion::getPublishTime);
return this.list(queryWrapper);
}
@Override
public boolean update(AppVersionParam param) {
AppVersion appVersion = new AppVersion();
appVersion.setId(param.getId());
appVersion.setVersionName(param.getAppVersion());
appVersion.setSev(param.getSev());
appVersion.setVersionType(param.getVersionType());
appVersion.setContent(param.getContent());
appVersion.setAndroidPath(param.getAndroidPath());
appVersion.setIosPath(param.getIosPath());
return this.updateById(appVersion);
}
@Override
public boolean delete(String id) {
return this.removeById(id);
}
}

View File

@@ -48,7 +48,18 @@ public class WlUserServiceImpl implements IWlUserService {
} else {
WlUserVo.EngineeringVo engineeringVo = new WlUserVo.EngineeringVo();
engineeringVo.setId(item.getEngineeringid());
engineeringVo.setName(item.getEngineeringName());
engineeringVo.setName(item.getEngineeringName() + "("+item.getEquipmentName()+")");
List<WlUserVo.portableDevVo> devList2 = new ArrayList<>();
String[] arr1 = item.getEquipmentId().split(",");
String[] arr2 = item.getEquipmentName().split(",");
for (int i = 0; i < arr1.length; i++) {
WlUserVo.portableDevVo portableDevVo = new WlUserVo.portableDevVo();
portableDevVo.setId(arr1[i]);
portableDevVo.setName(arr2[i]);
devList2.add(portableDevVo);
}
engineeringVo.setDevList(devList2);
list1.add(engineeringVo);
}
});