Kaynağa Gözat

律师中台 订单列表 详情 导出

qxy 15 saat önce
ebeveyn
işleme
97bf1437d7

+ 64 - 0
alien-entity/src/main/java/shop/alien/entity/store/excelVo/LawyerConsultationOrderExcelVo.java

@@ -0,0 +1,64 @@
+package shop.alien.entity.store.excelVo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 律师咨询订单Excel导出对象
+ *
+ * @author system
+ * @since 2025-01-XX
+ */
+@Data
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@ApiModel(value = "LawyerConsultationOrderExcelVo对象", description = "律师咨询订单Excel导出对象")
+public class LawyerConsultationOrderExcelVo implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ExcelProperty(value = "律师名称", index = 0)
+    @ApiModelProperty(value = "律师名称")
+    private String lawyerName;
+
+    @ExcelProperty(value = "律师电话", index = 1)
+    @ApiModelProperty(value = "律师电话")
+    private String lawyerPhone;
+
+    @ExcelProperty(value = "订单编号", index = 2)
+    @ApiModelProperty(value = "订单编号")
+    private String orderNumber;
+
+    @ExcelProperty(value = "订单金额", index = 3)
+    @ApiModelProperty(value = "订单金额(单位:元)")
+    private String orderAmount;
+
+    @ExcelProperty(value = "订单状态", index = 4)
+    @ApiModelProperty(value = "订单状态")
+    private String orderStatus;
+
+    @ExcelProperty(value = "支付方式", index = 5)
+    @ApiModelProperty(value = "支付方式")
+    private String payType;
+
+    @ExcelProperty(value = "分钟收费-钱数", index = 6)
+    @ApiModelProperty(value = "分钟收费-钱数(单位:元)")
+    private String chargeMinute;
+
+    @ExcelProperty(value = "分钟收费-分钟数", index = 7)
+    @ApiModelProperty(value = "分钟收费-分钟数")
+    private String minuteNum;
+
+    @ExcelProperty(value = "次数收费-钱数", index = 8)
+    @ApiModelProperty(value = "次数收费-钱数(单位:元)")
+    private String chargeTime;
+
+    @ExcelProperty(value = "次数收费-次数", index = 9)
+    @ApiModelProperty(value = "次数收费-次数")
+    private String timeNum;
+}
+

+ 5 - 0
alien-entity/src/main/resources/mapper/LawyerConsultationOrderMapper.xml

@@ -115,6 +115,11 @@
             o.rating,
             o.comment,
             o.created_time,
+            o.pay_type,
+            o.charge_minute,
+            o.minute_num,
+            o.charge_time,
+            o.time_num,
             -- 律師信息
             l.name AS lawyer_name,
             l.phone AS lawyer_phone,

+ 57 - 0
alien-store/src/main/java/shop/alien/store/controller/StoreLawFirmController.java

@@ -9,6 +9,8 @@ import org.springframework.web.multipart.MultipartFile;
 import shop.alien.entity.result.R;
 import shop.alien.entity.store.LawFirm;
 import shop.alien.entity.store.vo.LawFirmPaymentVO;
+import shop.alien.entity.store.vo.LawyerConsultationOrderVO;
+import shop.alien.store.service.LawyerConsultationOrderService;
 import shop.alien.store.service.StoreLawFirmService;
 import shop.alien.util.myBaticsPlus.QueryBuilder;
 
@@ -33,6 +35,8 @@ import java.util.List;
 public class StoreLawFirmController {
 
     private final StoreLawFirmService storeLawFirmService;
+    
+    private final LawyerConsultationOrderService lawyerConsultationOrderService;
 
     @ApiOperation(value = "新增律所", notes = "新增律所信息,支持同时添加收款账号列表。如果统一社会信用代码(creditCode)已存在,将自动执行更新操作。收款账号(payment_account)必须唯一,不能重复添加。")
     @ApiOperationSupport(order = 1)
@@ -203,4 +207,57 @@ public class StoreLawFirmController {
         int pageSize = size > 0 ? size : 10;
         return storeLawFirmService.getPaymentPageWithFirm(pageNum, pageSize, firmId, paymentAccount, firmName, creditCode, status, certificationStatus, directorName, createdTimeStart, createdTimeEnd);
     }
+
+    @ApiOperation(value = "中台律师咨询订单列表", notes = "分页查询律师咨询订单列表,支持律师名称、订单状态、订单编号搜索")
+    @ApiOperationSupport(order = 12)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "page", value = "页数(默认1)", dataType = "int", paramType = "query"),
+            @ApiImplicitParam(name = "size", value = "页容(默认10)", dataType = "int", paramType = "query"),
+            @ApiImplicitParam(name = "lawyerName", value = "律师名称(支持模糊查询)", dataType = "String", paramType = "query"),
+            @ApiImplicitParam(name = "orderStatus", value = "订单状态, 0:待支付, 1:待接单, 2:进行中, 3:已完成, 4:已取消, 5:已退款", dataType = "Integer", paramType = "query"),
+            @ApiImplicitParam(name = "orderNumber", value = "订单编号(支持精确查询)", dataType = "String", paramType = "query")
+    })
+    @GetMapping("/lawyerConsultationOrderList")
+    public R<IPage<LawyerConsultationOrderVO>> getLawyerConsultationOrderList(
+            @RequestParam(value = "page", defaultValue = "1") int page,
+            @RequestParam(value = "size", defaultValue = "10") int size,
+            @RequestParam(value = "lawyerName", required = false) String lawyerName,
+            @RequestParam(value = "orderStatus", required = false) Integer orderStatus,
+            @RequestParam(value = "orderNumber", required = false) String orderNumber) {
+        log.info("StoreLawFirmController.getLawyerConsultationOrderList?page={},size={},lawyerName={},orderStatus={},orderNumber={}", 
+                page, size, lawyerName, orderStatus, orderNumber);
+        int pageNum = page > 0 ? page : 1;
+        int pageSize = size > 0 ? size : 10;
+        return lawyerConsultationOrderService.getConsultationOrderList(pageNum, pageSize, orderNumber, null, null, lawyerName, orderStatus);
+    }
+
+    @ApiOperation(value = "中台律师咨询订单详情", notes = "根据订单ID获取律师咨询订单详细信息,包含订单信息和律师信息")
+    @ApiOperationSupport(order = 13)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "lawyerOrderId", value = "订单ID", dataType = "String", paramType = "query", required = true)
+    })
+    @GetMapping("/lawyerConsultationOrderDetail")
+    public R<LawyerConsultationOrderVO> getLawyerConsultationOrderDetail(
+            @RequestParam(value = "lawyerOrderId", required = true) String lawyerOrderId) {
+        log.info("StoreLawFirmController.getLawyerConsultationOrderDetail?lawyerOrderId={}", lawyerOrderId);
+        return R.data(lawyerConsultationOrderService.getConsultationOrderDetail(lawyerOrderId));
+    }
+
+    @ApiOperation(value = "导出律师咨询订单列表", notes = "导出律师咨询订单列表到Excel,支持律师名称、订单状态、订单编号筛选")
+    @ApiOperationSupport(order = 14)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "lawyerName", value = "律师名称(支持模糊查询)", dataType = "String", paramType = "query"),
+            @ApiImplicitParam(name = "orderStatus", value = "订单状态, 0:待支付, 1:待接单, 2:进行中, 3:已完成, 4:已取消, 5:已退款", dataType = "Integer", paramType = "query"),
+            @ApiImplicitParam(name = "orderNumber", value = "订单编号(支持精确查询)", dataType = "String", paramType = "query")
+    })
+    @GetMapping("/exportLawyerConsultationOrder")
+    public void exportLawyerConsultationOrder(
+            @RequestParam(value = "lawyerName", required = false) String lawyerName,
+            @RequestParam(value = "orderStatus", required = false) Integer orderStatus,
+            @RequestParam(value = "orderNumber", required = false) String orderNumber,
+            HttpServletResponse response) throws IOException {
+        log.info("StoreLawFirmController.exportLawyerConsultationOrder?lawyerName={},orderStatus={},orderNumber={}", 
+                lawyerName, orderStatus, orderNumber);
+        lawyerConsultationOrderService.exportConsultationOrderList(response, lawyerName, orderStatus, orderNumber);
+    }
 }

+ 13 - 0
alien-store/src/main/java/shop/alien/store/service/LawyerConsultationOrderService.java

@@ -8,6 +8,8 @@ import shop.alien.entity.store.dto.LawyerConsultationOrderDto;
 import shop.alien.entity.store.dto.PayStatusRequest;
 import shop.alien.entity.store.vo.LawyerConsultationOrderVO;
 
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
 import java.math.BigDecimal;
 import java.util.Map;
 
@@ -123,5 +125,16 @@ public interface LawyerConsultationOrderService extends IService<LawyerConsultat
      * @return
      */
     R<Map<String, String>> checkOrder(Integer clientUserId,Integer lawyerUserId);
+
+    /**
+     * 导出律师咨询订单列表到Excel
+     *
+     * @param response     响应对象
+     * @param lawyerName   律师名称(可选)
+     * @param orderStatus  订单状态(可选)
+     * @param orderNumber  订单编号(可选)
+     * @throws IOException IO异常
+     */
+    void exportConsultationOrderList(HttpServletResponse response, String lawyerName, Integer orderStatus, String orderNumber) throws IOException;
 }
 

+ 127 - 0
alien-store/src/main/java/shop/alien/store/service/impl/LawyerConsultationOrderServiceImpl.java

@@ -18,6 +18,7 @@ import shop.alien.entity.result.R;
 import shop.alien.entity.store.*;
 import shop.alien.entity.store.dto.LawyerConsultationOrderDto;
 import shop.alien.entity.store.dto.PayStatusRequest;
+import shop.alien.entity.store.excelVo.LawyerConsultationOrderExcelVo;
 import shop.alien.entity.store.vo.LawyerConsultationOrderVO;
 import shop.alien.mapper.*;
 import shop.alien.store.service.LawyerConsultationOrderService;
@@ -25,7 +26,10 @@ import shop.alien.store.service.LawyerUserService;
 import shop.alien.store.service.OrderExpirationService;
 import shop.alien.store.util.ali.AliApi;
 import shop.alien.util.common.constant.LawyerStatusEnum;
+import shop.alien.util.excel.EasyExcelUtil;
 
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.text.SimpleDateFormat;
@@ -968,5 +972,128 @@ public class LawyerConsultationOrderServiceImpl extends ServiceImpl<LawyerConsul
         }
         return R.success("可以咨询该律师");
     }
+
+    @Override
+    public void exportConsultationOrderList(HttpServletResponse response, String lawyerName, Integer orderStatus, String orderNumber) throws IOException {
+        log.info("LawyerConsultationOrderServiceImpl.exportConsultationOrderList?lawyerName={},orderStatus={},orderNumber={}", 
+                lawyerName, orderStatus, orderNumber);
+        try {
+            // 查询所有数据(使用大分页)
+            Page<LawyerConsultationOrderVO> page = new Page<>(1, Integer.MAX_VALUE);
+            
+            // 如果按律師姓名搜索,先查詢匹配的律師ID列表
+            List<Integer> lawyerUserIds = null;
+            if (StringUtils.hasText(lawyerName)) {
+                LambdaQueryWrapper<LawyerUser> lawyerQueryWrapper = new LambdaQueryWrapper<>();
+                lawyerQueryWrapper.eq(LawyerUser::getDeleteFlag, 0);
+                lawyerQueryWrapper.like(LawyerUser::getName, lawyerName);
+                List<LawyerUser> lawyerUsers = lawyerUserService.list(lawyerQueryWrapper);
+                if (lawyerUsers != null && !lawyerUsers.isEmpty()) {
+                    lawyerUserIds = lawyerUsers.stream()
+                            .map(LawyerUser::getId)
+                            .collect(Collectors.toList());
+                } else {
+                    // 如果沒有找到匹配的律師,返回空结果
+                    response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
+                    response.getWriter().write("暂无数据可导出");
+                    return;
+                }
+            }
+            
+            // 查询订单列表
+            IPage<LawyerConsultationOrderVO> voPage = consultationOrderMapper.getConsultationOrderListWithLawyer(
+                    page, orderNumber, null, null, lawyerName, orderStatus, lawyerUserIds);
+
+            List<LawyerConsultationOrderVO> orderList = voPage != null ? voPage.getRecords() : Collections.emptyList();
+
+            if (orderList == null || orderList.isEmpty()) {
+                response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
+                response.getWriter().write("暂无数据可导出");
+                return;
+            }
+
+            // 转换为Excel VO
+            List<LawyerConsultationOrderExcelVo> excelVoList = orderList.stream()
+                    .map(this::convertToExcelVo)
+                    .collect(Collectors.toList());
+
+            // 使用EasyExcelUtil导出
+            EasyExcelUtil.exportExcel(response, excelVoList, LawyerConsultationOrderExcelVo.class, "律师咨询订单列表", "律师咨询订单列表");
+        } catch (Exception e) {
+            log.error("导出律师咨询订单列表失败", e);
+            if (!response.isCommitted()) {
+                response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+                response.getWriter().write("导出失败:" + e.getMessage());
+            }
+            throw new IOException("导出失败:" + e.getMessage(), e);
+        }
+    }
+
+    /**
+     * 转换为Excel VO
+     */
+    private LawyerConsultationOrderExcelVo convertToExcelVo(LawyerConsultationOrderVO vo) {
+        LawyerConsultationOrderExcelVo excelVo = new LawyerConsultationOrderExcelVo();
+        
+        // 律师信息
+        excelVo.setLawyerName(vo.getLawyerName());
+        excelVo.setLawyerPhone(vo.getLawyerPhone());
+        
+        // 订单信息
+        excelVo.setOrderNumber(vo.getOrderNumber());
+        
+        // 订单金额(分转元)
+        if (vo.getOrderAmount() != null) {
+            BigDecimal amount = new BigDecimal(vo.getOrderAmount()).divide(new BigDecimal(100), 2, RoundingMode.HALF_UP);
+            excelVo.setOrderAmount(amount.toString());
+        } else {
+            excelVo.setOrderAmount("0.00");
+        }
+        
+        // 订单状态转换
+        if (vo.getOrderStatus() != null) {
+            String statusDesc = LawyerStatusEnum.getDescription(vo.getOrderStatus());
+            excelVo.setOrderStatus(statusDesc != null ? statusDesc : "未知状态");
+        } else {
+            excelVo.setOrderStatus("");
+        }
+        
+        // 支付方式转换
+        if (StringUtils.hasText(vo.getPayType())) {
+            if ("1".equals(vo.getPayType())) {
+                excelVo.setPayType("支付宝");
+            } else if ("2".equals(vo.getPayType())) {
+                excelVo.setPayType("微信");
+            } else {
+                excelVo.setPayType(vo.getPayType());
+            }
+        } else {
+            excelVo.setPayType("");
+        }
+        
+        // 分钟收费-钱数(分转元)
+        if (vo.getChargeMinute() != null) {
+            BigDecimal chargeMinute = new BigDecimal(vo.getChargeMinute()).divide(new BigDecimal(100), 2, RoundingMode.HALF_UP);
+            excelVo.setChargeMinute(chargeMinute.toString());
+        } else {
+            excelVo.setChargeMinute("");
+        }
+        
+        // 分钟收费-分钟数
+        excelVo.setMinuteNum(vo.getMinuteNum() != null ? vo.getMinuteNum().toString() : "");
+        
+        // 次数收费-钱数(分转元)
+        if (vo.getChargeTime() != null) {
+            BigDecimal chargeTime = new BigDecimal(vo.getChargeTime()).divide(new BigDecimal(100), 2, RoundingMode.HALF_UP);
+            excelVo.setChargeTime(chargeTime.toString());
+        } else {
+            excelVo.setChargeTime("");
+        }
+        
+        // 次数收费-次数
+        excelVo.setTimeNum(vo.getTimeNum() != null ? vo.getTimeNum().toString() : "");
+        
+        return excelVo;
+    }
 }