Forráskód Böngészése

fix 主订单导出;实物购物车下单

zoujiajian 2 éve
szülő
commit
a78cffbf07

+ 228 - 0
netflix-dao/src/main/java/com/cyksj/model/excel/ExcelOrderMasterDonData.java

@@ -0,0 +1,228 @@
+package com.cyksj.model.excel;
+
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.cyksj.model.entity.OrderMasterDon;
+import com.cyksj.model.excel.merge.CustomMerge;
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.DbIgnore;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: ExcelOrderMasterDonData
+ * 创建者: JavaZou
+ * 创建时间:2023/10/17 10:20
+ */
+@Getter
+@Setter
+@ExcelIgnoreUnannotated
+@SearchBean(tables = "order_master_don o" +
+		" left join user u on o.user_id = u.id" +
+		" left join order_don_transport odt on odt.order_id = o.id",
+		where = ":condition:"
+)
+public class ExcelOrderMasterDonData {
+	@CustomMerge(needMerge = true, isPk = true)
+	@ExcelProperty(value = "订单号")
+	@DbField("o.order_no")
+	private String orderNo;
+
+	@CustomMerge(needMerge = true, isPk = true)
+	@ExcelProperty(value = "主订单id")
+	@DbField("o.id")
+	private Long orderId;
+
+	@CustomMerge(needMerge = true)
+	@ExcelProperty(value = "创建时间")
+	@DbField("o.created_time")
+	private Date createdTime;
+
+	@ExcelProperty(value = "子订单id")
+	@DbIgnore
+	private Long orderSkuId;
+
+	@CustomMerge(needMerge = true)
+	@ExcelProperty(value = "用户名")
+	@DbField("u.nickname")
+	private String nickname;
+
+	@CustomMerge(needMerge = true)
+	@ExcelProperty(value = "用户id")
+	@DbField("o.user_id")
+	private Long userId;
+
+	@CustomMerge(needMerge = true)
+	@ExcelProperty(value = "注册方式")
+	@DbIgnore
+	private String registerEnv;
+
+	@CustomMerge(needMerge = true)
+	@ExcelProperty(value = "渠道")
+	@DbIgnore
+	private String channel;
+
+	@ExcelProperty(value = "商品")
+	@DbIgnore
+	private String title;
+
+	@ExcelProperty(value = "规格")
+	@DbIgnore
+	private String specVal;
+
+	@ExcelProperty(value = "主账号")
+	@DbIgnore
+	private String account;
+
+	@ExcelProperty(value = "减免金额")
+	@DbIgnore
+	private String discountInfo;
+
+	@ExcelProperty(value = "价格")
+	@DbIgnore
+	private BigDecimal orderSkuMoney;
+
+	@ExcelProperty(value = "银河币")
+	@DbIgnore
+	private BigDecimal galaxycoin;
+
+	@ExcelProperty(value = "状态")
+	@DbIgnore
+	private String status;
+
+	@ExcelProperty(value = "付款方式")
+	@CustomMerge(needMerge = true)
+	@DbIgnore
+	private String payType;
+
+	/**
+	 * 收货人
+	 */
+	@DbField("odt.receiver")
+	@ExcelProperty(value = "收货人")
+	@CustomMerge(needMerge = true)
+	private String receiver;
+
+	/**
+	 * 手机号
+	 */
+	@DbField("odt.phone")
+	@ExcelProperty(value = "手机号")
+	@CustomMerge(needMerge = true)
+	private String phone;
+
+	@ExcelProperty(value = "地址")
+	@CustomMerge(needMerge = true)
+	@DbIgnore
+	private String addressInfo;
+
+	/**
+	 * 总订单金额
+	 */
+	@CustomMerge(needMerge = true)
+	@ExcelProperty(value = "总金额")
+	@DbField("o.money")
+	private BigDecimal money;
+
+	/**
+	 * 是否是额外硬塞的虚拟车票订单
+	 */
+	@DbField("o.is_ot")
+	private Boolean isOt;
+
+	@DbField("o.transaction_id")
+	private String transactionId;
+
+	@DbField("case when u.login_phone != '' then 'phone' when u.email != '' then 'email' when u.open_id != '' then 'wechat' else 'wechat' end")
+	private String register;
+
+	/**
+	 * 登录注册手机号
+	 */
+	@DbField("u.login_phone")
+	private String loginPhone;
+
+	/**
+	 * 登录注册邮箱
+	 */
+	@DbField("u.email")
+	private String email;
+
+	@DbField("u.is_google")
+	private Boolean isGoogle;
+
+	@DbField("o.type")
+	private OrderMasterDon.Type type;
+
+	@DbField("o.order_type")
+	private Integer orderType;
+
+	@DbField("o.num")
+	private Integer num;
+
+	@DbField("o.popularize_id")
+	private Long popularizeId;
+
+	@DbField("o.pay_time")
+	private Date payTime;
+
+	@DbField("o.is_dp")
+	private Boolean isDp;
+
+	@DbField("o.pay_title")
+	private String payTitle;
+
+	/**
+	 * 省份
+	 */
+	@DbField("odt.province")
+	private String province;
+
+	/**
+	 * 城市
+	 */
+	@DbField("odt.city")
+	private String city;
+
+	/**
+	 * 区/县
+	 */
+	@DbField("odt.district")
+	private String district;
+
+	/**
+	 * 详细地址
+	 */
+	@DbField("odt.address")
+	private String address;
+
+	public String getPayType() {
+		if (type == null) {
+			return OrderMasterDon.Type.WeChat.getDesc();
+		}
+		return type.getDesc();
+	}
+
+	public String getAddressInfo() {
+		if (StrUtil.isEmpty(province)) {
+			return StrUtil.EMPTY;
+		}
+		return String.format("%s%s%s%s", province, city, district, address);
+	}
+
+	public String getRegisterEnv() {
+		if ("phone".equals(register)) {
+			return String.format("手机号%s", loginPhone);
+		}
+		if ("email".equals(register)) {
+			return String.format("邮箱%s", loginPhone);
+		}
+		return "微信授权";
+	}
+}

+ 23 - 0
netflix-dao/src/main/java/com/cyksj/model/excel/merge/CustomMerge.java

@@ -0,0 +1,23 @@
+package com.cyksj.model.excel.merge;
+
+import java.lang.annotation.*;
+
+/**
+ * @author zwhui
+ * @date 2022/10/9 15:46
+ */
+@Target({ElementType.FIELD})
+@Retention(RetentionPolicy.RUNTIME)
+@Inherited
+public @interface CustomMerge {
+
+    /**
+     * 是否需要合并单元格
+     */
+    boolean needMerge() default false;
+
+    /**
+     * 是否是主键,即该字段相同的行合并
+     */
+    boolean isPk() default false;
+}

+ 165 - 0
netflix-dao/src/main/java/com/cyksj/model/excel/merge/CustomMergeStrategy.java

@@ -0,0 +1,165 @@
+package com.cyksj.model.excel.merge;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.write.handler.RowWriteHandler;
+import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
+import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.util.CellRangeAddress;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author zwhui
+ * @date 2022/10/9 15:39
+ */
+@Slf4j
+public class CustomMergeStrategy implements RowWriteHandler {
+    /**
+     * 主键下标
+     */
+    private Integer pkIndex;
+
+    /**
+     * 总行数
+     */
+    private Integer totalRowNum;
+
+    /**
+     * 需要合并的列的下标集合
+     */
+    private List<Integer> needMergeColumnIndex = new ArrayList<>();
+
+    /**
+     * DTO数据类型
+     */
+    private Class<?> elementType;
+    
+    private Map<Integer,Map<Integer,Integer>> mergeRowNum = new HashMap<>();
+
+    public CustomMergeStrategy(Integer totalRowNum,Class<?> elementType) {
+        this.totalRowNum = totalRowNum;
+        this.elementType = elementType;
+    }
+
+    @Override
+    public void beforeRowCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Integer integer, Integer integer1, Boolean aBoolean) {
+
+    }
+
+    @Override
+    public void afterRowCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Integer integer, Boolean aBoolean) {
+
+    }
+
+    @Override
+    public void afterRowDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Integer relativeRowIndex, Boolean isHead) {
+        // 如果是标题,则直接返回
+        if (isHead) {
+            return;
+        }
+
+        // 获取当前sheet
+        Sheet sheet = writeSheetHolder.getSheet();
+
+        // 获取标题行
+        Row titleRow = sheet.getRow(0);
+
+        if (null == pkIndex) {
+            this.lazyInit(writeSheetHolder);
+        }
+
+        // 判断是否需要和上一行进行合并
+        // 不能和标题合并,只能数据行之间合并
+        if (row.getRowNum() <= 1) {
+            return;
+        }
+        // 获取上一行数据
+        Row lastRow = sheet.getRow(row.getRowNum() - 1);
+        // 将本行和上一行是同一类型的数据(通过主键字段进行判断),则需要合并
+        Integer value = Double.valueOf(row.getCell(pkIndex).getNumericCellValue()).intValue();
+        if (Double.valueOf(lastRow.getCell(pkIndex).getNumericCellValue()).intValue() == value) {
+            Map<Integer, Integer> map = mergeRowNum.get(value);
+            if (null == map) {
+                map = new HashMap<>(2);
+                map.put(1,lastRow.getRowNum());
+            }
+            map.put(2,row.getRowNum());
+            mergeRowNum.put(value,map);
+        }
+        if (totalRowNum == row.getRowNum()) {
+            for (Integer needMerIndex : needMergeColumnIndex) {
+                for (Map<Integer, Integer> map : mergeRowNum.values()) {
+                    CellRangeAddress cellRangeAddress = new CellRangeAddress(map.get(1), map.get(2),
+                            needMerIndex, needMerIndex);
+                    sheet.addMergedRegionUnsafe(cellRangeAddress);
+                }
+            }
+        }
+    }
+
+    /**
+     * 初始化主键下标和需要合并字段的下标
+     */
+    private void lazyInit(WriteSheetHolder writeSheetHolder) {
+
+        // 获取当前sheet
+        Sheet sheet = writeSheetHolder.getSheet();
+
+        // 获取标题行
+        Row titleRow = sheet.getRow(0);
+        // 获取DTO的类型
+        Class<?> eleType = this.elementType;
+
+        // 获取DTO所有的属性
+        Field[] fields = eleType.getDeclaredFields();
+
+        // 遍历所有的字段,因为是基于DTO的字段来构建excel,所以字段数 >= excel的列数
+        for (Field theField : fields) {
+            // 获取@ExcelProperty注解,用于获取该字段对应在excel中的列的下标
+            ExcelProperty easyExcelAnno = theField.getAnnotation(ExcelProperty.class);
+            // 为空,则表示该字段不需要导入到excel,直接处理下一个字段
+            if (null == easyExcelAnno) {
+                continue;
+            }
+            // 获取自定义的注解,用于合并单元格
+            CustomMerge customMerge = theField.getAnnotation(CustomMerge.class);
+
+            // 没有@CustomMerge注解的默认不合并
+            if (null == customMerge) {
+                continue;
+            }
+
+            for (int index = 0; index < fields.length; index++) {
+                Cell theCell = titleRow.getCell(index);
+                // 当配置为不需要导出时,返回的为null,这里作一下判断,防止NPE
+                if (null == theCell) {
+                    continue;
+                }
+                // 将字段和excel的表头匹配上
+                if (easyExcelAnno.value()[0].equalsIgnoreCase(theCell.getStringCellValue())) {
+                    if (customMerge.isPk()) {
+                        pkIndex = index;
+                    }
+
+                    if (customMerge.needMerge()) {
+                        needMergeColumnIndex.add(index);
+                    }
+                }
+            }
+        }
+
+        // 没有指定主键,则异常
+        if (null == this.pkIndex) {
+            throw new IllegalStateException("使用@CustomMerge注解必须指定主键");
+        }
+
+    }
+}

+ 158 - 0
netflix-dao/src/main/java/com/cyksj/model/manage/views/OrderDonSkuBackView.java

@@ -0,0 +1,158 @@
+package com.cyksj.model.manage.views;
+
+import com.cyksj.model.entity.GoodsDon;
+import com.cyksj.model.entity.OrderDon;
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.DbIgnore;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: OrderDonSkuBackView
+ * 创建者: JavaZou
+ * 创建时间:2023/10/17 12:22
+ */
+@Getter
+@Setter
+@SearchBean(tables = "order_don o left join goods_don g on g.id = o.goods_id" +
+		" left join goods_don_sku sku on sku.id = o.sku_id" +
+		" left join groups_relation gr on gr.id = o.relation_id"
+)
+public class OrderDonSkuBackView {
+	@DbField("o.id")
+	private Long id;
+
+	@DbField("o.m_oid")
+	private Long mOid;
+
+	@DbIgnore
+	private String channel;
+
+	@DbField("o.relation_id")
+	private Long relationId;
+
+	/**
+	 * 邀请制用户账号
+	 */
+	@DbIgnore
+	private String account;
+
+	@DbField("gr.groups_id")
+	private Long groupsId;
+
+	/**
+	 * 主账号
+	 */
+	@DbIgnore
+	private String gtAccount;
+
+	@DbField("g.type")
+	private Integer goodsDonType;
+
+	@DbField("o.order_no")
+	private String orderNo;
+
+	@DbField("o.transaction_id")
+	private String transactionId;
+
+	@DbField("g.logo")
+	private String logo;
+
+	@DbField("g.title")
+	private String title;
+
+	@DbField("g.special_type")
+	private GoodsDon.SpecialType goodsSpecialType;
+
+	@DbField("o.sku_id")
+	private Long skuId;
+
+	@DbField("sku.spec_val")
+	private String specVal;
+
+	@DbField("o.user_id")
+	private Long userId;
+
+	@DbField("o.money")
+	private BigDecimal money;
+
+	@DbField("o.balance")
+	private BigDecimal balance;
+
+	@DbField("o.gc_cash")
+	private BigDecimal gcCash;
+
+	@DbField("o.refund_money")
+	private BigDecimal refundMoney;
+
+	@DbField("o.status")
+	private OrderDon.Status status;
+
+	@DbField("o.type")
+	private OrderDon.Type type;
+
+	@DbField("o.order_type")
+	private Integer orderType;
+
+	@DbField("o.source")
+	private OrderDon.Source source;
+
+	@DbField("o.label_source")
+	private String labelSource;
+
+	@DbField("o.tv_type")
+	private Integer tvType;
+
+	@DbIgnore
+	private Integer months;
+
+	@DbIgnore
+	private Integer days;
+
+	@DbField("o.num")
+	private Integer num;
+
+	@DbField("o.created_time")
+	private Date createdTime;
+
+	@DbField("o.coupon_user_id")
+	private Long couponUserId;
+
+	@DbIgnore
+	private String couponName;
+
+	@DbField("o.coupon_money")
+	private BigDecimal couponMoney;
+
+	@DbField("o.popularize_id")
+	private Long popularizeId;
+
+	@DbField("o.pay_time")
+	private Date payTime;
+
+	@DbField("o.is_dp")
+	private Boolean isDp;
+
+	@DbField("o.pay_title")
+	private String payTitle;
+
+	@DbField("o.ex_code")
+	private String exCode;
+
+	@DbField("o.sub_node")
+	private String subNode;
+
+	@DbField("o.yhs_id")
+	private Long yhsId;
+
+	@DbIgnore
+	private String beforeServiceName;
+
+	@DbIgnore
+	private String afterServiceName;
+}

+ 56 - 0
netflix-dao/src/main/java/com/cyksj/model/manage/views/OrderDonSkuExportView.java

@@ -0,0 +1,56 @@
+package com.cyksj.model.manage.views;
+
+import com.cyksj.model.entity.OrderDon;
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: OrderDonSkuExportView
+ * 创建者: JavaZou
+ * 创建时间:2023/10/17 14:14
+ */
+@Getter
+@Setter
+@SearchBean(tables = "order_don o left join goods_don g on g.id = o.goods_id" +
+		" left join goods_don_sku sku on sku.id = o.sku_id" +
+		" left join groups_relation gr on gr.id = o.relation_id"
+)
+public class OrderDonSkuExportView {
+	@DbField("o.id")
+	private Long id;
+
+	@DbField("o.m_oid")
+	private Long mOid;
+
+	@DbField("gr.groups_id")
+	private Long groupsId;
+
+	@DbField("g.title")
+	private String title;
+
+	@DbField("sku.spec_val")
+	private String specVal;
+
+	@DbField("o.money")
+	private BigDecimal money;
+
+	@DbField("o.balance")
+	private BigDecimal balance;
+
+	@DbField("o.status")
+	private OrderDon.Status status;
+
+	@DbField("o.coupon_user_id")
+	private Long couponUserId;
+
+	@DbField("o.galaxycoin")
+	private BigDecimal galaxyCoin;
+
+	@DbField("o.coupon_money")
+	private BigDecimal couponMoney;
+}

+ 1 - 1
netflix-dao/src/main/java/com/cyksj/model/manage/views/OrderMasterDonBackView.java

@@ -137,5 +137,5 @@ public class OrderMasterDonBackView {
 	private String address;
 
 	@DbIgnore
-	private List<OrderDonBackView> orderDonViews;
+	private List<OrderDonSkuBackView> orderDonViews;
 }

+ 0 - 3
netflix-dao/src/main/java/com/cyksj/model/manage/views/OrderMasterDonView.java

@@ -38,9 +38,6 @@ public class OrderMasterDonView {
 	@DbField("o.money")
 	private BigDecimal money;
 
-	@DbField("o.status")
-	private OrderMasterDon.Status status;
-
 	@DbField("o.type")
 	private OrderMasterDon.Type type;
 

+ 5 - 0
netflix-dao/src/main/java/com/cyksj/model/request/UnifiedOrderPayReq.java

@@ -43,6 +43,11 @@ public class UnifiedOrderPayReq {
 	 */
 	private BigDecimal galaxycoin;
 
+	/**
+	 * 地址id
+	 */
+	private Long addressId;
+
 	/**
 	 * 购买商品
 	 */

+ 3 - 0
netflix-service/src/main/java/com/cyksj/service/mange/CmsOrderDonService.java

@@ -3,6 +3,7 @@ package com.cyksj.service.mange;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.cyksj.model.entity.*;
 import com.cyksj.model.excel.ExcelOrderDonInfo;
+import com.cyksj.model.excel.ExcelOrderMasterDonData;
 import com.cyksj.model.manage.request.ReqSetLogisticsPost;
 import com.cyksj.model.request.ChangeRelationReq;
 import com.cyksj.model.request.ClickOutReq;
@@ -53,4 +54,6 @@ public interface CmsOrderDonService extends IService<OrderDon> {
 	 * @param orderRefundReq
 	 */
 	void refundPriceDiffer(OrderRefundReq orderRefundReq);
+
+	List<ExcelOrderMasterDonData> exportMOrders(List<ExcelOrderMasterDonData> mOrderList) throws InterruptedException;
 }

+ 167 - 63
netflix-service/src/main/java/com/cyksj/service/mange/impl/CmsOrderDonServiceImpl.java

@@ -1,5 +1,6 @@
 package com.cyksj.service.mange.impl;
 
+import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DateField;
 import cn.hutool.core.date.DateTime;
@@ -24,9 +25,11 @@ import com.cyksj.config.WeChatConfig;
 import com.cyksj.config.zfb.AliPayClientFactory;
 import com.cyksj.dto.RedisKey;
 import com.cyksj.mapper.*;
+import com.cyksj.mapper.channel.ChannelPopularizeMapper;
 import com.cyksj.mapper.channel.ShopConfigMapper;
 import com.cyksj.mapper.channel.UserPayEquipmentReceiveBenefitsRecordMapper;
 import com.cyksj.mapper.manage.cms.CmsUserMapper;
+import com.cyksj.mapper.manage.coupon.CouponMapper;
 import com.cyksj.mapper.manage.distribute.DistributeWaitingSendPointsMapper;
 import com.cyksj.mapper.manage.distribute.UserDistributeBusinessOrderDonRecordMapper;
 import com.cyksj.mapper.manage.distribute.UserDistributeMapper;
@@ -36,8 +39,12 @@ import com.cyksj.mapper.shop.YhShopUserDistributeBusinessOrderDonRecordMapper;
 import com.cyksj.mapper.stock.GoodsSkuStockRelateMapper;
 import com.cyksj.model.entity.*;
 import com.cyksj.model.excel.ExcelOrderDonInfo;
+import com.cyksj.model.excel.ExcelOrderMasterDonData;
 import com.cyksj.model.manage.request.ReqSetLogisticsPost;
+import com.cyksj.model.manage.views.AccountView;
 import com.cyksj.model.manage.views.GroupsRelationView;
+import com.cyksj.model.manage.views.OrderDonSkuBackView;
+import com.cyksj.model.manage.views.OrderDonSkuExportView;
 import com.cyksj.model.request.ChangeRelationReq;
 import com.cyksj.model.request.ClickOutReq;
 import com.cyksj.model.request.OrderRefundReq;
@@ -49,6 +56,7 @@ import com.cyksj.service.mange.CmsOrderDonService;
 import com.cyksj.service.mange.stock.GoodsDonStockService;
 import com.cyksj.service.market.MarketFrontService;
 import com.cyksj.service.order.OrderCommonService;
+import com.cyksj.service.order.OrderMasterDonService;
 import com.cyksj.service.order.UserRealOrderBenefitsService;
 import com.cyksj.service.paypal.PayPalService;
 import com.cyksj.service.relation.GroupRelationClearService;
@@ -58,7 +66,9 @@ import com.cyksj.service.stripe.StripeService;
 import com.cyksj.service.user.UserBenefitsService;
 import com.cyksj.service.wechat.WeChatService;
 import com.ejlchina.searcher.BeanSearcher;
+import com.ejlchina.searcher.param.Operator;
 import com.ejlchina.searcher.util.MapUtils;
+import com.google.common.collect.Lists;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.dao.DuplicateKeyException;
@@ -71,6 +81,10 @@ import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
 
 /**
  * @author chan
@@ -159,6 +173,11 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
 
     private final YhShopUserDistributeBusinessOrderDonRecordMapper yhShopBusinessOrderDonRecordMapper;
 
+    private final ChannelPopularizeMapper channelPopularizeMapper;
+
+    private final OrderMasterDonService orderMasterDonService;
+
+    private final CouponMapper couponMapper;
     private static final GlobalThreadPoolTaskExecutor TASK_POOL = GlobalThreadPoolTaskExecutor.getInstance();
 
     @Override
@@ -179,80 +198,82 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
         orderDonWaybill.setTrackingNumber(reqSetLogisticsPost.getTrackingNumber());
         orderDonWaybill.setOrderId(reqSetLogisticsPost.getOrderId());
         orderDonWaybill.setRemark(reqSetLogisticsPost.getRemark());
-        OrderDon orderDon = getById(orderDonWaybill.getOrderId());
-        if(orderDonWaybill.getId() == null){
+        OrderMasterDon masterDon = orderMasterDonService.getById(orderDonWaybill.getOrderId());
+        Long mOid = masterDon.getId();
+
+        if (orderDonWaybill.getId() == null) {
             try {
                 orderDonWaybillMapper.insert(orderDonWaybill);
             } catch (DuplicateKeyException e) {
                 return orderDonWaybill;
             }
-            orderDon.setStatus(OrderDon.Status.transport);
-            updateById(orderDon);
-
-            GoodsDonSku sku = goodsDonSkuMapper.selectById(orderDon.getSkuId());
-            //库存扣减逻辑
-            List<GoodsSkuStockRelate> relateList = skuStockRelateMapper.selectList(Wrappers.lambdaQuery(GoodsSkuStockRelate.class).eq(GoodsSkuStockRelate::getSkuId,orderDon.getSkuId()));
-            if(!relateList.isEmpty()){
-                relateList.forEach((relate)->{
-                    goodsDonStockService.upStockRelate(relate.getStockId(),orderDon.getId(),"transport");
-                });
-            }
+            List<OrderDonSkuBackView> orderDonList = beanSearcher.searchAll(OrderDonSkuBackView.class, MapUtils.builder().field(OrderDonSkuBackView::getMOid, mOid)
+                    .field(OrderDonSkuBackView::getGoodsDonType, 1).op(Operator.GreaterThan)
+                    .field(OrderDonSkuBackView::getRelationId, 0)
+                    .build());
+            for (OrderDonSkuBackView orderDon : orderDonList) {
+                orderDon.setStatus(OrderDon.Status.transport);
+                boolean update = update(null, Wrappers.lambdaUpdate(OrderDon.class)
+                        .set(OrderDon::getStatus, OrderDon.Status.transport)
+                        .ne(OrderDon::getStatus, OrderDon.Status.transport)
+                        .eq(OrderDon::getId, orderDon.getId()));
+                if (!update) {
+                    log.info("已更新实物订单orderId:{]状态", orderDon.getId());
+                    continue;
+                }
 
-            //发放实物购买权益
-            Boolean isReceivedAll = true;
-            if (sku != null) {
-                if (sku.getIsBenefits()) {
-                    if (StrUtil.isNotEmpty(sku.getBenefitsList())) {
-                        try {
-                            List<GoodsDonSku> goodsDonSkus = Jsons.parseList(sku.getBenefitsList(), GoodsDonSku.class);
-                            //自购实物 获取权益
-                            isReceivedAll = userRealOrderBenefitsService.getPayRealGoodsBenefits(orderDon.getUserId(), orderDon.getId(), orderDon.getYhsId(), goodsDonSkus);
-                        } catch (Exception e) {
+                GoodsDonSku sku = goodsDonSkuMapper.selectById(orderDon.getSkuId());
+                //库存扣减逻辑
+                List<GoodsSkuStockRelate> relateList = skuStockRelateMapper.selectList(Wrappers.lambdaQuery(GoodsSkuStockRelate.class).eq(GoodsSkuStockRelate::getSkuId, orderDon.getSkuId()));
+                if (!relateList.isEmpty()) {
+                    relateList.forEach((relate) -> {
+                        goodsDonStockService.upStockRelate(relate.getStockId(), orderDon.getId(), "transport");
+                    });
+                }
+
+                //发放实物购买权益
+                Boolean isReceivedAll = true;
+                if (sku != null) {
+                    if (sku.getIsBenefits()) {
+                        if (StrUtil.isNotEmpty(sku.getBenefitsList())) {
+                            try {
+                                List<GoodsDonSku> goodsDonSkus = Jsons.parseList(sku.getBenefitsList(), GoodsDonSku.class);
+                                //自购实物 获取权益
+                                isReceivedAll = userRealOrderBenefitsService.getPayRealGoodsBenefits(orderDon.getUserId(), orderDon.getId(), orderDon.getYhsId(), goodsDonSkus);
+                            } catch (Exception e) {
+                            }
                         }
                     }
                 }
-            }
-            final Boolean flag = isReceivedAll;
-
-            //发送微信模板消息
-//            TASK_POOL.execute(()->{
-//                try {
-//                    log.info("发送发货通知至{}用户", orderDon.getUserId());
-//                    templateCommonService.sendTransportMsgNotify(orderDon, reqSetLogisticsPost, flag);
-//                } catch (Exception e) {
-//                    log.error("发送发货通知至{}用户失败:{}", orderDon.getUserId(), e);
-//                }
-//            });
-        }else {
-            if (orderDon.getStatus() == OrderDon.Status.hasPayment) {
-                orderDon.setStatus(OrderDon.Status.transport);
-                updateById(orderDon);
-            }
-            orderDonWaybillMapper.updateById(orderDonWaybill);
-        }
-        //实物分销订单是否存在
-        DistributeWaitingSendPoints waitingSendPoints = distributeWaitingSendPointsMapper.selectOne(Wrappers.lambdaQuery(DistributeWaitingSendPoints.class)
-                .eq(DistributeWaitingSendPoints::getOrderId, orderDon.getId())
-                .eq(DistributeWaitingSendPoints::getIsDelivery, false)
-                .last("limit 1"));
-        if (waitingSendPoints != null) {
-            //实物分销订单发货后再 进行提成结算期
-            waitingSendPoints.setIsDelivery(true);
-            distributeWaitingSendPointsMapper.updateById(waitingSendPoints);
-        }
-        //分销有礼 分销实物是否有发货后用户权益
-        EquipmentUserDistributeTransportBenefits transportBenefits = transportBenefitsMapper.selectOne(Wrappers.lambdaQuery(EquipmentUserDistributeTransportBenefits.class)
-                .eq(EquipmentUserDistributeTransportBenefits::getOrderId, orderDon.getId())
-                .eq(EquipmentUserDistributeTransportBenefits::getStatus, EquipmentUserDistributeTransportBenefits.Status.hasPayment).last("limit 1"));
-        if (transportBenefits != null) {
-            if (transportBenefits.getBalance().compareTo(BigDecimal.ZERO) > 0) {
-                //7天后余额到账
-                transportBenefitsMapper.update(null, Wrappers.lambdaUpdate(EquipmentUserDistributeTransportBenefits.class)
-                        .set(EquipmentUserDistributeTransportBenefits::getStatus, EquipmentUserDistributeTransportBenefits.Status.transport)
-                        .set(EquipmentUserDistributeTransportBenefits::getSendTime, DateUtil.offsetDay(DateTime.now(), 7))
+
+                //实物分销订单是否存在
+                DistributeWaitingSendPoints waitingSendPoints = distributeWaitingSendPointsMapper.selectOne(Wrappers.lambdaQuery(DistributeWaitingSendPoints.class)
+                        .eq(DistributeWaitingSendPoints::getOrderId, orderDon.getId())
+                        .eq(DistributeWaitingSendPoints::getIsDelivery, false)
+                        .last("limit 1"));
+                if (waitingSendPoints != null) {
+                    //实物分销订单发货后再 进行提成结算期
+                    waitingSendPoints.setIsDelivery(true);
+                    distributeWaitingSendPointsMapper.updateById(waitingSendPoints);
+                }
+                //分销有礼 分销实物是否有发货后用户权益
+                EquipmentUserDistributeTransportBenefits transportBenefits = transportBenefitsMapper.selectOne(Wrappers.lambdaQuery(EquipmentUserDistributeTransportBenefits.class)
                         .eq(EquipmentUserDistributeTransportBenefits::getOrderId, orderDon.getId())
-                        .eq(EquipmentUserDistributeTransportBenefits::getStatus, EquipmentUserDistributeTransportBenefits.Status.hasPayment));
+                        .eq(EquipmentUserDistributeTransportBenefits::getStatus, EquipmentUserDistributeTransportBenefits.Status.hasPayment).last("limit 1"));
+                if (transportBenefits != null) {
+                    if (transportBenefits.getBalance().compareTo(BigDecimal.ZERO) > 0) {
+                        //7天后余额到账
+                        transportBenefitsMapper.update(null, Wrappers.lambdaUpdate(EquipmentUserDistributeTransportBenefits.class)
+                                .set(EquipmentUserDistributeTransportBenefits::getStatus, EquipmentUserDistributeTransportBenefits.Status.transport)
+                                .set(EquipmentUserDistributeTransportBenefits::getSendTime, DateUtil.offsetDay(DateTime.now(), 7))
+                                .eq(EquipmentUserDistributeTransportBenefits::getOrderId, orderDon.getId())
+                                .eq(EquipmentUserDistributeTransportBenefits::getStatus, EquipmentUserDistributeTransportBenefits.Status.hasPayment));
+                    }
+                }
             }
+
+        } else {
+            orderDonWaybillMapper.updateById(orderDonWaybill);
         }
         return orderDonWaybill;
     }
@@ -941,6 +962,89 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
         userBenefitsService.addUserBalance(orderDon.getUserId(), refundBalance, UserBalanceSourceRecord.Source.price_differ, orderDon.getYhsId());
     }
 
+    @Override
+    public List<ExcelOrderMasterDonData> exportMOrders(List<ExcelOrderMasterDonData> mOrderList) throws InterruptedException {
+        List<List<ExcelOrderMasterDonData>> partition = Lists.partition(mOrderList, 500);
+        List<ExcelOrderMasterDonData> exportDataList = new CopyOnWriteArrayList<>();
+        CountDownLatch latch = new CountDownLatch(partition.size());
+        Map<Long, String> channelMap = new ConcurrentHashMap<>();
+        Map<Long, String> accountMap = new ConcurrentHashMap<>();
+        String channel_default = "自然流量";
+        for (List<ExcelOrderMasterDonData> mOrders : partition) {
+            TASK_POOL.execute(() -> {
+                for (ExcelOrderMasterDonData e : mOrders) {
+                    List<OrderDonSkuExportView> orderDonSkuBackViews = beanSearcher.searchAll(OrderDonSkuExportView.class, MapUtils.builder().field(OrderDonSkuExportView::getMOid, e.getOrderId()).build());
+                    for (OrderDonSkuExportView orderSku : orderDonSkuBackViews) {
+                        ExcelOrderMasterDonData excelOrderMasterDonData = new ExcelOrderMasterDonData();
+                        BeanUtil.copyProperties(e, excelOrderMasterDonData);
+                        if (e.getPopularizeId() != null && e.getPopularizeId() > 0) {
+                            String channel = channelMap.get(e.getPopularizeId());
+                            if (StrUtil.isEmpty(channel)) {
+                                channel = channelPopularizeMapper.selectChannelByPid(e.getPopularizeId());
+                                if (StrUtil.isNotBlank(channel)) {
+                                    channelMap.putIfAbsent(e.getPopularizeId(), channel);
+                                }
+                            }
+                            excelOrderMasterDonData.setChannel(channel);
+                        } else {
+                            excelOrderMasterDonData.setChannel(channel_default);
+                        }
+
+                        excelOrderMasterDonData.setOrderSkuId(orderSku.getId());
+                        excelOrderMasterDonData.setTitle(orderSku.getTitle());
+                        excelOrderMasterDonData.setSpecVal(orderSku.getSpecVal());
+                        //主账号
+                        if (orderSku.getGroupsId() != null) {
+                            String account = accountMap.get(orderSku.getGroupsId());
+                            if (StrUtil.isEmpty(account)) {
+                                AccountView accountView = beanSearcher.searchFirst(AccountView.class, MapUtils.builder().field(AccountView::getGroupsId, orderSku.getGroupsId()).onlySelect(AccountView::getAccount)
+                                        .onlySelect(AccountView::getAccount)
+                                        .build());
+                                if (accountView != null) {
+                                    account = accountView.getAccount();
+                                    accountMap.putIfAbsent(orderSku.getGroupsId(), account);
+                                }
+                            }
+                            excelOrderMasterDonData.setAccount(account);
+                        }
+                        excelOrderMasterDonData.setOrderSkuMoney(orderSku.getMoney().compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO : orderSku.getMoney().divide(BigDecimal.valueOf(100)));
+                        excelOrderMasterDonData.setGalaxycoin(excelOrderMasterDonData.getOrderSkuMoney());
+                        excelOrderMasterDonData.setStatus(orderSku.getStatus().getDesc());
+                        StringBuilder disInfo = new StringBuilder();
+                        if (orderSku.getCouponMoney().compareTo(BigDecimal.ZERO) > 0) {
+                            Long couponUserId = orderSku.getCouponUserId();
+                            String couponName = couponMapper.getCouponNameByCouponUserId(couponUserId);
+                            if (StrUtil.isNotBlank(couponName)) {
+                                disInfo.append(String.format("%s优惠券减免金额¥%s", couponName, orderSku.getCouponMoney().divide(BigDecimal.valueOf(100))));
+                            }
+                        }
+                        if (orderSku.getBalance().compareTo(BigDecimal.ZERO) > 0) {
+                            if (disInfo.length() > 0) {
+                                disInfo.append(";");
+                            }
+                            disInfo.append(String.format("余额减免金额¥%s", orderSku.getBalance().divide(BigDecimal.valueOf(100))));
+                        }
+                        if (orderSku.getGalaxyCoin().compareTo(BigDecimal.ZERO) > 0) {
+                            if (disInfo.length() > 0) {
+                                disInfo.append(";");
+                            }
+                            disInfo.append(String.format("银河币减免金额¥%s", orderSku.getGalaxyCoin().divide(BigDecimal.valueOf(100))));
+                        }
+                        if (disInfo.length() > 0) {
+                            excelOrderMasterDonData.setDiscountInfo(disInfo.toString());
+                        }
+
+                        exportDataList.add(excelOrderMasterDonData);
+                    }
+                }
+                latch.countDown();
+            });
+        }
+
+        latch.await(60, TimeUnit.MINUTES);
+        return exportDataList;
+    }
+
     /**
      * 寻找该车队空余车位
      */

+ 18 - 2
netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java

@@ -598,6 +598,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 				throw BusinessRuntimeException.getInstance("购物车下单商品错误");
 			}
 		}
+		Boolean isCtRealGoods = false;
 		for (OrderPayRequest payRequest : payGoods) {
 			GoodsDonSku sku = null;
 			Long goodsId;
@@ -850,7 +851,12 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			}
 
 			if (Constant.realGoodsType.contains(goodsDon.getType()) && !goodsDon.getId().equals(27l)) {
-				saveTransport(payRequest.getAddressId(), orderDon.getId());
+				//校验一遍
+				if (!isCtRealGoods) {
+					payRequest.setAddressId(unifiedOrderPayReq.getAddressId());
+					isCtRealGoods = true;
+					checkAddress(payRequest.getAddressId());
+				}
 			}
 			//保存加购发货地址
 			if (orderDon.getIsDp() && payRequest.getAddressId() != null) {
@@ -931,6 +937,11 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 				.set(OrderDon::getMOid, orderMasterDon.getId())
 				.in(OrderDon::getId, orderIds));
 
+		//若有实物 新关联主订单id
+		if (isCtRealGoods) {
+			saveTransport(unifiedOrderPayReq.getAddressId(), orderMasterDon.getId());
+		}
+
 		if (orderMasterDon.getStatus() == OrderMasterDon.Status.noPayment) {
 			jobManager.addJob(EXPIRY_TIME, () -> {
 				closeOrder(orderMasterDon.getId(), null);
@@ -1463,6 +1474,11 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 
 	@Override
 	public void saveTransport(Long addressId, Long orderId) {
+		Address address = checkAddress(addressId);
+		saveTransportByAddress(address, orderId);
+	}
+
+	public Address checkAddress(Long addressId) {
 		if (addressId == null) {
 			throw new BusinessRuntimeException("请选择收货地址.");
 		}
@@ -1470,7 +1486,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		if (address == null) {
 			throw new BusinessRuntimeException("请添加收货地址.");
 		}
-		saveTransportByAddress(address, orderId);
+		return address;
 	}
 
 	@Override

+ 83 - 5
netflix-web/src/main/java/com/cyksj/web/controller/manage/CmsOrderController.java

@@ -4,6 +4,7 @@ import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.util.StrUtil;
+import com.alibaba.excel.EasyExcel;
 import com.alibaba.excel.support.ExcelTypeEnum;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.annotation.Log;
@@ -24,13 +25,12 @@ import com.cyksj.mapper.channel.ChannelPopularizeMapper;
 import com.cyksj.mapper.manage.RealGoodsOrderHandleMapper;
 import com.cyksj.mapper.manage.coupon.CouponMapper;
 import com.cyksj.model.entity.*;
-import com.cyksj.model.excel.ExcelOrderDonData;
-import com.cyksj.model.excel.ExcelRealGoodsOrderData;
-import com.cyksj.model.excel.ExcelRealGoodsUserInterestData;
-import com.cyksj.model.excel.ExcelRealGoodsUserInterestHasPaymentData;
+import com.cyksj.model.excel.*;
+import com.cyksj.model.excel.merge.CustomMergeStrategy;
 import com.cyksj.model.manage.request.ReqSetLogisticsPost;
 import com.cyksj.model.manage.views.AccountView;
 import com.cyksj.model.manage.views.OrderDonBackView;
+import com.cyksj.model.manage.views.OrderDonSkuBackView;
 import com.cyksj.model.manage.views.OrderMasterDonBackView;
 import com.cyksj.model.request.*;
 import com.cyksj.model.views.*;
@@ -54,6 +54,7 @@ import javax.servlet.http.HttpServletResponse;
 import java.io.OutputStream;
 import java.math.BigDecimal;
 import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * @author chan
@@ -212,7 +213,7 @@ public class CmsOrderController {
 		}
 		SearchResult<OrderMasterDonBackView> search1 = beanSearcher.search(OrderMasterDonBackView.class, builder.build());
 		search1.getDataList().forEach(mData -> {
-			List<OrderDonBackView> orderDonBackViews = beanSearcher.searchAll(OrderDonBackView.class, MapUtils.builder().field(OrderDonBackView::getMOid, mData.getMOid()).build());
+			List<OrderDonSkuBackView> orderDonBackViews = beanSearcher.searchAll(OrderDonSkuBackView.class, MapUtils.builder().field(OrderDonSkuBackView::getMOid, mData.getMOid()).build());
 			mData.setOrderDonViews(orderDonBackViews);
 			mData.getOrderDonViews().forEach(data -> {
 				if (data.getPopularizeId() != null) {
@@ -301,6 +302,83 @@ public class CmsOrderController {
 		EasyExcelUtils.createExcelStreamMutilByEasyExcel(response, ExcelOrderDonData.class, list, "订单列表", "订单列表", ExcelTypeEnum.XLSX, null);
 	}
 
+	/**
+	 * 主订单 导出
+	 */
+	@GetMapping("/mOrder/export")
+	@Log(module = "订单管理/主订单导出订单", businessType = BusinessType.EXPORT, isSaveRequestData = true)
+	public void exportMOrders(HttpServletResponse response, Long channelId, String account, String showId, Long goodsDonType, Long goodsId, Long skuId, Boolean isNoBind, Integer dsType, @RequestParam(value = "orderStatus", required = false) List<String> orderStatus) throws Exception {
+		StringBuilder conditionSb = new StringBuilder();
+
+		if (goodsId != null) {
+			conditionSb.append(String.format(" and goods_id = %s", goodsId));
+		}
+		if (skuId != null) {
+			conditionSb.append(String.format(" and os.sku_id = %s", skuId));
+		}
+		if (goodsDonType != null) {
+			conditionSb.append(String.format(" and os.goods_id in (select id from goods_don where type = %s)", goodsDonType));
+		}
+		if (isNoBind != null) {
+			String f = isNoBind ? "=" : "!=";
+			conditionSb.append(String.format(" and os.ex_code != '' and os.user_id %s 0", f));
+		}
+		if (dsType != null) {
+			//默认优惠券
+			String dsTypeField = "coupon_user_id";
+			if (dsType == 2) {
+				dsTypeField = "balance";
+			} else if (dsType == 3) {
+				dsTypeField = "galaxycoin";
+			}
+			conditionSb.append(String.format(" and os.%s != 0", dsTypeField));
+		}
+		if (orderStatus != null) {
+			conditionSb.append(String.format(" and os.status in %s", Jsons.toJson(orderStatus).replaceAll("\\[", "(").replaceAll("]", ")")));
+		}
+		String conditionSql = null;
+		if (conditionSb.length() > 0) {
+			conditionSql = String.format(" (select count(*) from order_don os where os.m_oid = o.id %s) > 0", conditionSb.toString());
+		}
+
+		//主订单
+		MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
+		if (channelId != null) {
+			List<Long> popularizeIds = channelPopularizeMapper.getPopularizeIdByChannelId(channelId);
+			builder.field(ExcelOrderMasterDonData::getPopularizeId, popularizeIds).op(Operator.InList);
+		}
+		if (StrUtil.isNotBlank(account)) {
+			GroupsRelation relation = relationMapper.selectOne(Wrappers.lambdaQuery(GroupsRelation.class)
+					.eq(GroupsRelation::getAccount, account).last("limit 1"));
+			if (relation != null) {
+				builder.field(ExcelOrderMasterDonData::getUserId, relation.getUserId());
+			} else {
+				builder.field(ExcelOrderMasterDonData::getUserId).op(Operator.IsNull);
+			}
+		}
+		if (StrUtil.isNotBlank(showId)) {
+			builder.field(ExcelOrderMasterDonData::getUserId, userService.getUserIdByShowId(showId));
+		}
+		if (StrUtil.isNotBlank(conditionSql)) {
+			builder.put("condition", conditionSql);
+		}
+		List<ExcelOrderMasterDonData> mOrderList = beanSearcher.searchAll(ExcelOrderMasterDonData.class, builder.build());
+		mOrderList = cmsOrderDonService.exportMOrders(mOrderList);
+		List<ExcelOrderMasterDonData> collect = mOrderList.stream().sorted(Comparator.comparing(ExcelOrderMasterDonData::getOrderId)).collect(Collectors.toList());
+		response.setContentType("application/x-download");
+		response.setContentType("application/vnd.ms-excel");
+		response.setCharacterEncoding("utf-8");
+		response.setHeader("Content-disposition",
+				"attachment;filename=" + new String("订单列表".getBytes("utf-8"), "ISO-8859-1") + ExcelTypeEnum.XLS.getValue());
+		EasyExcel.write(response.getOutputStream())
+				.head(ExcelOrderMasterDonData.class)
+				//设置合并单元格策略
+				.registerWriteHandler(new CustomMergeStrategy(collect.size(), ExcelOrderMasterDonData.class))
+				.excelType(ExcelTypeEnum.XLS)
+				.sheet("订单列表")
+				.doWrite(collect);
+	}
+
 	/**
 	 * 导出实物模板 订单excel
 	 */

+ 1 - 1
netflix-web/src/main/resources/application.yml

@@ -1 +1 @@
-spring:
  profiles:
    active: dev
+spring:
  profiles:
    active:
      - ${activeProfile}

+ 1 - 11
pom.xml

@@ -112,17 +112,7 @@
         <dependency>
             <groupId>com.alibaba</groupId>
             <artifactId>easyexcel</artifactId>
-            <version>2.0.5</version>
-<!--            <exclusions>-->
-<!--                <exclusion>-->
-<!--                    <groupId>okhttp</groupId>-->
-<!--                    <artifactId>com.squareup.okhttp3</artifactId>-->
-<!--                </exclusion>-->
-<!--                <exclusion>-->
-<!--                    <groupId>com.alibaba</groupId>-->
-<!--                    <artifactId>fastjson</artifactId>-->
-<!--                </exclusion>-->
-<!--            </exclusions>-->
+            <version>2.2.5</version>
         </dependency>
 
         <!-- 提供redis连接池 -->