浏览代码

fix some bug
add excel converter
add excel import for shipment

Mr.qian 2 周之前
父节点
当前提交
cb44c2a731

+ 84 - 83
mall-service/src/main/java/com/txz/mall/controller/OrderController.java

@@ -7,6 +7,7 @@ import com.txz.mall.business.OrderServiceBusiness;
 import com.txz.mall.core.AuthService;
 import com.txz.mall.core.Result;
 import com.txz.mall.core.ResultCode;
+import com.txz.mall.enums.PinkOrderStatusEnum;
 import com.txz.mall.model.StoreOrder;
 import com.txz.mall.service.StoreOrderService;
 import dto.*;
@@ -33,19 +34,19 @@ import java.util.List;
 @RestController
 @RequestMapping("/order")
 public class OrderController {
-
+    
     private static Logger log = LoggerFactory.getLogger(OrderController.class);
-
+    
     @Resource
     private StoreOrderService storeOrderService;
     @Resource
     private OrderServiceBusiness orderServiceBusiness;
-
+    
     @PostMapping("/add")
     @ApiOperation(value = "创建订单")
     public Result add(@Validated @RequestBody CreateOrderRequest orderRequest) {
-
-
+        
+        
         if (orderRequest == null) {
             return Result.fail(ResultCode.OBJECT_IS_NULL);
         }
@@ -54,7 +55,7 @@ public class OrderController {
         MyRecord record = storeOrderService.createOrder(orderRequest);
         return Result.success(record);
     }
-
+    
     @DeleteMapping("/delete")
     @ApiOperation(value = "订单删除")
     public Result delete(@RequestParam Long id) {
@@ -72,7 +73,7 @@ public class OrderController {
         }
         return Result.success();
     }
-
+    
     @PutMapping("/update")
     @ApiOperation(value = "订单更新")
     public Result update(@RequestBody StoreOrder storeOrder) {
@@ -84,7 +85,7 @@ public class OrderController {
         }
         try {
             storeOrder.setUpdateTime(new Date());
-//    		storeOrder.setUpdateUserId(userId);
+            //    		storeOrder.setUpdateUserId(userId);
             storeOrderService.update(storeOrder);
         } catch (Exception e) {
             log.error("更新对象操作异常e:{}", e);
@@ -92,7 +93,7 @@ public class OrderController {
         }
         return Result.success();
     }
-
+    
     @GetMapping("/detail")
     @ApiOperation(value = "订单获取详情")
     public Result<StoreOrderVO> detail(@RequestParam Long id) {
@@ -102,7 +103,7 @@ public class OrderController {
         StoreOrderVO vo = orderServiceBusiness.orderDetail(id);
         return Result.success(vo);
     }
-
+    
     @PostMapping("/list")
     @ApiOperation(value = "订单获取列表")
     public Result<List<StoreOrderVO>> list(@RequestBody StoreOrderDTO dto) {
@@ -113,119 +114,119 @@ public class OrderController {
             return Result.fail(ResultCode.INTERNAL_SERVER_ERROR);
         }
     }
-
-//    @PostMapping("/app/list")
-//    @ApiOperation(value = "订单获取列表")
-//    public Result<List<StoreOrderVO>> appList(@RequestBody StoreOrderAppDTO dto) {
-//
-//        Long tokenUserId = AuthService.getTokenUserId(null);
-//        dto.setUserId(tokenUserId);
-//        PageHelper.startPage(dto.getPage(), dto.getSize());
-//        PageInfo pageInfo = null;
-//        try {
-//            List<StoreOrderVO> arrayList = storeOrderService.appList(dto);
-//            pageInfo = new PageInfo(arrayList);
-//        } catch (Exception e) {
-//            log.error("查询对象操作异常e:{}", e);
-//            return Result.fail(ResultCode.INTERNAL_SERVER_ERROR);
-//        }
-//        return Result.success(pageInfo);
-//    }
-
+    
+    //    @PostMapping("/app/list")
+    //    @ApiOperation(value = "订单获取列表")
+    //    public Result<List<StoreOrderVO>> appList(@RequestBody StoreOrderAppDTO dto) {
+    //
+    //        Long tokenUserId = AuthService.getTokenUserId(null);
+    //        dto.setUserId(tokenUserId);
+    //        PageHelper.startPage(dto.getPage(), dto.getSize());
+    //        PageInfo pageInfo = null;
+    //        try {
+    //            List<StoreOrderVO> arrayList = storeOrderService.appList(dto);
+    //            pageInfo = new PageInfo(arrayList);
+    //        } catch (Exception e) {
+    //            log.error("查询对象操作异常e:{}", e);
+    //            return Result.fail(ResultCode.INTERNAL_SERVER_ERROR);
+    //        }
+    //        return Result.success(pageInfo);
+    //    }
+    
     @ApiOperation(value = "获取订单各状态数量")
     @GetMapping(value = "/status/num")
     public Result<StoreOrderCountItemVO> getOrderStatusNum() {
         return Result.success(storeOrderService.getOrderStatusNum());
     }
-
+    
     @ApiOperation("导出订单")
     @PostMapping("/export")
-    public Result exportFile(@RequestBody StoreOrderDTO dto, HttpServletResponse response) {
+    public void exportFile(@RequestBody StoreOrderDTO dto, HttpServletResponse response) {
         storeOrderService.exportFile(dto, response);
-        return Result.success();
     }
-
+    
+    @ApiOperation("导出发货单")
+    @PostMapping("/exportDelivery")
+    public void exportDelivery(@RequestBody StoreOrderDTO dto, HttpServletResponse response) {
+        // dto.setPaid(1);
+        dto.setStatus(PinkOrderStatusEnum.GROUP_ORDER_TO_SHIP.getKey());
+        storeOrderService.exportFile(dto, response);
+    }
+    
     @ApiOperation("退款")
     @PostMapping("/refund")
     public Result refund(@RequestParam("id") Long id) {
         storeOrderService.refund(id);
         return Result.success();
     }
-
+    
     @ApiOperation("关闭订单")
     @PostMapping("/close")
     public Result close(@RequestParam("id") Long id) {
         storeOrderService.close(id);
         return Result.success();
     }
-
+    
     @ApiOperation("取消订单")
     @PostMapping("/cancel")
     public Result cancel(@RequestParam("id") Long id) {
         storeOrderService.cancel(id);
         return Result.success();
     }
-
+    
     @ApiOperation("联系用户")
     @PostMapping("/contactUser")
     public Result contactUser(@RequestParam("userId") Long userId) {
-//        storeOrderService.contactUser(userId);
+        //        storeOrderService.contactUser(userId);
         return Result.success();
     }
-
+    
     @ApiOperation("批量发货")
     @PostMapping("/batchDelivery")
     public Result batchDelivery(@RequestBody List<StoreOrderDeliveryDTO> list) {
         storeOrderService.batchDelivery(list);
         return Result.success();
     }
-
-//    @ApiOperation(value = "预下单")
-//    @PostMapping(value = "/pre/order")
-//    public Result preOrder(@RequestBody @Validated PreOrderRequest request) {
-//        Long tokenUserId = AuthService.getTokenUserId(null);
-//        request.setUserId(tokenUserId);
-//        return Result.success(storeOrderService.preOrder(request));
-//
-//    }
-//    @ApiOperation(value = "加载预下单")
-//    @PostMapping(value = "load/pre")
-//    public Result<PreOrderResponse> loadPreOrder(@RequestParam String preOrderNo) {
-//
-//        Long tokenUserId = AuthService.getTokenUserId(null);
-//        return Result.success(storeOrderService.loadPreOrder(preOrderNo));
-//    }
-
-//    @ApiOperation(value = "计算订单价格")
-//    @PostMapping(value = "/computed/price")
-//    public Result<ComputedOrderPriceResponse> computedPrice(@Validated @RequestBody OrderComputedPriceRequest request) {
-//
-//        Long tokenUserId = AuthService.getTokenUserId(null);
-//        request.setUserId(tokenUserId);
-//        return Result.success(storeOrderService.computedOrderPrice(request));
-//    }
-
-//    @ApiOperation(value = "去支付")
-//    @PostMapping(value = "/goPay")
-//    public Result getPayResult(@RequestBody GoPinkDTO dto) {
-//
-//        Long tokenUserId = AuthService.getTokenUserId(null);
-//        dto.setUserId(tokenUserId);
-//        Boolean result = storeOrderService.goPay(dto);
-//        return Result.success(result);
-//    }
-
-    @ApiOperation("导出发货单")
-    @PostMapping("/exportDelivery")
-    public Result exportDelivery(HttpServletResponse response) {
-        storeOrderService.exportDelivery(response);
-        return Result.success();
-    }
-
+    
+    //    @ApiOperation(value = "预下单")
+    //    @PostMapping(value = "/pre/order")
+    //    public Result preOrder(@RequestBody @Validated PreOrderRequest request) {
+    //        Long tokenUserId = AuthService.getTokenUserId(null);
+    //        request.setUserId(tokenUserId);
+    //        return Result.success(storeOrderService.preOrder(request));
+    //
+    //    }
+    //    @ApiOperation(value = "加载预下单")
+    //    @PostMapping(value = "load/pre")
+    //    public Result<PreOrderResponse> loadPreOrder(@RequestParam String preOrderNo) {
+    //
+    //        Long tokenUserId = AuthService.getTokenUserId(null);
+    //        return Result.success(storeOrderService.loadPreOrder(preOrderNo));
+    //    }
+    
+    //    @ApiOperation(value = "计算订单价格")
+    //    @PostMapping(value = "/computed/price")
+    //    public Result<ComputedOrderPriceResponse> computedPrice(@Validated @RequestBody OrderComputedPriceRequest request) {
+    //
+    //        Long tokenUserId = AuthService.getTokenUserId(null);
+    //        request.setUserId(tokenUserId);
+    //        return Result.success(storeOrderService.computedOrderPrice(request));
+    //    }
+    
+    //    @ApiOperation(value = "去支付")
+    //    @PostMapping(value = "/goPay")
+    //    public Result getPayResult(@RequestBody GoPinkDTO dto) {
+    //
+    //        Long tokenUserId = AuthService.getTokenUserId(null);
+    //        dto.setUserId(tokenUserId);
+    //        Boolean result = storeOrderService.goPay(dto);
+    //        return Result.success(result);
+    //    }
+    
     @ApiOperation("导入发货单")
     @PostMapping("/importDelivery")
-    public Result importDelivery(@JSONField(serialize = false) @RequestParam("file") MultipartFile file) {
-        storeOrderService.importDelivery(file);
+    public Result importDelivery(@JSONField(serialize = false) @RequestParam("file") MultipartFile file, HttpServletResponse response) {
+        storeOrderService.importDelivery(file, response);
         return Result.success();
     }
 }

+ 12 - 0
mall-service/src/main/java/com/txz/mall/enums/PinkOrderStatusEnum.java

@@ -41,6 +41,18 @@ public enum PinkOrderStatusEnum {
         }
         return null;
     }
+    
+    public static PinkOrderStatusEnum getEnum(String value) {
+        if (value == null) {
+            return null;
+        }
+        for (PinkOrderStatusEnum temp : values()) {
+            if (Objects.equals(temp.value, value)) {
+                return temp;
+            }
+        }
+        return null;
+    }
 
     public Integer getKey() {
         return key;

+ 2 - 2
mall-service/src/main/java/com/txz/mall/service/StoreOrderService.java

@@ -138,12 +138,12 @@ public interface StoreOrderService extends Service<StoreOrder> {
     /**
      * 导出发货单
      */
-    void exportDelivery(HttpServletResponse response);
+    // void exportDelivery(HttpServletResponse response);
 
     /**
      * 导入发货单
      */
-    void importDelivery(MultipartFile file);
+    void importDelivery(MultipartFile file, HttpServletResponse response);
 
     /**
      * 订单状态机

+ 85 - 11
mall-service/src/main/java/com/txz/mall/service/impl/StoreOrderServiceImpl.java

@@ -10,6 +10,7 @@ import cn.hutool.poi.excel.ExcelWriter;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
@@ -1664,16 +1665,17 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
         //        }
     }
     
-    @Override
-    public void exportDelivery(HttpServletResponse response) {
-        StoreOrderDTO storeOrderDTO = new StoreOrderDTO();
-        storeOrderDTO.setPaid(1);
-        storeOrderDTO.setStatus(Constants.ORDER_STATUS_H5_NOT_SHIPPED);
-        exportFile(storeOrderDTO, response);
-    }
+    // @Override
+    // public void exportDelivery(HttpServletResponse response) {
+    //     StoreOrderDTO storeOrderDTO = new StoreOrderDTO();
+    //     storeOrderDTO.setPaid(1);
+    //     storeOrderDTO.setStatus(PinkOrderStatusEnum.GROUP_ORDER_TO_SHIP.getKey());
+    //     exportFile(storeOrderDTO, response);
+    // }
     
     @Override
-    public void importDelivery(MultipartFile file) {
+    @Transactional(rollbackFor = Exception.class)
+    public void importDelivery(MultipartFile file, HttpServletResponse response) {
         String name = file.getOriginalFilename();
         String suffix = FileUtil.extName(name);
         log.info("获取到的文件名为----->{},后缀为----->{},入参------->{}", name, suffix);
@@ -1690,14 +1692,86 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
                 throw new ServiceException("请填写内容后再提交!");
             }
             
+            List<StoreOrderExportPO> errors = new ArrayList<>();
             for (StoreOrderExportPO po : list) {
-                StoreOrder storeOrder = new StoreOrder();
+                StoreOrder storeOrder = this.findById(po.getId());
+                PinkOrderStatusEnum pinkOrderStatusEnum = OrderStateMachine.handleEvent(storeOrder, OrderEventsEnum.GROUP_PURCHASE_DELIVER, null);
+                if (ObjectUtil.isEmpty(pinkOrderStatusEnum)) {
+                    po.setErrorMsg("当前状态不支持发货");
+                    errors.add(po);
+                    continue;
+                }
+                
+                if (StrUtil.isBlank(po.getDeliveryId()) || StrUtil.isBlank(po.getDeliveryName())) {
+                    po.setErrorMsg("快递单号或快递公司不能为空");
+                    errors.add(po);
+                    continue;
+                }
+                
                 storeOrder.setId(po.getId());
                 storeOrder.setDeliveryId(po.getDeliveryId());
                 storeOrder.setDeliveryName(po.getDeliveryName());
+                storeOrder.setStatus(pinkOrderStatusEnum.getKey());
+                
                 update(storeOrder);
-                //   updateOrderStatus(po.getId(), PinkOrderStatusEnum.WAIT_RECEIVER.getKey());
-                updateOrderStatus(po.getId(), PinkOrderStatusEnum.GROUP_ORDER_TO_RECEVIE.getKey());
+                
+                StorePink pinkList = storePinkService.findBy("orderIdKey", po.getId());
+                pinkList.setOrderStatus(pinkOrderStatusEnum.getKey());
+                storePinkService.update(pinkList);
+            }
+            
+            if (CollectionUtils.isNotEmpty(errors)) {
+                List<String> rowHead = CollUtil.newArrayList("ID", "订单号", "用户ID", "用户注册手机号", "订单状态", "订单金额", "下单时间", "支付时间", "商品ID", "商品名称", "商品规格", "购买数量", "收件人姓名", "收件人手机", "收件人详细地址", "邮编", "快递公司", "快递单号", "失败原因");
+                ExcelWriter writer = ExcelUtil.getWriter();
+                try {
+                    writer.writeHeadRow(rowHead);
+                    List<List<Object>> rows = new LinkedList<>();
+                    StoreOrderInfo storeOrderInfo = null;
+                    for (StoreOrderExportPO vo : errors) {
+                        List<Object> rowA = CollUtil.newArrayList(
+                                vo.getId(),
+                                vo.getOrderId(),
+                                vo.getUid(),
+                                vo.getUserPhone(),
+                                PinkOrderStatusEnum.getEnum(vo.getStatus()).getValue(),
+                                vo.getPayPrice(),
+                                vo.getCreateTime() == null ? "" : DateUtil.format(vo.getCreateTime(), "yyyy-MM-dd HH:mm:ss"),
+                                vo.getPayTime() == null ? "" : DateUtil.format(vo.getPayTime(), "yyyy-MM-dd HH:mm:ss"),
+                                
+                                vo.getProductId(),
+                                vo.getProductName(),
+                                vo.getProductAttr(),
+                                vo.getPayNum(),
+                                
+                                vo.getRealName(),
+                                vo.getUserPhone(),
+                                vo.getUserAddress(),
+                                vo.getPostCode(),
+                                vo.getDeliveryName(),
+                                vo.getDeliveryId(),
+                                vo.getErrorMsg()
+                        );
+                        rows.add(rowA);
+                    }
+                    writer.write(rows);
+                    // 设置宽度自适应
+                    writer.setColumnWidth(-1, 22);
+                    // response为HttpServletResponse对象
+                    response.setContentType("application/vnd.ms-excel;charset=utf-8");
+                    // test.xls是弹出下载对话框的文件名,不能为中文,中文请自行编码
+                    response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("发货失败订单", "UTF-8") + ".xls");
+                    ServletOutputStream out = response.getOutputStream();
+                    // out为OutputStream,需要写出到的目标流
+                    writer.flush(out);
+                    log.info("导出结束");
+                } catch (Exception e) {
+                    log.error("导出异常", e);
+                    e.printStackTrace();
+                } finally {
+                    // 关闭writer,释放内存
+                    writer.close();
+                    log.info("导出结束");
+                }
             }
         } catch (IOException e) {
             throw new RuntimeException(e);

+ 38 - 0
mall-service/src/main/java/com/txz/mall/util/excel/converter/OrderStatucConverter.java

@@ -0,0 +1,38 @@
+package com.txz.mall.util.excel.converter;
+
+import com.alibaba.excel.converters.Converter;
+import com.alibaba.excel.converters.ReadConverterContext;
+import com.alibaba.excel.enums.CellDataTypeEnum;
+import com.alibaba.excel.metadata.GlobalConfiguration;
+import com.alibaba.excel.metadata.data.WriteCellData;
+import com.alibaba.excel.metadata.property.ExcelContentProperty;
+import com.txz.mall.enums.PinkOrderStatusEnum;
+
+/**
+ * @author: MTD®️
+ * @date: 2025/8/25
+ */
+
+public class OrderStatucConverter implements Converter<Integer> {
+    
+    @Override
+    public Class<?> supportJavaTypeKey() {
+        return Converter.super.supportJavaTypeKey();
+    }
+    
+    @Override
+    public CellDataTypeEnum supportExcelTypeKey() {
+        return Converter.super.supportExcelTypeKey();
+    }
+    
+    @Override
+    public Integer convertToJavaData(ReadConverterContext<?> context) throws Exception {
+        return PinkOrderStatusEnum.getEnum(context.getReadCellData().getStringValue()).getKey();
+    }
+    
+    
+    @Override
+    public WriteCellData<String> convertToExcelData(Integer integer, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
+        return new WriteCellData<>(PinkOrderStatusEnum.getEnum(integer).getValue());
+    }
+}

+ 27 - 19
mall-service/src/main/java/po/StoreOrderExportPO.java

@@ -6,6 +6,8 @@
  */
 package po;
 
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.txz.mall.util.excel.converter.OrderStatucConverter;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
@@ -15,59 +17,65 @@ import java.util.Date;
 
 @Data
 public class StoreOrderExportPO implements Serializable {
-
+    
     @ApiModelProperty(value = "id")
     private Long id;
-
+    
     @ApiModelProperty(value = "订单号")
     private String orderId;
-
+    
     @ApiModelProperty(value = "用户id")
     private Long uid;
-
+    
     @ApiModelProperty(value = "用户注册手机号")
     private String userPhone;
-
+    
     @ApiModelProperty(value = "订单状态")
+    @ExcelProperty(converter = OrderStatucConverter.class)
     private Integer status;
-
+    
     @ApiModelProperty(value = "订单金额")
     private BigDecimal payPrice;
-
+    
     @ApiModelProperty(value = "下单时间")
     private Date createTime;
-
+    
     @ApiModelProperty(value = "支付时间")
     private Date payTime;
-
+    
     @ApiModelProperty(value = "商品ID")
     private Long productId;
-
+    
     @ApiModelProperty(value = "商品名称")
     private String productName;
-
+    
     @ApiModelProperty(value = "商品规格")
     private String productAttr;
-
+    
     @ApiModelProperty(value = "购买数量")
     private Integer payNum;
-
+    
     @ApiModelProperty(value = "收件人姓名")
     private String realName;
-
+    
     @ApiModelProperty(value = "收件人电话")
     private String phone;
-
+    
     @ApiModelProperty(value = "收件人地址")
     private String userAddress;
-
+    
     @ApiModelProperty(value = "邮编")
     private String postCode;
-
+    
     @ApiModelProperty(value = "快递公司")
     private String deliveryName;
-
+    
     @ApiModelProperty(value = "快递单号")
     private String deliveryId;
-
+    
+    /**
+     * 失败原因
+     */
+    private String errorMsg;
+    
 }

+ 1 - 1
mall-service/src/main/resources/bootstrap.properties

@@ -51,7 +51,7 @@ dubbo.scan.base-packages=com.txz.${spring.application.name}.dubbo.impl
 #dubbo.cloud.subscribed-services=cif
 dubbo.application.qos.enable=false
 dubbo.application.qos.port=28201
-dubbo.application.qos.accept.foreign.ip=true
+dubbo.application.qos.accept.foreign.ip=false
 dubbo.registry.group=
 
 dubbo.reference.com.foo.BarService.check=false