dongxin 1 год назад
Родитель
Сommit
a6836ebda1
33 измененных файлов с 1409 добавлено и 12 удалено
  1. 27 1
      commons/src/main/java/com/jzg/commons/config/resttemplate/RestTemplateConfig.java
  2. 25 0
      commons/src/main/java/com/jzg/commons/entity/dto/AmountAuditEditParam.java
  3. 45 0
      commons/src/main/java/com/jzg/commons/entity/dto/AmountAuditParam.java
  4. 18 0
      commons/src/main/java/com/jzg/commons/entity/dto/AmountAuditRejectParam.java
  5. 2 1
      commons/src/main/java/com/jzg/commons/entity/dto/FeeAuditParam.java
  6. 27 0
      commons/src/main/java/com/jzg/commons/entity/dto/SysUserAccountPageParam.java
  7. 27 0
      commons/src/main/java/com/jzg/commons/entity/dto/SysUserAccountParam.java
  8. 1 1
      commons/src/main/java/com/jzg/commons/entity/orders/vo/FeeAuditVo.java
  9. 85 0
      commons/src/main/java/com/jzg/commons/entity/po/SysAmountAuditing.java
  10. 37 0
      commons/src/main/java/com/jzg/commons/entity/po/SysUserAccount.java
  11. 59 0
      commons/src/main/java/com/jzg/commons/entity/vo/AmountAuditVo.java
  12. 39 0
      commons/src/main/java/com/jzg/commons/entity/vo/SysUserAccountVo.java
  13. 22 0
      commons/src/main/java/com/jzg/commons/entity/vo/UserAccountStatisVo.java
  14. 1 1
      gateway/src/main/resources/application-dev.yml
  15. 19 0
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/client/OrgClient.java
  16. 37 6
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsFeeAuditServiceImpl.java
  17. 2 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/state/config/AuditStateConfig.java
  18. 23 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/state/listener/AuditStateListener.java
  19. 4 1
      tenant/insurance/quotation-summary/src/main/resources/mapper/InsFeeAuditMapper.xml
  20. 1 1
      tenant/organization/src/main/java/com/jzg/organization/client/EsmInsCompanyClient.java
  21. 87 0
      tenant/organization/src/main/java/com/jzg/organization/controller/AmountAuditingController.java
  22. 78 0
      tenant/organization/src/main/java/com/jzg/organization/controller/UserAccountController.java
  23. 29 0
      tenant/organization/src/main/java/com/jzg/organization/mapper/SysAmountAuditingMapper.java
  24. 38 0
      tenant/organization/src/main/java/com/jzg/organization/mapper/SysUserAccountMapper.java
  25. 56 0
      tenant/organization/src/main/java/com/jzg/organization/service/SysAmountAuditingService.java
  26. 38 0
      tenant/organization/src/main/java/com/jzg/organization/service/SysUserAccountService.java
  27. 200 0
      tenant/organization/src/main/java/com/jzg/organization/service/impl/SysAmountAuditingServiceImpl.java
  28. 47 0
      tenant/organization/src/main/java/com/jzg/organization/service/impl/SysUserAccountServiceImpl.java
  29. 39 0
      tenant/organization/src/main/java/com/jzg/organization/state/AuditState.java
  30. 34 0
      tenant/organization/src/main/java/com/jzg/organization/state/config/AuditStateConfig.java
  31. 100 0
      tenant/organization/src/main/java/com/jzg/organization/state/listener/AuditStateListener.java
  32. 89 0
      tenant/organization/src/main/resources/mapper/SysAmountAuditingMapper.xml
  33. 73 0
      tenant/organization/src/main/resources/mapper/SysUserAccountMapper.xml

+ 27 - 1
commons/src/main/java/com/jzg/commons/config/resttemplate/RestTemplateConfig.java

@@ -8,13 +8,20 @@ import org.apache.hc.core5.util.Timeout;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Primary;
+import org.springframework.http.MediaType;
 import org.springframework.http.client.ClientHttpRequestFactory;
 import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
+import org.springframework.http.converter.HttpMessageConverter;
+import org.springframework.http.converter.StringHttpMessageConverter;
+import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
 import org.springframework.web.client.RestTemplate;
 
+import java.nio.charset.Charset;
 import java.security.KeyManagementException;
 import java.security.NoSuchAlgorithmException;
+import java.util.ArrayList;
 import java.util.Collections;
+import java.util.List;
 
 @Configuration
 public class RestTemplateConfig {
@@ -45,6 +52,26 @@ public class RestTemplateConfig {
         RestTemplate restTemplate = new RestTemplate(httpRequestFactory());
         restTemplate.setErrorHandler(new CustomResponseErrorHandler());
         restTemplate.setInterceptors(Collections.singletonList(new RestTemplateRequestInterceptor()));
+
+        // 替换默认的 StringHttpMessageConverter,支持 GBK
+        List<HttpMessageConverter<?>> messageConverters = new ArrayList<>();
+        for (HttpMessageConverter<?> converter : restTemplate.getMessageConverters()) {
+            if (converter instanceof StringHttpMessageConverter) {
+                messageConverters.add(new StringHttpMessageConverter(Charset.forName("GBK")));
+            } else {
+                messageConverters.add(converter);
+            }
+        }
+
+        // 增加支持 GBK 的 MappingJackson2HttpMessageConverter
+        MappingJackson2HttpMessageConverter jackson2Converter = new MappingJackson2HttpMessageConverter();
+        List<MediaType> mediaTypes = new ArrayList<>(jackson2Converter.getSupportedMediaTypes());
+        mediaTypes.add(MediaType.valueOf("text/json;charset=GBK"));  // 重点
+        jackson2Converter.setSupportedMediaTypes(mediaTypes);
+
+        messageConverters.add(jackson2Converter);
+
+        restTemplate.setMessageConverters(messageConverters);
         return restTemplate;
     }
 
@@ -86,5 +113,4 @@ public class RestTemplateConfig {
         return restTemplate;
     }
 
-
 }

+ 25 - 0
commons/src/main/java/com/jzg/commons/entity/dto/AmountAuditEditParam.java

@@ -0,0 +1,25 @@
+package com.jzg.commons.entity.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+@Schema(description = "提现申请修改dto")
+@Data
+public class AmountAuditEditParam {
+
+    @NotNull(message = "提现申请id不能为空")
+    @Schema(description = "提现申请id")
+    private String id;
+
+    @NotNull(message = "请输入付款凭证号")
+    @Schema(description = "凭证号")
+    private String voucherId;
+
+    @NotNull(message = "请上传凭证材料")
+    @Schema(description = "图片id")
+    private String picId;
+
+    @Schema(description = "付款账户id")
+    private String accountId;
+}

+ 45 - 0
commons/src/main/java/com/jzg/commons/entity/dto/AmountAuditParam.java

@@ -0,0 +1,45 @@
+package com.jzg.commons.entity.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.jzg.commons.core.base.PageRequest;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "提现申请分页查询dto")
+@Data
+public class AmountAuditParam extends PageRequest {
+
+    @Schema(description = "业务员")
+    private String salesman;
+
+    @Schema(description = "业务员类型1.前线人员 2:后线人员 3:合伙人 4:工作室管理员 5:团队 6:个代 7:电销 8 渠道")
+    private String attrType;
+
+    @Schema(description = "提现时间开始")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDateTime createTimeStart;
+
+    @Schema(description = "提现时间结束")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDateTime createTimeEnd;
+
+    @Schema(description = "审核时间开始")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDateTime auditTimeStart;
+
+    @Schema(description = "审核时间结束")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDateTime auditTimeEnd;
+
+    @Schema(description = "审核人")
+    private String auditingUser;
+
+    @Schema(description = "付款状态 0.待付款 1.已付款 2.拒绝付款")
+    private String auditingStatus;
+
+    @Schema(description = "领取人")
+    private String receiveUser;
+
+}

+ 18 - 0
commons/src/main/java/com/jzg/commons/entity/dto/AmountAuditRejectParam.java

@@ -0,0 +1,18 @@
+package com.jzg.commons.entity.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+@Schema(description = "提现申请驳回dto")
+@Data
+public class AmountAuditRejectParam {
+
+    @NotNull(message = "提现申请id不能为空")
+    @Schema(description = "提现申请id")
+    private String id;
+
+    @NotNull(message = "驳回原因不能为空")
+    @Schema(description = "驳回原因")
+    private String rejectReason;
+}

+ 2 - 1
commons/src/main/java/com/jzg/commons/entity/dto/FeeAuditParam.java

@@ -103,6 +103,7 @@ public class FeeAuditParam extends PageRequest {
     @Schema(description = "费用审核状态0未审核 1审核通过 2.审核不通过")
     private Integer auditStatus;
 
-
+    @Schema(description = "是否是疑问订单 0.否 1.是")
+    private Integer isProblem;
 
 }

+ 27 - 0
commons/src/main/java/com/jzg/commons/entity/dto/SysUserAccountPageParam.java

@@ -0,0 +1,27 @@
+package com.jzg.commons.entity.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.jzg.commons.core.base.PageRequest;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "用户账户分页查询dto")
+@Data
+public class SysUserAccountPageParam extends PageRequest {
+
+    @Schema(description = "业务员")
+    private String salesman;
+
+    @Schema(description = "业务员类型1.前线人员 2:后线人员 3:合伙人 4:工作室管理员 5:团队 6:个代 7:电销 8 渠道")
+    private String attrType;
+
+    @Schema(description = "统计日期开始")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDateTime createTimeStart;
+
+    @Schema(description = "统计日期结束")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDateTime createTimeEnd;
+}

+ 27 - 0
commons/src/main/java/com/jzg/commons/entity/dto/SysUserAccountParam.java

@@ -0,0 +1,27 @@
+package com.jzg.commons.entity.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "应付统计查询dto")
+@Data
+public class SysUserAccountParam {
+
+    @Schema(description = "业务员")
+    private String salesman;
+
+    @Schema(description = "业务员类型1.前线人员 2:后线人员 3:合伙人 4:工作室管理员 5:团队 6:个代 7:电销 8 渠道")
+    private String attrType;
+
+    @Schema(description = "统计日期开始")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDateTime createTimeStart;
+
+    @Schema(description = "统计日期结束")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDateTime createTimeEnd;
+
+}

+ 1 - 1
commons/src/main/java/com/jzg/commons/entity/orders/vo/FeeAuditVo.java

@@ -40,7 +40,7 @@ public class FeeAuditVo extends BaseModel {
 
     @Schema(description = "签单时间")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private LocalDate signingTime;
+    private LocalDateTime signingTime;
 
     @Schema(description = "报价时间")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")

+ 85 - 0
commons/src/main/java/com/jzg/commons/entity/po/SysAmountAuditing.java

@@ -0,0 +1,85 @@
+package com.jzg.commons.entity.po;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.jzg.commons.core.base.BaseModel;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+/**
+ * 提现申请表
+ * @TableName sys_amount_auditing
+ */
+@Data
+@Schema(description = "提现申请表")
+@AllArgsConstructor
+public class SysAmountAuditing extends BaseModel {
+
+    @Schema(description = "主键")
+    @TableId
+    private String id;
+
+    @Schema(description = "银行卡号")
+    private String bankNumber;
+
+    @Schema(description = "提现金额")
+    private BigDecimal amount;
+
+    @Schema(description = "账户余额")
+    private BigDecimal balanceAmount;
+
+    @Schema(description = "业务员用户Id")
+    private String userId;
+
+    @Schema(description = "付款状态 0.待付款 1.已付款 2.拒绝付款")
+    private Integer auditingStatus;
+
+    @Schema(description = "审核时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime auditingTime;
+
+    @Schema(description = "审核人id")
+    private String auditingUserId;
+
+    @Schema(description = "凭证号")
+    private String voucherId;
+
+    @Schema(description = "图片id")
+    private String picId;
+
+    @Schema(description = "驳回原因")
+    private String rejectReason;
+
+    @Schema(description = "账户名称")
+    private String accountName;
+
+    @Schema(description = "内部银行卡号")
+    private String bankCardNum;
+
+    @Schema(description = "内部银行卡开户行名称")
+    private String bankName;
+
+    @Schema(description = "内部银行卡开户行号")
+    private String bankNum;
+
+    @Schema(description = "付款账户id")
+    private String accountId;
+
+    @Schema(description = "领取时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime receiveTime;
+
+    @Schema(description = "领取人")
+    private String receiveUser;
+
+    @Schema(description = "系统code")
+    private String systemCode;
+
+}

+ 37 - 0
commons/src/main/java/com/jzg/commons/entity/po/SysUserAccount.java

@@ -0,0 +1,37 @@
+package com.jzg.commons.entity.po;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+import com.jzg.commons.core.base.BaseModel;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 用户账户表
+ * @TableName sys_user_account
+ */
+@Schema(description = "用户账户表")
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class SysUserAccount extends BaseModel {
+
+    @Schema(description = "主键")
+    private String id;
+
+    @Schema(description = "用户id")
+    private String userId;
+
+    @Schema(description = "账号总金额")
+    private BigDecimal sumAmount;
+
+    @Schema(description = "已付总金额")
+    private BigDecimal sumAmountPaid;
+
+    @Schema(description = "未付总金额")
+    private BigDecimal sumAmountUnpaid;
+}

+ 59 - 0
commons/src/main/java/com/jzg/commons/entity/vo/AmountAuditVo.java

@@ -0,0 +1,59 @@
+package com.jzg.commons.entity.vo;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.jzg.commons.core.base.BaseModel;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+@Schema(description = "提现申请表VO")
+@Data
+public class AmountAuditVo  extends BaseModel {
+
+    @Schema(description = "主键")
+    private String id;
+
+    @Schema(description = "业务员姓名")
+    private String name;
+
+    @Schema(description = "业务员手机号")
+    private String mobile;
+
+    @Schema(description = "管理人姓名")
+    private String managerName;
+
+    @Schema(description = "管理人手机号")
+    private String managerMobile;
+
+    @Schema(description = "业务员类型1.前线人员 2:后线人员 3:合伙人 4:工作室管理员 5:团队 6:个代 7:电销 8 渠道")
+    private String attrType;
+
+    @Schema(description = "提现时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime createTime;
+
+    @Schema(description = "提现金额")
+    private BigDecimal amount;
+
+    @Schema(description = "账户余额")
+    private BigDecimal balanceAmount;
+
+    @Schema(description = "账户名称")
+    private String accountName;
+
+    @Schema(description = "内部银行卡号")
+    private String bankCardNum;
+
+    @Schema(description = "内部银行卡开户行名称")
+    private String bankName;
+
+    @Schema(description = "内部银行卡开户行号")
+    private String bankNum;
+
+
+
+}

+ 39 - 0
commons/src/main/java/com/jzg/commons/entity/vo/SysUserAccountVo.java

@@ -0,0 +1,39 @@
+package com.jzg.commons.entity.vo;
+
+import com.jzg.commons.core.base.BaseModel;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Schema(description = "用户账户表VO")
+@Data
+public class SysUserAccountVo extends BaseModel {
+
+    @Schema(description = "主键")
+    private String id;
+
+    @Schema(description = "业务员姓名")
+    private String name;
+
+    @Schema(description = "业务员手机号")
+    private String mobile;
+
+    @Schema(description = "业务员类型1.前线人员 2:后线人员 3:合伙人 4:工作室管理员 5:团队 6:个代 7:电销 8 渠道")
+    private String attrType;
+
+    @Schema(description = "归属")
+    private String organizationName;
+
+    @Schema(description = "所属机构")
+    private String deptName;
+
+    @Schema(description = "账号总金额")
+    private BigDecimal sumAmount;
+
+    @Schema(description = "已付总金额")
+    private BigDecimal sumAmountPaid;
+
+    @Schema(description = "未付总金额")
+    private BigDecimal sumAmountUnpaid;
+}

+ 22 - 0
commons/src/main/java/com/jzg/commons/entity/vo/UserAccountStatisVo.java

@@ -0,0 +1,22 @@
+package com.jzg.commons.entity.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Schema(description = "应付统计表VO")
+@Data
+public class UserAccountStatisVo {
+
+    @Schema(description = "业务员人数")
+    private Integer salespersonCount;
+
+    @Schema(description = "应付总计")
+    private Double payableSum;
+
+    @Schema(description = "已付总计")
+    private Double paidSum;
+
+    @Schema(description = "未付总计")
+    private Double notPaidSum;
+
+}

+ 1 - 1
gateway/src/main/resources/application-dev.yml

@@ -38,7 +38,7 @@ spring:
         - id: summary_route
           uri: http://localhost:9898/
           predicates:
-            - Path= /order/identify/** ,/supplementOrder/**,/order/carModel/**,/unify/**,/order/taskImages/**,/order/qrCode/**,/orderTrack/**
+            - Path= /order/identify/** ,/supplementOrder/**,/order/carModel/**,/unify/**,/order/taskImages/**,/order/qrCode/**,/orderTrack/**,/feeAudit/**
 
         - id: costsorrule_route
           uri: http://localhost:8085/

+ 19 - 0
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/client/OrgClient.java

@@ -7,6 +7,7 @@ import com.jzg.commons.entity.enums.MessageCodeEnum;
 import com.jzg.commons.entity.po.PtlAgreement;
 import com.jzg.commons.entity.po.PtlAgreementUndwrtRulesAttr;
 import com.jzg.commons.entity.po.SysMessageTemplate;
+import com.jzg.commons.entity.po.SysUserAccount;
 import com.jzg.commons.entity.quote.vo.orders.InsOrdersVo;
 import com.jzg.commons.entity.vo.*;
 import org.springframework.cloud.openfeign.FeignClient;
@@ -70,4 +71,22 @@ public interface OrgClient {
 
     @GetMapping(value = "/userInfo/getUserByMobile")
     public SalesmanVo getUserByMobile(@RequestParam String mobile, @RequestHeader("Authorization") String authToken);
+
+    /**
+     * 用户账户信息查询
+     * @param userId
+     * @param authToken
+     * @return
+     */
+    @GetMapping(value = "/userAccount/accountGet")
+    public HttpResult<SysUserAccount> accountGet(@RequestParam String userId, @RequestHeader("Authorization") String authToken);
+
+    /**
+     * 用户账户信息保存
+     * @param userAccount
+     * @param authToken
+     * @return
+     */
+    @PostMapping(value = "/userAccount/saveOrUpdate")
+    public HttpResult saveOrUpdate(@RequestBody SysUserAccount userAccount, @RequestHeader("Authorization") String authToken);
 }

+ 37 - 6
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsFeeAuditServiceImpl.java

@@ -5,7 +5,9 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jzg.commons.constants.dict.InsOrderStatusEnum;
 import com.jzg.commons.core.base.BaseController;
+import com.jzg.commons.core.base.StateResult;
 import com.jzg.commons.core.page.HttpResult;
 import com.jzg.commons.entity.dto.FeeAuditParam;
 import com.jzg.commons.entity.dto.VerifyOrderParam;
@@ -13,6 +15,7 @@ import com.jzg.commons.entity.orders.po.*;
 import com.jzg.commons.entity.orders.vo.AuditCostInfoVo;
 import com.jzg.commons.entity.orders.vo.FeeAuditVo;
 import com.jzg.commons.entity.po.InsFeeOrders;
+import com.jzg.commons.entity.po.SysUserAccount;
 import com.jzg.commons.entity.quote.vo.aggregated.QuoteEchoVo;
 import com.jzg.commons.entity.vo.AgreementInfoVo;
 import com.jzg.commons.entity.vo.AgreementVo;
@@ -26,6 +29,9 @@ import com.jzg.quotation.commons.client.OrgClient;
 import com.jzg.quotation.commons.client.PlatformClient;
 import com.jzg.quotation.summary.mapper.InsFeeAuditMapper;
 import com.jzg.quotation.summary.service.*;
+import com.jzg.quotation.summary.state.AuditState;
+import com.jzg.quotation.summary.state.listener.AuditStateListener;
+import com.jzg.quotation.summary.state.listener.OrderStateListener;
 import lombok.RequiredArgsConstructor;
 import org.hibernate.validator.internal.util.stereotypes.Lazy;
 import org.redisson.api.RBucket;
@@ -83,6 +89,8 @@ public class InsFeeAuditServiceImpl extends ServiceImpl<InsFeeAuditMapper, InsFe
     @Autowired
     private InsFeeOrdersService feeOrdersService;
 
+    @Autowired
+    private AuditStateListener auditStateListener;
 
     private static final String ORDER_LOCK_PREFIX = "orderLock:";
 
@@ -91,10 +99,12 @@ public class InsFeeAuditServiceImpl extends ServiceImpl<InsFeeAuditMapper, InsFe
     public Page<FeeAuditVo> queryPage(FeeAuditParam param) {
         // 获取选中的保险公司条件
         String companyId = param.getCompanyId();
-        HttpResult<List<String>> result = platformClient.getChildCompanyId(companyId);
-        AssertionUtils.isFail(Objects.isNull(result.getData()),"获取保险公司下级失败!");
-        List<String> companyIdList = result.getData();
-        param.setCompanyIdList(companyIdList);
+        if(StringUtils.isNotBlank(companyId)){
+            HttpResult<List<String>> result = platformClient.getChildCompanyId(companyId);
+            AssertionUtils.isFail(Objects.isNull(result.getData()),"获取保险公司下级失败!");
+            List<String> companyIdList = result.getData();
+            param.setCompanyIdList(companyIdList);
+        }
         Page<FeeAuditVo> page = baseMapper.queryPage(param.getPage(), param);
         return page;
     }
@@ -253,6 +263,7 @@ public class InsFeeAuditServiceImpl extends ServiceImpl<InsFeeAuditMapper, InsFe
     @Override
     public void verifyOrder(VerifyOrderParam param) {
         InsFeeAudit audit = this.getById(param.getOrderNo());
+        InsOrders orders = insOrdersService.getById(audit.getOrderNo());
         if(audit.getAuditStatus() > 0){
             AssertionUtils.isFail(true, "订单已审核刷新订单详情页!");
         }
@@ -263,8 +274,28 @@ public class InsFeeAuditServiceImpl extends ServiceImpl<InsFeeAuditMapper, InsFe
         if (!userName.equals(audit.getReceiveUser())) {
             AssertionUtils.isFail(true, "订单已被"+audit.getReceiveUser()+"领取返回待审核订单列表!");
         }
-
-        audit.setAuditStatus(param.getAuditStatus());
+        if(param.getAuditStatus().equals(1)){
+            StateResult stateFailResult = auditStateListener.statusChange(AuditState.AuditStateEnum.SUCCESS_AUDIT,audit.getAuditStatus()+"");
+            audit.setAuditStatus(stateFailResult.getCurrentState());
+
+            // 更新用户账户
+            InsFeeOrders feeOrders = feeOrdersService.getById(param.getOrderNo());
+            HttpResult<SysUserAccount> result = orgClient.accountGet(orders.getRealQuoteUserId(), baseController.getToken());
+            AssertionUtils.isFail(result.getCode() != 200,"获取用户账户失败!");
+            SysUserAccount userAccount = result.getData();
+            if(Objects.isNull(userAccount)){
+                userAccount.setUserId(orders.getRealQuoteUserId());
+                userAccount.setSumAmount(feeOrders.getTotalReceivablePremium());
+                userAccount.setSumAmountUnpaid(feeOrders.getTotalReceivablePremium());
+            }else{
+                userAccount.setSumAmount(feeOrders.getTotalReceivablePremium().add(userAccount.getSumAmount()));
+                userAccount.setSumAmountUnpaid(feeOrders.getTotalReceivablePremium().add(userAccount.getSumAmount()));
+            }
+            orgClient.saveOrUpdate(userAccount, baseController.getToken());
+        }else{
+            StateResult stateFailResult = auditStateListener.statusChange(AuditState.AuditStateEnum.FAIL_AUDIT,audit.getAuditStatus()+"");
+            audit.setAuditStatus(stateFailResult.getCurrentState());
+        }
         audit.setRefuse(param.getRefuse());
         audit.setIsProblem(0);
         this.updateById(audit);

+ 2 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/state/config/AuditStateConfig.java

@@ -3,12 +3,14 @@ package com.jzg.quotation.summary.state.config;
 import com.jzg.quotation.summary.state.AuditState;
 import com.jzg.quotation.summary.state.OrderState;
 import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.statemachine.StateMachine;
 import org.springframework.statemachine.config.StateMachineBuilder;
 import org.springframework.statemachine.config.StateMachineConfigurerAdapter;
 
 import java.util.EnumSet;
 
+@Configuration
 public class AuditStateConfig extends StateMachineConfigurerAdapter<AuditState.AuditStateEnum, AuditState.AuditStateEvent> {
 
 

+ 23 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/state/listener/AuditStateListener.java

@@ -1,6 +1,8 @@
 package com.jzg.quotation.summary.state.listener;
 
+import com.jzg.commons.constants.dict.InsOrderStatusEnum;
 import com.jzg.commons.core.base.StateResult;
+import com.jzg.commons.util.AssertionUtils;
 import com.jzg.quotation.summary.state.AuditState;
 import jakarta.annotation.Resource;
 import org.springframework.messaging.Message;
@@ -8,11 +10,13 @@ import org.springframework.messaging.support.MessageBuilder;
 import org.springframework.statemachine.StateMachine;
 import org.springframework.statemachine.StateMachineEventResult;
 import org.springframework.statemachine.support.DefaultStateMachineContext;
+import org.springframework.stereotype.Component;
 import reactor.core.publisher.Flux;
 import reactor.core.publisher.Mono;
 
 import java.util.concurrent.atomic.AtomicBoolean;
 
+@Component
 public class AuditStateListener {
 
     @Resource
@@ -75,4 +79,23 @@ public class AuditStateListener {
     public StateResult auditSuccess(String currentStatus) {
         return callEvent(currentStatus, AuditState.AuditStateEvent.AUDIT_SUCCESS_EVENT);
     }
+
+    public StateResult statusChange(AuditState.AuditStateEnum auditStateEnum, String currentStatus) {
+        StateResult stateResult = new StateResult();
+        switch(auditStateEnum){
+            //审核失败
+            case FAIL_AUDIT -> {
+                stateResult = this.auditFail(currentStatus);
+            }
+            //审核成功
+            case SUCCESS_AUDIT -> {
+                stateResult = this.auditSuccess(currentStatus);
+            }
+            default -> {
+                stateResult.setResult(false);
+            }
+        }
+        AssertionUtils.isFail(!stateResult.isResult(),"订单状态异常,请联系管理员");
+        return stateResult;
+    }
 }

+ 4 - 1
tenant/insurance/quotation-summary/src/main/resources/mapper/InsFeeAuditMapper.xml

@@ -59,6 +59,9 @@
             <if test="param.auditType != null">
                 and ifa.audit_type = #{param.auditType}
             </if>
+            <if test="param.isProblem != null">
+                and ifa.is_problem = #{param.isProblem}
+            </if>
             <if test="param.licenseNo != null and param.licenseNo != ''">
                 and ioci.license_no like concat('%',#{param.licenseNo},'%')
             </if>
@@ -77,7 +80,7 @@
             <if test="param.orderType != null ">
                 and io.entry_status = #{param.orderType}
             </if>
-            <if test="companyIdList != null and companyIdList.size()" >
+            <if test="param.companyIdList != null and param.companyIdList.size() > 0" >
                 AND io.company_id in
                 <foreach collection="companyIdList" item="item" open="(" separator="," close=")">
                     #{item}

+ 1 - 1
tenant/organization/src/main/java/com/jzg/organization/client/EsmInsCompanyClient.java

@@ -10,7 +10,7 @@ import org.springframework.web.bind.annotation.RequestParam;
 
 import java.util.List;
 
-@FeignClient(name="jzg-platform",url = "http://192.168.0.250:8001/")
+@FeignClient(name="jzg-platform",url = "http://192.168.0.19:8001/")
 public interface EsmInsCompanyClient {
 
 

+ 87 - 0
tenant/organization/src/main/java/com/jzg/organization/controller/AmountAuditingController.java

@@ -0,0 +1,87 @@
+package com.jzg.organization.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jzg.commons.core.base.BaseController;
+import com.jzg.commons.core.page.HttpResult;
+import com.jzg.commons.entity.dto.*;
+import com.jzg.commons.entity.orders.vo.FeeAuditVo;
+import com.jzg.commons.entity.vo.AmountAuditVo;
+import com.jzg.organization.service.SysAmountAuditingService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+@Tag(name="提现申请管理接口")
+@RestController
+@RequestMapping("/amountAuditing")
+public class AmountAuditingController extends BaseController {
+
+    @Autowired
+    private SysAmountAuditingService sysAmountAuditingService;
+
+    /**
+     * 提现申请列表分页
+     * @return
+     */
+    @PostMapping("/auditList")
+    @Operation(summary = "提现申请列表分页")
+    public HttpResult auditList(@RequestBody AmountAuditParam param){
+        Page<AmountAuditVo> result = sysAmountAuditingService.queryPage(param);
+        return HttpResult.ok(result);
+    }
+
+    /**
+     * 判断领取按钮是否锁定
+     * @return
+     */
+    @GetMapping("/isLock")
+    @Operation(summary = "判断领取按钮是否锁定")
+    public HttpResult isLock(String id){
+        return HttpResult.ok(sysAmountAuditingService.isLock(id));
+    }
+
+    /**
+     * 领取提现申请
+     * @return
+     */
+    @PostMapping("/auditReceive")
+    @Operation(summary = "领取提现申请")
+    public HttpResult auditReceive(@RequestParam("id") String id){
+        sysAmountAuditingService.auditReceive(id);
+        return HttpResult.ok();
+    }
+
+    /**
+     * 放弃领取提现申请
+     * @return
+     */
+    @PostMapping("/auditCancel")
+    @Operation(summary = "放弃领取提现申请")
+    public HttpResult auditCancel(@RequestParam("id") String id){
+        sysAmountAuditingService.auditCancel(id);
+        return HttpResult.ok();
+    }
+
+    /**
+     * 提现付款
+     * @return
+     */
+    @PostMapping("/verifyAmount")
+    @Operation(summary = "提现付款")
+    public HttpResult verifyAmount(@RequestBody AmountAuditEditParam param){
+        sysAmountAuditingService.verifyAmount(param);
+        return HttpResult.ok();
+    }
+
+    /**
+     * 提现驳回
+     * @return
+     */
+    @PostMapping("/rejectAmount")
+    @Operation(summary = "提现驳回")
+    public HttpResult rejectAmount(@RequestBody AmountAuditRejectParam param){
+        sysAmountAuditingService.rejectAmount(param);
+        return HttpResult.ok();
+    }
+}

+ 78 - 0
tenant/organization/src/main/java/com/jzg/organization/controller/UserAccountController.java

@@ -0,0 +1,78 @@
+package com.jzg.organization.controller;
+
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jzg.commons.core.page.HttpResult;
+import com.jzg.commons.entity.dto.AgreementAddParam;
+import com.jzg.commons.entity.dto.AmountAuditParam;
+import com.jzg.commons.entity.dto.SysUserAccountPageParam;
+import com.jzg.commons.entity.dto.SysUserAccountParam;
+import com.jzg.commons.entity.po.SysUserAccount;
+import com.jzg.commons.entity.vo.AmountAuditVo;
+import com.jzg.commons.entity.vo.SysUserAccountVo;
+import com.jzg.commons.entity.vo.UserAccountStatisVo;
+import com.jzg.organization.service.SysUserAccountService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.checkerframework.checker.units.qual.A;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+@Tag(name="用户账户接口")
+@RestController
+@RequestMapping("/userAccount")
+public class UserAccountController {
+
+    @Autowired
+    private SysUserAccountService userAccountService;
+
+    /**
+     * 用户账户信息查询
+     * @param userId
+     * @return
+     */
+    @GetMapping(value = { "/accountGet"})
+    @Operation(summary = "用户账户信息查询")
+    public HttpResult accountGet(String userId) {
+        return HttpResult.ok(userAccountService.queryByUserId(userId));
+    }
+
+    /**
+     * 用户账户信息保存
+     * @param account
+     * @return
+     */
+    @Operation(summary = "用户账户信息保存")
+    @PostMapping("/saveOrUpdate")
+    public HttpResult saveOrUpdate(@RequestBody SysUserAccount account) {
+        boolean isSuccess = userAccountService.saveOrUpdate(account);
+        return isSuccess ? HttpResult.ok() : HttpResult.error();
+    }
+
+    /**
+     * 应付统计
+     * @return
+     */
+    @PostMapping("/getPayableStatistics")
+    @Operation(summary = "应付统计")
+    public HttpResult getPayableStatistics(@RequestBody SysUserAccountParam param){
+        UserAccountStatisVo userAccountStatisVo = userAccountService.getPayableStatistics(param);
+        return HttpResult.ok(userAccountStatisVo);
+    }
+
+    /**
+     * 用户账户列表
+     * @return
+     */
+    @PostMapping("/accountList")
+    @Operation(summary = "用户账户列表")
+    public HttpResult accountList(@RequestBody SysUserAccountPageParam param){
+        Page<SysUserAccountVo> result = userAccountService.accountList(param);
+        return HttpResult.ok(result);
+    }
+
+
+
+
+}

+ 29 - 0
tenant/organization/src/main/java/com/jzg/organization/mapper/SysAmountAuditingMapper.java

@@ -0,0 +1,29 @@
+package com.jzg.organization.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jzg.commons.entity.dto.AmountAuditParam;
+import com.jzg.commons.entity.po.SysAmountAuditing;
+import com.jzg.commons.entity.vo.AmountAuditVo;
+import org.apache.ibatis.annotations.Param;
+
+/**
+* @author dongxin
+* @description 针对表【sys_amount_auditing(提现申请表)】的数据库操作Mapper
+* @createDate 2025-07-11 11:05:25
+* @Entity generator.domain.SysAmountAuditing
+*/
+public interface SysAmountAuditingMapper extends BaseMapper<SysAmountAuditing> {
+
+    /**
+     * 提现申请列表分页
+     * @param page
+     * @param param
+     * @return
+     */
+    Page<AmountAuditVo> queryPage(Page page,@Param("param") AmountAuditParam param);
+}
+
+
+
+

+ 38 - 0
tenant/organization/src/main/java/com/jzg/organization/mapper/SysUserAccountMapper.java

@@ -0,0 +1,38 @@
+package com.jzg.organization.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jzg.commons.entity.dto.SysUserAccountPageParam;
+import com.jzg.commons.entity.dto.SysUserAccountParam;
+import com.jzg.commons.entity.po.SysUserAccount;
+import com.jzg.commons.entity.vo.SysUserAccountVo;
+import com.jzg.commons.entity.vo.UserAccountStatisVo;
+import org.apache.ibatis.annotations.Param;
+
+/**
+* @author dongxin
+* @description 针对表【sys_user_account(用户账户表)】的数据库操作Mapper
+* @createDate 2025-07-15 15:37:58
+* @Entity generator.domain.SysUserAccount
+*/
+public interface SysUserAccountMapper extends BaseMapper<SysUserAccount> {
+
+    /**
+     * 应付统计
+     * @param param
+     * @return
+     */
+    UserAccountStatisVo getPayableStatistics(@Param("param") SysUserAccountParam param);
+
+    /**
+     * 用户账户列表
+     * @param page
+     * @param param
+     * @return
+     */
+    Page<SysUserAccountVo> accountList(Page page, @Param("param")SysUserAccountPageParam param);
+}
+
+
+
+

+ 56 - 0
tenant/organization/src/main/java/com/jzg/organization/service/SysAmountAuditingService.java

@@ -0,0 +1,56 @@
+package com.jzg.organization.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.jzg.commons.entity.dto.AmountAuditEditParam;
+import com.jzg.commons.entity.dto.AmountAuditParam;
+import com.jzg.commons.entity.dto.AmountAuditRejectParam;
+import com.jzg.commons.entity.po.SysAmountAuditing;
+import com.jzg.commons.entity.vo.AmountAuditVo;
+
+/**
+* @author dongxin
+* @description 针对表【sys_amount_auditing(提现申请表)】的数据库操作Service
+* @createDate 2025-07-11 11:05:25
+*/
+public interface SysAmountAuditingService extends IService<SysAmountAuditing> {
+
+    /**
+     * 提现申请列表分页
+     * @param param
+     * @return
+     */
+    Page<AmountAuditVo> queryPage(AmountAuditParam param);
+
+    /**
+     * 领取提现申请
+     *
+     * @param id
+     */
+    void auditReceive(String id);
+
+    /**
+     * 放弃领取提现申请
+     * @param id
+     */
+    void auditCancel(String id);
+
+    /**
+     * 提现付款
+     * @param param
+     */
+    void verifyAmount(AmountAuditEditParam param);
+
+    /**
+     * 提现驳回
+     * @param param
+     */
+    void rejectAmount(AmountAuditRejectParam param);
+
+    /**
+     * 判断领取按钮是否锁定
+     * @param id
+     * @return
+     */
+    boolean isLock(String id);
+}

+ 38 - 0
tenant/organization/src/main/java/com/jzg/organization/service/SysUserAccountService.java

@@ -0,0 +1,38 @@
+package com.jzg.organization.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.jzg.commons.entity.dto.SysUserAccountPageParam;
+import com.jzg.commons.entity.dto.SysUserAccountParam;
+import com.jzg.commons.entity.po.SysUserAccount;
+import com.jzg.commons.entity.vo.SysUserAccountVo;
+import com.jzg.commons.entity.vo.UserAccountStatisVo;
+
+/**
+* @author dongxin
+* @description 针对表【sys_user_account(用户账户表)】的数据库操作Service
+* @createDate 2025-07-15 15:37:58
+*/
+public interface SysUserAccountService extends IService<SysUserAccount> {
+
+    /**
+     * accountGet
+     * @param userId
+     * @return
+     */
+    SysUserAccount queryByUserId(String userId);
+
+    /**
+     * 应付统计
+     * @param param
+     * @return
+     */
+    UserAccountStatisVo getPayableStatistics(SysUserAccountParam param);
+
+    /**
+     * 用户账户列表
+     * @param param
+     * @return
+     */
+    Page<SysUserAccountVo> accountList(SysUserAccountPageParam param);
+}

+ 200 - 0
tenant/organization/src/main/java/com/jzg/organization/service/impl/SysAmountAuditingServiceImpl.java

@@ -0,0 +1,200 @@
+package com.jzg.organization.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jzg.commons.core.base.BaseController;
+import com.jzg.commons.core.base.StateResult;
+import com.jzg.commons.core.page.HttpResult;
+import com.jzg.commons.entity.dto.AmountAuditEditParam;
+import com.jzg.commons.entity.dto.AmountAuditParam;
+import com.jzg.commons.entity.dto.AmountAuditRejectParam;
+import com.jzg.commons.entity.po.InsFeeOrders;
+import com.jzg.commons.entity.po.SysAmountAuditing;
+import com.jzg.commons.entity.po.SysUserAccount;
+import com.jzg.commons.entity.vo.AmountAuditVo;
+import com.jzg.commons.util.AssertionUtils;
+import com.jzg.commons.util.StringUtils;
+import com.jzg.organization.mapper.SysAmountAuditingMapper;
+import com.jzg.organization.service.SysAmountAuditingService;
+import com.jzg.organization.service.SysUserAccountService;
+import com.jzg.organization.state.AuditState;
+import com.jzg.organization.state.listener.AuditStateListener;
+import org.redisson.api.RBucket;
+import org.redisson.api.RedissonClient;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.util.Objects;
+import java.util.concurrent.TimeUnit;
+
+/**
+* @author dongxin
+* @description 针对表【sys_amount_auditing(提现申请表)】的数据库操作Service实现
+* @createDate 2025-07-11 11:05:25
+*/
+@Service
+public class SysAmountAuditingServiceImpl extends ServiceImpl<SysAmountAuditingMapper, SysAmountAuditing>
+    implements SysAmountAuditingService {
+
+    @Autowired
+    private BaseController baseController;
+
+    @Autowired
+    private RedissonClient redissonClient;
+
+    @Autowired
+    AuditStateListener auditStateListener;
+
+    @Autowired
+    SysUserAccountService userAccountService;
+
+    private static final String AMOUNT_LOCK_PREFIX = "amountLock:";
+
+    @Override
+    public Page<AmountAuditVo> queryPage(AmountAuditParam param) {
+        Page<AmountAuditVo> page = baseMapper.queryPage(param.getPage(), param);
+        return page;
+    }
+
+    @Override
+    public void auditReceive(String id) {
+        SysAmountAuditing audit = this.getById(id);
+        if(audit.getAuditingStatus() > 0){
+            if(audit.getAuditingStatus() == 1){
+                AssertionUtils.isFail(true, "提现已付款请刷新列表");
+            }else{
+                AssertionUtils.isFail(true, "提现已驳回请刷新列表");
+            }
+            // 未审核
+        }else{
+            String userName = baseController.getUserName();
+            if(StringUtils.isNotBlank(audit.getReceiveUser())){
+                if(userName.equals(audit.getReceiveUser())){
+                    // redis 锁定按钮
+                    RBucket<Object> bucket = redissonClient.getBucket(AMOUNT_LOCK_PREFIX + id);
+                    bucket.set(1, 10, TimeUnit.MINUTES);
+                }else{
+                    AssertionUtils.isFail(true, "提现申请已被" + audit.getReceiveUser() + "领取!");
+                }
+            }else{
+                LambdaQueryWrapper<SysAmountAuditing> wrapper = new LambdaQueryWrapper<>();
+                wrapper.like(SysAmountAuditing::getReceiveUser, userName);
+                long count = this.count(wrapper);
+                if(count >= 10){
+                    AssertionUtils.isFail(true, "超出10次领取限制,请先审核后再领取订单!");
+                }else{
+                    // 领取订单
+                    audit.setReceiveUser(userName);
+                    audit.setReceiveTime(LocalDateTime.now());
+                    this.updateById(audit);
+
+                    // redis 锁定按钮
+                    RBucket<Object> bucket = redissonClient.getBucket(AMOUNT_LOCK_PREFIX + id);
+                    bucket.set(1, 10, TimeUnit.MINUTES);
+                }
+            }
+        }
+    }
+
+    @Override
+    public void auditCancel(String id) {
+        SysAmountAuditing audit = this.getById(id);
+        if(audit.getAuditingStatus() > 0){
+            AssertionUtils.isFail(true, "提现申请已完成付款!");
+        }
+        String userName = baseController.getUserName();
+        if (userName.equals(audit.getReceiveUser())) {
+            AssertionUtils.isFail(true, "已放弃提现申请付款任务!");
+        }
+
+        LambdaUpdateWrapper<SysAmountAuditing> wrapper = new LambdaUpdateWrapper<>();
+        wrapper.set(SysAmountAuditing::getReceiveUser,null);
+        wrapper.set(SysAmountAuditing::getReceiveTime,null);
+        wrapper.eq(SysAmountAuditing::getId,id);
+        this.update(wrapper);
+
+        // 清空锁定缓存
+        RBucket<Object> bucket = redissonClient.getBucket(AMOUNT_LOCK_PREFIX + id);
+        if(bucket.isExists()){
+            bucket.delete();
+        }
+
+    }
+
+    @Override
+    public void verifyAmount(AmountAuditEditParam param) {
+        SysAmountAuditing audit = this.getById(param.getId());
+        if(audit.getAuditingStatus() > 0){
+            if(audit.getAuditingStatus() == 1){
+                AssertionUtils.isFail(true, "提现已付款请刷新列表");
+            }else{
+                AssertionUtils.isFail(true, "提现已驳回请刷新列表");
+            }
+        }
+        if(StringUtils.isBlank(audit.getReceiveUser())){
+            AssertionUtils.isFail(true, "请领取提现申请后再进行付款,返回待付款提现申请列表!");
+        }
+        String userName = baseController.getUserName();
+        if (!userName.equals(audit.getReceiveUser())) {
+            AssertionUtils.isFail(true, "申请已被"+audit.getReceiveUser()+"领取返回待付款提现申请列表!");
+        }
+        if(StringUtils.isNotBlank(audit.getReceiveUser())){
+            if(userName.equals(audit.getReceiveUser())){
+                StateResult stateFailResult = auditStateListener.statusChange(AuditState.AuditStateEnum.SUCCESS_AUDIT,audit.getAuditingStatus()+"");
+                audit.setAuditingStatus(stateFailResult.getCurrentState());
+                audit.setPicId(param.getPicId());
+                audit.setVoucherId(param.getVoucherId());
+                audit.setAccountId(param.getAccountId());
+                this.updateById(audit);
+                // 更新用户账户
+                SysUserAccount userAccount = userAccountService.queryByUserId(audit.getUserId());
+                AssertionUtils.isFail(Objects.isNull(userAccount), "用户账户数据异常!");
+                AssertionUtils.isFail(audit.getAmount().compareTo(userAccount.getSumAmountUnpaid()) > 0, "提现金额大于账户余额!");
+                userAccount.setSumAmountPaid(audit.getAmount());
+                userAccount.setSumAmountUnpaid(userAccount.getSumAmountUnpaid().add(audit.getAmount()));
+                userAccountService.saveOrUpdate(userAccount);
+            }else{
+                AssertionUtils.isFail(true, "提现申请已被" + audit.getReceiveUser() + "领取!");
+            }
+        }else{
+            AssertionUtils.isFail(true, "提现申请未领取");
+        }
+    }
+
+    @Override
+    public void rejectAmount(AmountAuditRejectParam param) {
+        SysAmountAuditing audit = this.getById(param.getId());
+        if(audit.getAuditingStatus() > 0){
+            if(audit.getAuditingStatus() == 1){
+                AssertionUtils.isFail(true, "提现已付款请刷新列表");
+            }else{
+                AssertionUtils.isFail(true, "提现已驳回请刷新列表");
+            }
+        }
+        if(StringUtils.isBlank(audit.getReceiveUser())){
+            AssertionUtils.isFail(true, "请领取任务后再进行审核关闭弹窗,刷新列表");
+        }
+        String userName = baseController.getUserName();
+        if (!userName.equals(audit.getReceiveUser())) {
+            AssertionUtils.isFail(true, "申请已被"+audit.getReceiveUser()+"领取返回待付款提现申请列表!");
+        }
+
+        StateResult stateFailResult = auditStateListener.statusChange(AuditState.AuditStateEnum.FAIL_AUDIT,audit.getAuditingStatus()+"");
+        audit.setAuditingStatus(stateFailResult.getCurrentState());
+        audit.setRejectReason(param.getRejectReason());
+        this.updateById(audit);
+    }
+
+    @Override
+    public boolean isLock(String id) {
+        RBucket<Object> bucket = redissonClient.getBucket(AMOUNT_LOCK_PREFIX + id);
+        return bucket.isExists();
+    }
+}
+
+
+
+

+ 47 - 0
tenant/organization/src/main/java/com/jzg/organization/service/impl/SysUserAccountServiceImpl.java

@@ -0,0 +1,47 @@
+package com.jzg.organization.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jzg.commons.entity.dto.SysUserAccountPageParam;
+import com.jzg.commons.entity.dto.SysUserAccountParam;
+import com.jzg.commons.entity.po.SysUserAccount;
+import com.jzg.commons.entity.vo.AmountAuditVo;
+import com.jzg.commons.entity.vo.SysUserAccountVo;
+import com.jzg.commons.entity.vo.UserAccountStatisVo;
+import com.jzg.organization.mapper.SysUserAccountMapper;
+import com.jzg.organization.service.SysUserAccountService;
+import org.springframework.stereotype.Service;
+
+/**
+* @author dongxin
+* @description 针对表【sys_user_account(用户账户表)】的数据库操作Service实现
+* @createDate 2025-07-15 15:37:58
+*/
+@Service
+public class SysUserAccountServiceImpl extends ServiceImpl<SysUserAccountMapper, SysUserAccount>
+    implements SysUserAccountService {
+
+    @Override
+    public SysUserAccount queryByUserId(String userId) {
+        LambdaQueryWrapper<SysUserAccount> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(SysUserAccount::getUserId, userId);
+        wrapper.eq(SysUserAccount::getIsDelete, 0);
+        return this.getOne(wrapper);
+    }
+
+    @Override
+    public UserAccountStatisVo getPayableStatistics(SysUserAccountParam param) {
+        return this.baseMapper.getPayableStatistics(param);
+    }
+
+    @Override
+    public Page<SysUserAccountVo> accountList(SysUserAccountPageParam param) {
+        Page<SysUserAccountVo> page = baseMapper.accountList(param.getPage(), param);
+        return page;
+    }
+}
+
+
+
+

+ 39 - 0
tenant/organization/src/main/java/com/jzg/organization/state/AuditState.java

@@ -0,0 +1,39 @@
+package com.jzg.organization.state;
+
+public class AuditState {
+
+    public enum AuditStateEnum {
+        // 待审核
+        NO_AUDIT(0),
+        // 审核通过
+        SUCCESS_AUDIT(1),
+        // 审核失败
+        FAIL_AUDIT(1);
+
+        private final int value;
+
+        AuditStateEnum(int value) {
+            this.value = value;
+        }
+
+        public int getValue() {
+            return value;
+        }
+
+        public static AuditStateEnum fromValue(int value) {
+            for (AuditStateEnum costStateEnum : AuditStateEnum.values()) {
+                if (costStateEnum.getValue() == value) {
+                    return costStateEnum;
+                }
+            }
+            return null;
+        }
+    }
+
+    public enum AuditStateEvent {
+        //审核失败事件
+        AUDIT_FAIL_EVENT,
+        //审核成功事件
+        AUDIT_SUCCESS_EVENT;
+    }
+}

+ 34 - 0
tenant/organization/src/main/java/com/jzg/organization/state/config/AuditStateConfig.java

@@ -0,0 +1,34 @@
+package com.jzg.organization.state.config;
+
+import com.jzg.organization.state.AuditState;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.statemachine.StateMachine;
+import org.springframework.statemachine.config.StateMachineBuilder;
+import org.springframework.statemachine.config.StateMachineConfigurerAdapter;
+
+import java.util.EnumSet;
+@Configuration
+public class AuditStateConfig extends StateMachineConfigurerAdapter<AuditState.AuditStateEnum, AuditState.AuditStateEvent> {
+
+
+    @Bean(name = "auditStateMachine")
+    public StateMachine<AuditState.AuditStateEnum, AuditState.AuditStateEvent> costStateMachine() throws Exception {
+        StateMachineBuilder.Builder<AuditState.AuditStateEnum, AuditState.AuditStateEvent> builder = StateMachineBuilder.builder();
+        builder.configureStates()
+                .withStates()
+                .initial(AuditState.AuditStateEnum.NO_AUDIT)
+                .states(EnumSet.allOf(AuditState.AuditStateEnum.class));
+        builder.configureTransitions()
+                .withExternal()
+                // 待审核 -> 审核通过
+                .source(AuditState.AuditStateEnum.NO_AUDIT).target(AuditState.AuditStateEnum.SUCCESS_AUDIT).event(AuditState.AuditStateEvent.AUDIT_SUCCESS_EVENT)
+                .and()
+                .withExternal()
+                // 待审核 -> 审核失败
+                .source(AuditState.AuditStateEnum.NO_AUDIT).target(AuditState.AuditStateEnum.FAIL_AUDIT).event(AuditState.AuditStateEvent.AUDIT_FAIL_EVENT)
+        ;
+
+        return builder.build();
+    }
+}

+ 100 - 0
tenant/organization/src/main/java/com/jzg/organization/state/listener/AuditStateListener.java

@@ -0,0 +1,100 @@
+package com.jzg.organization.state.listener;
+
+import com.jzg.commons.core.base.StateResult;
+import com.jzg.commons.util.AssertionUtils;
+import com.jzg.organization.state.AuditState;
+import jakarta.annotation.Resource;
+import org.springframework.messaging.Message;
+import org.springframework.messaging.support.MessageBuilder;
+import org.springframework.statemachine.StateMachine;
+import org.springframework.statemachine.StateMachineEventResult;
+import org.springframework.statemachine.support.DefaultStateMachineContext;
+import org.springframework.stereotype.Component;
+import reactor.core.publisher.Flux;
+import reactor.core.publisher.Mono;
+
+import java.util.concurrent.atomic.AtomicBoolean;
+
+@Component
+public class AuditStateListener {
+
+    @Resource
+    private StateMachine<AuditState.AuditStateEnum, AuditState.AuditStateEvent> costStateMachine;
+
+    private synchronized boolean sendEvent(Mono<Message<AuditState.AuditStateEvent>> message) {
+        AtomicBoolean result = new AtomicBoolean(false);
+        try {
+            costStateMachine.stop(); // 停止状态机
+            Message<AuditState.AuditStateEvent> block = message.block();
+            String orderStatus = (String) block.getHeaders().get("entity");
+            costStateMachine.getStateMachineAccessor().doWithAllRegions(accessor -> {
+                accessor.resetStateMachineReactively(new DefaultStateMachineContext<>(
+                        // 目标状态
+                        AuditState.AuditStateEnum.fromValue(Integer.parseInt(orderStatus)),
+                        null, // 当前事件(可以为 null)
+                        null, // 扩展上下文(可以为 null)
+                        null  // 转换历史(通常为 null)
+                )).block();
+            });
+            Mono<Void> startMono = costStateMachine.startReactively(); //启用状态机
+            startMono.block();
+
+            Flux<StateMachineEventResult<AuditState.AuditStateEnum, AuditState.AuditStateEvent>> stateMachineEventResultFlux = costStateMachine.sendEvent(message);
+            StateMachineEventResult<AuditState.AuditStateEnum, AuditState.AuditStateEvent> eventResult = stateMachineEventResultFlux.blockFirst();
+
+            if (eventResult != null && eventResult.getResultType() == StateMachineEventResult.ResultType.ACCEPTED) {
+                result.set(true);
+            }
+        } catch (Exception e) {
+
+        } finally {
+            costStateMachine.stopReactively();
+            return result.get();
+        }
+    }
+
+    private StateResult callEvent(String auditStatus, AuditState.AuditStateEvent event) {
+        StateResult stateResult = new StateResult();
+        Mono<Message<AuditState.AuditStateEvent>> message = Mono.just(MessageBuilder.withPayload(event).setHeader("entity",auditStatus).build());
+        stateResult.setResult(sendEvent(message));
+        stateResult.setCurrentState(costStateMachine.getState().getId().getValue());
+        return stateResult;
+    }
+
+    /**
+     * 审核失败
+     * @param cureentStatus
+     * @return
+     */
+    public StateResult auditFail(String cureentStatus) {
+        return callEvent(cureentStatus, AuditState.AuditStateEvent.AUDIT_FAIL_EVENT);
+    }
+
+    /**
+     * 审核成功
+     * @param currentStatus
+     * @return
+     */
+    public StateResult auditSuccess(String currentStatus) {
+        return callEvent(currentStatus, AuditState.AuditStateEvent.AUDIT_SUCCESS_EVENT);
+    }
+
+    public StateResult statusChange(AuditState.AuditStateEnum auditStateEnum, String currentStatus) {
+        StateResult stateResult = new StateResult();
+        switch(auditStateEnum){
+            //审核失败
+            case FAIL_AUDIT -> {
+                stateResult = this.auditFail(currentStatus);
+            }
+            //审核成功
+            case SUCCESS_AUDIT -> {
+                stateResult = this.auditSuccess(currentStatus);
+            }
+            default -> {
+                stateResult.setResult(false);
+            }
+        }
+        AssertionUtils.isFail(!stateResult.isResult(),"订单状态异常,请联系管理员");
+        return stateResult;
+    }
+}

+ 89 - 0
tenant/organization/src/main/resources/mapper/SysAmountAuditingMapper.xml

@@ -0,0 +1,89 @@
+<?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="com.jzg.organization.mapper.SysAmountAuditingMapper">
+
+    <resultMap id="BaseResultMap" type="com.jzg.commons.entity.po.SysAmountAuditing">
+            <id property="id" column="id" jdbcType="BIGINT"/>
+            <result property="bankNumber" column="bank_number" jdbcType="VARCHAR"/>
+            <result property="amount" column="amount" jdbcType="DECIMAL"/>
+            <result property="balanceAmount" column="balance_amount" jdbcType="DECIMAL"/>
+            <result property="userId" column="user_id" jdbcType="VARCHAR"/>
+            <result property="auditingStatus" column="auditing_status" jdbcType="VARCHAR"/>
+            <result property="auditingTime" column="auditing_time" jdbcType="TIMESTAMP"/>
+            <result property="auditingUserId" column="auditing_user_id" jdbcType="VARCHAR"/>
+            <result property="voucherId" column="voucher_id" jdbcType="VARCHAR"/>
+            <result property="picId" column="pic_id" jdbcType="VARCHAR"/>
+            <result property="rejectReason" column="reject_reason" jdbcType="VARCHAR"/>
+            <result property="accountName" column="account_name" jdbcType="VARCHAR"/>
+            <result property="bankCardNum" column="bank_card_num" jdbcType="VARCHAR"/>
+            <result property="bankName" column="bank_name" jdbcType="VARCHAR"/>
+            <result property="bankNum" column="bank_num" jdbcType="VARCHAR"/>
+            <result property="accountId" column="account_id" jdbcType="VARCHAR"/>
+            <result property="receiveTime" column="receive_time" jdbcType="TIMESTAMP"/>
+            <result property="receiveUser" column="receive_user" jdbcType="VARCHAR"/>
+            <result property="isDelete" column="is_delete" jdbcType="TINYINT"/>
+            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+            <result property="createBy" column="create_by" jdbcType="VARCHAR"/>
+            <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
+            <result property="updateBy" column="update_by" jdbcType="VARCHAR"/>
+            <result property="systemCode" column="system_code" jdbcType="VARCHAR"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,bank_number,amount,
+        balance_amount,user_id,auditing_status,
+        auditing_time,auditing_user_id,voucher_id,
+        pic_id,reject_reason,account_name,
+        bank_card_num,bank_name,bank_num,
+        account_id,receive_time,receive_user,
+        is_delete,create_time,create_by,
+        update_time,update_by,system_code
+    </sql>
+    <select id="queryPage" resultType="com.jzg.commons.entity.vo.AmountAuditVo">
+        SELECT
+        saa.id,suji.name as name, su.mobile as mobile,suji.type_attr as attrType,
+        sujim.name as managerName,sum.mobile as managerMobile,saa.create_time as createTime,
+        saa.amount, saa.balance_amount as balanceAmount,saa.account_name AS accountName,
+        saa.bank_card_num as bankCardNum, saa.bank_name as bankName, saa.bank_num as bankNum
+        FROM sys_amount_auditing saa
+        LEFT JOIN sys_user_jzg_info suji on saa.user_id = suji.user_id
+        LEFT JOIN sys_user su on su.id = saa.user_id
+        LEFT JOIN sys_user_jzg_info sujim on saa.manager_user_id = sujim.user_id
+        LEFT JOIN sys_user sum on sum.id = saa.manager_user_id
+        LEFT JOIN sys_user_jzg_info sujia on saa.auditing_user_id = sujia.user_id
+        LEFT JOIN sys_user sua on sua.id = saa.auditing_user_id
+        <where>
+            <if test="param.salesman != null and param.salesman != ''">
+                and (su.username = #{param.salesman} or su.mobile = #{param.salesman})
+            </if>
+            <if test="param.attrType != null ">
+                and suji.type_attr = #{param.attrType}
+            </if>
+
+            <if test="param.createTimeStart != null and param.createTimeEnd != null">
+                and DATE_FORMAT(saa.create_time, '%Y-%m-%d') between #{param.createTimeStart} AND #{param.createTimeEnd}
+            </if>
+            <if test="param.auditTimeStart != null and param.auditTimeEnd != null">
+                and DATE_FORMAT(saa.auditing_time, '%Y-%m-%d') between #{param.auditTimeStart} AND #{param.auditTimeEnd}
+            </if>
+            <if test="param.auditingUser != null and param.auditingUser != ''">
+                and (sua.username = #{param.auditingUser} or sua.mobile = #{param.auditingUser})
+            </if>
+
+            <if test="param.auditingStatus != null ">
+                and saa.auditing_status = #{param.auditingStatus}
+            </if>
+            <choose>
+                <when test="param.receiveUser != null and param.receiveUser != ''">
+                    and saa.receive_user = #{param.receiveUser}
+                </when>
+                <otherwise>
+                    and saa.receive_user = null
+                </otherwise>
+            </choose>
+        </where>
+        ORDER BY create_time desc
+    </select>
+</mapper>

+ 73 - 0
tenant/organization/src/main/resources/mapper/SysUserAccountMapper.xml

@@ -0,0 +1,73 @@
+<?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="com.jzg.organization.mapper.SysUserAccountMapper">
+
+    <resultMap id="BaseResultMap" type="com.jzg.commons.entity.po.SysUserAccount">
+            <id property="id" column="id" jdbcType="VARCHAR"/>
+            <result property="userId" column="user_id" jdbcType="VARCHAR"/>
+            <result property="sumAmount" column="sum_amount" jdbcType="DECIMAL"/>
+            <result property="sumAmountPaid" column="sum_amount_paid" jdbcType="DECIMAL"/>
+            <result property="sumAmountUnpaid" column="sum_amount_unpaid" jdbcType="DECIMAL"/>
+            <result property="isDelete" column="is_delete" jdbcType="TINYINT"/>
+            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+            <result property="createBy" column="create_by" jdbcType="VARCHAR"/>
+            <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
+            <result property="updateBy" column="update_by" jdbcType="VARCHAR"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,user_id,sum_amount,
+        sum_amount_paid,sum_amount_unpaid,is_delete,
+        create_time,create_by,update_time,
+        update_by
+    </sql>
+    <select id="getPayableStatistics" resultType="com.jzg.commons.entity.vo.UserAccountStatisVo">
+        SELECT
+            COUNT(DISTINCT sua.user_id) AS salespersonCount,                          -- 业务员人数
+            ROUND(SUM(sua.sum_amount), 2) AS payableSum,                               -- 应付总计
+            ROUND(SUM(sua.sum_amount_paid), 2) AS paidSum,                                      -- 已付总计
+            ROUND(SUM(sua.sum_amount_unpaid), 2) AS notPaidSum                   -- 未付总计
+        FROM
+            sys_user_account sua
+            LEFT JOIN sys_user_jzg_info suji on suji.user_id = sua.user_id
+        <where>
+            <if test="param.salesman != null and param.salesman != ''">
+                and (su.username = #{param.salesman} or su.mobile = #{param.salesman})
+            </if>
+            <if test="param.attrType != null ">
+                and suji.type_attr = #{param.attrType}
+            </if>
+            <if test="param.createTimeStart != null and param.createTimeEnd != null">
+                and DATE_FORMAT(sua.create_time, '%Y-%m-%d') between #{param.createTimeStart} AND #{param.createTimeEnd}
+            </if>
+        </where>
+
+    </select>
+    <select id="accountList" resultType="com.jzg.commons.entity.vo.SysUserAccountVo">
+        SELECT
+        sua.id,suji.name,su.mobile, suji.type_attr as attrType, so.name as organizationName,
+        sd.name as deptName, sua.sum_amount as sumAmount, sua.sum_amount_paid as sumAmountPaid,
+        sua.sum_amount_unpaid as sumAmountUnpaid
+        FROM
+        sys_user_account sua
+        LEFT JOIN sys_user_jzg_info suji on suji.user_id = sua.user_id
+        LEFT JOIN sys_user su on su.id = suji.user_id
+        LEFT JOIN sys_dept sd on sd.id = shji.dept_id
+        LEFT JOIN sys_organization_user_link soul on soul.user_id = suji.user_id
+        LEFT JOIN sys_organization so on soul.organization_id = so.id
+        <where>
+            <if test="param.salesman != null and param.salesman != ''">
+                and (su.username = #{param.salesman} or su.mobile = #{param.salesman})
+            </if>
+            <if test="param.attrType != null ">
+                and suji.type_attr = #{param.attrType}
+            </if>
+            <if test="param.createTimeStart != null and param.createTimeEnd != null">
+                and DATE_FORMAT(sua.create_time, '%Y-%m-%d') between #{param.createTimeStart} AND #{param.createTimeEnd}
+            </if>
+        </where>
+        ORDER BY sua create_time desc
+    </select>
+</mapper>