Эх сурвалжийг харах

提现功能完善

提现的时候,向change_log表中插入一条记录。
开发导出业务员收支明显表的功能。
lipf 4 сар өмнө
parent
commit
73d48f8dc0
20 өөрчлөгдсөн 393 нэмэгдсэн , 42 устгасан
  1. 42 3
      commons/src/main/java/com/jzg/commons/entity/account/po/SysUserAccountChangeLog.java
  2. 31 0
      commons/src/main/java/com/jzg/commons/entity/dto/YwyIOParam.java
  3. 3 0
      commons/src/main/java/com/jzg/commons/entity/po/SysUserJzgInfoBankCard.java
  4. 6 0
      commons/src/main/java/com/jzg/commons/entity/vo/SysUserAccountVo.java
  5. 15 0
      commons/src/main/java/com/jzg/commons/util/BigDecimalUtil.java
  6. 1 1
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/client/OrgClient.java
  7. 13 4
      tenant/organization/src/main/java/com/jzg/organization/controller/AmountAuditingController.java
  8. 14 0
      tenant/organization/src/main/java/com/jzg/organization/mapper/InvAccountCardMapper.java
  9. 16 0
      tenant/organization/src/main/java/com/jzg/organization/mapper/SysUserAccountIncomeLogMapper.java
  10. 10 0
      tenant/organization/src/main/java/com/jzg/organization/mapper/SysUserJzgInfoBankCardMapper.java
  11. 10 0
      tenant/organization/src/main/java/com/jzg/organization/service/InvAccountCardService.java
  12. 9 4
      tenant/organization/src/main/java/com/jzg/organization/service/SysAmountAuditingService.java
  13. 11 0
      tenant/organization/src/main/java/com/jzg/organization/service/SysUserAccountIncomeLogService.java
  14. 10 0
      tenant/organization/src/main/java/com/jzg/organization/service/SysUserJzgInfoBankCardService.java
  15. 16 0
      tenant/organization/src/main/java/com/jzg/organization/service/impl/InvAccountCardServiceImpl.java
  16. 135 27
      tenant/organization/src/main/java/com/jzg/organization/service/impl/SysAmountAuditingServiceImpl.java
  17. 30 3
      tenant/organization/src/main/java/com/jzg/organization/service/impl/SysUserAccountIncomeLogServiceImpl.java
  18. 13 0
      tenant/organization/src/main/java/com/jzg/organization/service/impl/SysUserJzgInfoBankCardServiceImpl.java
  19. 4 0
      tenant/organization/src/main/resources/mapper/InvAccountCardMapper.xml
  20. 4 0
      tenant/organization/src/main/resources/mapper/SysUserJzgInfoBankCardMapper.xml

+ 42 - 3
commons/src/main/java/com/jzg/commons/entity/account/po/SysUserAccountChangeLog.java

@@ -1,5 +1,7 @@
 package com.jzg.commons.entity.account.po;
 
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelProperty;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.jzg.commons.core.base.BaseModel;
 import io.swagger.v3.oas.annotations.media.Schema;
@@ -8,6 +10,10 @@ import lombok.EqualsAndHashCode;
 
 import java.io.Serial;
 import java.math.BigDecimal;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
 
 
 /**
@@ -21,22 +27,35 @@ public class SysUserAccountChangeLog extends BaseModel {
 
     @Serial
     private static final long serialVersionUID = 3689832570825862201L;
+    @ExcelProperty("序号")
     private String id;
 
+    @ExcelProperty("租户代码")
     @Schema(description = "租户代码")
     private String systemCode;
 
+    @ExcelProperty("业务员姓名/手机号")
+    @Schema(description = "业务员登录手机号")
+    private String userName;
+
+
+    @ExcelIgnore
     @Schema(description = "用户序号")
     private String  userId;
 
+    @ExcelIgnore
     @Schema(description = "jzg_info表的序号")
     private String jzgInfoId;
 
+    @ExcelProperty("操作前金额")
+    @Schema(description = "操作前金额")
+    private BigDecimal amountBefore;
+
+    @ExcelProperty("金额")
     @Schema(description = "相关金额")
     private BigDecimal amount;
 
-    @Schema(description = "操作前金额")
-    private BigDecimal amountBefore;
+
 
 //    在实际运行中,可能因为并发的问题,操作前的金额和操作后的金额,很难得到要给准确的值(如果非要得到金额,需要加锁,影响其他模块操作)
 //    @Schema(description = "操作后的金额")
@@ -45,31 +64,51 @@ public class SysUserAccountChangeLog extends BaseModel {
     /**
      * 操作类型 1 保单费用 2 保单提成 3. 提现
      */
+    @ExcelIgnore
     @Schema(description = "操作类型")
     private int operType;
 
+    @ExcelProperty("操作类型")
     @TableField(exist = false)
     private String operTypeName;
 
+    @ExcelIgnore
+    private static Map<Integer,String> operTypeMap = new  HashMap<Integer,String>();
+    static {
+        operTypeMap.put(1,"保单费用");
+        operTypeMap.put(2,"保单提成");
+        operTypeMap.put(3,"提现");
+    }
+
+    public String getOperTypeName(){
+        return operTypeMap.getOrDefault(this.operType, Objects.toString(this.operType));
+    }
+
+    @ExcelProperty("关联订单ID")
     @Schema(description = "关联订单ID")
     private String relatedOrderId;
 
+
+    @ExcelIgnore
     @Schema(description = "转出银行卡的序号")
     private String bankCardIdTo;
 
+    @ExcelProperty("银行卡号")
     @Schema(description = "转出银行卡的卡号")
     private String bankCardNoTo;
 
+    @ExcelIgnore
     @Schema(description = "转入银行卡的序号")
     private String bankCardIdIn;
 
+    @ExcelIgnore
     @Schema(description = "转入银行卡的卡号")
     private String bankCardNoIn;
 
+    @ExcelProperty("备注")
     @Schema(description = "备注")
     private String remark;
 
-
     public SysUserAccountChangeLog(){
 
     }

+ 31 - 0
commons/src/main/java/com/jzg/commons/entity/dto/YwyIOParam.java

@@ -0,0 +1,31 @@
+package com.jzg.commons.entity.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.time.LocalDate;
+
+/**
+ * 业务员收支明细
+ *
+ * @author lipf
+ * @date 2026/6/8 16:58
+ */
+@Data
+public class YwyIOParam implements Serializable {
+    @Serial
+    private static final long serialVersionUID = 1903539153842283194L;
+
+    @Schema(description = "开始日期")
+    private LocalDate beginDate;
+
+    @Schema(description = "结束日期")
+    private LocalDate endDate;
+
+    @Schema(description = "业务员的用户序号")
+    private String ywyUserId;
+
+
+}

+ 3 - 0
commons/src/main/java/com/jzg/commons/entity/po/SysUserJzgInfoBankCard.java

@@ -8,6 +8,7 @@ import com.jzg.commons.util.idgen.IdGenerate;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
+import java.io.Serial;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 
@@ -19,6 +20,8 @@ import java.time.format.DateTimeFormatter;
 @Data
 @TableName("sys_user_jzg_info_bank_card")
 public class SysUserJzgInfoBankCard extends BaseModel {
+    @Serial
+    private static final long serialVersionUID = 8695063005869866551L;
     @TableId
     @Schema(description = "主键")
     private String id;

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

@@ -4,18 +4,24 @@ import com.jzg.commons.core.base.BaseModel;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
+import java.io.Serial;
 import java.math.BigDecimal;
 
 @Schema(description = "用户账户表VO")
 @Data
 public class SysUserAccountVo extends BaseModel {
 
+    @Serial
+    private static final long serialVersionUID = 8151170244337531418L;
     @Schema(description = "主键")
     private String id;
 
     @Schema(description = "业务员姓名")
     private String name;
 
+    @Schema(description = "业务员序号")
+    private String userId;
+
     @Schema(description = "业务员手机号")
     private String mobile;
 

+ 15 - 0
commons/src/main/java/com/jzg/commons/util/BigDecimalUtil.java

@@ -20,6 +20,21 @@ public class BigDecimalUtil {
     // 私有构造器,防止被实例化
     private BigDecimalUtil() {}
 
+
+    public static BigDecimal abs(BigDecimal val) {
+        if (val == null) {
+            return BigDecimal.ZERO;
+        }
+        return val.abs();
+    }
+
+    public static BigDecimal negate(BigDecimal val) {
+        if (val == null) {
+            return BigDecimal.ZERO;
+        }
+        return val.negate();
+    }
+
     /**
      * 提供精确的加法运算
      * @param v1 被加数

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

@@ -216,6 +216,6 @@ public interface OrgClient {
      * @author lipf
      * @date 2026/6/8 10:17
      */
-    @PostMapping("/addUserAccountChangeLog")
+    @PostMapping("/userAccount/addUserAccountChangeLog")
     HttpResult<String> addUserAccountChangeLog(@RequestBody SysUserAccountChangeLog changeLog);
 }

+ 13 - 4
tenant/organization/src/main/java/com/jzg/organization/controller/AmountAuditingController.java

@@ -4,10 +4,7 @@ import cn.hutool.json.JSONUtil;
 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.AmountAuditEditParam;
-import com.jzg.commons.entity.dto.AmountAuditParam;
-import com.jzg.commons.entity.dto.AmountAuditRejectParam;
-import com.jzg.commons.entity.dto.ApplyWithdrawParam;
+import com.jzg.commons.entity.dto.*;
 import com.jzg.commons.entity.vo.AmountAuditVo;
 import com.jzg.organization.service.SysAmountAuditingService;
 import io.swagger.v3.oas.annotations.Operation;
@@ -122,6 +119,18 @@ public class AmountAuditingController extends BaseController {
         return HttpResult.ok(amountAuditVoPage);
     }
 
+    /**
+     * 导出业务员收支明细
+     *
+     * @author lipf
+     * @date 2026/6/8 18:52
+     */
+    @PostMapping("/exportYwyIORecs")
+    @Operation(summary = "导出业务员收支明细")
+    public HttpResult<String> exportYwyIORecs(@RequestBody YwyIOParam ywyIOParam) {
+        return HttpResult.ok(sysAmountAuditingService.exportYwyIORecs(ywyIOParam));
+    }
+
     @PostMapping("/myPaymentTotalWithdrawalAmount")
     @Operation(summary = "我的付款提现金额总计")
     public HttpResult<String> myPaymentTotalWithdrawalAmount(@RequestBody AmountAuditParam param){

+ 14 - 0
tenant/organization/src/main/java/com/jzg/organization/mapper/InvAccountCardMapper.java

@@ -7,6 +7,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.jzg.commons.entity.account.vo.AccountCardVo;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.List;
+
 /**
 * @author dongxin
 * @description 针对表【inv_account_card(账户信息表)】的数据库操作Mapper
@@ -29,6 +31,18 @@ public interface InvAccountCardMapper extends BaseMapper<InvAccountCard> {
      * @return
      */
     AccountCardVo queryById(@Param("id") String id);
+
+    /**
+     * 查询业务员提现银行卡信息
+     *
+     * @param systemCode 租户代码
+     * @param accountId 银行卡号
+     * @author lipf
+     * @date 2026/6/8 15:14
+     */
+    List<InvAccountCard> queryByAccountId(@Param("accountId") String accountId,
+                                          @Param("systemCode") String systemCode);
+
 }
 
 

+ 16 - 0
tenant/organization/src/main/java/com/jzg/organization/mapper/SysUserAccountIncomeLogMapper.java

@@ -3,7 +3,23 @@ package com.jzg.organization.mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.jzg.commons.entity.account.po.SysUserAccountChangeLog;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Select;
+
+import java.time.LocalDate;
+import java.util.List;
 
 @Mapper
 public interface SysUserAccountIncomeLogMapper extends BaseMapper<SysUserAccountChangeLog> {
+
+    /**
+     * 查询业务员收支明细
+     *
+     * @param ywyUserId 业务员序号
+     * @param beginDate 开始日期
+     * @param endDate 结束日期
+     * @author lipf
+     * @date 2026/6/8 17:25
+     */
+    @Select("select * from sys_user_account_change_log a where a.user_id = #{ywyUserId} and a.create_time >= #{beginDate} and a.create_time < #{endDate} and a.is_delete = 0 order by a.create_time desc")
+    List<SysUserAccountChangeLog> queryYwyIORecs(String ywyUserId, LocalDate beginDate, LocalDate endDate);
 }

+ 10 - 0
tenant/organization/src/main/java/com/jzg/organization/mapper/SysUserJzgInfoBankCardMapper.java

@@ -22,4 +22,14 @@ public interface SysUserJzgInfoBankCardMapper extends BaseMapper<SysUserJzgInfoB
      */
     Page<SysUserJzgInfoBankCardDto> getBankCardPageList (Page<SysUserJzgInfoBankCardVo> page, @Param("sysUserJzgInfoBankCardVo") SysUserJzgInfoBankCardVo sysUserJzgInfoBankCardVo);
 
+    /**
+     * 根据银行卡号查询银行卡的信息
+     *
+     * @param bankCardNum 银行卡号
+     * @param systemCode  租户代码
+     * @author lipf
+     * @date 2026/6/8 16:22
+     */
+    List<SysUserJzgInfoBankCard> queryBankCardBybankCardNum(@Param("bankCardNum") String bankCardNum,
+                                                            @Param("systemCode") String systemCode);
 }

+ 10 - 0
tenant/organization/src/main/java/com/jzg/organization/service/InvAccountCardService.java

@@ -8,6 +8,8 @@ import com.jzg.commons.entity.account.po.InvAccountCard;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.jzg.commons.entity.account.vo.AccountCardVo;
 
+import java.util.List;
+
 /**
 * @author dongxin
 * @description 针对表【inv_account_card(账户信息表)】的数据库操作Service
@@ -55,4 +57,12 @@ public interface InvAccountCardService extends IService<InvAccountCard> {
      * @param param
      */
     void cardEdit(AccountCardEditParam param);
+
+    /**
+     * 根据银行卡账号查询银行卡信息
+     *
+     * @author lipf
+     * @date 2026/6/8 15:12
+     */
+    List<InvAccountCard> queryByAccountId(String accountId, String systemCode);
 }

+ 9 - 4
tenant/organization/src/main/java/com/jzg/organization/service/SysAmountAuditingService.java

@@ -3,10 +3,7 @@ package com.jzg.organization.service;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 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.dto.ApplyWithdrawParam;
+import com.jzg.commons.entity.dto.*;
 import com.jzg.commons.entity.po.SysAmountAuditing;
 import com.jzg.commons.entity.vo.AmountAuditVo;
 
@@ -96,4 +93,12 @@ public interface SysAmountAuditingService extends IService<SysAmountAuditing> {
      * @return
      */
     String exportAuditList(AmountAuditParam param);
+
+    /**
+     * 导出业务员收入支出明显
+     * param ywyIOParam 导出条件, 包含开始日期,结束日期
+     * @return
+     */
+    String exportYwyIORecs(YwyIOParam ywyIOParam);
+
 }

+ 11 - 0
tenant/organization/src/main/java/com/jzg/organization/service/SysUserAccountIncomeLogService.java

@@ -2,6 +2,9 @@ package com.jzg.organization.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.jzg.commons.entity.account.po.SysUserAccountChangeLog;
+import com.jzg.commons.entity.dto.YwyIOParam;
+
+import java.util.List;
 
 
 /**
@@ -11,4 +14,12 @@ import com.jzg.commons.entity.account.po.SysUserAccountChangeLog;
  */
 public interface SysUserAccountIncomeLogService extends IService<SysUserAccountChangeLog> {
 
+    /**
+     * 查询业务员收支明细
+     *
+     * @param ywyIOParam 查询参数,包括业务员信息, 以及查询的时间范围
+     * @author lipf
+     * @date 2026/6/8 17:25
+     */
+    List<SysUserAccountChangeLog> queryYwyIORecs(YwyIOParam ywyIOParam);
 }

+ 10 - 0
tenant/organization/src/main/java/com/jzg/organization/service/SysUserJzgInfoBankCardService.java

@@ -46,4 +46,14 @@ public interface SysUserJzgInfoBankCardService extends IService<SysUserJzgInfoBa
     boolean deleteBankCard(SysUserJzgInfoBankCardVo sysUserJzgInfoBankCardVo);
 
     HttpResult audit(SysUserJzgInfoBankCardVo sysUserJzgInfoBankCardVo);
+
+    /**
+     * 根据银行卡号查询银行卡的信息
+     *
+     * @param systemCode  租户代码
+     * @param bankCardNum 银行卡号
+     * @author lipf
+     * @date 2026/6/8 16:22
+     */
+    List<SysUserJzgInfoBankCard> queryBankCardBybankCardNum(String bankCardNum, String systemCode);
 }

+ 16 - 0
tenant/organization/src/main/java/com/jzg/organization/service/impl/InvAccountCardServiceImpl.java

@@ -19,6 +19,8 @@ import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+
 /**
 * @author dongxin
 * @description 针对表【inv_account_card(账户信息表)】的数据库操作Service实现
@@ -74,6 +76,20 @@ public class InvAccountCardServiceImpl extends ServiceImpl<InvAccountCardMapper,
         BeanUtils.copyProperties(param,accountCard);
         updateById(accountCard);
     }
+
+    /**
+     * 根据银行卡账号查询银行卡信息
+     *
+     * @param accountId  租户银行卡的账号
+     * @param systemCode 租户代码
+     * @author lipf
+     * @date 2026/6/8 15:12
+     */
+    @Override
+    public List<InvAccountCard> queryByAccountId(String accountId, String systemCode) {
+        log.info("根据企业账号查询业务的付款账户信息。 accountId=[{}], systemCode=[{}]", accountId, systemCode);
+        return baseMapper.queryByAccountId(accountId, systemCode);
+    }
 }
 
 

+ 135 - 27
tenant/organization/src/main/java/com/jzg/organization/service/impl/SysAmountAuditingServiceImpl.java

@@ -10,6 +10,8 @@ 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.account.po.InvAccountCard;
+import com.jzg.commons.entity.account.po.SysUserAccountChangeLog;
 import com.jzg.commons.entity.dto.*;
 import com.jzg.commons.entity.po.SysAmountAuditing;
 import com.jzg.commons.entity.po.SysUserAccount;
@@ -21,12 +23,10 @@ import com.jzg.commons.util.AssertionUtils;
 import com.jzg.commons.util.BigDecimalUtil;
 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.service.SysUserJzgInfoBankCardService;
-import com.jzg.organization.service.SysUserJzgInfoService;
+import com.jzg.organization.service.*;
 import com.jzg.organization.state.AuditState;
 import com.jzg.organization.state.listener.AuditStateListener;
+import io.seata.spring.annotation.GlobalTransactional;
 import org.redisson.api.RBucket;
 import org.redisson.api.RedissonClient;
 import org.slf4j.Logger;
@@ -56,6 +56,9 @@ public class SysAmountAuditingServiceImpl extends ServiceImpl<SysAmountAuditingM
     @Autowired
     private BaseController baseController;
 
+    @Autowired
+    private SysUserJzgInfoService sysJzgInfoService;
+
     @Autowired
     private RedissonClient redissonClient;
 
@@ -74,6 +77,11 @@ public class SysAmountAuditingServiceImpl extends ServiceImpl<SysAmountAuditingM
     @Autowired
     private ExportBaseServiceImpl exportBaseService;
 
+    @Autowired
+    private SysUserAccountIncomeLogService sysUserAccountIncomeLogService;
+    @Autowired
+    private InvAccountCardService invAccountCardService;
+
     private static final String AMOUNT_LOCK_PREFIX = "amountLock:";
 
     @Override
@@ -176,10 +184,11 @@ public class SysAmountAuditingServiceImpl extends ServiceImpl<SysAmountAuditingM
     /**
      * 提现付款
      *
-     * @param param
+     * @param param 提现付款的付款凭证等信息
      */
     @Override
     @Transactional(rollbackFor = Exception.class)
+    @GlobalTransactional(rollbackFor = Exception.class)
     public HttpResult<String> verifyAmount(AmountAuditEditParam param) {
         String userName = baseController.getUserName();
         String userId = baseController.getUserId();
@@ -189,20 +198,7 @@ public class SysAmountAuditingServiceImpl extends ServiceImpl<SysAmountAuditingM
             return HttpResult.error("付款账户不能为空");
         }
         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, "请领取提现申请后再进行付款,返回待付款提现申请列表!");
-        }
-
-        if (!userName.equals(audit.getReceiveUser())) {
-            AssertionUtils.isFail(true, "申请已被"+audit.getReceiveUser()+"领取返回待付款提现申请列表!");
-        }
+        this.validateBeforePass(audit, userName);
         if(StringUtils.isNotBlank(audit.getReceiveUser())){
             if(userName.equals(audit.getReceiveUser())){
                 StateResult stateFailResult = auditStateListener.statusChange(AuditState.AuditStateEnum.SUCCESS_AUDIT,audit.getAuditingStatus()+"", userName,userId);
@@ -218,18 +214,24 @@ public class SysAmountAuditingServiceImpl extends ServiceImpl<SysAmountAuditingM
                 SysUserAccount userAccount = userAccountService.queryByUserId(audit.getUserId(),systemCode);
                 AssertionUtils.isFail(Objects.isNull(userAccount), "用户账户数据异常!");
                 AssertionUtils.isFail(audit.getAmount().compareTo(audit.getBalanceAmount()) > 0, "提现金额大于账户余额!");
-
-                if(userAccount.getSumAmount().compareTo(audit.getAmount()) < 0){
+                if(userAccount.getSumAmountUnpaid().compareTo(audit.getAmount()) < 0){
                     log.info("账户金额少于提现金额,请审核账户。 userId=[{}}], userAccount.getSumAmount()=[{}],audit.getAmount()=[{}]",userAccount.getUserId(), userAccount.getSumAmount(), audit.getAmount());
                     throw new SystemException("账户金额少于提现金额,请审核账户");
                 }
+                BigDecimal amountBefore = userAccount.getSumAmountUnpaid();
                 // 应付总计: 只添加,不减。 modify by lipf ,2026年6月3日14:30:33
-                // sumAmount = sumAmountPaid + SumAmountUnpaid
-                //userAccount.setSumAmount(userAccount.getSumAmount().subtract(audit.getAmount()));
                 userAccount.setSumAmountPaid(userAccount.getSumAmountPaid().add(audit.getAmount()));
                 userAccount.setSumAmountUnpaid(userAccount.getSumAmountUnpaid().subtract(audit.getAmount()));
-
-                userAccountService.saveOrUpdate(userAccount);
+                SysUserAccountChangeLog changeLog = this.fillSysUserAccountChangeLog(systemCode,userName,amountBefore,
+                        audit.getAmount(),userAccount.getUserId(),param);
+                try{
+                    log.info("changeLog=【{}】",JSONUtil.toJsonStr(changeLog));
+                    sysUserAccountIncomeLogService.save(changeLog);
+                    userAccountService.saveOrUpdate(userAccount);
+                }catch (Exception e){
+                    log.error("新增明细异常",e);
+                    throw new SystemException(e.getMessage());
+                }
             }else{
                 AssertionUtils.isFail(true, "提现申请已被" + audit.getReceiveUser() + "领取!");
             }
@@ -239,6 +241,89 @@ public class SysAmountAuditingServiceImpl extends ServiceImpl<SysAmountAuditingM
         return HttpResult.ok("提现审核成功");
     }
 
+    /**
+     * 提现申请通过前的校验
+     *
+     * @author lipf
+     * @date 2026/6/8 15:57
+     */
+    private void validateBeforePass(SysAmountAuditing audit, String userName) {
+        if(audit.getAuditingStatus() > 0){
+            if(audit.getAuditingStatus() == 1){
+                AssertionUtils.isFail(true, "提现已付款请刷新列表");
+            }else{
+                AssertionUtils.isFail(true, "提现已驳回请刷新列表");
+            }
+        }
+        if(StringUtils.isBlank(audit.getReceiveUser())){
+            AssertionUtils.isFail(true, "请领取提现申请后再进行付款,返回待付款提现申请列表!");
+        }
+
+        if (!userName.equals(audit.getReceiveUser())) {
+            AssertionUtils.isFail(true, "申请已被"+ audit.getReceiveUser()+"领取返回待付款提现申请列表!");
+        }
+    }
+
+    /**
+     * 填充账户变更记录信息
+     *
+     * @param systemCode  租户代码
+     * @param userName    操作用户
+     * @param amount      操作的金额
+     * @param ywyUserId      业务员账户信息
+     * @param param       里面的id表示提现申请表 sys_amount_auditing 表的序号, accountId 表示 inv_account_card 表中账号
+     * @author lipf
+     * @date 2026/6/8 15:53
+     */
+    private SysUserAccountChangeLog fillSysUserAccountChangeLog(String systemCode, String userName,
+                                                                BigDecimal amountBefore,
+                                                                BigDecimal amount, String ywyUserId,
+                                                                AmountAuditEditParam param) {
+        log.info("填充业务员收支明细: param=[{}]systemCode=[{}],userName=[{}], amount=[{}], amountBefore=[{}], ywyUserId=[{}]", JSONUtil.toJsonStr(param), systemCode, userName, amount, amountBefore, ywyUserId);
+        // modify by lipf 2026年6月8日14:38:36 提现的时候,往账户操作记录表中插入数据
+        SysUserJzgInfo sysUserJzgInfo = sysJzgInfoService.getUserByUserId(ywyUserId);
+        String jzgInfoId=null;
+        String yewUserName = null;
+        if(sysUserJzgInfo != null){
+            jzgInfoId = sysUserJzgInfo.getId();
+            yewUserName = sysUserJzgInfo.getName();
+        }
+
+        SysUserAccountChangeLog changeLog = new  SysUserAccountChangeLog(systemCode,ywyUserId,jzgInfoId);
+        changeLog.setUserName(yewUserName);
+        changeLog.setAmountBefore(amountBefore);
+        // 提现操作
+        changeLog.setOperType(3);
+        changeLog.setRemark("提现");
+        SysAmountAuditing sysAmountAuditing = baseMapper.selectById(param.getId());
+        if(sysAmountAuditing != null){
+            String bankCardNum = sysAmountAuditing.getBankCardNum();
+            List<SysUserJzgInfoBankCard> sysUserJzgInfoBankCards =  sysUserJzgInfoBankCardService.queryBankCardBybankCardNum(bankCardNum,systemCode);
+            if(CollUtil.isNotEmpty(sysUserJzgInfoBankCards)){
+                SysUserJzgInfoBankCard sysUserJzgInfoBankCard = sysUserJzgInfoBankCards.get(0);
+                changeLog.setBankCardIdTo(sysUserJzgInfoBankCard.getId());
+                 changeLog.setBankCardNoTo(sysUserJzgInfoBankCard.getBankCardNumber());
+            }
+        }
+        changeLog.setUserId(ywyUserId);
+        List<InvAccountCard> accountCardVos = invAccountCardService.queryByAccountId(param.getAccountId(), systemCode);
+        if(CollUtil.size(accountCardVos) > 1){
+            throw new SystemException(String.format("租户%s下根据账号%s找到%d条",systemCode,param.getAccountId(),accountCardVos.size()));
+        }
+        if(CollUtil.isNotEmpty(accountCardVos)){
+            InvAccountCard accountCardVo = accountCardVos.get(0);
+            changeLog.setBankCardIdIn(accountCardVo.getId());
+            changeLog.setBankCardNoIn(accountCardVo.getBankCardNum());
+        }
+        changeLog.setAmount(BigDecimalUtil.negate(BigDecimalUtil.abs(amount)));
+        changeLog.setCreateBy(userName);
+        changeLog.setCreateTime(LocalDateTime.now());
+        changeLog.setUpdateBy(userName);
+        changeLog.setUpdateTime(LocalDateTime.now());
+        changeLog.setIsDelete(0);
+        return changeLog;
+    }
+
     @Override
     public void rejectAmount(AmountAuditRejectParam param) {
         String userName = baseController.getUserName();
@@ -325,7 +410,6 @@ public class SysAmountAuditingServiceImpl extends ServiceImpl<SysAmountAuditingM
         if(sumAmount.compareTo(applyWithdrawParam.getWithdrawAmount()) < 0){
             throw new SystemException("无法提现,请检查当前账户余额");
         }
-
         // 获取用户的银行卡信息
         SysUserJzgInfo sysUserJzgInfo = sysUserJzgInfoService.getUserByUserId(baseController.getUserId());
         List<SysUserJzgInfoBankCardDto> bankCardByUserId = sysUserJzgInfoBankCardService.getBankCardByUserId(sysUserJzgInfo.getId(),baseController.getSystemCode());
@@ -334,7 +418,6 @@ public class SysAmountAuditingServiceImpl extends ServiceImpl<SysAmountAuditingM
             throw new SystemException("提供的银行卡信息错误");
         }
         SysUserJzgInfoBankCardDto sysUserJzgInfoBankCardDto = bankCardByUserId.stream().filter(x -> x.getId().equals(applyWithdrawParam.getBankCardId())).findFirst().get();
-
         // 构造提现对象
         SysAmountAuditing sysAmountAuditing = new SysAmountAuditing(applyWithdrawParam,sysUserAccount,sysUserJzgInfoBankCardDto,baseController.getUserId());
         baseMapper.insert(sysAmountAuditing);
@@ -348,6 +431,7 @@ public class SysAmountAuditingServiceImpl extends ServiceImpl<SysAmountAuditingM
      */
     @Override
     public String exportAuditList(AmountAuditParam param) {
+        log.info("导出提现申请列表:param=[{}] ",JSONUtil.toJsonStr(param));
         List<AmountAuditVo> amountAuditVos = baseMapper.queryList(param.getPage(), param);
 
         // 调用动态导出
@@ -357,6 +441,30 @@ public class SysAmountAuditingServiceImpl extends ServiceImpl<SysAmountAuditingM
                 "应付账款-提现申请-导出-" + Instant.now()
         );
     }
+
+    /**
+     * 导出业务员收入支出明显
+     *
+     * param ywyIOParam 导出条件, 包含开始日期,结束日期
+     * @return String
+     */
+    @Override
+    public String exportYwyIORecs(YwyIOParam ywyIOParam) {
+        log.info("导出业务员收支明细:ywyIOParam=[{}]", JSONUtil.toJsonStr(ywyIOParam));
+        List<SysUserAccountChangeLog> changeLogs = sysUserAccountIncomeLogService.queryYwyIORecs(ywyIOParam);
+        String userName=null;
+        if(CollUtil.isNotEmpty(changeLogs)){
+            SysUserAccountChangeLog sysUserAccountChangeLog = changeLogs.get(0);
+            userName = sysUserAccountChangeLog.getUserName();
+        }
+        String suffix = String.join("-",Objects.toString(userName,""),Objects.toString(ywyIOParam.getBeginDate(),null) , Objects.toString(ywyIOParam.getEndDate(),null));
+        // 调用动态导出
+        return exportBaseService.upLoadFile(
+                SysUserAccountChangeLog.class,
+                changeLogs,
+                "业务员收支明细-导出-"+suffix + Instant.now()
+        );
+    }
 }
 
 

+ 30 - 3
tenant/organization/src/main/java/com/jzg/organization/service/impl/SysUserAccountIncomeLogServiceImpl.java

@@ -1,19 +1,46 @@
 package com.jzg.organization.service.impl;
 
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.jzg.commons.entity.account.po.SysUserAccountChangeLog;
+import com.jzg.commons.entity.dto.YwyIOParam;
 import com.jzg.organization.mapper.*;
 import com.jzg.organization.service.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
 
+import java.time.LocalDate;
+import java.util.List;
+
 /**
- * @author Administrator
- * @description 针对表【sys_area(省市县代码)】的数据库操作Service实现
- * @createDate 2023-11-15 11:23:28
+ *
+ * @date 2023-11-15 11:23:28
  */
 @Service
 public class SysUserAccountIncomeLogServiceImpl extends ServiceImpl<SysUserAccountIncomeLogMapper, SysUserAccountChangeLog> implements SysUserAccountIncomeLogService{
 
+    private static final Logger log = LoggerFactory.getLogger(SysUserAccountIncomeLogServiceImpl.class);
+
+    /**
+     * 查询业务员收支明细
+     *
+     * @param ywyIOParam 查询参数,包括业务员信息, 以及查询的时间范围
+     * @author lipf
+     * @date 2026/6/8 17:25
+     */
+    @Override
+    public List<SysUserAccountChangeLog> queryYwyIORecs(YwyIOParam ywyIOParam) {
+        log.info("查询业务员收支明细:ywyIOParam=[{}]", JSONUtil.toJsonStr(ywyIOParam));
+        LocalDate endDate = ywyIOParam.getEndDate();
+        if(endDate != null){
+            ywyIOParam.setEndDate(endDate.plusDays(1));
+        }
+        List<SysUserAccountChangeLog> changeLogs =  baseMapper.queryYwyIORecs(ywyIOParam.getYwyUserId(), ywyIOParam.getBeginDate(), ywyIOParam.getEndDate());
+        log.info("查询业务员收支明细:ywyIOParam=[{}]。 查询出[{}]条记录", JSONUtil.toJsonStr(ywyIOParam), CollUtil.size(changeLogs));
+        return changeLogs;
+    }
 }
 
 

+ 13 - 0
tenant/organization/src/main/java/com/jzg/organization/service/impl/SysUserJzgInfoBankCardServiceImpl.java

@@ -188,4 +188,17 @@ public class SysUserJzgInfoBankCardServiceImpl extends ServiceImpl<SysUserJzgInf
         SysUserJzgInfoBankCard sysUserJzgInfoBankCard = sysUserJzgInfoBankCardMapper.selectById(sysUserJzgInfoBankCardVo.getId());
         return sysUserJzgInfoBankCardMapper.deleteById(sysUserJzgInfoBankCard) > 0;
     }
+
+    /**
+     * 根据银行卡号查询银行卡的信息
+     *
+     * @param bankCardNum 银行卡号
+     * @param systemCode  租户代码
+     * @author lipf
+     * @date 2026/6/8 16:22
+     */
+    @Override
+    public List<SysUserJzgInfoBankCard> queryBankCardBybankCardNum(String bankCardNum, String systemCode) {
+        return sysUserJzgInfoBankCardMapper.queryBankCardBybankCardNum(bankCardNum, systemCode);
+    }
 }

+ 4 - 0
tenant/organization/src/main/resources/mapper/InvAccountCardMapper.xml

@@ -80,4 +80,8 @@
             </if>
         </where>
     </select>
+    <!-- 查询业务员提现银行卡信息 lipf 2026年6月8日15:16:59 -->
+    <select id="queryByAccountId" resultType="com.jzg.commons.entity.account.po.InvAccountCard">
+        select * from inv_account_card iac where iac.account_id = #{accountId} and iac.system_code = #{systemCode}
+    </select>
 </mapper>

+ 4 - 0
tenant/organization/src/main/resources/mapper/SysUserJzgInfoBankCardMapper.xml

@@ -79,4 +79,8 @@
         case when sujibc.is_default = 1 then 0 else 1 end,
         sujibc.create_time desc
     </select>
+    <!-- 根据银行卡号查询银行卡的信息 lipf 2026年6月8日16:24:13 -->
+    <select id="queryBankCardBybankCardNum" resultType="com.jzg.commons.entity.po.SysUserJzgInfoBankCard">
+        select * from sys_user_jzg_info_bank_card sujibc where sujibc.bank_card_number = #{bankCardNum} and sujibc.system_code = #{systemCode}
+    </select>
 </mapper>