浏览代码

律师详情表

Jxinyao 3 周之前
父节点
当前提交
cb03a18710

+ 1 - 1
alien-api/src/main/java/shop/alien/api/feign/GaoDeFeign.java

@@ -26,7 +26,7 @@ public interface GaoDeFeign {
      * @return JSONObject
      * @return JSONObject
      */
      */
     @GetMapping("/geocode/geo")
     @GetMapping("/geocode/geo")
-    JSONObject geo(@RequestParam(value = "output") String output,
+                   JSONObject geo(@RequestParam(value = "output") String output,
                    @RequestParam(value = "address") String address,
                    @RequestParam(value = "address") String address,
                    @RequestParam(value = "key") String key);
                    @RequestParam(value = "key") String key);
 
 

+ 46 - 0
alien-entity/src/main/java/shop/alien/mapper/LawFirmMapper.java

@@ -2,7 +2,12 @@ package shop.alien.mapper;
 
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 import shop.alien.entity.store.LawFirm;
 import shop.alien.entity.store.LawFirm;
+import shop.alien.entity.store.vo.LawyerReconciliationDetailVO;
+
+import java.util.Date;
+import java.util.List;
 
 
 /**
 /**
  * <p>
  * <p>
@@ -15,6 +20,47 @@ import shop.alien.entity.store.LawFirm;
 @Mapper
 @Mapper
 public interface LawFirmMapper extends BaseMapper<LawFirm> {
 public interface LawFirmMapper extends BaseMapper<LawFirm> {
 
 
+    /**
+     * 查询律所对账统计信息
+     *
+     * @param firmId 律所ID
+     * @param startDate 开始日期
+     * @param endDate 结束日期
+     * @return 统计信息 Map,包含 order_count 和 total_amount
+     */
+    java.util.Map<String, Object> getLawFirmReconciliationStatistics(
+            @Param("firmId") Integer firmId,
+            @Param("startDate") Date startDate,
+            @Param("endDate") Date endDate
+    );
+
+    /**
+     * 查询律所下律师的对账明细
+     *
+     * @param firmId 律所ID
+     * @param lawyerName 律师姓名(模糊查询)
+     * @param startDate 开始日期
+     * @param endDate 结束日期
+     * @return 律师对账明细列表
+     */
+    List<LawyerReconciliationDetailVO> getLawyerReconciliationDetails(
+            @Param("firmId") Integer firmId,
+            @Param("lawyerName") String lawyerName,
+            @Param("startDate") Date startDate,
+            @Param("endDate") Date endDate
+    );
+
+    /**
+     * 根据律所ID查询该律所下的所有律师ID列表
+     *
+     * @param firmId 律所ID
+     * @param lawyerName 律师姓名(可选,模糊查询)
+     * @return 律师ID列表
+     */
+    List<Integer> getLawyerIdsByFirmId(
+            @Param("firmId") Integer firmId,
+            @Param("lawyerName") String lawyerName
+    );
 }
 }
 
 
 
 

+ 70 - 0
alien-entity/src/main/java/shop/alien/mapper/LawyerReconcMapper.java

@@ -0,0 +1,70 @@
+package shop.alien.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import shop.alien.entity.store.LawyerConsultationOrder;
+import shop.alien.entity.store.vo.LawyerConsultationOrderVO;
+
+import java.util.List;
+
+/**
+ * 律师对账业务逻辑 Mapper
+ *
+ * @author system
+ * @since 2025-01-XX
+ */
+@Mapper
+public interface LawyerReconcMapper extends BaseMapper<LawyerConsultationOrder> {
+
+    /**
+     * 查询订单列表(关联律师信息)
+     *
+     * @param page 分页对象
+     * @param orderNumber 订单编号(可选,支持模糊查询)
+     * @param clientUserId 客户端用户ID(可选)
+     * @param lawyerUserId 律师用户ID(可选)
+     * @param lawyerName 律师姓名(可选,支持模糊查询)
+     * @param orderStatus 订单状态(可选)
+     * @param paymentStatus 支付状态(可选)
+     * @param startTime 开始时间(可选,范围查询)
+     * @param endTime 结束时间(可选,范围查询)
+     * @return 分页结果
+     */
+    IPage<LawyerConsultationOrderVO> getOrderListWithLawyer(
+            IPage<LawyerConsultationOrderVO> page,
+            @Param("orderNumber") String orderNumber,
+            @Param("clientUserId") Integer clientUserId,
+            @Param("lawyerUserId") Integer lawyerUserId,
+            @Param("lawyerName") String lawyerName,
+            @Param("orderStatus") Integer orderStatus,
+            @Param("paymentStatus") Integer paymentStatus,
+            @Param("startTime") String startTime,
+            @Param("endTime") String endTime
+    );
+
+    /**
+     * 查询订单列表(不分页,关联律师信息)
+     *
+     * @param orderNumber 订单编号(可选,支持模糊查询)
+     * @param clientUserId 客户端用户ID(可选)
+     * @param lawyerUserId 律师用户ID(可选)
+     * @param lawyerName 律师姓名(可选,支持模糊查询)
+     * @param orderStatus 订单状态(可选)
+     * @param paymentStatus 支付状态(可选)
+     * @param startTime 开始时间(可选,范围查询)
+     * @param endTime 结束时间(可选,范围查询)
+     * @return 订单列表
+     */
+    List<LawyerConsultationOrderVO> getOrderList(
+            @Param("orderNumber") String orderNumber,
+            @Param("clientUserId") Integer clientUserId,
+            @Param("lawyerUserId") Integer lawyerUserId,
+            @Param("lawyerName") String lawyerName,
+            @Param("orderStatus") Integer orderStatus,
+            @Param("paymentStatus") Integer paymentStatus,
+            @Param("startTime") String startTime,
+            @Param("endTime") String endTime
+    );
+}

+ 71 - 0
alien-entity/src/main/resources/mapper/LawFirmMapper.xml

@@ -56,6 +56,77 @@
         created_time, created_user_id, updated_time, updated_user_id, remark, payment_account
         created_time, created_user_id, updated_time, updated_user_id, remark, payment_account
     </sql>
     </sql>
 
 
+    <!-- 查询律所对账统计信息 -->
+    <select id="getLawFirmReconciliationStatistics" resultType="java.util.HashMap">
+        SELECT
+            COUNT(DISTINCT lco.id) as order_count,
+            COALESCE(SUM(lco.order_amount), 0) as total_amount
+        FROM lawyer_consultation_order lco
+        INNER JOIN lawyer_user lu ON lco.lawyer_user_id = lu.id
+        WHERE (lco.place_id = #{firmId} OR lu.firm_id = #{firmId})
+        AND lco.delete_flag = 0
+        AND lu.delete_flag = 0
+        AND lco.payment_status = 1
+        <if test="startDate != null">
+            AND DATE(lco.order_time) &gt;= DATE(#{startDate})
+        </if>
+        <if test="endDate != null">
+            AND DATE(lco.order_time) &lt;= DATE(#{endDate})
+        </if>
+    </select>
+
+    <!-- 查询律所下律师的对账明细 -->
+    <resultMap id="LawyerReconciliationDetailResultMap" type="shop.alien.entity.store.vo.LawyerReconciliationDetailVO">
+        <result column="lawyer_id" property="lawyerId" />
+        <result column="lawyer_name" property="lawyerName" />
+        <result column="head_img" property="headImg" />
+        <result column="lawyer_certificate_no" property="lawyerCertificateNo" />
+        <result column="order_count" property="orderCount" />
+        <result column="order_amount" property="orderAmount" />
+        <result column="platform_service_fee" property="platformServiceFee" />
+    </resultMap>
+
+    <select id="getLawyerReconciliationDetails" resultMap="LawyerReconciliationDetailResultMap">
+        SELECT
+            lu.id as lawyer_id,
+            lu.name as lawyer_name,
+            lu.head_img,
+            lu.lawyer_certificate_no,
+            COUNT(DISTINCT lco.id) as order_count,
+            COALESCE(SUM(lco.order_amount), 0) as order_amount,
+            0 as platform_service_fee
+        FROM lawyer_user lu
+        LEFT JOIN lawyer_consultation_order lco ON lu.id = lco.lawyer_user_id
+            AND lco.delete_flag = 0
+            AND lco.payment_status = 1
+            AND (lco.place_id = #{firmId} OR lu.firm_id = #{firmId})
+            <if test="startDate != null">
+                AND DATE(lco.order_time) &gt;= DATE(#{startDate})
+            </if>
+            <if test="endDate != null">
+                AND DATE(lco.order_time) &lt;= DATE(#{endDate})
+            </if>
+        WHERE lu.firm_id = #{firmId}
+        AND lu.delete_flag = 0
+        <if test="lawyerName != null and lawyerName != ''">
+            AND lu.name LIKE CONCAT('%', #{lawyerName}, '%')
+        </if>
+        GROUP BY lu.id, lu.name, lu.head_img, lu.lawyer_certificate_no
+        HAVING order_count > 0
+        ORDER BY order_amount DESC
+    </select>
+
+    <!-- 根据律所ID查询该律所下的所有律师ID列表 -->
+    <select id="getLawyerIdsByFirmId" resultType="java.lang.Integer">
+        SELECT id
+        FROM lawyer_user
+        WHERE firm_id = #{firmId}
+        AND delete_flag = 0
+        <if test="lawyerName != null and lawyerName != ''">
+            AND name LIKE CONCAT('%', #{lawyerName}, '%')
+        </if>
+    </select>
+
 </mapper>
 </mapper>
 
 
 
 

+ 196 - 0
alien-entity/src/main/resources/mapper/second/LawyerReconcMapper.xml

@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="shop.alien.mapper.LawyerReconcMapper">
+
+    <!-- 订单结果映射,包含律师信息 -->
+    <resultMap id="OrderVOWithLawyerResultMap" type="shop.alien.entity.store.vo.LawyerConsultationOrderVO">
+        <!-- 订单基本信息 -->
+        <id column="id" property="id" />
+        <result column="order_number" property="orderNumber" />
+        <result column="client_user_id" property="clientUserId" />
+        <result column="lawyer_user_id" property="lawyerUserId" />
+        <result column="problem_scenario_id" property="problemScenarioId" />
+        <result column="problem_description" property="problemDescription" />
+        <result column="order_amount" property="orderAmount" />
+        <result column="consultation_fee" property="consultationFee" />
+        <result column="start_time" property="startTime" />
+        <result column="end_time" property="endTime" />
+        <result column="order_status" property="orderStatus" />
+        <result column="payment_status" property="paymentStatus" />
+        <result column="order_time" property="orderTime" />
+        <result column="payment_time" property="paymentTime" />
+        <result column="validity_period" property="validityPeriod" />
+        <result column="rating" property="rating" />
+        <result column="comment" property="comment" />
+        <result column="created_time" property="createdTime" />
+        <result column="alipay_no" property="alipayNo" />
+        <result column="order_str" property="orderStr" />
+        <result column="place_id" property="placeId" />
+        <!-- 律师信息 -->
+        <result column="lawyer_name" property="lawyerName" />
+        <result column="lawyer_phone" property="lawyerPhone" />
+        <result column="lawyer_email" property="lawyerEmail" />
+        <result column="lawyer_certificate_no" property="lawyerCertificateNo" />
+        <result column="law_firm" property="lawFirm" />
+        <result column="practice_years" property="practiceYears" />
+        <result column="specialty_fields" property="specialtyFields" />
+        <result column="certification_status" property="certificationStatus" />
+        <result column="service_score" property="serviceScore" />
+        <result column="service_count" property="serviceCount" />
+        <result column="lawyer_consultation_fee" property="lawyerConsultationFee" />
+        <result column="province" property="province" />
+        <result column="city" property="city" />
+        <result column="district" property="district" />
+        <result column="address" property="address" />
+        <result column="head_img" property="headImg" />
+        <result column="nick_name" property="nickName" />
+        <result column="personal_introduction" property="personalIntroduction" />
+    </resultMap>
+
+    <!-- 查询订单列表(分页,关联律师信息)-->
+    <select id="getOrderListWithLawyer" resultMap="OrderVOWithLawyerResultMap">
+        SELECT
+            lco.id,
+            lco.order_number,
+            lco.client_user_id,
+            lco.lawyer_user_id,
+            lco.problem_scenario_id,
+            lco.problem_description,
+            lco.order_amount,
+            lco.consultation_fee,
+            lco.start_time,
+            lco.end_time,
+            lco.order_status,
+            lco.payment_status,
+            lco.order_time,
+            lco.payment_time,
+            lco.validity_period,
+            lco.rating,
+            lco.comment,
+            lco.created_time,
+            lco.alipay_no,
+            lco.order_str,
+            lco.place_id,
+            -- 律师信息
+            lu.name AS lawyer_name,
+            lu.phone AS lawyer_phone,
+            lu.email AS lawyer_email,
+            lu.lawyer_certificate_no,
+            lu.law_firm,
+            lu.practice_years,
+            lu.specialty_fields,
+            lu.certification_status,
+            lu.service_score,
+            lu.service_count,
+            lu.consultation_fee AS lawyer_consultation_fee,
+            lu.province,
+            lu.city,
+            lu.district,
+            lu.address,
+            lu.head_img,
+            lu.nick_name,
+            lu.personal_introduction
+        FROM lawyer_consultation_order lco
+        LEFT JOIN lawyer_user lu ON lco.lawyer_user_id = lu.id AND lu.delete_flag = 0
+        WHERE lco.delete_flag = 0
+        <if test="orderNumber != null and orderNumber != ''">
+            AND lco.order_number LIKE CONCAT('%', #{orderNumber}, '%')
+        </if>
+        <if test="clientUserId != null">
+            AND lco.client_user_id = #{clientUserId}
+        </if>
+        <if test="lawyerUserId != null">
+            AND lco.lawyer_user_id = #{lawyerUserId}
+        </if>
+        <if test="lawyerName != null and lawyerName != ''">
+            AND lu.name LIKE CONCAT('%', #{lawyerName}, '%')
+        </if>
+        <if test="orderStatus != null">
+            AND lco.order_status = #{orderStatus}
+        </if>
+        <if test="paymentStatus != null">
+            AND lco.payment_status = #{paymentStatus}
+        </if>
+        <if test="startTime != null and startTime != ''">
+            AND lco.created_time &gt;= #{startTime}
+        </if>
+        <if test="endTime != null and endTime != ''">
+            AND lco.created_time &lt;= #{endTime}
+        </if>
+        ORDER BY lco.created_time DESC
+    </select>
+
+    <!-- 查询订单列表(不分页,关联律师信息) -->
+    <select id="getOrderList" resultMap="OrderVOWithLawyerResultMap">
+        SELECT
+            lco.id,
+            lco.order_number,
+            lco.client_user_id,
+            lco.lawyer_user_id,
+            lco.problem_scenario_id,
+            lco.problem_description,
+            lco.order_amount,
+            lco.consultation_fee,
+            lco.start_time,
+            lco.end_time,
+            lco.order_status,
+            lco.payment_status,
+            lco.order_time,
+            lco.payment_time,
+            lco.validity_period,
+            lco.rating,
+            lco.comment,
+            lco.created_time,
+            lco.alipay_no,
+            lco.order_str,
+            lco.place_id,
+            -- 律师信息
+            lu.name AS lawyer_name,
+            lu.phone AS lawyer_phone,
+            lu.email AS lawyer_email,
+            lu.lawyer_certificate_no,
+            lu.law_firm,
+            lu.practice_years,
+            lu.specialty_fields,
+            lu.certification_status,
+            lu.service_score,
+            lu.service_count,
+            lu.consultation_fee AS lawyer_consultation_fee,
+            lu.province,
+            lu.city,
+            lu.district,
+            lu.address,
+            lu.head_img,
+            lu.nick_name,
+            lu.personal_introduction
+        FROM lawyer_consultation_order lco
+        LEFT JOIN lawyer_user lu ON lco.lawyer_user_id = lu.id AND lu.delete_flag = 0
+        WHERE lco.delete_flag = 0
+        <if test="orderNumber != null and orderNumber != ''">
+            AND lco.order_number LIKE CONCAT('%', #{orderNumber}, '%')
+        </if>
+        <if test="clientUserId != null">
+            AND lco.client_user_id = #{clientUserId}
+        </if>
+        <if test="lawyerUserId != null">
+            AND lco.lawyer_user_id = #{lawyerUserId}
+        </if>
+        <if test="lawyerName != null and lawyerName != ''">
+            AND lu.name LIKE CONCAT('%', #{lawyerName}, '%')
+        </if>
+        <if test="orderStatus != null">
+            AND lco.order_status = #{orderStatus}
+        </if>
+        <if test="paymentStatus != null">
+            AND lco.payment_status = #{paymentStatus}
+        </if>
+        <if test="startTime != null and startTime != ''">
+            AND lco.created_time &gt;= #{startTime}
+        </if>
+        <if test="endTime != null and endTime != ''">
+            AND lco.created_time &lt;= #{endTime}
+        </if>
+        ORDER BY lco.created_time DESC
+    </select>
+
+</mapper>

+ 11 - 0
alien-lawyer/src/main/java/shop/alien/lawyer/controller/LawFirmController.java

@@ -126,6 +126,17 @@ public class LawFirmController {
         log.info("LawFirmController.register?lawFirm={}", lawFirm);
         log.info("LawFirmController.register?lawFirm={}", lawFirm);
         return lawFirmService.register(lawFirm);
         return lawFirmService.register(lawFirm);
     }
     }
+
+    @ApiOperation("获取律所详情")
+    @ApiOperationSupport(order = 8)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "律所ID", dataType = "Integer", paramType = "query", required = true)
+    })
+    @GetMapping("/getDetail")
+    public R<LawFirm> getLawFirmDetail(@RequestParam(value = "id") Integer id) {
+        log.info("LawFirmController.getLawFirmDetail?id={}", id);
+        return lawFirmService.getLawFirmDetail(id);
+    }
 }
 }
 
 
 
 

+ 131 - 0
alien-lawyer/src/main/java/shop/alien/lawyer/controller/LawyerReconcController.java

@@ -0,0 +1,131 @@
+package shop.alien.lawyer.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import io.swagger.annotations.*;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+import shop.alien.entity.result.R;
+import shop.alien.entity.store.LawyerConsultationOrder;
+import shop.alien.lawyer.service.LawyerReconcService;
+import shop.alien.util.myBaticsPlus.QueryBuilder;
+
+import java.util.List;
+
+@Slf4j
+@Api(tags = {"律师平台-对账"})
+@ApiSort(23)
+@CrossOrigin
+@RestController
+@RequestMapping("/lawyer/consultation_order")
+@RequiredArgsConstructor
+public class LawyerReconcController {
+
+    private final LawyerReconcService reconcService;
+
+    /**
+     * 查询订单列表
+     */
+    @ApiOperation("查询订单列表")
+    @ApiOperationSupport(order = 1)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "主键", dataType = "Integer", paramType = "query"),
+            @ApiImplicitParam(name = "orderNumber", value = "订单编号(支持模糊查询)", dataType = "String", paramType = "query"),
+            @ApiImplicitParam(name = "clientUserId", value = "客户端用户ID", dataType = "Integer", paramType = "query"),
+            @ApiImplicitParam(name = "lawyerUserId", value = "律师用户ID", dataType = "Integer", paramType = "query"),
+            @ApiImplicitParam(name = "orderStatus", value = "订单状态, 0:待支付, 2:进行中, 3:已完成, 4:已取消", dataType = "Integer", paramType = "query"),
+            @ApiImplicitParam(name = "paymentStatus", value = "支付状态, 0:未支付, 1:已支付", dataType = "Integer", paramType = "query"),
+            @ApiImplicitParam(name = "createdTime_Start", value = "创建时间开始(范围查询)", dataType = "String", paramType = "query"),
+            @ApiImplicitParam(name = "createdTime_End", value = "创建时间结束(范围查询)", dataType = "String", paramType = "query")
+    })
+    @GetMapping("/getList")
+    public R<List<LawyerConsultationOrder>> selectList(@ModelAttribute LawyerConsultationOrder order) {
+        log.info("LawyerReconcController.selectList?order={}", order);
+        List<LawyerConsultationOrder> list = QueryBuilder.of(order)
+                .likeFields("orderNumber")  // 订单编号支持模糊查询
+                .build()
+                .list(reconcService);
+        return R.data(list);
+    }
+
+    /**
+     * 对账分页查询
+     * 对账
+     */
+    @ApiOperation("对账分页查询")
+    @ApiOperationSupport(order = 2)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "pageNum", value = "页码(默认1)", dataType = "Integer", paramType = "query"),
+            @ApiImplicitParam(name = "pageSize", value = "页容(默认10)", dataType = "Integer", paramType = "query"),
+            @ApiImplicitParam(name = "id", value = "主键", dataType = "Integer", paramType = "query"),
+            @ApiImplicitParam(name = "orderNumber", value = "订单编号(支持模糊查询)", dataType = "String", paramType = "query"),
+            @ApiImplicitParam(name = "clientUserId", value = "客户端用户ID", dataType = "Integer", paramType = "query"),
+            @ApiImplicitParam(name = "lawyerUserId", value = "律师用户ID", dataType = "Integer", paramType = "query"),
+            @ApiImplicitParam(name = "orderStatus", value = "订单状态, 0:待支付, 2:进行中, 3:已完成, 4:已取消", dataType = "Integer", paramType = "query"),
+            @ApiImplicitParam(name = "paymentStatus", value = "支付状态, 0:未支付, 1:已支付", dataType = "Integer", paramType = "query"),
+            @ApiImplicitParam(name = "createdTime_Start", value = "创建时间开始(范围查询)", dataType = "String", paramType = "query"),
+            @ApiImplicitParam(name = "createdTime_End", value = "创建时间结束(范围查询)", dataType = "String", paramType = "query")
+    })
+    @GetMapping("/getPage")
+    public R<IPage<LawyerConsultationOrder>> getPage(
+            @ModelAttribute LawyerConsultationOrder order,
+            @RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum,
+            @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
+        log.info("LawyerReconcController.getPage?order={},pageNum={},pageSize={}", order, pageNum, pageSize);
+        int pageNumValue = pageNum > 0 ? pageNum : 1;
+        int pageSizeValue = pageSize > 0 ? pageSize : 10;
+        // 使用MyBatis Plus的QueryBuilder进行条件查询和分页
+        IPage<LawyerConsultationOrder> pageResult = QueryBuilder.of(order)
+                .likeFields("orderNumber")  // 订单编号支持模糊查询
+                .page(pageNumValue, pageSizeValue)
+                .build()
+                .page(reconcService);
+        return R.data(pageResult);
+    }
+    //订单日期
+    @ApiOperation("订单日期")
+    @ApiOperationSupport(order = 3)
+    @GetMapping("/getDate")
+    public R<List<LawyerConsultationOrder>> getDate() {
+        log.info("LawyerReconcController.getDate");
+        // TODO: 实现订单日期查询逻辑
+        List<LawyerConsultationOrder> list = reconcService.list();
+        return R.data(list);
+    }
+    /**
+     * 获取订单总数量(使用MyBatis Plus)
+     */
+    @ApiOperation("获取订单总数量")
+    @ApiOperationSupport(order = 4)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "orderNumber", value = "订单编号(支持模糊查询)", dataType = "String", paramType = "query"),
+            @ApiImplicitParam(name = "clientUserId", value = "客户端用户ID", dataType = "Integer", paramType = "query"),
+            @ApiImplicitParam(name = "lawyerUserId", value = "律师用户ID", dataType = "Integer", paramType = "query"),
+            @ApiImplicitParam(name = "orderStatus", value = "订单状态, 0:待支付, 2:进行中, 3:已完成, 4:已取消", dataType = "Integer", paramType = "query"),
+            @ApiImplicitParam(name = "paymentStatus", value = "支付状态, 0:未支付, 1:已支付", dataType = "Integer", paramType = "query"),
+            @ApiImplicitParam(name = "startTime", value = "开始时间(范围查询,格式:yyyy-MM-dd 或 yyyy-MM-dd HH:mm:ss)", dataType = "String", paramType = "query"),
+            @ApiImplicitParam(name = "endTime", value = "结束时间(范围查询,格式:yyyy-MM-dd 或 yyyy-MM-dd HH:mm:ss)", dataType = "String", paramType = "query")
+    })
+    @GetMapping("/getCount")
+    public R<Long> getCount(
+            @RequestParam(required = false) String orderNumber,
+            @RequestParam(required = false) Integer clientUserId,
+            @RequestParam(required = false) Integer lawyerUserId,
+            @RequestParam(required = false) Integer orderStatus,
+            @RequestParam(required = false) Integer paymentStatus,
+            @RequestParam(required = false) String startTime,
+            @RequestParam(required = false) String endTime) {
+        log.info("LawyerReconcController.getCount?orderNumber={},clientUserId={},lawyerUserId={},orderStatus={},paymentStatus={},startTime={},endTime={}",
+                orderNumber, clientUserId, lawyerUserId, orderStatus, paymentStatus, startTime, endTime);
+        return reconcService.getTotalOrderCount(
+                orderNumber,
+                clientUserId,
+                lawyerUserId,
+                orderStatus,
+                paymentStatus,
+                startTime,
+                endTime
+        );
+    }
+
+}

+ 8 - 0
alien-lawyer/src/main/java/shop/alien/lawyer/service/LawFirmService.java

@@ -55,6 +55,14 @@ public interface LawFirmService extends IService<LawFirm> {
      * @return R<LawFirm>
      * @return R<LawFirm>
      */
      */
     R<LawFirm> register(LawFirm lawFirm);
     R<LawFirm> register(LawFirm lawFirm);
+
+    /**
+     * 获取律所详情
+     *
+     * @param id 律所ID
+     * @return R<LawFirm>
+     */
+    R<LawFirm> getLawFirmDetail(Integer id);
 }
 }
 
 
 
 

+ 97 - 0
alien-lawyer/src/main/java/shop/alien/lawyer/service/LawyerReconcService.java

@@ -0,0 +1,97 @@
+package shop.alien.lawyer.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import shop.alien.entity.result.R;
+import shop.alien.entity.store.LawyerConsultationOrder;
+import shop.alien.entity.store.vo.LawyerConsultationOrderVO;
+
+import java.util.List;
+
+/**
+ * 律师对账服务接口
+ *
+ * @author system
+ * @since 2025-01-XX
+ */
+public interface LawyerReconcService extends IService<LawyerConsultationOrder> {
+    
+    /**
+     * 获取订单详情
+     */
+    R<LawyerConsultationOrder> updateOrderPaymentStatus(Integer orderId, Integer paymentStatus);
+
+    /**
+     * 查询订单列表(分页,关联律师信息)
+     *
+     * @param pageNum 页码
+     * @param pageSize 页容
+     * @param orderNumber 订单编号(可选,支持模糊查询)
+     * @param clientUserId 客户端用户ID(可选)
+     * @param lawyerUserId 律师用户ID(可选)
+     * @param lawyerName 律师姓名(可选,支持模糊查询)
+     * @param orderStatus 订单状态(可选)
+     * @param paymentStatus 支付状态(可选)
+     * @param startTime 开始时间(可选,格式:yyyy-MM-dd HH:mm:ss)
+     * @param endTime 结束时间(可选,格式:yyyy-MM-dd HH:mm:ss)
+     * @return 分页结果(包含律师信息)
+     */
+    R<IPage<LawyerConsultationOrderVO>> getOrderListWithLawyer(
+            Integer pageNum,
+            Integer pageSize,
+            String orderNumber,
+            Integer clientUserId,
+            Integer lawyerUserId,
+            String lawyerName,
+            Integer orderStatus,
+            Integer paymentStatus,
+            String startTime,
+            String endTime
+    );
+
+    /**
+     * 查询订单列表(不分页,关联律师信息)
+     *
+     * @param orderNumber 订单编号(可选,支持模糊查询)
+     * @param clientUserId 客户端用户ID(可选)
+     * @param lawyerUserId 律师用户ID(可选)
+     * @param lawyerName 律师姓名(可选,支持模糊查询)
+     * @param orderStatus 订单状态(可选)
+     * @param paymentStatus 支付状态(可选)
+     * @param startTime 开始时间(可选,格式:yyyy-MM-dd HH:mm:ss)
+     * @param endTime 结束时间(可选,格式:yyyy-MM-dd HH:mm:ss)
+     * @return 订单列表(包含律师信息)
+     */
+    R<List<LawyerConsultationOrderVO>> getOrderList(
+            String orderNumber,
+            Integer clientUserId,
+            Integer lawyerUserId,
+            String lawyerName,
+            Integer orderStatus,
+            Integer paymentStatus,
+            String startTime,
+            String endTime
+    );
+
+    /**
+     * 获取总订单数量
+     *
+     * @param orderNumber 订单编号(可选,支持模糊查询)
+     * @param clientUserId 客户端用户ID(可选)
+     * @param lawyerUserId 律师用户ID(可选)
+     * @param orderStatus 订单状态(可选)
+     * @param paymentStatus 支付状态(可选)
+     * @param startTime 开始时间(可选,格式:yyyy-MM-dd HH:mm:ss)
+     * @param endTime 结束时间(可选,格式:yyyy-MM-dd HH:mm:ss)
+     * @return 总订单数量
+     */
+    R<Long> getTotalOrderCount(
+            String orderNumber,
+            Integer clientUserId,
+            Integer lawyerUserId,
+            Integer orderStatus,
+            Integer paymentStatus,
+            String startTime,
+            String endTime
+    );
+}

+ 23 - 0
alien-lawyer/src/main/java/shop/alien/lawyer/service/impl/LawFirmServiceImpl.java

@@ -157,6 +157,29 @@ public class LawFirmServiceImpl extends ServiceImpl<LawFirmMapper, LawFirm> impl
         }
         }
         return R.fail("注册失败,请稍后重试");
         return R.fail("注册失败,请稍后重试");
     }
     }
+
+    @Override
+    public R<LawFirm> getLawFirmDetail(Integer id) {
+        log.info("LawFirmServiceImpl.getLawFirmDetail?id={}", id);
+        
+        if (id == null) {
+            return R.fail("律所ID不能为空");
+        }
+        
+        // 使用 MyBatis-Plus 的 getById 方法获取律所详情
+        LawFirm lawFirm = this.getById(id);
+        
+        if (lawFirm == null) {
+            return R.fail("律所不存在");
+        }
+        
+        // 检查是否已删除
+        if (lawFirm.getDeleteFlag() != null && lawFirm.getDeleteFlag() == 1) {
+            return R.fail("律所已被删除");
+        }
+        
+        return R.data(lawFirm, "查询成功");
+    }
 }
 }
 
 
 
 

+ 201 - 0
alien-lawyer/src/main/java/shop/alien/lawyer/service/impl/LawyerReconcServiceImpl.java

@@ -0,0 +1,201 @@
+package shop.alien.lawyer.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.StringUtils;
+import shop.alien.entity.result.R;
+import shop.alien.entity.store.LawyerConsultationOrder;
+import shop.alien.entity.store.vo.LawyerConsultationOrderVO;
+import shop.alien.lawyer.service.LawyerReconcService;
+import shop.alien.mapper.LawyerConsultationOrderMapper;
+import shop.alien.mapper.LawyerReconcMapper;
+
+import java.util.List;
+
+/**
+ * 律师对账服务实现类
+ *
+ * @author system
+ * @since 2025-01-XX
+ */
+@Slf4j
+@Transactional
+@Service
+@RequiredArgsConstructor
+public class LawyerReconcServiceImpl extends ServiceImpl<LawyerConsultationOrderMapper, LawyerConsultationOrder> implements LawyerReconcService {
+
+    private final LawyerReconcMapper lawyerReconcMapper;
+
+    @Override
+    public R<LawyerConsultationOrder> updateOrderPaymentStatus(Integer orderId, Integer paymentStatus) {
+        log.info("LawyerReconcServiceImpl.updateOrderPaymentStatus?orderId={},paymentStatus={}", orderId, paymentStatus);
+        // TODO: 实现更新订单支付状态的逻辑
+        return R.fail("功能待实现");
+    }
+
+    @Override
+    public R<IPage<LawyerConsultationOrderVO>> getOrderListWithLawyer(
+            Integer pageNum,
+            Integer pageSize,
+            String orderNumber,
+            Integer clientUserId,
+            Integer lawyerUserId,
+            String lawyerName,
+            Integer orderStatus,
+            Integer paymentStatus,
+            String startTime,
+            String endTime) {
+        log.info("LawyerReconcServiceImpl.getOrderListWithLawyer?pageNum={},pageSize={},orderNumber={},clientUserId={},lawyerUserId={},lawyerName={},orderStatus={},paymentStatus={},startTime={},endTime={}",
+                pageNum, pageSize, orderNumber, clientUserId, lawyerUserId, lawyerName, orderStatus, paymentStatus, startTime, endTime);
+
+        // 参数校验和默认值设置
+        int pageNumValue = (pageNum != null && pageNum > 0) ? pageNum : 1;
+        int pageSizeValue = (pageSize != null && pageSize > 0) ? pageSize : 10;
+
+        // 处理时间格式(如果只传日期,补充时间部分)
+        String startTimeValue = formatTime(startTime, true);
+        String endTimeValue = formatTime(endTime, false);
+
+        // 创建分页对象
+        Page<LawyerConsultationOrderVO> page = new Page<>(pageNumValue, pageSizeValue);
+
+        // 调用 Mapper 方法查询
+        IPage<LawyerConsultationOrderVO> result = lawyerReconcMapper.getOrderListWithLawyer(
+                page,
+                orderNumber,
+                clientUserId,
+                lawyerUserId,
+                lawyerName,
+                orderStatus,
+                paymentStatus,
+                startTimeValue,
+                endTimeValue
+        );
+
+        return R.data(result);
+    }
+
+    @Override
+    public R<List<LawyerConsultationOrderVO>> getOrderList(
+            String orderNumber,
+            Integer clientUserId,
+            Integer lawyerUserId,
+            String lawyerName,
+            Integer orderStatus,
+            Integer paymentStatus,
+            String startTime,
+            String endTime) {
+        log.info("LawyerReconcServiceImpl.getOrderList?orderNumber={},clientUserId={},lawyerUserId={},lawyerName={},orderStatus={},paymentStatus={},startTime={},endTime={}",
+                orderNumber, clientUserId, lawyerUserId, lawyerName, orderStatus, paymentStatus, startTime, endTime);
+
+        // 处理时间格式(如果只传日期,补充时间部分)
+        String startTimeValue = formatTime(startTime, true);
+        String endTimeValue = formatTime(endTime, false);
+
+        // 调用 Mapper 方法查询
+        List<LawyerConsultationOrderVO> result = lawyerReconcMapper.getOrderList(
+                orderNumber,
+                clientUserId,
+                lawyerUserId,
+                lawyerName,
+                orderStatus,
+                paymentStatus,
+                startTimeValue,
+                endTimeValue
+        );
+
+        return R.data(result);
+    }
+
+    @Override
+    public R<Long> getTotalOrderCount(
+            String orderNumber,
+            Integer clientUserId,
+            Integer lawyerUserId,
+            Integer orderStatus,
+            Integer paymentStatus,
+            String startTime,
+            String endTime) {
+        log.info("LawyerReconcServiceImpl.getTotalOrderCount?orderNumber={},clientUserId={},lawyerUserId={},orderStatus={},paymentStatus={},startTime={},endTime={}",
+                orderNumber, clientUserId, lawyerUserId, orderStatus, paymentStatus, startTime, endTime);
+
+        // 使用MyBatis Plus的LambdaQueryWrapper构建查询条件
+        LambdaQueryWrapper<LawyerConsultationOrder> queryWrapper = new LambdaQueryWrapper<>();
+
+        // 基础条件:只查询未删除的订单
+        queryWrapper.eq(LawyerConsultationOrder::getDeleteFlag, 0);
+
+        // 订单编号(模糊查询)
+        if (StringUtils.hasText(orderNumber)) {
+            queryWrapper.like(LawyerConsultationOrder::getOrderNumber, orderNumber);
+        }
+
+        // 客户端用户ID
+        if (clientUserId != null) {
+            queryWrapper.eq(LawyerConsultationOrder::getClientUserId, clientUserId);
+        }
+
+        // 律师用户ID
+        if (lawyerUserId != null) {
+            queryWrapper.eq(LawyerConsultationOrder::getLawyerUserId, lawyerUserId);
+        }
+
+        // 订单状态
+        if (orderStatus != null) {
+            queryWrapper.eq(LawyerConsultationOrder::getOrderStatus, orderStatus);
+        }
+
+        // 支付状态
+        if (paymentStatus != null) {
+            queryWrapper.eq(LawyerConsultationOrder::getPaymentStatus, paymentStatus);
+        }
+
+        // 时间范围查询
+        String startTimeValue = formatTime(startTime, true);
+        String endTimeValue = formatTime(endTime, false);
+        if (StringUtils.hasText(startTimeValue)) {
+            queryWrapper.ge(LawyerConsultationOrder::getCreatedTime, startTimeValue);
+        }
+        if (StringUtils.hasText(endTimeValue)) {
+            queryWrapper.le(LawyerConsultationOrder::getCreatedTime, endTimeValue);
+        }
+
+        // 使用MyBatis Plus的count方法统计总数量
+        long count = this.count(queryWrapper);
+
+        log.info("LawyerReconcServiceImpl.getTotalOrderCount?count={}", count);
+        return R.data(count);
+    }
+
+    /**
+     * 格式化时间字符串
+     * 如果只传日期(yyyy-MM-dd),自动补充时间部分
+     *
+     * @param time 时间字符串
+     * @param isStart 是否为开始时间(true: 补充 00:00:00, false: 补充 23:59:59)
+     * @return 格式化后的时间字符串
+     */
+    private String formatTime(String time, boolean isStart) {
+        if (!StringUtils.hasText(time)) {
+            return null;
+        }
+
+        // 如果已经包含时间部分,直接返回
+        if (time.contains(" ")) {
+            return time;
+        }
+
+        // 如果只有日期,补充时间部分
+        if (time.matches("\\d{4}-\\d{2}-\\d{2}")) {
+            return isStart ? time + " 00:00:00" : time + " 23:59:59";
+        }
+
+        return time;
+    }
+}

+ 62 - 0
alien-lawyer/src/main/resources/application.yaml

@@ -0,0 +1,62 @@
+spring:
+    datasource:
+        url: jdbc:mysql://localhost:3306/alien?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&allowMultiQueries=true&tinyInt1isBit=false&allowLoadLocalInfile=true&allowLocalInfile=true&allowUrlIn
+        username: root
+        password: 123456
+
+# MyBatis-Plus 配置
+mybatis-plus:
+  # Mapper XML 文件位置
+  mapper-locations:
+    - classpath:mapper/**/*.xml
+    - classpath*:mapper/**/*.xml
+
+  # 实体类包路径(用于类型别名)
+  type-aliases-package: shop.alien.entity
+
+  # MyBatis 原生配置
+  configuration:
+    # 开启驼峰命名转换(表字段 user_name -> 实体属性 userName)
+    map-underscore-to-camel-case: true
+    # 开启二级缓存
+    cache-enabled: true
+    # 日志实现
+    # 开发环境:org.apache.ibatis.logging.stdout.StdOutImpl(控制台输出)
+    # 生产环境:org.apache.ibatis.logging.slf4j.Slf4jImpl(日志框架)
+    log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl
+    # 延迟加载的触发方法
+    lazy-load-trigger-methods: equals,clone,hashCode,toString
+    # 是否开启自动驼峰命名规则映射
+    auto-mapping-behavior: partial
+    # 默认执行器类型
+    default-executor-type: reuse
+    # 超时时间(秒)
+    default-statement-timeout: 25
+    # 允许JDBC支持自动生成主键
+    use-generated-keys: true
+
+  # 全局配置
+  global-config:
+    # 数据库相关配置
+    db-config:
+      # 主键类型(AUTO: 数据库自增)
+      id-type: AUTO
+      # 表名下划线命名
+      table-underline: true
+      # 逻辑删除字段名
+      logic-delete-field: delete_flag
+      # 逻辑删除值(已删除)
+      logic-delete-value: 1
+      # 逻辑未删除值(未删除)
+      logic-not-delete-value: 0
+      # 字段验证策略
+      field-strategy: not_null
+      # 数据库类型
+      db-type: MYSQL
+
+# 日志配置
+logging:
+  level:
+    # MyBatis SQL 日志级别(开发环境可设置为 DEBUG)
+    shop.alien.mapper: INFO
+    root: INFO