Quellcode durchsuchen

Merge remote-tracking branch 'origin/dev' into dev

lyx vor 2 Wochen
Ursprung
Commit
2684eaa97d
20 geänderte Dateien mit 531 neuen und 22 gelöschten Zeilen
  1. 4 0
      alien-entity/src/main/java/shop/alien/entity/store/LawyerConsultationOrder.java
  2. 27 0
      alien-entity/src/main/java/shop/alien/entity/store/dto/LawyerLegalProblemScenarioStatusDto.java
  3. 27 0
      alien-entity/src/main/java/shop/alien/entity/store/dto/LawyerRecommendedDto.java
  4. 114 0
      alien-entity/src/main/java/shop/alien/entity/store/excelVo/LawyerUserExcelVo.java
  5. 3 0
      alien-entity/src/main/java/shop/alien/entity/store/vo/CommentAppealVo.java
  6. 3 1
      alien-entity/src/main/resources/mapper/CommentAppealMapper.xml
  7. 10 0
      alien-entity/src/main/resources/mapper/LawyerConsultationOrderMapper.xml
  8. 5 4
      alien-entity/src/main/resources/mapper/LawyerUserMapper.xml
  9. 1 0
      alien-entity/src/main/resources/mapper/OrderReviewMapper.xml
  10. 20 0
      alien-gateway/src/main/java/shop/alien/gateway/config/JwtTokenFilter.java
  11. 9 0
      alien-lawyer/src/main/java/shop/alien/lawyer/controller/LawyerLegalProblemScenarioController.java
  12. 46 0
      alien-lawyer/src/main/java/shop/alien/lawyer/controller/LawyerUserController.java
  13. 9 0
      alien-lawyer/src/main/java/shop/alien/lawyer/service/LawyerLegalProblemScenarioService.java
  14. 32 0
      alien-lawyer/src/main/java/shop/alien/lawyer/service/LawyerUserService.java
  15. 10 16
      alien-lawyer/src/main/java/shop/alien/lawyer/service/impl/CommentAppealServiceImpl.java
  16. 1 0
      alien-lawyer/src/main/java/shop/alien/lawyer/service/impl/LawFirmPaymentServiceImpl.java
  17. 1 0
      alien-lawyer/src/main/java/shop/alien/lawyer/service/impl/LawyerConsultationOrderServiceImpl.java
  18. 34 0
      alien-lawyer/src/main/java/shop/alien/lawyer/service/impl/LawyerLegalProblemScenarioServiceImpl.java
  19. 5 1
      alien-lawyer/src/main/java/shop/alien/lawyer/service/impl/LawyerUserLogInServiceImpl.java
  20. 170 0
      alien-lawyer/src/main/java/shop/alien/lawyer/service/impl/LawyerUserServiceImpl.java

+ 4 - 0
alien-entity/src/main/java/shop/alien/entity/store/LawyerConsultationOrder.java

@@ -169,6 +169,10 @@ public class LawyerConsultationOrder extends Model<LawyerConsultationOrder> {
     @TableField("reject_refund_reason")
     private String rejectRefundReason;
 
+    @ApiModelProperty(value = "是否已被申诉, 0:未申诉, 1:已申诉")
+    @TableField("is_appealed")
+    private Integer isAppealed;
+
     @ApiModelProperty(value = "退款申请处理动作:1-同意,2-拒绝")
     @TableField(exist = false)
     private String processAction;

+ 27 - 0
alien-entity/src/main/java/shop/alien/entity/store/dto/LawyerLegalProblemScenarioStatusDto.java

@@ -0,0 +1,27 @@
+package shop.alien.entity.store.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 设置法律场景启用/禁用状态请求对象
+ *
+ * @author system
+ * @since 2025-01-XX
+ */
+@Data
+@ApiModel(value = "LawyerLegalProblemScenarioStatusDto对象", description = "设置法律场景启用/禁用状态请求对象")
+public class LawyerLegalProblemScenarioStatusDto implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "场景ID", required = true)
+    private Integer id;
+
+    @ApiModelProperty(value = "状态,0:禁用,1:启用", required = true)
+    private Integer status;
+}
+

+ 27 - 0
alien-entity/src/main/java/shop/alien/entity/store/dto/LawyerRecommendedDto.java

@@ -0,0 +1,27 @@
+package shop.alien.entity.store.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 设置律师推荐状态请求对象
+ *
+ * @author system
+ * @since 2025-01-XX
+ */
+@Data
+@ApiModel(value = "LawyerRecommendedDto对象", description = "设置律师推荐状态请求对象")
+public class LawyerRecommendedDto implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "律师ID", required = true)
+    private Integer lawyerId;
+
+    @ApiModelProperty(value = "推荐状态,0:取消推荐,1:推荐", required = true)
+    private Integer isRecommended;
+}
+

+ 114 - 0
alien-entity/src/main/java/shop/alien/entity/store/excelVo/LawyerUserExcelVo.java

@@ -0,0 +1,114 @@
+package shop.alien.entity.store.excelVo;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+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;
+import java.util.Date;
+
+/**
+ * 律师用户Excel导出对象
+ *
+ * @author system
+ * @since 2025-01-XX
+ */
+@Data
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@ApiModel(value = "LawyerUserExcelVo对象", description = "律师用户Excel导出对象")
+public class LawyerUserExcelVo implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ExcelIgnore
+    @ApiModelProperty(value = "主键")
+    private Integer id;
+
+    @ExcelProperty(value = "律师姓名", index = 0)
+    @ApiModelProperty(value = "律师姓名")
+    private String name;
+
+    @ExcelProperty(value = "律师手机号", index = 1)
+    @ApiModelProperty(value = "律师手机号")
+    private String phone;
+
+    @ExcelProperty(value = "律所名称", index = 2)
+    @ApiModelProperty(value = "律所名称")
+    private String firmName;
+
+    @ExcelIgnore
+    @ApiModelProperty(value = "律师执业证号")
+    private String lawyerCertificateNo;
+
+    @ExcelIgnore
+    @ApiModelProperty(value = "执业开始日期")
+    private String practiceStartDate;
+
+    @ExcelIgnore
+    @ApiModelProperty(value = "执业年限")
+    private Integer practiceYears;
+
+    @ExcelIgnore
+    @ApiModelProperty(value = "用户状态")
+    private String status;
+
+    @ExcelIgnore
+    @ApiModelProperty(value = "资质认证状态")
+    private String certificationStatus;
+
+    @ExcelProperty(value = "推荐状态", index = 3)
+    @ApiModelProperty(value = "推荐状态")
+    private String isRecommended;
+
+    @ExcelIgnore
+    @ApiModelProperty(value = "服务评分")
+    private Integer serviceScore;
+
+    @ExcelIgnore
+    @ApiModelProperty(value = "服务次数")
+    private Integer serviceCount;
+
+    @ExcelIgnore
+    @ApiModelProperty(value = "创建时间")
+    private String createdTime;
+
+    @ExcelProperty(value = "法律场景", index = 4)
+    @ApiModelProperty(value = "法律场景")
+    private String scenarioNames;
+
+    @ExcelProperty(value = "接单状态", index = 5)
+    @ApiModelProperty(value = "接单状态")
+    private String orderReceivingStatus;
+
+    @ExcelProperty(value = "收款账号", index = 6)
+    @ApiModelProperty(value = "收款账号")
+    private String paymentNum;
+
+    @ExcelIgnore
+    @ApiModelProperty(value = "律所ID")
+    private Integer firmId;
+
+    @ExcelIgnore
+    @ApiModelProperty(value = "用户状态值")
+    private Integer statusValue;
+
+    @ExcelIgnore
+    @ApiModelProperty(value = "资质认证状态值")
+    private Integer certificationStatusValue;
+
+    @ExcelIgnore
+    @ApiModelProperty(value = "是否推荐值")
+    private Integer isRecommendedValue;
+
+    @ExcelIgnore
+    @ApiModelProperty(value = "接单状态值")
+    private Integer orderReceivingStatusValue;
+
+    @ExcelIgnore
+    @ApiModelProperty(value = "创建时间原始值")
+    private Date createdTimeValue;
+}
+

+ 3 - 0
alien-entity/src/main/java/shop/alien/entity/store/vo/CommentAppealVo.java

@@ -136,5 +136,8 @@ public class CommentAppealVo implements Serializable {
 
     @ApiModelProperty(value = "律师电话")
     private String lawyerPhone;
+
+    @ApiModelProperty(value = "申诉单号")
+    private String appealNumber;
 }
 

+ 3 - 1
alien-entity/src/main/resources/mapper/CommentAppealMapper.xml

@@ -33,6 +33,7 @@
         <result column="updated_time" property="updatedTime" />
         <result column="updated_user_id" property="updatedUserId" />
         <result column="audit_user_id" property="auditUserId" />
+        <result column="appeal_number" property="appealNumber" />
         <!-- 评价相关信息 -->
         <result column="review_user_id" property="reviewUserId" />
         <result column="review_user_name" property="reviewUserName" />
@@ -116,6 +117,7 @@
             ca.updated_time,
             ca.updated_user_id,
             ca.updated_user_id AS audit_user_id,
+            ca.appeal_number,
             orv.user_id AS review_user_id,
             CASE
                 WHEN orv.is_anonymous = 1 THEN '匿名用户'
@@ -133,7 +135,7 @@
             orv.created_time AS review_time,
             orv.review_images
         FROM comment_appeals ca
-        LEFT JOIN lawyer_order_review orv ON orv.id = ca.comment_id AND orv.delete_flag = 0
+        LEFT JOIN lawyer_order_review orv ON orv.id = ca.comment_id
         LEFT JOIN life_user lu ON lu.id = orv.user_id AND lu.delete_flag = 0
         WHERE ca.delete_flag = 0
         AND ca.id = #{id}

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

@@ -29,6 +29,16 @@
         <result column="alipay_no" property="alipayNo" />
         <result column="order_str" property="orderStr" />
         <result column="place_id" property="placeId" />
+        <result column="lawyer_earnings" property="lawyerEarnings" />
+        <result column="accept_orders_time" property="acceptOrdersTime" />
+        <result column="reason_order_refusal" property="reasonOrderRefusal" />
+        <result column="accept_orders_status" property="acceptOrdersStatus" />
+        <result column="apply_refund_status" property="applyRefundStatus" />
+        <result column="apply_refund_time" property="applyRefundTime" />
+        <result column="apply_refund_process_time" property="applyRefundProcessTime" />
+        <result column="apply_refund_reason" property="applyRefundReason" />
+        <result column="reject_refund_reason" property="rejectRefundReason" />
+        <result column="is_appealed" property="isAppealed" />
     </resultMap>
 
     <!-- 通用查询结果列 -->

+ 5 - 4
alien-entity/src/main/resources/mapper/LawyerUserMapper.xml

@@ -113,17 +113,18 @@
         user.status,
         user.delete_flag,
         user.created_time,
+        user.is_recommended,
         firm.firm_name AS firmName,
         firmTwo.payment_account AS paymentNum,
         firmTwo.address AS address,
-        GROUP_CONCAT(a.name SEPARATOR ',') AS scenarioNames,
-        (SELECT GROUP_CONCAT(`name` SEPARATOR ',') FROM lawyer_legal_problem_scenario WHERE level = 1) AS firstLevelScenario
+        GROUP_CONCAT(DISTINCT a.name SEPARATOR ',') AS scenarioNames,
+        (SELECT GROUP_CONCAT(`name` SEPARATOR ',') FROM lawyer_legal_problem_scenario WHERE level = 1 AND delete_flag = 0) AS firstLevelScenario
         FROM
         lawyer_user user
         LEFT JOIN law_firm firm ON firm.id = user.firm_id
         LEFT JOIN law_firm_payment firmTwo ON firmTwo.firm_id = user.firm_id
-        LEFT JOIN lawyer_service_area area ON area.lawyer_user_id = user.id
-        LEFT JOIN lawyer_legal_problem_scenario a ON a.id = area.problem_scenario_id
+        LEFT JOIN lawyer_service_area area ON area.lawyer_user_id = user.id AND area.delete_flag = 0 AND area.status = 1
+        LEFT JOIN lawyer_legal_problem_scenario a ON a.id = area.problem_scenario_id AND a.delete_flag = 0 AND a.status = 1
         WHERE user.delete_flag = 0
         <if test="name != null and name != ''">AND user.name LIKE CONCAT('%', #{name}, '%')</if>
         <if test="phone != null and phone != ''">AND user.phone LIKE CONCAT('%', #{phone}, '%')</if>

+ 1 - 0
alien-entity/src/main/resources/mapper/OrderReviewMapper.xml

@@ -210,6 +210,7 @@
         LEFT JOIN lawyer_order_review orv ON orv.order_id = lco.id AND orv.delete_flag = 0
         WHERE lco.delete_flag = 0
         AND lco.order_status = 3
+        AND lco.is_appealed = 0
         AND lco.client_user_id = #{userId}
         AND orv.id IS NULL
         ORDER BY lco.end_time DESC

+ 20 - 0
alien-gateway/src/main/java/shop/alien/gateway/config/JwtTokenFilter.java

@@ -23,8 +23,10 @@ import org.springframework.stereotype.Component;
 import org.springframework.web.server.ServerWebExchange;
 import reactor.core.publisher.Flux;
 import reactor.core.publisher.Mono;
+import shop.alien.entity.store.LawyerUser;
 import shop.alien.entity.store.LifeUser;
 import shop.alien.entity.store.StoreUser;
+import shop.alien.gateway.mapper.LawyerUserMapper;
 import shop.alien.gateway.mapper.LifeUserMapper;
 import shop.alien.gateway.mapper.StoreUserMapper;
 import shop.alien.util.common.JwtUtil;
@@ -62,6 +64,9 @@ public class JwtTokenFilter implements GlobalFilter, Ordered {
     @Autowired
     private LifeUserMapper lifeUserMapper;
 
+    @Autowired
+    private LawyerUserMapper lawyerUserMapper;
+
     /**
      * 过滤器
      *
@@ -142,6 +147,21 @@ public class JwtTokenFilter implements GlobalFilter, Ordered {
                             map.put("code", 666);
                         }
                     }
+                    else if ("lawyer".equals(deviceType)) {
+                        //判断程序是否为用户禁用
+                        LawyerUser lawyerUser = lawyerUserMapper.selectOne(new LambdaQueryWrapper<LawyerUser>().eq(LawyerUser::getPhone, phone));
+                        //注销标记, 0:未注销, 1:已注销
+                        if (null != lawyerUser.getLogoutFlag() && lawyerUser.getLogoutFlag() == 1) {
+                            map.put("msg", "你的账号已注销");
+                            //别问, 问就是约定俗成
+                            map.put("code", 777);
+                        }
+                        if (!redisVal.equals(token)) {
+                            map.put("msg", "账号在别处登录");
+                            //别问, 问就是约定俗成
+                            map.put("code", 666);
+                        }
+                    }
                     map.put("success", false);
                     exchange.getResponse().getHeaders().setContentType(MediaType.APPLICATION_JSON);
                     return exchange.getResponse()

+ 9 - 0
alien-lawyer/src/main/java/shop/alien/lawyer/controller/LawyerLegalProblemScenarioController.java

@@ -7,6 +7,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.bind.annotation.*;
 import shop.alien.entity.result.R;
 import shop.alien.entity.store.LawyerLegalProblemScenario;
+import shop.alien.entity.store.dto.LawyerLegalProblemScenarioStatusDto;
 import shop.alien.lawyer.service.LawyerLegalProblemScenarioService;
 import shop.alien.mapper.LawyerImgMapper;
 import shop.alien.util.myBaticsPlus.QueryBuilder;
@@ -137,5 +138,13 @@ public class LawyerLegalProblemScenarioController {
         return lawyerLegalProblemScenarioService.getCategoryTreeByFirstLevelId(id);
     }
 
+    @ApiOperation("设置法律场景启用/禁用状态")
+    @ApiOperationSupport(order = 8)
+    @PostMapping("/setStatus")
+    public R<Boolean> setStatus(@RequestBody LawyerLegalProblemScenarioStatusDto request) {
+        log.info("LawyerLegalProblemScenarioController.setStatus?request={}", request);
+        return lawyerLegalProblemScenarioService.setStatus(request.getId(), request.getStatus());
+    }
+
 }
 

+ 46 - 0
alien-lawyer/src/main/java/shop/alien/lawyer/controller/LawyerUserController.java

@@ -7,10 +7,12 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.bind.annotation.*;
 import shop.alien.entity.result.R;
 import shop.alien.entity.store.LawyerUser;
+import shop.alien.entity.store.dto.LawyerRecommendedDto;
 import shop.alien.entity.store.vo.LawyerUserVo;
 import shop.alien.lawyer.service.LawyerUserService;
 import shop.alien.util.myBaticsPlus.QueryBuilder;
 
+import javax.servlet.http.HttpServletResponse;
 import java.util.List;
 import java.util.Map;
 
@@ -254,6 +256,42 @@ public class LawyerUserController {
         return lawyerUserService.getLawyerList(name, phone, firmId, startTime, endTime, page, size);
     }
 
+    @ApiOperation("导出中台律师列表")
+    @ApiOperationSupport(order = 19)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "name", value = "姓名(支持模糊查询)", dataType = "String", paramType = "query", required = false),
+            @ApiImplicitParam(name = "phone", value = "手机号(支持模糊查询)", dataType = "String", paramType = "query", required = false),
+            @ApiImplicitParam(name = "firmId", value = "律所ID", dataType = "Integer", paramType = "query", required = false),
+            @ApiImplicitParam(name = "startTime", value = "开始日期(用于查询执业开始日期practice_start_date,格式:yyyy-MM-dd)", dataType = "String", paramType = "query", required = false),
+            @ApiImplicitParam(name = "endTime", value = "结束日期(用于查询执业开始日期practice_start_date,格式:yyyy-MM-dd)", dataType = "String", paramType = "query", required = false),
+            @ApiImplicitParam(name = "pageNum", value = "页码(可选,不传或传0则导出全部,传值则导出本页)", dataType = "Integer", paramType = "query"),
+            @ApiImplicitParam(name = "pageSize", value = "页容(可选,与pageNum配合使用)", dataType = "Integer", paramType = "query")
+    })
+    @GetMapping(value = "/exportLawyerList", produces = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
+    public void exportLawyerList(
+            HttpServletResponse response,
+            @RequestParam(required = false) String name,
+            @RequestParam(required = false) String phone,
+            @RequestParam(required = false) Integer firmId,
+            @RequestParam(required = false) String startTime,
+            @RequestParam(required = false) String endTime,
+            @RequestParam(required = false) Integer pageNum,
+            @RequestParam(required = false) Integer pageSize) throws Exception {
+        log.info("LawyerUserController.exportLawyerList?name={},phone={},firmId={},startTime={},endTime={},pageNum={},pageSize={}",
+                name, phone, firmId, startTime, endTime, pageNum, pageSize);
+        try {
+            lawyerUserService.exportLawyerList(response, name, phone, firmId, startTime, endTime, pageNum, pageSize);
+        } catch (Exception e) {
+            log.error("导出律师列表异常", e);
+            if (!response.isCommitted()) {
+                response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+                response.setContentType("application/json;charset=UTF-8");
+                response.getWriter().write("{\"code\":500,\"msg\":\"导出失败:" + e.getMessage() + "\"}");
+            }
+            throw e;
+        }
+    }
+
 
 
 
@@ -285,5 +323,13 @@ public class LawyerUserController {
         return lawyerUserService.getLawyerInfoByPhone(phone);
     }
 
+    @ApiOperation("设置律师推荐状态")
+    @ApiOperationSupport(order = 18)
+    @PostMapping("/isRecommended")
+    public R<Boolean> isRecommended(@RequestBody LawyerRecommendedDto request) {
+        log.info("LawyerUserController.isRecommended?request={}", request);
+        return lawyerUserService.isRecommended(request.getLawyerId(), request.getIsRecommended());
+    }
+
 }
 

+ 9 - 0
alien-lawyer/src/main/java/shop/alien/lawyer/service/LawyerLegalProblemScenarioService.java

@@ -43,5 +43,14 @@ public interface LawyerLegalProblemScenarioService extends IService<LawyerLegalP
      * @return R<LawyerLegalProblemScenario> 返回一级场景及其完整的树形结构(一级场景的children包含所有二级分类,每个二级分类的children包含其下的三级分类)
      */
     R<LawyerLegalProblemScenario> getCategoryTreeByFirstLevelId(Integer id);
+
+    /**
+     * 设置法律场景启用/禁用状态
+     *
+     * @param id 场景ID
+     * @param status 状态,0:禁用,1:启用
+     * @return R<Boolean> 操作结果
+     */
+    R<Boolean> setStatus(Integer id, Integer status);
 }
 

+ 32 - 0
alien-lawyer/src/main/java/shop/alien/lawyer/service/LawyerUserService.java

@@ -7,6 +7,7 @@ import shop.alien.entity.result.R;
 import shop.alien.entity.store.LawyerUser;
 import shop.alien.entity.store.vo.LawyerUserVo;
 
+import javax.servlet.http.HttpServletResponse;
 import java.util.List;
 import java.util.Map;
 
@@ -161,5 +162,36 @@ public interface LawyerUserService extends IService<LawyerUser> {
                                          String endTime,
                                          int page,
                                          int pageSize);
+
+    /**
+     * 设置律师推荐状态
+     *
+     * @param lawyerId 律师ID
+     * @param isRecommended 推荐状态,0:取消推荐,1:推荐
+     * @return R<Boolean> 操作结果
+     */
+    R<Boolean> isRecommended(Integer lawyerId, Integer isRecommended);
+
+    /**
+     * 导出中台律师列表
+     *
+     * @param response HttpServletResponse对象
+     * @param name 姓名(支持模糊查询)
+     * @param phone 手机号(支持模糊查询)
+     * @param firmId 律所ID
+     * @param startTime 开始日期
+     * @param endTime 结束日期
+     * @param pageNum 页码(可选,不传或传0则导出全部)
+     * @param pageSize 页容(可选,与pageNum配合使用)
+     * @throws Exception 导出异常
+     */
+    void exportLawyerList(HttpServletResponse response,
+                          String name,
+                          String phone,
+                          Integer firmId,
+                          String startTime,
+                          String endTime,
+                          Integer pageNum,
+                          Integer pageSize) throws Exception;
 }
 

+ 10 - 16
alien-lawyer/src/main/java/shop/alien/lawyer/service/impl/CommentAppealServiceImpl.java

@@ -156,7 +156,7 @@ public class CommentAppealServiceImpl extends ServiceImpl<CommentAppealMapper, C
             }
 
             // 发送通知
-            sendAuditNotification(appeal, orderReview, status);
+            sendAuditNotification(appeal, orderReview, status, reviewReasons);
 
             return R.success("申诉" + statusText);
         } else {
@@ -200,9 +200,9 @@ public class CommentAppealServiceImpl extends ServiceImpl<CommentAppealMapper, C
 
             com.alibaba.fastjson2.JSONObject jsonObject = new com.alibaba.fastjson2.JSONObject();
             jsonObject.put("message", message);
-            jsonObject.put("orderNumber", orderReview.getOrderNumber());
-            jsonObject.put("appealId", appeal.getId());
-            jsonObject.put("status", "pending"); // 待审核状态
+//            jsonObject.put("orderNumber", orderReview.getOrderNumber());
+//            jsonObject.put("appealId", appeal.getId());
+//            jsonObject.put("status", "pending"); // 待审核状态
             lifeNotice.setContext(jsonObject.toJSONString());
 
             lifeNoticeMapper.insert(lifeNotice);
@@ -222,16 +222,16 @@ public class CommentAppealServiceImpl extends ServiceImpl<CommentAppealMapper, C
      * @param orderReview 评价记录
      * @param status      审核状态 1:已通过, 2:已驳回
      */
-    private void sendAuditNotification(CommentAppeal appeal, OrderReview orderReview, Integer status) {
+    private void sendAuditNotification(CommentAppeal appeal, OrderReview orderReview, Integer status, String reviewReasons) {
         try {
             if (status == 1) {
                 // 审核通过:给评价用户发通知(评价被删除)
                 sendNotificationToReviewUser(orderReview, appeal);
                 // 审核通过:给律师发通知(申诉成功)
-                sendNotificationToLawyer(orderReview, appeal, true);
+                sendNotificationToLawyer(orderReview, appeal, true, null);
             } else {
                 // 审核驳回:给律师发通知(申诉失败)
-                sendNotificationToLawyer(orderReview, appeal, false);
+                sendNotificationToLawyer(orderReview, appeal, false, reviewReasons);
             }
         } catch (Exception e) {
             log.error("发送审核通知失败,appealId={}, status={}, error={}", appeal.getId(), status, e.getMessage(), e);
@@ -253,8 +253,7 @@ public class CommentAppealServiceImpl extends ServiceImpl<CommentAppealMapper, C
             }
 
             String receiverId = "user_" + lifeUser.getUserPhone();
-            String message = String.format("您对订单编号为"+ orderReview.getOrderNumber() +"的评价,律师已进行申诉,经核实,您的评价不实,平台已删除此条评价及回复。",
-                    orderReview.getOrderNumber());
+            String message = String.format("您对订单编号为"+ orderReview.getOrderNumber() +"的评价,律师已进行申诉,经核实,您的评价不实,平台已删除此条评价及回复。");
 
             LifeNotice lifeNotice = new LifeNotice();
             lifeNotice.setReceiverId(receiverId);
@@ -267,8 +266,6 @@ public class CommentAppealServiceImpl extends ServiceImpl<CommentAppealMapper, C
 
             com.alibaba.fastjson2.JSONObject jsonObject = new com.alibaba.fastjson2.JSONObject();
             jsonObject.put("message", message);
-            jsonObject.put("orderNumber", orderReview.getOrderNumber());
-            jsonObject.put("appealId", appeal.getId());
             lifeNotice.setContext(jsonObject.toJSONString());
 
             lifeNoticeMapper.insert(lifeNotice);
@@ -288,7 +285,7 @@ public class CommentAppealServiceImpl extends ServiceImpl<CommentAppealMapper, C
      * @param appeal      申诉记录
      * @param isSuccess   是否成功
      */
-    private void sendNotificationToLawyer(OrderReview orderReview, CommentAppeal appeal, boolean isSuccess) {
+    private void sendNotificationToLawyer(OrderReview orderReview, CommentAppeal appeal, boolean isSuccess, String reviewReasons) {
         try {
             LawyerUser lawyerUser = lawyerUserMapper.selectById(orderReview.getLawyerUserId());
             if (lawyerUser == null) {
@@ -301,7 +298,7 @@ public class CommentAppealServiceImpl extends ServiceImpl<CommentAppealMapper, C
             String title = isSuccess ? "申诉成功通知" : "申诉失败通知";
             String message = isSuccess 
                     ? String.format("您的编号"+ orderReview.getOrderNumber() +"的订单,提交的差评申诉信息,经核实,评价内容不实,平台已删除此条评价。")
-                    : String.format("您的编号"+ orderReview.getOrderNumber() +"的订单,提交的差评申诉信息,经核实,评价内容属实。失败原因:"+ appeal.getReviewReasons() +"。");
+                    : String.format("您的编号"+ orderReview.getOrderNumber() +"的订单,提交的差评申诉信息,经核实,评价内容属实。失败原因:"+ reviewReasons +"。");
 
             LifeNotice lifeNotice = new LifeNotice();
             lifeNotice.setReceiverId(receiverId);
@@ -314,9 +311,6 @@ public class CommentAppealServiceImpl extends ServiceImpl<CommentAppealMapper, C
 
             com.alibaba.fastjson2.JSONObject jsonObject = new com.alibaba.fastjson2.JSONObject();
             jsonObject.put("message", message);
-            jsonObject.put("orderNumber", orderReview.getOrderNumber());
-            jsonObject.put("appealId", appeal.getId());
-            jsonObject.put("status", isSuccess ? "success" : "rejected");
             lifeNotice.setContext(jsonObject.toJSONString());
 
             lifeNoticeMapper.insert(lifeNotice);

+ 1 - 0
alien-lawyer/src/main/java/shop/alien/lawyer/service/impl/LawFirmPaymentServiceImpl.java

@@ -31,3 +31,4 @@ public class LawFirmPaymentServiceImpl extends ServiceImpl<LawFirmPaymentMapper,
 
 
 
+

+ 1 - 0
alien-lawyer/src/main/java/shop/alien/lawyer/service/impl/LawyerConsultationOrderServiceImpl.java

@@ -1263,6 +1263,7 @@ public class LawyerConsultationOrderServiceImpl extends ServiceImpl<LawyerConsul
             LambdaQueryWrapper<LawyerConsultationOrder> allRevenueWrapper = new LambdaQueryWrapper<>();
             allRevenueWrapper.eq(LawyerConsultationOrder::getLawyerUserId, lawyerConsultationOrderVO.getLawyerUserId())
                     .eq(LawyerConsultationOrder::getPaymentStatus, 1) // 已支付
+                    .in(LawyerConsultationOrder::getOrderStatus, 2,3) // 订单状态=3(已完成)2(进行中)
                     .eq(LawyerConsultationOrder::getDeleteFlag, 0);
             
             // 添加时间段筛选条件(根据支付时间)

+ 34 - 0
alien-lawyer/src/main/java/shop/alien/lawyer/service/impl/LawyerLegalProblemScenarioServiceImpl.java

@@ -161,5 +161,39 @@ public class LawyerLegalProblemScenarioServiceImpl extends ServiceImpl<LawyerLeg
         return R.data(firstLevel);
     }
 
+    @Override
+    public R<Boolean> setStatus(Integer id, Integer status) {
+        log.info("LawyerLegalProblemScenarioServiceImpl.setStatus?id={},status={}", id, status);
+
+        // 参数校验
+        if (id == null) {
+            log.warn("设置法律场景状态失败:场景ID为空");
+            return R.fail("场景ID不能为空");
+        }
+
+        if (status == null || (status != 0 && status != 1)) {
+            log.warn("设置法律场景状态失败:状态参数无效,status={}", status);
+            return R.fail("状态参数无效,必须为0(禁用)或1(启用)");
+        }
+
+        // 查询场景信息
+        LawyerLegalProblemScenario scenario = this.getById(id);
+        if (scenario == null) {
+            log.warn("设置法律场景状态失败:场景不存在,场景ID={}", id);
+            return R.fail("场景不存在");
+        }
+
+        // 更新状态
+        scenario.setStatus(status);
+        boolean result = this.updateById(scenario);
+        if (result) {
+            log.info("设置法律场景状态成功:场景ID={},状态={}", id, status);
+            return R.success("设置成功");
+        } else {
+            log.warn("设置法律场景状态失败:更新数据库失败,场景ID={},状态={}", id, status);
+            return R.fail("设置失败");
+        }
+    }
+
 }
 

+ 5 - 1
alien-lawyer/src/main/java/shop/alien/lawyer/service/impl/LawyerUserLogInServiceImpl.java

@@ -42,6 +42,9 @@ public class LawyerUserLogInServiceImpl extends ServiceImpl<LawyerUserMapper, La
     @Value("${jwt.expiration-time}")
     private String effectiveTime;
 
+    @Value("${order.lawyerFee}")
+    private String lawyerFee;
+
     /**
      * 设定初始化默认密码
      */
@@ -111,8 +114,9 @@ public class LawyerUserLogInServiceImpl extends ServiceImpl<LawyerUserMapper, La
             user.setDeleteFlag(0);
             user.setIsOnline(1);
             user.setIsRecommended(0);
-            user.setOrderReceivingStatus(0);
+            user.setOrderReceivingStatus(1);
             user.setPassType(2);
+            user.setConsultationFee(Integer.parseInt(lawyerFee));
             lawyerUserMapper.insert(user);
             List<Integer> problemScenarioIds = lawyerUserDto.getProblemScenarioIds();
             for (int i = 0; i < problemScenarioIds.size(); i++) {

+ 170 - 0
alien-lawyer/src/main/java/shop/alien/lawyer/service/impl/LawyerUserServiceImpl.java

@@ -15,6 +15,7 @@ import org.springframework.util.CollectionUtils;
 import org.springframework.util.StringUtils;
 import shop.alien.entity.result.R;
 import shop.alien.entity.store.*;
+import shop.alien.entity.store.excelVo.LawyerUserExcelVo;
 import shop.alien.entity.store.vo.LawyerUserVo;
 import shop.alien.lawyer.config.BaseRedisService;
 import shop.alien.lawyer.service.LawyerLegalProblemScenarioService;
@@ -24,7 +25,10 @@ import shop.alien.lawyer.service.LawyerUserService;
 import shop.alien.mapper.*;
 import shop.alien.entity.store.OrderReview;
 import shop.alien.util.common.ListToPage;
+import shop.alien.util.excel.EasyExcelUtil;
 
+import javax.servlet.http.HttpServletResponse;
+import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -743,5 +747,171 @@ public class LawyerUserServiceImpl extends ServiceImpl<LawyerUserMapper, LawyerU
 
         return R.data(ListToPage.setPage(list, page, size));
     }
+
+    @Override
+    public R<Boolean> isRecommended(Integer lawyerId, Integer isRecommended) {
+        log.info("LawyerUserServiceImpl.isRecommended?lawyerId={},isRecommended={}", lawyerId, isRecommended);
+
+        // 参数校验
+        if (lawyerId == null) {
+            log.warn("设置律师推荐状态失败:律师ID为空");
+            return R.fail("律师ID不能为空");
+        }
+
+        if (isRecommended == null || (isRecommended != 0 && isRecommended != 1)) {
+            log.warn("设置律师推荐状态失败:推荐状态参数无效,isRecommended={}", isRecommended);
+            return R.fail("推荐状态参数无效,必须为0(取消推荐)或1(推荐)");
+        }
+
+        // 查询律师信息
+        LawyerUser lawyerUser = this.getById(lawyerId);
+        if (lawyerUser == null) {
+            log.warn("设置律师推荐状态失败:律师不存在,律师ID={}", lawyerId);
+            return R.fail("律师不存在");
+        }
+
+        // 更新推荐状态
+        lawyerUser.setIsRecommended(isRecommended);
+        boolean result = this.updateById(lawyerUser);
+        if (result) {
+            log.info("设置律师推荐状态成功:律师ID={},推荐状态={}", lawyerId, isRecommended);
+            return R.success("设置成功");
+        } else {
+            log.warn("设置律师推荐状态失败:更新数据库失败,律师ID={},推荐状态={}", lawyerId, isRecommended);
+            return R.fail("设置失败");
+        }
+    }
+
+    @Override
+    public void exportLawyerList(HttpServletResponse response,
+                                 String name,
+                                 String phone,
+                                 Integer firmId,
+                                 String startTime,
+                                 String endTime,
+                                 Integer pageNum,
+                                 Integer pageSize) throws Exception {
+        log.info("LawyerUserServiceImpl.exportLawyerList?name={},phone={},firmId={},startTime={},endTime={},pageNum={},pageSize={}",
+                name, phone, firmId, startTime, endTime, pageNum, pageSize);
+
+        // 如果pageNum为null或0,则导出全部数据(设置一个很大的pageSize)
+        int page = (pageNum == null || pageNum == 0) ? 1 : pageNum;
+        int size = (pageNum == null || pageNum == 0) ? Integer.MAX_VALUE : (pageSize == null ? 10 : pageSize);
+
+        // 调用查询接口获取数据
+        R<IPage<LawyerUserVo>> result = getLawyerList(name, phone, firmId, startTime, endTime, page, size);
+
+        if (result == null || !result.isSuccess()) {
+            log.warn("获取律师列表失败:{}", result != null ? result.getMsg() : "返回结果为空");
+            throw new RuntimeException(result != null ? result.getMsg() : "获取数据失败,请稍后重试");
+        }
+
+        IPage<LawyerUserVo> pageResult = result.getData();
+        if (pageResult == null || pageResult.getRecords() == null || pageResult.getRecords().isEmpty()) {
+            log.warn("律师列表导出:无数据可导出");
+            throw new IllegalArgumentException("暂无数据可导出");
+        }
+
+        List<LawyerUserVo> voList = pageResult.getRecords();
+        log.info("律师列表导出:查询到{}条数据,导出{}条数据", pageResult.getTotal(), voList.size());
+
+        // 转换为Excel VO
+        List<LawyerUserExcelVo> excelVoList = convertToExcelVo(voList);
+
+        // 使用EasyExcelUtil导出
+        EasyExcelUtil.exportExcel(response, excelVoList, LawyerUserExcelVo.class, "中台律师列表", "中台律师列表");
+    }
+
+    /**
+     * 将LawyerUserVo转换为LawyerUserExcelVo
+     *
+     * @param voList LawyerUserVo列表
+     * @return LawyerUserExcelVo列表
+     */
+    private List<LawyerUserExcelVo> convertToExcelVo(List<LawyerUserVo> voList) {
+        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+        SimpleDateFormat dateTimeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+
+        return voList.stream().map(vo -> {
+            LawyerUserExcelVo excelVo = new LawyerUserExcelVo();
+            excelVo.setId(vo.getId());
+            excelVo.setName(vo.getName());
+            excelVo.setPhone(vo.getPhone());
+            excelVo.setFirmName(vo.getFirmName());
+//            excelVo.setLawyerCertificateNo(vo.getLawyerCertificateNo());
+//            excelVo.setPracticeYears(vo.getPracticeYears());
+//            excelVo.setServiceScore(vo.getServiceScore());
+//            excelVo.setServiceCount(vo.getServiceCount());
+            excelVo.setFirmId(vo.getFirmId());
+
+            // 转换执业开始日期
+//            if (vo.getPracticeStartDate() != null) {
+//                excelVo.setPracticeStartDate(dateFormat.format(vo.getPracticeStartDate()));
+//            }
+//
+//            // 转换用户状态
+//            if (vo.getStatus() != null) {
+//                excelVo.setStatusValue(vo.getStatus());
+//                excelVo.setStatus(vo.getStatus() == 1 ? "启用" : "禁用");
+//            }
+
+            // 转换资质认证状态
+//            if (vo.getCertificationStatus() != null) {
+//                excelVo.setCertificationStatusValue(vo.getCertificationStatus());
+//                switch (vo.getCertificationStatus()) {
+//                    case 0:
+//                        excelVo.setCertificationStatus("未认证");
+//                        break;
+//                    case 1:
+//                        excelVo.setCertificationStatus("认证中");
+//                        break;
+//                    case 2:
+//                        excelVo.setCertificationStatus("已认证");
+//                        break;
+//                    case 3:
+//                        excelVo.setCertificationStatus("认证失败");
+//                        break;
+//                    default:
+//                        excelVo.setCertificationStatus("未知");
+//                }
+//            }
+
+            // 转换是否推荐
+            if (vo.getIsRecommended() != null) {
+                excelVo.setIsRecommendedValue(vo.getIsRecommended());
+                excelVo.setIsRecommended(vo.getIsRecommended() == 1 ? "推荐" : "不推荐");
+            }
+
+            // 转换法律场景
+            if (vo.getScenarioNames() != null && !vo.getScenarioNames().isEmpty()) {
+                excelVo.setScenarioNames(vo.getScenarioNames());
+            } else {
+                excelVo.setScenarioNames("");
+            }
+
+            // 转换接单状态
+            if (vo.getOrderReceivingStatus() != null) {
+                excelVo.setOrderReceivingStatusValue(vo.getOrderReceivingStatus());
+                excelVo.setOrderReceivingStatus(vo.getOrderReceivingStatus() == 1 ? "接单中" : "不接单");
+            } else {
+                excelVo.setOrderReceivingStatus("未知");
+            }
+
+            // 设置收款账号
+            if (vo.getPaymentNum() != null && !vo.getPaymentNum().isEmpty()) {
+                excelVo.setPaymentNum(vo.getPaymentNum());
+            } else {
+                excelVo.setPaymentNum("");
+            }
+
+            // 转换创建时间
+//            if (vo.getCreatedTime() != null) {
+//                excelVo.setCreatedTimeValue(vo.getCreatedTime());
+//                excelVo.setCreatedTime(dateTimeFormat.format(vo.getCreatedTime()));
+//            }
+
+            return excelVo;
+        }).collect(Collectors.toList());
+    }
 }