Commit 7fde94ae authored by shiyu's avatar shiyu

发送短信

parent 8a8f2d45
package com.wwdz.ch.core.notify;
import com.aliyun.dysmsapi20170525.models.SendSmsResponse;
import com.wwdz.ch.core.type.Result;
import com.wwdz.ch.core.util.CacheUtil;
import com.wwdz.ch.db.domain.User;
import com.xxdxxs.utils.JsonUtils;
import com.xxdxxs.utils.StringUtils;
import lombok.extern.slf4j.Slf4j;
import okhttp3.Cache;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
......@@ -29,6 +35,9 @@ public class AliSmsSender implements SmsSender {
@Value("${dts.notify.alisms.templateCode}")
private String templateCode;
@Autowired
CacheUtil cacheUtil;
//短信API产品名称(短信产品名固定,无需修改)
final String product = "Dysmsapi";
......@@ -83,10 +92,18 @@ public class AliSmsSender implements SmsSender {
}
public SmsResult sendAuctionWithTemplate(String phone, String itemName) {
public Result sendAuctionWithTemplate(long userId, String msg) {
try {
User user = cacheUtil.appletUserInfoCache.getIfPresent(userId).get();
String phone = user.getMobile();
if (StringUtils.isEmpty(phone)) {
logger.error("======== userId:{},手机号为空不能发送短信 ========", userId);
return Result.failed("手机号为空");
}
Map<String, Object> map = new HashMap<>();
map.put("msg", "您参与拍卖的商品\"" + itemName + "\",已中拍。");
map.put("msg", msg);
logger.info("拍卖通知发送内容 : {} ", msg);
com.aliyun.dysmsapi20170525.Client client = createClient();
com.aliyun.dysmsapi20170525.models.SendSmsRequest sendSmsRequest = new com.aliyun.dysmsapi20170525.models.SendSmsRequest()
.setPhoneNumbers(phone)
......@@ -94,18 +111,18 @@ public class AliSmsSender implements SmsSender {
.setTemplateParam(JsonUtils.fromMap(map))
.setSignName("玩物得志");
SendSmsResponse sendSmsResponse = client.sendSmsWithOptions(sendSmsRequest, new com.aliyun.teautil.models.RuntimeOptions());
logger.info("短线验证发送结果 : {} ", JsonUtils.from(sendSmsResponse));
logger.info("拍卖通知发送结果 : {} ", JsonUtils.from(sendSmsResponse));
if ("OK".equals(sendSmsResponse.getBody().code)) {
SmsResult smsResult = new SmsResult();
smsResult.setSuccessful(true);
smsResult.setResult(itemName);
return smsResult;
return Result.success();
}
throw new RuntimeException("验证码发送失败");
} catch (Exception e) {
logger.error("AliSmsSender.sendWithTemplate(),mobile={}",phone,e );
throw new RuntimeException("验证码发送失败");
logger.error("AliSmsSender.sendWithTemplate(),userId={}, error:{}",userId, e);
}
return Result.failed();
}
public static void main(String[] args) {
}
}
......@@ -164,6 +164,20 @@ public class CacheUtil {
return map.get(key);
}*/
/**
* 查询小程序用户手机号
*
* @return
*/
public String getAppletUserPhoneList(long key) {
User user = dtsUserDao.findById(key);
return user.getMobile();
/* List<User> userList = dtsUserDao.findAll();
Map<Long, String> map = userList.stream().collect(Collectors.toMap(User::getId, User::getNickname, (k1, k2) -> k2));
return map.get(key);*/
}
/**
* 查询小程序会员
......
......@@ -24,7 +24,7 @@ public class AuctionOfferNoticeMsg implements Entity {
/**
* 商品id
*/
private String itemId;
private Long itemId;
/**
* 商品名称
......
......@@ -5,6 +5,7 @@ import com.wwdz.ch.core.api.OfficialAccountApi;
import com.wwdz.ch.core.api.wxpay.WxPayServiceApi;
import com.wwdz.ch.core.consts.CommConsts;
import com.wwdz.ch.core.consts.DistributionEnum;
import com.wwdz.ch.core.notify.AliSmsSender;
import com.wwdz.ch.core.type.PageSearchResult;
import com.wwdz.ch.core.type.Result;
import com.wwdz.ch.core.util.MediaUtil;
......@@ -21,6 +22,7 @@ import com.wwdz.ch.wx.entity.vo.distribution.AuctionRecordRowVo;
import com.wwdz.ch.wx.entity.vo.distribution.AuctionRecordVo;
import com.wwdz.ch.wx.service.distribution.AuctionRecordService;
import com.wwdz.ch.wx.service.distribution.SendMsgService;
import com.xxdxxs.utils.DateUtils;
import com.xxdxxs.utils.EntityMapper;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
......@@ -77,6 +79,9 @@ public class AuctionRecordServiceImpl implements AuctionRecordService {
@Autowired
SendMsgService sendMsgService;
@Autowired
AliSmsSender aliSmsSender;
@Override
@Transactional
......@@ -103,7 +108,7 @@ public class AuctionRecordServiceImpl implements AuctionRecordService {
logger.info("======== 拍卖出价,对应分享id = {}, 无效 ========", shareRecordId);
return Result.failed("该商品分享链接已失效");
}
SupplierItem supplierItem = supplierItemDao.findById(itemId);
//查询当前最新的价格
AuctionRecord auctionRecord = auctionRecordDao.findLastedRecord(itemId);
long price = PriceUtil.convertPriceFromStr(dto.getPrice());
......@@ -115,21 +120,23 @@ public class AuctionRecordServiceImpl implements AuctionRecordService {
//把上次的最高价记录改为落后
auctionRecordDao.updateNotLeadById(auctionRecord.getId());
//发送模板消息,提示用户出价被超越
User user = userDao.queryById(auctionRecord.getUserId());
String unionId = user.getWeixinUnionid();
OfficialAccountSubscribeRecord officialAccountSubscribeRecord = officialAccountSubscribeRecordDao.findOne(unionId);
//没有订阅
if (officialAccountSubscribeRecord == null || officialAccountSubscribeRecord.getEnabled().intValue() == 0) {
logger.info(">>>>>>>>>> 用户id = {}, unionId = {} ,尚未订阅公众号,无法推送消息 <<<<<<<<<<<", auctionRecord.getUserId(), unionId);
//发送短信
} else {
SupplierItem supplierItem = supplierItemDao.findById(auctionRecord.getItemId());
String openId = officialAccountSubscribeRecord.getOpenid();
String openId = sendMsgService.getOpenIdByUserId(auctionRecord.getUserId());
if (com.xxdxxs.utils.StringUtils.hasLength(openId)) {
AuctionOfferNoticeMsg auctionOfferNoticeMsg = new AuctionOfferNoticeMsg();
auctionOfferNoticeMsg.setItemId(supplierItem.getId());
auctionOfferNoticeMsg.setItemName(supplierItem.getName());
auctionOfferNoticeMsg.setCurrentPrice(PriceUtil.convertPriceFenToYuan(price));
auctionOfferNoticeMsg.setOpenId(openId);
sendMsgService.sendAuctionOfferOutMsg(auctionOfferNoticeMsg);
Result result = sendMsgService.sendAuctionOfferOutMsg(auctionOfferNoticeMsg);
if (!result.getSuccess()) {
String msg = "您出价过的拍品" + supplierItem.getName() + "的价格被其他人超越了, 当前价是" + PriceUtil.convertPriceFenToYuan(price) +
"元,竞拍截止时间是" + DateUtils.toString(endTime) +", 请前往\"换藏小程序\"查看";
aliSmsSender.sendAuctionWithTemplate(auctionRecord.getUserId(), msg);
}
} else {
String msg = "您出价过的拍品" + supplierItem.getName() + "的价格被其他人超越了, 当前价是" + PriceUtil.convertPriceFenToYuan(price) +
"元,竞拍截止时间是" + DateUtils.toString(endTime) +", 请前往\"换藏小程序\"查看";
aliSmsSender.sendAuctionWithTemplate(auctionRecord.getUserId(), msg);
}
}
//插入最新出价记录
......@@ -154,18 +161,24 @@ public class AuctionRecordServiceImpl implements AuctionRecordService {
}
//发送消息通知对应的分销商有用户出价
SupplierItem supplierItem = supplierItemDao.findById(dto.getItemId());
String openId = sendMsgService.getOpenIdByUserId(distributorShareRecord.getDistributorId());
if (com.xxdxxs.utils.StringUtils.hasLength(openId)) {
AuctionOfferNoticeMsg auctionOfferNoticeMsg = new AuctionOfferNoticeMsg();
auctionOfferNoticeMsg.setItemId(supplierItem.getId());
auctionOfferNoticeMsg.setOpenId(openId);
auctionOfferNoticeMsg.setItemName(supplierItem.getName());
auctionOfferNoticeMsg.setCurrentPrice(PriceUtil.convertPriceFenToYuan(price));
sendMsgService.offerNoticeToDistributorMsg(auctionOfferNoticeMsg);
Result result = sendMsgService.offerNoticeToDistributorMsg(auctionOfferNoticeMsg);
if (!result.getSuccess()) {
String msg = "您分销的拍品" + supplierItem.getName() + "有人成出价" + PriceUtil.convertPriceFenToYuan(price) +
"元,请前往\"换藏小程序\"查看";
aliSmsSender.sendAuctionWithTemplate(distributorShareRecord.getDistributorId(), msg);
}
} else {
logger.info(">>>>> 分销商id :{}, 获取openid失败,无法通知分销商有用户出价 <<<<<", distributorShareRecord.getDistributorId());
String msg = "您分销的拍品" + supplierItem.getName() + "有人成出价" + PriceUtil.convertPriceFenToYuan(price) +
"元,请前往\"换藏小程序\"查看";
aliSmsSender.sendAuctionWithTemplate(distributorShareRecord.getDistributorId(), msg);
}
return Result.success();
} else {
return Result.failed("出价者较多,请刷新出价记录");
......
......@@ -8,10 +8,12 @@ import com.wwdz.ch.core.consts.DistributionEnum;
import com.wwdz.ch.core.consts.LogisticsEnum;
import com.wwdz.ch.core.consts.ResultCode;
import com.wwdz.ch.core.entity.wxPay.DistributionOrderRefundRequestDto;
import com.wwdz.ch.core.notify.AliSmsSender;
import com.wwdz.ch.core.type.PageSearchResult;
import com.wwdz.ch.core.type.Result;
import com.wwdz.ch.core.util.*;
import com.wwdz.ch.db.dao.distribution.*;
import com.wwdz.ch.db.domain.User;
import com.wwdz.ch.db.domain.distribution.*;
import com.wwdz.ch.db.dto.request.distribution.DistributionOrderRequestDto;
import com.wwdz.ch.db.dto.request.distribution.SupplierItemRequestDto;
......@@ -22,6 +24,7 @@ import com.wwdz.ch.wx.entity.vo.distribution.DistributionOrderDetailVo;
import com.wwdz.ch.wx.entity.vo.distribution.DistributionOrderVo;
import com.wwdz.ch.wx.service.distribution.DistributionOrderService;
import com.wwdz.ch.wx.service.distribution.SendMsgService;
import com.xxdxxs.utils.DateUtils;
import com.xxdxxs.utils.EntityMapper;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
......@@ -90,6 +93,9 @@ public class DistributionOrderServiceImpl implements DistributionOrderService {
@Autowired
AuctionConfigDao auctionConfigDao;
@Autowired
AliSmsSender aliSmsSender;
@Transactional
@Override
public Result createDistributionOrder(DistributionOrderRequestDto dto) {
......@@ -263,35 +269,51 @@ public class DistributionOrderServiceImpl implements DistributionOrderService {
averageProfitRecord.setIsValid(false);
distributorProfitDao.insert(averageProfitRecord);
//通知每一个分享参与出价的分销商
String userOpenId = sendMsgService.getOpenIdByUserId(auctionRecord.getUserId());
if (com.xxdxxs.utils.StringUtils.hasLength(userOpenId)) {
String distributorOpenId = sendMsgService.getOpenIdByUserId(record.getDistributorId());
if (com.xxdxxs.utils.StringUtils.hasLength(distributorOpenId)) {
AuctionOfferNoticeMsg auctionOfferNoticeMsg = new AuctionOfferNoticeMsg();
auctionOfferNoticeMsg.setCurrentPrice(PriceUtil.convertPriceFenToYuan(auctionRecord.getPrice()));
auctionOfferNoticeMsg.setOpenId(userOpenId);
auctionOfferNoticeMsg.setOpenId(distributorOpenId);
auctionOfferNoticeMsg.setItemId(supplierItem.getId());
auctionOfferNoticeMsg.setItemName(supplierItem.getName());
auctionOfferNoticeMsg.setCurrentPrice(PriceUtil.convertPriceFenToYuan(distributionOrder.getAmount()));
auctionOfferNoticeMsg.setAuctionEndTime(auctionConfig.getRealEndTime());
sendMsgService.auctionSuccessForDistributorsMsg(auctionOfferNoticeMsg);
Result result = sendMsgService.auctionSuccessForDistributorsMsg(auctionOfferNoticeMsg);
if (!result.getSuccess()) {
String msg = "您分销的拍品" + supplierItem.getName() + "已成拍,成交价是" + PriceUtil.convertPriceFenToYuan(distributionOrder.getAmount()) +
"元,您预计获得利润" + PriceUtil.convertDoubleToString(Math.floor(averageProfit)) + "元。请前往\"换藏小程序\"查看";
aliSmsSender.sendAuctionWithTemplate(record.getDistributorId(), msg);
}
} else {
logger.info(">>>>> 分销商id :{}, 获取openid失败,无法通知参与分享的分销商拍品成交的信息 <<<<<", distributionOrder.getSellerId());
String msg = "您分销的拍品" + supplierItem.getName() + "已成拍,成交价是" + PriceUtil.convertPriceFenToYuan(distributionOrder.getAmount()) +
"元,您预计获得利润" + PriceUtil.convertDoubleToString(Math.floor(averageProfit)) + "元。请前往\"换藏小程序\"查看";
aliSmsSender.sendAuctionWithTemplate(record.getDistributorId(), msg);
}
}
//把该拍卖配置信息改为已处理
auctionConfigDao.setDeal(dto.getItemId());
//发送中拍信息给用户
String userOpenId = sendMsgService.getOpenIdByUserId(auctionRecord.getUserId());
Instant instant = now.toInstant().plus(Duration.ofHours(24));
Date payEndTime = Date.from(instant);
if (com.xxdxxs.utils.StringUtils.hasLength(userOpenId)) {
AuctionOfferNoticeMsg auctionOfferNoticeMsg = new AuctionOfferNoticeMsg();
auctionOfferNoticeMsg.setCurrentPrice(PriceUtil.convertPriceFenToYuan(auctionRecord.getPrice()));
auctionOfferNoticeMsg.setOpenId(userOpenId);
auctionOfferNoticeMsg.setItemId(supplierItem.getId());
auctionOfferNoticeMsg.setItemName(supplierItem.getName());
auctionOfferNoticeMsg.setDistributionOrderId(distributionOrderId);
Instant instant = now.toInstant().plus(Duration.ofHours(24));
Date payEndTime = Date.from(instant);
auctionOfferNoticeMsg.setPayEndTime(payEndTime);
sendMsgService.auctionSuccessMsg(auctionOfferNoticeMsg);
Result result = sendMsgService.auctionSuccessMsg(auctionOfferNoticeMsg);
if (!result.getSuccess()) {
String msg = "您已中拍" + supplierItem.getName() + ",成交价是" + PriceUtil.convertPriceFenToYuan(distributionOrder.getAmount()) + "元,请在" +
DateUtils.toString(payEndTime) + "前完成付款,请前往\"换藏小程序\"查看。";
aliSmsSender.sendAuctionWithTemplate(auctionRecord.getUserId(), msg);
}
} else {
logger.info(">>>>> 分销商id :{}, 获取openid失败,无法发送模板信息 <<<<<", distributionOrder.getSellerId());
String msg = "您已中拍" + supplierItem.getName() + ",成交价是" + PriceUtil.convertPriceFenToYuan(distributionOrder.getAmount()) + "元,请在" +
DateUtils.toString(payEndTime) + "前完成付款,请前往\"换藏小程序\"查看。";
aliSmsSender.sendAuctionWithTemplate(auctionRecord.getUserId(), msg);
}
return Result.success(map);
} else {
......
package com.wwdz.ch.wx.job;
import com.wwdz.ch.core.type.Result;
import com.wwdz.ch.core.util.PriceUtil;
import com.wwdz.ch.core.util.StringUtil;
import com.wwdz.ch.db.dao.distribution.AuctionConfigDao;
import com.wwdz.ch.db.dao.distribution.AuctionRecordDao;
import com.wwdz.ch.db.dao.distribution.DistributionOrderDao;
import com.wwdz.ch.db.dao.distribution.SupplierItemDao;
import com.wwdz.ch.db.domain.distribution.AuctionConfig;
import com.wwdz.ch.db.domain.distribution.AuctionRecord;
import com.wwdz.ch.db.domain.distribution.DistributionOrder;
import com.wwdz.ch.db.domain.distribution.SupplierItem;
import com.wwdz.ch.db.dto.request.distribution.DistributionOrderRequestDto;
import com.wwdz.ch.wx.entity.AuctionOfferNoticeMsg;
import com.wwdz.ch.wx.service.distribution.DistributionOrderService;
import com.wwdz.ch.wx.service.distribution.SendMsgService;
import com.xxdxxs.utils.StringUtils;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import java.util.List;
import java.util.stream.Collectors;
/**
* 发送模板信息
*/
@Component
public class AutoSendMsgJob {
private static final Logger logger = LoggerFactory.getLogger(AutoSendMsgJob.class);
private final static String QUANKU_AUTO_SEND_MSG_KEY = "QUANKU_AUTO_SEND_MSG_KEY";
@Autowired
DistributionOrderService distributionOrderService;
@Autowired
DistributionOrderDao distributionOrderDao;
@Autowired
RedissonClient redissonClient;
@Autowired
AuctionConfigDao auctionConfigDao;
@Autowired
AuctionRecordDao auctionRecordDao;
@Autowired
SupplierItemDao supplierItemDao;
@Autowired
SendMsgService sendMsgService;
/**
* 隔5分钟运行一次
*/
// @Scheduled(fixedDelay = 1000 * 60 * 5)
public void execute() {
RLock lock = redissonClient.getLock(QUANKU_AUTO_SEND_MSG_KEY);
if (!lock.tryLock()) {
logger.warn("自动发送拍卖通知任务,当前服务实例获取锁成功: {} 获取锁失败,锁被占用不执行", Thread.currentThread().getId());
return;
}
logger.info(">>>>>>>>>>>>>>>>>>>>>>> 自动发送拍卖通知任务,开始执行 <<<<<<<<<<<<<<<<<<<<<");
try {
//查询一小时内拍卖截拍的商品,通知参与过出价的用户即将截拍
List<AuctionConfig> auctionConfigList = auctionConfigDao.findEndList();
auctionConfigList.forEach(auctionConfig -> {
long itemId = auctionConfig.getItemId();
//查询该商品所有出价记录
List<AuctionRecord> auctionRecordList = auctionRecordDao.findByItemId(itemId);
if (!CollectionUtils.isEmpty(auctionRecordList)) {
//用户id去重
List<Long> userIds = auctionRecordList.stream()
.filter(StringUtil.distinctByKey(AuctionRecord::getUserId))
.map(AuctionRecord::getUserId)
.collect(Collectors.toList());
SupplierItem supplierItem = supplierItemDao.findById(itemId);
AuctionRecord lastRecord = auctionRecordDao.findLastedRecord(itemId);
for (long userId : userIds) {
String userOpenId = sendMsgService.getOpenIdByUserId(userId);
if (com.xxdxxs.utils.StringUtils.hasLength(userOpenId)) {
AuctionOfferNoticeMsg auctionOfferNoticeMsg = new AuctionOfferNoticeMsg();
auctionOfferNoticeMsg.setCurrentPrice(PriceUtil.convertPriceFenToYuan(lastRecord.getPrice()));
auctionOfferNoticeMsg.setOpenId(userOpenId);
auctionOfferNoticeMsg.setItemId(supplierItem.getId());
auctionOfferNoticeMsg.setItemName(supplierItem.getName());
auctionOfferNoticeMsg.setAuctionEndTime(auctionConfig.getRealEndTime());
sendMsgService.aboutToEndMsg(auctionOfferNoticeMsg);
} else {
logger.info(">>>>> 用户id :{}, 获取openid失败,无法通知参与出价的用户即将截拍的信息 <<<<<", userId);
//发送短信
}
}
}
});
//
} catch (Exception e) {
logger.error("同步item增量数据到ES error {}", e);
} finally {
if (lock != null && lock.isHeldByCurrentThread()) {
lock.unlock();
logger.info("======================== 线程id: {} , 检测截拍的商品,自动创建订单执行结束, 释放锁成功 ========================", Thread.currentThread().getId());
}
}
}
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment