个推相关修改

This commit is contained in:
Jack 2025-06-10 00:35:49 +08:00
parent dc2300397d
commit 5b897f371e
18 changed files with 339 additions and 162 deletions

View File

@ -1,6 +1,5 @@
package com.suisung.mall.account.controller.mobile;
import com.getui.push.v2.sdk.api.PushApi;
import com.suisung.mall.account.service.AccountSinglePushService;
import com.suisung.mall.common.api.CommonResult;
import com.suisung.mall.common.modules.push.PushTemplate;
@ -34,14 +33,14 @@ public class SinglePushController {
}
@PostMapping("/pushTocid")
public CommonResult pushTocid(@RequestParam String userId, @RequestParam String message) {
public CommonResult pushTocid(@RequestParam Integer userId, @RequestParam String message) {
log.info("pushTocid");
return accountSinglePushService.pushTocid(message, userId);
}
@PostMapping("/pushNotificationTocid")
public CommonResult pushNotificationTocid(@RequestParam String userId,@RequestBody PushTemplate pushTemplate) {
public CommonResult pushNotificationTocid(@RequestParam Integer userId, @RequestBody PushTemplate pushTemplate) {
log.info("pushNotificationTocid");
return accountSinglePushService.pushTocid(pushTemplate,userId);
return accountSinglePushService.pushTocid(pushTemplate, userId);
}
}

View File

@ -1,9 +1,9 @@
package com.suisung.mall.account.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.suisung.mall.common.modules.singlepush.UserDeviceBind;
import com.suisung.mall.common.modules.singlepush.AccountUserBindGeTui;
import org.springframework.stereotype.Repository;
@Repository
public interface UserDeviceBindMapper extends BaseMapper<UserDeviceBind> {
public interface UserDeviceBindMapper extends BaseMapper<AccountUserBindGeTui> {
}

View File

@ -1,12 +1,8 @@
package com.suisung.mall.account.service;
import com.getui.push.v2.sdk.dto.req.message.PushMessage;
import com.getui.push.v2.sdk.dto.res.TokenDTO;
import com.suisung.mall.common.api.CommonResult;
import com.suisung.mall.common.modules.push.PushTemplate;
import com.suisung.mall.common.service.SinglePushBaseService;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Service;
public interface AccountSinglePushService extends SinglePushBaseService {
@ -17,15 +13,17 @@ public interface AccountSinglePushService extends SinglePushBaseService {
/**
* 透传方式
*
* @param message
* @param userId
*/
CommonResult pushTocid(String message,String userId);
CommonResult pushTocid(String message, Integer userId);
/**
* 消息通知方式
*
* @param pushTemplate
* @param userId
*/
CommonResult pushTocid(PushTemplate pushTemplate, String userId);
CommonResult pushTocid(PushTemplate pushTemplate, Integer userId);
}

View File

@ -0,0 +1,13 @@
package com.suisung.mall.account.service;
import com.suisung.mall.common.modules.singlepush.AccountUserBindGeTui;
import com.suisung.mall.core.web.service.IBaseService;
import java.util.List;
public interface AccountUserBindGeTuiService extends IBaseService<AccountUserBindGeTui> {
Boolean addOrUpdate(AccountUserBindGeTui accountUserBindGeTui);
List<AccountUserBindGeTui> getActive(AccountUserBindGeTui accountUserBindGeTui);
}

View File

@ -1,14 +0,0 @@
package com.suisung.mall.account.service;
import com.suisung.mall.common.modules.singlepush.UserDeviceBind;
import com.suisung.mall.core.web.service.IBaseService;
import org.springframework.stereotype.Service;
import java.util.List;
public interface UserDeviceBindService extends IBaseService<UserDeviceBind> {
void saveUserDeviceBind(UserDeviceBind userDeviceBind);
List<UserDeviceBind> getActive(UserDeviceBind userDeviceBind);
}

View File

@ -14,13 +14,11 @@ import com.getui.push.v2.sdk.dto.req.message.ios.Alert;
import com.getui.push.v2.sdk.dto.req.message.ios.Aps;
import com.getui.push.v2.sdk.dto.req.message.ios.IosDTO;
import com.suisung.mall.account.service.AccountSinglePushService;
import com.suisung.mall.account.service.UserDeviceBindService;
import com.suisung.mall.account.service.AccountUserBindGeTuiService;
import com.suisung.mall.common.api.CommonResult;
import com.suisung.mall.common.modules.push.PushTemplate;
import com.suisung.mall.common.modules.singlepush.UserDeviceBind;
import com.suisung.mall.common.pojo.res.ThirdApiRes;
import com.suisung.mall.common.modules.singlepush.AccountUserBindGeTui;
import com.suisung.mall.common.service.impl.SinglePushBaseServiceImpl;
import org.checkerframework.checker.units.qual.A;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@ -33,7 +31,7 @@ import java.util.UUID;
public class AccountSinglePushServiceImpl extends SinglePushBaseServiceImpl implements AccountSinglePushService {
@Autowired
private UserDeviceBindService userDeviceBindService;
private AccountUserBindGeTuiService accountUserBindGeTuiService;
@Override
public String getTokenString() {
@ -45,10 +43,10 @@ public class AccountSinglePushServiceImpl extends SinglePushBaseServiceImpl impl
}
@Override
public CommonResult pushTocid(String message, String userId) {
UserDeviceBind userDeviceBind = new UserDeviceBind();
userDeviceBind.setUserId(userId);
List<UserDeviceBind> list = userDeviceBindService.getActive(userDeviceBind);
public CommonResult pushTocid(String message, Integer userId) {
AccountUserBindGeTui accountUserBindGeTui = new AccountUserBindGeTui();
accountUserBindGeTui.setUserId(userId);
List<AccountUserBindGeTui> list = accountUserBindGeTuiService.getActive(accountUserBindGeTui);
if (CollectionUtil.isEmpty(list)) {
log.error("登录时绑定设备不存在");
return CommonResult.failed("登录时绑定设备不存在");
@ -67,18 +65,18 @@ public class AccountSinglePushServiceImpl extends SinglePushBaseServiceImpl impl
ApiResult<Map<String, Map<String, String>>> mapApiResult = pushApi.pushToSingleByCid(pushDTO);//,super.getTokenDTO()
if (mapApiResult.getCode() != 0) {
log.info("用户为{}cid为{}发送成功消息失败", list.get(0).getUserId(), list.get(0).getCid());
return CommonResult.failed("错误码:"+mapApiResult.getCode()+"错误消息"+mapApiResult.getMsg());
return CommonResult.failed("错误码:" + mapApiResult.getCode() + "错误消息" + mapApiResult.getMsg());
}
return CommonResult.success("success");
}
@Override
public CommonResult pushTocid(PushTemplate pushTemplate, String userId) {
UserDeviceBind userDeviceBind = new UserDeviceBind();
userDeviceBind.setUserId(userId);
List<UserDeviceBind> list = userDeviceBindService.getActive(userDeviceBind);
public CommonResult pushTocid(PushTemplate pushTemplate, Integer userId) {
AccountUserBindGeTui accountUserBindGeTui = new AccountUserBindGeTui();
accountUserBindGeTui.setUserId(userId);
List<AccountUserBindGeTui> list = accountUserBindGeTuiService.getActive(accountUserBindGeTui);
if (CollectionUtil.isEmpty(list)) {
return CommonResult.failed("登录时绑定设备不存在");
return CommonResult.failed("登录时绑定设备不存在");
}
String cid = list.get(0).getCid();
PushApi pushApi = this.getApiHelper().creatApi(PushApi.class);
@ -90,7 +88,7 @@ public class AccountSinglePushServiceImpl extends SinglePushBaseServiceImpl impl
PushMessage pushMessage = new PushMessage();
pushMessage.setDuration(this.getDuration());
//在线消息 start
GTNotification gtNotification=new GTNotification();
GTNotification gtNotification = new GTNotification();
gtNotification.setTitle(pushTemplate.getTitle());
gtNotification.setBody(pushTemplate.getContent());
gtNotification.setClickType("payload");
@ -99,20 +97,20 @@ public class AccountSinglePushServiceImpl extends SinglePushBaseServiceImpl impl
//在线消息 end
pushDTO.setPushMessage(pushMessage);
//离线消息 start
PushChannel pushChannel=new PushChannel();
PushChannel pushChannel = new PushChannel();
//IOS
IosDTO iosDTO=new IosDTO();
IosDTO iosDTO = new IosDTO();
iosDTO.setPayload(pushTemplate.getJson());
Aps aps=new Aps();
Alert alert= new Alert();
Aps aps = new Aps();
Alert alert = new Alert();
alert.setTitle(pushTemplate.getTitle());
alert.setBody(pushTemplate.getContent());
aps.setAlert(alert);
iosDTO.setAps(aps);
pushChannel.setIos(iosDTO);
//android 安卓离线只能透传
AndroidDTO android =new AndroidDTO();
Ups ups=new Ups();
AndroidDTO android = new AndroidDTO();
Ups ups = new Ups();
ups.setTransmission(pushTemplate.getJson());
android.setUps(ups);
pushChannel.setAndroid(android);

View File

@ -50,7 +50,7 @@ import com.suisung.mall.common.modules.distribution.ShopDistributionUser;
import com.suisung.mall.common.modules.distribution.ShopDistributionUserCommission;
import com.suisung.mall.common.modules.pay.PayUserResource;
import com.suisung.mall.common.modules.plantform.ShopPlantformSubsiteUser;
import com.suisung.mall.common.modules.singlepush.UserDeviceBind;
import com.suisung.mall.common.modules.singlepush.AccountUserBindGeTui;
import com.suisung.mall.common.pojo.dto.SmsDto;
import com.suisung.mall.common.pojo.req.WxUserInfoReq;
import com.suisung.mall.common.service.MessageService;
@ -139,7 +139,7 @@ public class AccountUserBaseServiceImpl extends BaseServiceImpl<AccountUserBaseM
@Autowired
private I18nUtil i18nUtil;
@Resource
private UserDeviceBindService userDeviceBindService;
private AccountUserBindGeTuiService accountUserBindGeTuiService;
@Override
public CommonResult login(Map<String, String> params) {
@ -221,21 +221,19 @@ public class AccountUserBaseServiceImpl extends BaseServiceImpl<AccountUserBaseM
// data.put("merch_approval_status", shopService.shopMerchEntryApprovalStatus(params2));
}
// 个推消息推送设备与用户绑定
String cid = params.get("cid");
if (StrUtil.isNotBlank(cid)) {
UserDeviceBind userDeviceBind = new UserDeviceBind();
userDeviceBind.setCid(params.get("cid"));
userDeviceBind.setOsType(params.get("os_type"));
this.saveUserDeviceBind(userDeviceBind);
AccountUserBindGeTui accountUserBindGeTui = new AccountUserBindGeTui();
accountUserBindGeTui.setUserId(user_id).setUserType(Convert.toInt(params.get("user_is_admin")))
.setCid(cid).setOsType(Convert.toInt(params.get("os_type")));
accountUserBindGeTuiService.addOrUpdate(accountUserBindGeTui);
}
return restResult;
}
protected void saveUserDeviceBind(UserDeviceBind userDeviceBind) {
userDeviceBindService.saveUserDeviceBind(userDeviceBind);
}
@Override
public Map<String, Object> getUserInfo(Integer user_id) {
QueryWrapper<AccountUserBase> queryWrapper = new QueryWrapper<>();
@ -2876,7 +2874,7 @@ public class AccountUserBaseServiceImpl extends BaseServiceImpl<AccountUserBaseM
if (StrUtil.isBlank(iddCode) || !PhoneNumberUtils.isValidCountryCode(iddCode)) {
iddCode = CommonConstant.IDD_ZH_CN;
}
// 带国家编码的手机号
String mobile = PhoneNumberUtils.convWithIDDCodePhoneNumber(wxUserInfoReq.getPhoneNumber(), iddCode);
@ -3080,10 +3078,6 @@ public class AccountUserBaseServiceImpl extends BaseServiceImpl<AccountUserBaseM
return CommonResult.failed("获取不到用户信息!");
}
// if (ObjectUtil.notEqual(userType, accountUserBase.getUser_is_admin())) {
// 不是入驻商家的情况,已经有普通用户使用了手机号了提示已经被注册
// return CommonResult.failed("已被注册,请换一个手机号码!");
// }
} else {
// 手机号码未绑定的情况直接去注册一个账号
Map<String, Object> userInfo = new HashMap<>();

View File

@ -0,0 +1,56 @@
package com.suisung.mall.account.service.impl;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.suisung.mall.account.mapper.UserDeviceBindMapper;
import com.suisung.mall.account.service.AccountUserBindGeTuiService;
import com.suisung.mall.common.modules.singlepush.AccountUserBindGeTui;
import com.suisung.mall.core.web.service.impl.BaseServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.List;
@Slf4j
@Service
public class AccountUserBindGeTuiServiceImpl extends BaseServiceImpl<UserDeviceBindMapper, AccountUserBindGeTui> implements AccountUserBindGeTuiService {
@Override
public Boolean addOrUpdate(AccountUserBindGeTui accountUserBindGeTui) {
try {
if (ObjectUtil.isNull(accountUserBindGeTui) ||
StrUtil.isBlank(accountUserBindGeTui.getCid()) ||
ObjectUtil.isNull(accountUserBindGeTui.getUserId()) ||
ObjectUtil.isNull(accountUserBindGeTui.getOsType())) {
log.error("缺少必要参数cid={}, userId={}, osType={}",
accountUserBindGeTui != null ? accountUserBindGeTui.getCid() : "",
accountUserBindGeTui != null ? accountUserBindGeTui.getUserId() : "",
accountUserBindGeTui != null ? accountUserBindGeTui.getOsType() : "");
return false;
}
QueryWrapper<AccountUserBindGeTui> wrapper = new QueryWrapper<AccountUserBindGeTui>()
.eq("user_id", accountUserBindGeTui.getUserId())
.eq("cid", accountUserBindGeTui.getCid())
.eq("os_type", accountUserBindGeTui.getOsType());
AccountUserBindGeTui existAccountUserBindGeTui = getOne(wrapper);
if (existAccountUserBindGeTui == null) {
return this.add(accountUserBindGeTui);
}
accountUserBindGeTui.setId(existAccountUserBindGeTui.getId());
return this.updateById(accountUserBindGeTui);
} catch (Exception e) {
log.error("处理 addOrUpdate 时发生异常:{}", e.getMessage(), e);
return false;
}
}
@Override
public List<AccountUserBindGeTui> getActive(AccountUserBindGeTui accountUserBindGeTui) {
QueryWrapper<AccountUserBindGeTui> wrapper = new QueryWrapper<>();
wrapper.eq("user_id", accountUserBindGeTui.getUserId()).orderByDesc("updated_at");
return list(wrapper);
}
}

View File

@ -1,60 +0,0 @@
package com.suisung.mall.account.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.suisung.mall.account.mapper.UserDeviceBindMapper;
import com.suisung.mall.account.service.UserDeviceBindService;
import com.suisung.mall.common.domain.UserDto;
import com.suisung.mall.common.modules.singlepush.UserDeviceBind;
import com.suisung.mall.common.utils.ContextUtil;
import com.suisung.mall.common.utils.StringUtils;
import com.suisung.mall.core.web.service.impl.BaseServiceImpl;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
@Service
@lombok.extern.slf4j.Slf4j
public class UserDeviceBindServiceImpl extends BaseServiceImpl<UserDeviceBindMapper, UserDeviceBind> implements UserDeviceBindService {
@Override
public void saveUserDeviceBind(UserDeviceBind userDeviceBind) {
if(StringUtils.isEmpty(userDeviceBind.getCid())){
throw new RuntimeException("绑定cid不能为空");
}
if(StringUtils.isEmpty(userDeviceBind.getOsType())){
throw new RuntimeException("操作系统类型不能为空");
}
QueryWrapper<UserDeviceBind> wrapper = new QueryWrapper<>();
wrapper.eq("user_id",userDeviceBind.getCid());
UserDeviceBind bind=getOne(wrapper);
if(bind==null){
UserDto userDto= ContextUtil.getCurrentUser();
assert userDto != null;
userDeviceBind.setUserId(userDto.getUser_account());
userDeviceBind.setUserType(userDto.getRole_id());
userDeviceBind.setLastActive(new Date());
userDeviceBind.setBindTime(new Date());
this.saveOrUpdate(userDeviceBind);
log.info("保存用户设备绑定关系实体成功");
}else {
if(!bind.getCid().equals(userDeviceBind.getCid())){
bind.setCid(userDeviceBind.getCid());
}
if(!bind.getOsType().equals(userDeviceBind.getOsType())){
bind.setCid(userDeviceBind.getOsType());
}
bind.setLastActive(new Date());
bind.setBindTime(new Date());
this.saveOrUpdate(bind);
}
}
@Override
public List<UserDeviceBind> getActive(UserDeviceBind userDeviceBind) {
QueryWrapper<UserDeviceBind> wrapper = new QueryWrapper<>();
wrapper.eq("user_id",userDeviceBind.getUserId()).orderByDesc("bind_time");
return list(wrapper);
}
}

View File

@ -40,7 +40,7 @@ public class GlobalExceptionHandler {
location,
e);
return CommonResult.failed("系统异常:" + e.getMessage());
return CommonResult.failed(e.getMessage());
}
@ExceptionHandler(value = ApiException.class)
@ -69,10 +69,8 @@ public class GlobalExceptionHandler {
location,
e);
if (errorCode != null) {
if (StrUtil.isNotBlank(message)) {
return CommonResult.failed(message);
} else if (StrUtil.isNotBlank(message)) {
return CommonResult.failed("系统异常:" + message + " [" + location + "]");
} else {
return CommonResult.failed(ResultCode.FAILED);
}

View File

@ -1,4 +1,5 @@
package com.suisung.mall.common.modules.singlepush;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
@ -10,15 +11,14 @@ import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("user_device_bind") // MyBatis-Plus 表名注解
@ApiModel("用户设备绑定实体") // Swagger 模型描述
public class UserDeviceBind implements Serializable {
@TableName("account_user_bind_getui") // MyBatis-Plus 表名注解
@ApiModel("用户设备绑定个推实体") // Swagger 模型描述
public class AccountUserBindGeTui implements Serializable {
@TableId(value = "id", type = IdType.AUTO) // 主键自增
@ApiModelProperty(value = "主键ID", hidden = true) // 隐藏此字段不展示在Swagger文档
@ -26,7 +26,7 @@ public class UserDeviceBind implements Serializable {
@TableField("user_id") // 明确字段映射可省略默认自动转下划线
@ApiModelProperty(value = "用户唯一标识", required = true, example = "U20231001")
private String userId;
private Integer userId;
@TableField("cid")
@ApiModelProperty(value = "设备CID", required = true, example = "CID_ABCD1234")
@ -34,26 +34,33 @@ public class UserDeviceBind implements Serializable {
@TableField("user_type")
@ApiModelProperty(
value = "用户类型 (1=普通用户, 2=管理员, 3=商家)",
required = true,
value = "用户类型0-普通用户1-管理员2-入驻商户;默认是普通用户",
example = "1",
notes = "1-普通用户, 2-管理员, 3-商家"
notes = "用户类型0-普通用户1-管理员2-入驻商户;"
)
private Integer userType;
@TableField("os_type")
@ApiModelProperty(
value = "手机系统类型",
example = "Android",
notes = "Android, iOS"
example = "1",
notes = "手机系统类型 1-Android2-iOS"
)
private String osType;
private Integer osType;
@TableField("bind_time")
@TableField("status")
@ApiModelProperty(
value = "状态",
example = "1",
notes = "状态1-有效2-无效;"
)
private Integer status;
@TableField("created_at")
@ApiModelProperty(value = "绑定时间", example = "2023-10-01 12:00:00")
private Date bindTime;
private Date createdAt;
@TableField("last_active")
@TableField("updated_at")
@ApiModelProperty(value = "最后活跃时间", example = "2023-10-05 14:30:00")
private Date lastActive;
private Date updatedAt;
}

View File

@ -33,6 +33,10 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.util.Pair;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
import java.util.UUID;
@Slf4j
@Service
public class GeTuiPushServiceImpl implements GeTuiPushService {
@ -43,7 +47,6 @@ public class GeTuiPushServiceImpl implements GeTuiPushService {
private String appkey;
@Value("${getui.push.mastersecret}")
private String mastersecret;
@Value("${getui.push.domain}")
private String getuiDomain;
@ -61,6 +64,146 @@ public class GeTuiPushServiceImpl implements GeTuiPushService {
return apiHelper.creatApi(PushApi.class);
}
/**
* 发送在线或离线消息到单个 CID
*
* @param cid 客户端 ID
* @param title 消息标题
* @param content 消息内容
* @param payloadJson 自定义透传内容JSON 格式
* String payloadJson = "{\"action\":\"openPage\",\"pageId\":\"12345\",\"extraInfo\":\"Welcome to the app!\"}";
* @return 是否发送成功
*/
public boolean sendMessageToSingleCid(String cid, String title, String content, String payloadJson) {
try {
// 参数校验
if (cid == null || cid.isEmpty() || title == null || content == null || payloadJson == null) {
log.error("参数无效cid={}, title={}, content={}, payloadJson={}", cid, title, content, payloadJson);
return false;
}
// 配置 Android 消息
AndroidDTO androidDTO = new AndroidDTO();
Ups ups = new Ups();
ups.setTransmission(payloadJson); // 设置透传内容
androidDTO.setUps(ups);
// 配置 iOS 消息
IosDTO iosDTO = new IosDTO();
iosDTO.setPayload(payloadJson); // 设置透传内容
Aps aps = new Aps();
Alert alert = new Alert();
alert.setTitle(title); // 设置标题
alert.setBody(content); // 设置内容
aps.setAlert(alert);
iosDTO.setAps(aps);
// 整合平台消息配置
PushChannel pushChannel = new PushChannel();
pushChannel.setAndroid(androidDTO);
pushChannel.setIos(iosDTO);
// 创建 PushMessage
PushMessage pushMessage = new PushMessage();
pushMessage.setTransmission(payloadJson); // 设置透传内容
// 创建 Audience
Audience audience = new Audience();
audience.addCid(cid);
// 创建 PushDTO
PushDTO<Audience> pushDTO = new PushDTO<>();
pushDTO.setPushChannel(pushChannel);
pushDTO.setPushMessage(pushMessage);
pushDTO.setAudience(audience);
pushDTO.setRequestId(UUID.randomUUID().toString()); // 设置唯一请求 ID
// 调用个推 API 发送消息
ApiResult<Map<String, Map<String, String>>> result = creatPushApi().pushToSingleByCid(pushDTO);
if (result.getCode() != 0) {
log.error("消息发送失败code={}, message={}", result.getCode(), result.getMsg());
return false;
}
log.info("消息发送成功CID: {}", cid);
return true;
} catch (Exception e) {
log.error("发送消息时发生异常:{}", e.getMessage(), e);
return false;
}
}
/**
* 发送在线或离线消息到多个 CID
*
* @param cids 客户端 ID 列表
* @param title 消息标题
* @param content 消息内容
* @param payloadJson 自定义透传内容JSON 格式
* String payloadJson = "{\"action\":\"openPage\",\"pageId\":\"12345\",\"extraInfo\":\"Welcome to the app!\"}";
* @return 是否全部发送成功
*/
public boolean sendMessageToMultipleCids(List<String> cids, String title, String content, String payloadJson) {
try {
// 参数校验
if (cids == null || cids.isEmpty() || title == null || content == null || payloadJson == null) {
log.error("参数无效cids={}, title={}, content={}, payloadJson={}", cids, title, content, payloadJson);
return false;
}
// 配置 Android 消息
AndroidDTO androidDTO = new AndroidDTO();
Ups ups = new Ups();
ups.setTransmission(payloadJson); // 设置透传内容
androidDTO.setUps(ups);
// 配置 iOS 消息
IosDTO iosDTO = new IosDTO();
iosDTO.setPayload(payloadJson); // 设置透传内容
Aps aps = new Aps();
Alert alert = new Alert();
alert.setTitle(title); // 设置标题
alert.setBody(content); // 设置内容
aps.setAlert(alert);
iosDTO.setAps(aps);
// 整合平台消息配置
PushChannel pushChannel = new PushChannel();
pushChannel.setAndroid(androidDTO);
pushChannel.setIos(iosDTO);
// 创建 PushMessage
PushMessage pushMessage = new PushMessage();
pushMessage.setTransmission(payloadJson); // 设置透传内容
// 创建 Audience
Audience audience = new Audience();
for (String cid : cids) {
audience.addCid(cid);
}
// 创建 PushDTO
PushDTO<Audience> pushDTO = new PushDTO<>();
pushDTO.setPushChannel(pushChannel);
pushDTO.setPushMessage(pushMessage);
pushDTO.setAudience(audience);
pushDTO.setRequestId(UUID.randomUUID().toString()); // 设置唯一请求 ID
// 调用个推 API 发送消息
ApiResult<Map<String, Map<String, String>>> result = creatPushApi().pushToSingleByCid(pushDTO);
if (result.getCode() != 0) {
log.error("消息发送失败code={}, message={}", result.getCode(), result.getMsg());
return false;
}
log.info("消息发送成功CIDs: {}", cids);
return true;
} catch (Exception e) {
log.error("发送消息时发生异常:{}", e.getMessage(), e);
return false;
}
}
/**
* 单个用户透传消息(支持H5安卓苹果系统)

View File

@ -33,6 +33,7 @@ import com.suisung.mall.common.modules.store.ShopStoreBase;
import com.suisung.mall.common.utils.*;
import com.suisung.mall.shop.lakala.service.*;
import com.suisung.mall.shop.lakala.utils.LakalaUtil;
import com.suisung.mall.shop.message.service.ShopMessageTemplateService;
import com.suisung.mall.shop.order.service.ShopOrderLklService;
import com.suisung.mall.shop.page.service.OssService;
import com.suisung.mall.shop.store.service.ShopMchEntryService;
@ -121,6 +122,10 @@ public class LakalaApiServiceImpl implements LakalaApiService {
@Resource
private ShopOrderLklService shopOrderLklService;
@Lazy
@Resource
private ShopMessageTemplateService shopMessageTemplateService;
// @Lazy
// @Resource
// private
@ -650,11 +655,12 @@ public class LakalaApiServiceImpl implements LakalaApiService {
// 先写入本地数据库表中
LklLedgerEc record = new LklLedgerEc();
record.setMch_id(shopMchEntry.getId());
record.setMch_mobile(shopMchEntry.getLogin_mobile());
record.setMch_mobile(mchMobile);
record.setReq_params(reqBody.toString());
record.setNotify_url(retUrl);
record.setEc_apply_id(respData.getLong("ec_apply_id"));
record.setResult_url(respData.getStr("result_url"));
String ecResultUrl = respData.getStr("result_url");
record.setResult_url(ecResultUrl);
record.setResp_body(respBody.toString());
Boolean success = lklLedgerEcService.addOrUpdateByMchId(record);
if (!success) {
@ -663,6 +669,13 @@ public class LakalaApiServiceImpl implements LakalaApiService {
return Pair.of(false, errMsg);
}
// 更新拉卡拉的电子合同信息到商家入驻表中
shopMchEntryService.updateMerchEntryEcResultUrlByMchId(shopMchEntry.getId(), ecResultUrl);
// 发短信给商家及时签署合同 SMS_488465246
// 商家您好您的入驻申请已收到请尽快登录小发同城商家 APP 完成合同签署签署时效为 24 小时望知晓
shopMessageTemplateService.aliyunSmsSend(mchMobile, "SMS_488465246", null);//SMS_479760276
return Pair.of(true, "商家入网申请电子合同成功");
}
@ -833,7 +846,6 @@ public class LakalaApiServiceImpl implements LakalaApiService {
if (lklLedgerEc == null) {
log.error("入网电子合同申请回调找不到对应入网lklLedgerEc电子合同记录");
respData.put("message", "找不到对应入网电子合同记录!");
// throw new ApiException("找不到对应入网电子合同记录!");
return respData;
}
@ -958,10 +970,10 @@ public class LakalaApiServiceImpl implements LakalaApiService {
File file = UploadUtil.convertBase64ToFile(fileBase64);
// REMARK 把合同文件 url 上传到cos服务器
String cosFileName = TENGXUN_DEFAULT_DIR.concat("/").concat("contract")
String cosFileName = TENGXUN_DEFAULT_DIR.concat("/contract")
.concat("/")
.concat(lklLedgerEc.getMch_mobile()).concat("/")
.concat("signed").concat("/")
.concat(lklLedgerEc.getMch_mobile())
.concat("/signed").concat("/")
.concat(ecApplyId.toString()).concat(".pdf");
log.debug("拉卡拉电子合同保存地址:{}", cosFileName);

View File

@ -107,7 +107,7 @@ public class ShopOrderReturnController extends BaseControllerImpl {
return shopOrderReturnService.doForceRefund(return_id, return_flag);
}
@ApiOperation(value = "确认收款", notes = "确认收款")
@ApiOperation(value = "确认退货", notes = "确认退货")
@RequestMapping(value = "/refund", method = RequestMethod.POST)
public CommonResult refund(@RequestParam(name = "return_id") String return_id) {
return CommonResult.success(shopOrderReturnService.refund(return_id));

View File

@ -71,6 +71,18 @@ public class UserReturnController extends BaseControllerImpl {
return shopOrderReturnService.addItem(orderReturnInput);
}
@ApiOperation(value = "添加退款退货-整单退货", notes = "添加退款退货-整单退货")
@RequestMapping(value = "/addWholeItems", method = RequestMethod.POST)
public CommonResult addWholeItems(@RequestParam(name = "order_id") String order_id) {
UserDto user = getCurrentUser();
if (user == null) {
throw new ApiUserException(I18nUtil._("用户信息异常!"));
}
return shopOrderReturnService.addWholeItems(order_id);
}
@ApiOperation(value = "取消退款订单", notes = "取消退款订单")
@RequestMapping(value = "/cancel", method = {RequestMethod.GET, RequestMethod.POST})
public CommonResult cancel(@RequestParam(name = "return_id") String return_id) {
@ -85,17 +97,6 @@ public class UserReturnController extends BaseControllerImpl {
return shopOrderReturnService.returnTrackingNumber(return_id, return_tracking_number, return_tracking_name);
}
@ApiOperation(value = "添加退款退货-整单退货", notes = "添加退款退货-整单退货")
@RequestMapping(value = "/addWholeItems", method = RequestMethod.POST)
public CommonResult addWholeItems(@RequestParam(name = "order_id") String order_id) {
UserDto user = getCurrentUser();
if (user == null) {
throw new ApiUserException(I18nUtil._("用户信息异常!"));
}
return shopOrderReturnService.addWholeItems(order_id);
}
@ApiOperation(value = "退货原因列表", notes = "退货原因列表")
@RequestMapping(value = "/returnReasonList", method = RequestMethod.GET)

View File

@ -731,7 +731,7 @@ public class ShopOrderReturnServiceImpl extends BaseServiceImpl<ShopOrderReturnM
/**
* 确认收款
* 确认退货
*
* @param return_id
* @return

View File

@ -218,4 +218,12 @@ public interface ShopMchEntryService {
*/
Boolean updateMulStatus(String mchMobile, String merCupNo, Integer hasEcSigned, Integer hasApplySplit, Integer hasApplyReceiver, Integer hasBindReceiver, Integer hasApplyMer);
/**
* 更新商家入网电子合同结果通知地址
*
* @param mchId
* @param lklEcResultUrl
* @return
*/
Boolean updateMerchEntryEcResultUrlByMchId(Long mchId, String lklEcResultUrl);
}

View File

@ -1019,6 +1019,30 @@ public class ShopMchEntryServiceImpl extends BaseServiceImpl<ShopMchEntryMapper,
return update(updateWrapper);
}
@Override
public Boolean updateMerchEntryEcResultUrlByMchId(Long mchId, String lklEcResultUrl) {
// 检查参数是否有效
if (mchId == null || StrUtil.isBlank(lklEcResultUrl)) {
log.error("参数无效: mchId={}, lklEcResultUrl={}", mchId, lklEcResultUrl);
return false;
}
try {
// 构建更新条件
UpdateWrapper<ShopMchEntry> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("id", mchId) // 根据商家入驻申请 ID 进行匹配
.set("lkl_ec_result_url", lklEcResultUrl); // 设置拉卡拉电子合同结果 URL
// 执行更新操作
return update(updateWrapper);
} catch (Exception e) {
// 捕获异常并记录错误日志
log.error("更新 lklEcResultUrl 失败: mchId={}, 错误信息: {}", mchId, e.getMessage(), e);
return false;
}
}
/**
* 根据商户号或商家手机号修改商户分账多个状态
*