From 7e6a42fdddef2cc7981d736a138c719aba53563c Mon Sep 17 00:00:00 2001
From: JiangYouYao <ak473600000>
Date: Fri, 11 Mar 2022 18:12:04 +0800
Subject: [PATCH] 重构:充值卡

---
 zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysOrderServiceImpl.java |  255 ++++++++++++++++++++++++++++----------------------
 1 files changed, 141 insertions(+), 114 deletions(-)

diff --git a/zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysOrderServiceImpl.java b/zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysOrderServiceImpl.java
index 879b5ba..ce7fac0 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysOrderServiceImpl.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysOrderServiceImpl.java
@@ -1,6 +1,8 @@
 package com.matrix.system.hive.service.imp;
 
+import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollectionUtil;
+import com.google.common.collect.Lists;
 import com.matrix.component.asyncmessage.AsyncMessageManager;
 import com.matrix.core.constance.MatrixConstance;
 import com.matrix.core.exception.GlobleException;
@@ -20,9 +22,15 @@
 import com.matrix.system.common.constance.AppConstance;
 import com.matrix.system.common.dao.BusParameterSettingsDao;
 import com.matrix.system.common.dao.SysUsersDao;
+import com.matrix.system.common.service.OperationLogService;
 import com.matrix.system.constance.Dictionary;
+import com.matrix.system.enums.BooleanEnum;
+import com.matrix.system.enums.OperationButtonEnum;
+import com.matrix.system.enums.OperationFunctionEnum;
 import com.matrix.system.hive.bean.*;
 import com.matrix.system.hive.dao.*;
+import com.matrix.system.hive.dto.GoodsSealLimitDto;
+import com.matrix.system.hive.dto.SysOrderItemDto;
 import com.matrix.system.hive.plugin.util.CollectionUtils;
 import com.matrix.system.hive.plugin.util.MoneyUtil;
 import com.matrix.system.hive.pojo.CzXkVo;
@@ -126,6 +134,17 @@
     @Autowired
     private AsyncMessageManager asyncMessageManager;
 
+    @Autowired
+    private OperationLogService operationLogService;
+
+    @Autowired
+    private SysVipInfoService sysVipInfoService;
+
+    @Autowired
+    private SysOrderServiceHelper sysOrderServiceHelper;
+
+
+
 
     @Override
     public int add(SysOrder sysOrder) {
@@ -184,6 +203,7 @@
 
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public SysOrder checkAndSaveOrder(SysOrder sysOrder) {
 
         // 计算订单折扣金额,收款情况下 计算订单总额
@@ -233,12 +253,27 @@
             //新增订单
             sysOrder.setOrderNo(codeService.getOrderCode());
             sysOrderDao.insert(sysOrder);
+            //保存单据日志
+            operationLogService.saveOperation(sysOrder.getCompanyId(), sysOrder.getShopId(), user.getSuId(),
+                    OperationFunctionEnum.ORDER,
+                    OperationButtonEnum.CREATE,
+                    sysOrder.getId(),
+                    sysOrder.getOrderNo(),
+                    sysOrder.getVipId());
 
         } else {
             //更新订单
             sysOrderDao.update(sysOrder);
             //删除原有订单明细
             orderItemDao.deleteByOrderId(sysOrder.getId());
+            //保存单据日志
+            operationLogService.saveOperation(sysOrder.getCompanyId(), sysOrder.getShopId(), user.getSuId(),
+                    OperationFunctionEnum.ORDER,
+                    OperationButtonEnum.UPDATE,
+                    sysOrder.getId(),
+                    sysOrder.getOrderNo(),
+                    sysOrder.getVipId(),
+                    "修改订单内容");
         }
 
         sysOrder.getItems().forEach(sysOrderItem -> {
@@ -266,9 +301,10 @@
      */
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public int cancelOrder(Long id) {
+    public void cancelOrder(Long id) {
 
         SysOrder order = sysOrderDao.selectById(id);
+        SysUsers sysUsers = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
         if (order.getStatu().equals(Dictionary.ORDER_STATU_DFK)) {
 
             order.setStatu(Dictionary.ORDER_STATU_YQX);
@@ -277,10 +313,17 @@
             //发送微信公众号提醒
             UniformMsgParam uniformMsgParam = new UniformMsgParam(order.getCompanyId(), UniformMsgParam.GZH_DDQX);
             uniformMsgParam.put("orderId", order.getId());
-            asyncMessageManager.sendMsg(AsyncMessageRouting.SEND_UNIFORM_TEMPLATE_MSG ,uniformMsgParam);
+            asyncMessageManager.sendMsg(AsyncMessageRouting.SEND_UNIFORM_TEMPLATE_MSG, uniformMsgParam);
 
-            return sysOrderDao.update(order);
-
+            sysOrderDao.update(order);
+            //保存单据日志
+            operationLogService.saveOperation(order.getCompanyId(), order.getShopId(),sysUsers.getSuId(),
+                    OperationFunctionEnum.ORDER,
+                    OperationButtonEnum.CANCEL,
+                    order.getId(),
+                    order.getOrderNo(),
+                    order.getVipId(),
+                    "未付款取消订单");
         } else {
 
             //一个订单只能被取消一次
@@ -377,8 +420,18 @@
 
             // 取消订单
             order.setStatu(Dictionary.ORDER_STATU_YQX);
-            return sysOrderDao.update(order);
+            sysOrderDao.update(order);
+            //保存单据日志
+            operationLogService.saveOperation(order.getCompanyId(), order.getShopId(),sysUsers.getSuId(),
+                    OperationFunctionEnum.ORDER,
+                    OperationButtonEnum.CANCEL,
+                    order.getId(),
+                    order.getOrderNo(),
+                    order.getVipId(),
+                    "已付款取消订单");
         }
+
+
 
     }
 
@@ -473,27 +526,17 @@
     @Transactional(rollbackFor = Exception.class)
     public void updateReceiptMoney(SysOrder pageOrder) throws GlobleException {
 
-        if (!Dictionary.ORDER_STATU_DFK.equals(pageOrder.getStatu())) {
-            throw new GlobleException("该订单已经收过款,请刷新页面再试!");
-        }
-
-
+        //校验订单是否满足收款条件
         checkOrder(pageOrder);
 
-
-        // 更新收款时间
+        // 更新订单主表信息
         updateOrderInfo(pageOrder);
 
-        // 获取用户信息
-        SysVipInfo vipInfo = sysVipInfoDao.selectById(pageOrder.getVipId());
-        if (SysVipInfo.UNDEAL_VIP == vipInfo.getIsDeal()) {
-            //非成交客户下单更新客户为成交客户
-            vipInfo.setIsDeal(SysVipInfo.DEAL_VIP);
-            sysVipInfoDao.update(vipInfo);
-        }
+        // 设置用户为成交客户
+        sysVipInfoService.updateDealStatus(pageOrder.getVipId(), BooleanEnum.TRUE.getValue());
 
         //添加支付流水
-        addOrderFlow(pageOrder);
+        sysOrderServiceHelper.addOrderFlow(pageOrder);
 
         // 设置会员充值卡使用情况
         addMoneyCardUse(pageOrder);
@@ -512,14 +555,39 @@
         //设置会员积分
         addVipScore(pageOrder);
 
+        //保存订单收款日志
+        saveOrderSkLog(pageOrder);
+
     }
+
+
+    /**
+     * 保存订单收款日志
+     * @param pageOrder
+     */
+    private void saveOrderSkLog(SysOrder pageOrder) {
+        SysUsers user = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
+        operationLogService.saveOperation(pageOrder.getCompanyId(), pageOrder.getShopId(), user.getSuId(),
+                OperationFunctionEnum.ORDER,
+                OperationButtonEnum.ORDER_SK,
+                pageOrder.getId(),
+                pageOrder.getOrderNo(),
+                pageOrder.getVipId());
+    }
+
 
     /**
      * 付款后更新订单信息
+     *
      * @param pageOrder
      */
     private void updateOrderInfo(SysOrder pageOrder) {
+
+        SysUsers user = (SysUsers) WebUtil.getSession().getAttribute(MatrixConstance.LOGIN_KEY);
+        pageOrder.setCashierId(user.getSuId());
+
         pageOrder.setPayTime(new Date());
+
         pageOrder.setStatu(Dictionary.ORDER_STATU_YFK);
         List<SysOrderFlow> flows = pageOrder.getFlows();
 
@@ -528,22 +596,57 @@
                 .map(SysOrderFlow::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
 
         BigDecimal cardPayAmount = flows.stream()
-                .filter(item -> item.getPayMethod().equals("储值卡") && item.getIsGift().equals("N"))
+                .filter(item -> item.getPayMethod().equals("储值卡"))
                 .map(SysOrderFlow::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
 
         pageOrder.setCardPay(cardPayAmount.doubleValue());
         pageOrder.setCashPay(cashPayAmount.doubleValue());
-        //欠款金额在流水处理中处理了
+
+        for (SysOrderFlow flow : pageOrder.getFlows()) {
+            //欠款处理
+            if (SysOrderFlow.PAY_METHOD_ARREARS.equals(flow.getPayMethod())) {
+                pageOrder.setStatu(Dictionary.ORDER_STATU_QK);
+                pageOrder.setArrears(flow.getAmount().doubleValue());
+            }
+        }
+
+        double sum = flows.stream().mapToDouble(item -> item.getAmount().doubleValue()).sum();
+
+        if (sum > 0 && cardPayAmount.doubleValue() == 0 && cashPayAmount.doubleValue() == 0) {
+            throw new GlobleException("订单更新失败,支付金额计算错误,请联系管理员");
+        }
+
 
         sysOrderDao.update(pageOrder);
+
+
     }
 
     private void checkOrder(SysOrder pageOrder) {
+
+        SysOrder checkOrder = sysOrderDao.selectById(pageOrder.getId());
+
+        //状态校验
+        if (!Dictionary.ORDER_STATU_DFK.equals(checkOrder.getStatu())) {
+            throw new GlobleException("该订单已经收过款,请刷新页面再试!");
+        }
+
         //检查交易限制调整
-        checkSealLimit(pageOrder);
+        GoodsSealLimitDto goodsSealLimitDto = new GoodsSealLimitDto();
+        goodsSealLimitDto.setVipId(pageOrder.getVipId());
+        goodsSealLimitDto.setSysOrderItemDtoList(Lists.newArrayList());
+        pageOrder.getItems().forEach(e->{
+            goodsSealLimitDto.getSysOrderItemDtoList().add(BeanUtil.copyProperties(e, SysOrderItemDto.class));
+        });
+        shoppingGoodsService.checkGoodsSealLimit(goodsSealLimitDto);
+
         //检查业绩设置
         checkOrderAchieve(pageOrder);
     }
+
+
+
+
 
     /**
      * 检查业绩设置是否合理
@@ -567,7 +670,7 @@
             entries.forEach(entrie -> {
                 double sum = entrie.getValue().stream().mapToDouble(AchieveNew::getGoodsCash).sum();
                 //todo 目前使用js计算金额可能存在精度的误差展示用0.1屏蔽
-                if (Math.abs(sum- (item.getZkPrice()*item.getCount()) )>0.1) {
+                if (Math.abs(sum - (item.getZkPrice() * item.getCount())) > 0.1) {
                     ShoppingGoods shopGoods = shoppingGoodsDao.selectById(item.getGoodsId());
                     throw GlobleException.instance(shopGoods.getName() + "," + entrie.getKey() + "业绩金额与收款金额不一致");
                 }
@@ -576,40 +679,7 @@
 
     }
 
-    /**
-     * 检查产品销售次数
-     */
-    private void checkSealLimit(SysOrder pageOrder) {
-        pageOrder.getItems().forEach(item -> {
-            ShoppingGoods shopGoods = shoppingGoodsDao.selectById(item.getGoodsId());
 
-            //最大销售次数检测
-            Integer maxNum = shopGoods.getCarMaxSaleCount();
-            if (maxNum != null && maxNum != 0) {
-                Integer buyNum = orderItemDao.selectByGoodsId(shopGoods.getId(), null);
-                if ((buyNum + item.getCount()) > maxNum) {
-                    throw new GlobleException(shopGoods.getName() + "已超过最大销售数量");
-                }
-                if ((buyNum + item.getCount()) == maxNum) {
-                    if (!shopGoods.getStaus().equals(Dictionary.BUSINESS_STATE_DOWN)) {
-                        shopGoods.setStaus(Dictionary.BUSINESS_STATE_DOWN);
-                        shoppingGoodsDao.update(shopGoods);
-                    }
-                }
-            }
-            //每人限购次数检测
-            Integer onceCount = shopGoods.getIsOnce();
-            if (onceCount != null && onceCount != 0) {
-                Integer buyOnceCount = orderItemDao.selectByGoodsId(shopGoods.getId(), pageOrder.getVipId());
-
-                if ((buyOnceCount + item.getCount()) > onceCount) {
-                    throw new GlobleException(shopGoods.getName() + "每人限购" + onceCount + "次");
-                }
-            }
-
-        });
-
-    }
 
 
     /**
@@ -765,59 +835,7 @@
         }
     }
 
-    /**
-     * 创建支付流水
-     *
-     * @author:姜友瑶
-     */
-    private void addOrderFlow(SysOrder sourceOrder) {
 
-
-        //处理支付流水
-        int flowCount = 1;
-        for (SysOrderFlow flow : sourceOrder.getFlows()) {
-            //支付内容摘要设置
-            Long goodsId = sourceOrder.getItems().get(0).getGoodsId();
-            ShoppingGoods goods = shoppingGoodsDao.selectById(goodsId);
-            flow.setFlowContent(goods.getName() + "等" + sourceOrder.getItems().size() + "件产品");
-            // 若是退款,则取负数
-            if (SysOrder.ORDER_TYPE_REFUND == sourceOrder.getOrderType()) {
-                flow.setFlowType(SysOrderFlow.FLOW_TYPE_REFUND);
-                flow.setAmount(flow.getAmount().negate());
-                flow.setOrderId(sourceOrder.getOldOrderId());
-            } else {
-                flow.setFlowType(SysOrderFlow.FLOW_TYPE_BUY);
-                flow.setOrderId(sourceOrder.getId());
-            }
-
-            //欠款处理
-            if (SysOrderFlow.PAY_METHOD_ARREARS.equals(flow.getPayMethod())) {
-                sourceOrder.setStatu(Dictionary.ORDER_STATU_QK);
-                sourceOrder.setArrears(flow.getAmount().doubleValue());
-                sysOrderDao.update(sourceOrder);
-            }
-
-            //统计储值卡支付
-            if (SysOrderFlow.PAY_METHOD_CARD.equals(flow.getPayMethod())) {
-                if (flow.getCardId() != null) {
-                    MoneyCardUse moneyCardUse = moneyCardUseDao.selectById(flow.getCardId());
-                    //修改储值卡余额
-                    cardPaySk(moneyCardUse, sourceOrder, flow);
-                } else {
-                    throw new GlobleException("无效的储值卡支付方式");
-                }
-            }
-
-            flow.setFlowNo(codeService.getFlowCode() + "-" + flowCount);
-            flow.setVipId(sourceOrder.getVipId());
-            flow.setShopId(sourceOrder.getShopId());
-            flow.setCompanyId(sourceOrder.getCompanyId());
-            sysOrderFlowDao.insert(flow);
-            flowCount++;
-        }
-
-
-    }
 
 
     /**
@@ -983,7 +1001,7 @@
      * @date 2016年9月19日
      */
     public void addMoneyCardUse(SysOrder sourceOrder) {
-
+        SysUsers user = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
         List<SysOrderItem> orderItemList = sourceOrder.getItems();
         for (SysOrderItem sysOrderItem : orderItemList) {
             // 如果购买的是充值卡
@@ -1022,6 +1040,7 @@
                     moneyCardUse.setFailTime(invalidTime);
 
                     moneyCardUseDao.insert(moneyCardUse);
+
                 }
             }
         }
@@ -1402,9 +1421,9 @@
             boolean zsConsumeAchieve = projServicesService.skipServiceOrderStep(Dictionary.ZS_CONSUME_ACHIEVE);
             if (zsConsumeAchieve) {
                 //赠送情况下,如果收款金额大于0,就是赠送金额划扣的情况,金额即为划扣的折扣金额
-                if(sysOrderItem.getZkPrice()>0){
+                if (sysOrderItem.getZkPrice() > 0) {
                     puse.setPrice(sysOrderItem.getZkPrice());
-                }else{
+                } else {
                     puse.setPrice(sysOrderItem.getShoppingGoods().getSealPice());
                 }
             } else {
@@ -1525,7 +1544,7 @@
 
         order.setFlows(czVo.getFlows());
 
-        addOrderFlow(order);
+        sysOrderServiceHelper.addOrderFlow(order);
 
         // 添加员工业绩
         achieveNewService.addAchaeveByOrder(order);
@@ -1619,7 +1638,7 @@
 
 
         // 添加订单收款流水
-        addOrderFlow(sysOrder);
+        sysOrderServiceHelper.addOrderFlow(sysOrder);
         //退款退套餐退项目
         refundProjUse(sysOrder);
         //删除积分
@@ -1628,6 +1647,14 @@
         // 设置业绩
         achieveNewService.addAchaeveByOrder(sysOrder);
 
+        //保存单据日志
+        operationLogService.saveOperation(sysOrder.getCompanyId(), sysOrder.getShopId(), user.getSuId(),
+                OperationFunctionEnum.ORDER,
+                OperationButtonEnum.ORDER_TK,
+                sysOrder.getId(),
+                sysOrder.getOrderNo(),
+                sysOrder.getVipId());
+
     }
 
     private void addRefundOrderFlow(SysOrder sourceOrder) {

--
Gitblit v1.9.1