Sfoglia il codice sorgente

Merge branch 'master' of lhm/kmall-haikong into master

lhm 3 anni fa
parent
commit
8eb22db363

+ 12 - 70
kmall-admin/src/main/java/com/kmall/admin/controller/GoodsController.java

@@ -1,6 +1,7 @@
 package com.kmall.admin.controller;
 
 import com.alibaba.fastjson.JSON;
+import com.kmall.admin.dto.GoodsDetailsDto;
 import com.kmall.admin.dto.GoodsDto;
 import com.kmall.admin.dto.GoodsPanoramaDto;
 import com.kmall.admin.entity.GoodsEntity;
@@ -569,9 +570,9 @@ public class GoodsController {
         return R.ok().put("goods", goods);
     }
 
-    @RequestMapping("/details/{prodBarcode}/{storeId}/{sku}")
+    @RequestMapping("/details/{prodBarcode}/{storeId}/{sku}/{sellVolume}")
 //    @RequiresPermissions("goods:details") http://127.0.0.1:8080/goods/details/11111
-    public R details(@PathVariable("prodBarcode")String prodBarcode,@PathVariable("storeId")String storeId,@PathVariable("sku")String sku) {
+    public R details(@PathVariable("prodBarcode")String prodBarcode,@PathVariable("storeId")String storeId,@PathVariable("sku")String sku, @PathVariable("sellVolume") Integer sellVolume) {
         SysUserEntity user = ShiroUtils.getUserEntity();
         if(user == null) {
             return R.error("用户登录超时,请重新登录");
@@ -581,7 +582,7 @@ public class GoodsController {
         }
         Map<String,Object> map = null;
         try {
-            map = goodsService.calculateGoodsDetail(prodBarcode,storeId,sku);
+            map = goodsService.calculateGoodsDetail(prodBarcode,storeId,sku, sellVolume);
         } catch (ServiceException e) {
             log.error("查询订单详情出现异常!", e);
             return R.error(e.getMessage());
@@ -595,9 +596,9 @@ public class GoodsController {
         return R.ok().put("goodsDetails", map.get("goods")).put("map",map);
     }
 
-    @RequestMapping("/detailsOld/{prodBarcode}/{storeId}")
+    @RequestMapping("/detailsOld/{prodBarcode}/{storeId}/{sellVolume}")
 //    @RequiresPermissions("goods:details") http://127.0.0.1:8080/goods/details/11111
-    public R details(@PathVariable("prodBarcode")String prodBarcode,@PathVariable("storeId")String storeId) {
+    public R details(@PathVariable("prodBarcode")String prodBarcode,@PathVariable("storeId")String storeId, @PathVariable("sellVolume") Integer sellVolume) {
         SysUserEntity user = ShiroUtils.getUserEntity();
         if(user == null) {
             return R.error("用户登录超时,请重新登录");
@@ -607,7 +608,7 @@ public class GoodsController {
         }
         Map<String,Object> map = null;
         try {
-            map = goodsService.calculateGoodsDetail(prodBarcode,storeId,null);
+            map = goodsService.calculateGoodsDetail(prodBarcode,storeId,null, sellVolume);
         } catch (ServiceException e) {
             log.error("查询订单详情出现异常!", e);
             return R.error(e.getMessage());
@@ -621,83 +622,24 @@ public class GoodsController {
         return R.ok().put("goodsDetails", map.get("goods")).put("map",map);
     }
 
-    // storeId + sku + prodBarcode
-    @RequestMapping(value = "/number/minus/{storeId}/{sku}/{prodBarcode}", method = RequestMethod.GET)
-    public R minus(@PathVariable("storeId") String storeId, @PathVariable("sku") String sku, @PathVariable("prodBarcode") String prodBarcode) {
-        String key = Constants.WAREHOUSE_STOCK_MAP_KEY + "_" + storeId;
-        String itemKey = storeId + sku + prodBarcode;
-
-        try {
-            String cartNumber = JedisUtil.hget(key, itemKey);
-            int number = Integer.parseInt(cartNumber);
-            JedisUtil.hset(key, itemKey, String.valueOf(++number));
-        } catch (Exception e) {
-            log.error("storeId:【{}】,sku:【{}】,prodBarcode:【{}】,扣减购物篮商品数量失败!", storeId, sku, prodBarcode);
-            return R.error("扣减购物篮商品数量失败!请删除购物篮商品后重试!");
-        }
-
-        return R.ok();
-    }
-
     @RequestMapping(value = "/number/add/{storeId}/{sku}/{prodBarcode}/{sellVolume}", method = RequestMethod.GET)
     public R add(@PathVariable("storeId") String storeId,
                  @PathVariable("sku") String sku,
                  @PathVariable("prodBarcode") String prodBarcode,
                  @PathVariable("sellVolume") Integer sellVolume) {
-        String key = Constants.WAREHOUSE_STOCK_MAP_KEY + "_" + storeId;
-        String itemKey = storeId + sku + prodBarcode;
-
-        try {
-            GoodsEntity goodsEntity = goodsService.queryGoodsStockByBarcodeAndStoreIdAndSku(prodBarcode, Integer.parseInt(storeId), sku);
-            Integer exitRegionNumber = goodsEntity.getExitRegionNumber();
-            Integer stockNum = goodsEntity.getStockNum();
-            String number = JedisUtil.hget(key, itemKey);
-            int cartNumber = Integer.parseInt(number);
-            if (stockNum + cartNumber - exitRegionNumber >= sellVolume) {
-                JedisUtil.hset(key, itemKey, String.valueOf(--cartNumber));
-            } else {
-                log.error("增加商品数量失败!保税仓库存不足!storeId:【{}】,sku:【{}】,prodBarcode:【{}】,stockNum:【{}】,exitRegionNumber:【{}】,wareStockNumber:【{}】"
-                , storeId, sku, prodBarcode, stockNum, exitRegionNumber, cartNumber);
-                return R.error("增加商品数量失败!保税仓库存不足!");
-            }
-        } catch (Exception e) {
-            log.error("storeId:【{}】,sku:【{}】,prodBarcode:【{}】,增加购物篮商品数量失败!", storeId, sku, prodBarcode);
-            return R.error("增加购物篮商品数量失败!请删除购物篮商品后重试!");
-        }
-
-        return R.ok();
-    }
-
-    @RequestMapping(value = "/number/del/{storeId}/{sku}/{prodBarcode}", method = RequestMethod.GET)
-    public R del(@PathVariable("storeId") String storeId, @PathVariable("sku") String sku, @PathVariable("prodBarcode") String prodBarcode) {
-        String key = Constants.WAREHOUSE_STOCK_MAP_KEY + "_" + storeId;
-        String itemKey = storeId + sku + prodBarcode;
 
         try {
-            JedisUtil.hdel(key, itemKey);
+            GoodsDetailsDto goodsDetailsDto = goodsService.queryGoodsDetailsByProdBarcode(prodBarcode, storeId, sku);
+            goodsDetailsDto.setSellVolume(sellVolume);
+            goodsService.validateWarehouseStock(goodsDetailsDto, prodBarcode, sku, storeId);
         } catch (Exception e) {
-            log.error("storeId:【{}】,sku:【{}】,prodBarcode:【{}】,删除购物篮商品失败!", storeId, sku, prodBarcode);
-            return R.error("删除购物篮商品失败!请刷新收银端页面!");
+            log.error("storeId:【{}】,sku:【{}】,prodBarcode:【{}】,增加购物篮商品数量失败!", storeId, sku, prodBarcode, e);
+            return R.error("校验库存===>" + e.getMessage());
         }
 
         return R.ok();
     }
 
-    @RequestMapping(value = "/number/clear/{storeId}", method = RequestMethod.GET)
-    public R clear(@PathVariable("storeId") String storeId) {
-        String key = Constants.WAREHOUSE_STOCK_MAP_KEY + "_" + storeId;
-
-        try {
-            JedisUtil.del(key);
-        } catch (Exception e) {
-            log.error("storeId:【{}】,清空购物篮商品失败!", storeId);
-            return R.error("清空购物篮商品失败!请刷新收银端页面!");
-        }
-
-        return R.ok();
-    }
-
-
     /**
      * 多sku可选
      * @param prodBarcode

+ 1 - 0
kmall-admin/src/main/java/com/kmall/admin/haikong/constant/ErrorCodeConstants.java

@@ -12,6 +12,7 @@ public class ErrorCodeConstants {
      */
     public enum MemberSysErrorCodeEnum {
         CODE_0(0, "成功"),
+        CODE_401(401, "无效token,稍后再试!"),
         CODE_500(500, "系统繁忙"),
         CODE_1001(1001, "参数不合法"),
         CODE_150007(150007, "退款积分超出上线"),

+ 2 - 2
kmall-admin/src/main/java/com/kmall/admin/haikong/constant/HaiKongMemberSystemUrlEnum.java

@@ -40,11 +40,11 @@ public enum HaiKongMemberSystemUrlEnum {
     /**
      * 查询会员优惠券,不用对接
      */
-    QUERY_MEMBER_COUPON("GET", "/gateway/wk.coupon.user.list/v1","查询会员优惠券接口"),
+    QUERY_MEMBER_COUPON("GET", "/gw/gateway/wk.coupon.user.list/v1","查询会员优惠券接口"),
     /**
      * 会员消费订单同步接口
      */
-    MEMBER_ORDER_SYNC("POST", "/gateway/wk.user.order.add/v1","会员消费订单同步接口"),
+    MEMBER_ORDER_SYNC("POST", "/gw/gateway/wk.user.order.add/v1","会员消费订单同步接口"),
 
     ;
 

+ 1 - 1
kmall-admin/src/main/java/com/kmall/admin/haikong/dto/MemberOrderInfoSyncDTO.java

@@ -60,7 +60,7 @@ public class MemberOrderInfoSyncDTO implements Serializable {
     /**
      * 这笔订单需要发放的积分
      */
-    @JsonProperty("score")
+    @JsonProperty("order_score")
     private Integer orderScore;
 
     public Long getStoreId() {

+ 4 - 4
kmall-admin/src/main/java/com/kmall/admin/haikong/task/MemberOrderSyncResendTask.java

@@ -57,18 +57,18 @@ public class MemberOrderSyncResendTask {
             haiKongMemberOrderSyncResendEntity.setLastResendTime(new Date());
             log.info("【重发】请求会员消费订单同步接口!请求体:{}", body);
             try {
-                String responseJson = haiKongMemberTemplate.changeMemberScore(body);
+                String responseJson = haiKongMemberTemplate.memberOrderSync(body);
                 Response<String> response = JacksonUtil.fromListJson(responseJson, new TypeReference<Response<String>>() {});
-                if (Objects.nonNull(response) && ErrorCodeConstants.MemberSysErrorCodeEnum.CODE_0.getCode().equals(response.getCode())) {
+                if (Objects.nonNull(response) && response.getSuccess()) {
                     haiKongMemberOrderSyncResendEntity.setMemberSysOrderId(response.getData());
                     haiKongMemberOrderSyncResendEntity.setResendStatus(HaiKongMemberOrderResendStatusEnum.RESEND_SUCCESS.getStatus());
                     successList.add(haiKongMemberOrderSyncResendEntity);
                     log.info("【重发】请求会员消费订单同步接口成功!响应数据:{}", responseJson);
-                } else if (Objects.nonNull(response) && ErrorCodeConstants.MemberSysErrorCodeEnum.CODE_500.getCode().equals(response.getCode())) {
+                }/* else if (Objects.nonNull(response) && ErrorCodeConstants.MemberSysErrorCodeEnum.CODE_500.getCode().equals(response.getCode())) {
                     haiKongMemberOrderSyncResendEntity.setResendStatus(HaiKongMemberOrderResendStatusEnum.RESEND_FAILED.getStatus());
                     failedList.add(haiKongMemberOrderSyncResendEntity);
                     log.error("【重发】请求会员消费订单同步接口失败!响应:{}", responseJson);
-                } else {
+                }*/ else {
                     haiKongMemberOrderSyncResendEntity.setResendStatus(HaiKongMemberOrderResendStatusEnum.NON_RESEND.getStatus());
                     failedList.add(haiKongMemberOrderSyncResendEntity);
                     log.error("【重发】请求会员消费订单同步接口失败!响应:{}", responseJson);

+ 28 - 0
kmall-admin/src/main/java/com/kmall/admin/haikong/vo/CalculateOrderDiscountPriceResponseVO.java

@@ -19,6 +19,16 @@ public class CalculateOrderDiscountPriceResponseVO {
     private String memberPhone;
 
     /**
+     * 会员当前可用积分
+     */
+    private Integer memberCurrentAvailableScore;
+
+    /**
+     * 会员等级名称
+     */
+    private String levelName;
+
+    /**
      * 抵扣积分
      */
     private Integer deductionScore;
@@ -121,11 +131,29 @@ public class CalculateOrderDiscountPriceResponseVO {
         this.openId = openId;
     }
 
+    public Integer getMemberCurrentAvailableScore() {
+        return memberCurrentAvailableScore;
+    }
+
+    public void setMemberCurrentAvailableScore(Integer memberCurrentAvailableScore) {
+        this.memberCurrentAvailableScore = memberCurrentAvailableScore;
+    }
+
+    public String getLevelName() {
+        return levelName;
+    }
+
+    public void setLevelName(String levelName) {
+        this.levelName = levelName;
+    }
+
     @Override
     public String toString() {
         return "CalculateOrderDiscountPriceResponseVO{" +
                 "orderTotalPrice=" + orderTotalPrice +
                 ", memberCode='" + memberCode + '\'' +
+                ", memberCurrentAvailableScore='" + memberCurrentAvailableScore + '\'' +
+                ", levelName='" + levelName + '\'' +
                 ", memberPhone='" + memberPhone + '\'' +
                 ", deductionScore=" + deductionScore +
                 ", scoreDeductionPrice=" + scoreDeductionPrice +

+ 3 - 1
kmall-admin/src/main/java/com/kmall/admin/service/GoodsService.java

@@ -170,7 +170,7 @@ public interface GoodsService {
      * @param storeId
      * @return
      */
-    Map<String,Object> calculateGoodsDetail(String prodBarcode, String storeId,String sku);
+    Map<String,Object> calculateGoodsDetail(String prodBarcode, String storeId,String sku, Integer sellVolume);
 
     /**
      * 根据条形码查询商品
@@ -250,4 +250,6 @@ public interface GoodsService {
      * @return              更新数
      */
     int updateStockNumberByProductCodeAndSku(GoodsEntity goodsEntity);
+
+    void validateWarehouseStock(GoodsDetailsDto goods, String prodBarcode, String sku, String storeId);
 }

+ 84 - 82
kmall-admin/src/main/java/com/kmall/admin/service/impl/GoodsServiceImpl.java

@@ -1555,7 +1555,7 @@ public class GoodsServiceImpl implements GoodsService {
      */
     @Override
     @Transactional
-    public synchronized Map<String,Object> calculateGoodsDetail(String prodBarcode, String storeId, String sku) {
+    public synchronized Map<String,Object> calculateGoodsDetail(String prodBarcode, String storeId, String sku, Integer sellVolume) {
         /**
          * 1.首先根据商品条码跟门店id查询是否有库存,没库存直接返回
          */
@@ -1563,94 +1563,17 @@ public class GoodsServiceImpl implements GoodsService {
         if(goods == null) {
             return null;
         }
-
-        String env = environment.getProperty("haikong.env");
+        goods.setSellVolume(sellVolume);
 
         /*
         * 2. 查询海仓仓库系统,判断库存是否足够
         * */
-        sku = org.springframework.util.StringUtils.isEmpty(sku) ? goods.getSku() : sku;
+        /*sku = org.springframework.util.StringUtils.isEmpty(sku) ? goods.getSku() : sku;
         String wareStockNumberKey = storeId + sku + prodBarcode;
         String warehouseStockMapKey = Constants.WAREHOUSE_STOCK_MAP_KEY + "_" + storeId;
-        String redisCacheWareQuantity = JedisUtil.hget(warehouseStockMapKey, wareStockNumberKey);
-        Integer wareQuantity = 0;
-        Integer exitRegionNumber = goods.getExitRegionNumber();
-        String stockNum = goods.getStockNum();
-        Integer sellVolume = Objects.isNull(goods.getSellVolume()) ? 1 : goods.getSellVolume();
-        if (org.springframework.util.StringUtils.isEmpty(redisCacheWareQuantity)) {
-            WareQueryStockResponseDTO wareQueryStockResponseDTO = null;
-            String queryWarehouseStockResponse = null;
-            // 环境配置
-            if (!org.springframework.util.StringUtils.isEmpty(env) && Constants.PROD.equals(env)) {
-                WareQueryStockParamDTO wareQueryStockParamDTO = new WareQueryStockParamDTO();
-                List<Criteria> criteriaList = new ArrayList<>();
-                Criteria criteria = new Criteria();
-                criteria.setItemId(goods.getWarehouseSysGoodId());
-                criteria.setItemCode(goods.getSku());
-                criteria.setOwnerCode(haiKongProperties.getWareCompanyCode());
-                criteria.setInventoryType(Constants.InventoryType.ZP.getType());
-                criteria.setWarehouseCode(goods.getWarehouseSn());
-                criteriaList.add(criteria);
-                wareQueryStockParamDTO.setCriteriaList(criteriaList);
-                try {
-                    queryWarehouseStockResponse = haiKongWarehouseTemplate.queryWarehouseStock(wareQueryStockParamDTO);
-                } catch (Exception e) {
-                    log.error("sku:【{}】,调用海控仓库系统查询库存出现异常!", sku, e);
-                    throw new ServiceException(String.format("sku:【%s】,调用海控仓库系统查询库存出现异常!", sku));
-                }
-                log.info("调用海控仓库系统,请求参数,门店:{}、商品条码:{}、商品编码:{},响应数据:{}", storeId, prodBarcode, sku, queryWarehouseStockResponse);
-                if (org.springframework.util.StringUtils.isEmpty(queryWarehouseStockResponse)) {
-                    log.error("调用库存系统接口出现错误!返回结果为空!");
-                    throw new ServiceException("调用库存系统接口出现错误!");
-                }
-                try {
-                    wareQueryStockResponseDTO = (WareQueryStockResponseDTO) XmlUtils.toObject(queryWarehouseStockResponse, WareQueryStockResponseDTO.class);
-                } catch (Exception e) {
-                    log.error("解析一步达库存系统响应数据出现错误!出现异常:", e);
-                }
-                if (Objects.isNull(wareQueryStockResponseDTO)) {
-                    log.error("解析一步达库存系统响应数据出现错误!请求响应结果:{}", queryWarehouseStockResponse);
-                    throw new ServiceException("解析一步达库存系统响应数据出现错误!");
-                }
-                if ("failure".equals(wareQueryStockResponseDTO.getFlag())) {
-                    log.error("请求一步达库存系统返回错误响应!响应数据:{}", queryWarehouseStockResponse);
-                    throw new ServiceException(String.format("请求一步达库存系统查询库存错误!响应数据:%s", wareQueryStockResponseDTO.getMessage()));
-                }
-            } else {
-                wareQueryStockResponseDTO = new WareQueryStockResponseDTO();
-                wareQueryStockResponseDTO.setCode("0");
-                wareQueryStockResponseDTO.setFlag("success");
-                wareQueryStockResponseDTO.setMessage("");
-                WareQueryStockResponseDTO.WareQueryStockResponseItemDTO wareQueryStockResponseItemDTO = new WareQueryStockResponseDTO.WareQueryStockResponseItemDTO();
-                wareQueryStockResponseItemDTO.setQuantity(3);
-                wareQueryStockResponseItemDTO.setItemCode(sku);
-                wareQueryStockResponseItemDTO.setProduceCode(prodBarcode);
-                List<WareQueryStockResponseDTO.WareQueryStockResponseItemDTO> wareQueryStockResponseItemDTOS = new ArrayList<>();
-                wareQueryStockResponseItemDTOS.add(wareQueryStockResponseItemDTO);
-                wareQueryStockResponseDTO.setItems(wareQueryStockResponseItemDTOS);
-            }
+        String redisCacheWareQuantity = JedisUtil.hget(warehouseStockMapKey, wareStockNumberKey);*/
 
-            // 校验库存
-            List<WareQueryStockResponseDTO.WareQueryStockResponseItemDTO> items = wareQueryStockResponseDTO.getItems();
-            if (CollectionUtils.isEmpty(items)) {
-                log.error("查询商品时:【{}】,仓库不存在该商品!", prodBarcode);
-                throw new ServiceException(String.format("查询商品时:【%s】,仓库不存在该商品!", prodBarcode));
-            }
-            WareQueryStockResponseDTO.WareQueryStockResponseItemDTO itemDTO = items.get(0);
-            // 仓库可用库存
-            wareQuantity = itemDTO.getQuantity();
-            JedisUtil.hset(warehouseStockMapKey, wareStockNumberKey, String.valueOf(wareQuantity));
-        } else {
-            wareQuantity = Integer.parseInt(redisCacheWareQuantity);
-        }
-        // 保税仓库存 + 展销店库存 - 出区数 >= 购买数
-        if (!((wareQuantity + Integer.parseInt(stockNum) - exitRegionNumber) > sellVolume)) {
-            // 库存不足
-            log.error("商品条码:【{}】,sku:【{}】,门店库存:【{}】,保税仓库存:【{}】,出区数:【{}】,该商品仓库库存不足!", prodBarcode, sku, stockNum, wareQuantity, exitRegionNumber);
-            throw new ServiceException(String.format("商品条码:【%s】,sku:【%s】,门店库存:【%s】,保税仓库存:【%s】,出区数:【%s】,该商品仓库库存不足!", prodBarcode, sku, stockNum, wareQuantity, exitRegionNumber));
-        } else {
-            JedisUtil.hset(warehouseStockMapKey, wareStockNumberKey, String.valueOf(wareQuantity - sellVolume));
-        }
+        validateWarehouseStock(goods, prodBarcode, sku, storeId);
 
         goods.setDiscountedPrice(new BigDecimal(0));
         BigDecimal retailPrice = goods.getRetailPrice();
@@ -1670,6 +1593,85 @@ public class GoodsServiceImpl implements GoodsService {
     }
 
     @Override
+    public void validateWarehouseStock(GoodsDetailsDto goods, String prodBarcode, String sku, String storeId) {
+        // 保税仓库存
+        Integer wareQuantity = 0;
+
+        String env = environment.getProperty("haikong.env");
+        // 保税仓库存
+        Integer exitRegionNumber = goods.getExitRegionNumber();
+        String stockNum = goods.getStockNum();
+        Integer sellVolume = Objects.isNull(goods.getSellVolume()) ? 1 : goods.getSellVolume();
+        WareQueryStockResponseDTO wareQueryStockResponseDTO = null;
+        String queryWarehouseStockResponse = null;
+        // 环境配置
+        if (!org.springframework.util.StringUtils.isEmpty(env) && Constants.PROD.equals(env)) {
+            WareQueryStockParamDTO wareQueryStockParamDTO = new WareQueryStockParamDTO();
+            List<Criteria> criteriaList = new ArrayList<>();
+            Criteria criteria = new Criteria();
+            criteria.setItemId(goods.getWarehouseSysGoodId());
+            criteria.setItemCode(goods.getSku());
+            criteria.setOwnerCode(haiKongProperties.getWareCompanyCode());
+            criteria.setInventoryType(Constants.InventoryType.ZP.getType());
+            criteria.setWarehouseCode(goods.getWarehouseSn());
+            criteriaList.add(criteria);
+            wareQueryStockParamDTO.setCriteriaList(criteriaList);
+            try {
+                queryWarehouseStockResponse = haiKongWarehouseTemplate.queryWarehouseStock(wareQueryStockParamDTO);
+            } catch (Exception e) {
+                log.error("sku:【{}】,调用海控仓库系统查询库存出现异常!", sku, e);
+                throw new ServiceException(String.format("sku:【%s】,调用海控仓库系统查询库存出现异常!", sku));
+            }
+            log.info("调用海控仓库系统,请求参数,门店:{}、商品条码:{}、商品编码:{},响应数据:{}", storeId, prodBarcode, sku, queryWarehouseStockResponse);
+            if (org.springframework.util.StringUtils.isEmpty(queryWarehouseStockResponse)) {
+                log.error("调用库存系统接口出现错误!返回结果为空!");
+                throw new ServiceException("调用库存系统接口出现错误!");
+            }
+            try {
+                wareQueryStockResponseDTO = (WareQueryStockResponseDTO) XmlUtils.toObject(queryWarehouseStockResponse, WareQueryStockResponseDTO.class);
+            } catch (Exception e) {
+                log.error("解析一步达库存系统响应数据出现错误!出现异常:", e);
+            }
+            if (Objects.isNull(wareQueryStockResponseDTO)) {
+                log.error("解析一步达库存系统响应数据出现错误!请求响应结果:{}", queryWarehouseStockResponse);
+                throw new ServiceException("解析一步达库存系统响应数据出现错误!");
+            }
+            if ("failure".equals(wareQueryStockResponseDTO.getFlag())) {
+                log.error("请求一步达库存系统返回错误响应!响应数据:{}", queryWarehouseStockResponse);
+                throw new ServiceException(String.format("请求一步达库存系统查询库存错误!响应数据:%s", wareQueryStockResponseDTO.getMessage()));
+            }
+        } else {
+            wareQueryStockResponseDTO = new WareQueryStockResponseDTO();
+            wareQueryStockResponseDTO.setCode("0");
+            wareQueryStockResponseDTO.setFlag("success");
+            wareQueryStockResponseDTO.setMessage("");
+            WareQueryStockResponseDTO.WareQueryStockResponseItemDTO wareQueryStockResponseItemDTO = new WareQueryStockResponseDTO.WareQueryStockResponseItemDTO();
+            wareQueryStockResponseItemDTO.setQuantity(3);
+            wareQueryStockResponseItemDTO.setItemCode(sku);
+            wareQueryStockResponseItemDTO.setProduceCode(prodBarcode);
+            List<WareQueryStockResponseDTO.WareQueryStockResponseItemDTO> wareQueryStockResponseItemDTOS = new ArrayList<>();
+            wareQueryStockResponseItemDTOS.add(wareQueryStockResponseItemDTO);
+            wareQueryStockResponseDTO.setItems(wareQueryStockResponseItemDTOS);
+        }
+
+        // 校验库存
+        List<WareQueryStockResponseDTO.WareQueryStockResponseItemDTO> items = wareQueryStockResponseDTO.getItems();
+        if (CollectionUtils.isEmpty(items)) {
+            log.error("查询商品时:【{}】,仓库不存在该商品!", prodBarcode);
+            throw new ServiceException(String.format("查询商品时:【%s】,仓库不存在该商品!", prodBarcode));
+        }
+        WareQueryStockResponseDTO.WareQueryStockResponseItemDTO itemDTO = items.get(0);
+        // 仓库可用库存
+        wareQuantity = itemDTO.getQuantity();
+        // 保税仓库存 + 展销店库存 - 出区数 >= 购买数
+        if (!((wareQuantity + Integer.parseInt(stockNum) - exitRegionNumber) > sellVolume)) {
+            // 库存不足
+            log.error("商品条码:【{}】,sku:【{}】,门店库存:【{}】,保税仓库存:【{}】,出区数:【{}】,该商品仓库库存不足!", prodBarcode, sku, stockNum, wareQuantity, exitRegionNumber);
+            throw new ServiceException(String.format("商品条码:【%s】,sku:【%s】,门店库存:【%s】,保税仓库存:【%s】,出区数:【%s】,该商品仓库库存不足!", prodBarcode, sku, stockNum, wareQuantity, exitRegionNumber));
+        }
+    }
+
+    @Override
     public List<Map<String,Object>> selectSkuDetails(String prodBarcode, String storeId) {
         /**
          * 1.首先根据商品条码跟门店id查询是否有库存,没库存直接返回

+ 53 - 28
kmall-admin/src/main/java/com/kmall/admin/service/impl/OrderServiceImpl.java

@@ -2619,7 +2619,7 @@ public class OrderServiceImpl implements OrderService {
                             orderGiftScoreRulesVo.setGenerateType(Constants.MemberScoreRulesEnum.TWO.getCode());
                             if (ratio.compareTo(BigDecimal.ZERO) > 0) {
                                 // 算出所积的分
-                                int giftScore = money.multiply(ratio).add(new BigDecimal(memberScore.get())).intValue();
+                                int giftScore = money.multiply(ratio).setScale(0, BigDecimal.ROUND_FLOOR).add(new BigDecimal(memberScore.get())).intValue();
                                 memberScore.set(giftScore);
                                 orderGiftScoreRulesVo.setGiftScore(giftScore);
                                 orderGiftScoreRulesVo.setGenerateRatio(ratio);
@@ -2649,7 +2649,7 @@ public class OrderServiceImpl implements OrderService {
                                     BigDecimal money = goodsMap.get(sku);
                                     if (ratio.compareTo(BigDecimal.ZERO) > 0) {
                                         // 算出所积的分
-                                        int giftScore = money.multiply(ratio).add(new BigDecimal(memberScore.get())).intValue();
+                                        int giftScore = money.multiply(ratio).setScale(0, BigDecimal.ROUND_FLOOR).add(new BigDecimal(memberScore.get())).intValue();
                                         memberScore.set(giftScore);
                                         orderGiftScoreRulesVo.setGiftScore(giftScore);
                                         orderGiftScoreRulesVo.setGenerateRatio(ratio);
@@ -2678,7 +2678,7 @@ public class OrderServiceImpl implements OrderService {
                                 BigDecimal money = goodsMap.get(sku);
                                 if (ratio.compareTo(BigDecimal.ZERO) != 0) {
                                     // 算出所积的分
-                                    int giftScore = money.multiply(ratio).add(new BigDecimal(memberScore.get())).intValue();
+                                    int giftScore = money.multiply(ratio).setScale(0, BigDecimal.ROUND_FLOOR).add(new BigDecimal(memberScore.get())).intValue();
                                     memberScore.set(giftScore);
                                     orderGiftScoreRulesVo.setGiftScore(giftScore);
                                     orderGiftScoreRulesVo.setGenerateRatio(ratio);
@@ -3216,13 +3216,20 @@ public class OrderServiceImpl implements OrderService {
 
         if (atomicBoolean.get()) {
             // 推送支付单
-            sendWxPayInfo(order, store);
+            sendWxPayInfo(order, store, wechatMicropayApiResult);
         }
 
     }
 
-    private void sendWxPayInfo(OrderVo order, StoreEntity store) {
+    private void sendWxPayInfo(OrderVo order, StoreEntity store, WechatMicropayApiResult wechatMicropayApiResult) {
         // 组装支付单信息
+        String payTransactionId = "";
+        if (Objects.nonNull(wechatMicropayApiResult)) {
+            payTransactionId = wechatMicropayApiResult.getTransaction_id();
+        } else {
+            payTransactionId = order.getPayTransactionId();
+        }
+
         Map<String, Object> orderSendCusParams = new HashMap<>();
         orderSendCusParams.put("merchSn", order.getMerchSn());
         orderSendCusParams.put("orderSn", order.getOrder_sn());
@@ -3230,7 +3237,7 @@ public class OrderServiceImpl implements OrderService {
         orderSendCusParams.put("thirdPartyMerchCode", store.getThirdPartyMerchCode());
         orderSendCusParams.put("thirdPartyMerchName", store.getThirdPartyMerchName());
         orderSendCusParams.put("outTradeNo", order.getOrder_sn());
-        orderSendCusParams.put("transactionId", order.getPayTransactionId());
+        orderSendCusParams.put("transactionId", payTransactionId);
         orderSendCusParams.put("subOrderId", "");   // ccnet原逻辑没有对该字段赋值
         orderSendCusParams.put("subOrderNo", order.getOrder_sn());
         orderSendCusParams.put("feeType", order.getFeeType());
@@ -3272,12 +3279,12 @@ public class OrderServiceImpl implements OrderService {
             String memberOrderSyncResponseJson = haiKongMemberTemplate.memberOrderSync(body);
             LOGGER.info("请求会员系统同步消费订单接口!响应:{}", memberOrderSyncResponseJson);
             Response<String> response = JacksonUtil.fromListJson(memberOrderSyncResponseJson, new TypeReference<Response<String>>() {});
-            if (Objects.nonNull(response) && ErrorCodeConstants.MemberSysErrorCodeEnum.CODE_0.getCode().equals(response.getCode())) {
+            if (Objects.nonNull(response) && response.getSuccess()) {
                 haiKongMemberOrderSyncResendEntity.setMemberSysOrderId(response.getData());
                 haiKongMemberOrderSyncResendEntity.setResendStatus(HaiKongMemberOrderResendStatusEnum.RESEND_SUCCESS.getStatus());
-            } else if (Objects.nonNull(response) && ErrorCodeConstants.MemberSysErrorCodeEnum.CODE_500.getCode().equals(response.getCode())) {
+            } /*else if (Objects.nonNull(response) && ErrorCodeConstants.MemberSysErrorCodeEnum.CODE_500.getCode().equals(response.getCode())) {
                 haiKongMemberOrderSyncResendEntity.setResendStatus(HaiKongMemberOrderResendStatusEnum.WAIT_RESEND.getStatus());
-            } else {
+            }*/ else {
                 haiKongMemberOrderSyncResendEntity.setResendStatus(HaiKongMemberOrderResendStatusEnum.NON_RESEND.getStatus());
             }
             haiKongMemberOrderSyncResendService.save(haiKongMemberOrderSyncResendEntity);
@@ -3344,7 +3351,7 @@ public class OrderServiceImpl implements OrderService {
             haiKongMemberScoreChangeRecordService.save(haiKongMemberScoreChangeRecordEntity);
         }
         LOGGER.info("保存会员系统积分变动详情记录中......");
-        List<HaiKongMemberScoreChangeDetailRecordEntity> recordEntityList = goodsList.stream().map(goodsEntity -> {
+        List<HaiKongMemberScoreChangeDetailRecordEntity> recordEntityList = goodsList.stream().distinct().map(goodsEntity -> {
             HaiKongMemberScoreChangeDetailRecordEntity entity = new HaiKongMemberScoreChangeDetailRecordEntity();
             String sku = goodsEntity.getSku();
             OrderGiftScoreRulesVo orderGiftScoreRulesVo = giftGoodsScoreDetailMap.get(sku);
@@ -4305,7 +4312,7 @@ public class OrderServiceImpl implements OrderService {
          * 2.查询当前时间,该门店是否有活动,如果有活动,查询开启了哪些营销方式
          * 参数: 当前时间  门店id
          */
-        List<MkActivitiesEntity> mkActivitiesEntityList = mkActivitiesService.queryByNow(storeId, DateUtils.format(new Date(), "yyyy-MM-dd"));
+        List<MkActivitiesEntity> mkActivitiesEntityList = mkActivitiesService.queryByNow(storeId, DateUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss"));
         // 活动优先级判定,特价>打折>满减/满赠>优惠券>积分抵扣;
 //        List<Constants.ActivityTopicEnum> activityTopicEnums = Arrays.asList(Constants.ActivityTopicEnum.values());
 //        for (MkActivitiesEntity mkActivitiesEntity : mkActivitiesEntityList) {
@@ -4614,7 +4621,9 @@ public class OrderServiceImpl implements OrderService {
         }
         calculateOrderDiscountPriceResponseVO.setOrderTotalPrice(orderTotalPrice);
         calculateOrderDiscountPriceResponseVO.setGoodsDetailsDtos(goodsDetailsDtos);
-
+        calculateOrderDiscountPriceResponseVO.setLevelName("无");
+        calculateOrderDiscountPriceResponseVO.setMemberCurrentAvailableScore(0);
+        calculateOrderDiscountPriceResponseVO.setDeductionScore(0);
 
         // 计算完活动优惠后,计算积分抵扣。(活动与积分抵扣不互斥)
         if (!org.springframework.util.StringUtils.isEmpty(memberCode)) {
@@ -4622,11 +4631,19 @@ public class OrderServiceImpl implements OrderService {
             Response<Object> response;
             try {
                 // 查询会员信息
-                memberInfoByCodeResponseJson = haiKongMemberTemplate.getMemberInfoByPhone("{\"phone\":" + memberCode + "}");
+                if (memberCode.trim().length() == 11) {
+                    memberInfoByCodeResponseJson = haiKongMemberTemplate.getMemberInfoByPhone("{\"phone\":\"" + memberCode + "\"}");
+                } else {
+                    memberInfoByCodeResponseJson = haiKongMemberTemplate.getMemberInfoByCode("{\"code\":\"" + memberCode + "\"}");
+                }
                 response = JacksonUtil.fromListJson(memberInfoByCodeResponseJson, new TypeReference<Response<Object>>() {
                 });
-                if (Objects.isNull(response) || Objects.nonNull(response.getErrorCode())) {
+                if (Objects.isNull(response)) {
                     LOGGER.error("请求会员系统出现异常!error:{}", memberInfoByCodeResponseJson);
+                    if (ErrorCodeConstants.MemberSysErrorCodeEnum.CODE_401.getCode().equals(response.getCode())) {
+                        JedisUtil.del(Constants.MEMBER_SYS_ACCESS_TOKEN_REDIS_KEY);
+                        throw new ServiceException(String.format("请求会员系统出现异常!会员码:%s,error:%s", memberCode, ErrorCodeConstants.MemberSysErrorCodeEnum.CODE_401.getDesc()));
+                    }
                     throw new ServiceException(String.format("请求会员系统出现异常!会员码:%s,error:%s", memberCode, memberInfoByCodeResponseJson));
                 }
             } catch (Exception e) {
@@ -4638,32 +4655,37 @@ public class OrderServiceImpl implements OrderService {
                 MemberInfoDTO memberInfoDTO = JacksonUtil.fromStringJson(JacksonUtil.toJson(response.getData()), MemberInfoDTO.class);
                 assert memberInfoDTO != null : String.format("会员码:【%s】会员信息错误!%s", memberCode, JacksonUtil.toJson(response));
                 // 查询会员表
+                calculateOrderDiscountPriceResponseVO.setOpenId(memberInfoDTO.getOpenId());
+                calculateOrderDiscountPriceResponseVO.setMemberPhone(memberInfoDTO.getPhone());
+                calculateOrderDiscountPriceResponseVO.setMemberCurrentAvailableScore(memberInfoDTO.getScore());
+                calculateOrderDiscountPriceResponseVO.setLevelName(memberInfoDTO.getLevelName());
                 UserEntity userEntity = userService.queryByOpenId(memberInfoDTO.getOpenId());
+                String openId = memberInfoDTO.getOpenId();
                 if (Objects.isNull(userEntity)) {
                     userEntity = new UserEntity();
-                    userEntity.setOpenId(memberInfoDTO.getOpenId());
+                    userEntity.setOpenId(openId);
                     userEntity.setMemberCode(memberCode);
+                    userEntity.setMobile(openId);
                     userService.save(userEntity);
                 } else {
-                    userEntity.setOpenId(memberInfoDTO.getOpenId());
+                    userEntity.setOpenId(openId);
+                    userEntity.setMobile(openId);
                     userEntity.setMemberCode(memberCode);
                     userService.update(userEntity);
                 }
                 Integer score = memberInfoDTO.getScore();
                 if (Objects.nonNull(score) && score > 0) {
                     // 有积分
-                    afterDiscountPrice = calculatePreferentialPrice(orderTotalPrice, score, memberCode, calculateOrderDiscountPriceResponseVO, goodsDetailsDtos, promotionSkuList, mkActivitiesEntityList);
-                    LOGGER.info("会员【{}】,当前积分:{},积分抵扣后的订单金额:{},积分抵扣前的订单金额:{}", memberCode, score, afterDiscountPrice, orderTotalPrice);
+                    afterDiscountPrice = calculatePreferentialPrice(orderTotalPrice, score, memberCode, openId, calculateOrderDiscountPriceResponseVO, goodsDetailsDtos, promotionSkuList, mkActivitiesEntityList);
+                    LOGGER.info("会员【{}】,当前积分:{},积分抵扣后的订单金额:{},积分抵扣前的订单金额:{}", openId, score, afterDiscountPrice, orderTotalPrice);
                     calculateOrderDiscountPriceResponseVO.setOrderTotalPrice(afterDiscountPrice);
                     calculateOrderDiscountPriceResponseVO.setGoodsDetailsDtos(goodsDetailsDtos);
                     calculateOrderDiscountPriceResponseVO.setBeforeScore(score);
-                    calculateOrderDiscountPriceResponseVO.setOpenId(memberInfoDTO.getOpenId());
-                    calculateOrderDiscountPriceResponseVO.setMemberPhone(memberInfoDTO.getPhone());
                     // 订单完成后再添加积分消费记录,以及同步积分信息
                     return calculateOrderDiscountPriceResponseVO;
                 } else {
-                    LOGGER.error("会员【{}】积分为0,积分抵扣失败!", memberCode);
-                    throw new ServiceException(String.format("会员【%s】积分为0,积分抵扣失败!", memberCode));
+                    LOGGER.error("会员【{}】积分为0,积分抵扣失败!", openId);
+                    return calculateOrderDiscountPriceResponseVO;
                 }
             } else {
                 LOGGER.error("查询会员信息失败!响应结果:{}", memberInfoByCodeResponseJson);
@@ -4684,15 +4706,18 @@ public class OrderServiceImpl implements OrderService {
      * @param orderTotalPrice   订单商品总价
      * @param score             积分
      * @param memberCode        会员码
+     * @param openId            会员open_id:手机号
      * @param goodsDetailsDtos  订单商品详情
      * @param calculateOrderDiscountPriceResponseVO 响应数据
      * @param promotionSkuList  参与了限时特价活动并且与积分抵扣互斥的sku集合
+     * @param mkActivitiesEntityList 根据优先级排序后的活动集合
      *
      * @return                  积分抵扣后的订单总金额
      */
     private BigDecimal calculatePreferentialPrice(BigDecimal orderTotalPrice,
                                                   Integer score,
                                                   String memberCode,
+                                                  String openId,
                                                   CalculateOrderDiscountPriceResponseVO calculateOrderDiscountPriceResponseVO,
                                                   List<GoodsDetailsDto> goodsDetailsDtos,
                                                   List<String> promotionSkuList,
@@ -4764,9 +4789,10 @@ public class OrderServiceImpl implements OrderService {
             }
             Integer scoreLimit = Integer.parseInt(scoreLimitStr);
             if (score < scoreLimit) {
-                LOGGER.error("用户【{}】的积分数量为:{},最低需要{}积分才能抵扣!", memberCode, score, scoreLimit);
+                LOGGER.error("会员码【{}】用户【{}】的积分数量为:{},最低需要{}积分才能抵扣!", memberCode, openId, score, scoreLimit);
                 calculateOrderDiscountPriceResponseVO.setAfterScore(score);
-                throw new ServiceException(String.format("用户【%s】的积分数量为:%s,最低需要%s积分才能抵扣!", memberCode, score, scoreLimit));
+                return orderTotalPrice;
+//                throw new ServiceException(String.format("用户【%s】的积分数量为:%s,最低需要%s积分才能抵扣!", openId, score, scoreLimit));
             } else {
                 // 积分取整
                 int scoreInteger = score % scoreLimit == 0 ? score : score - (score % scoreLimit);
@@ -4824,8 +4850,7 @@ public class OrderServiceImpl implements OrderService {
                     BigDecimal actualPaymentAmount = goodsDetailsDto.getActualPaymentAmount()
                             .multiply(BigDecimal.valueOf(goodsDetailsDto.getSellVolume()));
                     // 当前商品最大支持抵扣的金额
-                    BigDecimal currentSkuMaxDeductionPrice = actualPaymentAmount.multiply(BigDecimal.valueOf(goodsDetailsDto.getSellVolume()))
-                                                                                .multiply(scoreRatio).setScale(0, BigDecimal.ROUND_FLOOR);
+                    BigDecimal currentSkuMaxDeductionPrice = actualPaymentAmount.multiply(scoreRatio).setScale(0, BigDecimal.ROUND_FLOOR);
                     // 其他活动优惠金额
                     BigDecimal otherDiscountedPrice = Objects.isNull(goodsDetailsDto.getDiscountedPrice()) ? BigDecimal.ZERO : goodsDetailsDto.getDiscountedPrice();
 
@@ -4889,10 +4914,10 @@ public class OrderServiceImpl implements OrderService {
                 calculateOrderDiscountPriceResponseVO.setOrderTotalPrice(orderTotalPrice);
                 // 积分抵扣的总金额
                 calculateOrderDiscountPriceResponseVO.setScoreDeductionPrice(goodsDetailScoreDeductionPrice);
-                LOGGER.info("会员【{}】,当前积分:{},抵扣订单金额后剩余积分:{}", memberCode, score, afterScore);
+                LOGGER.info("会员【{}】会员码【{}】,当前积分:{},抵扣订单金额后剩余积分:{}", openId, memberCode, score, afterScore);
             }
         } else {
-            LOGGER.info("会员【{}】的积分小于积分抵扣最低值,不参加积分抵扣!", memberCode);
+            LOGGER.info("会员【{}】会员码【{}】的积分小于积分抵扣最低值,不参加积分抵扣!", openId, memberCode);
         }
         return orderTotalPrice;
     }

+ 1 - 1
kmall-admin/src/main/resources/conf/fastdfs.properties

@@ -83,7 +83,7 @@ base_path=/home/logs/fastdfs
 
 #tracker server\u662FFastDFS\u6587\u4EF6\u7CFB\u7EDF\u7684\u534F\u8C03\u8005,\u5176\u4E3B\u8981\u4F5C\u7528\u662F\u8D1F\u8F7D\u5747\u8861\u548C\u8C03\u5EA6\u3002
 #Tracker server\u5728\u5185\u5B58\u4E2D\u8BB0\u5F55\u5206\u7EC4\u548CStorage server\u7684\u72B6\u6001\u7B49\u4FE1\u606F\uFF0C\u4E0D\u8BB0\u5F55\u6587\u4EF6\u7D22\u5F15\u4FE1\u606F
-tracker_server=120.76.119.218:22122
+tracker_server=172.18.246.243:22122
 
 log_level=info
 

+ 1 - 0
kmall-admin/src/main/resources/mybatis/mapper/vip/Mall2PointsRulesDao.xml

@@ -156,6 +156,7 @@
     	from mall2_points_rules mpr
     	left join mall2_points_rules_detil mprs on mpr.mpr_id = mprs.father_id
     	where mprs.id is not null and mpr.is_valid = 0 and mpr.points_begin_time &lt;= #{nowTime} and mpr.points_end_time &gt;= #{nowTime}
+    	order by mpr.points_type desc
 	</select>
 
 	<insert id="saveMall2PointsRulesDetil" parameterType="com.kmall.admin.dto.Mall2RulesDto">

+ 2 - 2
kmall-admin/src/main/webapp/WEB-INF/page/mk/mkactivitiespromotion.html

@@ -61,9 +61,9 @@
             <Form-item label="商品系列" prop="productSeries">
                 <i-input v-model="mkActivitiesPromotion.productSeries" placeholder="商品系列"/>
             </Form-item>
-            <Form-item label="截止日期" prop="deadline">
+            <!--<Form-item label="截止日期" prop="deadline">
                 <i-input v-model="mkActivitiesPromotion.deadline" placeholder="截止日期 yyy-mm-dd"/>
-            </Form-item>
+            </Form-item>-->
             <Form-item>
                 <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
                 <i-button type="warning" @click="reload" style="margin-left: 8px"/>返回</i-button>

+ 4 - 4
kmall-admin/src/main/webapp/WEB-INF/page/mk/mkactivityform.html

@@ -115,7 +115,7 @@
             <Form-item label="结束时间" prop="mkdEndTime">
                 <Date-picker type="datetime" format="yyyy-MM-dd HH:mm:ss" v-model="mkActivities.mkdEndTime" @on-change="getMkdEndTime" placeholder="结束时间" style="width: 240px"></Date-picker>
             </Form-item>
-            <Form-item label="是否提前结束" prop="mkaEndEarly">
+            <!--<Form-item label="是否提前结束" prop="mkaEndEarly">
                 <Radio-group v-model="mkActivities.mkaEndEarly" @on-change="changeMkaEndEarly">
                     <Radio label="1">
                         <span>是</span>
@@ -124,10 +124,10 @@
                         <span>否</span>
                     </Radio>
                 </Radio-group>
-            </Form-item>
-            <Form-item label="提前结束时间" prop="mkdEndEarlyTime" v-show="isMkdEndEarlyTimeShow">
+            </Form-item>-->
+            <!--<Form-item label="提前结束时间" prop="mkdEndEarlyTime" v-show="isMkdEndEarlyTimeShow">
                 <Date-picker type="datetime" format="yyyy-MM-dd HH:mm:ss" v-model="mkActivities.mkdEndEarlyTime" @on-change="getMkdEndEarlyTime" placeholder="提前结束时间" style="width: 240px"></Date-picker>
-            </Form-item>
+            </Form-item>-->
             <Form-item>
                 <i-button type="primary" @click="handleMkactivitiesSubmit('formMkactivitiesValidate')">提交</i-button>
                 <i-button type="warning" @click="reloadMkactivities" style="margin-left: 8px"/>返回</i-button>

+ 14 - 10
kmall-admin/src/main/webapp/WEB-INF/page/sale/sale.html

@@ -138,7 +138,7 @@
         <div id="content" class="row-fluid">
             <div class="col-md-3">
                 <div>
-                    <i-input class="search" placeholder="输入或扫码商品条形码" id="saomiao" v-model.trim='prodBarcode' @on-enter="searchQuery(prodBarcode)"/>
+                    <i-input class="search" placeholder="输入或扫码商品条形码" ref="saomiao" id="saomiao" v-model.trim='prodBarcode' @on-enter="searchQuery(prodBarcode)"/>
                 </div>
                 <div v-show="prodBarcode" class="search_menu">
                     <ul>
@@ -205,13 +205,19 @@
                         </table>
                     </li>
                     <li>
-                        <ul>
+                        <ul style="display: inline-block">
                             <li><h3 style="border: white;padding: 8px;">总件数:{{totalCount}}</h3></li>
                             <li><h3 style="border: white;padding: 8px;">总价:{{totalPrice}}</h3></li>
 <!--                            <li><h3 style="border: white;padding: 8px">优惠价:{{discountedPrice}}</h3></li>-->
                             <li><h3 style="border: white;padding: 8px">实际支付价:{{actualPrice}}</h3></li>
                             <li v-if="showReduceMoney != 0"><h3 style="border: white;padding: 8px">满减:{{showReduceMoney}}</h3></li>
                         </ul>
+                        <div style="width: 30px; display: inline-block"></div>
+                        <ul style="display: inline-block">
+                            <li><h3 style="border: white;padding: 8px;">会员当前积分:{{memberCurrentAvailableScore}}</h3></li>
+                            <li><h3 style="border: white;padding: 8px;">抵扣积分:{{deductionScore}}</h3></li>
+                            <li><h3 style="border: white;padding: 8px;">会员等级:{{levelName}}</h3></li>
+                        </ul>
                     </li>
                     <li  style="height: 100px;">
                         <i-button type="error" @click="clearGoodsList" class="goods-button"><i class="fa fa-pencil-square-o"></i>&nbsp;清空</i-button>
@@ -298,7 +304,7 @@
                             </div>
                         </div>
 
-                        <div class="modal fade" id="calculateOrderPriceDialog"  role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
+                        <div class="modal fade" id="calculateOrderPriceDialog"  role="dialog" aria-hidden="true">
                             <div class="modal-dialog">
                                 <div class="modal-content">
                                     <div class="modal-header">
@@ -306,12 +312,10 @@
                                         <h4 class="modal-title" id="calculateOrderPriceModalLabel">录入会员码</h4>
                                     </div>
                                     <div class="modal-body">
-                                        <form>
-                                            <div class="form-group">
-                                                <label for="customPhone" class="control-label">会员码:</label>
-                                                <input autocomplete="off" type="text" class="form-control" ref="couponBarCode" id="couponBarCode" @blur="customPhoneBlur" />
-                                            </div>
-                                        </form>
+                                        <div>
+                                            <label for="customPhone" class="control-label">会员码:</label>
+                                            <input autocomplete="off" type="text" ref="couponBarCode" size="60%" id="couponBarCode" @on-enter="calculateOrderPriceSubmit" />
+                                        </div>
                                     </div>
                                     <div class="modal-footer">
                                         <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
@@ -332,7 +336,7 @@
                                     <div class="modal-body">
                                         <form>
                                             <div class="form-group">
-                                                <i-input id="payCode"  @on-enter="submitOrder" ref="payCode" placeholder="请输入付款码"/>
+                                                <i-input id="payCode" class="payCodeInput" @on-enter="submitOrder" ref="payCode" size="60%" placeholder="请输入付款码"/>
                                             </div>
 
                                         </form>

+ 1 - 1
kmall-admin/src/main/webapp/js/mk/mkactivitiespromotion.js

@@ -39,7 +39,7 @@ $(function () {
 				}
 			},
 			{label: '商品系列', name: 'productSeries', index: 'product_series', width: 80, align: 'center'},
-			{label: '截止日期', name: 'deadline', index: 'deadline', width: 80, align: 'center'}],
+			/*{label: '截止日期', name: 'deadline', index: 'deadline', width: 80, align: 'center'}*/],
 		viewrecords: true,
 		postData: {'mkaId': vm.mkaId},
         height: 550,

+ 2 - 2
kmall-admin/src/main/webapp/js/mk/mkactivityform.js

@@ -112,7 +112,7 @@ $(function () {
             {label: '活动优先级', name: 'priority', index: 'priority', width: 100, align: 'center'},
             {label: '开始时间', name: 'mkaStartTime', index: 'mka_start_time', width: 200, align: 'center'},
             {label: '结束时间', name: 'mkdEndTime', index: 'mkd_end_time', width: 200, align: 'center'},
-            {label: '是否提前结束', name: 'mkaEndEarly', index: 'mka_end_early', width: 200, align: 'center',
+            /*{label: '是否提前结束', name: 'mkaEndEarly', index: 'mka_end_early', width: 200, align: 'center',
                 formatter: function (value) {
                     if (value == '0') {
                         return '否';
@@ -121,7 +121,7 @@ $(function () {
                     }
                     return '';
                 }
-            },
+            },*/
             {label: '提前结束时间', name: 'mkdEndEarlyTime', index: 'mkd_end_early_time', width: 200, align: 'center'}
             ],
         viewrecords: true,

+ 103 - 50
kmall-admin/src/main/webapp/js/sale/sale.js

@@ -496,6 +496,13 @@ const delay = (function () {
 });
 
 let vm = new Vue({
+    created : function () {
+        this.$nextTick(() => {
+            setTimeout(() => {
+                this.$refs.saomiao.focus();
+            }, 200);
+        })
+    },
     el: '#rrapp',
     data: {
         showList: true,
@@ -598,6 +605,10 @@ let vm = new Vue({
         memberPhone: '',
         // 订单抵扣积分
         deductionScore: '',
+        // 会员可用积分
+        memberCurrentAvailableScore: 0,
+        // 会员等级名称
+        levelName: '无',
         // 积分抵扣金额
         scoreDeductionPrice: '',
         // 积分抵扣金额
@@ -607,7 +618,9 @@ let vm = new Vue({
         // 抵扣后积分
         afterScore: 0,
         // 会员openid
-        openId: ''
+        openId: '',
+        // 是否点击了加号或减号的标识
+        clickFlag: false
     },
     watch: {
         prodBarcode (){
@@ -681,7 +694,9 @@ let vm = new Vue({
             vm.storeId = sessionStorage.getItem("storeId");
             var thisGoods = {};
             var overflowLi = this.$refs.overflowLi;
-            $.get("../goods/details/"+vm.prodBarcode+"/"+vm.storeId+"/"+vm.prodBarcode, function (r) {
+            console.log("vm.$refs.saomiao.value===>" + vm.$refs.saomiao.value);
+            let scanSellVolume = calScanSellVolume(vm.$refs.saomiao.value);
+            $.get("../goods/details/"+vm.prodBarcode+"/"+vm.storeId+"/"+vm.prodBarcode+"/"+scanSellVolume, function (r) {
                 if (r.code == 0) {
                     if(r.goodsDetails.length>1) {
                         r.goodsDetails.sellVolume = 1;
@@ -731,7 +746,9 @@ let vm = new Vue({
         saveOld:function(){
             vm.storeId = sessionStorage.getItem("storeId");
             var overflowLi = this.$refs.overflowLi;
-                $.get("../goods/detailsOld/"+vm.prodBarcode+"/"+vm.storeId, function (r) {
+            console.log("vm.$refs.saomiao.value===>" + vm.$refs.saomiao.value);
+            let scanSellVolume = calScanSellVolume(vm.$refs.saomiao.value);
+                $.get("../goods/detailsOld/"+vm.prodBarcode+"/"+vm.storeId+"/"+scanSellVolume, function (r) {
                     if (r.code == 0) {
                         r.goodsDetails.sellVolume = 1;
                         vm.goodsMap.set(r.goodsDetails.goodsSn,JSON.parse(JSON.stringify(r.goodsDetails)));
@@ -770,6 +787,7 @@ let vm = new Vue({
                     break;
                 }
             }
+            vm.clickFlag = true;
         },
         minus:function(value){
             // 减少数量
@@ -808,6 +826,7 @@ let vm = new Vue({
                     break;
                 }
             }
+            vm.clickFlag = true;
 
         },
         selectItem:function(value) {
@@ -853,16 +872,6 @@ let vm = new Vue({
                     // console.log(goods);
                     // console.log(vm.totalPrice);
 
-                    $.get("../goods/number/del/" + sessionStorage.getItem("storeId") + "/" + goods.sku + "/" + goods.prodBarcode, function (res) {
-                        if (res.code === 0) {
-                            alert("删除成功!");
-                        } else if (res.code === 500) {
-                            alert(res.msg);
-                        } else {
-                            alert("未知异常!请联系管理员!");
-                        }
-                    });
-
                     if(vm.freeBardcode.get(goods.prodBarcode) || vm.freeBardcode.get(goods.prodBarcode) == 0){
                         var nnum = (((goods.retailPrice * goods.sellVolume) - goods.actualPaymentAmount)/goods.retailPrice);
                         vm.freeBardcode.set(goods.prodBarcode, nnum);
@@ -887,19 +896,11 @@ let vm = new Vue({
         },
         clearGoodsList:function(){
             confirm('确认清空吗?', function () {
-                $.get("../goods/number/clear/" + sessionStorage.getItem("storeId"), function (res) {
-                    if (res.code === 0) {
-                        layer.confirm("清空成功", {
-                                skin: 'layui-layer-molv', btn: ['确定'], title: "提示"
-                            }, function () {
-                                location.reload();
-                            });
-                    } else if (res.code === 500) {
-                        alert(res.msg);
-                    } else {
-                        alert("未知异常!请联系管理员!");
-                    }
-                })
+                layer.confirm("清空成功", {
+                    skin: 'layui-layer-molv', btn: ['确定'], title: "提示"
+                }, function () {
+                    location.reload();
+                });
             })
 
         },
@@ -961,11 +962,24 @@ let vm = new Vue({
                 alert("请选择商品");
                 return;
             }
+
+            console.log("vm.clickFlag==>" + vm.clickFlag);
+            if (vm.clickFlag) {
+                let value = vm.$refs.couponBarCode.value;
+                if (value != null || value != "" || value != 'undefined') {
+                    alert("请重新计算优惠价再提交订单!");
+                    return;
+                }
+            }
             $('#myModal').modal('show')
             // 每次点击提交订单的时候清空姓名和身份证信息和手机号
             vm.$refs.customName.value = "";
             vm.$refs.customIDCard.value = "";
-            vm.$refs.customPhone.value = "";
+            let customPhone = vm.userInfo.customPhone;
+            if (customPhone === null || typeof customPhone === 'undefined') {
+                customPhone = '';
+            }
+            vm.$refs.customPhone.value = customPhone;
             vm.$refs.couponBarCode.value = "";
             if(vm.$refs.couponSn)
                 vm.$refs.couponSn.value = "";
@@ -977,19 +991,25 @@ let vm = new Vue({
                 alert("请选择商品");
                 return;
             }
+
+            vm.clickFlag = false;
             $("#calculateOrderPriceDialog").modal('show');
 
+            this.couponBarCodeChangeFocus();
         },
         // 计算优惠价格,返回订单详情数据
         calculateOrderPriceSubmit : function () {
 
             // console.log("点击计算=====>" + JSON.stringify(vm.goodsList));
 
-            var couponBarCode = vm.$refs.couponBarCode;
+            var couponBarCode = vm.$refs.couponBarCode.value;
             if (couponBarCode === null || couponBarCode === '') {
-                alert("无会员码,不能参加积分抵扣活动!\n计算中...");
+                confirm("无会员码,不能参加积分抵扣活动!<br/>点击确认开始计算...", function () {
+                    calculateOrderPrice();
+                });
+            } else {
+                calculateOrderPrice();
             }
-            calculateOrderPrice();
         },
         // 提交订单
         submitOrder:function(){
@@ -1148,6 +1168,7 @@ let vm = new Vue({
 
             $("#Send").attr("data-dismiss","modal");
             $('#payModal').modal('show');
+            this.payCodeChangeFocus();
             $("#payCode").keydown(function(e){
                 if(e.keyCode==13){
                     $("#submitOrder").click();
@@ -1331,6 +1352,20 @@ let vm = new Vue({
                     toUrl('../logout?_' + $.now());
                 }, 500);
             });
+        },
+        couponBarCodeChangeFocus() {
+            this.$nextTick(() => {
+                setTimeout(() => {
+                    this.$refs.couponBarCode.focus();
+                }, 200);
+            })
+        },
+        payCodeChangeFocus() {
+            this.$nextTick(() => {
+                setTimeout(() => {
+                    this.$refs.payCode.focus();
+                }, 200);
+            })
         }
     }
 });
@@ -1992,7 +2027,7 @@ function toPayOrder(payCode){
                  'sessionId':vm.sessionId,
                  'machineCode':vm.machineCode,
                  'memberCode': vm.memberCode,
-                 'memberPhone': vm.memberPhone,
+                 'memberPhone': vm.userInfo.customPhone,
                  'deductionScore': deductionScore,
                  'actualPrice': actualPrice,
                  'scoreDeductionPrice': scoreDeductionPrice,
@@ -2062,6 +2097,25 @@ function toRefund(){
     })
 }
 
+calScanSellVolume = function (prodBarcode) {
+    let goodsList = vm.goodsList;
+
+    console.log("prodBarcode typeof===>" + typeof prodBarcode);
+    console.log("prodBarcode===>" + prodBarcode);
+    if (goodsList === null || goodsList.length === 0) {
+        return 1;
+    }
+    let sellVolume = 0;
+    goodsList.forEach(goods => {
+        if (prodBarcode === goods.prodBarcode) {
+            sellVolume = sellVolume + goods.sellVolume;
+        }
+    });
+
+    return sellVolume;
+
+}
+
 /**
  * 计算当前购物栏商品优惠价格
  */
@@ -2091,10 +2145,17 @@ calculateOrderPrice = function() {
                 vm.memberPhone = r.data.memberPhone;
                 vm.openId = r.data.openId;
                 vm.deductionScore = r.data.deductionScore;
+                vm.memberCurrentAvailableScore = r.data.memberCurrentAvailableScore;
+                vm.levelName = r.data.levelName;
                 vm.scoreDeductionPrice = r.data.scoreDeductionPrice;
                 vm.scoreLimit = r.data.scoreLimit;
                 vm.beforeScore = r.data.beforeScore;
                 vm.afterScore = r.data.afterScore;
+                vm.userInfo.customPhone = r.data.memberPhone;
+                vm.$refs.customPhone.value = r.data.memberPhone;
+                // console.log("memberPhone===>" + r.data.memberPhone);
+                // console.log("this.userInfo.customPhone===>" + vm.userInfo.customPhone);
+                // console.log("vm.$refs.customPhone.value===>" + vm.$refs.customPhone.value);
                 // console.log("计算后数据===>" + JSON.stringify(calGoodsList));
                 // console.log("替换后数据===>" + JSON.stringify(vm.goodsList));
 
@@ -2119,20 +2180,20 @@ handleSellVolume = function (currentGoodsDetail, type) {
     // 当前未被处理的商品数量
     let number = currentGoodsDetail.sellVolume;
     // 当前商品应支付金额
-    let currentActualPaymentAmount = new BigNumber(currentGoodsDetail.actualPaymentAmount);
+    let currentActualPaymentAmount = new BigNumber(currentGoodsDetail.actualPaymentAmount, 2, BigNumber.ROUND_HALF_UP);
     // 当前商品税款
     let currentGoodsTax = new BigNumber(currentGoodsDetail.goodstaxes);
     // 当前商品零售价
     let retailPrice = new BigNumber(currentGoodsDetail.retailPrice);
     // 单个商品时的税款
-    let singleTax = currentGoodsTax.divide(number);
+    let singleTax = new BigNumber(currentGoodsTax.divide(number).toString(), 2, BigNumber.ROUND_HALF_UP);
     // 单个商品时的应支付金额
-    let singleActualPaymentAmount = currentActualPaymentAmount.divide(number);
+    let singleActualPaymentAmount = new BigNumber(currentActualPaymentAmount.divide(number).toString(), 2, BigNumber.ROUND_HALF_UP);
 
     // 当前总价
-    let currentTotalPrice = new BigNumber(vm.totalPrice);
+    let currentTotalPrice = new BigNumber(vm.totalPrice, 2, BigNumber.ROUND_HALF_UP);
     // 当前实际支付价
-    let currentActualPrice = new BigNumber(vm.actualPrice);
+    let currentActualPrice = new BigNumber(vm.actualPrice, 2, BigNumber.ROUND_HALF_UP);
     let storeId = sessionStorage.getItem("storeId");
     let sku = currentGoodsDetail.sku;
     let prodBarcode = currentGoodsDetail.prodBarcode;
@@ -2152,20 +2213,12 @@ handleSellVolume = function (currentGoodsDetail, type) {
             }
         });
     } else {
-        $.get("../goods/number/minus/"+ storeId +"/" + sku + "/" + prodBarcode, function (res) {
-            if (res.code === 0) {
-                currentGoodsDetail.sellVolume -= 1;
-                currentGoodsDetail.goodstaxes = currentGoodsTax.subtract(singleTax).toString();
-                currentGoodsDetail.actualPaymentAmount = currentActualPaymentAmount.subtract(singleActualPaymentAmount).toString();
-                vm.totalCount -= 1;
-                vm.totalPrice = currentTotalPrice.subtract(retailPrice).toString();
-                vm.actualPrice = currentActualPrice.subtract(singleActualPaymentAmount).toString();
-            } else if (res.code === 500) {
-                alert(res.msg);
-            } else {
-                alert("未知异常!请联系管理员!");
-            }
-        });
+        currentGoodsDetail.sellVolume -= 1;
+        currentGoodsDetail.goodstaxes = currentGoodsTax.subtract(singleTax).toString();
+        currentGoodsDetail.actualPaymentAmount = currentActualPaymentAmount.subtract(singleActualPaymentAmount).toString();
+        vm.totalCount -= 1;
+        vm.totalPrice = currentTotalPrice.subtract(retailPrice).toString();
+        vm.actualPrice = currentActualPrice.subtract(singleActualPaymentAmount).toString();
     }
 
     for (let i = 0; i < vm.goodsList.length; i++) {

+ 4 - 2
切换环境需要修改的.md

@@ -19,7 +19,7 @@
 
 6. cert安装目录配置在wx-mp.properties的certName中
 
-7. sale.js修改WebSocket地址,海控为127.0.0.1:8080
+7. sale.js修改WebSocket地址,海控为120.76.119.218:8080
 
 8. haikong.properties,修改env为prod
 
@@ -31,4 +31,6 @@
     HK_NOTICE_NUM: 100 (通知数据阀值)
 
 10. 微信支付推送海关支付凭证
-    cuspay-wx.properties,修改为海控生产环境配置
+    cuspay-wx.properties,修改为海控生产环境配置
+
+11. 如果测试环境需要测试支付,请在OrderServiceImpl的判断付款码之前加上:env = "prod";