Ver Fonte

Merge branch 'master' of zcb/kmall-pt-general into master

张创标 há 4 anos atrás
pai
commit
440eec122e

+ 4 - 3
kmall-admin/src/main/java/com/kmall/admin/controller/OrderController.java

@@ -36,6 +36,7 @@ import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.text.Bidi;
 import java.text.SimpleDateFormat;
 import java.util.*;
 
@@ -1019,12 +1020,12 @@ public class OrderController {
         String sessionId = (String) param.get("sessionId");
 
         try {
-            orderService.orderRefund(orderInfo,sessionId);
+            return orderService.orderRefund(orderInfo,sessionId);
         } catch (Exception e) {
             e.printStackTrace();
         }
-
         return R.ok();
+
     }
 
 
@@ -1042,7 +1043,7 @@ public class OrderController {
             BigDecimal marketPrice = orderGoodsEntity.getMarketPrice();
             BigDecimal goodsRate = orderGoodsEntity.getGoodsRate();
             Integer number = orderGoodsEntity.getNumber();
-            BigDecimal goodsTax = marketPrice.multiply(goodsRate).multiply(new BigDecimal(number));
+            BigDecimal goodsTax = marketPrice.divide(new BigDecimal(1).add(goodsRate),2,RoundingMode.HALF_DOWN).multiply(goodsRate).multiply(new BigDecimal(number)).setScale(0,RoundingMode.HALF_DOWN);
             orderGoodsEntity.setTax(goodsTax);
             tax = tax.add(goodsTax);
         }

+ 4 - 0
kmall-admin/src/main/java/com/kmall/admin/dao/OrderDao.java

@@ -140,4 +140,8 @@ public interface OrderDao extends BaseDao<OrderEntity> {
      * @return
      */
     List<OrderEntity> queryMasterExportList(Map<String, Object> params);
+
+    void updateOrderInfo(Map orderRaram);
+
+    void updateOrderProcessRecord(Map processParam);
 }

+ 9 - 0
kmall-admin/src/main/java/com/kmall/admin/dto/BuyOneGetOneFreeDto.java

@@ -15,6 +15,7 @@ public class BuyOneGetOneFreeDto implements Serializable {
     private String storeId ; // 门店id
     private String buyGoodsSn; // 购买商品编码
     private String buyBarCode; // 购买商品条码
+    private String buyNum ; // 购买数量
     private String buyBrand; // 购买商品品牌
     private String sendBarCode; // 赠送商品条码
 
@@ -61,4 +62,12 @@ public class BuyOneGetOneFreeDto implements Serializable {
     public void setSendBarCode(String sendBarCode) {
         this.sendBarCode = sendBarCode;
     }
+
+    public String getBuyNum() {
+        return buyNum;
+    }
+
+    public void setBuyNum(String buyNum) {
+        this.buyNum = buyNum;
+    }
 }

+ 9 - 0
kmall-admin/src/main/java/com/kmall/admin/entity/MkActivitiesGetOneFreeGoodsEntity.java

@@ -58,6 +58,7 @@ public class MkActivitiesGetOneFreeGoodsEntity implements Serializable {
      */
     private String productSeries;
     private Integer sendNum;
+    private boolean isBrand;
     /**
      * 赠品条码
      */
@@ -307,4 +308,12 @@ public class MkActivitiesGetOneFreeGoodsEntity implements Serializable {
     public void setSendNum(Integer sendNum) {
         this.sendNum = sendNum;
     }
+
+    public boolean isBrand() {
+        return isBrand;
+    }
+
+    public void setBrand(boolean brand) {
+        isBrand = brand;
+    }
 }

+ 2 - 1
kmall-admin/src/main/java/com/kmall/admin/service/OrderService.java

@@ -5,6 +5,7 @@ import com.kmall.admin.dto.OrderRecognitionDto;
 import com.kmall.admin.entity.*;
 import com.kmall.admin.fromcomm.entity.SysUserEntity;
 import com.kmall.common.utils.Query;
+import com.kmall.common.utils.R;
 import com.kmall.manager.manager.alipay.AliPayMicropayApiResult;
 import com.kmall.manager.manager.wechat.wxglobal.dto.WechatGlobalRefundApiResult;
 import com.kmall.common.utils.print.ticket.item.Ticket;
@@ -149,7 +150,7 @@ public interface OrderService {
 
     OrderEntity queryObjectByOrderSn(String orderSn);
 
-    void orderRefund(OrderEntity orderInfo, String sessionId) throws Exception;
+    R orderRefund(OrderEntity orderInfo, String sessionId) throws Exception;
 
     int queryOffilineOrderTotal(Query query);
 

+ 21 - 16
kmall-admin/src/main/java/com/kmall/admin/service/impl/GoodsServiceImpl.java

@@ -1142,10 +1142,16 @@ public class GoodsServiceImpl implements GoodsService {
             return null;
         }
         goods.setDiscountedPrice(new BigDecimal(0));
-        String goodsRate = goods.getGoodsRate();
-        BigDecimal tax = goods.getRetailPrice().multiply(new BigDecimal(goodsRate)).setScale(2, RoundingMode.HALF_UP);
+        BigDecimal goodsRate = null;
+        try {
+            goodsRate = new BigDecimal(goods.getGoodsRate());
+        } catch (Exception e) {
+            goodsRate = new BigDecimal(0);
+        }
+        BigDecimal retailPrice = goods.getRetailPrice();
+        BigDecimal tax = goodsRate.multiply(retailPrice.divide(new BigDecimal(1).add(goodsRate),2,RoundingMode.HALF_DOWN)).setScale(2,RoundingMode.HALF_DOWN) ;
         goods.setGoodstaxes(tax.toString());
-        goods.setActualPaymentAmount(goods.getRetailPrice().setScale(2,RoundingMode.HALF_UP));
+        goods.setActualPaymentAmount(retailPrice.setScale(2,RoundingMode.HALF_UP));
 
         Map<String,Object> skuActivitiesMap = new HashMap<>();
 
@@ -1196,7 +1202,7 @@ public class GoodsServiceImpl implements GoodsService {
 
 
         // 获取未优惠前的商品价格
-        BigDecimal retailPrice = goods.getRetailPrice();
+        retailPrice = goods.getRetailPrice();;
 
 
         // 根据条码查询商品品牌名称 mall_brand  mall_product_store_rela  mall_goods
@@ -1243,7 +1249,7 @@ public class GoodsServiceImpl implements GoodsService {
             Long mkaId = mkaIdMap.get("mj");
             MkActivitiesFullReductionEntity fullReductionEntity = fullReductionService.queryByCodeOrBrand(mkaId,prodBarcode,brandName,nowTime);
             if(fullReductionEntity != null) {
-                if(fullReductionEntity.getProductBrand() != null){
+                if(!StringUtils.isNullOrEmpty(fullReductionEntity.getProductBrand())){
                     // 跟着品牌走
                     fullReductionMap.put(brandName,fullReductionEntity);
                 }else{
@@ -1293,14 +1299,13 @@ public class GoodsServiceImpl implements GoodsService {
             Long mkaId = mkaIdMap.get("mysy");
             MkActivitiesGetOneFreeGoodsEntity getOneFreeGoodsEntity = getOneFreeGoodsService.queryByCodeOrBrand(mkaId,prodBarcode,brandName);
             if(getOneFreeGoodsEntity != null){
-                // 买x送1  所以需要定义的是 买的条码 买的数量   送的条码  送的数量
-
-
-//                Map<String,String> getOneFreeMap = new HashMap<>();
-//                //                  购买商品条码                          赠品条码
-//                getOneFreeMap.put( getOneFreeGoodsEntity.getBarcode(),getOneFreeGoodsEntity.getGiftBarcode());
-
-                skuActivitiesMap.put("mysy",getOneFreeGoodsEntity);
+                if("无".equals(getOneFreeGoodsEntity.getProductBrand())){
+                    getOneFreeGoodsEntity.setBrand(false);
+                    skuActivitiesMap.put("mysy",getOneFreeGoodsEntity);
+                }else{
+                    getOneFreeGoodsEntity.setBrand(true);
+                    skuActivitiesMap.put("mysy",getOneFreeGoodsEntity);
+                }
 
             }
         }
@@ -1332,7 +1337,7 @@ public class GoodsServiceImpl implements GoodsService {
             // TODO 可能会直接替代产品价格
             if (discountEntity != null) {
                 goods.setActualPaymentAmount(discountEntity.getActivityPrice());
-                goods.setDiscountedPrice(goods.getRetailPrice().subtract(discountEntity.getActivityPrice()).setScale(2,BigDecimal.ROUND_HALF_UP));
+                goods.setDiscountedPrice(retailPrice.subtract(discountEntity.getActivityPrice()).setScale(2,BigDecimal.ROUND_HALF_UP));
                 goods.setActivity("打折");
             }
         }
@@ -1346,7 +1351,7 @@ public class GoodsServiceImpl implements GoodsService {
             MkDailyActivitiesEntity dailyActivitiesEntity = dailyActivitiesService.queryByBarCode(mkaId,prodBarcode);
             if(dailyActivitiesEntity != null){
                 goods.setActualPaymentAmount(dailyActivitiesEntity.getActivityPrice());
-                goods.setDiscountedPrice(goods.getRetailPrice().subtract(dailyActivitiesEntity.getActivityPrice()).setScale(2,BigDecimal.ROUND_HALF_UP));
+                goods.setDiscountedPrice(retailPrice.subtract(dailyActivitiesEntity.getActivityPrice()).setScale(2,BigDecimal.ROUND_HALF_UP));
                 goods.setActivity("日常活动");
 
             }
@@ -1362,7 +1367,7 @@ public class GoodsServiceImpl implements GoodsService {
             // 如果该商品存在临时促销,直接替换活动价格
             if(promotionEntity != null){
                 goods.setActualPaymentAmount(promotionEntity.getActivityPrice());
-                goods.setDiscountedPrice(goods.getRetailPrice().subtract(promotionEntity.getActivityPrice()).setScale(2,BigDecimal.ROUND_HALF_UP));
+                goods.setDiscountedPrice(retailPrice.subtract(promotionEntity.getActivityPrice()).setScale(2,BigDecimal.ROUND_HALF_UP));
                 goods.setActivity("临时促销");
 
             }

+ 1 - 0
kmall-admin/src/main/java/com/kmall/admin/service/impl/MkActivitiesGetOneFreeGoodsServiceImpl.java

@@ -107,6 +107,7 @@ public class MkActivitiesGetOneFreeGoodsServiceImpl implements MkActivitiesGetOn
                 MkActivitiesGetOneFreeGoodsEntity mkActivitiesGetOneFreeGoodsEntity = new MkActivitiesGetOneFreeGoodsEntity();
                 mkActivitiesGetOneFreeGoodsEntity.setGoodsSn(buyOneGetOneFreeDto.getBuyGoodsSn()); // 商品编号
                 mkActivitiesGetOneFreeGoodsEntity.setBarcode(buyOneGetOneFreeDto.getBuyBarCode()); // 商品条码
+                mkActivitiesGetOneFreeGoodsEntity.setBuyNum(Integer.valueOf(buyOneGetOneFreeDto.getBuyNum())); // 购买数量
                 mkActivitiesGetOneFreeGoodsEntity.setProductBrand(buyOneGetOneFreeDto.getBuyBrand()); // 商品品牌
                 mkActivitiesGetOneFreeGoodsEntity.setGiftBarcode(buyOneGetOneFreeDto.getSendBarCode()); // 赠送商品条码
                 mkActivitiesGetOneFreeGoodsEntity.setShopSn(storeId); // 门店编号

+ 198 - 14
kmall-admin/src/main/java/com/kmall/admin/service/impl/OrderServiceImpl.java

@@ -69,6 +69,7 @@ import java.net.URLDecoder;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.*;
+import java.util.concurrent.TimeUnit;
 
 
 @Service("orderService")
@@ -159,6 +160,11 @@ public class OrderServiceImpl implements OrderService {
     @Autowired
     private MkActivitiesCouponService mkActivitiesCouponService;
 
+    @Autowired
+    private OrderRefundService orderRefundService;
+    @Autowired
+    private OrderExceptionRecordService orderExceptionRecordService;
+
 
     @Override
     public OrderEntity queryObject(Long id) {
@@ -1680,8 +1686,8 @@ public class OrderServiceImpl implements OrderService {
         String machineCode = (String) param.get("machineCode");
         try {
             machineCode = URLDecoder.decode(machineCode,"UTF-8");
-        } catch (UnsupportedEncodingException e) {
-            e.printStackTrace();
+        } catch (Exception e) {
+//            e.printStackTrace();
         }
 
 
@@ -1825,7 +1831,7 @@ public class OrderServiceImpl implements OrderService {
                     }else if(taxObject instanceof String){
                         tax = new BigDecimal((String) taxObject) ;
                     }
-                    totalTax = totalTax.add(tax); // 计算总的税额
+                    totalTax = totalTax.add(tax).setScale(2,BigDecimal.ROUND_HALF_DOWN); // 计算总的税额
 
                     if(goodsDto.get("actualPaymentAmount") instanceof Double){
                         goodsEntity.setStoreRetailPrice(new BigDecimal((Double)goodsDto.get("actualPaymentAmount")));
@@ -1950,10 +1956,21 @@ public class OrderServiceImpl implements OrderService {
             processRecordEntity.setPaymentStartTime(new Date());
 
 
-            // 微信支付
-//            wxPay(user, parCode, resultObj, order, processRecordEntity, orderWXPayRecordCurrent, store);
+            // 判断是微信支付码还是支付宝的支付码
+            if (parCode.startsWith("28")) {
             // 支付宝支付
 //            AliPay(user, parCode , order, processRecordEntity, orderWXPayRecordCurrent, store);
+
+            }else{
+            // 微信支付
+//                try {
+//                    wxPay(user, parCode, resultObj, order, processRecordEntity, orderWXPayRecordCurrent, store);
+//                } catch (ParseException e) {
+//                    throw e;
+//                }
+
+            }
+
             OrderEntity orderEntity = queryObject(order.getId());
 //            orderEntity.setOrderStatus(Integer.parseInt(Dict.orderStatus.item_201.getItem()));
 //            orderEntity.setPayStatus(Integer.parseInt(Dict.payStatus.item_2.getItem()));
@@ -2240,7 +2257,7 @@ public class OrderServiceImpl implements OrderService {
         R r;
         WechatMicropayApiResult wechatMicropayApiResult = WechatUtil
                 .wxMicropay(store.getMerchName() + "-" + store.getStoreName(), order.getOrderBizType(), null,
-                        orderWXPayRecordCurrent.getOutTradeNoWX(), order.getActual_price().doubleValue(),
+                        orderWXPayRecordCurrent.getOutTradeNoWX(), 0.01d/*order.getActual_price().doubleValue()*/,
                         "127.0.0.1", parCode);
         orderWXPayRecordService.updateRecord(orderWXPayRecordCurrent.getId(), wechatMicropayApiResult);
 
@@ -2286,6 +2303,26 @@ public class OrderServiceImpl implements OrderService {
             //用户支付中
         } else if (WechatUtil.WXTradeState.USERPAYING.getCode().equals(wechatMicropayApiResult.getTrade_state())) {
             r = R.error(WechatUtil.WXTradeState.USERPAYING.getCodeZn() + ",稍等片刻后请刷新页面重新查看订单状态");
+            int times = 0;
+            // 查询是否支付了
+            while(true){
+                boolean flag = orderQuery(order, processRecordEntity);
+                if(flag ){
+                    break;
+                }
+                try {
+                    Thread.currentThread().sleep(1000);
+
+                } catch (InterruptedException e) {
+                    e.printStackTrace();
+                }
+                if(times >= 30){
+                    throw new RuntimeException("超过30s未支付,订单下单失败");
+                }
+                times++;
+            }
+
+
             //用户支付失败
         } else if (WechatUtil.WXTradeState.PAYERROR.getCode().equals(wechatMicropayApiResult.getTrade_state())) {
             WechatReverseApiResult wechatReverseApiResult =
@@ -2308,6 +2345,85 @@ public class OrderServiceImpl implements OrderService {
             }
 
         }
+        }
+
+    private boolean orderQuery(OrderVo order, OrderProcessRecordEntity processRecordEntity) {
+        LOGGER.info(">>>>>>>>>>>>>>>>>>>>wxOrderQuery 微信查询接口调用");
+        String merchOrderSn = order.getMerchOrderSn();
+        String orderId = order.getId() + "";
+        String orderSn = order.getOrder_sn();
+        WechatRefundApiResult result = WechatUtil.wxOrderQuery(orderSn);
+        if (result.getReturn_code().equalsIgnoreCase(WechatUtil.WXTradeState.SUCCESS.getCode())) {
+            if (result.getResult_code().equalsIgnoreCase(WechatUtil.WXTradeState.SUCCESS.getCode()) ){
+                if(result.getTrade_state().equalsIgnoreCase(Dict.tradeState.item_SUCCESS.getItem())) {
+                    Date successTime = DateUtils.convertStringToDate(result.getTime_end(),
+                            DateUtils.DATE_TIME_PATTERN_YYYY_MM_DD_HH_MM_SS);
+                    Map orderRaram = Maps.newHashMap();
+                    orderRaram.put("payStatus", Dict.payStatus.item_2.getItem());//已支付
+                    orderRaram.put("orderStatus", Dict.orderStatus.item_201.getItem());//已支付
+                    orderRaram.put("payTransactionId", result.getTransaction_id());
+                    orderRaram.put("payTime", successTime);
+                    orderRaram.put("orderId", orderId);
+                    orderRaram.put("payFlag",Dict.payFlag.item_weixin.getItem());
+                    orderDao.updateOrderInfo(orderRaram);
+                    Map processParam = Maps.newHashMap();
+                    processParam.put("payTime", successTime);
+                    processParam.put("orderSn", orderSn);
+                    orderDao.updateOrderProcessRecord(processParam);
+
+
+                    // 设置支付单完成时间
+                    processRecordEntity.setPaymentSuccTimeStr(result.getTime_end());
+                    processRecordEntity.setPaymentSuccTime(successTime);
+                    processRecordEntity.setPayTransactionId(result.getTransaction_id());
+                    return true;
+
+                } else if (result.getTrade_state().equalsIgnoreCase(Dict.tradeState.item_NOTPAY.getItem())) {//订单未支付
+                    Map orderRaram = Maps.newHashMap();
+
+                    orderRaram.put("payStatus", Dict.payStatus.item_0.getItem());//支付状态未支付
+                    orderRaram.put("orderStatus", Dict.orderStatus.item_0.getItem());//订单状态未支付
+
+                    orderRaram.put("orderId", orderId);
+                    orderDao.updateOrderInfo(orderRaram);
+                } else if (result.getTrade_state().equalsIgnoreCase(Dict.tradeState.item_CLOSED.getItem())) {
+                    Map orderRaram = Maps.newHashMap();
+                    orderRaram.put("payStatus", Dict.payStatus.item_7.getItem());
+                    orderRaram.put("orderStatus", Dict.orderStatus.item_500.getItem());
+                    orderRaram.put("orderId", orderId);
+                    orderDao.updateOrderInfo(orderRaram);
+                    LOGGER.info(">>>>>>>>>>>>>>>>>>>>wxOrderByTransactionIdQueryUpdFail 根据支付单查询微信接口返回信息:state 【" + result.getTrade_state() +
+                            "】,des【" + result.getTrade_state_desc() + "】");
+                } else if (result.getTrade_state().equalsIgnoreCase(Dict.tradeState.item_PAYERROR.getItem())) {
+                    Map orderRaram = Maps.newHashMap();
+                    orderRaram.put("payStatus", Dict.payStatus.item_8.getItem());
+                    orderRaram.put("orderStatus", Dict.orderStatus.item_501.getItem());
+                    orderRaram.put("orderId", orderId);
+                    orderDao.updateOrderInfo(orderRaram);
+                    LOGGER.info(">>>>>>>>>>>>>>>>>>>>wxOrderByTransactionIdQueryUpdFail 根据支付单查询微信接口返回信息:state 【" + result.getTrade_state() +
+                            "】,des【" + result.getTrade_state_desc() + "】");
+                } else if (result.getTrade_state().equalsIgnoreCase(Dict.tradeState.item_USERPAYING.getItem())) {
+                    Map orderRaram = Maps.newHashMap();
+                    orderRaram.put("payStatus", Dict.payStatus.item_1.getItem());
+                    orderRaram.put("orderStatus", Dict.orderStatus.item_100.getItem());
+                    orderRaram.put("orderId", orderId);
+                    orderDao.updateOrderInfo(orderRaram);
+                    LOGGER.info(">>>>>>>>>>>>>>>>>>>>wxOrderByTransactionIdQueryUpdFail 根据支付单查询微信接口返回信息:state 【" + result.getTrade_state() +
+                            "】,des【" + result.getTrade_state_desc() + "】");
+                } else if (result.getTrade_state().equalsIgnoreCase(Dict.tradeState.item_REVOKED.getItem())) {
+                    LOGGER.info(">>>>>>>>>>>>>>>>>>>>wxOrderByTransactionIdQueryUpdFail 根据支付单查询微信接口返回信息:state 【" + result.getTrade_state() +
+                            "】,des【" + result.getTrade_state_desc() + "】");
+                }
+            }else {
+                LOGGER.info(">>>>>>>>>>>>>>>>>>>>wxOrderQuery 微信查询接口返回失败信息:code 【" + result.getErr_code() +
+                        "】,des【" + result.getErr_code_des() + "】");
+            }
+
+            return false;
+        } else {
+            LOGGER.info(">>>>>>>>>>>>>>>>>>>>wxOrderQuery 微信查询接口调用失败: " + result.getReturn_msg());
+            return false;
+        }
     }
 
     @Override
@@ -2315,21 +2431,57 @@ public class OrderServiceImpl implements OrderService {
         return orderDao.queryObjectByOrderSn(orderSn);
     }
 
+    // TODO  退款的代码
     @Override
-    public void orderRefund(OrderEntity order, String sessionId) throws Exception {
+    @Transactional
+    public R orderRefund(OrderEntity order, String sessionId) throws Exception {
+        String payFlag = order.getPayFlag();
+
         boolean needUpdateStock = true;
-        if (order.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_201.getItem())) {
-            order.setOrderStatus(Integer.parseInt(Dict.orderStatus.item_401.getItem()));
-        }
-        if (Dict.payFlag.item_cash.getItem().equals(order.getPayFlag())) {
+        if (Dict.payFlag.item_cash.getItem().equals(payFlag)) {
             order.setPayStatus(Integer.parseInt(Dict.payStatus.item_4.getItem()));
-        }else{
+        // TODO 微信的退款代码
+        } else if(Dict.payFlag.item_weixin.getItem().equals(payFlag)){
+            OrderEntity orderInfo = order;
+            if (null == orderInfo) {
+                return R.error("订单不存在");
+            }
+            if (orderInfo.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_401.getItem()) ||
+                    orderInfo.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_402.getItem())) {
+                return R.error("订单已退款");
+            }
+            Double totalActualPrice = orderDao.getTotalActualPrice(orderInfo.getMerchOrderSn());
+            if (totalActualPrice == null) {
+                totalActualPrice = 0d;
+            }
+            String refundResult = "";
+            if (orderInfo.getOrderStatus() != Integer.parseInt(Dict.orderStatus.item_0.getItem())) {
+//                if (orderInfo.getPayFlag().equalsIgnoreCase(Dict.payFlag.item_wxglobalpay.getItem())) {
+//                    refundResult = wxGlobalRefund(orderInfo, totalActualPrice);
+//                    if (org.apache.commons.lang3.StringUtils.isNotBlank(refundResult)) {
+//                        return R.error(refundResult);
+//                    }
+//                } else if (orderInfo.getPayFlag().equalsIgnoreCase(Dict.payFlag.item_pingan.getItem())) {
+//                    refundResult = pinganRefund(orderInfo, refundId);
+//                    if (org.apache.commons.lang3.StringUtils.isNotBlank(refundResult)) {
+//                        return R.error(refundResult);
+//                    }
+//                } else{
+                    refundResult = wxRefund(orderInfo,totalActualPrice);
+                    if(org.apache.commons.lang3.StringUtils.isNotBlank(refundResult)){
+                        return R.error(refundResult);
+                    }
+//                }
+            }
+        // 支付宝的退款代码
+        } else if(Dict.payFlag.item_alipay.getItem().equals(payFlag)) {
 
             AliPayMicropayApiResult userRefund = AliPayUtil.aliTradeRefund(order.getOrderSn(), order.getActualPrice().toString(),
                     "用户退款", order.getStoreId() + "");
 
             LOGGER.info(userRefund.getSubMsg());
             order.setPayStatus(Integer.parseInt(Dict.payStatus.item_3.getItem()));
+            order.setOrderStatus(Integer.parseInt(Dict.orderStatus.item_401.getItem()));
             OrderRefundEntity orderRefund = new OrderRefundEntity();
             orderRefund.setRefundId(userRefund.getTradeNo());
             orderRefund.setOutRefundNo(userRefund.getOutTradeNo());
@@ -2356,7 +2508,39 @@ public class OrderServiceImpl implements OrderService {
         pickUpCodeService.update(pickUpCodeEntity);
 //        WebSocketServer.delete(sessionId,order.getStoreId(),pickUpCodeEntity);
         updateStock(order, "收银端退款");
+        return R.ok("退款成功");
+    }
+
 
+    private String wxRefund(OrderEntity orderInfo,Double totalActualPrice){
+        WechatRefundApiResult result = WechatUtil.wxRefund(orderInfo.getOrderSn().toString(), totalActualPrice,
+                orderInfo.getActualPrice().doubleValue());
+        if (result.getResult_code().equals(WechatUtil.WXTradeState.SUCCESS.getCode())) {
+            refund(orderInfo, result);
+        } else {
+            OrderRefundEntity mallOrderRefund = orderRefundService.queryObjectByOrderId(orderInfo.getId());
+            OrderRefundEntity orderRefund = new OrderRefundEntity();
+            orderRefund.setRefundType(Integer.parseInt(Dict.RefundType.item_1.getItem()));
+            orderRefund.setRefundMoney(BigDecimal.valueOf(orderInfo.getActualPrice().doubleValue()));
+            orderRefund.setRefundStatus(Integer.parseInt(Dict.RefundStatus.item_4.getItem()));
+            SysUserEntity user = ShiroUtils.getUserEntity();
+            orderRefund.setModerSn(user.getUsername());
+            orderRefund.setModTime(new Date());
+//            orderRefund.setOutRefundNo(result.getOut_refund_no());
+            if (mallOrderRefund != null) {
+                orderRefund.setId(mallOrderRefund.getId());
+                orderRefundService.update(orderRefund);//退款记录
+            }
+            OrderExceptionRecordEntity mallOrderExceptionRecord = new OrderExceptionRecordEntity();
+            mallOrderExceptionRecord.setOrderSn(orderInfo.getOrderSn());
+            mallOrderExceptionRecord.setUserId(Integer.parseInt(orderInfo.getUserId() + ""));
+            mallOrderExceptionRecord.setExceptionStatus(Dict.exceptionStatus.item_03.getItem());
+            mallOrderExceptionRecord.setExceptionContent("退款失败" + result.getErr_code_des());
+            mallOrderExceptionRecord.setCreateTime(new Date());
+            orderExceptionRecordService.save(mallOrderExceptionRecord);
+            return result.getErr_code_des();
+        }
+        return "";
     }
 
     @Override
@@ -2417,7 +2601,7 @@ public class OrderServiceImpl implements OrderService {
             fullCutCouponDec = fullCutCouponDec
                     .add(goodsEntity.getDiscountedPrice()).setScale(2,RoundingMode.HALF_UP);
             actualPrice = actualPrice
-                    .add(goodsEntity.getActualPaymentAmount().multiply(new BigDecimal(goodsEntity.getGoodsNumber()))).setScale(2,RoundingMode.HALF_UP);
+                    .add(goodsEntity.getActualPaymentAmount()).setScale(2,RoundingMode.HALF_UP);
 
         }
 
@@ -2516,7 +2700,7 @@ public class OrderServiceImpl implements OrderService {
         orderGoodsVo.setSku(goodsDto.getSku());
 
         BigDecimal number = new BigDecimal(Long.valueOf(goodsDto.getGoodsNumber()));
-        BigDecimal goodsTotal = goodsDto.getStoreRetailPrice().multiply(number);//单商品总价
+        BigDecimal goodsTotal = goodsDto.getRetailPrice().multiply(number);//单商品总价
         BigDecimal rate = goodsTotal.divide(orderInfo.getGoods_price(),2, BigDecimal.ROUND_HALF_UP);//当前商品总价/订单总价(不含运费、不含优惠券)
         BigDecimal freightPrice = BigDecimal.valueOf(orderInfo.getFreight_price());
         BigDecimal settlePrice = Constant.ZERO;  // ccnet 取的这个而价格

+ 1 - 1
kmall-admin/src/main/java/com/kmall/admin/service/impl/OrderWXPayRecordServiceImpl.java

@@ -126,7 +126,7 @@ public class OrderWXPayRecordServiceImpl
         orderWXPayRecord.setTotalFee(String.valueOf(order.getActual_price().multiply(Constant.ONE_HUNDRED).intValue()));
         orderWXPayRecord.setTradeType("MICROPAY");
         orderWXPayRecord.setOutTradeNo(order.getOrder_sn());
-        orderWXPayRecord.setOutTradeNoWX(order.getOrder_sn() + "_" + count);
+        orderWXPayRecord.setOutTradeNoWX(order.getOrder_sn());
         orderWXPayRecord.setCreateTime(new Date());
         orderWXPayRecord.setModTime(new Date());
         orderWXPayRecord.setTradeState("NOTPAY");

+ 3 - 2
kmall-admin/src/main/resources/XmlTemplate/BuyOneGetOneFreeDtoList.xml

@@ -8,8 +8,9 @@
                 <mapping row="1" col="0">BuyOneGetOneFreeDto.storeId</mapping>
                 <mapping row="1" col="1">BuyOneGetOneFreeDto.buyGoodsSn</mapping>
                 <mapping row="1" col="2">BuyOneGetOneFreeDto.buyBarCode</mapping>
-                <mapping row="1" col="3">BuyOneGetOneFreeDto.buyBrand</mapping>
-                <mapping row="1" col="4">BuyOneGetOneFreeDto.sendBarCode</mapping>
+                <mapping row="1" col="3">BuyOneGetOneFreeDto.buyNum</mapping>
+                <mapping row="1" col="4">BuyOneGetOneFreeDto.buyBrand</mapping>
+                <mapping row="1" col="5">BuyOneGetOneFreeDto.sendBarCode</mapping>
             </section>
             <loopbreakcondition>
                 <rowcheck offset="0">

+ 1 - 1
kmall-admin/src/main/resources/logback.xml

@@ -37,7 +37,7 @@ debug:当此属性设置为true时,将打印出logback内部日志信息,
         -->
         <encoder>
             <pattern>${STD_CONSOLE_LOG_PATTERN}</pattern>
-            <charset>UTF-8</charset>
+            <charset>GBK</charset>
         </encoder>
     </appender>
 

+ 3 - 1
kmall-admin/src/main/resources/mybatis/mapper/MkActivitiesFullGiftDao.xml

@@ -189,7 +189,9 @@
 		from mk_activities_full_gift
 		where
 			mka_id = #{mkaId}
-			and (barcode = #{prodBarcode} or product_brand = #{brandName})
+			<if test="brandName != 'all'">
+				and (barcode = #{prodBarcode} or product_brand = #{brandName})
+			</if>
 			and deadline &gt;= #{nowTime}
 	</select>
 

+ 31 - 0
kmall-admin/src/main/resources/mybatis/mapper/OrderDao.xml

@@ -1937,4 +1937,35 @@
         </if>
     </select>
 
+
+
+    <update id="updateOrderInfo" parameterType="map">
+        UPDATE mall_order a
+        <set>
+            <if test="orderStatus != null">a.order_status = #{orderStatus},</if>
+            <if test="payStatus != null">a.pay_status = #{payStatus},</if>
+            <if test="payFlag != null">a.pay_flag = #{payFlag},</if>
+            <if test="orderSnWx != null">a.order_sn_wx = #{orderSnWx},</if>
+            <if test="payTransactionId != null">a.pay_transaction_id = #{payTransactionId},</if>
+            <if test="payTime != null">a.pay_time = #{payTime},</if>
+
+            <if test="totalFee != null">a.total_fee = #{totalFee},</if>
+            <if test="feeType != null">a.fee_type = #{feeType},</if>
+            <if test="cashFee != null">a.cash_fee = #{cashFee},</if>
+            <if test="cashFeeType != null">a.cash_fee_type = #{cashFeeType},</if>
+            <if test="rate != null">a.rate = #{rate},</if>
+        </set>
+        WHERE 1 = 1
+        AND a.id = #{orderId}
+    </update>
+
+    <update id="updateOrderProcessRecord" parameterType="map">
+        UPDATE mall_order_process_record a
+        <set>
+            <if test="payTime != null">a.pay_succ_time = #{payTime}</if>
+        </set>
+        WHERE 1 = 1
+        AND a.order_sn = #{orderSn}
+    </update>
+
 </mapper>

+ 9 - 12
kmall-admin/src/main/webapp/WEB-INF/page/sale/sale.html

@@ -80,15 +80,14 @@
                     <li style="height: 600px;overflow:auto">
                         <table id="cbec" class="table .table-striped">
                             <tr style="border: white;background-color: #F5DCB3;font-size: 1.3em" >
-                                <th style="width: 350px;padding: 7px">跨境商品名称</th>
+                                <th style="width: 300px;padding: 7px">跨境商品名称</th>
                                 <th style="padding: 7px">单价</th>
                                 <th style="padding: 7px">优惠金额</th>
                                 <th style="padding: 7px">税费</th>
                                 <th style="padding: 7px">实际支付价</th>
-<!--                                <th>税费</th>-->
                                 <th style="padding: 7px">数量</th>
-<!--                                <th>操作</th>-->
                                 <th style="padding: 7px">参与活动</th>
+                                <th>操作</th>
                             </tr>
                             <tr v-for="(item,i) in goodsList" v-if="item.name" style="font-size: 1.3em">
                                 <td><h3>{{item.name}}</h3></td>
@@ -97,16 +96,16 @@
                                 <td> {{item.goodstaxes}}</td>
                                 <td> {{item.actualPaymentAmount}}</td>
                                 <td>
-<!--                                    <i class="glyphicon glyphicon-minus" aria-hidden="true" @click="minus(item.id)"></i>-->
+                                    <i class="glyphicon glyphicon-minus" aria-hidden="true" @click="minus(item.id)"></i>
                                     {{item.sellVolume}}
-<!--                                    <i class="glyphicon glyphicon-plus" aria-hidden="true" @click="add(item.id)"></i>-->
+                                    <i class="glyphicon glyphicon-plus" aria-hidden="true" @click="add(item.id)"></i>
                                 </td>
-<!--                                <td >-->
-<!--                                    <i class="glyphicon glyphicon-remove" aria-hidden="true" @click="deleteItem(item.id)"></i>-->
-<!--                                </td>-->
                                 <td>
                                     {{item.activity}}
                                 </td>
+                                <td >
+                                    <i class="glyphicon glyphicon-remove" aria-hidden="true" @click="deleteItem(item.id)"></i>
+                                </td>
                             </tr>
                         </table>
                     </li>
@@ -279,9 +278,8 @@
                                     <th>规格</th>
                                     <th>市场价</th>
                                     <th>优惠价</th>
-                                    <th>实际支付价</th>
                                     <th>数量</th>
-                                    <th>总额</th>
+                                    <th>实际支付价</th>
                                     <th>预估税费</th>
                                     <th>参与活动</th>
                                 </tr>
@@ -290,9 +288,8 @@
                                     <td>{{item.specification}}</td>
                                     <td>{{item.marketPrice}}</td>
                                     <td>{{item.discountedPrice}}</td>
-                                    <td>{{item.actualPaymentAmount}}</td>
                                     <td>{{item.number}}</td>
-                                    <td >{{item.number*item.actualPaymentAmount}}</td>
+                                    <td>{{item.actualPaymentAmount}}</td>
                                     <td >{{item.tax}}</td>
                                     <td >{{item.activity}}</td>
                                 </tr>

+ 375 - 118
kmall-admin/src/main/webapp/js/sale/sale.js

@@ -39,8 +39,11 @@ function calculateGoodsPrice(r){
             giftBarcode:rMap.mysy.giftBarcode,
             sendNum:rMap.mysy.sendNum
         };
-        vm.newMysy.set(rMap.mysy.barcode , mysy);
-        vm.mysy.push(rMap.mysy[barCode]);
+        if(rMap.mysy.brand){
+            vm.brandGetOneFree.set(rMap.mysy.productBrand,mysy);
+        }else{
+            vm.barcodeGetOneFree.set(rMap.mysy.barcode , mysy);
+        }
     }
 
     if(rMap.mz){
@@ -52,36 +55,36 @@ function calculateGoodsPrice(r){
             vm.mz.set(brand,rMap.mz[brand]);
         }
     }
-    if(rMap.zhjsp){
-        // 遍历该商品所有可能的组合价商品类型
-        for(var data in rMap.zhjsp){
-            if(!vm.zhjsp.get(data)){
-                // 分割组合价商品的条码,并以 条码:0 放入map中
-                var barCodeArray = data.toString().split(":");
-                var dataMap = new Map();
-                console.log(rMap.zhjsp[data]);
-                // dataMap.set();
-                for(var j = 0 ; j < barCodeArray.length ; j ++){
-                    dataMap.set(barCodeArray[j],0);
-                }
-                vm.combinationPrice.set(data,rMap.zhjsp[data][0].combinedPrice)
-
-                vm.zhjsp.set(data,dataMap);
-            }
-        }
-
-    }
-    calculateGoodsByMj(r.goodsDetails);
-    calculateGoodsByMysy(r.goodsDetails);
-    calculateGoodsByMz(r.goodsDetails);
-    calculateGoodsByZhjsp(r);
+    // if(rMap.zhjsp){
+    //     // 遍历该商品所有可能的组合价商品类型
+    //     for(var data in rMap.zhjsp){
+    //         if(!vm.zhjsp.get(data)){
+    //             // 分割组合价商品的条码,并以 条码:0 放入map中
+    //             var barCodeArray = data.toString().split(":");
+    //             var dataMap = new Map();
+    //             console.log(rMap.zhjsp[data]);
+    //             // dataMap.set();
+    //             for(var j = 0 ; j < barCodeArray.length ; j ++){
+    //                 dataMap.set(barCodeArray[j],0);
+    //             }
+    //             vm.combinationPrice.set(data,rMap.zhjsp[data][0].combinedPrice)
+    //
+    //             vm.zhjsp.set(data,dataMap);
+    //         }
+    //     }
+    //
+    // }
+    // calculateGoodsByMj(r.goodsDetails,"add");
+    calculateGoodsByMysy(r.goodsDetails,"add");
+    calculateGoodsByMz(r.goodsDetails,"add");
+    // calculateGoodsByZhjsp(r);
 
 }
 
 // ==================== 满减==========================
 
 // 满减
-function calculateGoodsByMj(goodsDetails){
+function calculateGoodsByMj(goodsDetails,type){
     if(vm.mj.get(goodsDetails.prodBarcode)){
         fullReduction(goodsDetails,goodsDetails.prodBarcode);
     }else if(vm.mj.get(goodsDetails.brand)){
@@ -112,16 +115,26 @@ function fullReduction(goodsDetails,key){
 // ============================= 满赠 ==============================
 
 // 满赠
-function calculateGoodsByMz(goodsDetails){
-
-    // 1.满赠的商品是不是自己,遍历满赠商品数组
-    isSend(vm.fullGiftCode,goodsDetails,"满赠");
-
-    if(vm.mz.get(goodsDetails.prodBarcode)){
-        fullGift(goodsDetails,goodsDetails.prodBarcode);
-    }else if(vm.mz.get(goodsDetails.brand)){
-        fullGift(goodsDetails,goodsDetails.brand);
+function calculateGoodsByMz(goodsDetails,type){
+    // 判断当前支付金额是否满足满赠金额,若满足,直接修改金额为1
+    var mzGoods = vm.mz.get(goodsDetails.prodBarcode);
+    if(mzGoods){
+        var mzPrice = mzGoods.qualifiedAmount;
+        if(mzPrice <  vm.actualPrice && !mzGoods.useMz){
+            mzGoods.useMz = true;
+            goodsDetails.actualPaymentAmount = 1;
+            goodsDetails.discountedPrice = goodsDetails.retailPrice - 1;
+        }
     }
+
+    // // 1.满赠的商品是不是自己,遍历满赠商品数组
+    // isSend(vm.fullGiftCode,goodsDetails,"满赠");
+    //
+    // if(vm.mz.get(goodsDetails.prodBarcode)){
+    //     fullGift(goodsDetails,goodsDetails.prodBarcode);
+    // }else if(vm.mz.get(goodsDetails.brand)){
+    //     fullGift(goodsDetails,goodsDetails.brand);
+    // }
 }
 
 function fullGift(goodsDetails,key){
@@ -151,44 +164,126 @@ function fullGift(goodsDetails,key){
 
 
 // 买一送一
-function calculateGoodsByMysy(goodsDetails){
-    console.log(vm.newMysy);
-    var mysy = vm.newMysy.get(goodsDetails.prodBarcode);
+function calculateGoodsByMysy(goodsDetails,type){
+    var mysy = vm.barcodeGetOneFree.get(goodsDetails.prodBarcode);
+    var brandMysy = vm.brandGetOneFree.get(goodsDetails.brand);
     if(mysy){
         var buyNum = mysy.buyNum;
-        // 证明是买一送一,并且达到买一送一的条件
-        if(buyNum == 1 && vm.boughtNum.get(goodsDetails.prodBarcode)){
-            // 设置赠品的单价
-            goodsDetails.discountedPrice = goodsDetails.retailPrice;
-            goodsDetails.actualPaymentAmount = 0;
-            goodsDetails.activity = "买1送1";
+        if(type == "add"){
+            
+            // 证明是买一送一,并且达到买一送一的条件
+            if(buyNum == 1 && vm.boughtNum.get(goodsDetails.prodBarcode)){
+                // 设置赠品的单价
+                goodsDetails.discountedPrice = goodsDetails.retailPrice;
+                goodsDetails.actualPaymentAmount = 0;
+                // goodsDetails.activity = "买1送1";
+
+                // 清除该商品买一送一条件
+                vm.boughtNum.delete(goodsDetails.prodBarcode);
+                return ;
+            }
+            // 如果不是买一送一,而是买n送n,先获取购物车已有该类型商品数量
+            var boughtNum = vm.boughtNum.get(goodsDetails.prodBarcode);
+            // 如果没有,置为1
+            if(!boughtNum){
+                vm.boughtNum.set(goodsDetails.prodBarcode , 1);
+                return ;
+            }
+            // 走到这里,证明购买过该类型商品,且数量不是买一送一的
+            // 如果相等,证明达到送的条件
+            if(buyNum === boughtNum){
+                goodsDetails.discountedPrice = goodsDetails.retailPrice;
+                goodsDetails.actualPaymentAmount = 0;
+                // goodsDetails.activity = "买"+buyNum+"送1";
+                // 清除该商品买一送一条件
+                vm.boughtNum.delete(goodsDetails.prodBarcode);
+                console.log(vm.boughtNum);
+            }else{
+                // 如果不相等,已经购买数量+1
+                vm.boughtNum.set(goodsDetails.prodBarcode , boughtNum+1);
+            }
+        }else if (type == "minus"){
+
+
+            // 获取该产品要买n送1 的n
+            // 获取已经购买的数量
+            var boughtNum = goodsDetails.sellVolume;
+            // 减一后,不满足买一送一条件,重新计算金额
+            // 如果不等于0,要减去价格
+            
+            var remainder = 0;
+            if(boughtNum > buyNum+1){
+                remainder = buyNum - (boughtNum % (buyNum+1))  ;
+            }else{
+                remainder = buyNum - ((buyNum+1) %boughtNum )  ;
+            }
+            if(boughtNum % (buyNum+1) != 0){
+                // console.log("我要减去价格,也要减去数量,减去数量=" + goodsDetails.sellVolume);
+                goodsDetails.actualPaymentAmount = goodsDetails.retailPrice;
+                goodsDetails.discountedPrice = 0;
+            // 如果等于0,只用减去数量跟优惠价,并恢复活动
+            }else{
+                // console.log("我不用减去价格,只要减去数量");
+                goodsDetails.discountedPrice = goodsDetails.retailPrice;
+                goodsDetails.actualPaymentAmount = 0;
+            }
+            goodsDetails.sellVolume = 1;
+            vm.boughtNum.set(goodsDetails.prodBarcode,remainder);
 
-            // 清除该商品买一送一条件
-            vm.boughtNum.delete(goodsDetails.proBarcode);
-        }
-        // 如果不是买一送一,而是买n送n,先获取购物车已有该类型商品数量
-        var boughtNum = vm.boughtNum.get(goodsDetails.prodBarcode);
-        // 如果没有,置为1
-        if(!boughtNum){
-            vm.boughtNum.set(goodsDetails.prodBarcode , 1);
-            return ;
-        }
-        // 走到这里,证明购买过该类型商品,且数量不是买一送一的
-        // 如果相等,证明达到送的条件
-        if(buyNum === boughtNum){
-            goodsDetails.discountedPrice = goodsDetails.retailPrice;
-            goodsDetails.actualPaymentAmount = 0;
-            goodsDetails.activity = "买"+buyNum+"送1";
-            // 清除该商品买一送一条件
-            vm.boughtNum.delete(goodsDetails.proBarcode);
-        }else{
-            // 如果不相等,已经购买数量+1
-            vm.boughtNum.set(goodsDetails.prodBarcode , boughtNum+1);
         }
 
+    }
+
+    if(brandMysy){
+        var buyNum = brandMysy.buyNum;
+        if(type == "add"){
+
+            // 如果不是买一送一,而是买n送n,先获取购物车已有该类型商品数量
+            var boughtNum = vm.boughtNum.get(goodsDetails.brand);
+            // 如果没有,置为1
+            if(!boughtNum){
+                vm.boughtNum.set(goodsDetails.brand , 1);
+                return ;
+            }
+            // 走到这里,证明购买过该类型商品,且数量不是买一送一的
+            // 如果相等,证明达到送的条件
+            if(buyNum === boughtNum + 1){
+                var mysyNum = vm.freeBardcode.get(brandMysy.giftBarcode);
+                if(!mysyNum){
+                    mysyNum = 0;
+                }
+                vm.freeBardcode.set(brandMysy.giftBarcode,mysyNum + 1);
+                vm.boughtNum.set(goodsDetails.brand,0);
+            }else{
+                // 如果不相等,已经购买数量+1
+                vm.boughtNum.set(goodsDetails.brand , boughtNum+1);
+            }
+        }else if (type == "minus"){
 
+            var mysyNum = vm.boughtNum.get(goodsDetails.brand);
+            if(mysyNum == 0){
+                if(vm.freeBardcode.get(brandMysy.giftBarcode) == 0){
+                    vm.freeBardcode.set(brandMysy.giftBarcode,-1);
+                }else{
+                    vm.freeBardcode.set(brandMysy.giftBarcode,vm.freeBardcode.get(brandMysy.giftBarcode) - 1);
+                }
+                vm.boughtNum.set(goodsDetails.brand,buyNum - 1);
+            }else{
+                vm.boughtNum.set(goodsDetails.brand,mysyNum - 1);
+
+            }
+            // var freeNum = vm.freeBardcode.get(brandMysy.giftBarcode);
+            // if(freeNum > 0){
+            //     vm.freeBardcode.set(brandMysy.giftBarcode,freeNum - 1);
+            //
+            // }
+
+        }
     }
 
+    
+    
+    
     // 判断当前商品是否为赠品
     // isSend(vm.mysy,goodsDetails,"买一送一");
     // 判断购物车里面是否有商品为赠品
@@ -204,9 +299,8 @@ function isSend(activity,goodsDetails,activityName){
         var index = activity.indexOf(goodsDetails.prodBarcode);
         activity.splice(index,1);
         // 设置赠品的单价
-        goodsDetails.discountedPrice = goodsDetails.retailPrice;
-        goodsDetails.actualPaymentAmount = 0;
-        goodsDetails.activity = activityName;
+        goodsDetails.discountedPrice = goodsDetails.retailPrice - 1;
+        goodsDetails.actualPaymentAmount = 1;
     }
 }
 
@@ -376,7 +470,10 @@ let vm = new Vue({
         },
         // 买一送一
         mysy: [],
-        newMysy: new Map(),
+        freeBardcode : new Map(),
+        modifyShopcart:false, // 是否需要修改购物车中商品信息
+        brandGetOneFree : new Map(),
+        barcodeGetOneFree: new Map(),
         boughtNum: new Map(),
         // 组合价
         zhjsp: new Map(),
@@ -389,6 +486,7 @@ let vm = new Vue({
         reduceMoney:0, // 满减金额
         showReduceMoney:0, // 用于展示的满减金额
         // 满赠
+        useMz:false,
         mz: new Map(),
         accumulatedAmountForFullGift: new Map(), // 累积金额(满赠使用的)
         fullGiftCode:[],// 满赠商品条码
@@ -399,6 +497,8 @@ let vm = new Vue({
         // 挂起订单的key 在1~3循环
         pendingIndex:1,
         pendingOrderKeys:[],
+        // 存储商品信息
+        goodsMap:new Map(),
     },
     methods: {
         query: function () {
@@ -406,43 +506,14 @@ let vm = new Vue({
             var thisGoods = {};
             $.get("../goods/details/"+vm.prodBarcode+"/"+vm.storeId, function (r) {
                 if (r.code == 0) {
-                    vm.prodBarcode = '';
-                    // r.goodsDetails.discountedPrice = 0;
-                    // r.goodsDetails.actualPaymentAmount = r.goodsDetails.retailPrice;
 
-                    calculateGoodsPrice(r);
-                    vm.goodsDetail = true;
-                    // thisGoods.name = r.goodsDetails.name;// thisGoods.primaryPicUrl = r.goodsDetails.primaryPicUrl; // thisGoods.retailPrice = r.goodsDetails.retailPrice;// thisGoods.specification = r.goodsDetails.specification; // thisGoods.prodBarcode = r.goodsDetails.prodBarcode;// thisGoods.stockNum = r.goodsDetails.stockNum;//  thisGoods.goodsDesc = r.goodsDetails.goodsDesc;// thisGoods.sellVolume = 1;// thisGoods.id = vm.index++;
                     r.goodsDetails.sellVolume = 1;
-                    r.goodsDetails.id = vm.index++;
-                    if(!vm.goodsList[vm.index]){
-                        vm.index = vm.max;
-                    }
-                    vm.max++;
-                    r.goodsDetails.goodsDesc = "";
-
-                    r.goodsDetails.discountedPrice =  Math.round(r.goodsDetails.discountedPrice * 100) / 100;
-                    r.goodsDetails.actualPaymentAmount =  Math.round(r.goodsDetails.actualPaymentAmount * 100) / 100;
-                    // r.goodsDetails.primaryPicUrl = "";
-                    var data = Object.assign({}, JSON.parse(JSON.stringify(r.goodsDetails)));
-                    vm.goodsList.push(data);
-                    vm.goods = r.goodsDetails;
-
-                    vm.totalPrice = (vm.totalPrice + r.goodsDetails.retailPrice);
-                    if(vm.reduceMoney > 0){
-                        vm.discountedPrice = vm.discountedPrice + r.goodsDetails.discountedPrice + vm.reduceMoney;
-                        vm.actualPrice = vm.actualPrice + r.goodsDetails.actualPaymentAmount - vm.reduceMoney;
-                        vm.showReduceMoney = vm.showReduceMoney + vm.reduceMoney;
-                        vm.reduceMoney = 0;
-                    }else{
-                        vm.discountedPrice = vm.discountedPrice + r.goodsDetails.discountedPrice ;
-                        vm.actualPrice = vm.actualPrice + r.goodsDetails.actualPaymentAmount ;
-                    }
-                    // 处理精度
-                    vm.totalPrice =  Math.round(vm.totalPrice * 100) / 100;
-                    vm.discountedPrice =  Math.round(vm.discountedPrice * 100) / 100;
-                    vm.actualPrice =  Math.round(vm.actualPrice * 100) / 100;
-                    vm.showReduceMoney =  Math.round(vm.showReduceMoney * 100) / 100;
+                    vm.goodsMap.set(r.goodsDetails.goodsSn,JSON.parse(JSON.stringify(r.goodsDetails)));
+                    vm.prodBarcode = '';
+                    calculateGoodsPrice(r);
+                    handle(r.goodsDetails,"add");
+
+
 
                 } else {
                     alert(r.msg);
@@ -454,9 +525,11 @@ let vm = new Vue({
             // 增加数量
             for(var i = 0 ; i < this.goodsList.length ; i++){
                 if(this.goodsList[i].id == value){
-                    var goods = this.goodsList[i];
-                    goods.sellVolume = goods.sellVolume + 1;
-                    vm.totalPrice = vm.totalPrice + goods.retailPrice;
+                    var goodsDetails = JSON.parse(JSON.stringify(vm.goodsMap.get(this.goodsList[i].goodsSn)));
+                    calculateGoodsByMj(goodsDetails,"add");
+                    calculateGoodsByMysy(goodsDetails,"add");
+                    // calculateGoodsByMz(goodsDetails,"add");
+                    handle(goodsDetails,"add");
                     break;
                 }
             }
@@ -465,13 +538,37 @@ let vm = new Vue({
             // 减少数量
             for(var i = 0 ; i < this.goodsList.length ; i++){
                 if(this.goodsList[i].id == value){
-                    var goods = this.goodsList[i];
-                    if(goods.sellVolume === 1){
+                    // 获取当前购物车的数量
+                    var g = JSON.parse(JSON.stringify(this.goodsList[i]));
+
+                    console.log(g);
+                    var goodsDetails = JSON.parse(JSON.stringify(vm.goodsMap.get(this.goodsList[i].goodsSn)));
+                    if(g.sellVolume === 1){
                         alert("数量至少为1个");
                         return ;
                     }
-                    goods.sellVolume = goods.sellVolume - 1;
-                    vm.totalPrice = vm.totalPrice - goods.retailPrice;
+                    // 如果不为空,证明减的是买A送B中的B,这时候要还原赠送资格跟B的扣减
+                    var freeMap = vm.freeBardcode.get(goodsDetails.prodBarcode);
+                    if((freeMap || freeMap == 0) && g.actualPaymentAmount == 0){
+                        vm.freeBardcode.set(goodsDetails.prodBarcode,freeMap + 1);
+                        goodsDetails.sellVolume = -1;
+                        goodsDetails.actualPaymentAmount = 0;
+                        goodsDetails.discountedPrice = -goodsDetails.retailPrice;
+                        goodsDetails.goodstaxes = - goodsDetails.goodstaxes;
+                        goodsDetails.retailPrice = - goodsDetails.retailPrice;
+                    }else{
+                        goodsDetails.sellVolume = g.sellVolume;
+                        calculateGoodsByMj(goodsDetails,"minus");
+                        calculateGoodsByMysy(goodsDetails,"minus");
+                        // calculateGoodsByMz(goodsDetails,"minus");
+                        goodsDetails.sellVolume = -1;
+                        goodsDetails.actualPaymentAmount = -goodsDetails.actualPaymentAmount;
+                        goodsDetails.discountedPrice = -goodsDetails.discountedPrice;
+                        goodsDetails.goodstaxes = - goodsDetails.goodstaxes;
+                        goodsDetails.retailPrice = - goodsDetails.retailPrice;
+                    }
+
+                    handle(goodsDetails,"minus");
                     break;
                 }
             }
@@ -482,8 +579,38 @@ let vm = new Vue({
             // 删除这条记录
             for(var i = 0 ; i < this.goodsList.length ; i++){
                 if(this.goodsList[i].id == value){
+                    if(this.goodsList.length == 1){
+                        vm.goods = {};
+                        vm.goodsDetail = false;
+                    }
+                    if(vm.mz.get(this.goodsList[i].prodBarcode)){
+                        vm.mz.get(this.goodsList[i].prodBarcode).useMz = false ;
+                    }
+                    if(vm.brandGetOneFree.get(this.goodsList[i].brand)){
+                        var giftBarcode = vm.brandGetOneFree.get(this.goodsList[i].brand).giftBarcode;
+                        var muilty = vm.brandGetOneFree.get(this.goodsList[i].brand).buyNum;
+                        var sellNum = this.goodsList[i].sellVolume;;
+                        vm.freeBardcode.set(giftBarcode,sellNum/muilty);
+
+                        for(var j = 0 ; j < vm.goodsList.length ; j++){
+                            var shopcartGoods = vm.goodsList[j];
+                            var shopcartFree = vm.freeBardcode.get(shopcartGoods.prodBarcode);
+                            if(shopcartFree /*&& shopcartGoods.actualPaymentAmount*/){
+                                shopcartGoods.actualPaymentAmount = shopcartGoods.actualPaymentAmount + (shopcartGoods.retailPrice * shopcartFree);
+                                shopcartGoods.discountedPrice = shopcartGoods.discountedPrice - (shopcartGoods.retailPrice * shopcartFree);
+                                vm.freeBardcode.set(shopcartGoods.prodBarcode, 0);// 重置回0
+
+                            }
+
+                        }
+
+                    }
                     var goods = this.goodsList[i];
+                    console.log(goods);
                     vm.totalPrice = vm.totalPrice - (goods.retailPrice * goods.sellVolume);
+                    vm.discountedPrice = vm.discountedPrice - goods.discountedPrice;
+                    vm.actualPrice = vm.actualPrice - goods.actualPaymentAmount;
+                    vm.boughtNum.delete(goods.prodBarcode);
                     this.goodsList.splice(i,1);
                     break;
                 }
@@ -577,7 +704,6 @@ let vm = new Vue({
                             vm.customidcard = '';
                             vm.customClearData();
 
-                            // alert('打印小票完成');
                         }else{
                             // alert("打印小票失败");
                         }
@@ -597,7 +723,10 @@ let vm = new Vue({
             vm.goodsDetail = false;
             // 买一送一
             vm.mysy = [];
-            vm.newMysy = new Map();
+            vm.freeBardcode = new Map();
+            vm.brandGetOneFree = new Map();
+            vm.barcodeGetOneFree = new Map();
+            vm.brandGetOneFree = new Map();
             vm.boughtNum = new Map();
             // 组合价
             vm.zhjsp = new Map();
@@ -631,8 +760,6 @@ let vm = new Vue({
             $.post("http://127.0.0.1:8000/idcard/read", function (r){
                 // var dataR = JSON.parse(r);
                 // console.log(dataR)
-                console.log(r)
-                console.log(r.code)
 
                 if(r.code == "0"){
                     // if(!r.info){
@@ -695,7 +822,6 @@ let vm = new Vue({
             let userInfoBindingValue = this.userInfo.customName+this.userInfo.customIDCard;
             this.userInfoBinding[userInfoBindingKey] = userInfoBindingValue;
 
-            console.log(this.userInfo.couponSn);
             if(this.userInfo.couponSn && this.userInfo.couponSn != ""){
 
 
@@ -959,8 +1085,8 @@ function openWebSocket() {
         //无法使用wss,浏览器打开WebSocket时报错
         //ws对应http、wss对应https。
         // webSocket = new WebSocket("ws://183.62.225.124:8080/ws/server/"+storeId);
-        // webSocket = new WebSocket("ws://127.0.0.1:8080//ws/server/"+storeId);
-        webSocket = new WebSocket("wss://cb.k1net.cn/ws/server/"+storeId);
+        webSocket = new WebSocket("ws://127.0.0.1:8080//ws/server/"+storeId);
+        // webSocket = new WebSocket("wss://cb.k1net.cn/ws/server/"+storeId);
         if (webSocket.readyState === webSocket.CONNECTING) {
             console.log('1.连接正在打开......');
         }
@@ -1221,4 +1347,135 @@ function removeByValue(arr, val) {
     }
 }
 
+function handle(goodsDetails,operatorType){
+    vm.goodsDetail = true;
+    // goodsDetails.sellVolume = 1;
+    goodsDetails.id = vm.index;
+    if(!vm.goodsList[vm.index]){
+        vm.index = vm.max;
+    }
+    vm.max++;
+    goodsDetails.goodsDesc = "";
+
+
+    // 判断当前商品是否是赠品
+        var freeMap = vm.freeBardcode.get(goodsDetails.prodBarcode);
+        if(freeMap && "minus" != operatorType){
+            goodsDetails.actualPaymentAmount = 0;
+            goodsDetails.discountedPrice = goodsDetails.retailPrice;
+            vm.freeBardcode.set(goodsDetails.prodBarcode,freeMap - 1);
+        }else{
+            if(!freeMap && freeMap != 0 ){
+            // 判断购物车中是否有赠品   这个操作只有是非赠品才能进来
+                for(var i = 0 ; i < vm.goodsList.length ; i++){
+                    var shopcartGoods = vm.goodsList[i];
+                    var shopcartFree = vm.freeBardcode.get(shopcartGoods.prodBarcode);
+                    if(shopcartFree /*&& shopcartGoods.actualPaymentAmount*/){
+                        // if("minus" != operatorType){
+                            var shopcartSellNum = shopcartGoods.sellVolume;
+                            if(shopcartFree > shopcartSellNum){
+                                shopcartGoods.actualPaymentAmount = 0;
+                                shopcartGoods.discountedPrice = shopcartGoods.retailPrice * shopcartFree;
+
+                                vm.discountedPrice = vm.discountedPrice + shopcartGoods.discountedPrice ;
+                                vm.actualPrice = vm.actualPrice + shopcartGoods.actualPaymentAmount ;
+
+                                vm.freeBardcode.set(shopcartGoods.prodBarcode,shopcartFree - 1);//
+                            }else if(shopcartFree == -1 ){
+                                // g.actualPaymentAmount == 0){
+                                shopcartGoods.actualPaymentAmount = shopcartGoods.retailPrice + shopcartGoods.actualPaymentAmount;
+                                shopcartGoods.discountedPrice = shopcartGoods.discountedPrice - shopcartGoods.retailPrice;
+
+                                vm.discountedPrice = vm.discountedPrice + shopcartGoods.discountedPrice ;
+                                vm.actualPrice = vm.actualPrice + shopcartGoods.actualPaymentAmount ;
+
+                                vm.freeBardcode.set(shopcartGoods.prodBarcode,0);// 重置回0
+                            }else{
+                                if(shopcartGoods.actualPaymentAmount > 0){
+                                    shopcartGoods.actualPaymentAmount = shopcartGoods.actualPaymentAmount - (shopcartGoods.retailPrice * shopcartFree);
+                                    shopcartGoods.discountedPrice = shopcartGoods.discountedPrice + (shopcartGoods.retailPrice * shopcartFree);
+
+                                    vm.actualPrice = vm.actualPrice - (shopcartGoods.retailPrice * shopcartFree) ;
+                                    vm.discountedPrice = vm.discountedPrice + (shopcartGoods.retailPrice * shopcartFree) ;
+
+                                    vm.freeBardcode.set(shopcartGoods.prodBarcode, shopcartFree - 1);// 重置回0
+                                }
+                            }
+                        // }
+                    }
+
+                }
+            }
+        }
+
+
+
+
+
+
+
+    goodsDetails.discountedPrice =  Math.round(goodsDetails.discountedPrice * 100) / 100;
+    goodsDetails.actualPaymentAmount =  Math.round(goodsDetails.actualPaymentAmount * 100) / 100;
+    var data = Object.assign({}, JSON.parse(JSON.stringify(goodsDetails)));
+    var isPush = true;
+    // 判断当前商品是否添加过
+    for(var i = 0 ; i < vm.goodsList.length ; i++){
+        if(vm.goodsList[i].goodsSn == data.goodsSn){
+            var goodsDetails = vm.goodsList[i];
+            if(data.actualPaymentAmount < 0 && goodsDetails.actualPaymentAmount == 0){
+                // goodsDetails.goodstaxes = Math.round((parseFloat(goodsDetails.goodstaxes) -  parseFloat(data.goodstaxes)) * 100)/100;
+                // goodsDetails.discountedPrice = Math.round((parseFloat(goodsDetails.discountedPrice) -  parseFloat(data.discountedPrice)) * 100)/100;
+                goodsDetails.actualPaymentAmount = 0;
+            }else{
+                // 税 goodstaxes,优惠金额 discountedPrice,实际支付 actualPaymentAmount,数量 sellVolume 45636917
+                goodsDetails.actualPaymentAmount = Math.round((parseFloat(goodsDetails.actualPaymentAmount) +  parseFloat(data.actualPaymentAmount)) * 100)/100;
+            }
+            goodsDetails.discountedPrice = Math.round((parseFloat(goodsDetails.discountedPrice) +  parseFloat(data.discountedPrice)) * 100)/100;
+            goodsDetails.goodstaxes = Math.round((parseFloat(goodsDetails.goodstaxes) +  parseFloat(data.goodstaxes)) * 100)/100;
+            goodsDetails.sellVolume = Math.round((parseFloat(goodsDetails.sellVolume) +  parseFloat(data.sellVolume)) * 100)/100;
+            goodsDetails.activity = data.activity;
+            isPush = false;
+            break;
+        }
+    }
+    // for(var i = 0 ; i < vm.goodsList.length ; i++){
+    //     if(vm.goodsList[i].goodsSn == data.goodsSn){
+    //         var goodsDetails = vm.goodsList[i];
+    //         // 税 goodstaxes,优惠金额 discountedPrice,实际支付 actualPaymentAmount,数量 sellVolume 45636917
+    //         goodsDetails.goodstaxes = Math.round((parseFloat(goodsDetails.goodstaxes) +  parseFloat(data.goodstaxes)) * 100)/100;
+    //         goodsDetails.discountedPrice = Math.round((parseFloat(goodsDetails.discountedPrice) +  parseFloat(data.discountedPrice)) * 100)/100;
+    //         goodsDetails.actualPaymentAmount = Math.round((parseFloat(goodsDetails.actualPaymentAmount) +  parseFloat(data.actualPaymentAmount)) * 100)/100;
+    //         goodsDetails.sellVolume = Math.round((parseFloat(goodsDetails.sellVolume) +  parseFloat(data.sellVolume)) * 100)/100;
+    //         goodsDetails.activity = data.activity;
+    //         isPush = false;
+    //         break;
+    //     }
+    // }
+    if(isPush){
+        vm.goodsList.push(data);
+        vm.index = vm.index + 1;
+    }
+    vm.totalPrice = (vm.totalPrice + data.retailPrice);
+    if(vm.reduceMoney > 0){
+        vm.discountedPrice = vm.discountedPrice + data.discountedPrice + vm.reduceMoney;
+        vm.actualPrice = vm.actualPrice + data.actualPaymentAmount - vm.reduceMoney;
+        vm.showReduceMoney = vm.showReduceMoney + vm.reduceMoney;
+        vm.reduceMoney = 0;
+    }else{
+        vm.discountedPrice = vm.discountedPrice + data.discountedPrice ;
+        vm.actualPrice = vm.actualPrice + data.actualPaymentAmount ;
+    }
+    if(data.sellVolume < 0){
+        data.sellVolume = - data.sellVolume;
+        data.retailPrice = - data.retailPrice;
+        data.goodstaxes = -data.goodstaxes;
+    }
+    vm.goods = data;
+    // 处理精度
+    vm.totalPrice =  Math.round(vm.totalPrice * 100) / 100;
+    vm.discountedPrice =  Math.round(vm.discountedPrice * 100) / 100;
+    vm.actualPrice =  Math.round(vm.actualPrice * 100) / 100;
+    vm.showReduceMoney =  Math.round(vm.showReduceMoney * 100) / 100;
+}
+
 

BIN
kmall-admin/src/main/webapp/statics/file/activities_get_one_free_goods_yyyy_mm_dd_v1.0.0.xlsx


+ 5 - 5
kmall-manager/src/main/resources/log4j.properties

@@ -1,23 +1,23 @@
 log4j.rootLogger=INFO,stdout,file
-#控制台输出
+#\u63A7\u5236\u53F0\u8F93\u51FA
 log4j.appender.stdout=org.apache.log4j.ConsoleAppender
 log4j.appender.stdout.Target=System.out
 log4j.appender.stdout.Threshold=INFO
 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
 log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss SSS}|%5p|%F.%M:%L|%m%n
-#INFO所有日志
+#INFO\u6240\u6709\u65E5\u5FD7
 log4j.logger.file=info
 log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
 log4j.appender.file.File=../logs/junitTestInfo.log
 log4j.appender.file.datePattern='.'yyyy-MM-dd'.log'
 log4j.appender.file.append=true
 log4j.appender.file.Threshold=INFO
-log4j.appender.file.encoding=UTF-8
+log4j.appender.file.encoding=GBK
 log4j.appender.file.ImmediateFlush=true
 log4j.appender.file.layout=org.apache.log4j.PatternLayout
 log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss SSS}|%5p|%F.%M:%L|%m%n
-#控制台输出所有SQL
-#便于调试  生产环境注释
+#\u63A7\u5236\u53F0\u8F93\u51FA\u6240\u6709SQL
+#\u4FBF\u4E8E\u8C03\u8BD5  \u751F\u4EA7\u73AF\u5883\u6CE8\u91CA
 log4j.logger.com.kmall.framework.dao=DEBUG,sql
 log4j.appender.sql=org.apache.log4j.ConsoleAppender
 log4j.appender.sql.Target=System.out