| @@ -90,6 +90,7 @@ public class UserThirdCircleOrderController extends BaseController { | |||
| thirdPartyOrders.setUserPhone(userPhone); | |||
| thirdPartyOrders.setTimeEnd(timeEndDate); | |||
| thirdPartyOrders.setAmount(amount); | |||
| thirdPartyOrders.setPayAmount(amount); | |||
| thirdPartyOrders.setSummary(summary); | |||
| try{ | |||
| thirdPartyOrdersService.createOrder(thirdPartyOrders); | |||
| @@ -14,6 +14,7 @@ public interface AliBusinessCircleOrderMapper extends CommonMapper<AliBusinessCi | |||
| AliBusinessCircleOrder getById(AliBusinessCircleOrder record); | |||
| AliBusinessCircleOrder getOrderByTransactionId(AliBusinessCircleOrder record); | |||
| AliBusinessCircleOrder getRefundOrderByRefundId(AliBusinessCircleOrder record); | |||
| List<AliBusinessCircleOrder> getRefundOrderByTransactionId(AliBusinessCircleOrder record); | |||
| /** | |||
| @@ -12,6 +12,7 @@ public interface WxBusinessCircleOrderMapper extends CommonMapper<WxBusinessCirc | |||
| WxBusinessCircleOrder getById(WxBusinessCircleOrder record); | |||
| WxBusinessCircleOrder getOrderByTransactionId(WxBusinessCircleOrder record); | |||
| WxBusinessCircleOrder getRefundOrderByRefundId(WxBusinessCircleOrder record); | |||
| List<WxBusinessCircleOrder> getRefundOrderByTransactionId(WxBusinessCircleOrder record); | |||
| /** | |||
| @@ -14,6 +14,7 @@ public interface WxThirdPartyOrdersMapper extends CommonMapper<WxThirdPartyOrder | |||
| WxThirdPartyOrders getById(WxThirdPartyOrders record); | |||
| WxThirdPartyOrders getOrderByTransactionId(WxThirdPartyOrders record); | |||
| WxThirdPartyOrders getRefundOrderByRefundId(WxThirdPartyOrders record); | |||
| List<WxThirdPartyOrders> getRefundOrderByTransactionId(WxThirdPartyOrders record); | |||
| /** | |||
| @@ -31,6 +31,7 @@ public interface AliBusinessCircleOrderService { | |||
| * @return | |||
| */ | |||
| AliBusinessCircleOrder getOrderByTransactionId(String transactionId, String tenantId); | |||
| AliBusinessCircleOrder getRefundOrderByRefundId(String refundId, String tenantId); | |||
| List<AliBusinessCircleOrder> getRefundOrderByTransactionId(String transactionId, String tenantId); | |||
| @@ -2,7 +2,6 @@ package com.iformall.service; | |||
| import com.github.pagehelper.PageInfo; | |||
| import com.iformall.domain.po.WxBusinessCircleOrder; | |||
| import org.springframework.scheduling.annotation.Async; | |||
| import java.util.List; | |||
| @@ -32,6 +31,7 @@ public interface WxBusinessCircleOrderService { | |||
| * @return | |||
| */ | |||
| WxBusinessCircleOrder getOrderByTransactionId(String transactionId, String tenantId); | |||
| WxBusinessCircleOrder getRefundOrderByRefundId(String refundId, String tenantId); | |||
| List<WxBusinessCircleOrder> getRefundOrderByTransactionId(String transactionId, String tenantId); | |||
| void createOrder(WxBusinessCircleOrder record); | |||
| @@ -1,7 +1,6 @@ | |||
| package com.iformall.service; | |||
| import com.github.pagehelper.PageInfo; | |||
| import com.iformall.domain.po.WxBusinessCircleOrder; | |||
| import com.iformall.domain.po.WxThirdPartyOrders; | |||
| import com.iformall.enums.EnumThirdOrderType; | |||
| @@ -33,6 +32,7 @@ public interface WxThirdPartyOrdersService { | |||
| * @return | |||
| */ | |||
| WxThirdPartyOrders getOrderByTransactionId(EnumThirdOrderType orderType, String transactionId, String tenantId); | |||
| WxThirdPartyOrders getRefundOrderByRefundId(String refundId, String tenantId); | |||
| List<WxThirdPartyOrders> getRefundOrderByTransactionId(EnumThirdOrderType orderType, String transactionId, String tenantId); | |||
| @@ -1,13 +1,10 @@ | |||
| package com.iformall.service.impl; | |||
| import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; | |||
| import com.github.pagehelper.PageHelper; | |||
| import com.github.pagehelper.PageInfo; | |||
| import com.iformall.common.ErrorCode; | |||
| import com.iformall.common.IdWorker; | |||
| import com.iformall.domain.po.*; | |||
| import com.iformall.enums.*; | |||
| import com.iformall.exception.MallinkException; | |||
| import com.iformall.mapper.AliBusinessCircleOrderMapper; | |||
| import com.iformall.service.*; | |||
| import com.iformall.utils.RedisLock; | |||
| @@ -68,6 +65,14 @@ public class AliBusinessCircleOrderServiceImpl implements AliBusinessCircleOrder | |||
| 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 | |||
| public List<AliBusinessCircleOrder> getRefundOrderByTransactionId(String transactionId, String tenantId) { | |||
| AliBusinessCircleOrder recordQ = new AliBusinessCircleOrder(); | |||
| @@ -165,89 +170,96 @@ public class AliBusinessCircleOrderServiceImpl implements AliBusinessCircleOrder | |||
| @Override | |||
| 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{ | |||
| 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); | |||
| }else{ | |||
| logger.debug("CacheAspect 读库等待中, key:{}: " + lockKey); | |||
| try { | |||
| Thread.sleep(2000); | |||
| } catch (InterruptedException e) { | |||
| e.printStackTrace(); | |||
| }finally { | |||
| redisLock.unlock(lockKey, timeStr); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| @@ -3,13 +3,12 @@ package com.iformall.service.impl; | |||
| import com.github.pagehelper.PageHelper; | |||
| import com.github.pagehelper.PageInfo; | |||
| 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.mapper.WxBusinessCircleOrderMapper; | |||
| import com.iformall.service.*; | |||
| import com.iformall.utils.RedisLock; | |||
| import org.apache.commons.lang3.StringUtils; | |||
| import org.slf4j.Logger; | |||
| import org.slf4j.LoggerFactory; | |||
| 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 static final String WX_CIRCLE_KEY = "CIRCLE:WX:"; | |||
| @Autowired | |||
| RedisLock redisLock; | |||
| @Autowired | |||
| WxBusinessCircleOrderMapper wxBusinessCircleOrderMapper; | |||
| @@ -61,6 +65,14 @@ public class WxBusinessCircleOrderServiceImpl implements WxBusinessCircleOrderSe | |||
| 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 | |||
| public List<WxBusinessCircleOrder> getRefundOrderByTransactionId(String transactionId, String tenantId) { | |||
| WxBusinessCircleOrder recordQ = new WxBusinessCircleOrder(); | |||
| @@ -71,129 +83,57 @@ public class WxBusinessCircleOrderServiceImpl implements WxBusinessCircleOrderSe | |||
| @Override | |||
| 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(); | |||
| 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())){ | |||
| //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(); | |||
| creditHistory.setTenantId(record.getFinalTenantId()); | |||
| creditHistory.setOperatorType(EnumUserType.BUSINESS_CIRCLE.getCode()); | |||
| creditHistory.setOperatorId(record.getCUserId()); | |||
| creditHistory.setCUserId(record.getCUserId()); | |||
| creditHistory.setCreateDate(new Date()); | |||
| creditHistory.setCreateDate(now); | |||
| creditHistory.setCouponId(record.getId()); | |||
| creditHistory.setBusinessId(businessId); | |||
| 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()); | |||
| Integer creditNum = 0; | |||
| if (creditHistory.getCreditNum() != null) { | |||
| @@ -202,12 +142,121 @@ public class WxBusinessCircleOrderServiceImpl implements WxBusinessCircleOrderSe | |||
| if(creditNum == 0){ | |||
| return; | |||
| } | |||
| record.setIncreasedPoints(creditNum); | |||
| record.setPointsUpdateTime(creditHistory.getCreateDate()); | |||
| 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); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| @@ -9,6 +9,7 @@ import com.iformall.enums.*; | |||
| import com.iformall.exception.MallinkException; | |||
| import com.iformall.mapper.WxThirdPartyOrdersMapper; | |||
| import com.iformall.service.*; | |||
| import com.iformall.utils.RedisLock; | |||
| import org.apache.commons.lang3.StringUtils; | |||
| import org.slf4j.Logger; | |||
| import org.slf4j.LoggerFactory; | |||
| @@ -24,8 +25,14 @@ import static org.springframework.transaction.annotation.Propagation.REQUIRED; | |||
| @Service | |||
| public class WxThirdPartyOrdersServiceImpl implements WxThirdPartyOrdersService { | |||
| private final Logger logger = LoggerFactory.getLogger(this.getClass()); | |||
| private static final String THIRD_CIRCLE_KEY = "CIRCLE:TH:"; | |||
| @Autowired | |||
| RedisLock redisLock; | |||
| @Autowired | |||
| WxThirdPartyOrdersMapper wxThirdPartyOrdersMapper; | |||
| @@ -65,6 +72,14 @@ public class WxThirdPartyOrdersServiceImpl implements WxThirdPartyOrdersService | |||
| 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 | |||
| public List<WxThirdPartyOrders> getRefundOrderByTransactionId(EnumThirdOrderType orderType, String transactionId, String tenantId) { | |||
| WxThirdPartyOrders recordQ = new WxThirdPartyOrders(); | |||
| @@ -76,74 +91,89 @@ public class WxThirdPartyOrdersServiceImpl implements WxThirdPartyOrdersService | |||
| @Override | |||
| 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.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){ | |||
| logger.error("--第三方退款--付款消息未找到--transactionId="+record.getTransactionId()); | |||
| 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{ | |||
| 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{ | |||
| 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 | |||
| @@ -249,42 +299,58 @@ public class WxThirdPartyOrdersServiceImpl implements WxThirdPartyOrdersService | |||
| 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.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); | |||
| } | |||
| } | |||
| } | |||
| @@ -138,6 +138,15 @@ | |||
| and `transaction_id` = #{transactionId} | |||
| </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 | |||
| <include refid="allColumns"/> | |||
| @@ -159,6 +159,15 @@ | |||
| and `transaction_id` = #{transactionId} | |||
| </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 | |||
| <include refid="allColumns"/> | |||
| @@ -159,6 +159,15 @@ | |||
| and `transaction_id` = #{transactionId} | |||
| </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 | |||
| <include refid="allColumns"/> | |||