Bladeren bron

导入提现明细

Yangzw 7 maanden geleden
bovenliggende
commit
934ce7f884
26 gewijzigde bestanden met toevoegingen van 332 en 49 verwijderingen
  1. 1 0
      feifan-module-distri/feifan-module-distri-api/src/main/java/cn/newfeifan/mall/module/distri/enums/CaclEnum.java
  2. 21 0
      feifan-module-distri/feifan-module-distri-api/src/main/java/cn/newfeifan/mall/module/distri/enums/WithdrawalResultEnum.java
  3. 13 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/applicationforwithdrawalchannel/ApplicationForWithdrawalChannelController.java
  4. 41 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/applicationforwithdrawalchannel/vo/ApplicationForWithdrawalChannelImportExcelVO.java
  5. 2 2
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/applicationforwithdrawalchannel/vo/ApplicationForWithdrawalChannelPageReqVO.java
  6. 3 3
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/applicationforwithdrawalchannel/vo/ApplicationForWithdrawalChannelRespVO.java
  7. 2 2
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/applicationforwithdrawalchannel/vo/ApplicationForWithdrawalChannelSaveReqVO.java
  8. 9 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/ptsettlement/PtSettlementController.java
  9. 3 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/ptsettlement/vo/PtSettlementPageReqVO.java
  10. 2 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/ptsettlement/vo/PtSettlementRespVO.java
  11. 3 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/ptsettlement/vo/PtSettlementSaveReqVO.java
  12. 5 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/shopsettlement/vo/ShopSettlementSaveReqVO.java
  13. 2 2
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/applicationforwithdrawalchannel/ApplicationForWithdrawalChannelDO.java
  14. 5 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/ptsettlement/PtSettlementDO.java
  15. 8 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/shopsettlement/ShopSettlementDO.java
  16. 12 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/applicationforwithdrawalchannel/ApplicationForWithdrawalChannelMapper.java
  17. 4 2
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/ptprofitlog/PtProfitLogMapper.java
  18. 7 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/applicationforwithdrawal/ApplicationForWithdrawalService.java
  19. 5 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/applicationforwithdrawal/ApplicationForWithdrawalServiceImpl.java
  20. 9 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/applicationforwithdrawalchannel/ApplicationForWithdrawalChannelService.java
  21. 126 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/applicationforwithdrawalchannel/ApplicationForWithdrawalChannelServiceImpl.java
  22. 30 20
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/ptsettlement/PtSettlementServiceImpl.java
  23. 1 2
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/shopsettlement/ShopSettlementService.java
  24. 6 12
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/shopsettlement/ShopSettlementServiceImpl.java
  25. 1 0
      feifan-module-system/feifan-module-system-api/src/main/java/cn/newfeifan/mall/module/system/enums/sms/SmsSceneEnum.java
  26. 11 4
      sql/mysql/建空库SQL/18_20240717.sql

+ 1 - 0
feifan-module-distri/feifan-module-distri-api/src/main/java/cn/newfeifan/mall/module/distri/enums/CaclEnum.java

@@ -31,6 +31,7 @@ public enum CaclEnum {
     ORDER_REFUND_ORDER_PAY_FREEZE_HIGH_QUOTA(24, "订单退款-撤回峰值奖","消费者购物,获得冻结峰值"),
     MANUAL_RETURN_INTEGRAL(25, "人工返回最早七天未获得的超出额度的合赢奖","人工返回最早七天未获得的合赢奖,超额的"),
     WITHDRAWAL(26, "用户提现","用户将可用积分提现到账户"),
+    WITHDRAWAL_ERROR(27, "提现失败退回","提现失败退回积分到用户"),
     ;
 
     /**

+ 21 - 0
feifan-module-distri/feifan-module-distri-api/src/main/java/cn/newfeifan/mall/module/distri/enums/WithdrawalResultEnum.java

@@ -0,0 +1,21 @@
+package cn.newfeifan.mall.module.distri.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 提现结果枚举
+ */
+
+@Getter
+@AllArgsConstructor
+public enum WithdrawalResultEnum {
+
+    SUCCESS("SUCCESS","交易成功"),
+    FAIL("FAIL","交易失败"),
+    ;
+
+    private final String result;
+
+    private final String mark;
+}

+ 13 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/applicationforwithdrawalchannel/ApplicationForWithdrawalChannelController.java

@@ -27,6 +27,7 @@ import static cn.newfeifan.mall.framework.operatelog.core.enums.OperateTypeEnum.
 import cn.newfeifan.mall.module.distri.controller.admin.applicationforwithdrawalchannel.vo.*;
 import cn.newfeifan.mall.module.distri.dal.dataobject.applicationforwithdrawalchannel.ApplicationForWithdrawalChannelDO;
 import cn.newfeifan.mall.module.distri.service.applicationforwithdrawalchannel.ApplicationForWithdrawalChannelService;
+import org.springframework.web.multipart.MultipartFile;
 
 @Tag(name = "管理后台 - 提现渠道记录")
 @RestController
@@ -96,4 +97,16 @@ public class ApplicationForWithdrawalChannelController {
         ExcelUtils.write(response, "提现记录.xls", "数据", ApplicationForWithdrawalChannelExcelRespVO.class, list);
     }
 
+    @PostMapping("/import")
+    @Operation(summary = "导入提现明细, excel表")
+    @PreAuthorize("@ss.hasPermission('distri:application-for-withdrawal-channel:import')")
+    public CommonResult<List<ApplicationForWithdrawalChannelImportExcelVO>> importExcel(@RequestParam("file") MultipartFile file, @RequestParam("id") Long id) throws Exception{
+
+        List<ApplicationForWithdrawalChannelImportExcelVO> list = ExcelUtils.read(file, ApplicationForWithdrawalChannelImportExcelVO.class);
+
+
+
+        return success(applicationForWithdrawalChannelService.importExcel(list,id));
+    }
+
 }

+ 41 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/applicationforwithdrawalchannel/vo/ApplicationForWithdrawalChannelImportExcelVO.java

@@ -0,0 +1,41 @@
+package cn.newfeifan.mall.module.distri.controller.admin.applicationforwithdrawalchannel.vo;
+
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+
+/**
+ * 提现明细 Excel 导入 VO
+ */
+
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+@Accessors(chain = false) // 设置 chain = false,避免用户导入有问题
+public class ApplicationForWithdrawalChannelImportExcelVO {
+
+    @ExcelProperty("收款方名称")
+    private String accountName;
+
+    @ExcelProperty("收款方账号")
+    private String accountNumber;
+
+    @ExcelProperty("金额")
+    private String money;
+
+    @ExcelProperty("附言/用途")
+    private String postscript;
+
+    @ExcelProperty("交易结果")
+    private String payResult;
+
+    @ExcelProperty("交易描述")
+    private String payDescription;
+
+}

+ 2 - 2
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/applicationforwithdrawalchannel/vo/ApplicationForWithdrawalChannelPageReqVO.java

@@ -26,8 +26,8 @@ public class ApplicationForWithdrawalChannelPageReqVO extends PageParam {
     @Schema(description = "提现笔数", example = "6693")
     private Integer count;
 
-    @Schema(description = "提现状态,已完成是1,未完成为0", example = "1")
-    private Boolean status;
+    @Schema(description = "提现状态, 0:未完成 , 1:已完成 , 2:部分完成 , 3:全部失败", example = "1")
+    private Integer status;
 
     @Schema(description = "提现渠道记录id", example = "14600")
     private Long ptDailyWithdrawalId;

+ 3 - 3
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/applicationforwithdrawalchannel/vo/ApplicationForWithdrawalChannelRespVO.java

@@ -30,9 +30,9 @@ public class ApplicationForWithdrawalChannelRespVO {
     @ExcelProperty("提现笔数")
     private Integer count;
 
-    @Schema(description = "提现状态,已完成是1,未完成为0", example = "1")
-    @ExcelProperty("提现状态,已完成是1,未完成为0")
-    private Boolean status;
+    @Schema(description = "提现状态, 0:未完成 , 1:已完成 , 2:部分完成 , 3:全部失败", example = "1")
+    @ExcelProperty("提现状态, 0:未完成 , 1:已完成 , 2:部分完成 , 3:全部失败")
+    private Integer status;
 
     @Schema(description = "提现渠道记录id", requiredMode = Schema.RequiredMode.REQUIRED, example = "14600")
     @ExcelProperty("提现渠道记录id")

+ 2 - 2
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/applicationforwithdrawalchannel/vo/ApplicationForWithdrawalChannelSaveReqVO.java

@@ -27,8 +27,8 @@ public class ApplicationForWithdrawalChannelSaveReqVO {
     @NotNull(message = "提现笔数不能为空")
     private Integer count;
 
-    @Schema(description = "提现状态,已完成是1,未完成为0", example = "1")
-    private Boolean status;
+    @Schema(description = "提现状态, 0:未完成 , 1:已完成 , 2:部分完成 , 3:全部失败", example = "1")
+    private Integer status;
 
     @Schema(description = "提现渠道记录id", requiredMode = Schema.RequiredMode.REQUIRED, example = "14600")
     @NotNull(message = "提现渠道记录id不能为空")

+ 9 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/ptsettlement/PtSettlementController.java

@@ -105,7 +105,16 @@ public class PtSettlementController {
     public void exportPtSettlementExcelTransferTemplate(@Valid ShopSettlementPageReqVO pageReqVO,
                                         HttpServletResponse response) throws IOException {
         pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+
         List<TransferTemplateRespVO> list = shopSettlementService.excelShopSettlementPage(pageReqVO);
+
+        if(!list.isEmpty()){
+            PtSettlementDO ptSettlement = ptSettlementService.getPtSettlement(pageReqVO.getPtSettlementId());
+
+            ptSettlement.setExportStatus(true);
+            ptSettlementService.updatePtSettlement(BeanUtils.toBean(ptSettlement, PtSettlementSaveReqVO.class));
+        }
+
         // 导出 Excel
         ExcelUtils.write(response, "批量转账,批量转账.xls", "数据", TransferTemplateRespVO.class,list);
     }

+ 3 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/ptsettlement/vo/PtSettlementPageReqVO.java

@@ -31,4 +31,7 @@ public class PtSettlementPageReqVO extends PageParam {
     @Schema(description = "是否结账")
     private Boolean platformTransferConfirm;
 
+    @Schema(description = "导出状态,已导出是1,未导出为0", example = "1")
+    private Boolean exportStatus;
+
 }

+ 2 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/ptsettlement/vo/PtSettlementRespVO.java

@@ -39,4 +39,6 @@ public class PtSettlementRespVO {
     @ExcelProperty("状态")
     private Integer status;
 
+    @Schema(description = "导出状态,已导出是1,未导出为0", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    private Boolean exportStatus;
 }

+ 3 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/ptsettlement/vo/PtSettlementSaveReqVO.java

@@ -26,4 +26,7 @@ public class PtSettlementSaveReqVO {
     @Schema(description = "是否结账")
     private Boolean platformTransferConfirm;
 
+    @Schema(description = "导出状态,已导出是1,未导出为0", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    private Boolean exportStatus;
+
 }

+ 5 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/shopsettlement/vo/ShopSettlementSaveReqVO.java

@@ -38,4 +38,9 @@ public class ShopSettlementSaveReqVO {
     @Schema(description = "转账凭证附件")
     private String attachment;
 
+    @Schema(description = "账户名称", example = "张三")
+    private String accountName;
+
+    @Schema(description = "账户号码")
+    private String accountNumber;
 }

+ 2 - 2
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/applicationforwithdrawalchannel/ApplicationForWithdrawalChannelDO.java

@@ -41,9 +41,9 @@ public class ApplicationForWithdrawalChannelDO extends BaseDO {
      */
     private Integer count;
     /**
-     * 提现状态,已完成是1,未完成为0
+     * 提现状态, 0:未完成 , 1:已完成 , 2:部分完成 , 3:全部失败
      */
-    private Boolean status;
+    private Integer status;
     /**
      * 提现渠道记录id
      */

+ 5 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/ptsettlement/PtSettlementDO.java

@@ -47,4 +47,9 @@ public class PtSettlementDO extends BaseDO {
      */
     private Integer status;
 
+    /**
+     * 导出状态,已导出是1,未导出为0
+     */
+    private Boolean exportStatus;
+
 }

+ 8 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/shopsettlement/ShopSettlementDO.java

@@ -53,5 +53,13 @@ public class ShopSettlementDO extends BaseDO {
      * 转账凭证附件
      */
     private String attachment;
+    /**
+     * 账户名称
+     */
+    private String accountName;
+    /**
+     * 账户号码
+     */
+    private String accountNumber;
 
 }

+ 12 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/applicationforwithdrawalchannel/ApplicationForWithdrawalChannelMapper.java

@@ -28,4 +28,16 @@ public interface ApplicationForWithdrawalChannelMapper extends BaseMapperX<Appli
                 .orderByDesc(ApplicationForWithdrawalChannelDO::getId));
     }
 
+    /**
+     * 获取提现渠道记录
+     * @param status 状态
+     * @param ptDailyWithdrawalId 一级提现记录id
+     * @return 记录条数
+     */
+    default Long selectCount(Integer status, Long ptDailyWithdrawalId){
+        return selectCount(new LambdaQueryWrapperX<ApplicationForWithdrawalChannelDO>()
+                .eq(ApplicationForWithdrawalChannelDO::getStatus, status)
+                .eq(ApplicationForWithdrawalChannelDO::getPtDailyWithdrawalId, ptDailyWithdrawalId)
+        );
+    }
 }

+ 4 - 2
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/ptprofitlog/PtProfitLogMapper.java

@@ -40,7 +40,8 @@ public interface PtProfitLogMapper extends BaseMapperX<PtProfitLogDO> {
                 ORDER_PAY_FREEZE_HIGH_QUOTA.getType(),
                 ORDER_REFUND_ORDER_PAY_FREEZE_HIGH_QUOTA.getType(),
                 MANUAL_RETURN_INTEGRAL.getType(),
-                WITHDRAWAL.getType()
+                WITHDRAWAL.getType(),
+                WITHDRAWAL_ERROR.getType()
         );
 
         if(reqVO.getUserId().equals(PT_ID)){
@@ -62,7 +63,8 @@ public interface PtProfitLogMapper extends BaseMapperX<PtProfitLogDO> {
                     ORDER_CANCEL_BY_SYSTEM_REFUND_INTEGRAL.getType(),
                     ORDER_PAY_FREEZE_HIGH_QUOTA.getType(),
                     ORDER_REFUND_ORDER_PAY_FREEZE_HIGH_QUOTA.getType(),
-                    WITHDRAWAL.getType()
+                    WITHDRAWAL.getType(),
+                    WITHDRAWAL_ERROR.getType()
             );
 //            reqVO.setUserId(null);
         }

+ 7 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/applicationforwithdrawal/ApplicationForWithdrawalService.java

@@ -58,4 +58,11 @@ public interface ApplicationForWithdrawalService {
      * @return 提现记录
      */
     List<ApplicationForWithdrawalChannelExcelRespVO> getApplicationForWithdrawalChannelPage(Long id);
+
+    /**
+     * 获得提现申请记录
+     * @param id 通道记录id
+     * @return 提现记录
+     */
+    List<ApplicationForWithdrawalDO> selectListByChannelId(Long id);
 }

+ 5 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/applicationforwithdrawal/ApplicationForWithdrawalServiceImpl.java

@@ -111,4 +111,9 @@ public class ApplicationForWithdrawalServiceImpl implements ApplicationForWithdr
         return list;
     }
 
+    @Override
+    public List<ApplicationForWithdrawalDO> selectListByChannelId(Long id) {
+        return applicationForWithdrawalMapper.selectList(ApplicationForWithdrawalDO::getApplicationForWithdrawalChannelId,id, ApplicationForWithdrawalDO::getStatus,0);
+    }
+
 }

+ 9 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/applicationforwithdrawalchannel/ApplicationForWithdrawalChannelService.java

@@ -5,6 +5,8 @@ import cn.newfeifan.mall.module.distri.controller.admin.applicationforwithdrawal
 import cn.newfeifan.mall.module.distri.dal.dataobject.applicationforwithdrawalchannel.ApplicationForWithdrawalChannelDO;
 import cn.newfeifan.mall.framework.common.pojo.PageResult;
 
+import java.util.List;
+
 /**
  * 提现渠道记录 Service 接口
  *
@@ -56,4 +58,11 @@ public interface ApplicationForWithdrawalChannelService {
      * @param id 编号
      */
     void updateApplicationForWithdrawalChannel(Long id);
+
+    /**
+     * 导入提现明细, excel表
+     * @param list 明细
+     * @param id 通道id
+     */
+    List<ApplicationForWithdrawalChannelImportExcelVO> importExcel(List<ApplicationForWithdrawalChannelImportExcelVO> list, Long id);
 }

+ 126 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/applicationforwithdrawalchannel/ApplicationForWithdrawalChannelServiceImpl.java

@@ -1,7 +1,23 @@
 package cn.newfeifan.mall.module.distri.service.applicationforwithdrawalchannel;
 
+import cn.newfeifan.mall.framework.common.exception.ErrorCode;
+import cn.newfeifan.mall.module.distri.controller.admin.applicationforwithdrawal.vo.ApplicationForWithdrawalSaveReqVO;
+import cn.newfeifan.mall.module.distri.controller.admin.integral.vo.IntegralSaveReqVO;
+import cn.newfeifan.mall.module.distri.controller.admin.ptdailywithdrawal.vo.PtDailyWithdrawalSaveReqVO;
+import cn.newfeifan.mall.module.distri.controller.admin.ptprofitlog.vo.PtProfitLogSaveReqVO;
+import cn.newfeifan.mall.module.distri.dal.dataobject.applicationforwithdrawal.ApplicationForWithdrawalDO;
+import cn.newfeifan.mall.module.distri.dal.dataobject.integral.IntegralDO;
+import cn.newfeifan.mall.module.distri.dal.dataobject.ptdailywithdrawal.PtDailyWithdrawalDO;
+import cn.newfeifan.mall.module.distri.enums.PtSettlemntStatusEnum;
+import cn.newfeifan.mall.module.distri.enums.WithdrawalResultEnum;
+import cn.newfeifan.mall.module.distri.service.applicationforwithdrawal.ApplicationForWithdrawalService;
+import cn.newfeifan.mall.module.distri.service.integral.IntegralService;
+import cn.newfeifan.mall.module.distri.service.ptdailywithdrawal.PtDailyWithdrawalService;
+import cn.newfeifan.mall.module.distri.service.ptprofitlog.PtProfitLogService;
 import org.springframework.stereotype.Service;
+
 import javax.annotation.Resource;
+
 import org.springframework.validation.annotation.Validated;
 import cn.newfeifan.mall.module.distri.controller.admin.applicationforwithdrawalchannel.vo.*;
 import cn.newfeifan.mall.module.distri.dal.dataobject.applicationforwithdrawalchannel.ApplicationForWithdrawalChannelDO;
@@ -10,7 +26,12 @@ import cn.newfeifan.mall.framework.common.util.object.BeanUtils;
 
 import cn.newfeifan.mall.module.distri.dal.mysql.applicationforwithdrawalchannel.ApplicationForWithdrawalChannelMapper;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import static cn.newfeifan.mall.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.newfeifan.mall.module.distri.constant.DistriConstants.MILLION;
+import static cn.newfeifan.mall.module.distri.enums.CaclEnum.WITHDRAWAL_ERROR;
 import static cn.newfeifan.mall.module.distri.enums.ErrorCodeConstants.*;
 
 /**
@@ -25,6 +46,18 @@ public class ApplicationForWithdrawalChannelServiceImpl implements ApplicationFo
     @Resource
     private ApplicationForWithdrawalChannelMapper applicationForWithdrawalChannelMapper;
 
+    @Resource
+    private ApplicationForWithdrawalService withdrawalService;
+
+    @Resource
+    private PtDailyWithdrawalService ptDailyWithdrawalService;
+
+    @Resource
+    private IntegralService integralService;
+
+    @Resource
+    private PtProfitLogService ptProfitLogService;
+
     @Override
     public Long createApplicationForWithdrawalChannel(ApplicationForWithdrawalChannelSaveReqVO createReqVO) {
         // 插入
@@ -76,4 +109,97 @@ public class ApplicationForWithdrawalChannelServiceImpl implements ApplicationFo
         applicationForWithdrawalChannelMapper.updateById(channel);
     }
 
+    @Override
+    public List<ApplicationForWithdrawalChannelImportExcelVO> importExcel(List<ApplicationForWithdrawalChannelImportExcelVO> list, Long id) {
+        // 用来记录错误的记录
+        List<ApplicationForWithdrawalChannelImportExcelVO> errorList = new ArrayList<>();
+
+        List<ApplicationForWithdrawalDO> withdrawalList = withdrawalService.selectListByChannelId(id);
+
+        // 异常判断
+        if (withdrawalList.isEmpty()) {
+            ErrorCode ERROR = new ErrorCode(1_002_030_034, "选中行的记录为空");
+            throw exception(ERROR);
+        }
+        if (list.isEmpty()) {
+            ErrorCode ERROR = new ErrorCode(1_002_030_035, "上传的Excel文件中没有数据");
+            throw exception(ERROR);
+        }
+
+        for (ApplicationForWithdrawalChannelImportExcelVO importVO : list) {
+
+            for (ApplicationForWithdrawalDO withdrawalDO : withdrawalList) {
+
+                // 当前提提现记录的金额和账号与Excel中的金额和账号一致时
+                if (withdrawalDO.getAmount().toString().equals(importVO.getMoney()) &&
+                        withdrawalDO.getWithdrawalAccount().equals(importVO.getAccountNumber())) {
+
+                    if(importVO.getPayResult().equals(WithdrawalResultEnum.SUCCESS.getResult())){
+                        withdrawalDO.setStatus(true);
+                    }else{
+                        withdrawalDO.setStatus(false);
+                        // 记录提现失败的记录
+                        errorList.add(importVO);
+
+                        // 退回用户提现积分数量
+                        IntegralDO integralDO = integralService.selectByUser(withdrawalDO.getUserId());
+                        Long integral = Long.parseLong(importVO.getMoney()) * MILLION;
+
+                        integralDO.setCurrentQuota(integralDO.getCurrentQuota() + integral);
+                        integralService.updateIntegral(BeanUtils.toBean(integralDO, IntegralSaveReqVO.class));
+
+                        // 添加用户积分变动Log
+                        PtProfitLogSaveReqVO ptProfitLogSaveReqVO = PtProfitLogSaveReqVO.builder()
+                                .amount(integral)
+                                .afterAmount(integralDO.getCurrentQuota())
+                                .profitStatus(WITHDRAWAL_ERROR.getType())
+                                .userId(withdrawalDO.getUserId())
+                                .generateUserId(integralDO.getUserId())
+                                .build();
+                        ptProfitLogService.createPtProfitLog(ptProfitLogSaveReqVO);
+
+                        // 发送短信通知用户提现失败
+                    }
+
+                    withdrawalService.updateApplicationForWithdrawal(BeanUtils.toBean(withdrawalDO, ApplicationForWithdrawalSaveReqVO.class));
+
+                }
+            }
+        }
+
+        ApplicationForWithdrawalChannelDO applicationForWithdrawalChannelDO = applicationForWithdrawalChannelMapper.selectById(id);
+
+        // 根据导入的记录判断提现结果
+        if(errorList.isEmpty()){
+            applicationForWithdrawalChannelDO.setStatus(PtSettlemntStatusEnum.SETTLEMENT.getStatus());
+        }else if (errorList.size() < withdrawalList.size()){
+            applicationForWithdrawalChannelDO.setStatus(PtSettlemntStatusEnum.SETTLEMENT_ERROR.getStatus());
+        }else if(errorList.size() == withdrawalList.size()){
+            applicationForWithdrawalChannelDO.setStatus(PtSettlemntStatusEnum.SETTLEMENT_SUCCESS.getStatus());
+        }
+
+        // 更新状态
+        applicationForWithdrawalChannelMapper.updateById(applicationForWithdrawalChannelDO);
+
+        Long allCount = applicationForWithdrawalChannelMapper.selectCount(ApplicationForWithdrawalChannelDO::getPtDailyWithdrawalId, applicationForWithdrawalChannelDO.getPtDailyWithdrawalId());
+        Long successCount = applicationForWithdrawalChannelMapper.selectCount(PtSettlemntStatusEnum.SETTLEMENT.getStatus(),applicationForWithdrawalChannelDO.getPtDailyWithdrawalId());
+
+        PtDailyWithdrawalDO ptDailyWithdrawal = ptDailyWithdrawalService.getPtDailyWithdrawal(applicationForWithdrawalChannelDO.getPtDailyWithdrawalId());
+
+        // 更新一级记录的提现状态
+        if(allCount.equals(successCount)){
+            ptDailyWithdrawal.setStatus(PtSettlemntStatusEnum.SETTLEMENT.getStatus());
+        }else if(successCount == 0) {
+            ptDailyWithdrawal.setStatus(PtSettlemntStatusEnum.SETTLEMENT_SUCCESS.getStatus());
+        }else {
+            ptDailyWithdrawal.setStatus(PtSettlemntStatusEnum.SETTLEMENT_ERROR.getStatus());
+        }
+
+        // 更新状态
+        ptDailyWithdrawalService.updatePtDailyWithdrawal(BeanUtils.toBean(ptDailyWithdrawal, PtDailyWithdrawalSaveReqVO.class));
+
+        return errorList;
+
+    }
+
 }

+ 30 - 20
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/ptsettlement/PtSettlementServiceImpl.java

@@ -4,8 +4,8 @@ import cn.hutool.core.io.IoUtil;
 import cn.newfeifan.mall.framework.common.exception.ErrorCode;
 import cn.newfeifan.mall.module.distri.controller.admin.shopsettlement.vo.ShopSettlementRespVO;
 import cn.newfeifan.mall.module.distri.controller.admin.shopsettlement.vo.ShopSettlementSaveReqVO;
+import cn.newfeifan.mall.module.distri.dal.dataobject.shopsettlement.ShopSettlementDO;
 import cn.newfeifan.mall.module.distri.dal.dataobject.shopsettlement.data.ShopSettlementErrorData;
-import cn.newfeifan.mall.module.distri.dal.dataobject.shopsettlement.data.ShopSettlementPDFData;
 import cn.newfeifan.mall.module.distri.dal.dataobject.shopsettlement.file.BufferedImageMultipartFile;
 import cn.newfeifan.mall.module.distri.enums.PtSettlemntStatusEnum;
 import cn.newfeifan.mall.module.distri.service.shopsettlement.ShopSettlementService;
@@ -122,7 +122,7 @@ public class PtSettlementServiceImpl implements PtSettlementService {
         }
 
         // 获取选择日期,店铺的结算信息
-        List<ShopSettlementPDFData> shopSettList = shopSettlementService.selectListByPtId(id);
+        List<ShopSettlementDO> shopSettList = shopSettlementService.selectListByPtId(id);
 
         if (shopSettList.isEmpty()) {
             ErrorCode ERROR = new ErrorCode(1_002_030_027, "选择的行中没有结算单记录");
@@ -140,6 +140,11 @@ public class PtSettlementServiceImpl implements PtSettlementService {
             // 加载指定路径的PDF文档
             PDDocument document = PDDocument.load(tempFile.toFile());
 
+            if(document.getNumberOfPages() == 0){
+                ErrorCode ERROR = new ErrorCode(1_002_030_028, "选择的文件是空的");
+                throw exception(ERROR);
+            }
+
             // 创建PDF渲染器,用于将PDF页面渲染为图像
             PDFRenderer pdfRenderer = new PDFRenderer(document);
 
@@ -182,13 +187,13 @@ public class PtSettlementServiceImpl implements PtSettlementService {
                 // 判断备注的账单日期是否与结算单为同一天
                 String time = getOrderTime(pageText);
                 if (time != null && !time.isEmpty()) {
-                    for (ShopSettlementPDFData shopSettlementPDFData : shopSettList) {
+                    for (ShopSettlementDO shopSettlement : shopSettList) {
                         // 判断日期是否同样
-                        isSameDate(shopSettlementPDFData, formatter, time);
+                        isSameDate(shopSettlement, formatter, time);
                     }
                 }
 
-                for (ShopSettlementPDFData shopSettlementPDFData : shopSettList) {
+                for (ShopSettlementDO shopSettlement : shopSettList) {
                     // 账号
                     String accountNumber = getErrorAccountNumber(pageText, false);
                     // 户名
@@ -196,9 +201,9 @@ public class PtSettlementServiceImpl implements PtSettlementService {
                     // 金额
                     String money = getMoney(pageText);
 
-                    if (shopSettlementPDFData.getShop().getAccountNumber().equals(accountNumber) &&
-                            shopSettlementPDFData.getShop().getAccountName().equals(accountName) &&
-                            shopSettlementPDFData.getShopTotalHighAmount().divide(new BigDecimal("100"), 2, RoundingMode.FLOOR).toString().equals(money)) {
+                    if (shopSettlement.getAccountNumber().equals(accountNumber) &&
+                            shopSettlement.getAccountName().equals(accountName) &&
+                            shopSettlement.getShopTotalHighAmount().divide(new BigDecimal("100"), 2, RoundingMode.FLOOR).toString().equals(money)) {
 
                         BufferedImage image = pdfRenderer.renderImageWithDPI(pageIndex, 300);
                         int desiredHeight = 1200; // 设定你想要的高度
@@ -231,7 +236,7 @@ public class PtSettlementServiceImpl implements PtSettlementService {
                         // 上传文件
                         String fileUrl = fileService.createFile(file.getOriginalFilename(), null, IoUtil.readBytes(file.getInputStream()));
 
-                        ShopSettlementSaveReqVO bean = BeanUtils.toBean(shopSettlementPDFData, ShopSettlementSaveReqVO.class);
+                        ShopSettlementSaveReqVO bean = BeanUtils.toBean(shopSettlement, ShopSettlementSaveReqVO.class);
                         bean.setAttachment(fileUrl);
 
                         // 保存修改结算单
@@ -245,13 +250,13 @@ public class PtSettlementServiceImpl implements PtSettlementService {
 
                 for (ShopSettlementErrorData shopSettlementErrorData : errorList) {
 
-                    for (ShopSettlementPDFData shopSettlementPDFData : shopSettList) {
+                    for (ShopSettlementDO shopSettlement : shopSettList) {
 
-                        if (shopSettlementPDFData.getShop().getAccountNumber().equals(shopSettlementErrorData.getAccountNumber()) &&
-                                shopSettlementPDFData.getShop().getAccountName().equals(shopSettlementErrorData.getAccountName()) &&
-                                shopSettlementPDFData.getShopTotalHighAmount().divide(new BigDecimal("100"), 2, RoundingMode.FLOOR).toString().equals(shopSettlementErrorData.getMoney())
+                        if (shopSettlement.getAccountNumber().equals(shopSettlementErrorData.getAccountNumber()) &&
+                                shopSettlement.getAccountName().equals(shopSettlementErrorData.getAccountName()) &&
+                                shopSettlement.getShopTotalHighAmount().divide(new BigDecimal("100"), 2, RoundingMode.FLOOR).toString().equals(shopSettlementErrorData.getMoney())
                         ) {
-                            ShopSettlementSaveReqVO bean = BeanUtils.toBean(shopSettlementPDFData, ShopSettlementSaveReqVO.class);
+                            ShopSettlementSaveReqVO bean = BeanUtils.toBean(shopSettlement, ShopSettlementSaveReqVO.class);
                             bean.setAttachment(null);
 
                             shopSettlementErrorData.setShopSettlement(BeanUtils.toBean(bean, ShopSettlementRespVO.class));
@@ -263,8 +268,8 @@ public class PtSettlementServiceImpl implements PtSettlementService {
             }
 
             boolean status = true;
-            for (ShopSettlementPDFData shopSettlementPDFData : shopSettList) {
-                if (shopSettlementPDFData.getAttachment() == null) {
+            for (ShopSettlementDO shopSettlement : shopSettList) {
+                if (shopSettlement.getAttachment() == null) {
                     status = false;
                 }
             }
@@ -287,7 +292,12 @@ public class PtSettlementServiceImpl implements PtSettlementService {
             // 关闭PDF文档
             document.close();
         } catch (Exception e) {
-            ErrorCode ERROR = new ErrorCode(1_002_030_027, "处理PDF文件异常: " + e.getMessage());
+            String message = e.getMessage();
+            if(e.getMessage().equals("String index out of range: -1")){
+                message = "上传的PDF文件内容不正确!";
+            }
+
+            ErrorCode ERROR = new ErrorCode(1_002_030_027, "处理PDF文件异常: " + message);
             throw exception(ERROR);
         }
 
@@ -297,13 +307,13 @@ public class PtSettlementServiceImpl implements PtSettlementService {
     /**
      * 判断备注的账单日期是否与结算单为同一天
      *
-     * @param shopSettlementPDFData 结算单
+     * @param shopSettlement 结算单
      * @param formatter             日期格式
      * @param time                  日期
      */
-    private void isSameDate(ShopSettlementPDFData shopSettlementPDFData, DateTimeFormatter formatter, String time) {
+    private void isSameDate(ShopSettlementDO shopSettlement, DateTimeFormatter formatter, String time) {
         // 使用定义的格式器格式化LocalDateTime对象
-        String formattedDate = shopSettlementPDFData.getCreateTime().minusDays(1).format(formatter);
+        String formattedDate = shopSettlement.getCreateTime().minusDays(1).format(formatter);
 
         if (!time.equals(formattedDate)) {
             ErrorCode ERROR = new ErrorCode(1_002_030_028, "上传的PDF文件中有回执单日期与结算单日期不同!");

+ 1 - 2
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/shopsettlement/ShopSettlementService.java

@@ -6,7 +6,6 @@ import cn.newfeifan.mall.module.distri.controller.admin.ptsettlement.vo.Transfer
 import cn.newfeifan.mall.module.distri.controller.admin.shopsettlement.vo.*;
 import cn.newfeifan.mall.module.distri.dal.dataobject.shopsettlement.ShopSettlementDO;
 import cn.newfeifan.mall.framework.common.pojo.PageResult;
-import cn.newfeifan.mall.module.distri.dal.dataobject.shopsettlement.data.ShopSettlementPDFData;
 
 import java.util.List;
 
@@ -74,5 +73,5 @@ public interface ShopSettlementService {
      * @param id ptID
      * @return 店铺结算信息
      */
-    List<ShopSettlementPDFData> selectListByPtId(Long id);
+    List<ShopSettlementDO> selectListByPtId(Long id);
 }

+ 6 - 12
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/shopsettlement/ShopSettlementServiceImpl.java

@@ -7,7 +7,6 @@ import cn.newfeifan.mall.module.distri.controller.admin.ptsettlement.vo.Transfer
 import cn.newfeifan.mall.module.distri.dal.dataobject.orderitemsettlement.OrderItemSettlementDO;
 import cn.newfeifan.mall.module.distri.dal.dataobject.ordersettlement.OrderSettlementDO;
 import cn.newfeifan.mall.module.distri.dal.dataobject.ptsettlement.PtSettlementDO;
-import cn.newfeifan.mall.module.distri.dal.dataobject.shopsettlement.data.ShopSettlementPDFData;
 import cn.newfeifan.mall.module.distri.dal.mysql.dailybill.DailyBillMapper;
 import cn.newfeifan.mall.module.distri.dal.mysql.orderitemsettlement.OrderItemSettlementMapper;
 import cn.newfeifan.mall.module.distri.dal.mysql.ordersettlement.OrderSettlementMapper;
@@ -168,6 +167,8 @@ public class ShopSettlementServiceImpl implements ShopSettlementService {
 
         for (MerchantDTO merchant : merchantDTOS) {
             for (Long shopId : merchant.getShopIds()) {
+                // 后面补加的,记录结算时的账号,而不是实时的
+                ShopDTO shop = shopApi.getShop(shopId);
                 List<OrderDTO> orders = shopSettlementMapper.getOrderByMerchantIdWithsShopId(shopId, merchant.getMerchantId());
                 // 当前店铺没有订单,则跳过
                 if (orders.isEmpty()) {
@@ -233,6 +234,8 @@ public class ShopSettlementServiceImpl implements ShopSettlementService {
                         .platformCollectionAmount(platformCollectionAmount)
                         .shopAmount(payIntegral)
                         .shopTotalHighAmount(totalHighAmount.setScale(6, RoundingMode.HALF_UP))
+                        .accountName(shop.getAccountName())
+                        .accountNumber(shop.getAccountNumber())
                         .build();
                 shopSettlementDOS.add(shopSett);
             }
@@ -276,16 +279,7 @@ public class ShopSettlementServiceImpl implements ShopSettlementService {
     }
 
     @Override
-    public List<ShopSettlementPDFData> selectListByPtId(Long id) {
-        List<ShopSettlementDO> shopSettlementDOS = shopSettlementMapper.selectList(ShopSettlementDO::getPtSettlementId, id);
-        List<ShopSettlementPDFData> list = new ArrayList<>();
-
-        for (ShopSettlementDO settlementDO : shopSettlementDOS) {
-            ShopSettlementPDFData bean = BeanUtils.toBean(settlementDO, ShopSettlementPDFData.class);
-            bean.setShop(shopApi.getShop(settlementDO.getShopId()));
-            list.add(bean);
-        }
-
-        return list;
+    public List<ShopSettlementDO> selectListByPtId(Long id) {
+        return shopSettlementMapper.selectList(ShopSettlementDO::getPtSettlementId, id);
     }
 }

+ 1 - 0
feifan-module-system/feifan-module-system-api/src/main/java/cn/newfeifan/mall/module/system/enums/sms/SmsSceneEnum.java

@@ -20,6 +20,7 @@ public enum SmsSceneEnum implements IntArrayValuable {
     MEMBER_UPDATE_MOBILE(2, "user-update-mobile", "会员用户 - 修改手机"),
     MEMBER_UPDATE_PASSWORD(3, "user-update-password", "会员用户 - 修改密码"),
     MEMBER_RESET_PASSWORD(4, "user-reset-password", "会员用户 - 忘记密码"),
+    MEMBER_WITHDRAWAL_ERROR(6, "user-withdrawal-error", "会员用户 - 提现失败时发送通知给用户"),
 
     ADMIN_MEMBER_LOGIN(21, "admin-sms-login", "后台用户 - 手机号登录");
 

+ 11 - 4
sql/mysql/建空库SQL/18_20240717.sql

@@ -28,7 +28,7 @@ CREATE TABLE `distri_application_for_withdrawal_channel` (
                                                              `withdrawal_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '提现渠道名称',
                                                              `amount` bigint NOT NULL DEFAULT '0' COMMENT '提现金额,单位:元',
                                                              `count` int NOT NULL DEFAULT '0' COMMENT '提现笔数',
-                                                             `status` bit(1) DEFAULT b'0' COMMENT '提现状态,已完成是1,未完成为0',
+                                                             `status` tinyint DEFAULT '0' COMMENT '提现状态, 0:未完成 , 1:已完成 , 2:部分完成 , 3:全部失败',
                                                              `pt_daily_withdrawal_id` bigint NOT NULL COMMENT '提现渠道记录id',
                                                              `excel_status` bit(1) NOT NULL DEFAULT b'0' COMMENT '导出状态,已导出是1,未导出为0',
                                                              `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '' COMMENT '创建者',
@@ -43,7 +43,7 @@ CREATE TABLE `distri_pt_daily_withdrawal` (
                                               `id` bigint NOT NULL AUTO_INCREMENT COMMENT '记录id',
                                               `amount` bigint NOT NULL DEFAULT '0' COMMENT '提现金额,单位:元',
                                               `count` int NOT NULL DEFAULT '0' COMMENT '提现笔数',
-                                              `status` tinyint DEFAULT '0' COMMENT '提现状态,0:待转账 1:全部完成 2:部分完成',
+                                              `status` tinyint DEFAULT '0' COMMENT '提现状态, 0:未完成 , 1:已完成 , 2:部分完成 , 3:全部失败',
                                               `start_time` datetime NOT NULL COMMENT '提现开始时间',
                                               `end_time` datetime NOT NULL COMMENT '提现截止时间',
                                               `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '' COMMENT '创建者',
@@ -52,7 +52,7 @@ CREATE TABLE `distri_pt_daily_withdrawal` (
                                               `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
                                               `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
                                               PRIMARY KEY (`id`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='平台每日提现记录表';
+) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='平台每日提现记录表';
 
 ALTER TABLE sale_shop
     ADD COLUMN `account_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT null COMMENT '账户名称',
@@ -60,4 +60,11 @@ ALTER TABLE sale_shop
 		ADD COLUMN `bank_name` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT null COMMENT '开户银行';
 
 ALTER TABLE trade_pt_settlement
-    ADD COLUMN `status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '结算单状态 0:未完成 , 1:已完成 , 2:部分完成 , 3:全部失败';
+    ADD COLUMN `status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '结算单状态 0:未完成 , 1:已完成 , 2:部分完成 , 3:全部失败';
+
+AlTER TABLE trade_shop_settlement
+    ADD COLUMN `account_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '账户名称',
+		ADD COLUMN `account_number` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '账户号码';
+
+ALTER TABLE trade_pt_settlement
+    ADD COLUMN   `export_status` bit(1) NOT NULL DEFAULT b'0' COMMENT '导出状态,已导出是1,未导出为0';