Просмотр исходного кода

businessCircle

release_toaliyun_real
xhxu 5 лет назад
Родитель
Сommit
3ed0099c06
13 измененных файлов: 505 добавлений и 346 удалений
  1. +1
    -0
      mallinkPublicApi/src/main/java/com/iformall/controller/UserThirdCircleOrderController.java
  2. +1
    -0
      mallinkService/src/main/java/com/iformall/mapper/AliBusinessCircleOrderMapper.java
  3. +1
    -0
      mallinkService/src/main/java/com/iformall/mapper/WxBusinessCircleOrderMapper.java
  4. +1
    -0
      mallinkService/src/main/java/com/iformall/mapper/WxThirdPartyOrdersMapper.java
  5. +1
    -0
      mallinkService/src/main/java/com/iformall/service/AliBusinessCircleOrderService.java
  6. +1
    -1
      mallinkService/src/main/java/com/iformall/service/WxBusinessCircleOrderService.java
  7. +1
    -1
      mallinkService/src/main/java/com/iformall/service/WxThirdPartyOrdersService.java
  8. +90
    -78
      mallinkService/src/main/java/com/iformall/service/impl/AliBusinessCircleOrderServiceImpl.java
  9. +163
    -114
      mallinkService/src/main/java/com/iformall/service/impl/WxBusinessCircleOrderServiceImpl.java
  10. +218
    -152
      mallinkService/src/main/java/com/iformall/service/impl/WxThirdPartyOrdersServiceImpl.java
  11. +9
    -0
      mallinkService/src/main/resources/mapper/AliBusinessCircleOrderMapper.xml
  12. +9
    -0
      mallinkService/src/main/resources/mapper/WxBusinessCircleOrderMapper.xml
  13. +9
    -0
      mallinkService/src/main/resources/mapper/WxThirdPartyOrdersMapper.xml

+ 1
- 0
mallinkPublicApi/src/main/java/com/iformall/controller/UserThirdCircleOrderController.java Просмотреть файл

@@ -90,6 +90,7 @@ public class UserThirdCircleOrderController extends BaseController {
thirdPartyOrders.setUserPhone(userPhone); thirdPartyOrders.setUserPhone(userPhone);
thirdPartyOrders.setTimeEnd(timeEndDate); thirdPartyOrders.setTimeEnd(timeEndDate);
thirdPartyOrders.setAmount(amount); thirdPartyOrders.setAmount(amount);
thirdPartyOrders.setPayAmount(amount);
thirdPartyOrders.setSummary(summary); thirdPartyOrders.setSummary(summary);
try{ try{
thirdPartyOrdersService.createOrder(thirdPartyOrders); thirdPartyOrdersService.createOrder(thirdPartyOrders);


+ 1
- 0
mallinkService/src/main/java/com/iformall/mapper/AliBusinessCircleOrderMapper.java Просмотреть файл

@@ -14,6 +14,7 @@ public interface AliBusinessCircleOrderMapper extends CommonMapper<AliBusinessCi
AliBusinessCircleOrder getById(AliBusinessCircleOrder record); AliBusinessCircleOrder getById(AliBusinessCircleOrder record);


AliBusinessCircleOrder getOrderByTransactionId(AliBusinessCircleOrder record); AliBusinessCircleOrder getOrderByTransactionId(AliBusinessCircleOrder record);
AliBusinessCircleOrder getRefundOrderByRefundId(AliBusinessCircleOrder record);
List<AliBusinessCircleOrder> getRefundOrderByTransactionId(AliBusinessCircleOrder record); List<AliBusinessCircleOrder> getRefundOrderByTransactionId(AliBusinessCircleOrder record);


/** /**


+ 1
- 0
mallinkService/src/main/java/com/iformall/mapper/WxBusinessCircleOrderMapper.java Просмотреть файл

@@ -12,6 +12,7 @@ public interface WxBusinessCircleOrderMapper extends CommonMapper<WxBusinessCirc
WxBusinessCircleOrder getById(WxBusinessCircleOrder record); WxBusinessCircleOrder getById(WxBusinessCircleOrder record);


WxBusinessCircleOrder getOrderByTransactionId(WxBusinessCircleOrder record); WxBusinessCircleOrder getOrderByTransactionId(WxBusinessCircleOrder record);
WxBusinessCircleOrder getRefundOrderByRefundId(WxBusinessCircleOrder record);
List<WxBusinessCircleOrder> getRefundOrderByTransactionId(WxBusinessCircleOrder record); List<WxBusinessCircleOrder> getRefundOrderByTransactionId(WxBusinessCircleOrder record);


/** /**


+ 1
- 0
mallinkService/src/main/java/com/iformall/mapper/WxThirdPartyOrdersMapper.java Просмотреть файл

@@ -14,6 +14,7 @@ public interface WxThirdPartyOrdersMapper extends CommonMapper<WxThirdPartyOrder
WxThirdPartyOrders getById(WxThirdPartyOrders record); WxThirdPartyOrders getById(WxThirdPartyOrders record);


WxThirdPartyOrders getOrderByTransactionId(WxThirdPartyOrders record); WxThirdPartyOrders getOrderByTransactionId(WxThirdPartyOrders record);
WxThirdPartyOrders getRefundOrderByRefundId(WxThirdPartyOrders record);
List<WxThirdPartyOrders> getRefundOrderByTransactionId(WxThirdPartyOrders record); List<WxThirdPartyOrders> getRefundOrderByTransactionId(WxThirdPartyOrders record);


/** /**


+ 1
- 0
mallinkService/src/main/java/com/iformall/service/AliBusinessCircleOrderService.java Просмотреть файл

@@ -31,6 +31,7 @@ public interface AliBusinessCircleOrderService {
* @return * @return
*/ */
AliBusinessCircleOrder getOrderByTransactionId(String transactionId, String tenantId); AliBusinessCircleOrder getOrderByTransactionId(String transactionId, String tenantId);
AliBusinessCircleOrder getRefundOrderByRefundId(String refundId, String tenantId);
List<AliBusinessCircleOrder> getRefundOrderByTransactionId(String transactionId, String tenantId); List<AliBusinessCircleOrder> getRefundOrderByTransactionId(String transactionId, String tenantId);






+ 1
- 1
mallinkService/src/main/java/com/iformall/service/WxBusinessCircleOrderService.java Просмотреть файл

@@ -2,7 +2,6 @@ package com.iformall.service;


import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import com.iformall.domain.po.WxBusinessCircleOrder; import com.iformall.domain.po.WxBusinessCircleOrder;
import org.springframework.scheduling.annotation.Async;


import java.util.List; import java.util.List;


@@ -32,6 +31,7 @@ public interface WxBusinessCircleOrderService {
* @return * @return
*/ */
WxBusinessCircleOrder getOrderByTransactionId(String transactionId, String tenantId); WxBusinessCircleOrder getOrderByTransactionId(String transactionId, String tenantId);
WxBusinessCircleOrder getRefundOrderByRefundId(String refundId, String tenantId);
List<WxBusinessCircleOrder> getRefundOrderByTransactionId(String transactionId, String tenantId); List<WxBusinessCircleOrder> getRefundOrderByTransactionId(String transactionId, String tenantId);


void createOrder(WxBusinessCircleOrder record); void createOrder(WxBusinessCircleOrder record);


+ 1
- 1
mallinkService/src/main/java/com/iformall/service/WxThirdPartyOrdersService.java Просмотреть файл

@@ -1,7 +1,6 @@
package com.iformall.service; package com.iformall.service;


import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import com.iformall.domain.po.WxBusinessCircleOrder;
import com.iformall.domain.po.WxThirdPartyOrders; import com.iformall.domain.po.WxThirdPartyOrders;
import com.iformall.enums.EnumThirdOrderType; import com.iformall.enums.EnumThirdOrderType;


@@ -33,6 +32,7 @@ public interface WxThirdPartyOrdersService {
* @return * @return
*/ */
WxThirdPartyOrders getOrderByTransactionId(EnumThirdOrderType orderType, String transactionId, String tenantId); WxThirdPartyOrders getOrderByTransactionId(EnumThirdOrderType orderType, String transactionId, String tenantId);
WxThirdPartyOrders getRefundOrderByRefundId(String refundId, String tenantId);
List<WxThirdPartyOrders> getRefundOrderByTransactionId(EnumThirdOrderType orderType, String transactionId, String tenantId); List<WxThirdPartyOrders> getRefundOrderByTransactionId(EnumThirdOrderType orderType, String transactionId, String tenantId);






+ 90
- 78
mallinkService/src/main/java/com/iformall/service/impl/AliBusinessCircleOrderServiceImpl.java Просмотреть файл

@@ -1,13 +1,10 @@
package com.iformall.service.impl; package com.iformall.service.impl;


import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import com.iformall.common.ErrorCode;
import com.iformall.common.IdWorker; import com.iformall.common.IdWorker;
import com.iformall.domain.po.*; import com.iformall.domain.po.*;
import com.iformall.enums.*; import com.iformall.enums.*;
import com.iformall.exception.MallinkException;
import com.iformall.mapper.AliBusinessCircleOrderMapper; import com.iformall.mapper.AliBusinessCircleOrderMapper;
import com.iformall.service.*; import com.iformall.service.*;
import com.iformall.utils.RedisLock; import com.iformall.utils.RedisLock;
@@ -68,6 +65,14 @@ public class AliBusinessCircleOrderServiceImpl implements AliBusinessCircleOrder
return aliBusinessCircleOrderMapper.getOrderByTransactionId(recordQ); return aliBusinessCircleOrderMapper.getOrderByTransactionId(recordQ);
} }


@Override
public AliBusinessCircleOrder getRefundOrderByRefundId(String refundId, String tenantId) {
AliBusinessCircleOrder recordQ = new AliBusinessCircleOrder();
recordQ.setRefundId(refundId);
recordQ.setTenantId(tenantId);
return aliBusinessCircleOrderMapper.getRefundOrderByRefundId(recordQ);
}

@Override @Override
public List<AliBusinessCircleOrder> getRefundOrderByTransactionId(String transactionId, String tenantId) { public List<AliBusinessCircleOrder> getRefundOrderByTransactionId(String transactionId, String tenantId) {
AliBusinessCircleOrder recordQ = new AliBusinessCircleOrder(); AliBusinessCircleOrder recordQ = new AliBusinessCircleOrder();
@@ -165,89 +170,96 @@ public class AliBusinessCircleOrderServiceImpl implements AliBusinessCircleOrder


@Override @Override
public void insertRefundNoticeOrder(AliBusinessCircleOrder record) { public void insertRefundNoticeOrder(AliBusinessCircleOrder record) {
String lockKey = StringUtils.join(ALI_CIRCLE_KEY,record.getTransactionId(), ":",EnumYesOrNo.NO.getCode(),":","lock");
long time = System.currentTimeMillis() + 2000;
String timeStr = String.valueOf(time);
if (redisLock.lock2(lockKey, timeStr)) {
AliBusinessCircleOrder order = this.getOrderByTransactionId(record.getTransactionId(),record.getTenantId());
if(order == null){
logger.error("--Ali商圈退款--付款消息未找到--transactionId="+record.getTransactionId());
}else{
List<AliBusinessCircleOrder> refundOrders = this.getRefundOrderByTransactionId(record.getTransactionId(),record.getTenantId());
Integer amount = order.getPayAmount();
Integer increasedPoints = order.getIncreasedPoints();
Integer refundAmount = 0;
Integer refundIncreasedPoints = 0;

if(refundOrders != null && refundOrders.size()>0){
for (AliBusinessCircleOrder ro:refundOrders) {
refundAmount += ro.getRefundAmount();
refundIncreasedPoints += ro.getIncreasedPoints();
}
}
if(refundAmount >= amount){
logger.error("--Ali商圈退款--已经退款--transactionId="+record.getTransactionId());
}else if((refundAmount + record.getRefundAmount()) > amount ){
logger.error("--Ali商圈退款--退款金额超限--transactionId="+record.getTransactionId());
AliBusinessCircleOrder order = this.getOrderByTransactionId(record.getTransactionId(),record.getTenantId());
if(order == null){
logger.error("--Ali商圈退款--付款消息未找到--transactionId="+record.getTransactionId());
}else{
String lockKey = StringUtils.join(ALI_CIRCLE_KEY,record.getRefundId(), ":",EnumYesOrNo.YES.getCode(),":","lock");
long time = System.currentTimeMillis() + 2000;
String timeStr = String.valueOf(time);
if (redisLock.lock2(lockKey, timeStr)) {
AliBusinessCircleOrder refundOrder = this.getRefundOrderByRefundId(record.getRefundId(),record.getTenantId());
if(refundOrder != null){
logger.error("--Ali商圈退款--退款消息已存在---RefundId="+record.getRefundId());
}else{ }else{
Date now = new Date();
final IdWorker idWorker = IdWorker.get();
record.setId(idWorker.nextId());
record.setCreateTime(now);
record.setUpdateTime(now);

record.setCUserId(order.getCUserId());
record.setMerchantId(order.getMerchantId());
aliBusinessCircleOrderMapper.insertRefundNoticeOrder(record);

if(order.getEarnPoints().equals(EnumYesOrNo.YES.getCode())){
WxCreditHistory creditHistory = new WxCreditHistory();
creditHistory.setTenantId(record.getFinalTenantId());
creditHistory.setOperatorType(EnumUserType.ALI_CIRCLE.getCode());
creditHistory.setOperatorId(record.getCUserId());
creditHistory.setCUserId(record.getCUserId());
creditHistory.setCreateDate(new Date());
creditHistory.setCouponId(record.getId());
creditHistory.setMerchantId(record.getMerchantId());
creditHistory.setCreditType(EnumScoreType.REFUND_CONSUMPTION.getCode());
int points = 0;
if((refundAmount + record.getRefundAmount()) == amount){
points = increasedPoints - refundIncreasedPoints;
}else{
points = new BigDecimal(order.getIncreasedPoints())
.divide(new BigDecimal(order.getPayAmount()),2,BigDecimal.ROUND_HALF_UP)
.multiply(new BigDecimal(record.getRefundAmount()))
.intValue();
}
List<AliBusinessCircleOrder> refundOrders = this.getRefundOrderByTransactionId(record.getTransactionId(),record.getTenantId());
Integer amount = order.getPayAmount();
Integer increasedPoints = order.getIncreasedPoints();
Integer refundAmount = 0;
Integer refundIncreasedPoints = 0;


creditHistory.setCreditNum(points);
creditHistory.setSpend(0-record.getRefundAmount());
creditHistory.setChangePurpose("Ali商圈消费退款:商户["+record.getMallName()+"] ("+record.getRefundAmountStr()+"元) ");
creditHistory = creditHistoryService.saveOrUpdate(creditHistory,record.getTenantId());
Integer creditNum = 0;
if (creditHistory.getCreditNum() != null) {
creditNum = creditHistory.getCreditNum();
}
if(creditNum == 0){
return;
if(refundOrders != null && refundOrders.size()>0){
for (AliBusinessCircleOrder ro:refundOrders) {
refundAmount += ro.getRefundAmount();
refundIncreasedPoints += ro.getIncreasedPoints();
} }
}
if(refundAmount >= amount){
logger.error("--Ali商圈退款--已经退款--transactionId="+record.getTransactionId());
}else if((refundAmount + record.getRefundAmount()) > amount ){
logger.error("--Ali商圈退款--退款金额超限--transactionId="+record.getTransactionId());
}else{
Date now = new Date();
final IdWorker idWorker = IdWorker.get();
record.setId(idWorker.nextId());
record.setCreateTime(now);
record.setUpdateTime(now);

record.setAmount(order.getAmount());
record.setPayAmount(order.getPayAmount());
record.setCUserId(order.getCUserId());
record.setMerchantId(order.getMerchantId());
aliBusinessCircleOrderMapper.insertRefundNoticeOrder(record);

if(order.getEarnPoints().equals(EnumYesOrNo.YES.getCode())){
WxCreditHistory creditHistory = new WxCreditHistory();
creditHistory.setTenantId(record.getFinalTenantId());
creditHistory.setOperatorType(EnumUserType.ALI_CIRCLE.getCode());
creditHistory.setOperatorId(record.getCUserId());
creditHistory.setCUserId(record.getCUserId());
creditHistory.setCreateDate(new Date());
creditHistory.setCouponId(record.getId());
creditHistory.setMerchantId(record.getMerchantId());
creditHistory.setCreditType(EnumScoreType.REFUND_CONSUMPTION.getCode());
int points = 0;
if((refundAmount + record.getRefundAmount()) == amount){
points = increasedPoints - refundIncreasedPoints;
}else{
points = new BigDecimal(order.getIncreasedPoints())
.divide(new BigDecimal(order.getPayAmount()),2,BigDecimal.ROUND_HALF_UP)
.multiply(new BigDecimal(record.getRefundAmount()))
.intValue();
}

creditHistory.setCreditNum(points);
creditHistory.setSpend(0-record.getRefundAmount());
creditHistory.setChangePurpose("Ali商圈消费退款:商户["+record.getMallName()+"] ("+record.getRefundAmountStr()+"元) ");
creditHistory = creditHistoryService.saveOrUpdate(creditHistory,record.getTenantId());
Integer creditNum = 0;
if (creditHistory.getCreditNum() != null) {
creditNum = creditHistory.getCreditNum();
}
if(creditNum == 0){
return;
}


record.setIncreasedPoints(creditNum);
record.setPointsUpdateTime(creditHistory.getCreateDate());
this.updatePoints(record);
record.setIncreasedPoints(creditNum);
record.setPointsUpdateTime(creditHistory.getCreateDate());
this.updatePoints(record);
}
} }
} }
}


redisLock.unlock(lockKey, timeStr);
}else{
logger.debug("CacheAspect 读库等待中, key:{}: " + lockKey);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
redisLock.unlock(lockKey, timeStr); redisLock.unlock(lockKey, timeStr);
}else{
logger.debug("CacheAspect 读库等待中, key:{}: " + lockKey);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
redisLock.unlock(lockKey, timeStr);
}
} }
} }
} }


+ 163
- 114
mallinkService/src/main/java/com/iformall/service/impl/WxBusinessCircleOrderServiceImpl.java Просмотреть файл

@@ -3,13 +3,12 @@ package com.iformall.service.impl;
import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import com.iformall.common.IdWorker; import com.iformall.common.IdWorker;
import com.iformall.domain.po.WxBusinessCircleOrder;
import com.iformall.domain.po.WxCUser;
import com.iformall.domain.po.WxCreditHistory;
import com.iformall.domain.po.WxMerchant;
import com.iformall.domain.po.*;
import com.iformall.enums.*; import com.iformall.enums.*;
import com.iformall.mapper.WxBusinessCircleOrderMapper; import com.iformall.mapper.WxBusinessCircleOrderMapper;
import com.iformall.service.*; import com.iformall.service.*;
import com.iformall.utils.RedisLock;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@@ -24,6 +23,11 @@ public class WxBusinessCircleOrderServiceImpl implements WxBusinessCircleOrderSe


private final Logger logger = LoggerFactory.getLogger(this.getClass()); private final Logger logger = LoggerFactory.getLogger(this.getClass());


private static final String WX_CIRCLE_KEY = "CIRCLE:WX:";

@Autowired
RedisLock redisLock;

@Autowired @Autowired
WxBusinessCircleOrderMapper wxBusinessCircleOrderMapper; WxBusinessCircleOrderMapper wxBusinessCircleOrderMapper;


@@ -61,6 +65,14 @@ public class WxBusinessCircleOrderServiceImpl implements WxBusinessCircleOrderSe
return wxBusinessCircleOrderMapper.getOrderByTransactionId(recordQ); return wxBusinessCircleOrderMapper.getOrderByTransactionId(recordQ);
} }


@Override
public WxBusinessCircleOrder getRefundOrderByRefundId(String refundId, String tenantId) {
WxBusinessCircleOrder recordQ = new WxBusinessCircleOrder();
recordQ.setRefundId(refundId);
recordQ.setTenantId(tenantId);
return wxBusinessCircleOrderMapper.getRefundOrderByRefundId(recordQ);
}

@Override @Override
public List<WxBusinessCircleOrder> getRefundOrderByTransactionId(String transactionId, String tenantId) { public List<WxBusinessCircleOrder> getRefundOrderByTransactionId(String transactionId, String tenantId) {
WxBusinessCircleOrder recordQ = new WxBusinessCircleOrder(); WxBusinessCircleOrder recordQ = new WxBusinessCircleOrder();
@@ -71,129 +83,57 @@ public class WxBusinessCircleOrderServiceImpl implements WxBusinessCircleOrderSe


@Override @Override
public void createOrder(WxBusinessCircleOrder record) { public void createOrder(WxBusinessCircleOrder record) {
WxBusinessCircleOrder byTransactionId = this.getOrderByTransactionId(record.getTransactionId(),record.getTenantId());
if(byTransactionId != null){
logger.error("--Wx商圈付款--订单消息已存在---byTransactionId="+byTransactionId.getTransactionId());
}else{
Date now = new Date();
final IdWorker idWorker = IdWorker.get();
record.setId(idWorker.nextId());
record.setCreateTime(now);
record.setUpdateTime(now);
String lockKey = StringUtils.join(WX_CIRCLE_KEY,record.getTransactionId(), ":",EnumYesOrNo.NO.getCode(),":", "lock");
long time = System.currentTimeMillis() + 2000;
String timeStr = String.valueOf(time);
if (redisLock.lock2(lockKey, timeStr)) {


//TODO 第三方获取门店(标识可能发生变化)
// WxMerchant wxMerchant = wxMerchantService.getById(Long.parseLong(record.getWxShopNumber()));
WxMerchant wxMerchant = wxMerchantService.getMerchantByEncode(record.getWxShopNumber());
if(wxMerchant != null){
record.setMerchantId(wxMerchant.getId());
}else{
logger.error("--Wx商圈付款通知消息未找到门店--shopName="+record.getWxShopName()+"&shopNumber="+record.getWxShopNumber());
}
WxCUser userQ = new WxCUser();
userQ.updateTenantInfo(record);
userQ.setOpenId(record.getOpenid());
userQ.setAppId(record.getAppid());
WxCUser user = wxCUserService.getByOpenId(userQ);
if(user != null && user.getUserId() != null){
record.setCUserId(user.getUserId());
}else{
logger.error("--Wx商圈付款通知消息未找到会员--openid="+record.getOpenid());
}
wxBusinessCircleOrderMapper.insertNoticeOrder(record);

if(record.getCUserId() == null){
return;
}
Integer businessId = EnumBusiness.BUSINESS_ID6.getCode();
if(wxMerchant != null){
businessId = wxMerchant.getBusinessId();
}
WxCreditHistory creditHistory = new WxCreditHistory();
creditHistory.setTenantId(record.getFinalTenantId());
creditHistory.setOperatorType(EnumUserType.BUSINESS_CIRCLE.getCode());
creditHistory.setOperatorId(record.getCUserId());
creditHistory.setCUserId(record.getCUserId());
creditHistory.setCreateDate(now);
creditHistory.setCouponId(record.getId());
creditHistory.setBusinessId(businessId);
creditHistory.setMerchantId(record.getMerchantId());
creditHistory.setCreditType(EnumScoreType.CONSUMPTION.getCode());
creditHistory.setSpend(record.getPayAmount());
creditHistory.setChangePurpose("Wx商圈消费:消费商户["+record.getWxShopName()+"] ("+record.getPayAmountStr()+"元) ");
creditHistory = creditHistoryService.saveOrUpdate(creditHistory,record.getTenantId());
Integer creditNum = 0;
if (creditHistory.getCreditNum() != null) {
creditNum = creditHistory.getCreditNum();
}
if(creditNum == 0){
return;
}
record.setIncreasedPoints(creditNum);
record.setPointsUpdateTime(creditHistory.getCreateDate());
this.updatePoints(record);

//同步积分
wxCallBackService.notifyPoints(record);

}
}

@Override
public void insertRefundNoticeOrder(WxBusinessCircleOrder record) {
WxBusinessCircleOrder order = this.getOrderByTransactionId(record.getTransactionId(),record.getTenantId());
if(order == null){
logger.error("--Wx商圈退款--付款消息未找到--transactionId="+record.getTransactionId());
}else{
List<WxBusinessCircleOrder> refundOrders = this.getRefundOrderByTransactionId(record.getTransactionId(),record.getTenantId());
Integer amount = order.getPayAmount();
Integer increasedPoints = order.getIncreasedPoints();
Integer refundAmount = 0;
Integer refundIncreasedPoints = 0;

if(refundOrders != null && refundOrders.size()>0){
for (WxBusinessCircleOrder ro:refundOrders) {
refundAmount += ro.getRefundAmount();
refundIncreasedPoints += ro.getIncreasedPoints();
}
}
if(refundAmount >= amount){
logger.error("--Wx商圈退款--已经退款--transactionId="+record.getTransactionId());
}else if((refundAmount + record.getRefundAmount()) > amount ){
logger.error("--Wx商圈退款--退款金额超限--transactionId="+record.getTransactionId());
}else{
WxBusinessCircleOrder byTransactionId = this.getOrderByTransactionId(record.getTransactionId(),record.getTenantId());
if(byTransactionId != null){
logger.error("--Wx商圈付款--订单消息已存在---byTransactionId="+byTransactionId.getTransactionId());
}else {
Date now = new Date(); Date now = new Date();
final IdWorker idWorker = IdWorker.get(); final IdWorker idWorker = IdWorker.get();
record.setId(idWorker.nextId()); record.setId(idWorker.nextId());
record.setCreateTime(now); record.setCreateTime(now);
record.setUpdateTime(now); record.setUpdateTime(now);


record.setCUserId(order.getCUserId());
record.setMerchantId(order.getMerchantId());
wxBusinessCircleOrderMapper.insertRefundNoticeOrder(record);

if(order.getEarnPoints().equals(EnumYesOrNo.YES.getCode())){
//TODO 第三方获取门店(标识可能发生变化)
// WxMerchant wxMerchant = wxMerchantService.getById(Long.parseLong(record.getWxShopNumber()));
WxMerchant wxMerchant = wxMerchantService.getMerchantByEncode(record.getWxShopNumber());
if (wxMerchant != null) {
record.setMerchantId(wxMerchant.getId());
} else {
logger.error("--Wx商圈付款通知消息未找到门店--shopName=" + record.getWxShopName() + "&shopNumber=" + record.getWxShopNumber());
}
WxCUser userQ = new WxCUser();
userQ.updateTenantInfo(record);
userQ.setOpenId(record.getOpenid());
userQ.setAppId(record.getAppid());
WxCUser user = wxCUserService.getByOpenId(userQ);
if (user != null && user.getUserId() != null) {
record.setCUserId(user.getUserId());
} else {
logger.error("--Wx商圈付款通知消息未找到会员--openid=" + record.getOpenid());
}
wxBusinessCircleOrderMapper.insertNoticeOrder(record);
if(record.getCUserId() != null){
Integer businessId = EnumBusiness.BUSINESS_ID6.getCode();
if(wxMerchant != null){
businessId = wxMerchant.getBusinessId();
}
WxCreditHistory creditHistory = new WxCreditHistory(); WxCreditHistory creditHistory = new WxCreditHistory();
creditHistory.setTenantId(record.getFinalTenantId()); creditHistory.setTenantId(record.getFinalTenantId());
creditHistory.setOperatorType(EnumUserType.BUSINESS_CIRCLE.getCode()); creditHistory.setOperatorType(EnumUserType.BUSINESS_CIRCLE.getCode());
creditHistory.setOperatorId(record.getCUserId()); creditHistory.setOperatorId(record.getCUserId());
creditHistory.setCUserId(record.getCUserId()); creditHistory.setCUserId(record.getCUserId());
creditHistory.setCreateDate(new Date());
creditHistory.setCreateDate(now);
creditHistory.setCouponId(record.getId()); creditHistory.setCouponId(record.getId());
creditHistory.setBusinessId(businessId);
creditHistory.setMerchantId(record.getMerchantId()); creditHistory.setMerchantId(record.getMerchantId());
creditHistory.setCreditType(EnumScoreType.REFUND_CONSUMPTION.getCode());
int points = 0;
if((refundAmount + record.getRefundAmount()) == amount){
points = increasedPoints - refundIncreasedPoints;
}else{
points = new BigDecimal(order.getIncreasedPoints())
.divide(new BigDecimal(order.getPayAmount()),2,BigDecimal.ROUND_HALF_UP)
.multiply(new BigDecimal(record.getRefundAmount()))
.intValue();
}

creditHistory.setCreditNum(points);
creditHistory.setSpend(0-record.getRefundAmount());
creditHistory.setChangePurpose("Wx商圈消费退款:商户["+record.getWxShopName()+"] ("+record.getRefundAmountStr()+"元) ");
creditHistory.setCreditType(EnumScoreType.CONSUMPTION.getCode());
creditHistory.setSpend(record.getPayAmount());
creditHistory.setChangePurpose("Wx商圈消费:消费商户["+record.getWxShopName()+"] ("+record.getPayAmountStr()+"元) ");
creditHistory = creditHistoryService.saveOrUpdate(creditHistory,record.getTenantId()); creditHistory = creditHistoryService.saveOrUpdate(creditHistory,record.getTenantId());
Integer creditNum = 0; Integer creditNum = 0;
if (creditHistory.getCreditNum() != null) { if (creditHistory.getCreditNum() != null) {
@@ -202,12 +142,121 @@ public class WxBusinessCircleOrderServiceImpl implements WxBusinessCircleOrderSe
if(creditNum == 0){ if(creditNum == 0){
return; return;
} }

record.setIncreasedPoints(creditNum); record.setIncreasedPoints(creditNum);
record.setPointsUpdateTime(creditHistory.getCreateDate()); record.setPointsUpdateTime(creditHistory.getCreateDate());
this.updatePoints(record); this.updatePoints(record);

//同步积分
wxCallBackService.notifyPoints(record);
}

}
redisLock.unlock(lockKey, timeStr);

}else {
logger.debug("CacheAspect 读库等待中, key:{}: " + lockKey);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
redisLock.unlock(lockKey, timeStr);
}
}

}

@Override
public void insertRefundNoticeOrder(WxBusinessCircleOrder record) {
WxBusinessCircleOrder order = this.getOrderByTransactionId(record.getTransactionId(),record.getTenantId());
if(order == null){
logger.error("--Wx商圈退款--付款消息未找到--transactionId="+record.getTransactionId());
}else{
String lockKey = StringUtils.join(WX_CIRCLE_KEY,record.getRefundId(), ":",EnumYesOrNo.YES.getCode(),":", "lock");
long time = System.currentTimeMillis() + 2000;
String timeStr = String.valueOf(time);
if (redisLock.lock2(lockKey, timeStr)) {
WxBusinessCircleOrder refundOrder = this.getRefundOrderByRefundId(record.getRefundId(),record.getTenantId());
if(refundOrder != null){
logger.error("--Ali商圈退款--退款消息已存在---RefundId="+record.getRefundId());
}else{
List<WxBusinessCircleOrder> refundOrders = this.getRefundOrderByTransactionId(record.getTransactionId(),record.getTenantId());
Integer amount = order.getPayAmount();
Integer increasedPoints = order.getIncreasedPoints();
Integer refundAmount = 0;
Integer refundIncreasedPoints = 0;

if(refundOrders != null && refundOrders.size()>0){
for (WxBusinessCircleOrder ro:refundOrders) {
refundAmount += ro.getRefundAmount();
refundIncreasedPoints += ro.getIncreasedPoints();
}
}
if(refundAmount >= amount){
logger.error("--Wx商圈退款--已经退款--transactionId="+record.getTransactionId());
}else if((refundAmount + record.getRefundAmount()) > amount ){
logger.error("--Wx商圈退款--退款金额超限--transactionId="+record.getTransactionId());
}else{
Date now = new Date();
final IdWorker idWorker = IdWorker.get();
record.setId(idWorker.nextId());
record.setCreateTime(now);
record.setUpdateTime(now);

record.setCUserId(order.getCUserId());
record.setMerchantId(order.getMerchantId());
wxBusinessCircleOrderMapper.insertRefundNoticeOrder(record);

if(order.getEarnPoints().equals(EnumYesOrNo.YES.getCode())){
WxCreditHistory creditHistory = new WxCreditHistory();
creditHistory.setTenantId(record.getFinalTenantId());
creditHistory.setOperatorType(EnumUserType.BUSINESS_CIRCLE.getCode());
creditHistory.setOperatorId(record.getCUserId());
creditHistory.setCUserId(record.getCUserId());
creditHistory.setCreateDate(new Date());
creditHistory.setCouponId(record.getId());
creditHistory.setMerchantId(record.getMerchantId());
creditHistory.setCreditType(EnumScoreType.REFUND_CONSUMPTION.getCode());
int points = 0;
if((refundAmount + record.getRefundAmount()) == amount){
points = increasedPoints - refundIncreasedPoints;
}else{
points = new BigDecimal(order.getIncreasedPoints())
.divide(new BigDecimal(order.getPayAmount()),2,BigDecimal.ROUND_HALF_UP)
.multiply(new BigDecimal(record.getRefundAmount()))
.intValue();
}

creditHistory.setCreditNum(points);
creditHistory.setSpend(0-record.getRefundAmount());
creditHistory.setChangePurpose("Wx商圈消费退款:商户["+record.getWxShopName()+"] ("+record.getRefundAmountStr()+"元) ");
creditHistory = creditHistoryService.saveOrUpdate(creditHistory,record.getTenantId());
Integer creditNum = 0;
if (creditHistory.getCreditNum() != null) {
creditNum = creditHistory.getCreditNum();
}
if(creditNum == 0){
return;
}

record.setIncreasedPoints(creditNum);
record.setPointsUpdateTime(creditHistory.getCreateDate());
this.updatePoints(record);
}
}
}
redisLock.unlock(lockKey, timeStr);
}else {
logger.debug("CacheAspect 读库等待中, key:{}: " + lockKey);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
redisLock.unlock(lockKey, timeStr);
} }
} }

} }
} }




+ 218
- 152
mallinkService/src/main/java/com/iformall/service/impl/WxThirdPartyOrdersServiceImpl.java Просмотреть файл

@@ -9,6 +9,7 @@ import com.iformall.enums.*;
import com.iformall.exception.MallinkException; import com.iformall.exception.MallinkException;
import com.iformall.mapper.WxThirdPartyOrdersMapper; import com.iformall.mapper.WxThirdPartyOrdersMapper;
import com.iformall.service.*; import com.iformall.service.*;
import com.iformall.utils.RedisLock;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@@ -24,8 +25,14 @@ import static org.springframework.transaction.annotation.Propagation.REQUIRED;


@Service @Service
public class WxThirdPartyOrdersServiceImpl implements WxThirdPartyOrdersService { public class WxThirdPartyOrdersServiceImpl implements WxThirdPartyOrdersService {

private final Logger logger = LoggerFactory.getLogger(this.getClass()); private final Logger logger = LoggerFactory.getLogger(this.getClass());


private static final String THIRD_CIRCLE_KEY = "CIRCLE:TH:";

@Autowired
RedisLock redisLock;

@Autowired @Autowired
WxThirdPartyOrdersMapper wxThirdPartyOrdersMapper; WxThirdPartyOrdersMapper wxThirdPartyOrdersMapper;


@@ -65,6 +72,14 @@ public class WxThirdPartyOrdersServiceImpl implements WxThirdPartyOrdersService
return wxThirdPartyOrdersMapper.getOrderByTransactionId(recordQ); return wxThirdPartyOrdersMapper.getOrderByTransactionId(recordQ);
} }


@Override
public WxThirdPartyOrders getRefundOrderByRefundId(String refundId, String tenantId) {
WxThirdPartyOrders recordQ = new WxThirdPartyOrders();
recordQ.setRefundId(refundId);
recordQ.setTenantId(tenantId);
return wxThirdPartyOrdersMapper.getRefundOrderByRefundId(recordQ);
}

@Override @Override
public List<WxThirdPartyOrders> getRefundOrderByTransactionId(EnumThirdOrderType orderType, String transactionId, String tenantId) { public List<WxThirdPartyOrders> getRefundOrderByTransactionId(EnumThirdOrderType orderType, String transactionId, String tenantId) {
WxThirdPartyOrders recordQ = new WxThirdPartyOrders(); WxThirdPartyOrders recordQ = new WxThirdPartyOrders();
@@ -76,74 +91,89 @@ public class WxThirdPartyOrdersServiceImpl implements WxThirdPartyOrdersService


@Override @Override
public void createOrder(WxThirdPartyOrders record) { public void createOrder(WxThirdPartyOrders record) {
WxThirdPartyOrders byTransactionId = this.getOrderByTransactionId(EnumThirdOrderType.RMB_PAY,record.getTransactionId(),record.getTenantId());
if(byTransactionId != null){
logger.error("--第三方付款--通知消息已存在---byTransactionId="+byTransactionId.getTransactionId());
throw new MallinkException(ErrorCode.SYS_PARAMETER_ERROR.getCode(), "订单数据已存在");
}else{
Date now = new Date();
final IdWorker idWorker = IdWorker.get();
record.setId(idWorker.nextId());
record.setCreateTime(now);
record.setUpdateTime(now);
String lockKey = StringUtils.join(THIRD_CIRCLE_KEY,record.getTransactionId(), ":",EnumYesOrNo.NO.getCode(),":", "lock");
long time = System.currentTimeMillis() + 2000;
String timeStr = String.valueOf(time);
if (redisLock.lock2(lockKey, timeStr)) {
WxThirdPartyOrders byTransactionId = this.getOrderByTransactionId(EnumThirdOrderType.RMB_PAY,record.getTransactionId(),record.getTenantId());
if(byTransactionId != null){
logger.error("--第三方付款--通知消息已存在---byTransactionId="+byTransactionId.getTransactionId());
throw new MallinkException(ErrorCode.SYS_PARAMETER_ERROR.getCode(), "订单数据已存在");
}else{
Date now = new Date();
final IdWorker idWorker = IdWorker.get();
record.setId(idWorker.nextId());
record.setCreateTime(now);
record.setUpdateTime(now);


record.setSourceType(EnumThirdOrderType.RMB_PAY.getCode());
record.setSourceType(EnumThirdOrderType.RMB_PAY.getCode());


//TODO 第三方获取门店(标识可能发生变化)
//TODO 第三方获取门店(标识可能发生变化)
// WxMerchant wxMerchant = wxMerchantService.getById(Long.parseLong(record.getShopNumber())); // WxMerchant wxMerchant = wxMerchantService.getById(Long.parseLong(record.getShopNumber()));
WxMerchant wxMerchant = wxMerchantService.getMerchantByEncode(record.getShopNumber());
if(wxMerchant != null){
record.setMerchantId(wxMerchant.getId());
}else{
logger.info("--第三方付款通知消息未找到门店--shopName="+record.getShopName()+"&shopNumber="+record.getShopNumber());
}
WxMerchant wxMerchant = wxMerchantService.getMerchantByEncode(record.getShopNumber());
if(wxMerchant != null){
record.setMerchantId(wxMerchant.getId());
}else{
logger.info("--第三方付款通知消息未找到门店--shopName="+record.getShopName()+"&shopNumber="+record.getShopNumber());
}


WxCUserBasicInfo basicInfo = null;
basicInfo = wxCUserBasicInfoService.getById(Long.parseLong(record.getUserNumber()), record.getFinalTenantId());
if(basicInfo == null){
basicInfo = wxCUserBasicInfoService.registerByPhone(record, record.getUserPhone());
}
WxCUserBasicInfo basicInfo = null;
basicInfo = wxCUserBasicInfoService.getById(Long.parseLong(record.getUserNumber()), record.getFinalTenantId());
if(basicInfo == null){
basicInfo = wxCUserBasicInfoService.registerByPhone(record, record.getUserPhone());
}


if(basicInfo != null){
record.setCUserId(basicInfo.getId());
}else{
logger.error("--第三方付款通知消息未找到会员--userPhone="+record.getUserPhone()+"$userNumer="+record.getId());
}
wxThirdPartyOrdersMapper.insertNoticeOrder(record);
if(basicInfo != null){
record.setCUserId(basicInfo.getId());
}else{
logger.error("--第三方付款通知消息未找到会员--userPhone="+record.getUserPhone()+"$userNumer="+record.getId());
}
wxThirdPartyOrdersMapper.insertNoticeOrder(record);


if(record.getCUserId() == null){
return;
}
Integer businessId = EnumBusiness.BUSINESS_ID6.getCode();
if(wxMerchant != null){
businessId = wxMerchant.getBusinessId();
}
WxCreditHistory creditHistory = new WxCreditHistory();
creditHistory.setTenantId(record.getFinalTenantId());
creditHistory.setOperatorType(EnumUserType.THIRD_CIRCLE.getCode());
creditHistory.setOperatorId(record.getCUserId());
creditHistory.setCUserId(record.getCUserId());
creditHistory.setCreateDate(now);
creditHistory.setCouponId(record.getId());
creditHistory.setBusinessId(businessId);
creditHistory.setMerchantId(record.getMerchantId());
creditHistory.setCreditType(EnumScoreType.CONSUMPTION.getCode());
creditHistory.setSpend(record.getPayAmount());
creditHistory.setChangePurpose("第三方消费:消费商户["+record.getShopName()+"] ("+record.getPayAmountStr()+"元) ");
creditHistory = wxCreditHistoryService.saveOrUpdate(creditHistory,record.getTenantId());
Integer creditNum = 0;
if (creditHistory.getCreditNum() != null) {
creditNum = creditHistory.getCreditNum();
if(record.getCUserId() == null){
return;
}
Integer businessId = EnumBusiness.BUSINESS_ID6.getCode();
if(wxMerchant != null){
businessId = wxMerchant.getBusinessId();
}
WxCreditHistory creditHistory = new WxCreditHistory();
creditHistory.setTenantId(record.getFinalTenantId());
creditHistory.setOperatorType(EnumUserType.THIRD_CIRCLE.getCode());
creditHistory.setOperatorId(record.getCUserId());
creditHistory.setCUserId(record.getCUserId());
creditHistory.setCreateDate(now);
creditHistory.setCouponId(record.getId());
creditHistory.setBusinessId(businessId);
creditHistory.setMerchantId(record.getMerchantId());
creditHistory.setCreditType(EnumScoreType.CONSUMPTION.getCode());
creditHistory.setSpend(record.getPayAmount());
creditHistory.setChangePurpose("第三方消费:消费商户["+record.getShopName()+"] ("+record.getPayAmountStr()+"元) ");
creditHistory = wxCreditHistoryService.saveOrUpdate(creditHistory,record.getTenantId());
Integer creditNum = 0;
if (creditHistory.getCreditNum() != null) {
creditNum = creditHistory.getCreditNum();
}
if(creditNum == 0){
return;
}
record.setIncreasedPoints(creditNum);
record.setPointsUpdateTime(creditHistory.getCreateDate());
this.updatePoints(record);
} }
if(creditNum == 0){
return;
redisLock.unlock(lockKey, timeStr);
}else {
logger.debug("CacheAspect 读库等待中, key:{}: " + lockKey);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
redisLock.unlock(lockKey, timeStr);
} }
record.setIncreasedPoints(creditNum);
record.setPointsUpdateTime(creditHistory.getCreateDate());
this.updatePoints(record);
}




}
} }




@@ -153,79 +183,99 @@ public class WxThirdPartyOrdersServiceImpl implements WxThirdPartyOrdersService
if(order == null){ if(order == null){
logger.error("--第三方退款--付款消息未找到--transactionId="+record.getTransactionId()); logger.error("--第三方退款--付款消息未找到--transactionId="+record.getTransactionId());
throw new MallinkException(ErrorCode.SYS_PARAMETER_ERROR.getCode(), "付款消息未找到"); throw new MallinkException(ErrorCode.SYS_PARAMETER_ERROR.getCode(), "付款消息未找到");
}else if(order.getIsRefund().equals(EnumYesOrNo.YES.getCode())){
logger.error("--第三方退款--已是退款状态--transactionId="+record.getTransactionId());
throw new MallinkException(ErrorCode.SYS_PARAMETER_ERROR.getCode(), "已是退款状态");
}else{ }else{
List<WxThirdPartyOrders> refundOrders = this.getRefundOrderByTransactionId(EnumThirdOrderType.RMB_PAY,record.getTransactionId(),record.getTenantId());
Integer amount = order.getPayAmount();
Integer increasedPoints = order.getIncreasedPoints();
Integer refundAmount = 0;
Integer refundIncreasedPoints = 0;

if(refundOrders != null && refundOrders.size()>0){
for (WxThirdPartyOrders ro:refundOrders) {
refundAmount += ro.getRefundAmount();
refundIncreasedPoints += ro.getIncreasedPoints();
}
}
if(refundAmount >= amount){
logger.error("--第三方退款--已经退款--transactionId="+record.getTransactionId());
throw new MallinkException(ErrorCode.SYS_PARAMETER_ERROR.getCode(), "已经退款");
}else if((refundAmount + record.getRefundAmount()) > amount ){
logger.error("--第三方退款--退款金额超限--transactionId="+record.getTransactionId());
throw new MallinkException(ErrorCode.SYS_PARAMETER_ERROR.getCode(), "退款金额超限");
WxThirdPartyOrders refundOrder = this.getRefundOrderByRefundId(record.getRefundId(),record.getTenantId());
if(refundOrder != null){
logger.error("--Ali商圈退款--退款消息已存在---RefundId="+record.getRefundId());
}else{ }else{

Date now = new Date();
final IdWorker idWorker = IdWorker.get();
record.setId(idWorker.nextId());
record.setCreateTime(now);
record.setUpdateTime(now);

record.setCUserId(order.getCUserId());
record.setMerchantId(order.getMerchantId());
wxThirdPartyOrdersMapper.insertRefundNoticeOrder(record);

if(order.getEarnPoints().equals(EnumYesOrNo.YES.getCode())){
WxCreditHistory creditHistory = new WxCreditHistory();
creditHistory.setTenantId(record.getFinalTenantId());
creditHistory.setOperatorType(EnumUserType.THIRD_CIRCLE.getCode());
creditHistory.setOperatorId(record.getCUserId());
creditHistory.setCUserId(record.getCUserId());
creditHistory.setCreateDate(new Date());
creditHistory.setCouponId(record.getId());
creditHistory.setMerchantId(record.getMerchantId());
creditHistory.setCreditType(EnumScoreType.REFUND_CONSUMPTION.getCode());
int points = 0;
if((refundAmount + record.getRefundAmount()) == amount){
points = increasedPoints - refundIncreasedPoints;
}else{
points = new BigDecimal(order.getIncreasedPoints())
.divide(new BigDecimal(order.getPayAmount()),2,BigDecimal.ROUND_HALF_UP)
.multiply(new BigDecimal(record.getRefundAmount()))
.intValue();
String lockKey = StringUtils.join(THIRD_CIRCLE_KEY,record.getRefundId(), ":",EnumYesOrNo.YES.getCode(),":", "lock");
long time = System.currentTimeMillis() + 2000;
String timeStr = String.valueOf(time);
if (redisLock.lock2(lockKey, timeStr)) {
List<WxThirdPartyOrders> refundOrders = this.getRefundOrderByTransactionId(EnumThirdOrderType.RMB_PAY,record.getTransactionId(),record.getTenantId());
Integer amount = order.getPayAmount();
Integer increasedPoints = order.getIncreasedPoints();
Integer refundAmount = 0;
Integer refundIncreasedPoints = 0;

if(refundOrders != null && refundOrders.size()>0){
for (WxThirdPartyOrders ro:refundOrders) {
refundAmount += ro.getRefundAmount();
refundIncreasedPoints += ro.getIncreasedPoints();
}
} }
if(refundAmount >= amount){
logger.error("--第三方退款--已经退款--transactionId="+record.getTransactionId());
throw new MallinkException(ErrorCode.SYS_PARAMETER_ERROR.getCode(), "已经退款");
}else if((refundAmount + record.getRefundAmount()) > amount ){
logger.error("--第三方退款--退款金额超限--transactionId="+record.getTransactionId());
throw new MallinkException(ErrorCode.SYS_PARAMETER_ERROR.getCode(), "退款金额超限");
}else{


creditHistory.setCreditNum(points);
creditHistory.setSpend(0-record.getRefundAmount());
creditHistory.setChangePurpose("第三方消费退款:商户["+record.getShopName()+"] ("+record.getRefundAmountStr()+"元) ");
creditHistory = wxCreditHistoryService.saveOrUpdate(creditHistory,record.getTenantId());
Integer creditNum = 0;
if (creditHistory.getCreditNum() != null) {
creditNum = creditHistory.getCreditNum();
}
if(creditNum == 0){
return;
Date now = new Date();
final IdWorker idWorker = IdWorker.get();
record.setId(idWorker.nextId());
record.setCreateTime(now);
record.setUpdateTime(now);

record.setAmount(order.getAmount());
record.setPayAmount(order.getPayAmount());
record.setCUserId(order.getCUserId());
record.setMerchantId(order.getMerchantId());
wxThirdPartyOrdersMapper.insertRefundNoticeOrder(record);

if(order.getEarnPoints().equals(EnumYesOrNo.YES.getCode())){
WxCreditHistory creditHistory = new WxCreditHistory();
creditHistory.setTenantId(record.getFinalTenantId());
creditHistory.setOperatorType(EnumUserType.THIRD_CIRCLE.getCode());
creditHistory.setOperatorId(record.getCUserId());
creditHistory.setCUserId(record.getCUserId());
creditHistory.setCreateDate(new Date());
creditHistory.setCouponId(record.getId());
creditHistory.setMerchantId(record.getMerchantId());
creditHistory.setCreditType(EnumScoreType.REFUND_CONSUMPTION.getCode());
int points = 0;
if((refundAmount + record.getRefundAmount()) == amount){
points = increasedPoints - refundIncreasedPoints;
}else{
points = new BigDecimal(order.getIncreasedPoints())
.divide(new BigDecimal(order.getPayAmount()),2,BigDecimal.ROUND_HALF_UP)
.multiply(new BigDecimal(record.getRefundAmount()))
.intValue();
}

creditHistory.setCreditNum(points);
creditHistory.setSpend(0-record.getRefundAmount());
creditHistory.setChangePurpose("第三方消费退款:商户["+record.getShopName()+"] ("+record.getRefundAmountStr()+"元) ");
creditHistory = wxCreditHistoryService.saveOrUpdate(creditHistory,record.getTenantId());
Integer creditNum = 0;
if (creditHistory.getCreditNum() != null) {
creditNum = creditHistory.getCreditNum();
}
if(creditNum == 0){
return;
}

record.setIncreasedPoints(creditNum);
record.setPointsUpdateTime(creditHistory.getCreateDate());
this.updatePoints(record);
}
} }


record.setIncreasedPoints(creditNum);
record.setPointsUpdateTime(creditHistory.getCreateDate());
this.updatePoints(record);
redisLock.unlock(lockKey, timeStr);
}else {
logger.debug("CacheAspect 读库等待中, key:{}: " + lockKey);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
redisLock.unlock(lockKey, timeStr);
}
} }
} }

} }

} }


@Override @Override
@@ -249,42 +299,58 @@ public class WxThirdPartyOrdersServiceImpl implements WxThirdPartyOrdersService


record.setCUserId(basicInfo.getId()); record.setCUserId(basicInfo.getId());


WxThirdPartyOrders byTransactionId = this.getOrderByTransactionId(EnumThirdOrderType.CREDIT_PAY,record.getTransactionId(),record.getTenantId());
if(byTransactionId != null){
logger.error("--第三方积分订单--数据已存在---byTransactionId="+byTransactionId.getTransactionId());
throw new MallinkException(ErrorCode.SYS_PARAMETER_ERROR.getCode(), "订单数据已存在");
}else{
Date now = new Date();
final IdWorker idWorker = IdWorker.get();
record.setId(idWorker.nextId());
record.setCreateTime(now);
record.setUpdateTime(now);
String lockKey = StringUtils.join(THIRD_CIRCLE_KEY,record.getTransactionId(), ":CP:", "lock");
long time = System.currentTimeMillis() + 2000;
String timeStr = String.valueOf(time);
if (redisLock.lock2(lockKey, timeStr)) {
WxThirdPartyOrders byTransactionId = this.getOrderByTransactionId(EnumThirdOrderType.CREDIT_PAY,record.getTransactionId(),record.getTenantId());
if(byTransactionId != null){
logger.error("--第三方积分订单--数据已存在---byTransactionId="+byTransactionId.getTransactionId());
throw new MallinkException(ErrorCode.SYS_PARAMETER_ERROR.getCode(), "订单数据已存在");
}else{
Date now = new Date();
final IdWorker idWorker = IdWorker.get();
record.setId(idWorker.nextId());
record.setCreateTime(now);
record.setUpdateTime(now);


record.setSourceType(EnumThirdOrderType.CREDIT_PAY.getCode());
record.setSourceType(EnumThirdOrderType.CREDIT_PAY.getCode());


//TODO 第三方获取门店(标识可能发生变化)
//TODO 第三方获取门店(标识可能发生变化)
// WxMerchant wxMerchant = wxMerchantService.getById(Long.parseLong(record.getShopNumber())); // WxMerchant wxMerchant = wxMerchantService.getById(Long.parseLong(record.getShopNumber()));
WxMerchant wxMerchant = wxMerchantService.getMerchantByEncode(record.getShopNumber());
if(wxMerchant != null){
record.setMerchantId(wxMerchant.getId());
}else{
logger.info("--第三方付款通知消息未找到门店--shopName="+record.getShopName()+"&shopNumber="+record.getShopNumber());
}
WxMerchant wxMerchant = wxMerchantService.getMerchantByEncode(record.getShopNumber());
if(wxMerchant != null){
record.setMerchantId(wxMerchant.getId());
}else{
logger.info("--第三方积分抵扣未找到门店--shopName="+record.getShopName()+"&shopNumber="+record.getShopNumber());
}


WxCreditHistory wxCreditHistory = new WxCreditHistory();
wxCreditHistory.setTenantId(record.getFinalTenantId());
wxCreditHistory.setCUserId(basicInfo.getId());
wxCreditHistory.setOperatorId(basicInfo.getId());
wxCreditHistory.setOperatorType(EnumUserType.THIRD_CIRCLE.getCode());
wxCreditHistory.setCreditNum(record.getAmount());
wxCreditHistory.setCreditType(EnumScoreType.CHANGE_CREDIT.getCode());
wxCreditHistory.setChangePurpose("第三方消费抵扣{}"+record.getSummary());
wxCreditHistory.setCouponId(record.getId());
wxCreditHistoryService.saveOrUpdate(wxCreditHistory,record.getTenantId());

wxThirdPartyOrdersMapper.insertNoticeOrder(record);
WxCreditHistory wxCreditHistory = new WxCreditHistory();
wxCreditHistory.setTenantId(record.getFinalTenantId());
wxCreditHistory.setCUserId(basicInfo.getId());
wxCreditHistory.setOperatorId(basicInfo.getId());
wxCreditHistory.setOperatorType(EnumUserType.THIRD_CIRCLE.getCode());
wxCreditHistory.setCreditNum(record.getAmount());
wxCreditHistory.setCreditType(EnumScoreType.CHANGE_CREDIT.getCode());
wxCreditHistory.setChangePurpose("第三方积分抵扣{}"+record.getSummary());
wxCreditHistory.setCouponId(record.getId());
wxCreditHistoryService.saveOrUpdate(wxCreditHistory,record.getTenantId());

wxThirdPartyOrdersMapper.insertNoticeOrder(record);
}
redisLock.unlock(lockKey, timeStr);
}else{
logger.debug("CacheAspect 读库等待中, key:{}: " + lockKey);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
redisLock.unlock(lockKey, timeStr);
}
} }



} }






+ 9
- 0
mallinkService/src/main/resources/mapper/AliBusinessCircleOrderMapper.xml Просмотреть файл

@@ -138,6 +138,15 @@
and `transaction_id` = #{transactionId} and `transaction_id` = #{transactionId}
</select> </select>


<select id="getRefundOrderByRefundId" parameterType="com.iformall.domain.po.WxThirdPartyOrders" resultMap="BaseResultMap">
select
<include refid="allColumns"/>
from ali_business_circle_order
where `is_refund` = 1
and tenant_id = #{tenantId}
and `refund_id` = #{refundId}
</select>

<select id="getRefundOrderByTransactionId" parameterType="com.iformall.domain.po.WxThirdPartyOrders" resultMap="BaseResultMap"> <select id="getRefundOrderByTransactionId" parameterType="com.iformall.domain.po.WxThirdPartyOrders" resultMap="BaseResultMap">
select select
<include refid="allColumns"/> <include refid="allColumns"/>


+ 9
- 0
mallinkService/src/main/resources/mapper/WxBusinessCircleOrderMapper.xml Просмотреть файл

@@ -159,6 +159,15 @@
and `transaction_id` = #{transactionId} and `transaction_id` = #{transactionId}
</select> </select>


<select id="getRefundOrderByRefundId" parameterType="com.iformall.domain.po.WxBusinessCircleOrder" resultMap="BaseResultMap">
select
<include refid="allColumns"/>
from wx_business_circle_order
where `is_refund` = 1
and tenant_id = #{tenantId}
and `refund_id` = #{refundId}
</select>

<select id="getRefundOrderByTransactionId" parameterType="com.iformall.domain.po.WxBusinessCircleOrder" resultMap="BaseResultMap"> <select id="getRefundOrderByTransactionId" parameterType="com.iformall.domain.po.WxBusinessCircleOrder" resultMap="BaseResultMap">
select select
<include refid="allColumns"/> <include refid="allColumns"/>


+ 9
- 0
mallinkService/src/main/resources/mapper/WxThirdPartyOrdersMapper.xml Просмотреть файл

@@ -159,6 +159,15 @@
and `transaction_id` = #{transactionId} and `transaction_id` = #{transactionId}
</select> </select>


<select id="getRefundOrderByRefundId" parameterType="com.iformall.domain.po.WxThirdPartyOrders" resultMap="BaseResultMap">
select
<include refid="allColumns"/>
from wx_third_party_orders
where `is_refund` = 1
and tenant_id = #{tenantId}
and `refund_id` = #{refundId}
</select>

<select id="getRefundOrderByTransactionId" parameterType="com.iformall.domain.po.WxThirdPartyOrders" resultMap="BaseResultMap"> <select id="getRefundOrderByTransactionId" parameterType="com.iformall.domain.po.WxThirdPartyOrders" resultMap="BaseResultMap">
select select
<include refid="allColumns"/> <include refid="allColumns"/>


Загрузка…
Отмена
Сохранить