|
|
@@ -12,10 +12,12 @@ import com.gree.mall.manager.bean.admin.AdminUserCom;
|
|
|
import com.gree.mall.manager.bean.supply.funds.CustomerWalletBean;
|
|
|
import com.gree.mall.manager.bean.supply.order.*;
|
|
|
import com.gree.mall.manager.commonmapper.CommonMapper;
|
|
|
+import com.gree.mall.manager.constant.Constant;
|
|
|
import com.gree.mall.manager.enums.ExamineStatusEnum;
|
|
|
import com.gree.mall.manager.enums.material.DirectFlagEnum;
|
|
|
import com.gree.mall.manager.enums.material.StateEnum;
|
|
|
import com.gree.mall.manager.enums.supply.BalanceTypeEnum;
|
|
|
+import com.gree.mall.manager.enums.supply.PolicyTypeEnum;
|
|
|
import com.gree.mall.manager.exception.RemoteServiceException;
|
|
|
import com.gree.mall.manager.logic.common.CommonLogic;
|
|
|
import com.gree.mall.manager.logic.supply.funds.CompanyWalletLogic;
|
|
|
@@ -29,12 +31,15 @@ import lombok.RequiredArgsConstructor;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
import org.springframework.beans.BeanUtils;
|
|
|
+import org.springframework.integration.redis.util.RedisLockRegistry;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
import java.math.RoundingMode;
|
|
|
import java.util.*;
|
|
|
+import java.util.concurrent.TimeUnit;
|
|
|
+import java.util.concurrent.locks.Lock;
|
|
|
import java.util.function.Function;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
@@ -57,6 +62,7 @@ public class RetailOrderLogic {
|
|
|
private final WalletService walletService;
|
|
|
private final RebateTypeService rebateTypeService;
|
|
|
private final RefundOrderItemService refundOrderItemService;
|
|
|
+ private final RedisLockRegistry redisLockRegistry;
|
|
|
|
|
|
public IPage<RetailOrderVO> list(ZfireParamBean zfireParamBean) {
|
|
|
AdminUserCom adminUser = commonLogic.getAdminUser();
|
|
|
@@ -249,6 +255,26 @@ public class RetailOrderLogic {
|
|
|
* @param retailOrderItemList 如果是配提政策,前端传表体的policyMaterialId 其实是policy_condition_material的id,需注意
|
|
|
*/
|
|
|
public void addRetailOrderItem(RetailOrder retailOrder, List<RetailOrderItemBean> retailOrderItemList, Policy policy, Boolean add) throws InterruptedException {
|
|
|
+ // 检查是否限量政策单并且限最大引用数
|
|
|
+ if (Objects.nonNull(policy) && policy.getType().equals(PolicyTypeEnum.LIMIT.getKey())) {
|
|
|
+ // 以商户+销售政策单号为锁
|
|
|
+ Lock obtain = redisLockRegistry.obtain(Constant.RedisPrefix.LOCK_ORDER + retailOrder.getCompanyWechatId() + policy.getId());
|
|
|
+ if (!obtain.tryLock(5, TimeUnit.SECONDS)) {
|
|
|
+ throw new RemoteServiceException("系统繁忙,请稍后再试");
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ Integer refPolicyCount = retailOrderService.lambdaQuery()
|
|
|
+ .eq(RetailOrder::getCompanyWechatId, retailOrder.getCompanyWechatId())
|
|
|
+ .eq(RetailOrder::getPolicyId, policy.getId())
|
|
|
+ .count();
|
|
|
+
|
|
|
+ if (refPolicyCount > policy.getMaxBuyNum()) {
|
|
|
+ throw new RemoteServiceException("已到达政策最大引用数");
|
|
|
+ }
|
|
|
+ } finally {
|
|
|
+ obtain.unlock();
|
|
|
+ }
|
|
|
+ }
|
|
|
String retailOrderId = retailOrder.getId();
|
|
|
Integer type = retailOrder.getType();
|
|
|
|
|
|
@@ -544,20 +570,20 @@ public class RetailOrderLogic {
|
|
|
RetailOrder retailOrder = retailOrderService.getById(retailOrderAdd.getId());
|
|
|
Policy policy = null;
|
|
|
String policyId = retailOrderAdd.getPolicyId();
|
|
|
- if(retailOrderAdd.getType() != null && retailOrderAdd.getType() == 2){
|
|
|
- policy = this.checkPolicy(policyId,adminUser,retailOrder.getCompanyWechatId());
|
|
|
+ if (retailOrderAdd.getType() != null && retailOrderAdd.getType() == 2) {
|
|
|
+ policy = this.checkPolicy(policyId, adminUser, retailOrder.getCompanyWechatId());
|
|
|
}
|
|
|
|
|
|
retailOrder.setId(retailOrderAdd.getId());
|
|
|
retailOrder.setRemark(retailOrderAdd.getRemark());
|
|
|
|
|
|
retailOrder.setFileNo(retailOrderAdd.getFileNo());
|
|
|
- if(CollectionUtils.isNotEmpty(retailOrderAdd.getRetailOrderItemList())) {
|
|
|
+ if (CollectionUtils.isNotEmpty(retailOrderAdd.getRetailOrderItemList())) {
|
|
|
//处理明细
|
|
|
- this.addRetailOrderItem(retailOrder, retailOrderAdd.getRetailOrderItemList(),policy,false);
|
|
|
+ this.addRetailOrderItem(retailOrder, retailOrderAdd.getRetailOrderItemList(), policy, false);
|
|
|
}
|
|
|
|
|
|
- if(Objects.nonNull(policy)){
|
|
|
+ if (Objects.nonNull(policy)) {
|
|
|
retailOrder.setPolicyId(policyId);
|
|
|
retailOrder.setPolicyCode(policy.getCode());
|
|
|
retailOrder.setPolicyTitle(policy.getTitle());
|
|
|
@@ -568,14 +594,13 @@ public class RetailOrderLogic {
|
|
|
}
|
|
|
|
|
|
|
|
|
-
|
|
|
/**
|
|
|
* 撤回提审
|
|
|
*/
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
public void submitCancel(String id) throws Exception {
|
|
|
RetailOrder retailOrder = retailOrderService.getById(id);
|
|
|
- if(!retailOrder.getExamineStatus().equals(ExamineStatusEnum.WAIT.toString())){
|
|
|
+ if (!retailOrder.getExamineStatus().equals(ExamineStatusEnum.WAIT.toString())) {
|
|
|
throw new RemoteServiceException("无法撤回提审");
|
|
|
}
|
|
|
retailOrder.setExamineStatus(ExamineStatusEnum.SAVE.toString());
|
|
|
@@ -588,6 +613,7 @@ public class RetailOrderLogic {
|
|
|
|
|
|
/**
|
|
|
* 退订
|
|
|
+ *
|
|
|
* @param retailOrderRefundBean 退订的商品明细
|
|
|
* @return
|
|
|
* @throws Exception
|
|
|
@@ -596,7 +622,7 @@ public class RetailOrderLogic {
|
|
|
public List<Map<String, Object>> refund(RetailOrderRefundBean retailOrderRefundBean) throws Exception {
|
|
|
List<RetailOrderItemBean> retailOrderItemList = retailOrderRefundBean.getRetailOrderItemList();
|
|
|
RetailOrder retailOrder = retailOrderService.getById(retailOrderRefundBean.getId());
|
|
|
- if(!retailOrder.getExamineStatus().equals(ExamineStatusEnum.OK.toString())){
|
|
|
+ if (!retailOrder.getExamineStatus().equals(ExamineStatusEnum.OK.toString())) {
|
|
|
throw new RemoteServiceException("非审核通过订单不可退订");
|
|
|
}
|
|
|
AdminUserCom adminUser = commonLogic.getAdminUser();
|
|
|
@@ -607,13 +633,13 @@ public class RetailOrderLogic {
|
|
|
|
|
|
List<RetailOrderItem> execRecords = new ArrayList<>();
|
|
|
List<RetailOrderItem> updateItems = new ArrayList<>();
|
|
|
- for(RetailOrderItemBean retailOrderItem : retailOrderItemList) {
|
|
|
+ for (RetailOrderItemBean retailOrderItem : retailOrderItemList) {
|
|
|
RetailOrderItem item = retailOrderItemService.getById(retailOrderItem.getId());
|
|
|
|
|
|
//退订数量
|
|
|
int tdQty = (retailOrderItem.getTdQty() == null ? 0 : retailOrderItem.getTdQty());
|
|
|
//订单明细的退订
|
|
|
- Map<String, Object> paramsMap = this.refundItem(item,tdQty);
|
|
|
+ Map<String, Object> paramsMap = this.refundItem(item, tdQty);
|
|
|
resultMap.add(paramsMap);
|
|
|
|
|
|
if (tdQty > 0 && Objects.nonNull(paramsMap.get("execRecord")))
|
|
|
@@ -640,8 +666,8 @@ public class RetailOrderLogic {
|
|
|
List<RetailOrderItemBean> retailOrderItemBeans = new ArrayList<>();
|
|
|
List<RetailOrderItem> retailOrderItemList = retailOrderItemService.lambdaQuery().eq(RetailOrderItem::getRetailOrderId, retailOrder.getId()).list();
|
|
|
|
|
|
- for(RetailOrderItem item : retailOrderItemList){
|
|
|
- if(item.getRefundableQty().intValue() != item.getOldQty().intValue()){
|
|
|
+ for (RetailOrderItem item : retailOrderItemList) {
|
|
|
+ if (item.getRefundableQty().intValue() != item.getOldQty().intValue()) {
|
|
|
throw new RemoteServiceException("检测到订单数量与订单原数量有变动,不可弃审");
|
|
|
}
|
|
|
RetailOrderItemBean retailOrderItemBean = new RetailOrderItemBean();
|
|
|
@@ -654,28 +680,29 @@ public class RetailOrderLogic {
|
|
|
|
|
|
/**
|
|
|
* 订单明细退订处理(不处理钱包的钱,只处理明细数量和订单里的钱)
|
|
|
+ *
|
|
|
* @param retailOrderItem 订单明细
|
|
|
- * @param itemTdQty 退订明细数量
|
|
|
+ * @param itemTdQty 退订明细数量
|
|
|
* @return 退订现金金额
|
|
|
*/
|
|
|
- public Map<String, Object> refundItem(RetailOrderItem retailOrderItem, Integer itemTdQty){
|
|
|
+ public Map<String, Object> refundItem(RetailOrderItem retailOrderItem, Integer itemTdQty) {
|
|
|
RetailOrderItem item = retailOrderItemService.getById(retailOrderItem.getId());
|
|
|
//退订数量
|
|
|
int tdQty = (itemTdQty == null ? 0 : itemTdQty);
|
|
|
|
|
|
//退订金额
|
|
|
BigDecimal tdAmount = retailOrderItem.getSinglePayPrice().multiply(BigDecimal.valueOf(tdQty));
|
|
|
- if(item.getQty() == tdQty){
|
|
|
+ if (item.getQty() == tdQty) {
|
|
|
tdAmount = retailOrderItem.getPayAmount();
|
|
|
}
|
|
|
//退订的实际返利金额
|
|
|
BigDecimal tdPayRebateAmount = retailOrderItem.getSingleRebateAmount().multiply(BigDecimal.valueOf(tdQty));
|
|
|
- if(item.getQty() == tdQty){
|
|
|
+ if (item.getQty() == tdQty) {
|
|
|
tdPayRebateAmount = retailOrderItem.getPayRebateAmount();
|
|
|
}
|
|
|
//退订折扣金额
|
|
|
BigDecimal tdDiscAmount = retailOrderItem.getDiscAmount().multiply(BigDecimal.valueOf(tdQty));
|
|
|
- if(item.getQty() == tdQty){
|
|
|
+ if (item.getQty() == tdQty) {
|
|
|
tdDiscAmount = retailOrderItem.getTotalDiscAmount();
|
|
|
}
|
|
|
//剩余金额
|
|
|
@@ -685,10 +712,10 @@ public class RetailOrderLogic {
|
|
|
//剩余折扣金额
|
|
|
BigDecimal balanceDiscAmount = retailOrderItem.getTotalDiscAmount().subtract(tdDiscAmount);
|
|
|
|
|
|
- if(tdQty < 0){
|
|
|
+ if (tdQty < 0) {
|
|
|
throw new RemoteServiceException("退订数量不可为负数");
|
|
|
}
|
|
|
- if(tdQty > item.getRefundableQty()){
|
|
|
+ if (tdQty > item.getRefundableQty()) {
|
|
|
throw new RemoteServiceException("机型:" + item.getSpecsName() + "退订数量不可大于可退数量");
|
|
|
}
|
|
|
//处理数量
|
|
|
@@ -764,15 +791,15 @@ public class RetailOrderLogic {
|
|
|
public void examine(String id, String examineStatus, String examineRemark, String remark, String fileNo) throws Exception {
|
|
|
AdminUserCom adminUser = commonLogic.getAdminUser();
|
|
|
RetailOrder retailOrder = retailOrderService.getById(id);
|
|
|
- if(!retailOrder.getExamineStatus().equals(ExamineStatusEnum.WAIT.toString())){
|
|
|
+ if (!retailOrder.getExamineStatus().equals(ExamineStatusEnum.WAIT.toString())) {
|
|
|
throw new RemoteServiceException("非待审核单据不可审核");
|
|
|
}
|
|
|
- if(adminUser.getType() != 2){
|
|
|
+ if (adminUser.getType() != 2) {
|
|
|
throw new RemoteServiceException("暂无权限操作");
|
|
|
}
|
|
|
//驳回直接变回保存状态
|
|
|
retailOrder.setRemark(remark);
|
|
|
- retailOrder.setExamineStatus(examineStatus.equals(ExamineStatusEnum.FAIL.getKey())?ExamineStatusEnum.SAVE.getKey():examineStatus);
|
|
|
+ retailOrder.setExamineStatus(examineStatus.equals(ExamineStatusEnum.FAIL.getKey()) ? ExamineStatusEnum.SAVE.getKey() : examineStatus);
|
|
|
retailOrder.setExamineRemark(examineRemark);
|
|
|
retailOrder.setExamineBy(adminUser.getNickName());
|
|
|
retailOrder.setExamineTime(new Date());
|
|
|
@@ -782,9 +809,9 @@ public class RetailOrderLogic {
|
|
|
.eq(RetailOrderItem::getRetailOrderId, id).list();
|
|
|
|
|
|
//审核通过
|
|
|
- if(StringUtils.equals(examineStatus,ExamineStatusEnum.OK.toString())){
|
|
|
+ if (StringUtils.equals(examineStatus, ExamineStatusEnum.OK.toString())) {
|
|
|
|
|
|
- }else if(StringUtils.equals(examineStatus,ExamineStatusEnum.FAIL.toString())){
|
|
|
+ } else if (StringUtils.equals(examineStatus, ExamineStatusEnum.FAIL.toString())) {
|
|
|
//全退
|
|
|
this.refundAll(retailOrder, false);
|
|
|
}
|
|
|
@@ -793,12 +820,12 @@ public class RetailOrderLogic {
|
|
|
}
|
|
|
|
|
|
@Transactional
|
|
|
- public void delete(String id){
|
|
|
+ public void delete(String id) {
|
|
|
RetailOrder retailOrder = retailOrderService.getById(id);
|
|
|
- if(!retailOrder.getExamineStatus().equals(ExamineStatusEnum.SAVE.toString())){
|
|
|
+ if (!retailOrder.getExamineStatus().equals(ExamineStatusEnum.SAVE.toString())) {
|
|
|
throw new RemoteServiceException("非保存状态不可删除");
|
|
|
}
|
|
|
retailOrder.deleteById();
|
|
|
- retailOrderItemService.lambdaUpdate().eq(RetailOrderItem::getRetailOrderId,id).remove();
|
|
|
+ retailOrderItemService.lambdaUpdate().eq(RetailOrderItem::getRetailOrderId, id).remove();
|
|
|
}
|
|
|
}
|