| package com.matrix.system.shopXcx.api.tools; | 
|   | 
| import com.matrix.system.common.bean.CustomerDataDictionary; | 
| import com.matrix.system.common.dao.CustomerDataDictionaryDao; | 
| import com.matrix.biz.service.BizUserService; | 
| import com.matrix.component.tools.WxTempLateMsgUtil; | 
| import com.matrix.core.exception.GlobleException; | 
| import com.matrix.core.tools.LogUtil; | 
| import com.matrix.core.tools.StringUtils; | 
| import com.matrix.system.common.constance.AppConstance; | 
| import com.matrix.system.shopXcx.api.pojo.AddShopOrderPOJO; | 
| import com.matrix.system.shopXcx.api.pojo.OrderPostageInfoPOJO; | 
| import com.matrix.system.shopXcx.api.pojo.OrderProductSkuPOJO; | 
| import com.matrix.system.shopXcx.api.service.WxShopMemberDayService; | 
| import com.matrix.system.shopXcx.bean.*; | 
| import com.matrix.system.shopXcx.dao.*; | 
| import com.matrix.system.shopXcx.dto.ProductAttrInfoDTO; | 
| import org.apache.commons.collections.CollectionUtils; | 
| import org.springframework.beans.factory.annotation.Autowired; | 
| import org.springframework.stereotype.Service; | 
|   | 
| import java.math.BigDecimal; | 
| import java.text.SimpleDateFormat; | 
| import java.util.*; | 
|   | 
| /** | 
|  * @author jyy | 
|  */ | 
| @Service("wxShopOrderUtil") | 
| public class WxShopOrderUtil { | 
|     @Autowired | 
|     private SMSTools smsTools; | 
|   | 
|     @Autowired | 
|     private ShopOrderDao shopOrderDao; | 
|     @Autowired | 
|     private ShopProductDao shopProductDao; | 
|     @Autowired | 
|     private ShopOrderDetailsDao shopOrderDetailsDao; | 
|     @Autowired | 
|     private ShopSkuDao shopSkuDao; | 
|     @Autowired | 
|     private ShopDeliveryInfoDao shopDeliveryInfoDao; | 
|     @Autowired | 
|     private ShopProductAttrRefDao shopProductAttrRefDao; | 
|     @Autowired | 
|     private WxShopMemberDayService wxShopMemberDayService; | 
|     @Autowired | 
|     private BizUserService bizUserService; | 
|     @Autowired | 
|     private ShopScoreRecordDao shopScoreRecordDao; | 
|   | 
|   | 
|     private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日"); | 
|   | 
|   | 
|     /** | 
|      * 根据产品ids获取产品信息相关Map | 
|      * @param productIds | 
|      * @return | 
|      */ | 
|     public Map<Integer, ShopProduct> getProductInfoMap(List<Integer> productIds) { | 
|         Map<Integer, ShopProduct> productMap = new HashMap<>(); | 
|         if (CollectionUtils.isEmpty(productIds)) { | 
|             return productMap; | 
|         } | 
|         List<ShopProduct> productList = shopProductDao.selectByIds(productIds); | 
|         if (CollectionUtils.isNotEmpty(productList)) { | 
|             for (ShopProduct shopProduct : productList) { | 
|                 productMap.put(shopProduct.getId(), shopProduct); | 
|             } | 
|         } | 
|         return productMap; | 
|     } | 
|   | 
|     /** | 
|      * 根据产品ids获取产品属性相关Map | 
|      * @param productIds | 
|      * @return | 
|      */ | 
|     public Map<Integer, List<String>> getProductAttrInfoMap(List<Integer> productIds) { | 
|         Map<Integer, List<String>> attrInfoMap = new HashMap<>(); | 
|         if (CollectionUtils.isEmpty(productIds)) { | 
|             return attrInfoMap; | 
|         } | 
|         List<ProductAttrInfoDTO> attrInfo = shopProductAttrRefDao.selectAttrIdsByProductIds(productIds); | 
|         if (CollectionUtils.isNotEmpty(attrInfo)) { | 
|             for (ProductAttrInfoDTO productAttrInfoDTO : attrInfo) { | 
|                 List<String> attrIdList = StringUtils.strToCollToString(productAttrInfoDTO.getAttrStr(), "/"); | 
|                 attrInfoMap.put(productAttrInfoDTO.getpId(), attrIdList); | 
|             } | 
|         } | 
|         return attrInfoMap; | 
|     } | 
|   | 
|     /** | 
|      * 处理产品规格信息 | 
|      * @param addShopOrderPOJO | 
|      */ | 
|     public List<ShopOrderDetails> processProductSkuInfo(ShopOrder shopOrder, AddShopOrderPOJO addShopOrderPOJO, | 
|                                                         ShopCoupon shopCoupon) { | 
|         List<ShopOrderDetails> resList = new ArrayList<>(); | 
|         List<OrderProductSkuPOJO> skuList = addShopOrderPOJO.getSkuList(); | 
|         if (CollectionUtils.isEmpty(skuList)) { | 
|             return resList; | 
|         } | 
|         List<Integer> ids = new ArrayList<>(); | 
|         //设置购买数量 | 
|         int total = 0; | 
|         BigDecimal commodityMoney = new BigDecimal("0"); | 
|         for (OrderProductSkuPOJO orderProductSkuPOJO : skuList) { | 
|             ids.add(orderProductSkuPOJO.getSkuId()); | 
|             total += orderProductSkuPOJO.getCount(); | 
|         } | 
|         shopOrder.setPurchaseQuantity(total); | 
|         List<ShopSku> contrastList = shopSkuDao.selectByIds(ids); | 
|   | 
|         List<Integer> productIds = new ArrayList<>(); | 
|   | 
|         if (CollectionUtils.isNotEmpty(contrastList)) { | 
|             for (ShopSku shopSku : contrastList) { | 
|                 productIds.add(shopSku.getPId()); | 
|             } | 
|         } | 
|   | 
|         //获取产品信息相关Map | 
|         Map<Integer, ShopProduct> productInfoMap = getProductInfoMap(productIds); | 
|   | 
|         //获取产品属性相关Map | 
|         Map<Integer, List<String>> attrInfoMap = getProductAttrInfoMap(productIds); | 
|   | 
|         BigDecimal couponTotalMoney = new BigDecimal("0"); | 
|         Double discountRate = wxShopMemberDayService.getMemberDay(); | 
|         for (OrderProductSkuPOJO orderProductSkuPOJO : skuList) { | 
|             boolean isExist = false; | 
|             for (ShopSku shopSku : contrastList) { | 
|                 if (shopSku.getId().equals(orderProductSkuPOJO.getSkuId())) { | 
|                     isExist = true; | 
|                     ShopOrderDetails shopOrderDetails = new ShopOrderDetails(); | 
|                     shopOrderDetails.setCreateBy(AppConstance.SYSTEM_USER); | 
|                     shopOrderDetails.setUpdateBy(AppConstance.SYSTEM_USER); | 
|                     shopOrderDetails.setpId(shopSku.getPId()); | 
|                     shopOrderDetails.setsId(shopSku.getId()); | 
|                     shopOrderDetails.setPrice(shopSku.getPrice()); | 
|                     shopOrderDetails.setCount(orderProductSkuPOJO.getCount()); | 
|                     BigDecimal price = new BigDecimal(shopSku.getPrice().toString()); | 
|                     BigDecimal count = new BigDecimal(orderProductSkuPOJO.getCount().toString()); | 
|                     shopOrderDetails.setsTitle(shopSku.getName()); | 
|                     resList.add(shopOrderDetails); | 
|   | 
|                     if (shopCoupon != null) { | 
|                         BigDecimal skuTotalMoney = price.multiply(count); | 
|                         shopOrderDetails.setTotalPrice(skuTotalMoney); | 
|                         commodityMoney = commodityMoney.add(skuTotalMoney); | 
|                         //如果该优惠券优惠产品包含该产品 | 
|                         String discountProductIds = "," + shopCoupon.getProductIds() + ","; | 
|                         Integer productId = shopSku.getPId(); | 
|                         if (discountProductIds.indexOf("," + productId + ",") != -1) { | 
|                             couponTotalMoney = couponTotalMoney.add(skuTotalMoney); | 
|                             break; | 
|                         } | 
|   | 
|                         //如果该优惠券优惠属性包含该产品属性 | 
|                         List<String> attrIds = attrInfoMap.get(productId); | 
|                         if (CollectionUtils.isNotEmpty(attrIds)) { | 
|                             String discountAttrIds = "," + shopCoupon.getAttrIds() + ","; | 
|                             for (String attrId : attrIds) { | 
|                                 if (discountAttrIds.indexOf("," + attrId + ",") != -1) { | 
|                                     couponTotalMoney = couponTotalMoney.add(skuTotalMoney); | 
|                                     break; | 
|                                 } | 
|                             } | 
|                         } | 
|                     } else { | 
|                         ShopProduct shopProduct = productInfoMap.get(shopSku.getPId()); | 
|                         //今日有打折活动并且该商品不是特价商品 | 
|                         if (shopProduct != null && !discountRate.equals(1D) && | 
|                                 !AppConstance.PRODUCT_SPECIAL_PRICE.equals(shopProduct.getIsSpecialPrice())) { | 
|                             BigDecimal skuTotalMoney = price.multiply(count); | 
|                             BigDecimal realMoney = skuTotalMoney.multiply(new BigDecimal(discountRate.toString())); | 
|                             shopOrderDetails.setDiscountAmount(skuTotalMoney.subtract(realMoney)); | 
|                             String discountRateStr =  new BigDecimal("10"). | 
|                                     multiply(new BigDecimal(discountRate.toString())).toString(); | 
|                             shopOrderDetails.setDiscountExplain("会员日" + discountRateStr + "折"); | 
|                             shopOrderDetails.setTotalPrice(realMoney); | 
|                             commodityMoney = commodityMoney.add(realMoney); | 
|                             continue; | 
|                         } | 
|                         BigDecimal skuTotalMoney = price.multiply(count); | 
|                         shopOrderDetails.setTotalPrice(skuTotalMoney); | 
|                         commodityMoney = commodityMoney.add(skuTotalMoney); | 
|                     } | 
|                     break; | 
|                 } | 
|             } | 
|             //如果其中一个规格没有找到规格信息 | 
|             if (!isExist) { | 
|                 return new ArrayList<>(); | 
|             } | 
|         } | 
|   | 
|         //如果达到优惠条件 | 
|         BigDecimal discountMoney = new BigDecimal("0"); | 
|         if (shopCoupon != null && couponTotalMoney.compareTo(shopCoupon.getMinAmount()) >= 0) { | 
|             discountMoney = shopCoupon.getOffsetAmount(); | 
|             shopOrder.setDiscountExplain(shopCoupon.getCName()); | 
|             shopOrder.setDiscountAmount(discountMoney); | 
|         } else { | 
|             shopOrder.setDiscountAmount(BigDecimal.ZERO); | 
|             shopOrder.setDiscountExplain("无"); | 
|         } | 
|         shopOrder.setCommodityPrice(commodityMoney); | 
|         shopOrder.setOrderMoney(commodityMoney.subtract(discountMoney)); | 
|         return resList; | 
|     } | 
|   | 
|     /** | 
|      * 新增发货信息 | 
|      */ | 
|     public int insertSendPackageInfo(ShopOrder shopOrder, String shippingMethod, ShopReceiveAddress receiveAddress) { | 
|         ShopDeliveryInfo shopDeliveryInfo = new ShopDeliveryInfo(); | 
|         shopDeliveryInfo.setCreateBy(AppConstance.SYSTEM_USER); | 
|         shopDeliveryInfo.setUpdateBy(AppConstance.SYSTEM_USER); | 
|         shopDeliveryInfo.setOrderId(shopOrder.getId()); | 
|         shopDeliveryInfo.setOrderNo(shopOrder.getOrderNo()); | 
|         shopDeliveryInfo.setUserId(shopOrder.getUserId()); | 
|         shopDeliveryInfo.setDeliveryWay(shippingMethod); | 
|         shopDeliveryInfo.setShopId(shopOrder.getStoreId().longValue()); | 
|         StringBuffer receiveAddrStr = new StringBuffer(); | 
|         if (receiveAddress != null) { | 
|             receiveAddrStr.append(receiveAddress.getAddrProvince()); | 
|             receiveAddrStr.append(receiveAddress.getAddrCity()); | 
|             receiveAddrStr.append(receiveAddress.getAddrArea()); | 
|             receiveAddrStr.append(receiveAddress.getAddrDetailaddr()); | 
|         } | 
|         shopDeliveryInfo.setReceiveAddress(receiveAddrStr.toString()); | 
|         int res = shopDeliveryInfoDao.insert(shopDeliveryInfo); | 
|         return res; | 
|     } | 
|   | 
|     /** | 
|      * 校验商品限购 | 
|      * @param detailsList | 
|      * @return | 
|      */ | 
|     public void verifyProductLimitInfo(List<ShopOrderDetails> detailsList, String userId) { | 
|         Map<Integer, Integer> productBuyMap = new HashMap<>(); | 
|         for (ShopOrderDetails shopOrderDetails : detailsList) { | 
|             Integer productId = shopOrderDetails.getpId(); | 
|             Integer buyCount = shopOrderDetails.getCount(); | 
|             Integer buyTotal = productBuyMap.get(productId); | 
|             if (buyTotal == null) { | 
|                 buyTotal = 0; | 
|             } | 
|             buyTotal += buyCount; | 
|             productBuyMap.put(productId, buyTotal); | 
|         } | 
|         for (Integer key : productBuyMap.keySet()) { | 
|             ShopProduct shopProduct = shopProductDao.selectById(key); | 
|             //限购数量 | 
|             Integer buyLimit = shopProduct.getBuyLimit(); | 
|             if (buyLimit == null || buyLimit <= 0) { | 
|                 continue; | 
|             } | 
|             //限购周期 | 
|             Integer limitCycle = shopProduct.getLimitCycle(); | 
|             if (limitCycle == null || limitCycle <= 0) { | 
|                 continue; | 
|             } | 
|             Integer curBuyCount = productBuyMap.get(key); | 
|             if (curBuyCount == null) { | 
|                 curBuyCount = 0; | 
|             } | 
|             Integer cycleByCount = shopOrderDetailsDao.selectBuyCountByProductId(userId, limitCycle - 1, key); | 
|             if (cycleByCount + curBuyCount > buyLimit ) { | 
|                 throw new GlobleException(shopProduct.getTitle() + "产品" + limitCycle + "天内限购" + buyLimit + "个"); | 
|             } | 
|         } | 
|     } | 
|   | 
|     /** | 
|      * 更新产品库存和规格销量 | 
|      */ | 
|     public int updateProductAndSkuInfo(List<ShopOrderDetails> detailsList) { | 
|         int res = 0; | 
|         for (ShopOrderDetails shopOrderDetails : detailsList) { | 
|             ShopProduct shopProduct = shopProductDao.selectById(shopOrderDetails.getpId()); | 
|             if (shopProduct == null) { | 
|                 throw new GlobleException("没有找到商品信息!"); | 
|             } | 
|             if (shopProduct.getDsVolume() == null) { | 
|                 shopProduct.setDsVolume(0); | 
|             } | 
|             shopProduct.setDsVolume(shopProduct.getDsVolume() + shopOrderDetails.getCount()); | 
|             if (shopProduct.getRsVolume() == null) { | 
|                 shopProduct.setRsVolume(0); | 
|             } | 
|             shopProduct.setRsVolume(shopProduct.getRsVolume() + shopOrderDetails.getCount()); | 
|             shopProductDao.updateByModel(shopProduct); | 
|             ShopSku shopSku = shopSkuDao.selectById(shopOrderDetails.getsId()); | 
|             if (shopSku == null) { | 
|                 throw new GlobleException("没有找到规格信息!"); | 
|             } | 
|             if (shopSku.getStock() == null) { | 
|                 shopSku.setStock(0); | 
|             } | 
|             //如果购买商品库存不足 | 
|             if (shopSku.getStock() - shopOrderDetails.getCount() < 0) { | 
|                 throw new GlobleException(shopProduct.getTitle() + "[" + shopSku.getName() + "]您来晚了商品已经卖完了"); | 
|             } | 
|             shopSku.setStock(shopSku.getStock() - shopOrderDetails.getCount()); | 
|             shopSku.setSealCount(shopSku.getSealCount()+shopOrderDetails.getCount()); | 
|   | 
|             res = shopSkuDao.updateByModel(shopSku); | 
|         } | 
|         return res; | 
|     } | 
|   | 
|     /** | 
|      * 根据下单信息获取邮费 | 
|      * @param shippingMethod 购买方式(1=物流,2=门店自提) | 
|      * @param orderMoney 订单金额 | 
|      * @param province  接受包裹省名称 | 
|      * @return | 
|      */ | 
|     public BigDecimal getPostageByOrderInfo(Integer shippingMethod, BigDecimal orderMoney, String province) { | 
|         //如果没有提交配送方式或配送方式不是物流 | 
|         if (shippingMethod == null || shippingMethod != 1) { | 
|             return new BigDecimal("0"); | 
|         } | 
|         OrderPostageInfoPOJO orderPostageInfoPOJO = getOrderPostageInfo(); | 
|         //默认为外省用户 | 
|         boolean inProvinceFlag = false; | 
|         //判断是否是省内用户 | 
|         if (province != null && province.indexOf("湖南") != -1) { | 
|             inProvinceFlag = true; | 
|         } | 
|         if (!inProvinceFlag) { | 
|             return new BigDecimal(orderPostageInfoPOJO.getOutProvincePostage().toString()); | 
|         } | 
|         //是否达到满减条件 | 
|         boolean isOver = orderMoney.compareTo(new BigDecimal(orderPostageInfoPOJO.getProvinceMinAmountTree().toString())) >= 0; | 
|         //如果是省内用户并且已经达到了免邮的费用 | 
|         if (isOver) { | 
|             return new BigDecimal("0"); | 
|         } | 
|         BigDecimal postage  = new BigDecimal(orderPostageInfoPOJO.getInProvincePostage().toString()); | 
|         return postage; | 
|     } | 
|   | 
|     /** | 
|      * 发货后给客户发送微信提醒 | 
|      * @param deliveryInfo | 
|      * @return | 
|      */ | 
|     public int deliverSuccessSendWxMsgToUser(ShopDeliveryInfo deliveryInfo) { | 
|         ShopOrder order = shopOrderDao.selectById(deliveryInfo.getOrderId()); | 
|         if (order == null) { | 
|             throw new GlobleException("没有找到需要发货的订单信息"); | 
|         } | 
|         List<String> msg = new ArrayList<>(); | 
|         msg.add(order.getOrderNo()); | 
|         //设置商品名称 | 
|         msg.add(getProductNames(order.getUserId(), order.getId())); | 
|         msg.add(deliveryInfo.getReceiveAddress()); | 
|         msg.add(deliveryInfo.getLogisticsCompany()); | 
|         msg.add(deliveryInfo.getWaybillNo()); | 
|         String formId = order.getWxOrderNo().split("=")[1]; | 
|         String page = "pages/logistics/logistics?inform=1&id=" + order.getId(); | 
|         int res = WxTempLateMsgUtil.sendWxTemplateMsg(msg, order.getUserId(), | 
|                 page, WxTempLateMsgUtil.ORDER_DELIVERY, formId); | 
|         return res; | 
|     } | 
|   | 
|     /** | 
|      * 订单付款成功后给客户发送微信提醒 | 
|      * @param order | 
|      * @return | 
|      */ | 
|     public int paySuccessSendWxMsgToUser(ShopOrder order) { | 
|         List<String> msg = new ArrayList<>(); | 
|         msg.add(order.getOrderNo()); | 
|         msg.add(new BigDecimal(order.getOrderMoney().toString()).toString() + "元"); | 
|         msg.add(dateFormat.format(order.getOrderTime())); | 
|         msg.add(getProductNames(order.getUserId(), order.getId())); | 
|         String formId = order.getWxOrderNo().split("=")[1]; | 
|         String page = "pages/orderDetails/orderDetails?inform=1&id=" + order.getId(); | 
|         return WxTempLateMsgUtil.sendWxTemplateMsg(msg, order.getUserId(), page, WxTempLateMsgUtil.ORDER_PAY_SUCCESS, formId); | 
|     } | 
|   | 
|     /** | 
|      * 根据用户ID和订单ID获取所购买商品名称 | 
|      * @param openId 用户openId | 
|      * @param orderId 订单ID | 
|      * @return 所含商品名称(多个以","隔开) | 
|      */ | 
|     public String getProductNames(String openId, Integer orderId) { | 
|         ShopOrder orderDetail = shopOrderDao.selectOrderInfoById(openId, orderId); | 
|         List<ShopOrderDetails> details = orderDetail.getDetails(); | 
|         if (CollectionUtils.isEmpty(details)) { | 
|             return ""; | 
|         } | 
|         StringBuffer productNameBuffer = new StringBuffer(); | 
|         Integer maxLength = 30; | 
|         for (int i = 0; i< details.size(); i++) { | 
|             ShopOrderDetails shopOrderDetails = details.get(i); | 
|             ShopProduct shopProduct = shopOrderDetails.getShopProduct(); | 
|             if (shopProduct == null) { | 
|                 continue; | 
|             } | 
|             if (i == 0 && shopProduct.getTitle().length() > maxLength) { | 
|                 productNameBuffer.append(shopProduct.getTitle().substring(0, maxLength) + "..."); | 
|                 break; | 
|             } | 
|             if ((productNameBuffer.length() + shopProduct.getTitle().length()) > maxLength) { | 
|                 productNameBuffer.append("等"); | 
|                 break; | 
|             } | 
|             productNameBuffer.append(shopProduct.getTitle() + ","); | 
|         } | 
|         String productNames = productNameBuffer.toString(); | 
|         if (productNames.endsWith(",")) { | 
|             productNames = productNames.substring(0, productNames.length() - 1); | 
|         } | 
|         if (productNames.endsWith(",等")) { | 
|             productNames = productNames.substring(0, productNames.length() - 2) + "等"; | 
|         } | 
|         return productNames; | 
|     } | 
|   | 
|   | 
|   | 
|   | 
|     /** | 
|      * 从数据字典表中获取邮费信息 | 
|      * @return | 
|      */ | 
|     public OrderPostageInfoPOJO getOrderPostageInfo() { | 
|         OrderPostageInfoPOJO res = new OrderPostageInfoPOJO(); | 
|         res.setInProvincePostage(0D); | 
|         res.setOutProvincePostage(0D); | 
|         res.setProvinceMinAmountTree(0D); | 
|         //TODO  暂时设置邮费为0 | 
|         res.setInProvincePostage(0D); | 
|         return res; | 
|     } | 
|   | 
|     /** | 
|      * 处理从数据字典中获取的邮费 | 
|      * @return | 
|      */ | 
|     private Double processPostageValue(CustomerDataDictionary dataDictionary) { | 
|         Double res = 0D; | 
|         try { | 
|             Double value = Double.valueOf(dataDictionary.getValue()); | 
|             if (value != null && value.compareTo(0D) == 1) { | 
|                 res = value; | 
|             } | 
|         } catch (Exception e) { | 
|             LogUtil.error("没有获取到相关的邮费信息", e); | 
|             return 0D; | 
|         } | 
|         return res; | 
|     } | 
|   | 
|   | 
|   | 
| } |