Commit 78a21b72 by 李传峰

Merge branch 'release' into 'master'

Release

See merge request rays/pcloud-book!1707
parents c239fbc9 1de02036
...@@ -359,4 +359,29 @@ public class BookApplication { ...@@ -359,4 +359,29 @@ public class BookApplication {
public Binding recoverQrcodeBind() { public Binding recoverQrcodeBind() {
return RabbitMQFactory.bindingExchange(recoverQrcodeQueue(), MQTopicProducer.RECOVER_QRCODE); return RabbitMQFactory.bindingExchange(recoverQrcodeQueue(), MQTopicProducer.RECOVER_QRCODE);
} }
/**
* 支付记录
*
* @return
*/
@Bean
public Queue paymentExerciseBookTopic() {
return RabbitMQFactory.queueBuilder(MQTopicConumer.PAYMENT_EXERCISE_BOOK);
}
@Bean
public Binding paymentExerciseBookBind() {
return RabbitMQFactory.bindingExchange(paymentExerciseBookTopic(), MQTopicProducer.EXERCISE_BOOK_PAY);
}
@Bean
public Queue refundExerciseBookTopic() {
return RabbitMQFactory.queueBuilder(MQTopicConumer.REFUND_EXERCISE_BOOK);
}
@Bean
public Binding refundExerciseBookBind() {
return RabbitMQFactory.bindingExchange(refundExerciseBookTopic(), MQTopicProducer.EXERCISE_BOOK_REFUND);
}
} }
package com.pcloud.book.advertising.biz;
import com.pcloud.book.advertising.entity.AdvertisingBmOption;
import com.pcloud.book.advertising.entity.AdvertisingCpaPaySetting;
import com.pcloud.common.page.PageBeanNew;
import java.util.List;
/**
* (AdvertisingCpaPaySetting)表服务接口
*
* @author makejava
* @since 2022-11-25 14:20:46
*/
public interface AdvertisingCpaPaySettingBiz {
/**
* 通过ID查询单条数据
*
* @param id 主键
* @return 实例对象
*/
AdvertisingCpaPaySetting getById(Long id);
/**
* 分页查询
*/
PageBeanNew getList(Integer currentPage, Integer numPerPage);
/**
* 新增数据
*
* @param advertisingCpaPaySetting 实例对象
* @return 主键
*/
Long insert(AdvertisingCpaPaySetting advertisingCpaPaySetting);
/**
* 修改数据
*
* @param advertisingCpaPaySetting 实例对象
*/
void update(AdvertisingCpaPaySetting advertisingCpaPaySetting);
/**
* 通过主键删除数据
*
* @param id 主键
* @return 是否成功
*/
void deleteById(Long id);
void savePaySettingList(List<AdvertisingCpaPaySetting> advertisingCpaPaySettingList, Long cpaId, Integer paySetting);
List<AdvertisingCpaPaySetting> getByCpaId(Long cpaId, List<AdvertisingBmOption> bmOptionList);
List<AdvertisingCpaPaySetting> cpaPaySetting4WechatListHandler(List<AdvertisingCpaPaySetting> cpaPaySettingList, Integer isWechatUser);
}
package com.pcloud.book.advertising.biz;
import com.pcloud.book.advertising.entity.AdvertisingCpaProductPackage;
import com.pcloud.common.page.PageBeanNew;
import com.pcloud.exercisebook.dto.RefundExerciseBookDTO;
import com.pcloud.facade.tradecenter.dto.ExerciseBookPayDTO;
import java.util.Map;
/**
* (AdvertisingCpaProductPackage)表服务接口
*
* @author makejava
* @since 2022-11-29 18:12:15
*/
public interface AdvertisingCpaProductPackageBiz {
/**
* 通过ID查询单条数据
*
* @param id 主键
* @return 实例对象
*/
AdvertisingCpaProductPackage getById(Long id);
/**
* 分页查询
*/
PageBeanNew getList(Integer currentPage, Integer numPerPage);
/**
* 新增数据
*
* @param advertisingCpaProductPackage 实例对象
* @return 主键
*/
Long insert(AdvertisingCpaProductPackage advertisingCpaProductPackage);
/**
* 修改数据
*
* @param advertisingCpaProductPackage 实例对象
*/
void update(AdvertisingCpaProductPackage advertisingCpaProductPackage);
/**
* 通过主键删除数据
*
* @param id 主键
* @return 是否成功
*/
void deleteById(Long id);
Map<String, AdvertisingCpaProductPackage> mapAll ();
void handlerCreateProductPackage(ExerciseBookPayDTO payDTO);
void handlerRefundProductPackage(RefundExerciseBookDTO refundDTO);
void testQiLiOrder();
void testQiLiRefundOrder();
}
...@@ -516,7 +516,7 @@ public interface AdvertisingSpaceBiz { ...@@ -516,7 +516,7 @@ public interface AdvertisingSpaceBiz {
* @param cpaId * @param cpaId
* @return * @return
*/ */
AdvertisingCpaDTO getCPAContentById(Long cpaId); AdvertisingCpaDTO getCPAContentById(Long cpaId, Integer isWechatUser);
/** /**
* 分页查询cpa内容 * 分页查询cpa内容
......
...@@ -79,6 +79,8 @@ public interface BmBiz { ...@@ -79,6 +79,8 @@ public interface BmBiz {
*/ */
Long userSubmit4Cpa(AdvertisingBmRegister bmRegister, Long wechatUserId); Long userSubmit4Cpa(AdvertisingBmRegister bmRegister, Long wechatUserId);
void sendSMS(String phone, Map<String, String> paramMap, String templateCode) throws BizException;
/** /**
* 微信端获取个人报名详情 * 微信端获取个人报名详情
* @param adId 应用ID * @param adId 应用ID
......
...@@ -3,6 +3,7 @@ package com.pcloud.book.advertising.biz.impl; ...@@ -3,6 +3,7 @@ package com.pcloud.book.advertising.biz.impl;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.pcloud.appcenter.app.dto.AppTypeDto; import com.pcloud.appcenter.app.dto.AppTypeDto;
import com.pcloud.appcenter.app.service.AppTypeService; import com.pcloud.appcenter.app.service.AppTypeService;
import com.pcloud.book.advertising.biz.AdvertisingCpaPaySettingBiz;
import com.pcloud.book.advertising.biz.AdvertisingSpaceBiz; import com.pcloud.book.advertising.biz.AdvertisingSpaceBiz;
import com.pcloud.book.advertising.biz.BmBiz; import com.pcloud.book.advertising.biz.BmBiz;
import com.pcloud.book.advertising.check.AdvertisingCheck; import com.pcloud.book.advertising.check.AdvertisingCheck;
...@@ -41,6 +42,7 @@ import com.pcloud.book.advertising.entity.AdvertisingAgentPermission; ...@@ -41,6 +42,7 @@ import com.pcloud.book.advertising.entity.AdvertisingAgentPermission;
import com.pcloud.book.advertising.entity.AdvertisingBrowseRecord; import com.pcloud.book.advertising.entity.AdvertisingBrowseRecord;
import com.pcloud.book.advertising.entity.AdvertisingClickRecord; import com.pcloud.book.advertising.entity.AdvertisingClickRecord;
import com.pcloud.book.advertising.entity.AdvertisingCpa; import com.pcloud.book.advertising.entity.AdvertisingCpa;
import com.pcloud.book.advertising.entity.AdvertisingCpaPaySetting;
import com.pcloud.book.advertising.entity.AdvertisingDetailFile; import com.pcloud.book.advertising.entity.AdvertisingDetailFile;
import com.pcloud.book.advertising.entity.AdvertisingDistributionBook; import com.pcloud.book.advertising.entity.AdvertisingDistributionBook;
import com.pcloud.book.advertising.entity.AdvertisingExposureRecord; import com.pcloud.book.advertising.entity.AdvertisingExposureRecord;
...@@ -227,6 +229,8 @@ public class AdvertisingSpaceBizImpl implements AdvertisingSpaceBiz { ...@@ -227,6 +229,8 @@ public class AdvertisingSpaceBizImpl implements AdvertisingSpaceBiz {
@Autowired @Autowired
private BmBiz bmBiz; private BmBiz bmBiz;
@Autowired @Autowired
private AdvertisingCpaPaySettingBiz cpaPaySettingBiz;
@Autowired
private AdvertisingPilotRecordDao advertisingPilotRecordDao; private AdvertisingPilotRecordDao advertisingPilotRecordDao;
@Autowired @Autowired
private AdvertisingBrowseRecordDao advertisingBrowseRecordDao; private AdvertisingBrowseRecordDao advertisingBrowseRecordDao;
...@@ -3219,6 +3223,8 @@ public class AdvertisingSpaceBizImpl implements AdvertisingSpaceBiz { ...@@ -3219,6 +3223,8 @@ public class AdvertisingSpaceBizImpl implements AdvertisingSpaceBiz {
advertisingCpa = equipCPA(advertisingCpa); advertisingCpa = equipCPA(advertisingCpa);
//广告详情,报名表单选项新增 //广告详情,报名表单选项新增
bmBiz.addOptionList(advertisingCpa.getAdvertisingBmOptionList(), cpaId); bmBiz.addOptionList(advertisingCpa.getAdvertisingBmOptionList(), cpaId);
// 配置付费规则
cpaPaySettingBiz.savePaySettingList(advertisingCpa.getAdvertisingCpaPaySettingList(), cpaId, advertisingCpa.getPaySetting());
//音视频保存 //音视频保存
if (!(AdDetailModeEnum.IMG_TEXT.code.equals(advertisingCpa.getDetailMode()) || AdDetailModeEnum.DEDICATED_LINK.code.equals(advertisingCpa.getDetailMode()))) { if (!(AdDetailModeEnum.IMG_TEXT.code.equals(advertisingCpa.getDetailMode()) || AdDetailModeEnum.DEDICATED_LINK.code.equals(advertisingCpa.getDetailMode()))) {
addAdvertisingDetailFile(cpaId, advertisingCpa.getAdvertisingDetailFileList()); addAdvertisingDetailFile(cpaId, advertisingCpa.getAdvertisingDetailFileList());
...@@ -3255,6 +3261,8 @@ public class AdvertisingSpaceBizImpl implements AdvertisingSpaceBiz { ...@@ -3255,6 +3261,8 @@ public class AdvertisingSpaceBizImpl implements AdvertisingSpaceBiz {
Long cpaId = advertisingCpa.getId(); Long cpaId = advertisingCpa.getId();
//广告详情,报名表单选项新增 //广告详情,报名表单选项新增
bmBiz.addOptionList(advertisingCpa.getAdvertisingBmOptionList(), cpaId); bmBiz.addOptionList(advertisingCpa.getAdvertisingBmOptionList(), cpaId);
// 配置付费规则
cpaPaySettingBiz.savePaySettingList(advertisingCpa.getAdvertisingCpaPaySettingList(), cpaId, advertisingCpa.getPaySetting());
//音视频保存 //音视频保存
detailFileDao.deleteByCPAId(cpaId); detailFileDao.deleteByCPAId(cpaId);
if (!(AdDetailModeEnum.IMG_TEXT.code.equals(advertisingCpa.getDetailMode()) || AdDetailModeEnum.DEDICATED_LINK.code.equals(advertisingCpa.getDetailMode()))) { if (!(AdDetailModeEnum.IMG_TEXT.code.equals(advertisingCpa.getDetailMode()) || AdDetailModeEnum.DEDICATED_LINK.code.equals(advertisingCpa.getDetailMode()))) {
...@@ -3284,7 +3292,7 @@ public class AdvertisingSpaceBizImpl implements AdvertisingSpaceBiz { ...@@ -3284,7 +3292,7 @@ public class AdvertisingSpaceBizImpl implements AdvertisingSpaceBiz {
} }
@Override @Override
public AdvertisingCpaDTO getCPAContentById(Long cpaId) { public AdvertisingCpaDTO getCPAContentById(Long cpaId, Integer isWechatUser) {
AdvertisingCpaDTO cpaDTO = new AdvertisingCpaDTO(); AdvertisingCpaDTO cpaDTO = new AdvertisingCpaDTO();
AdvertisingCpa advertisingCpaDTO = advertisingCpaDao.getById(cpaId); AdvertisingCpa advertisingCpaDTO = advertisingCpaDao.getById(cpaId);
if (null == advertisingCpaDTO) { if (null == advertisingCpaDTO) {
...@@ -3307,6 +3315,10 @@ public class AdvertisingSpaceBizImpl implements AdvertisingSpaceBiz { ...@@ -3307,6 +3315,10 @@ public class AdvertisingSpaceBizImpl implements AdvertisingSpaceBiz {
BeanUtils.copyProperties(advertisingCpaDTO, cpaDTO); BeanUtils.copyProperties(advertisingCpaDTO, cpaDTO);
//填充报名表单,多个上传文件 //填充报名表单,多个上传文件
cpaDTO.setAdvertisingBmOptionList(bmBiz.getByCPAId(cpaId)); cpaDTO.setAdvertisingBmOptionList(bmBiz.getByCPAId(cpaId));
// 填充付费规则
cpaDTO.setAdvertisingCpaPaySettingList(cpaPaySettingBiz.getByCpaId(cpaId, cpaDTO.getAdvertisingBmOptionList()));
// 如果是微信用户,转换数据结构
cpaDTO.setAdvertisingCpaPaySetting4WechatList(cpaPaySettingBiz.cpaPaySetting4WechatListHandler(cpaDTO.getAdvertisingCpaPaySettingList(), isWechatUser));
List<AdvertisingDetailFile> fileList = detailFileDao.getByCPAId(cpaId); List<AdvertisingDetailFile> fileList = detailFileDao.getByCPAId(cpaId);
if (!ListUtils.isEmpty(fileList)) { if (!ListUtils.isEmpty(fileList)) {
cpaDTO.setAdvertisingDetailFileList(fileList); cpaDTO.setAdvertisingDetailFileList(fileList);
......
package com.pcloud.book.advertising.biz.impl; package com.pcloud.book.advertising.biz.impl;
import cn.hutool.core.util.ObjectUtil;
import com.pcloud.appcenter.base.exception.AppBizException; import com.pcloud.appcenter.base.exception.AppBizException;
import com.pcloud.book.advertising.biz.BmBiz; import com.pcloud.book.advertising.biz.BmBiz;
import com.pcloud.book.advertising.dao.AdvertisingCpaDao; import com.pcloud.book.advertising.dao.AdvertisingCpaDao;
...@@ -330,6 +331,14 @@ public class BmBizImpl implements BmBiz { ...@@ -330,6 +331,14 @@ public class BmBizImpl implements BmBiz {
throw new BookBizException(BookBizException.PARAM_IS_ERROR, "请填写表单"); throw new BookBizException(BookBizException.PARAM_IS_ERROR, "请填写表单");
} }
String phoneNum=null; String phoneNum=null;
if (bmRegister.getCpaPaySettingId() != null) {
bmRegister.setPayStatus(0);
// cpa支付,走指定校验逻辑
boolean paid = bmRegisterDao.checkPaid(wechatUserId, cpaId, bmRegister.getCpaPaySettingId(), bmRegister.getPhoneNumber());
if (paid) {
throw new BizException(BookBizException.PARAM_IS_ERROR, "您已购买了该课程,请选择其他年级或科目");
}
} else {
Long mobilePhoneOptionId = bmOptionDao.getMobilePhoneOptionIdByCPA(cpaId); Long mobilePhoneOptionId = bmOptionDao.getMobilePhoneOptionIdByCPA(cpaId);
Optional<AdvertisingBmRegisterItem> itemOptional = items.stream().filter(s -> s != null && s.getOptionId().equals(mobilePhoneOptionId)).findFirst(); Optional<AdvertisingBmRegisterItem> itemOptional = items.stream().filter(s -> s != null && s.getOptionId().equals(mobilePhoneOptionId)).findFirst();
if (itemOptional.isPresent()) {// 存在 if (itemOptional.isPresent()) {// 存在
...@@ -342,6 +351,7 @@ public class BmBizImpl implements BmBiz { ...@@ -342,6 +351,7 @@ public class BmBizImpl implements BmBiz {
} }
} }
} }
}
Long agentId = channelConsr.getParentId(bmRegister.getChannelId()); Long agentId = channelConsr.getParentId(bmRegister.getChannelId());
bmRegister.setAgentId(agentId); bmRegister.setAgentId(agentId);
WechatUser wechat = readerConsr.getWechatUser(wechatUserId); WechatUser wechat = readerConsr.getWechatUser(wechatUserId);
...@@ -353,7 +363,7 @@ public class BmBizImpl implements BmBiz { ...@@ -353,7 +363,7 @@ public class BmBizImpl implements BmBiz {
// 报名成功发送短信 // 报名成功发送短信
//cpaId找到手机号 //cpaId找到手机号
AdvertisingCpa advertisingCpa = advertisingCpaDao.getById(cpaId); AdvertisingCpa advertisingCpa = advertisingCpaDao.getById(cpaId);
if(null!=advertisingCpa && null!=advertisingCpa.getSuccessEmail() && advertisingCpa.getSuccessEmail()==2){ if(null!=advertisingCpa && null!=advertisingCpa.getSuccessEmail() && advertisingCpa.getSuccessEmail()==2 && ObjectUtil.notEqual(advertisingCpa.getPaySetting(), 1)){
sendSMS(phoneNum,null, SMSTemplateConstant.DEDICATED_LINK_CODE); sendSMS(phoneNum,null, SMSTemplateConstant.DEDICATED_LINK_CODE);
} }
return registerId; return registerId;
......
package com.pcloud.book.advertising.check; package com.pcloud.book.advertising.check;
import cn.hutool.core.collection.CollUtil;
import com.pcloud.book.advertising.entity.AdvertisingCpa; import com.pcloud.book.advertising.entity.AdvertisingCpa;
import com.pcloud.book.advertising.entity.AdvertisingDetailFile; import com.pcloud.book.advertising.entity.AdvertisingDetailFile;
import com.pcloud.book.advertising.entity.AdvertisingSpace; import com.pcloud.book.advertising.entity.AdvertisingSpace;
...@@ -11,6 +12,7 @@ import com.pcloud.book.advertising.enums.SettlementMethodEnum; ...@@ -11,6 +12,7 @@ import com.pcloud.book.advertising.enums.SettlementMethodEnum;
import com.pcloud.book.base.exception.BookBizException; import com.pcloud.book.base.exception.BookBizException;
import com.pcloud.common.utils.ListUtils; import com.pcloud.common.utils.ListUtils;
import com.pcloud.common.utils.string.StringUtil; import com.pcloud.common.utils.string.StringUtil;
import com.pcloud.message.common.enums.YesNoEnums;
import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.ArrayUtils;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.ArrayList; import java.util.ArrayList;
...@@ -72,7 +74,7 @@ public class AdvertisingCheck { ...@@ -72,7 +74,7 @@ public class AdvertisingCheck {
// throw new BookBizException(BookBizException.PARAM_IS_ERROR, "优惠展示图不能为空!"); // throw new BookBizException(BookBizException.PARAM_IS_ERROR, "优惠展示图不能为空!");
// } // }
//1图文介绍 //1图文介绍
if (AdDetailModeEnum.IMG_TEXT.code.equals(advertisingCpa.getDetailMode()) || AdDetailModeEnum.DEDICATED_LINK.code.equals(advertisingCpa.getDetailMode())) { if (AdDetailModeEnum.IMG_TEXT.code.equals(advertisingCpa.getDetailMode())) {
if (StringUtil.isEmpty(advertisingCpa.getCoverPic())) { if (StringUtil.isEmpty(advertisingCpa.getCoverPic())) {
throw new BookBizException(BookBizException.PARAM_IS_ERROR, "封面不能为空!"); throw new BookBizException(BookBizException.PARAM_IS_ERROR, "封面不能为空!");
} }
...@@ -120,6 +122,9 @@ public class AdvertisingCheck { ...@@ -120,6 +122,9 @@ public class AdvertisingCheck {
throw new BookBizException(BookBizException.PARAM_IS_ERROR, "按钮提示不能为空!"); throw new BookBizException(BookBizException.PARAM_IS_ERROR, "按钮提示不能为空!");
} }
} }
if (YesNoEnums.YES.code.equals(advertisingCpa.getPaySetting()) && CollUtil.isEmpty(advertisingCpa.getAdvertisingCpaPaySettingList())) {
throw new BookBizException(BookBizException.PARAM_IS_ERROR, "请配置付费规则!");
}
} }
/** /**
......
package com.pcloud.book.advertising.check;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONObject;
import com.pcloud.common.exceptions.BizException;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.net.util.Base64;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.HashMap;
@Slf4j
public class QiLiShuSheApiHandler {
private String appId;
private String appSecret;
private String domain;
public QiLiShuSheApiHandler(String appId, String appSecret, String domain) {
this.appId = appId;
this.appSecret = appSecret;
this.domain = domain;
}
public boolean post(String path, HashMap<String, Object> bodyMap) {
HttpRequest post = HttpUtil.createPost(this.domain + path);
String nonceStr = IdUtil.fastSimpleUUID();
long timestamp = System.currentTimeMillis() / 1000;
String body = JSONObject.toJSONString(bodyMap);
post.header("appid", this.appId);
post.header("nonceStr", nonceStr);
post.header("timestamp", String.valueOf(timestamp));
post.header("signature", getSign("POST", path, sortBody(bodyMap), nonceStr, timestamp));
post.body(body);
String result = post.execute().body();
log.info("【起礼科技】请求第三方接口结果;result:{};post:{}", result, post);
if (StrUtil.isBlank(result)) {
return false;
}
JSONObject jsonObject = JSONObject.parseObject(result);
if (jsonObject.getBoolean("success")) {
log.info("【起礼科技】数据同步成功;body:{}", body);
return true;
}
log.info("【起礼科技】数据同步失败;body:{}", body);
return false;
}
private String sortBody(HashMap<String, Object> bodyMap) {
char[] charArray = JSONObject.toJSONString(bodyMap).toCharArray();
Arrays.sort(charArray);
return new String(charArray);
}
String getSign(String method, String path, String body, String nonceStr, long timestamp) {
String message = buildMessage(method, path, timestamp, nonceStr, body);
return sign(message);
}
String buildMessage(String method, String path, long timestamp, String nonceStr, String body) {
return method + "\n"
+ path + "\n"
+ timestamp + "\n"
+ nonceStr + "\n"
+ body + "\n";
}
String sign(String stringToSign) {
try {
Mac hmacSha256 = Mac.getInstance("HmacSHA256");
byte[] keyBytes = this.appSecret.getBytes(StandardCharsets.UTF_8); //appkey 为绑定到API 上的签名密钥
hmacSha256.init(new SecretKeySpec(keyBytes, 0, keyBytes.length, "HmacSHA256"));
return new String(Base64.encodeBase64(hmacSha256.doFinal(stringToSign.getBytes("UTF-8"))), "UTF-8");
} catch (Exception e) {
throw new BizException(BizException.DB_DML_FAIL.getCode(), "【起礼科技】第三方签名生成失败;");
}
}
}
package com.pcloud.book.advertising.dao;
import com.pcloud.book.advertising.entity.AdvertisingCpaPaySetting;
import com.pcloud.common.core.dao.BaseDao;
import java.util.List;
/**
* (AdvertisingCpaPaySetting)表数据库访问层
*
* @author makejava
* @since 2022-11-25 14:20:46
*/
public interface AdvertisingCpaPaySettingDao extends BaseDao<AdvertisingCpaPaySetting> {
int deleteByCpaId(Long cpaId);
List<AdvertisingCpaPaySetting> getByCpaId(Long cpaId);
}
package com.pcloud.book.advertising.dao;
import com.pcloud.book.advertising.entity.AdvertisingCpaProductPackage;
import com.pcloud.common.core.dao.BaseDao;
import java.util.List;
/**
* (AdvertisingCpaProductPackage)表数据库访问层
*
* @author makejava
* @since 2022-11-29 18:12:15
*/
public interface AdvertisingCpaProductPackageDao extends BaseDao<AdvertisingCpaProductPackage> {
AdvertisingCpaProductPackage getByProductPackageId(String productPackageId);
}
...@@ -84,4 +84,9 @@ public interface BmRegisterDao extends BaseDao<AdvertisingBmRegister> { ...@@ -84,4 +84,9 @@ public interface BmRegisterDao extends BaseDao<AdvertisingBmRegister> {
public Long getRegisterCountByBookId(Long bookId, Long adviserId, Long channelId, Long adId, String statisMonth); public Long getRegisterCountByBookId(Long bookId, Long adviserId, Long channelId, Long adId, String statisMonth);
List<BmRegisterDTO> getRegisterInfoListByCpaId(Long cpaId, String statisMonth); List<BmRegisterDTO> getRegisterInfoListByCpaId(Long cpaId, String statisMonth);
/**
* 检测是否购买过
*/
boolean checkPaid(Long wechatUserId, Long cpaId, Long cpaPaySettingId, String phoneNumber);
} }
...@@ -21,4 +21,7 @@ public interface BmRegisterItemDao extends BaseDao<AdvertisingBmRegisterItem> { ...@@ -21,4 +21,7 @@ public interface BmRegisterItemDao extends BaseDao<AdvertisingBmRegisterItem> {
Integer checkMobilePhone(Long adId, String fromType, Long fromId, String optionValue); Integer checkMobilePhone(Long adId, String fromType, Long fromId, String optionValue);
Integer checkMobilePhone4Cpa(Long cpaId, String fromType, Long fromId, String optionValue); Integer checkMobilePhone4Cpa(Long cpaId, String fromType, Long fromId, String optionValue);
String getRegisterOptionValue(Long userId, Long registerId, Long optionId);
} }
package com.pcloud.book.advertising.dao.impl;
import com.pcloud.book.advertising.dao.AdvertisingCpaPaySettingDao;
import com.pcloud.book.advertising.entity.AdvertisingCpaPaySetting;
import com.pcloud.common.core.dao.BaseDaoImpl;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* (AdvertisingCpaPaySetting)表数据库访问层
*
* @author makejava
* @since 2022-11-25 14:20:46
*/
@Repository("advertisingCpaPaySettingDao")
public class AdvertisingCpaPaySettingDaoImpl extends BaseDaoImpl<AdvertisingCpaPaySetting> implements AdvertisingCpaPaySettingDao {
public int deleteByCpaId(Long cpaId) {
return getSessionTemplate().update(getStatement("deleteByCpaId"), cpaId);
}
@Override
public List<AdvertisingCpaPaySetting> getByCpaId(Long cpaId) {
return getSessionTemplate().selectList(getStatement("getByCpaId"), cpaId);
}
}
package com.pcloud.book.advertising.dao.impl;
import com.pcloud.book.advertising.entity.AdvertisingCpaProductPackage;
import com.pcloud.book.advertising.dao.AdvertisingCpaProductPackageDao;
import com.pcloud.common.core.dao.BaseDaoImpl;
import org.springframework.stereotype.Repository;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* (AdvertisingCpaProductPackage)表数据库访问层
*
* @author makejava
* @since 2022-11-29 18:12:15
*/
@Repository("advertisingCpaProductPackageDao")
public class AdvertisingCpaProductPackageDaoImpl extends BaseDaoImpl<AdvertisingCpaProductPackage> implements AdvertisingCpaProductPackageDao {
@Override
public AdvertisingCpaProductPackage getByProductPackageId(String productPackageId) {
return getSessionTemplate().selectOne(getStatement("getByProductPackageId"), productPackageId);
}
}
...@@ -96,4 +96,14 @@ public class BmRegisterDaoImpl extends BaseDaoImpl<AdvertisingBmRegister> implem ...@@ -96,4 +96,14 @@ public class BmRegisterDaoImpl extends BaseDaoImpl<AdvertisingBmRegister> implem
map.put("statisMonth", statisMonth); map.put("statisMonth", statisMonth);
return getSessionTemplate().selectList(getStatement("getRegisterInfoListByCpaId"),map); return getSessionTemplate().selectList(getStatement("getRegisterInfoListByCpaId"),map);
} }
@Override
public boolean checkPaid(Long wechatUserId, Long cpaId, Long cpaPaySettingId, String phoneNumber) {
Map<String, Object> map = new HashMap<>();
map.put("wechatUserId", wechatUserId);
map.put("cpaId", cpaId);
map.put("cpaPaySettingId", cpaPaySettingId);
map.put("phoneNumber", phoneNumber);
return getSessionTemplate().selectOne(getStatement("checkPaid"), map) != null;
}
} }
...@@ -37,4 +37,13 @@ public class BmRegisterItemDaoImpl extends BaseDaoImpl<AdvertisingBmRegisterItem ...@@ -37,4 +37,13 @@ public class BmRegisterItemDaoImpl extends BaseDaoImpl<AdvertisingBmRegisterItem
map.put("optionValue", optionValue); map.put("optionValue", optionValue);
return getSessionTemplate().selectOne(getStatement("checkMobilePhone4Cpa"), map); return getSessionTemplate().selectOne(getStatement("checkMobilePhone4Cpa"), map);
} }
@Override
public String getRegisterOptionValue(Long userId, Long registerId, Long optionId) {
Map<String, Object> map = new HashMap<>();
map.put("userId", userId);
map.put("registerId", registerId);
map.put("optionId",optionId);
return getSessionTemplate().selectOne(getStatement("getRegisterOptionValue"), map);
}
} }
...@@ -2,6 +2,7 @@ package com.pcloud.book.advertising.dto; ...@@ -2,6 +2,7 @@ package com.pcloud.book.advertising.dto;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import com.pcloud.book.advertising.entity.AdvertisingBmOption; import com.pcloud.book.advertising.entity.AdvertisingBmOption;
import com.pcloud.book.advertising.entity.AdvertisingCpaPaySetting;
import com.pcloud.book.advertising.entity.AdvertisingDetailFile; import com.pcloud.book.advertising.entity.AdvertisingDetailFile;
import com.pcloud.common.dto.BaseDto; import com.pcloud.common.dto.BaseDto;
...@@ -168,6 +169,11 @@ public class AdvertisingCpaDTO extends BaseDto { ...@@ -168,6 +169,11 @@ public class AdvertisingCpaDTO extends BaseDto {
private Integer successEmail; private Integer successEmail;
/** /**
* 成功后发送的内容(短信模板)
*/
private String successSendCode;
/**
* 跳转类型,1-统一跳转,2-自定义跳转 * 跳转类型,1-统一跳转,2-自定义跳转
*/ */
private Integer jumpStyle; private Integer jumpStyle;
...@@ -196,6 +202,53 @@ public class AdvertisingCpaDTO extends BaseDto { ...@@ -196,6 +202,53 @@ public class AdvertisingCpaDTO extends BaseDto {
*/ */
private String videoCover; private String videoCover;
/**
* 支付设置;0:关闭;1:开启;
*/
private Integer paySetting;
/**
* 支付规则配置
*/
private List<AdvertisingCpaPaySetting> advertisingCpaPaySettingList;
/**
* 支付规则配置(微信端)
*/
private List<AdvertisingCpaPaySetting> advertisingCpaPaySetting4WechatList;
public String getSuccessSendCode() {
return successSendCode;
}
public void setSuccessSendCode(String successSendCode) {
this.successSendCode = successSendCode;
}
public Integer getPaySetting() {
return paySetting;
}
public void setPaySetting(Integer paySetting) {
this.paySetting = paySetting;
}
public List<AdvertisingCpaPaySetting> getAdvertisingCpaPaySettingList() {
return advertisingCpaPaySettingList;
}
public void setAdvertisingCpaPaySettingList(List<AdvertisingCpaPaySetting> advertisingCpaPaySettingList) {
this.advertisingCpaPaySettingList = advertisingCpaPaySettingList;
}
public List<AdvertisingCpaPaySetting> getAdvertisingCpaPaySetting4WechatList() {
return advertisingCpaPaySetting4WechatList;
}
public void setAdvertisingCpaPaySetting4WechatList(List<AdvertisingCpaPaySetting> advertisingCpaPaySetting4WechatList) {
this.advertisingCpaPaySetting4WechatList = advertisingCpaPaySetting4WechatList;
}
public String getVideoCover() { public String getVideoCover() {
return videoCover; return videoCover;
} }
......
...@@ -95,6 +95,55 @@ public class AdvertisingBmRegister extends BaseEntity{ ...@@ -95,6 +95,55 @@ public class AdvertisingBmRegister extends BaseEntity{
*/ */
private Long cpaId; private Long cpaId;
/**
* 购买内容id
*/
private Long cpaPaySettingId;
/**
* 订单号
*/
private String orderNum;
/**
* 支付状态;-1:已退款;0:待支付;1:已支付;
*/
private Integer payStatus;
private String phoneNumber;
public String getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
public Integer getPayStatus() {
return payStatus;
}
public void setPayStatus(Integer payStatus) {
this.payStatus = payStatus;
}
public Long getCpaPaySettingId() {
return cpaPaySettingId;
}
public void setCpaPaySettingId(Long cpaPaySettingId) {
this.cpaPaySettingId = cpaPaySettingId;
}
public String getOrderNum() {
return orderNum;
}
public void setOrderNum(String orderNum) {
this.orderNum = orderNum;
}
public Long getCpaId() { public Long getCpaId() {
return cpaId; return cpaId;
} }
......
...@@ -133,6 +133,11 @@ public class AdvertisingCpa extends BaseEntity{ ...@@ -133,6 +133,11 @@ public class AdvertisingCpa extends BaseEntity{
private Integer successEmail; private Integer successEmail;
/** /**
* 成功后发送的内容(短信模板)
*/
private String successSendCode;
/**
* 跳转类型,1-统一跳转,2-自定义跳转 * 跳转类型,1-统一跳转,2-自定义跳转
*/ */
private Integer jumpStyle; private Integer jumpStyle;
...@@ -154,6 +159,41 @@ public class AdvertisingCpa extends BaseEntity{ ...@@ -154,6 +159,41 @@ public class AdvertisingCpa extends BaseEntity{
*/ */
private String videoCover; private String videoCover;
/**
* 支付设置;0:关闭;1:开启;
*/
private Integer paySetting;
/**
* 支付规则配置
* @return
*/
private List<AdvertisingCpaPaySetting> advertisingCpaPaySettingList;
public String getSuccessSendCode() {
return successSendCode;
}
public void setSuccessSendCode(String successSendCode) {
this.successSendCode = successSendCode;
}
public Integer getPaySetting() {
return paySetting;
}
public void setPaySetting(Integer paySetting) {
this.paySetting = paySetting;
}
public List<AdvertisingCpaPaySetting> getAdvertisingCpaPaySettingList() {
return advertisingCpaPaySettingList;
}
public void setAdvertisingCpaPaySettingList(List<AdvertisingCpaPaySetting> advertisingCpaPaySettingList) {
this.advertisingCpaPaySettingList = advertisingCpaPaySettingList;
}
public String getVideoCover() { public String getVideoCover() {
return videoCover; return videoCover;
} }
......
package com.pcloud.book.advertising.entity;
import java.util.Date;
import java.math.BigDecimal;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.pcloud.common.entity.BaseEntity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* (AdvertisingCpaPaySetting)实体类
*
* @author makejava
* @since 2022-11-25 14:20:46
*/
@Data
public class AdvertisingCpaPaySetting extends BaseEntity {
private static final long serialVersionUID = -92641933418831068L;
@ApiModelProperty("cpa支付设置")
private Long id;
@ApiModelProperty("cpa_id")
private Long cpaId;
@ApiModelProperty("关系字段(年级、年龄)")
private Long firstOptionItemId;
@ApiModelProperty("关系字段(学科)")
private Long secondOptionItemId;
@ApiModelProperty("权益id")
private String productPackageId;
@ApiModelProperty("权益包名称")
private String productName;
@ApiModelProperty("商品金额")
private BigDecimal payPrice;
@ApiModelProperty("创建时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTime;
@ApiModelProperty("关系字段(年级、年龄)")
private String firstOptionItemText;
@ApiModelProperty("关系字段(学科)")
private String secondOptionItemText;
@ApiModelProperty("微信端需要二级目录结构")
private List<AdvertisingCpaPaySetting> cpaPaySettingList;
}
package com.pcloud.book.advertising.entity;
import java.util.Date;
import java.math.BigDecimal;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.pcloud.common.entity.BaseEntity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* (AdvertisingCpaProductPackage)实体类
*
* @author makejava
* @since 2022-11-29 18:28:41
*/
@Data
public class AdvertisingCpaProductPackage extends BaseEntity {
private static final long serialVersionUID = -63683675671690720L;
@ApiModelProperty("权益配置id")
private Long id;
@ApiModelProperty("权益id")
private String productPackageId;
@ApiModelProperty("权益包名称")
private String productName;
@ApiModelProperty("描述")
private String description;
@ApiModelProperty("第三方接口-域名")
private String apiDomain;
@ApiModelProperty("第三方接口-订单插入")
private String apiMethodCreate;
@ApiModelProperty("第三方接口-订单退款")
private String apiMethodRefund;
@ApiModelProperty("应用id")
private String appId;
@ApiModelProperty("密钥")
private String appSecret;
@ApiModelProperty("创建时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTime;
}
package com.pcloud.book.advertising.facade; package com.pcloud.book.advertising.facade;
import com.pcloud.book.advertising.biz.AdvertisingCpaProductPackageBiz;
import com.pcloud.book.advertising.biz.LinkRevertBiz; import com.pcloud.book.advertising.biz.LinkRevertBiz;
import com.pcloud.book.advertising.dto.LinkRevertRecordDTO; import com.pcloud.book.advertising.dto.LinkRevertRecordDTO;
import com.pcloud.book.advertising.entity.AdvertisingLinkClick; import com.pcloud.book.advertising.entity.AdvertisingLinkClick;
...@@ -44,6 +45,8 @@ public class LinkRevertFacade { ...@@ -44,6 +45,8 @@ public class LinkRevertFacade {
@Autowired @Autowired
private LinkRevertBiz linkRevertBiz; private LinkRevertBiz linkRevertBiz;
@Autowired
private AdvertisingCpaProductPackageBiz packageBiz;
@ApiOperation(value = "添加链接转换记录", httpMethod = "POST") @ApiOperation(value = "添加链接转换记录", httpMethod = "POST")
@PostMapping("addRevertRecord") @PostMapping("addRevertRecord")
...@@ -167,4 +170,13 @@ public class LinkRevertFacade { ...@@ -167,4 +170,13 @@ public class LinkRevertFacade {
return new ResponseDto<>(pageBean); return new ResponseDto<>(pageBean);
} }
@GetMapping("testOrder")
public void testOrder() {
packageBiz.testQiLiOrder();
}
@GetMapping("testQiLiRefundOrder")
public void testQiLiRefundOrder() {
packageBiz.testQiLiRefundOrder();
}
} }
...@@ -29,6 +29,7 @@ import com.pcloud.common.utils.ResponseHandleUtil; ...@@ -29,6 +29,7 @@ import com.pcloud.common.utils.ResponseHandleUtil;
import com.pcloud.common.utils.SessionUtil; import com.pcloud.common.utils.SessionUtil;
import com.pcloud.common.utils.cookie.Cookie; import com.pcloud.common.utils.cookie.Cookie;
import com.pcloud.common.utils.string.StringUtil; import com.pcloud.common.utils.string.StringUtil;
import com.pcloud.message.common.enums.YesNoEnums;
import com.pcloud.wechatgroup.message.enums.IsSystem; import com.pcloud.wechatgroup.message.enums.IsSystem;
import org.codehaus.jackson.JsonParseException; import org.codehaus.jackson.JsonParseException;
...@@ -1134,7 +1135,7 @@ public class AdvertisingSpaceFacadeImpl implements AdvertisingSpaceFacade { ...@@ -1134,7 +1135,7 @@ public class AdvertisingSpaceFacadeImpl implements AdvertisingSpaceFacade {
throw new BookBizException(BookBizException.PARAM_IS_NULL, "参数有误!"); throw new BookBizException(BookBizException.PARAM_IS_NULL, "参数有误!");
} }
SessionUtil.getToken4Redis(token); SessionUtil.getToken4Redis(token);
AdvertisingCpaDTO dto = advertisingSpaceBiz.getCPAContentById(cpaId); AdvertisingCpaDTO dto = advertisingSpaceBiz.getCPAContentById(cpaId, YesNoEnums.NO.code);
return new ResponseDto<>(dto); return new ResponseDto<>(dto);
} }
...@@ -1192,7 +1193,7 @@ public class AdvertisingSpaceFacadeImpl implements AdvertisingSpaceFacade { ...@@ -1192,7 +1193,7 @@ public class AdvertisingSpaceFacadeImpl implements AdvertisingSpaceFacade {
if (null == cpaId) { if (null == cpaId) {
throw new BookBizException(BookBizException.PARAM_IS_NULL, "参数有误!"); throw new BookBizException(BookBizException.PARAM_IS_NULL, "参数有误!");
} }
AdvertisingCpaDTO dto = advertisingSpaceBiz.getCPAContentById(cpaId); AdvertisingCpaDTO dto = advertisingSpaceBiz.getCPAContentById(cpaId, YesNoEnums.YES.code);
return new ResponseDto<>(dto); return new ResponseDto<>(dto);
} }
......
...@@ -557,6 +557,19 @@ public class ReaderConsr { ...@@ -557,6 +557,19 @@ public class ReaderConsr {
appletUserService.subscribeSend(wechatUserId); appletUserService.subscribeSend(wechatUserId);
} }
public String getUnionIdByWechatUserId(Long wechatUserId) {
LOGGER.info("【获取unionId ,<START>.[wechatUserId:{}]", wechatUserId);
if (wechatUserId == null) {
return null;
}
try {
return ResponseHandleUtil.parseResponse(wechatUserService.getUnionIdByWechatUserId(wechatUserId), String.class);
} catch (Exception e) {
LOGGER.warn("raysUnionUserService.getUnionIdByWechatUserId" + e.getMessage(), e);
}
return null;
}
} }
...@@ -121,4 +121,12 @@ public class MQTopicConumer { ...@@ -121,4 +121,12 @@ public class MQTopicConumer {
* 二维码恢复 * 二维码恢复
*/ */
public static final String RECOVER_QRCODE = PREFIX + MQTopicProducer.RECOVER_QRCODE; public static final String RECOVER_QRCODE = PREFIX + MQTopicProducer.RECOVER_QRCODE;
/**
* 支付-解析支付
*/
public static final String PAYMENT_EXERCISE_BOOK = PREFIX + MQTopicProducer.EXERCISE_BOOK_PAY;
/**
* 支付-解析支付
*/
public static final String REFUND_EXERCISE_BOOK = PREFIX + MQTopicProducer.EXERCISE_BOOK_REFUND;
} }
package com.pcloud.book.mq.topic;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.pcloud.book.advertising.biz.AdvertisingCpaProductPackageBiz;
import com.pcloud.book.advertising.biz.BmBiz;
import com.pcloud.book.advertising.dao.AdvertisingCpaDao;
import com.pcloud.book.advertising.dao.BmOptionDao;
import com.pcloud.book.advertising.dao.BmRegisterDao;
import com.pcloud.book.advertising.dao.BmRegisterItemDao;
import com.pcloud.book.advertising.entity.AdvertisingBmRegister;
import com.pcloud.book.advertising.entity.AdvertisingCpa;
import com.pcloud.book.mq.config.MQTopicConumer;
import com.pcloud.common.core.aspect.ParamLog;
import com.pcloud.common.core.constant.SMSTemplateConstant;
import com.pcloud.common.exceptions.BizException;
import com.pcloud.exercisebook.enums.PayModeEnums;
import com.pcloud.facade.tradecenter.dto.ExerciseBookPayDTO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
@RabbitListener(queues = MQTopicConumer.PAYMENT_EXERCISE_BOOK)
@Slf4j
public class PaymentExerciseBookListener {
@Autowired
private BmRegisterDao bmRegisterDao;
@Autowired
private AdvertisingCpaDao advertisingCpaDao;
@Autowired
private AdvertisingCpaProductPackageBiz cpaProductPackageBiz;
@Autowired
private BmBiz bmBiz;
@Autowired
private BmOptionDao bmOptionDao;
@Autowired
private BmRegisterItemDao bmRegisterItemDao;
@RabbitHandler
@ParamLog("处理订单支付Queue")
public void process(ExerciseBookPayDTO exerciseBookPayDTO) throws BizException {
log.info("接收处理订单支付Queue exerciseBookPayDTO:{}", exerciseBookPayDTO);
if (exerciseBookPayDTO == null || exerciseBookPayDTO.getOrderMainNum() == null) {
return;
}
try {
handlePayMessage(exerciseBookPayDTO);
} catch (Exception e) {
log.error("小睿伴学处理购买消息失败exerciseBookPayDTO:{},ERROR:{}", exerciseBookPayDTO, e);
}
}
private void handlePayMessage(ExerciseBookPayDTO payDTO) {
// 判断 buyMode
if(!PayModeEnums.ADVERTISING_CPA.getCode().equals(payDTO.getBuyMode())) {
return;
}
// 根据 buy_id(register_id) 查询详情
AdvertisingBmRegister bmRegister = bmRegisterDao.getById(payDTO.getBuyId());
if (bmRegister == null) {
log.error("未找到对应的 id,无法处理订单,请关注;payDTO:{}", JSONUtil.toJsonStr(payDTO));
return;
}
// 更新 orderNum、支付状态
AdvertisingBmRegister updateRegister = new AdvertisingBmRegister();
updateRegister.setId(bmRegister.getId());
updateRegister.setOrderNum(payDTO.getOrderMainNum());
updateRegister.setPayStatus(1);
updateRegister.setPhoneNumber(payDTO.getPhoneNumber());
bmRegisterDao.update(updateRegister);
// 拿到用户手机
/*Long mobilePhoneOptionId = bmOptionDao.getMobilePhoneOptionIdByCPA(bmRegister.getCpaId());
String mobile = bmRegisterItemDao.getRegisterOptionValue(payDTO.getWechatUserId(), bmRegister.getId(), mobilePhoneOptionId);*/
// 发送短信
AdvertisingCpa advertisingCpa = advertisingCpaDao.getById(bmRegister.getCpaId());
if(null!=advertisingCpa && null!=advertisingCpa.getSuccessEmail() && advertisingCpa.getSuccessEmail()==3 && StrUtil.isNotBlank(advertisingCpa.getSuccessSendCode())){
if (StrUtil.isNotBlank(payDTO.getPhoneNumber())) {
log.info("发送短信[{}]:[{}];payDTO:{}", payDTO.getPhoneNumber(), advertisingCpa.getSuccessSendCode(),JSONUtil.toJsonStr(payDTO));
bmBiz.sendSMS(payDTO.getPhoneNumber(),null, advertisingCpa.getSuccessSendCode());
} else {
log.error("未找到手机号,无法发送短信;payDTO:{}", JSONUtil.toJsonStr(payDTO));
}
}
// 查询 权益id是否有配置需要发送支付信息给第三方
cpaProductPackageBiz.handlerCreateProductPackage(payDTO);
}
}
package com.pcloud.book.mq.topic;
import cn.hutool.json.JSONUtil;
import com.pcloud.book.advertising.biz.AdvertisingCpaProductPackageBiz;
import com.pcloud.book.advertising.dao.BmRegisterDao;
import com.pcloud.book.advertising.entity.AdvertisingBmRegister;
import com.pcloud.book.mq.config.MQTopicConumer;
import com.pcloud.common.core.aspect.ParamLog;
import com.pcloud.common.exceptions.BizException;
import com.pcloud.exercisebook.dto.RefundExerciseBookDTO;
import com.pcloud.exercisebook.enums.PayModeEnums;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component("refundExerciseBookListener")
@RabbitListener(queues = MQTopicConumer.REFUND_EXERCISE_BOOK)
@Slf4j
public class RefundExerciseBookListener {
@Autowired
private BmRegisterDao bmRegisterDao;
@Autowired
private AdvertisingCpaProductPackageBiz cpaProductPackageBiz;
@RabbitHandler
@ParamLog("处理退款订单Queue")
public void process(RefundExerciseBookDTO refundDTO) throws BizException {
log.info("接收处理退款订单Queue refundDTO:{}", refundDTO);
if (refundDTO == null || refundDTO.getOrderMainNum() == null) {
return;
}
try {
handleRefundMessage(refundDTO);
} catch (Exception e) {
log.error("小睿伴学处理退款消息失败 refundDTO:{},ERROR:{}", refundDTO, e.getMessage());
}
}
private void handleRefundMessage(RefundExerciseBookDTO refundDTO) {
// 判断 buyMode
if(!PayModeEnums.ADVERTISING_CPA.getCode().equals(refundDTO.getBuyMode())) {
return;
}
// 根据 buy_id(register_id) 查询详情
AdvertisingBmRegister bmRegister = bmRegisterDao.getById(refundDTO.getBuyId());
if (bmRegister == null) {
log.error("未找到对应的 id,无法处理退款单,请关注;refundDTO:{}", JSONUtil.toJsonStr(refundDTO));
return;
}
// 更新退款状态
AdvertisingBmRegister updateRegister = new AdvertisingBmRegister();
updateRegister.setId(bmRegister.getId());
updateRegister.setPayStatus(-1);
bmRegisterDao.update(updateRegister);
// 退款
cpaProductPackageBiz.handlerRefundProductPackage(refundDTO);
}
}
\ No newline at end of file
...@@ -80,4 +80,12 @@ ...@@ -80,4 +80,12 @@
AND i.option_value = #{optionValue} AND i.option_value = #{optionValue}
</select> </select>
<select id="getRegisterOptionValue" resultType="string" parameterType="map">
SELECT option_value FROM `advertising_bm_register_item`
WHERE user_id = #{userId}
AND register_id = #{registerId}
AND option_id = #{optionId}
LIMIT 1
</select>
</mapper> </mapper>
\ No newline at end of file
...@@ -19,6 +19,10 @@ ...@@ -19,6 +19,10 @@
<result column="create_day" property="createDay" jdbcType="DATE"/> <result column="create_day" property="createDay" jdbcType="DATE"/>
<result column="create_month" property="createMonth" jdbcType="VARCHAR"/> <result column="create_month" property="createMonth" jdbcType="VARCHAR"/>
<result column="cpa_id" property="cpaId" jdbcType="BIGINT"/> <result column="cpa_id" property="cpaId" jdbcType="BIGINT"/>
<result column="cpa_pay_setting_id" property="cpaPaySettingId" jdbcType="BIGINT"/>
<result column="order_num" property="orderNum" jdbcType="VARCHAR"/>
<result column="pay_status" property="payStatus" jdbcType="INTEGER"/>
<result column="phone_number" property="phoneNumber" jdbcType="VARCHAR"/>
</resultMap> </resultMap>
<!-- 微信端用户详细信息 --> <!-- 微信端用户详细信息 -->
...@@ -37,9 +41,15 @@ ...@@ -37,9 +41,15 @@
<sql id="Base_Column_List" > <sql id="Base_Column_List" >
id, user_id, ad_id, nick_name, create_time, qrcode_id, scene_id, adviser_id, agent_id, channel_id, official_account_id, from_type, id, user_id, ad_id, nick_name, create_time, qrcode_id, scene_id, adviser_id, agent_id, channel_id, official_account_id, from_type,
from_id,book_id,create_day, create_month,cpa_id from_id,book_id,create_day, create_month,cpa_id,cpa_pay_setting_id,order_num,pay_status,phone_number
</sql> </sql>
<select id="getById" parameterType="long" resultMap="BaseResultMap">
SELECT <include refid="Base_Column_List"/>
FROM advertising_bm_register
WHERE id = #{id}
</select>
<insert id="insert" parameterType="com.pcloud.book.advertising.entity.AdvertisingBmRegister" useGeneratedKeys="true" keyProperty="id"> <insert id="insert" parameterType="com.pcloud.book.advertising.entity.AdvertisingBmRegister" useGeneratedKeys="true" keyProperty="id">
INSERT INTO advertising_bm_register ( INSERT INTO advertising_bm_register (
user_id, user_id,
...@@ -57,7 +67,11 @@ ...@@ -57,7 +67,11 @@
book_id, book_id,
create_day, create_day,
create_month, create_month,
cpa_id cpa_id,
cpa_pay_setting_id,
order_num,
pay_status,
phone_number
) )
VALUES VALUES
( (
...@@ -76,7 +90,11 @@ ...@@ -76,7 +90,11 @@
#{bookId,jdbcType=BIGINT}, #{bookId,jdbcType=BIGINT},
NOW(), NOW(),
DATE_FORMAT(NOW(), '%Y-%m'), DATE_FORMAT(NOW(), '%Y-%m'),
#{cpaId} #{cpaId},
#{cpaPaySettingId},
#{orderNum},
#{payStatus},
#{phoneNumber}
) )
</insert> </insert>
...@@ -222,4 +240,33 @@ ...@@ -222,4 +240,33 @@
ORDER BY create_time DESC ORDER BY create_time DESC
</select> </select>
<update id="update" parameterType="com.pcloud.book.advertising.entity.AdvertisingBmRegister">
UPDATE advertising_bm_register
<set>
<if test="orderNum!=null">
order_num = #{orderNum},
</if>
<if test="payStatus!=null">
pay_status = #{payStatus},
</if>
<if test="phoneNumber!=null">
phone_number = #{phoneNumber},
</if>
</set>
WHERE
id = #{id}
</update>
<select id="checkPaid" parameterType="map" resultType="int">
SELECT 1 FROM advertising_bm_register
WHERE pay_status = 1
AND (user_id = #{wechatUserId}
<if test="phoneNumber!=null and phoneNumber!=''">
OR phone_number = #{phoneNumber}
</if>
)
AND cpa_id = #{cpaId}
AND cpa_pay_setting_id = #{cpaPaySettingId}
</select>
</mapper> </mapper>
\ No newline at end of file
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
<result column="bottom_button_image" property="bottomButtonImage" jdbcType="VARCHAR" /> <result column="bottom_button_image" property="bottomButtonImage" jdbcType="VARCHAR" />
<result column="privacy_agreement" property="privacyAgreement" jdbcType="INTEGER" /> <result column="privacy_agreement" property="privacyAgreement" jdbcType="INTEGER" />
<result column="success_email" property="successEmail" jdbcType="INTEGER" /> <result column="success_email" property="successEmail" jdbcType="INTEGER" />
<result column="success_send_code" property="successSendCode" jdbcType="VARCHAR" />
<result column="jump_style" property="jumpStyle" jdbcType="INTEGER" /> <result column="jump_style" property="jumpStyle" jdbcType="INTEGER" />
<result column="create_user" property="createUser" jdbcType="BIGINT" /> <result column="create_user" property="createUser" jdbcType="BIGINT" />
<result column="update_user" property="updateUser" jdbcType="BIGINT" /> <result column="update_user" property="updateUser" jdbcType="BIGINT" />
...@@ -35,6 +36,7 @@ ...@@ -35,6 +36,7 @@
<result column="file_convert_state" property="fileConvertState" jdbcType="INTEGER" /> <result column="file_convert_state" property="fileConvertState" jdbcType="INTEGER" />
<result column="cover_video_file_name" property="coverVideoFileName" jdbcType="VARCHAR" /> <result column="cover_video_file_name" property="coverVideoFileName" jdbcType="VARCHAR" />
<result column="video_cover" property="videoCover" jdbcType="VARCHAR" /> <result column="video_cover" property="videoCover" jdbcType="VARCHAR" />
<result column="pay_setting" property="paySetting" jdbcType="INTEGER" />
</resultMap> </resultMap>
<resultMap id="AdvertisingCpaDTO" type="com.pcloud.book.advertising.dto.AdvertisingCpaDTO"> <resultMap id="AdvertisingCpaDTO" type="com.pcloud.book.advertising.dto.AdvertisingCpaDTO">
...@@ -62,6 +64,7 @@ ...@@ -62,6 +64,7 @@
<result column="bottom_button_image" property="bottomButtonImage" jdbcType="VARCHAR" /> <result column="bottom_button_image" property="bottomButtonImage" jdbcType="VARCHAR" />
<result column="privacy_agreement" property="privacyAgreement" jdbcType="INTEGER" /> <result column="privacy_agreement" property="privacyAgreement" jdbcType="INTEGER" />
<result column="success_email" property="successEmail" jdbcType="INTEGER" /> <result column="success_email" property="successEmail" jdbcType="INTEGER" />
<result column="success_send_code" property="successSendCode" jdbcType="VARCHAR" />
<result column="jump_style" property="jumpStyle" jdbcType="INTEGER" /> <result column="jump_style" property="jumpStyle" jdbcType="INTEGER" />
<result column="create_user" property="createUser" jdbcType="BIGINT" /> <result column="create_user" property="createUser" jdbcType="BIGINT" />
<result column="update_user" property="updateUser" jdbcType="BIGINT" /> <result column="update_user" property="updateUser" jdbcType="BIGINT" />
...@@ -70,14 +73,15 @@ ...@@ -70,14 +73,15 @@
<result column="file_convert_state" property="fileConvertState" jdbcType="INTEGER" /> <result column="file_convert_state" property="fileConvertState" jdbcType="INTEGER" />
<result column="cover_video_file_name" property="coverVideoFileName" jdbcType="VARCHAR" /> <result column="cover_video_file_name" property="coverVideoFileName" jdbcType="VARCHAR" />
<result column="video_cover" property="videoCover" jdbcType="VARCHAR" /> <result column="video_cover" property="videoCover" jdbcType="VARCHAR" />
<result column="pay_setting" property="paySetting" jdbcType="INTEGER" />
</resultMap> </resultMap>
<sql id="Base_Column_List" > <sql id="Base_Column_List" >
id, detail_name, detail_mode, cover_pic, welfare_pic, form_mobile_check, form_remark, id, detail_name, detail_mode, cover_pic, welfare_pic, form_mobile_check, form_remark,
form_button, form_link, create_time, update_time, detail_info, preview_link form_button, form_link, create_time, update_time, detail_info, preview_link
,cover_video,bg_color,success_toast_type,success_toast_content,commit_button_type,commit_button_content ,cover_video,bg_color,success_toast_type,success_toast_content,commit_button_type,commit_button_content
,commit_button_image,bottom_button_type,bottom_button_content,bottom_button_image,privacy_agreement,success_email,jump_style,create_user,update_user ,commit_button_image,bottom_button_type,bottom_button_content,bottom_button_image,privacy_agreement,success_email,success_send_code,jump_style,create_user,update_user
,head_picture,cover_video_file_id,file_convert_state,cover_video_file_name,video_cover ,head_picture,cover_video_file_id,file_convert_state,cover_video_file_name,video_cover,pay_setting
</sql> </sql>
<select id="getById" resultMap="BaseResultMap" parameterType="java.lang.Long" > <select id="getById" resultMap="BaseResultMap" parameterType="java.lang.Long" >
...@@ -97,16 +101,16 @@ ...@@ -97,16 +101,16 @@
form_remark, form_button, form_link, form_remark, form_button, form_link,
create_time, update_time, detail_info, preview_link create_time, update_time, detail_info, preview_link
,cover_video,bg_color,success_toast_type,success_toast_content,commit_button_type,commit_button_content ,cover_video,bg_color,success_toast_type,success_toast_content,commit_button_type,commit_button_content
,commit_button_image,bottom_button_type,bottom_button_content,bottom_button_image,privacy_agreement,success_email,jump_style ,commit_button_image,bottom_button_type,bottom_button_content,bottom_button_image,privacy_agreement,success_email,success_send_code,jump_style
,create_user,update_user,head_picture,cover_video_file_id,file_convert_state,cover_video_file_name,video_cover ,create_user,update_user,head_picture,cover_video_file_id,file_convert_state,cover_video_file_name,video_cover,pay_setting
) )
values (#{detailName,jdbcType=VARCHAR}, #{detailMode,jdbcType=VARCHAR}, values (#{detailName,jdbcType=VARCHAR}, #{detailMode,jdbcType=VARCHAR},
#{coverPic,jdbcType=VARCHAR}, #{welfarePic,jdbcType=VARCHAR}, #{formMobileCheck,jdbcType=BIT}, #{coverPic,jdbcType=VARCHAR}, #{welfarePic,jdbcType=VARCHAR}, #{formMobileCheck,jdbcType=BIT},
#{formRemark,jdbcType=VARCHAR}, #{formButton,jdbcType=VARCHAR}, #{formLink,jdbcType=VARCHAR}, #{formRemark,jdbcType=VARCHAR}, #{formButton,jdbcType=VARCHAR}, #{formLink,jdbcType=VARCHAR},
NOW(), NOW(), #{detailInfo,jdbcType=LONGVARCHAR}, #{previewLink,jdbcType=VARCHAR} NOW(), NOW(), #{detailInfo,jdbcType=LONGVARCHAR}, #{previewLink,jdbcType=VARCHAR}
,#{coverVideo},#{bgColor},#{successToastType},#{successToastContent},#{commitButtonType},#{commitButtonContent},#{commitButtonImage} ,#{coverVideo},#{bgColor},#{successToastType},#{successToastContent},#{commitButtonType},#{commitButtonContent},#{commitButtonImage}
,#{bottomButtonType},#{bottomButtonContent},#{bottomButtonImage},#{privacyAgreement},#{successEmail},#{jumpStyle},#{createUser},#{updateUser},#{headPicture} ,#{bottomButtonType},#{bottomButtonContent},#{bottomButtonImage},#{privacyAgreement},#{successEmail},#{successSendCode},#{jumpStyle},#{createUser},#{updateUser},#{headPicture}
,#{coverVideoFileId},#{fileConvertState},#{coverVideoFileName},#{videoCover} ,#{coverVideoFileId},#{fileConvertState},#{coverVideoFileName},#{videoCover},#{paySetting}
) )
</insert> </insert>
...@@ -180,6 +184,9 @@ ...@@ -180,6 +184,9 @@
<if test="successEmail != null"> <if test="successEmail != null">
success_email = #{successEmail}, success_email = #{successEmail},
</if> </if>
<if test="successSendCode != null">
success_send_code = #{successSendCode},
</if>
<if test="jumpStyle != null"> <if test="jumpStyle != null">
jump_style = #{jumpStyle}, jump_style = #{jumpStyle},
</if> </if>
...@@ -204,6 +211,9 @@ ...@@ -204,6 +211,9 @@
<if test="videoCover != null"> <if test="videoCover != null">
video_cover = #{videoCover}, video_cover = #{videoCover},
</if> </if>
<if test="paySetting != null">
pay_setting = #{paySetting},
</if>
</set> </set>
where id = #{id,jdbcType=BIGINT} where id = #{id,jdbcType=BIGINT}
</update> </update>
......
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.pcloud.book.advertising.dao.impl.AdvertisingCpaPaySettingDaoImpl">
<resultMap id="BaseResultMap" type="com.pcloud.book.advertising.entity.AdvertisingCpaPaySetting">
<id column="id" property="id" jdbcType="BIGINT"/>
<result column="cpa_id" property="cpaId" jdbcType="BIGINT"/>
<result column="first_option_item_id" property="firstOptionItemId" jdbcType="BIGINT"/>
<result column="second_option_item_id" property="secondOptionItemId" jdbcType="BIGINT"/>
<result column="product_package_id" property="productPackageId" jdbcType="VARCHAR"/>
<result column="pay_price" property="payPrice" jdbcType="DECIMAL"/>
<result column="create_time" property="createTime" jdbcType="TIMESTAMP"/>
</resultMap>
<sql id="Base_Column_List">
id, cpa_id, first_option_item_id, second_option_item_id, product_package_id, pay_price, create_time
</sql>
<select id="getById" resultMap="BaseResultMap">
SELECT
<include refid="Base_Column_List"/>
FROM advertising_cpa_pay_setting
WHERE id = #{id}
</select>
<select id="getList" resultMap="BaseResultMap">
SELECT
<include refid="Base_Column_List"/>
FROM advertising_cpa_pay_setting
</select>
<insert id="insert" keyProperty="id" useGeneratedKeys="true">
INSERT INTO advertising_cpa_pay_setting(
cpa_id,
first_option_item_id,
second_option_item_id,
product_package_id,
pay_price,
create_time
) VALUES (
#{cpaId, jdbcType=BIGINT},
#{firstOptionItemId, jdbcType=BIGINT},
#{secondOptionItemId, jdbcType=BIGINT},
#{productPackageId, jdbcType=VARCHAR},
#{payPrice, jdbcType=DECIMAL},
#{createTime, jdbcType=TIMESTAMP}
)
</insert>
<insert id="batchInsert">
INSERT INTO advertising_cpa_pay_setting (
cpa_id,
first_option_item_id,
second_option_item_id,
product_package_id,
pay_price,
create_time
) VALUES
<foreach collection="list" item="item" separator=",">
(
#{item.cpaId, jdbcType=BIGINT},
#{item.firstOptionItemId, jdbcType=BIGINT},
#{item.secondOptionItemId, jdbcType=BIGINT},
#{item.productPackageId, jdbcType=VARCHAR},
#{item.payPrice, jdbcType=DECIMAL},
#{item.createTime, jdbcType=TIMESTAMP}
)
</foreach>
</insert>
<!--通过主键修改数据-->
<update id="update">
UPDATE advertising_cpa_pay_setting
<set>
<if test="cpaId != null">
cpa_id = #{cpaId},
</if>
<if test="firstOptionItemId != null">
first_option_item_id = #{firstOptionItemId},
</if>
<if test="secondOptionItemId != null">
second_option_item_id = #{secondOptionItemId},
</if>
<if test="productPackageId != null and productPackageId != ''">
product_package_id = #{productPackageId},
</if>
<if test="payPrice != null">
pay_price = #{payPrice},
</if>
<if test="createTime != null">
create_time = #{createTime},
</if>
</set>
WHERE id = #{id}
</update>
<!--通过主键删除-->
<delete id="deleteById">
DELETE FROM advertising_cpa_pay_setting where id = #{id}
</delete>
<!--通过主键删除-->
<delete id="deleteByCpaId">
DELETE FROM advertising_cpa_pay_setting where cpa_id = #{cpaId}
</delete>
<select id="getByCpaId" resultMap="BaseResultMap">
SELECT
<include refid="Base_Column_List"/>
FROM advertising_cpa_pay_setting
WHERE cpa_id = #{cpaId}
</select>
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.pcloud.book.advertising.dao.impl.AdvertisingCpaProductPackageDaoImpl">
<resultMap id="BaseResultMap" type="com.pcloud.book.advertising.entity.AdvertisingCpaProductPackage">
<id column="id" property="id" jdbcType="BIGINT"/>
<result column="product_package_id" property="productPackageId" jdbcType="VARCHAR"/>
<result column="product_name" property="productName" jdbcType="VARCHAR"/>
<result column="description" property="description" jdbcType="VARCHAR"/>
<result column="api_domain" property="apiDomain" jdbcType="VARCHAR"/>
<result column="api_method_create" property="apiMethodCreate" jdbcType="VARCHAR"/>
<result column="api_method_refund" property="apiMethodRefund" jdbcType="VARCHAR"/>
<result column="app_id" property="appId" jdbcType="VARCHAR"/>
<result column="app_secret" property="appSecret" jdbcType="VARCHAR"/>
<result column="create_time" property="createTime" jdbcType="TIMESTAMP"/>
</resultMap>
<sql id="Base_Column_List">
id, product_package_id, product_name, description, api_domain, api_method_create, api_method_refund, app_id, app_secret, create_time
</sql>
<select id="getById" resultMap="BaseResultMap">
SELECT
<include refid="Base_Column_List"/>
FROM advertising_cpa_product_package
WHERE id = #{id}
</select>
<select id="listBy" resultMap="BaseResultMap">
SELECT
<include refid="Base_Column_List"/>
FROM advertising_cpa_product_package
</select>
<insert id="insert" keyProperty="id" useGeneratedKeys="true">
INSERT INTO advertising_cpa_product_package(
product_package_id,
product_name,
description,
api_domain,
api_method_create,
api_method_refund,
app_id,
app_secret,
create_time
) VALUES (
#{productPackageId, jdbcType=VARCHAR},
#{productName, jdbcType=VARCHAR},
#{description, jdbcType=VARCHAR},
#{apiDomain, jdbcType=VARCHAR},
#{apiMethodCreate, jdbcType=VARCHAR},
#{apiMethodRefund, jdbcType=VARCHAR},
#{appId, jdbcType=VARCHAR},
#{appSecret, jdbcType=VARCHAR},
#{createTime, jdbcType=TIMESTAMP}
)
</insert>
<insert id="batchInsert">
INSERT INTO advertising_cpa_product_package (
product_package_id,
product_name,
description,
api_domain,
api_method_create,
api_method_refund,
app_id,
app_secret,
create_time
) VALUES
<foreach collection="list" item="item" separator=",">
(
#{item.productPackageId, jdbcType=VARCHAR},
#{item.productName, jdbcType=VARCHAR},
#{item.description, jdbcType=VARCHAR},
#{item.apiDomain, jdbcType=VARCHAR},
#{item.apiMethodCreate, jdbcType=VARCHAR},
#{item.apiMethodRefund, jdbcType=VARCHAR},
#{item.appId, jdbcType=VARCHAR},
#{item.appSecret, jdbcType=VARCHAR},
#{item.createTime, jdbcType=TIMESTAMP}
)
</foreach>
</insert>
<!--通过主键修改数据-->
<update id="update">
UPDATE advertising_cpa_product_package
<set>
<if test="productPackageId != null and productPackageId != ''">
product_package_id = #{productPackageId},
</if>
<if test="productName != null and productName != ''">
product_name = #{productName},
</if>
<if test="description != null and description != ''">
description = #{description},
</if>
<if test="apiDomain != null and apiDomain != ''">
api_domain = #{apiDomain},
</if>
<if test="apiMethodCreate != null and apiMethodCreate != ''">
api_method_create = #{apiMethodCreate},
</if>
<if test="apiMethodRefund != null and apiMethodRefund != ''">
api_method_refund = #{apiMethodRefund},
</if>
<if test="appId != null and appId != ''">
app_id = #{appId},
</if>
<if test="appSecret != null and appSecret != ''">
app_secret = #{appSecret},
</if>
<if test="createTime != null">
create_time = #{createTime},
</if>
</set>
WHERE id = #{id}
</update>
<!--通过主键删除-->
<delete id="deleteById">
DELETE FROM advertising_cpa_product_package where id = #{id}
</delete>
<select id="getByProductPackageId" resultMap="BaseResultMap">
SELECT
<include refid="Base_Column_List"/>
FROM advertising_cpa_product_package
WHERE product_package_id = #{productPackageId}
</select>
</mapper>
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