| @@ -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); | ||||
| @@ -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); | ||||
| /** | /** | ||||
| @@ -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); | ||||
| /** | /** | ||||
| @@ -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); | ||||
| /** | /** | ||||
| @@ -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); | ||||
| @@ -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,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); | ||||
| @@ -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); | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| @@ -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); | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| @@ -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); | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| @@ -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"/> | ||||
| @@ -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"/> | ||||
| @@ -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"/> | ||||