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 {
public Binding recoverQrcodeBind() {
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 {
* @param cpaId
* @return
*/
AdvertisingCpaDTO getCPAContentById(Long cpaId);
AdvertisingCpaDTO getCPAContentById(Long cpaId, Integer isWechatUser);
/**
* 分页查询cpa内容
......
......@@ -79,6 +79,8 @@ public interface BmBiz {
*/
Long userSubmit4Cpa(AdvertisingBmRegister bmRegister, Long wechatUserId);
void sendSMS(String phone, Map<String, String> paramMap, String templateCode) throws BizException;
/**
* 微信端获取个人报名详情
* @param adId 应用ID
......
package com.pcloud.book.advertising.biz.impl;
import cn.hutool.core.collection.CollUtil;
import com.pcloud.book.advertising.biz.AdvertisingCpaProductPackageBiz;
import com.pcloud.book.advertising.biz.BmBiz;
import com.pcloud.book.advertising.entity.AdvertisingBmOption;
import com.pcloud.book.advertising.entity.AdvertisingBmOptionItem;
import com.pcloud.book.advertising.entity.AdvertisingCpaPaySetting;
import com.pcloud.book.advertising.dao.AdvertisingCpaPaySettingDao;
import com.pcloud.book.advertising.biz.AdvertisingCpaPaySettingBiz;
import com.pcloud.book.advertising.entity.AdvertisingCpaProductPackage;
import com.pcloud.common.core.aspect.ParamLog;
import com.pcloud.common.page.PageBeanNew;
import com.pcloud.common.page.PageParam;
import com.pcloud.common.exceptions.BizException;
import com.pcloud.common.utils.ListUtils;
import com.pcloud.common.utils.NumberUtil;
import com.pcloud.message.common.enums.YesNoEnums;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.stereotype.Service;
import java.util.*;
import java.util.stream.Collectors;
/**
* (AdvertisingCpaPaySetting)表服务实现类
*
* @author makejava
* @since 2022-11-25 14:20:46
*/
@Service("advertisingCpaPaySettingBiz")
public class AdvertisingCpaPaySettingBizImpl implements AdvertisingCpaPaySettingBiz {
private static final Logger LOGGER = LoggerFactory.getLogger(AdvertisingCpaPaySettingBizImpl.class);
@Autowired
private AdvertisingCpaPaySettingDao advertisingCpaPaySettingDao;
@Autowired
private BmBiz bmBiz;
@Autowired
private AdvertisingCpaProductPackageBiz cpaProductPackageBiz;
@Override
@ParamLog("通过ID查询单条数据")
public AdvertisingCpaPaySetting getById(Long id) {
return advertisingCpaPaySettingDao.getById(id);
}
@Override
@ParamLog("查询多条数据")
public PageBeanNew getList(Integer currentPage, Integer numPerPage) {
PageBeanNew pageBeanNew = advertisingCpaPaySettingDao.listPageNew(new PageParam(currentPage, numPerPage), null, "getList");
List recordList = pageBeanNew.getRecordList();
if (ListUtils.isEmpty(recordList)) {
return pageBeanNew;
}
// 加载其它数据
return pageBeanNew;
}
@Override
@ParamLog("新增")
public Long insert(AdvertisingCpaPaySetting advertisingCpaPaySetting) {
advertisingCpaPaySettingDao.insert(advertisingCpaPaySetting);
return advertisingCpaPaySetting.getId();
}
@Override
@ParamLog("修改")
public void update(AdvertisingCpaPaySetting advertisingCpaPaySetting) {
if (advertisingCpaPaySetting == null || !NumberUtil.isNumber(advertisingCpaPaySetting.getId())) {
throw BizException.PARAM_IS_NULL;
}
advertisingCpaPaySettingDao.update(advertisingCpaPaySetting);
}
@Override
@ParamLog("删除")
public void deleteById(Long id) {
advertisingCpaPaySettingDao.deleteById(id);
}
@Override
public void savePaySettingList(List<AdvertisingCpaPaySetting> cpaPaySettingList, Long cpaId, Integer paySetting) {
if (cpaId == null) {
return;
}
if (Objects.equals(paySetting, YesNoEnums.YES.code) && CollUtil.isEmpty(cpaPaySettingList)) {
throw new BizException(BizException.PARAM_DELETION.getCode(), "请配置付费规则");
}
cpaPaySettingList = Optional.ofNullable(cpaPaySettingList).orElse(CollUtil.toList());
// 查询报名表单
List<AdvertisingBmOption> bmOptionList = bmBiz.getByCPAId(cpaId);
// 只匹配年级学科
Map<String, Long> textMap = bmOptionListConvertToTextMapBy(bmOptionList);
// 默认将 first 定为 "年级", "年龄";second 定为 "学科";(以后如果需要扩展,加一个 firstType,secondType ,然后根据类型处理)
for (AdvertisingCpaPaySetting cpaPaySetting : cpaPaySettingList) {
cpaPaySetting.setCpaId(cpaId);
cpaPaySetting.setFirstOptionItemId(Optional.ofNullable(textMap.get(cpaPaySetting.getFirstOptionItemText())).orElseThrow(() -> new BizException(BizException.PARAM_DELETION.getCode(), "配置支付规则失败,未找到对应的表单字段")));
cpaPaySetting.setSecondOptionItemId(Optional.ofNullable(textMap.get(cpaPaySetting.getSecondOptionItemText())).orElseThrow(() -> new BizException(BizException.PARAM_DELETION.getCode(), "配置支付规则失败,未找到对应的表单字段")));
cpaPaySetting.setCreateTime(new Date());
}
// 删除已有配置
advertisingCpaPaySettingDao.deleteByCpaId(cpaId);
// 保存
if (CollUtil.isNotEmpty(cpaPaySettingList)) {
try {
advertisingCpaPaySettingDao.insert(cpaPaySettingList);
} catch (DuplicateKeyException e) {
throw new BizException(BizException.PARAM_DELETION.getCode(), "同一年级/年龄和学科只能设置一条付费规则");
}
}
}
/**
* 结构转换
* 默认为全部字段不重复
* 目的:没有唯一键id,只能通过 text 拿到 id,然后去保存关系
* 结构:《文本,id》
*/
private Map<String, Long> bmOptionListConvertToTextMapBy(List<AdvertisingBmOption> bmOptionList) {
if (CollUtil.isEmpty(bmOptionList)) {
return new HashMap<>();
}
return bmOptionList.stream()
.filter(x -> CollUtil.toList("年级", "年龄", "学科").contains(x.getItemTitle()))
.flatMap(x -> x.getOptionItem().stream())
.collect(Collectors.toMap(AdvertisingBmOptionItem::getText, AdvertisingBmOptionItem::getId, (v1, v2) -> v1)); // 如果需要 optionId ,那么这里要返回对象,而不只是 getText
}
/**
* 结构(跟上面 bmOptionListConvertToTextMapBy 结果是反的):《Id,文本》
*/
private Map<Long, String> bmOptionListConvertToIdMapBy(List<AdvertisingBmOption> bmOptionList) {
if (CollUtil.isEmpty(bmOptionList)) {
return new HashMap<>();
}
return bmOptionList.stream()
.filter(x -> CollUtil.toList("年级", "年龄", "学科").contains(x.getItemTitle()))
.flatMap(x -> x.getOptionItem().stream())
.collect(Collectors.toMap(AdvertisingBmOptionItem::getId, AdvertisingBmOptionItem::getText, (v1, v2) -> v1)); // 如果需要 optionId ,那么这里要返回对象,而不只是 getText
}
@Override
public List<AdvertisingCpaPaySetting> getByCpaId(Long cpaId, List<AdvertisingBmOption> bmOptionList) {
List<AdvertisingCpaPaySetting> cpaPaySettingList = Optional.ofNullable(advertisingCpaPaySettingDao.getByCpaId(cpaId)).orElse(CollUtil.toList());
if (CollUtil.isEmpty(bmOptionList)) {
bmOptionList = bmBiz.getByCPAId(cpaId);
}
// 只匹配年级学科
Map<Long, String> idMap = bmOptionListConvertToIdMapBy(bmOptionList);
// 默认将 first 定为 "年级", "年龄";second 定为 "学科";(以后如果需要扩展,加一个 firstType,secondType ,然后根据类型处理)
for (AdvertisingCpaPaySetting cpaPaySetting : cpaPaySettingList) {
cpaPaySetting.setFirstOptionItemText(idMap.get(cpaPaySetting.getFirstOptionItemId()));
cpaPaySetting.setSecondOptionItemText(idMap.get(cpaPaySetting.getSecondOptionItemId()));
}
return cpaPaySettingList;
}
@Override
public List<AdvertisingCpaPaySetting> cpaPaySetting4WechatListHandler(List<AdvertisingCpaPaySetting> cpaPaySettingList, Integer isWechatUser) {
if (!YesNoEnums.YES.code.equals(isWechatUser) || CollUtil.isEmpty(cpaPaySettingList)) {
return CollUtil.toList();
}
// 拿到所有的第三方权益包商品信息
Map<String, AdvertisingCpaProductPackage> cpaProductPackageMap = cpaProductPackageBiz.mapAll();
// 用来判断是否加入过第一层级
Map<Long, List<AdvertisingCpaPaySetting>> firstMap = new HashMap<>();
// 最终嵌套结果
List<AdvertisingCpaPaySetting> resultList = CollUtil.toList();
for (AdvertisingCpaPaySetting cpaPaySetting : cpaPaySettingList) {
List<AdvertisingCpaPaySetting> secondCpaPaySettingList = firstMap.get(cpaPaySetting.getFirstOptionItemId());
if (CollUtil.isEmpty(secondCpaPaySettingList)) {
secondCpaPaySettingList = CollUtil.toList();
// 第二层级为空,说明未加入过第一层级;创建第一层级
AdvertisingCpaPaySetting firstCpaPaySetting = new AdvertisingCpaPaySetting();
firstCpaPaySetting.setCpaId(cpaPaySetting.getCpaId());
firstCpaPaySetting.setFirstOptionItemId(cpaPaySetting.getFirstOptionItemId());
firstCpaPaySetting.setFirstOptionItemText(cpaPaySetting.getFirstOptionItemText());
// 设置第二层级
firstCpaPaySetting.setCpaPaySettingList(secondCpaPaySettingList);
resultList.add(firstCpaPaySetting);
// 写入临时变量,用来判断是否加入过第一层级
firstMap.put(firstCpaPaySetting.getFirstOptionItemId(), secondCpaPaySettingList);
}
// 写入第二层级对象
AdvertisingCpaPaySetting secondCpaPaySetting = new AdvertisingCpaPaySetting();
secondCpaPaySetting.setId(cpaPaySetting.getId());
secondCpaPaySetting.setFirstOptionItemId(cpaPaySetting.getFirstOptionItemId());
secondCpaPaySetting.setFirstOptionItemText(cpaPaySetting.getFirstOptionItemText());
secondCpaPaySetting.setSecondOptionItemId(cpaPaySetting.getSecondOptionItemId());
secondCpaPaySetting.setSecondOptionItemText(cpaPaySetting.getSecondOptionItemText());
secondCpaPaySetting.setProductPackageId(cpaPaySetting.getProductPackageId());
secondCpaPaySetting.setPayPrice(cpaPaySetting.getPayPrice());
secondCpaPaySetting.setProductName(cpaProductPackageMap.getOrDefault(cpaPaySetting.getProductPackageId(), new AdvertisingCpaProductPackage()).getProductName());
secondCpaPaySettingList.add(secondCpaPaySetting);
}
return resultList;
}
}
package com.pcloud.book.advertising.biz.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.pcloud.book.advertising.check.QiLiShuSheApiHandler;
import com.pcloud.book.advertising.biz.AdvertisingCpaPaySettingBiz;
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.AdvertisingCpaPaySetting;
import com.pcloud.book.advertising.entity.AdvertisingCpaProductPackage;
import com.pcloud.book.advertising.dao.AdvertisingCpaProductPackageDao;
import com.pcloud.book.advertising.biz.AdvertisingCpaProductPackageBiz;
import com.pcloud.common.core.aspect.ParamLog;
import com.pcloud.common.page.PageBeanNew;
import com.pcloud.common.page.PageParam;
import com.pcloud.common.exceptions.BizException;
import com.pcloud.common.utils.ListUtils;
import com.pcloud.common.utils.NumberUtil;
import com.pcloud.exercisebook.dto.RefundExerciseBookDTO;
import com.pcloud.facade.tradecenter.dto.ExerciseBookPayDTO;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* (AdvertisingCpaProductPackage)表服务实现类
*
* @author makejava
* @since 2022-11-29 18:12:15
*/
@Slf4j
@Service("advertisingCpaProductPackageBiz")
public class AdvertisingCpaProductPackageBizImpl implements AdvertisingCpaProductPackageBiz {
private static final Logger LOGGER = LoggerFactory.getLogger(AdvertisingCpaProductPackageBizImpl.class);
@Autowired
private AdvertisingCpaProductPackageDao advertisingCpaProductPackageDao;
@Autowired
private BmRegisterDao bmRegisterDao;
@Autowired
private AdvertisingCpaPaySettingBiz cpaPaySettingBiz;
@Autowired
private BmOptionDao bmOptionDao;
@Autowired
private BmRegisterItemDao bmRegisterItemDao;
@Override
@ParamLog("通过ID查询单条数据")
public AdvertisingCpaProductPackage getById(Long id) {
return advertisingCpaProductPackageDao.getById(id);
}
@Override
@ParamLog("查询多条数据")
public PageBeanNew getList(Integer currentPage, Integer numPerPage) {
PageBeanNew pageBeanNew = advertisingCpaProductPackageDao.listPageNew(new PageParam(currentPage, numPerPage), null, "getList");
List recordList = pageBeanNew.getRecordList();
if (ListUtils.isEmpty(recordList)){
return pageBeanNew;
}
// 加载其它数据
return pageBeanNew;
}
@Override
@ParamLog("新增")
public Long insert(AdvertisingCpaProductPackage advertisingCpaProductPackage) {
advertisingCpaProductPackageDao.insert(advertisingCpaProductPackage);
return advertisingCpaProductPackage.getId();
}
@Override
@ParamLog("修改")
public void update(AdvertisingCpaProductPackage advertisingCpaProductPackage) {
if(advertisingCpaProductPackage == null || !NumberUtil.isNumber(advertisingCpaProductPackage.getId())){
throw BizException.PARAM_IS_NULL;
}
advertisingCpaProductPackageDao.update(advertisingCpaProductPackage);
}
@Override
@ParamLog("删除")
public void deleteById(Long id) {
advertisingCpaProductPackageDao.deleteById(id);
}
@Override
public Map<String, AdvertisingCpaProductPackage> mapAll () {
return Optional.ofNullable(advertisingCpaProductPackageDao.listBy(null))
.orElse(CollUtil.toList())
.stream().collect(Collectors.toMap(x -> x.getProductPackageId(), Function.identity()));
}
public void handlerCreateProductPackage(ExerciseBookPayDTO payDTO) {
if (StrUtil.isBlank(payDTO.getSnapshotParam())) {
log.warn("无法同步订单信息到第三方;payDTO:{}", JSONUtil.toJsonStr(payDTO));
return;
}
// 拿到用户的注册信息
AdvertisingBmRegister bmRegister = bmRegisterDao.getById(payDTO.getBuyId());
// 配置的支付权益信息
AdvertisingCpaPaySetting cpaPaySetting = cpaPaySettingBiz.getById(bmRegister.getCpaPaySettingId());
if (cpaPaySetting == null) {
log.warn("cpaPaySetting 为空,无法同步订单数据;payDTO:{}", JSONUtil.toJsonStr(payDTO));
return;
}
// 根据 权益包id 拿到第三方接口
AdvertisingCpaProductPackage cpaProductPackage = advertisingCpaProductPackageDao.getByProductPackageId(cpaPaySetting.getProductPackageId());
if (cpaProductPackage == null) {
log.warn("cpaProductPackage 为空,无法同步订单数据;payDTO:{}", JSONUtil.toJsonStr(payDTO));
return;
}
// 拿到用户手机
/*Long mobilePhoneOptionId = bmOptionDao.getMobilePhoneOptionIdByCPA(bmRegister.getCpaId());
String mobile = bmRegisterItemDao.getRegisterOptionValue(payDTO.getWechatUserId(), bmRegister.getId(), mobilePhoneOptionId);*/
if (StrUtil.isBlank(payDTO.getPhoneNumber())) {
log.error("未找到手机号,无法同步订单数据;payDTO:{}", JSONUtil.toJsonStr(payDTO));
return;
}
// 请求参数
HashMap<String, Object> bodyMap = new HashMap<String, Object>() {{
put("productPackageId", cpaProductPackage.getProductPackageId());
put("mobile", payDTO.getPhoneNumber());
put("orderId", payDTO.getOrderMainNum());
put("payPrice", payDTO.getMoney().multiply(BigDecimal.valueOf(100)).intValue());
}};
QiLiShuSheApiHandler apiHandler = new QiLiShuSheApiHandler(cpaProductPackage.getAppId(), cpaProductPackage.getAppSecret(), cpaProductPackage.getApiDomain());
boolean result = apiHandler.post(cpaProductPackage.getApiMethodCreate(), bodyMap);
}
@Override
public void handlerRefundProductPackage(RefundExerciseBookDTO refundDTO) {
// 拿到用户的注册信息
AdvertisingBmRegister bmRegister = bmRegisterDao.getById(refundDTO.getBuyId());
// 配置的支付权益信息
AdvertisingCpaPaySetting cpaPaySetting = cpaPaySettingBiz.getById(bmRegister.getCpaPaySettingId());
if (cpaPaySetting == null) {
log.warn("cpaPaySetting 为空,无法同步退款订单数据;refundDTO:{}", JSONUtil.toJsonStr(refundDTO));
return;
}
// 根据 权益包id 拿到第三方接口
AdvertisingCpaProductPackage cpaProductPackage = advertisingCpaProductPackageDao.getByProductPackageId(cpaPaySetting.getProductPackageId());
if (cpaProductPackage == null) {
log.warn("cpaProductPackage 为空,无法同步退款订单数据;payDTO:{}", JSONUtil.toJsonStr(refundDTO));
return;
}
// 拿到用户手机
Long mobilePhoneOptionId = bmOptionDao.getMobilePhoneOptionIdByCPA(bmRegister.getCpaId());
String mobile = bmRegisterItemDao.getRegisterOptionValue(refundDTO.getWechatUserId(), bmRegister.getId(), mobilePhoneOptionId);
if (StrUtil.isBlank(mobile)) {
log.error("未找到手机号,无法同步退款订单数据;payDTO:{}", JSONUtil.toJsonStr(refundDTO));
return;
}
// 请求参数
HashMap<String, Object> bodyMap = new HashMap<String, Object>() {{
put("productPackageId", cpaProductPackage.getProductPackageId());
put("mobile", mobile);
put("orderId", refundDTO.getOrderMainNum());
put("refundPrice", refundDTO.getRefundFee().multiply(BigDecimal.valueOf(100)).intValue());
}};
QiLiShuSheApiHandler apiHandler = new QiLiShuSheApiHandler(cpaProductPackage.getAppId(), cpaProductPackage.getAppSecret(), cpaProductPackage.getApiDomain());
boolean result = apiHandler.post(cpaProductPackage.getApiMethodRefund(), bodyMap);
}
public void testQiLiOrder() {
String productPackageId = "6368e407e6850b26cb86a7d9";
// 根据 权益包id 拿到第三方接口
AdvertisingCpaProductPackage cpaProductPackage = advertisingCpaProductPackageDao.getByProductPackageId(productPackageId);
if (cpaProductPackage == null) {
log.warn("cpaProductPackage 为空,无法同步订单数据;payDTO:{}", productPackageId);
return;
}
// 请求参数
HashMap<String, Object> bodyMap = new HashMap<String, Object>() {{
put("productPackageId", productPackageId);
put("mobile", "18616941348");
put("orderId", "2022113010001");
put("payPrice", 1);
}};
QiLiShuSheApiHandler apiHandler = new QiLiShuSheApiHandler(cpaProductPackage.getAppId(), cpaProductPackage.getAppSecret(), cpaProductPackage.getApiDomain());
boolean result = apiHandler.post(cpaProductPackage.getApiMethodCreate(), bodyMap);
}
public void testQiLiRefundOrder() {
String productPackageId = "6368e407e6850b26cb86a7d9";
// 根据 权益包id 拿到第三方接口
AdvertisingCpaProductPackage cpaProductPackage = advertisingCpaProductPackageDao.getByProductPackageId(productPackageId);
if (cpaProductPackage == null) {
log.warn("cpaProductPackage 为空,无法同步订单数据;payDTO:{}", productPackageId);
return;
}
// 请求参数
HashMap<String, Object> bodyMap = new HashMap<String, Object>() {{
put("productPackageId", productPackageId);
put("mobile", "18616941345");
put("orderId", "100000");
put("refundPrice", 1);
}};
QiLiShuSheApiHandler apiHandler = new QiLiShuSheApiHandler(cpaProductPackage.getAppId(), cpaProductPackage.getAppSecret(), cpaProductPackage.getApiDomain());
boolean result = apiHandler.post(cpaProductPackage.getApiMethodRefund(), bodyMap);
}
}
......@@ -3,6 +3,7 @@ package com.pcloud.book.advertising.biz.impl;
import com.alibaba.fastjson.JSON;
import com.pcloud.appcenter.app.dto.AppTypeDto;
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.BmBiz;
import com.pcloud.book.advertising.check.AdvertisingCheck;
......@@ -41,6 +42,7 @@ import com.pcloud.book.advertising.entity.AdvertisingAgentPermission;
import com.pcloud.book.advertising.entity.AdvertisingBrowseRecord;
import com.pcloud.book.advertising.entity.AdvertisingClickRecord;
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.AdvertisingDistributionBook;
import com.pcloud.book.advertising.entity.AdvertisingExposureRecord;
......@@ -227,6 +229,8 @@ public class AdvertisingSpaceBizImpl implements AdvertisingSpaceBiz {
@Autowired
private BmBiz bmBiz;
@Autowired
private AdvertisingCpaPaySettingBiz cpaPaySettingBiz;
@Autowired
private AdvertisingPilotRecordDao advertisingPilotRecordDao;
@Autowired
private AdvertisingBrowseRecordDao advertisingBrowseRecordDao;
......@@ -3219,6 +3223,8 @@ public class AdvertisingSpaceBizImpl implements AdvertisingSpaceBiz {
advertisingCpa = equipCPA(advertisingCpa);
//广告详情,报名表单选项新增
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()))) {
addAdvertisingDetailFile(cpaId, advertisingCpa.getAdvertisingDetailFileList());
......@@ -3255,6 +3261,8 @@ public class AdvertisingSpaceBizImpl implements AdvertisingSpaceBiz {
Long cpaId = advertisingCpa.getId();
//广告详情,报名表单选项新增
bmBiz.addOptionList(advertisingCpa.getAdvertisingBmOptionList(), cpaId);
// 配置付费规则
cpaPaySettingBiz.savePaySettingList(advertisingCpa.getAdvertisingCpaPaySettingList(), cpaId, advertisingCpa.getPaySetting());
//音视频保存
detailFileDao.deleteByCPAId(cpaId);
if (!(AdDetailModeEnum.IMG_TEXT.code.equals(advertisingCpa.getDetailMode()) || AdDetailModeEnum.DEDICATED_LINK.code.equals(advertisingCpa.getDetailMode()))) {
......@@ -3284,7 +3292,7 @@ public class AdvertisingSpaceBizImpl implements AdvertisingSpaceBiz {
}
@Override
public AdvertisingCpaDTO getCPAContentById(Long cpaId) {
public AdvertisingCpaDTO getCPAContentById(Long cpaId, Integer isWechatUser) {
AdvertisingCpaDTO cpaDTO = new AdvertisingCpaDTO();
AdvertisingCpa advertisingCpaDTO = advertisingCpaDao.getById(cpaId);
if (null == advertisingCpaDTO) {
......@@ -3307,6 +3315,10 @@ public class AdvertisingSpaceBizImpl implements AdvertisingSpaceBiz {
BeanUtils.copyProperties(advertisingCpaDTO, cpaDTO);
//填充报名表单,多个上传文件
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);
if (!ListUtils.isEmpty(fileList)) {
cpaDTO.setAdvertisingDetailFileList(fileList);
......
package com.pcloud.book.advertising.biz.impl;
import cn.hutool.core.util.ObjectUtil;
import com.pcloud.appcenter.base.exception.AppBizException;
import com.pcloud.book.advertising.biz.BmBiz;
import com.pcloud.book.advertising.dao.AdvertisingCpaDao;
......@@ -330,15 +331,24 @@ public class BmBizImpl implements BmBiz {
throw new BookBizException(BookBizException.PARAM_IS_ERROR, "请填写表单");
}
String phoneNum=null;
Long mobilePhoneOptionId = bmOptionDao.getMobilePhoneOptionIdByCPA(cpaId);
Optional<AdvertisingBmRegisterItem> itemOptional = items.stream().filter(s -> s != null && s.getOptionId().equals(mobilePhoneOptionId)).findFirst();
if (itemOptional.isPresent()) {// 存在
AdvertisingBmRegisterItem registerItem = itemOptional.get();
if (null != registerItem && !StringUtil.isEmpty(registerItem.getOptionValue())) {
phoneNum=registerItem.getOptionValue();
Integer count = bmRegisterItemDao.checkMobilePhone4Cpa(cpaId, bmRegister.getFromType(), bmRegister.getFromId(), registerItem.getOptionValue());
if (count > 0) {
throw new BookBizException(BookBizException.PARAM_IS_ERROR, "手机号已存在");
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);
Optional<AdvertisingBmRegisterItem> itemOptional = items.stream().filter(s -> s != null && s.getOptionId().equals(mobilePhoneOptionId)).findFirst();
if (itemOptional.isPresent()) {// 存在
AdvertisingBmRegisterItem registerItem = itemOptional.get();
if (null != registerItem && !StringUtil.isEmpty(registerItem.getOptionValue())) {
phoneNum=registerItem.getOptionValue();
Integer count = bmRegisterItemDao.checkMobilePhone4Cpa(cpaId, bmRegister.getFromType(), bmRegister.getFromId(), registerItem.getOptionValue());
if (count > 0) {
throw new BookBizException(BookBizException.PARAM_IS_ERROR, "手机号已存在");
}
}
}
}
......@@ -353,7 +363,7 @@ public class BmBizImpl implements BmBiz {
// 报名成功发送短信
//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);
}
return registerId;
......
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.AdvertisingDetailFile;
import com.pcloud.book.advertising.entity.AdvertisingSpace;
......@@ -11,6 +12,7 @@ import com.pcloud.book.advertising.enums.SettlementMethodEnum;
import com.pcloud.book.base.exception.BookBizException;
import com.pcloud.common.utils.ListUtils;
import com.pcloud.common.utils.string.StringUtil;
import com.pcloud.message.common.enums.YesNoEnums;
import org.apache.commons.lang3.ArrayUtils;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
......@@ -72,7 +74,7 @@ public class AdvertisingCheck {
// throw new BookBizException(BookBizException.PARAM_IS_ERROR, "优惠展示图不能为空!");
// }
//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())) {
throw new BookBizException(BookBizException.PARAM_IS_ERROR, "封面不能为空!");
}
......@@ -120,6 +122,9 @@ public class AdvertisingCheck {
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> {
public Long getRegisterCountByBookId(Long bookId, Long adviserId, Long channelId, Long adId, 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> {
Integer checkMobilePhone(Long adId, 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
map.put("statisMonth", statisMonth);
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
map.put("optionValue", optionValue);
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;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.pcloud.book.advertising.entity.AdvertisingBmOption;
import com.pcloud.book.advertising.entity.AdvertisingCpaPaySetting;
import com.pcloud.book.advertising.entity.AdvertisingDetailFile;
import com.pcloud.common.dto.BaseDto;
......@@ -168,6 +169,11 @@ public class AdvertisingCpaDTO extends BaseDto {
private Integer successEmail;
/**
* 成功后发送的内容(短信模板)
*/
private String successSendCode;
/**
* 跳转类型,1-统一跳转,2-自定义跳转
*/
private Integer jumpStyle;
......@@ -196,6 +202,53 @@ public class AdvertisingCpaDTO extends BaseDto {
*/
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() {
return videoCover;
}
......
......@@ -95,6 +95,55 @@ public class AdvertisingBmRegister extends BaseEntity{
*/
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() {
return cpaId;
}
......
......@@ -133,6 +133,11 @@ public class AdvertisingCpa extends BaseEntity{
private Integer successEmail;
/**
* 成功后发送的内容(短信模板)
*/
private String successSendCode;
/**
* 跳转类型,1-统一跳转,2-自定义跳转
*/
private Integer jumpStyle;
......@@ -154,6 +159,41 @@ public class AdvertisingCpa extends BaseEntity{
*/
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() {
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;
import com.pcloud.book.advertising.biz.AdvertisingCpaProductPackageBiz;
import com.pcloud.book.advertising.biz.LinkRevertBiz;
import com.pcloud.book.advertising.dto.LinkRevertRecordDTO;
import com.pcloud.book.advertising.entity.AdvertisingLinkClick;
......@@ -44,6 +45,8 @@ public class LinkRevertFacade {
@Autowired
private LinkRevertBiz linkRevertBiz;
@Autowired
private AdvertisingCpaProductPackageBiz packageBiz;
@ApiOperation(value = "添加链接转换记录", httpMethod = "POST")
@PostMapping("addRevertRecord")
......@@ -167,4 +170,13 @@ public class LinkRevertFacade {
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;
import com.pcloud.common.utils.SessionUtil;
import com.pcloud.common.utils.cookie.Cookie;
import com.pcloud.common.utils.string.StringUtil;
import com.pcloud.message.common.enums.YesNoEnums;
import com.pcloud.wechatgroup.message.enums.IsSystem;
import org.codehaus.jackson.JsonParseException;
......@@ -1134,7 +1135,7 @@ public class AdvertisingSpaceFacadeImpl implements AdvertisingSpaceFacade {
throw new BookBizException(BookBizException.PARAM_IS_NULL, "参数有误!");
}
SessionUtil.getToken4Redis(token);
AdvertisingCpaDTO dto = advertisingSpaceBiz.getCPAContentById(cpaId);
AdvertisingCpaDTO dto = advertisingSpaceBiz.getCPAContentById(cpaId, YesNoEnums.NO.code);
return new ResponseDto<>(dto);
}
......@@ -1192,7 +1193,7 @@ public class AdvertisingSpaceFacadeImpl implements AdvertisingSpaceFacade {
if (null == cpaId) {
throw new BookBizException(BookBizException.PARAM_IS_NULL, "参数有误!");
}
AdvertisingCpaDTO dto = advertisingSpaceBiz.getCPAContentById(cpaId);
AdvertisingCpaDTO dto = advertisingSpaceBiz.getCPAContentById(cpaId, YesNoEnums.YES.code);
return new ResponseDto<>(dto);
}
......
......@@ -557,6 +557,19 @@ public class ReaderConsr {
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 {
* 二维码恢复
*/
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
......@@ -79,5 +79,13 @@
AND o.item_title = '手机号'
AND i.option_value = #{optionValue}
</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>
\ No newline at end of file
......@@ -19,6 +19,10 @@
<result column="create_day" property="createDay" jdbcType="DATE"/>
<result column="create_month" property="createMonth" jdbcType="VARCHAR"/>
<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>
<!-- 微信端用户详细信息 -->
......@@ -37,9 +41,15 @@
<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,
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>
<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 INTO advertising_bm_register (
user_id,
......@@ -57,7 +67,11 @@
book_id,
create_day,
create_month,
cpa_id
cpa_id,
cpa_pay_setting_id,
order_num,
pay_status,
phone_number
)
VALUES
(
......@@ -76,7 +90,11 @@
#{bookId,jdbcType=BIGINT},
NOW(),
DATE_FORMAT(NOW(), '%Y-%m'),
#{cpaId}
#{cpaId},
#{cpaPaySettingId},
#{orderNum},
#{payStatus},
#{phoneNumber}
)
</insert>
......@@ -222,4 +240,33 @@
ORDER BY create_time DESC
</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>
\ No newline at end of file
......@@ -27,6 +27,7 @@
<result column="bottom_button_image" property="bottomButtonImage" jdbcType="VARCHAR" />
<result column="privacy_agreement" property="privacyAgreement" 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="create_user" property="createUser" jdbcType="BIGINT" />
<result column="update_user" property="updateUser" jdbcType="BIGINT" />
......@@ -35,6 +36,7 @@
<result column="file_convert_state" property="fileConvertState" jdbcType="INTEGER" />
<result column="cover_video_file_name" property="coverVideoFileName" jdbcType="VARCHAR" />
<result column="video_cover" property="videoCover" jdbcType="VARCHAR" />
<result column="pay_setting" property="paySetting" jdbcType="INTEGER" />
</resultMap>
<resultMap id="AdvertisingCpaDTO" type="com.pcloud.book.advertising.dto.AdvertisingCpaDTO">
......@@ -62,6 +64,7 @@
<result column="bottom_button_image" property="bottomButtonImage" jdbcType="VARCHAR" />
<result column="privacy_agreement" property="privacyAgreement" 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="create_user" property="createUser" jdbcType="BIGINT" />
<result column="update_user" property="updateUser" jdbcType="BIGINT" />
......@@ -70,14 +73,15 @@
<result column="file_convert_state" property="fileConvertState" jdbcType="INTEGER" />
<result column="cover_video_file_name" property="coverVideoFileName" jdbcType="VARCHAR" />
<result column="video_cover" property="videoCover" jdbcType="VARCHAR" />
<result column="pay_setting" property="paySetting" jdbcType="INTEGER" />
</resultMap>
<sql id="Base_Column_List" >
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
,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
,head_picture,cover_video_file_id,file_convert_state,cover_video_file_name,video_cover
,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,pay_setting
</sql>
<select id="getById" resultMap="BaseResultMap" parameterType="java.lang.Long" >
......@@ -97,16 +101,16 @@
form_remark, 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
,commit_button_image,bottom_button_type,bottom_button_content,bottom_button_image,privacy_agreement,success_email,jump_style
,create_user,update_user,head_picture,cover_video_file_id,file_convert_state,cover_video_file_name,video_cover
,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,pay_setting
)
values (#{detailName,jdbcType=VARCHAR}, #{detailMode,jdbcType=VARCHAR},
#{coverPic,jdbcType=VARCHAR}, #{welfarePic,jdbcType=VARCHAR}, #{formMobileCheck,jdbcType=BIT},
#{formRemark,jdbcType=VARCHAR}, #{formButton,jdbcType=VARCHAR}, #{formLink,jdbcType=VARCHAR},
NOW(), NOW(), #{detailInfo,jdbcType=LONGVARCHAR}, #{previewLink,jdbcType=VARCHAR}
,#{coverVideo},#{bgColor},#{successToastType},#{successToastContent},#{commitButtonType},#{commitButtonContent},#{commitButtonImage}
,#{bottomButtonType},#{bottomButtonContent},#{bottomButtonImage},#{privacyAgreement},#{successEmail},#{jumpStyle},#{createUser},#{updateUser},#{headPicture}
,#{coverVideoFileId},#{fileConvertState},#{coverVideoFileName},#{videoCover}
,#{bottomButtonType},#{bottomButtonContent},#{bottomButtonImage},#{privacyAgreement},#{successEmail},#{successSendCode},#{jumpStyle},#{createUser},#{updateUser},#{headPicture}
,#{coverVideoFileId},#{fileConvertState},#{coverVideoFileName},#{videoCover},#{paySetting}
)
</insert>
......@@ -180,6 +184,9 @@
<if test="successEmail != null">
success_email = #{successEmail},
</if>
<if test="successSendCode != null">
success_send_code = #{successSendCode},
</if>
<if test="jumpStyle != null">
jump_style = #{jumpStyle},
</if>
......@@ -204,6 +211,9 @@
<if test="videoCover != null">
video_cover = #{videoCover},
</if>
<if test="paySetting != null">
pay_setting = #{paySetting},
</if>
</set>
where id = #{id,jdbcType=BIGINT}
</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