Browse Source

Merge branch 'zx_saas_goods' of http://git.dayaedu.com/yonge/mec into test

zouxuan 1 năm trước cách đây
mục cha
commit
34a525a393

+ 1 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/SellOrderService.java

@@ -32,7 +32,7 @@ public interface SellOrderService extends BaseService<Integer, SellOrder> {
      * @param studentPaymentOrder
      * @return
      */
-    List<SellOrder> addOrderDetail2SellOrder(List<StudentPaymentOrderDetail> orderDetails, StudentPaymentOrder studentPaymentOrder, MusicGroup musicGroup,BigDecimal balancePaymentAmount);
+    void addOrderDetail2SellOrder(List<StudentPaymentOrderDetail> orderDetails, StudentPaymentOrder studentPaymentOrder, String musicGroup);
 
     void batchInsert(List<SellOrder> sellOrders);
 

+ 27 - 8
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SellOrderServiceImpl.java

@@ -274,17 +274,33 @@ public class SellOrderServiceImpl extends BaseServiceImpl<Integer, SellOrder> im
 */
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public List<SellOrder> addOrderDetail2SellOrder(List<StudentPaymentOrderDetail> orderDetails,
-                                                    StudentPaymentOrder studentPaymentOrder, MusicGroup musicGroup,BigDecimal balancePaymentAmount) {
+    public void addOrderDetail2SellOrder(List<StudentPaymentOrderDetail> orderDetails,
+                                                    StudentPaymentOrder studentPaymentOrder, String musicGroupId) {
         //过去非商品详情
         List<StudentPaymentOrderDetail> goodsOrderDetails = orderDetails.stream().filter(e -> StringUtils.isNotEmpty(e.getGoodsIdList())).collect(Collectors.toList());
         if(CollectionUtils.isEmpty(goodsOrderDetails)){
-            throw new BizException("商品详情为空");
+            return;
         }
-        //获取总减免金额
-        BigDecimal detailTotalRemitPrice = goodsOrderDetails.stream().map(StudentPaymentOrderDetail::getRemitFee).reduce(BigDecimal.ZERO, BigDecimal::add);
         //获取总金额
         BigDecimal detailTotalPrice = goodsOrderDetails.stream().map(StudentPaymentOrderDetail::getPrice).reduce(BigDecimal.ZERO, BigDecimal::add);
+        BigDecimal balancePaymentAmount = studentPaymentOrder.getBalancePaymentAmount();
+        if (balancePaymentAmount.compareTo(BigDecimal.ZERO) > 0) {
+            BigDecimal expectAmount = studentPaymentOrder.getExpectAmount();
+            BigDecimal organShareProfit = orderDetails.stream().filter(o -> o.getType() == ORGAN_SHARE_PROFIT).map(StudentPaymentOrderDetail::getPrice)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+            if(organShareProfit != null){
+                expectAmount = expectAmount.subtract(organShareProfit);
+            }
+            //获取比例
+            BigDecimal ratioAmount = BigDecimal.ZERO;
+            if(expectAmount.compareTo(BigDecimal.ZERO) > 0){
+                ratioAmount = balancePaymentAmount.divide(expectAmount, 6, BigDecimal.ROUND_HALF_UP);
+            }
+            //获取分配的减免金额
+            balancePaymentAmount = balancePaymentAmount.multiply(ratioAmount).setScale(2, BigDecimal.ROUND_HALF_UP);
+        }
+        //获取总减免金额
+        BigDecimal detailTotalRemitPrice = goodsOrderDetails.stream().map(StudentPaymentOrderDetail::getRemitFee).reduce(BigDecimal.ZERO, BigDecimal::add);
 
         List<SellOrder> sellOrders = new ArrayList<>();
 
@@ -331,9 +347,12 @@ public class SellOrderServiceImpl extends BaseServiceImpl<Integer, SellOrder> im
                 subDetailActualAmount = subDetailActualAmount.subtract(detailActualAmount);
             }
             List<Integer> goodsIds = Arrays.asList(orderDetail.getGoodsIdList().split(",")).stream().map(Integer::parseInt).collect(Collectors.toList());
-            sellOrders.addAll(this.initSellOrder(studentPaymentOrder, musicGroup.getId(), goodsIds, orderDetail.getKitGroupPurchaseType(),
+            sellOrders.addAll(this.initSellOrder(studentPaymentOrder, musicGroupId, goodsIds, orderDetail.getKitGroupPurchaseType(),
                     detailBalance, orderDetail.getPrice(), couponRemitFee, detailActualAmount, false));
         }
+        this.batchInsert(sellOrders);
+        //同步销售订单到商城
+        this.syncSellOrder2Mall(sellOrders, studentPaymentOrder);
 
 /*
             BigDecimal goodsTotalPrice = orderDetail.getGoodsList().stream().map(Goods::getGroupPurchasePrice).reduce(BigDecimal.ZERO, BigDecimal::add);
@@ -460,7 +479,6 @@ public class SellOrderServiceImpl extends BaseServiceImpl<Integer, SellOrder> im
             }
             sellOrderDao.batchInsert(sellOrders);
         }*/
-        return sellOrders;
     }
 
     @Override
@@ -681,7 +699,8 @@ public class SellOrderServiceImpl extends BaseServiceImpl<Integer, SellOrder> im
             musicGroup = musicGroupDao.get(musicGroupId);
         }
         List<Goods> goodies = goodsDao.getGoodies(goodsIds);
-        BigDecimal goodsTotalPrice = goodies.stream().map(Goods::getGroupPurchasePrice).reduce(BigDecimal.ZERO, BigDecimal::add);
+        BigDecimal goodsTotalPrice = goodies.stream().map(e->order.getGroupType() == MUSIC ?e.getGroupPurchasePrice():e.getDiscountPrice()).
+                reduce(BigDecimal.ZERO, BigDecimal::add);
 
         AccountType accountType = AccountType.INTERNAL;
         if(StringUtils.isNotEmpty(order.getPaymentChannel())){

+ 2 - 24
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderDetailServiceImpl.java

@@ -688,30 +688,8 @@ public class StudentPaymentOrderDetailServiceImpl extends BaseServiceImpl<Long,
 
         //销售订单详情
         if (allDetails.size() > 0 && (detailTypeEnums.contains(MUSICAL) || detailTypeEnums.contains(ACCESSORIES) || detailTypeEnums.contains(TEACHING))) {
-            BigDecimal balancePaymentAmount = studentPaymentOrder.getBalancePaymentAmount();
-            if (balancePaymentAmount.compareTo(BigDecimal.ZERO) > 0) {
-                BigDecimal musicFee = allDetails.stream()
-                        .filter(o -> o.getType() == MUSICAL || o.getType() == ACCESSORIES || o.getType() == TEACHING)
-                        .map(StudentPaymentOrderDetail::getPrice)
-                        .reduce(BigDecimal.ZERO, BigDecimal::add);
-                BigDecimal expectAmount = studentPaymentOrder.getExpectAmount();
-
-				BigDecimal organShareProfit = allDetails.stream().filter(o -> o.getType() == ORGAN_SHARE_PROFIT).map(StudentPaymentOrderDetail::getPrice)
-						.reduce(BigDecimal.ZERO, BigDecimal::add);
-
-				if(organShareProfit != null){
-					expectAmount = expectAmount.subtract(organShareProfit);
-				}
-                //获取比例
-                BigDecimal ratioAmount = musicFee.divide(expectAmount, 6, BigDecimal.ROUND_HALF_UP);
-                //获取分配的减免金额
-                balancePaymentAmount = balancePaymentAmount.multiply(ratioAmount).setScale(2, BigDecimal.ROUND_HALF_UP);
-            }
-            List<SellOrder> sellOrders = sellOrderService.addOrderDetail2SellOrder(allDetails, studentPaymentOrder, musicGroup, balancePaymentAmount);
-            sellOrderService.batchInsert(sellOrders);
-            sellOrderService.syncSellOrder2Mall(sellOrders, studentPaymentOrder);
-            //同步销售订单到商城
-//            sellOrderService.syncSellOrder2Mall(sellOrders,studentPaymentOrder);
+            sellOrderService.addOrderDetail2SellOrder(allDetails, studentPaymentOrder, musicGroup.getId());
+
         }
 
         //活动小课包处理

+ 9 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderServiceImpl.java

@@ -1831,6 +1831,15 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
                 model.setStatus(false);
                 order.setStatus(CLOSE);
                 order.setMemo(reason);
+            } else {
+                // 执行关单操作
+                if(StringUtils.equals(order.getPaymentChannel(), PaymentChannelEnum.ADAPAY.getCode())) {
+                    Payment.closeWithKey(order.getTransNo(),"", hfMerchantConfig.getMerKey());
+                }else if(StringUtils.equals(order.getPaymentChannel(), PaymentChannelEnum.YEEPAY.getCode())) {
+                    yeepayPaymentService.close(hfMerchantConfig, order.getTransNo(),"", order.getOrderNo());
+                }
+                model.setStatus(false);
+                order.setStatus(CLOSE);
             }
             TenantContextHolder.setTenantId(order.getTenantId());
             callOrderCallBack(order);

+ 3 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRepairServiceImpl.java

@@ -1132,7 +1132,9 @@ public class StudentRepairServiceImpl extends BaseServiceImpl<Integer, StudentRe
             //将购买的乐器加入学生乐器列表
             studentGoodsSellService.saveStudentInstrument(studentPaymentOrder);
             //购买的商品加入销售列表
-            saveSellOrder(studentPaymentOrder.getOrderNo());
+//            saveSellOrder(studentPaymentOrder.getOrderNo());
+            List<StudentPaymentOrderDetail> orderDetail = studentPaymentOrderDetailService.getOrderDetail(studentPaymentOrder.getId());
+            sellOrderService.addOrderDetail2SellOrder(orderDetail,studentPaymentOrder,null);
         } else if (studentPaymentOrder.getStatus() == DealStatusEnum.CLOSE || studentPaymentOrder.getStatus() == DealStatusEnum.FAILED) {
 
             //增加商品库存

+ 14 - 0
mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/controller/OmsOrderController.java

@@ -60,6 +60,20 @@ public class OmsOrderController {
         return CommonResult.failed("当前状态不可关闭");
     }
 
+
+    @ApiOperation("批量完成订单")
+    @RequestMapping(value = "/update/success", method = RequestMethod.POST)
+    @ResponseBody
+    public CommonResult success(@RequestBody List<Long> ids) {
+
+         int count = orderService.success(ids);
+        // if (count > 0) {
+        //     return CommonResult.success(count);
+        // }
+        return CommonResult.success(true);
+    }
+
+
     @ApiOperation("批量删除订单")
     @RequestMapping(value = "/delete", method = RequestMethod.POST)
     @ResponseBody

+ 2 - 0
mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/OmsOrderService.java

@@ -100,4 +100,6 @@ public interface OmsOrderService {
 
     // 同步订单状态,
     boolean productUpdateOrderStatus(String orderNo, Integer status);
+
+    int success(List<Long> ids);
 }

+ 25 - 0
mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/OmsOrderServiceImpl.java

@@ -790,4 +790,29 @@ public class OmsOrderServiceImpl implements OmsOrderService {
 
         return true;
     }
+
+    // 直接修改订单状态为完成
+    @Override
+    @Transactional
+    public int success(List<Long> ids) {
+        OmsOrder record = new OmsOrder();
+        record.setStatus(3);
+        OmsOrderExample example = new OmsOrderExample();
+        example.createCriteria().andDeleteStatusEqualTo(0).andIdIn(ids);
+        orderMapper.updateByExampleSelective(record, example);
+
+
+        //添加操作记录
+        List<OmsOrderOperateHistory> operateHistoryList = ids.stream()
+            .map(id -> {
+                OmsOrderOperateHistory history = new OmsOrderOperateHistory();
+                history.setOrderId(id);
+                history.setCreateTime(new Date());
+                history.setOperateMan("后台管理员");
+                history.setOrderStatus(3);
+                history.setNote("订单完成");
+                return history;
+            }).collect(Collectors.toList());
+        return orderOperateHistoryDao.insertList(operateHistoryList);
+    }
 }

+ 58 - 0
mec-thirdparty/src/main/java/com/ym/mec/thirdparty/adapay/Payment.java

@@ -5,6 +5,7 @@ import java.util.*;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+import com.google.common.collect.Lists;
 import com.huifu.adapay.core.exception.BaseAdaPayException;
 import com.huifu.adapay.core.util.StringUtil;
 import com.huifu.adapay.model.PaymentReverse;
@@ -13,6 +14,8 @@ import com.ym.mec.thirdparty.adapay.entity.BaseResult;
 import com.ym.mec.thirdparty.adapay.entity.HfMerchantConfig;
 import com.ym.mec.thirdparty.exception.ThirdpartyException;
 
+import org.apache.commons.lang3.StringUtils;
+import org.joda.time.DateTime;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.util.CollectionUtils;
@@ -198,4 +201,59 @@ public class Payment {
         }
         return BaseResult.succeed(res);
     }
+
+
+    /**
+     *
+     针对已经创建的 支付对象,您可以调用关单接口进行交易的关闭。调用此接口后,该用户订单将不再能支付成功。 对于关单功能的使用有如下规则:
+     1.存在关单记录,不能再次关单
+     2.交易时间 1分钟 内无法关单成功
+     3.正扫交易时间超过 2小时 无法关单成功
+     4.支付宝正扫接口,如果用户没有扫码,订单不能关闭成功(二维码给用户展示,如果用户没有用手机去扫码,那这笔就不能关单; 如果用户扫过了的话(无需支付成功)就可以关单了)—-微信正扫无此条限制
+     5.网银和快捷类交易都不支持关单操作
+     对于已经成功付款的订单,请使用 退款对象 接口进行退款处理。我们建议您只有针对未支付的订单调用关单接口。
+     * @param transNo 交易流水号
+     * @param reason 原因
+     * @param merchantKey 商户Key
+     * @return Map<String, Object>
+     */
+    public static Map<String ,Object> closeWithKey(String transNo, String reason, String merchantKey) {
+
+
+        Map<String, Object> result = new HashMap<>();
+
+        Map<String, Object> params = new HashMap<>();
+
+        params.put("payment_id", transNo);
+        params.put("reason", reason);
+        //params.put("notify_url", adapayPaymentConfig.getPayNotifyUrl());
+
+        Map<String, Object> paymentClose = new HashMap<>();
+        try {
+            paymentClose =  com.huifu.adapay.model.Payment.close(params, merchantKey);
+        } catch (BaseAdaPayException e) {
+            LOGGER.info("请求汇付[关单]接口失败:{}", e.getMessage());
+            result.put("status", "failed");
+            return result;
+        }
+        if (StringUtils.equals(paymentClose.get("status").toString(), "failed")) {
+            LOGGER.error("调用汇付[关单]接口同步返回,出现异常:{}", paymentClose);
+
+            // 忽略关单异常
+            // channel_close_fail 通道关单失败
+            // close_order_exists 关单记录已存在,不允许重复关单
+            List<String> errorCodes = Lists.newArrayList("close_order_exists"); // "channel_close_fail", "frequent_request"
+            // 关单记录已存在,不允许重复关单,重复关单会不抛出异常,只记录异常信息
+            if (errorCodes.contains(paymentClose.get("error_code").toString())) {
+                LOGGER.warn("调用汇付[关单]接口同步返回,出现异常:{}", paymentClose);
+
+                result.put("status", "success");
+            }
+            result.put("status", "failed");
+            // throw new PaymentException(paymentClose.get("error_msg").toString());
+        }
+
+        return result;
+    }
+
 }

+ 58 - 2
mec-thirdparty/src/main/java/com/ym/mec/thirdparty/yeepay/YeepayPaymentService.java

@@ -1,9 +1,11 @@
 package com.ym.mec.thirdparty.yeepay;
 
 import java.io.IOException;
-import java.util.Date;
-import java.util.Map;
+import java.util.*;
 
+import com.google.common.collect.Lists;
+import org.apache.commons.lang3.StringUtils;
+import org.joda.time.DateTime;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
@@ -103,4 +105,58 @@ public class YeepayPaymentService {
 		
 		return jsonObject;
 	}
+
+
+    /**
+     * 关闭订单
+     * @param transNo 交易流水号
+     * @param reason 原因
+     * @return Map<String, Object>
+     */
+    public Map<String,Object> close(HfMerchantConfig hfMerchantConfig,String transNo, String reason, String outTransNo) {
+
+
+        Map<String, Object> result = new HashMap<>();
+        result.put("status", "failed");
+        try {
+
+            // 订单参数
+            YopRequest request = new YopRequest(hfMerchantConfig.getAppId(), hfMerchantConfig.getRsaPrivateKey())
+                .addParam("parentMerchantNo", hfMerchantConfig.getPlatformPayeeMemberId())
+                .addParam("merchantNo", hfMerchantConfig.getPlatformPayeeMemberId())
+                .addParam("uniqueOrderNo", transNo)
+                .addParam("orderId", outTransNo);
+
+            LOGGER.info("易宝[关闭订单] Req:{}", request.getParams());
+
+            // 关闭订单
+            YopResponse ret = YopRsaClient.post("/rest/v1.0/trade/order/close", request);
+            LOGGER.info("易宝[关闭订单]返回结果:transNo={}, {}", transNo, ret.getStringResult());
+
+            // 关闭订单异常消息
+            if (Objects.nonNull(ret.getError())) {
+                LOGGER.error("易宝[关闭订单]接口失败:transNo={}, reason={}", transNo, reason, ret.getError());
+                result.put("status", "failed");
+            }
+
+            JSONObject jsonObject = JSON.parseObject(ret.getStringResult());
+
+            // 关闭订单成功
+            // OPR00000	成功
+            // OPR18015	已拒绝支付,不必关闭订单
+            // OPR18017	订单已过期,不必关闭订单
+            ArrayList<String> retCodes = Lists.newArrayList("OPR00000", "OPR18015", "OPR18017");
+            if (retCodes.contains(jsonObject.getString("code"))) {
+                result.put("status", "success");
+            }
+
+        } catch (Exception e) {
+            LOGGER.error("易宝[关闭订单]接口失败:transNo={}, reason={}", transNo, reason, e);
+            result.put("status", "failed");
+
+        }
+
+
+        return result;
+    }
 }