Przeglądaj źródła

提现功能修改

zhangchen 4 miesięcy temu
rodzic
commit
0f9a632bb4

+ 15 - 0
alien-entity/src/main/java/shop/alien/entity/store/StoreCashOutRecord.java

@@ -91,4 +91,19 @@ public class StoreCashOutRecord extends Model<StoreCashOutRecord> {
     @TableField(value = "updated_user_id", fill = FieldFill.INSERT_UPDATE)
     private Integer updatedUserId;
 
+    @ApiModelProperty(value = "审批时间")
+    @TableField(value = "approve_time", fill = FieldFill.INSERT)
+    private Date approveTime;
+
+    @ApiModelProperty(value = "支付时间")
+    @TableField(value = "pay_date", fill = FieldFill.INSERT)
+    private Date payDate;
+
+    @ApiModelProperty(value = "查看失败原因")
+    @TableField(value = "fail_reason")
+    private String failReason;
+
+    @ApiModelProperty(value = "申请storeUserID")
+    @TableField(value = "store_user_id")
+    private Integer storeUserId;
 }

+ 10 - 0
alien-entity/src/main/java/shop/alien/entity/store/vo/ManagementInfoVo.java

@@ -1,6 +1,8 @@
 package shop.alien.entity.store.vo;
 
 
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
@@ -119,4 +121,12 @@ public class ManagementInfoVo {
     private String buyTimeStr;
     @ApiModelProperty(value = "数据可视化-订单金额")
     private String finalPrice;
+    @ApiModelProperty(value = "审批时间")
+    private Date approveTime;
+    @ApiModelProperty(value = "支付时间")
+    private Date payDate;
+    @ApiModelProperty(value = "查看失败原因")
+    private String failReason;
+    @ApiModelProperty(value = "提现状态, 0:进行中, 1:成功, 2:失败,3待审核,4已拒绝,5审核通过")
+    private Integer paymentStatus;
 }

+ 4 - 0
alien-entity/src/main/java/shop/alien/mapper/StoreIncomeDetailsRecordMapper.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.toolkit.Constants;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.Update;
 import shop.alien.entity.store.StoreIncomeDetailsRecord;
 import shop.alien.entity.store.vo.StoreIncomeDetailsRecordVo;
 
@@ -27,4 +28,7 @@ public interface StoreIncomeDetailsRecordMapper extends BaseMapper<StoreIncomeDe
             "where income.created_time between '2025-02-23 00:00:00' and '2025-02-23 23:59:59' ")
     List<StoreIncomeDetailsRecordVo> getIncomeList(@Param(Constants.WRAPPER) QueryWrapper<StoreIncomeDetailsRecordVo> wrapper);
 
+    @Update("UPDATE store_income_details_record SET cash_out_id = NULL WHERE delete_flag=0 AND store_id = #{storeId} AND cash_out_id = #{cashOutId}")
+    int updateByCashOutId(@Param("storeId") Integer storeId,
+                                 @Param("cashOutId") Integer cashOutId);
 }

+ 5 - 1
alien-entity/src/main/resources/mapper/ManagementInfoMapper.xml

@@ -193,7 +193,11 @@
                 END AS cash_out_type_name,
             cash.money,
             cash.created_time,
-            cash.payment_date
+            cash.payment_date,
+            cash.approve_time,
+            cash.pay_date,
+            cash.fail_reason,
+            cash.payment_status
         FROM
             store_cash_out_record cash
         LEFT JOIN store_info store ON cash.store_id = store.id

+ 26 - 0
alien-store/src/main/java/shop/alien/store/controller/StoreIncomeDetailsRecordController.java

@@ -41,6 +41,32 @@ public class StoreIncomeDetailsRecordController {
         return R.fail(s);
     }
 
+    @ApiOperation("提现申请-提现全部")
+    @ApiOperationSupport(order = 2)
+    @ApiImplicitParams({@ApiImplicitParam(name = "storeId", value = "门店id", dataType = "Integer", paramType = "query", required = true), @ApiImplicitParam(name = "payPassword", value = "支付密码", dataType = "String", paramType = "query", required = true)})
+    @GetMapping("/applyCashOut")
+    public R<Boolean> applyCashOut(Integer storeId, String payPassword) {
+        String s = storeIncomeDetailsRecordService.applyCashOut(storeId, payPassword);
+        if ("success".equals(s)) {
+            return R.success("提现成功");
+        }
+        return R.fail(s);
+    }
+
+    @ApiOperation("提现审批-提现全部")
+    @ApiOperationSupport(order = 2)
+    @ApiImplicitParams({@ApiImplicitParam(name = "cashOutId", value = "提现申请记录ID", dataType = "Integer", paramType = "query", required = true),
+            @ApiImplicitParam(name = "approveStatus", value = "审批状态", dataType = "String", paramType = "query", required = true),
+            @ApiImplicitParam(name = "failReason", value = "失败原因", dataType = "String", paramType = "query", required = false)})
+    @GetMapping("/approveCashOut")
+    public R<Boolean> approveCashOut(Integer cashOutId, String approveStatus, String failReason) {
+        String s = storeIncomeDetailsRecordService.approveCashOut(cashOutId, approveStatus, failReason);
+        if ("success".equals(s)) {
+            return R.success("提现成功");
+        }
+        return R.fail(s);
+    }
+
     @ApiOperation("新增收入-手续费一单一算")
     @ApiOperationSupport(order = 2)
     @PostMapping("/addIncome")

+ 16 - 0
alien-store/src/main/java/shop/alien/store/service/StoreIncomeDetailsRecordService.java

@@ -25,6 +25,22 @@ public interface StoreIncomeDetailsRecordService extends IService<StoreIncomeDet
     String cashOut(Integer storeId, String payPassword);
 
     /**
+     * 提现
+     *
+     * @param storeId     门店id
+     * @return 是否成功
+     */
+    String applyCashOut(Integer storeId, String payPassword);
+
+    /**
+     * 提现审批
+     *
+     * @param cashOutId     提现申请记录ID
+     * @param approveStatus 审批状态
+     */
+    String approveCashOut(Integer cashOutId, String approveStatus, String failReason);
+
+    /**
      * 今日收益
      *
      * @param storeId 门店id

+ 107 - 4
alien-store/src/main/java/shop/alien/store/service/impl/StoreIncomeDetailsRecordServiceImpl.java

@@ -5,14 +5,13 @@ import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.RequiredArgsConstructor;
+import org.apache.commons.lang.StringUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
-import shop.alien.entity.store.StoreAliPayLog;
-import shop.alien.entity.store.StoreCashOutRecord;
-import shop.alien.entity.store.StoreIncomeDetailsRecord;
-import shop.alien.entity.store.StoreUser;
+import shop.alien.entity.store.*;
 import shop.alien.entity.store.vo.StoreIncomeDetailsRecordVo;
 import shop.alien.mapper.StoreCashOutRecordMapper;
 import shop.alien.mapper.StoreIncomeDetailsRecordMapper;
@@ -50,6 +49,7 @@ public class StoreIncomeDetailsRecordServiceImpl extends ServiceImpl<StoreIncome
 
     private final StoreIncomeDetailsRecordMapper storeIncomeDetailsRecordMapper;
 
+
     /**
      * 提现-提现全部-手续费一单一算
      *
@@ -119,6 +119,109 @@ public class StoreIncomeDetailsRecordServiceImpl extends ServiceImpl<StoreIncome
     }
 
     /**
+     * 提现申请-提现全部-手续费一单一算
+     *
+     * @param storeId     门店id
+     * @return 是否成功
+     */
+    @Transactional
+    @Override
+    public String applyCashOut(Integer storeId, String payPassword) {
+        StoreUser storeUser = storeUserMapper.selectOne(new LambdaQueryWrapper<StoreUser>().eq(StoreUser::getStoreId, storeId).eq(StoreUser::getPayPassword, payPassword));
+        if (storeUser != null) {
+            //查询可用账单(大于创建时间3天)
+            LambdaQueryWrapper<StoreIncomeDetailsRecord> wrapper = new LambdaQueryWrapper<>();
+            //当前时间-3天大于创建时间
+            wrapper.lt(StoreIncomeDetailsRecord::getCreatedTime, DateUtils.calcDays(new Date(), -3))
+                    //未绑定提现记录的
+                    .isNull(StoreIncomeDetailsRecord::getCashOutId).eq(StoreIncomeDetailsRecord::getStoreId, storeId);
+            List<StoreIncomeDetailsRecord> list = this.list(wrapper);
+            if (!list.isEmpty()) {
+                //总金额
+                Integer availableAmount = 0;
+                //手续费
+                Integer commission = 0;
+                for (StoreIncomeDetailsRecord record : list) {
+                    availableAmount += record.getMoney();
+                    commission += record.getCommission();
+                }
+                int money = availableAmount - commission;
+                list = list.stream().sorted(Comparator.comparing(StoreIncomeDetailsRecord::getCreatedTime)).collect(Collectors.toList());
+                Date startDate = list.get(0).getCreatedTime();
+                Date endDate = list.get(list.size() - 1).getCreatedTime();
+                //增加提现申请记录
+                StoreCashOutRecord storeCashOutRecord = new StoreCashOutRecord();
+                storeCashOutRecord.setStoreId(storeId);
+                storeCashOutRecord.setMoney(money);
+                storeCashOutRecord.setCommission(commission);
+                storeCashOutRecord.setCashOutType(0);
+                storeCashOutRecord.setPaymentStatus(3);
+                storeCashOutRecord.setDeleteFlag(0);
+                storeCashOutRecord.setIncomeStartTime(startDate);
+                storeCashOutRecord.setIncomeEndTime(endDate);
+                storeCashOutRecord.setStoreUserId(storeUser.getId());
+                storeCashOutRecordMapper.insert(storeCashOutRecord);
+                //关联提现记录
+                list.forEach(record -> record.setCashOutId(storeCashOutRecord.getId()));
+                this.saveOrUpdateBatch(list);
+                return "申请成功";
+            }
+            return "账单未到可提现时间";
+        }
+        return "支付密码错误";
+    }
+
+    @Transactional
+    @Override
+    public String approveCashOut(Integer cashOutId, String approveStatus, String failReason) {
+        if (cashOutId != null && cashOutId > 0 && StringUtils.isNotBlank(approveStatus)) {
+            StoreCashOutRecord storeCashOutRecord = storeCashOutRecordMapper.selectById(cashOutId);
+            if (approveStatus.equals("0")) {
+                //同意,开始提现
+                Integer storeUserId = storeCashOutRecord.getStoreUserId();
+                StoreUser storeUser = storeUserMapper.selectById(storeUserId);
+                int money = storeCashOutRecord.getMoney();
+                BigDecimal decimal = new BigDecimal(money);
+                BigDecimal divide = decimal.divide(new BigDecimal(100), 2, RoundingMode.HALF_UP);
+                if (Double.parseDouble(divide.toString()) < 0.10) {
+                    return "金额不能小于0.1元";
+                }
+                // StoreAliPayLog pay = aliApi.pay(storeUser.getName(), storeUser.getIdCard(), storeUser.getPhone(), divide.toString());
+                StoreAliPayLog pay =  new StoreAliPayLog();
+                if (pay != null) {
+                    // 提现成功,更新提现申请相关状态
+                    storeCashOutRecord.setOrderNo(pay.getOutBizNo());
+                    storeCashOutRecord.setAliOrderNo(pay.getOrderId());
+                    storeCashOutRecord.setPaymentStatus(1);//提现成功
+                    storeCashOutRecord.setApproveTime(new Date());// 审批时间
+                    storeCashOutRecord.setPayDate(new Date());//支付时间
+
+                    //减少账户余额
+                    storeUserMapper.updateById(new StoreUser(storeCashOutRecord.getStoreId(), storeUser.getMoney() - storeCashOutRecord.getMoney() - storeCashOutRecord.getCommission()));
+                } else {
+                    // 提现失败
+                    storeCashOutRecord.setPaymentStatus(2);
+                    storeCashOutRecord.setApproveTime(new Date());// 审批时间
+                    storeCashOutRecord.setFailReason("支付失败");
+                }
+                storeCashOutRecordMapper.updateById(storeCashOutRecord);
+            } else {
+                storeCashOutRecord.setPaymentStatus(4);
+                storeCashOutRecord.setFailReason(failReason);
+                storeCashOutRecordMapper.updateById(storeCashOutRecord);
+                // 拒绝将账单中的提现记录置空
+                LambdaUpdateWrapper<StoreIncomeDetailsRecord> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
+                lambdaUpdateWrapper.eq(StoreIncomeDetailsRecord::getStoreId, storeCashOutRecord.getStoreId())
+                        .eq(StoreIncomeDetailsRecord::getCashOutId, storeCashOutRecord.getId())
+                        .set(StoreIncomeDetailsRecord::getCashOutId, "");
+                 int result = storeIncomeDetailsRecordMapper.updateByCashOutId(storeCashOutRecord.getStoreId(), storeCashOutRecord.getId());
+            }
+        }
+        return "审批成功";
+    }
+
+
+    /**
      * 今日收益
      *
      * @param storeId 门店id