Selaa lähdekoodia

新增银行卡提现功能;

codingliang 2 vuotta sitten
vanhempi
commit
fd6976942d

+ 1 - 0
src/main/java/com/sqx/modules/app/service/UserService.java

@@ -225,4 +225,5 @@ public interface UserService extends IService<UserEntity> {
 
     Result sendMsgDXB(String phone, String state, int code);
 
+    UserEntity getByAdminId(Long adminUserId);
 }

+ 9 - 0
src/main/java/com/sqx/modules/app/service/impl/UserServiceImpl.java

@@ -11,8 +11,10 @@ import com.aliyuncs.DefaultAcsClient;
 import com.aliyuncs.IAcsClient;
 import com.aliyuncs.http.MethodType;
 import com.aliyuncs.profile.DefaultProfile;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.getui.push.v2.sdk.ApiHelper;
@@ -791,6 +793,13 @@ public class UserServiceImpl extends ServiceImpl<UserDao, UserEntity> implements
         return Result.error("验证码发送失败!");
     }
 
+    @Override
+    public UserEntity getByAdminId(Long adminUserId) {
+        LambdaQueryWrapper<UserEntity> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.eq(UserEntity::getAdminUserId, adminUserId);
+        return this.getOne(queryWrapper);
+    }
+
     private Result sendMsgAlibaba(String phone, String state, int code) {
         //阿里云短信accessKeyId
         CommonInfo three = commonInfoService.findOne(93);

+ 11 - 1
src/main/java/com/sqx/modules/pay/entity/CashOut.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import java.io.Serializable;
@@ -98,7 +99,7 @@ public class CashOut implements Serializable {
     private Integer type;
 
     /**
-     * 1 支付宝  2 小程序  3公众号  4 微信app
+     * 1 支付宝  2 小程序  3公众号  4 微信app 5 银行卡
      */
     private Integer classify;
 
@@ -107,6 +108,15 @@ public class CashOut implements Serializable {
      */
     private String cashQrCode;
 
+    @ApiModelProperty(name = "银行卡号")
+    private String bankCardNo ;
+
+    @ApiModelProperty(name = "银行卡户主名称")
+    private String bankRealName ;
+
+    @ApiModelProperty(name = "银行卡开户行")
+    private String openBank ;
+
     @TableField(exist = false)
     private String userName;
 

+ 42 - 4
src/main/java/com/sqx/modules/pay/service/impl/CashOutServiceImpl.java

@@ -1,8 +1,10 @@
 package com.sqx.modules.pay.service.impl;
 
+import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sqx.common.exception.SqxException;
 import com.sqx.common.utils.PageUtils;
 import com.sqx.common.utils.Query;
 import com.sqx.common.utils.Result;
@@ -28,6 +30,8 @@ import com.sqx.modules.pay.dao.CashOutDao;
 import com.sqx.modules.pay.entity.CashOut;
 import com.sqx.modules.pay.service.CashOutService;
 import com.sqx.modules.pay.vo.CashOutVO;
+import com.sqx.modules.shop.entity.ShopBankCardInfo;
+import com.sqx.modules.shop.service.ShopBankCardInfoService;
 import com.sqx.modules.sys.dao.SysUserDao;
 import com.sqx.modules.utils.AmountCalUtils;
 import com.sqx.modules.utils.excel.ExcelData;
@@ -91,6 +95,8 @@ public class CashOutServiceImpl extends ServiceImpl<CashOutDao, CashOut> impleme
     private UserMoneyDetailsService userMoneyDetailsService;
     @Autowired
     private UserMoneyService userMoneyService;
+    @Autowired
+    private ShopBankCardInfoService shopBankCardInfoService;
     private ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock(true);
 
     @Override
@@ -433,6 +439,15 @@ public class CashOutServiceImpl extends ServiceImpl<CashOutDao, CashOut> impleme
         return Result.success().put("data", hashMap);
     }
 
+    /**
+     * 提现
+     * @param userId 用户id
+     * @param shopId 店铺id
+     * @param money 提现金额
+     * @param classify 提现途径 1支付宝 2小程序 3公众号 4微信app
+     * @param type 1用户提现 2商户提现 3骑手提现
+     * @return
+     */
     @Transactional
     public Result cashMoneys(Long userId, Long shopId, Double money, Integer classify, Integer type) {
         if (money == null || money <= 0.00) {
@@ -452,6 +467,9 @@ public class CashOutServiceImpl extends ServiceImpl<CashOutDao, CashOut> impleme
         Double mul = 0.0;
         String isRate = commonInfoService.findOne(116).getValue();
 
+        CashOut cashOut = new CashOut();
+
+        // 用户提现
         if (type == 1) {
             //用户提现手续费
             CommonInfo one1 = commonInfoService.findOne(114);
@@ -461,8 +479,10 @@ public class CashOutServiceImpl extends ServiceImpl<CashOutDao, CashOut> impleme
             if (mul < 0.01) {
                 mul = 0.01;
             }
-        }else if(type == 3){
-            //用户提现手续费
+        }
+        // 骑手提现
+        else if(type == 3){
+            //骑手提现手续费
             CommonInfo one1 = commonInfoService.findOne(114);
             Double value = Double.valueOf(one1.getValue());
             mul = AmountCalUtils.mul(money, value);
@@ -470,7 +490,19 @@ public class CashOutServiceImpl extends ServiceImpl<CashOutDao, CashOut> impleme
             if (mul < 0.01) {
                 mul = 0.01;
             }
-        } else{
+        }
+        // 商铺提现
+        else {
+            // 根据店铺id获取商铺银行卡信息信息
+            ShopBankCardInfo bankCardInfo = shopBankCardInfoService.getByShopId(shopId);
+            if (ObjectUtil.isNull(bankCardInfo)) {
+                throw new SqxException("银行卡信息不存在,请联系客服人员添加");
+            }
+
+            cashOut.setBankRealName(bankCardInfo.getRealName());
+            cashOut.setOpenBank(bankCardInfo.getOpenBank());
+            cashOut.setBankCardNo(bankCardInfo.getCardNo());
+
             if ("是".equals(isRate)) {
                 //商户提现手续费
                 CommonInfo one1 = commonInfoService.findOne(115);
@@ -507,7 +539,7 @@ public class CashOutServiceImpl extends ServiceImpl<CashOutDao, CashOut> impleme
             moneyDetails.setUserId(userId);
             moneyDetails.setShopId(shopId);
             moneyDetails.setTitle("提现:" + money);
-            CashOut cashOut = new CashOut();
+
             String content;
             if (classify == 1) {
                 if (!"是".equals(isRate)) {
@@ -515,6 +547,12 @@ public class CashOutServiceImpl extends ServiceImpl<CashOutDao, CashOut> impleme
                 } else {
                     content = "支付宝提现:" + money + ",扣除总金额:" + moneySum + ",手续费:" + mul;
                 }
+            } else if (classify == 5) {
+                if (!"是".equals(isRate)) {
+                    content = "银行卡提现:" + money;
+                } else {
+                    content = "银行卡提现:" + money + ",扣除总金额:" + moneySum + ",手续费:" + mul;
+                }
             } else {
                 if (!"是".equals(isRate)) {
                     content = "微信提现:" + money;

+ 81 - 0
src/main/java/com/sqx/modules/shop/controller/AdminShopBankCardInfoController.java

@@ -0,0 +1,81 @@
+package com.sqx.modules.shop.controller;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.sqx.common.exception.SqxException;
+import com.sqx.common.utils.Result;
+import com.sqx.modules.shop.entity.ShopBankCardInfo;
+import com.sqx.modules.shop.service.ShopBankCardInfoService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.validation.Valid;
+
+@Api(tags={"商户管理-商户银行卡管理"})
+@RestController
+@RequestMapping("/admin/shop/bank")
+@RequiredArgsConstructor
+public class AdminShopBankCardInfoController {
+
+    private final ShopBankCardInfoService shopBankCardInfoService;
+
+    @ApiOperation("新增银行卡信息")
+    @PostMapping
+    public Result saveCardInfo(@Valid @RequestBody ShopBankCardInfo shopBankCardInfo) {
+        shopBankCardInfoService.saveCardInfo(shopBankCardInfo);
+        return Result.success();
+    }
+
+    @ApiOperation("修改银行卡信息")
+    @PutMapping
+    public Result updateCardInfo(@Valid @RequestBody ShopBankCardInfo shopBankCardInfo) {
+        if (ObjectUtil.isNull(shopBankCardInfo.getId())) {
+            throw new SqxException("id不能为空");
+        }
+        shopBankCardInfoService.updateCardInfo(shopBankCardInfo);
+        return Result.success();
+    }
+
+    @ApiOperation("根据id获取银行卡信息")
+    @GetMapping("{id}")
+    public Result getById(@ApiParam("id") @PathVariable Long id) {
+        ShopBankCardInfo cardInfo = shopBankCardInfoService.getById(id);
+        if (ObjectUtil.isNull(cardInfo)) {
+            throw new SqxException("id对应的记录不存在");
+        }
+        return Result.success().put("data", cardInfo);
+    }
+
+    @ApiOperation("根据店铺id获取银行卡信息")
+    @GetMapping("getByShopId/{shopId}")
+    public Result getByShopId(@ApiParam("店铺id") @PathVariable Long shopId) {
+        ShopBankCardInfo cardInfo = shopBankCardInfoService.getByShopId(shopId);
+
+        return Result.success().put("data", cardInfo);
+    }
+
+    @ApiOperation("根据id删除银行卡信息")
+    @DeleteMapping("{id}")
+    public Result deleteById(@ApiParam("id") @PathVariable Long id) {
+        shopBankCardInfoService.removeById(id);
+
+        return Result.success();
+    }
+
+    @ApiOperation("根据店铺id删除银行卡信息")
+    @DeleteMapping("delete-by-shop-id/{shopId}")
+    public Result deleteByShopId(@ApiParam("店铺id") @PathVariable Long shopId) {
+        shopBankCardInfoService.deleteByShopId(shopId);
+
+        return Result.success();
+    }
+}

+ 30 - 0
src/main/java/com/sqx/modules/shop/controller/app/ShopBankCardInfoController.java

@@ -0,0 +1,30 @@
+package com.sqx.modules.shop.controller.app;
+
+import com.sqx.common.utils.Result;
+import com.sqx.modules.shop.entity.ShopBankCardInfo;
+import com.sqx.modules.shop.service.ShopBankCardInfoService;
+import com.sqx.modules.sys.controller.AbstractController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@Api(tags={"商户管理-商户银行卡"})
+@RestController
+@RequestMapping("admin/shop/bank")
+@RequiredArgsConstructor
+public class ShopBankCardInfoController extends AbstractController {
+
+    private final ShopBankCardInfoService shopBankCardInfoService;
+
+    @ApiOperation("获取当前商户银行卡信息")
+    @GetMapping("get-by-user")
+    public Result getByUserId() {
+        Long adminUserId = getUserId();
+        ShopBankCardInfo cardInfo = shopBankCardInfoService.getByUserId(adminUserId);
+
+        return Result.success().put("data", cardInfo);
+    }
+}

+ 3 - 2
src/main/java/com/sqx/modules/shop/controller/app/ShopMoneyController.java

@@ -84,12 +84,13 @@ public class ShopMoneyController extends AbstractController {
 
     @GetMapping(value = "/shopCashMoney")
     @ApiOperation("商户发起提现")
-    public Result shopCashMoney(Double money, Integer classify) {
+    public Result shopCashMoney(Double money) {
         SysUserEntity user = getUser();
         Long adminUserId = user.getUserId();
         UserEntity userEntity = userDao.selectOne(new QueryWrapper<UserEntity>().eq("admin_user_id", adminUserId));
         SysUserShop sysUserShop = sysUserDao.selectUserShop(adminUserId);
-        return cashOutService.cashMoney(userEntity.getUserId(), sysUserShop.getShopId(),money,classify, 2);
+        // classify为5标识银行卡提现
+        return cashOutService.cashMoney(userEntity.getUserId(), sysUserShop.getShopId(),money,5, 2);
     }
 
     @GetMapping(value = "shopBindingQrCode")

+ 9 - 0
src/main/java/com/sqx/modules/shop/dao/ShopBankCardInfoDao.java

@@ -0,0 +1,9 @@
+package com.sqx.modules.shop.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.sqx.modules.shop.entity.ShopBankCardInfo;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface ShopBankCardInfoDao extends BaseMapper<ShopBankCardInfo> {
+}

+ 63 - 0
src/main/java/com/sqx/modules/shop/entity/ShopBankCardInfo.java

@@ -0,0 +1,63 @@
+package com.sqx.modules.shop.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Pattern;
+import java.io.Serializable;
+
+@Data
+@ApiModel(value = "店铺银行卡信息",description = "")
+@TableName("shop_bank_card_info")
+public class ShopBankCardInfo implements Serializable {
+    /**
+     * id
+     */
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(name = "id")
+    private Long id;
+    /**
+     * 店铺id
+     */
+    @ApiModelProperty(name = "店铺id")
+    @NotNull(message = "店铺id不能为空")
+    private Long shopId;
+    /**
+     * 卡号
+     */
+    @ApiModelProperty(name = "卡号")
+    @NotBlank(message = "卡号不能为空")
+    private String cardNo;
+    /**
+     * 开户行
+     */
+    @ApiModelProperty(name = "开户行")
+    @NotBlank(message = "开户行不能为空")
+    private String openBank;
+    /**
+     * 户主名称
+     */
+    @ApiModelProperty(name = "户主名称")
+    @NotBlank(message = "户主名称不能为空")
+    private String realName;
+    /**
+     * 银行名称
+     */
+    @ApiModelProperty(name = "银行名称")
+    @NotBlank(message = "银行名称不能为空")
+    private String bankName;
+    /**
+     * 删除标识;1 是 0否
+     */
+    @TableLogic(delval = "1", value = "0")
+    @ApiModelProperty(name = "删除标识", notes = "1 是 0否")
+    @Pattern(regexp = "(0|1)", message = "删除标识只能为0或1")
+    private String delFlag;
+}

+ 20 - 0
src/main/java/com/sqx/modules/shop/service/ShopBankCardInfoService.java

@@ -0,0 +1,20 @@
+package com.sqx.modules.shop.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.sqx.modules.shop.entity.ShopBankCardInfo;
+
+/**
+ * 店铺银行卡信息
+ */
+public interface ShopBankCardInfoService extends IService<ShopBankCardInfo> {
+
+    void saveCardInfo(ShopBankCardInfo shopBankCardInfo);
+
+    void updateCardInfo(ShopBankCardInfo shopBankCardInfo);
+
+    ShopBankCardInfo getByShopId(Long shopId);
+
+    ShopBankCardInfo getByUserId(Long userId);
+
+    void deleteByShopId(Long shopId);
+}

+ 81 - 0
src/main/java/com/sqx/modules/shop/service/impl/ShopBankCardInfoServiceImpl.java

@@ -0,0 +1,81 @@
+package com.sqx.modules.shop.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sqx.common.exception.SqxException;
+import com.sqx.modules.app.entity.UserEntity;
+import com.sqx.modules.app.service.UserService;
+import com.sqx.modules.datacentre.entity.SysUserShop;
+import com.sqx.modules.shop.dao.ShopBankCardInfoDao;
+import com.sqx.modules.shop.entity.ShopBankCardInfo;
+import com.sqx.modules.shop.service.ShopBankCardInfoService;
+import com.sqx.modules.sys.service.SysUserShopService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+@Service
+@RequiredArgsConstructor
+public class ShopBankCardInfoServiceImpl extends ServiceImpl<ShopBankCardInfoDao, ShopBankCardInfo> implements ShopBankCardInfoService {
+
+    private final UserService userService;
+    private final SysUserShopService userShopService;
+
+
+    @Override
+    public void saveCardInfo(ShopBankCardInfo shopBankCardInfo) {
+        // 校验店铺下是否存在店铺信息
+        checkUnique(shopBankCardInfo);
+
+        this.save(shopBankCardInfo);
+    }
+
+    @Override
+    public void updateCardInfo(ShopBankCardInfo shopBankCardInfo) {
+        // 校验店铺下是否存在店铺信息
+        checkUnique(shopBankCardInfo);
+
+        this.updateById(shopBankCardInfo);
+    }
+
+    @Override
+    public ShopBankCardInfo getByShopId(Long shopId) {
+        LambdaQueryWrapper<ShopBankCardInfo> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.eq(ShopBankCardInfo::getShopId, shopId);
+        ShopBankCardInfo cardInfo = this.getOne(queryWrapper);
+
+        if (ObjectUtil.isNull(cardInfo)) {
+            throw new SqxException("shopId对应的银行卡记录不存在");
+        }
+        return cardInfo;
+    }
+
+    @Override
+    public ShopBankCardInfo getByUserId(Long userId) {
+        SysUserShop userShop = userShopService.getByUserId(userId);
+        if (ObjectUtil.isNull(userShop)) {
+            throw new SqxException("当前用户未绑定商户");
+        }
+
+        return getByShopId(userShop.getShopId());
+    }
+
+    @Override
+    public void deleteByShopId(Long shopId) {
+        LambdaQueryWrapper<ShopBankCardInfo> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.eq(ShopBankCardInfo::getShopId, shopId);
+
+        this.remove(queryWrapper);
+    }
+
+    private void checkUnique(ShopBankCardInfo shopBankCardInfo) {
+        LambdaQueryWrapper<ShopBankCardInfo> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.eq(ShopBankCardInfo::getShopId, shopBankCardInfo.getShopId());
+        queryWrapper.ne(ObjectUtil.isNotNull(shopBankCardInfo.getId()), ShopBankCardInfo::getId, shopBankCardInfo.getId());
+
+        if (count(queryWrapper) > 0) {
+            throw new SqxException("当前店铺已存在银行卡信息");
+        }
+    }
+}

+ 9 - 0
src/main/java/com/sqx/modules/sys/dao/SysUserShopDao.java

@@ -0,0 +1,9 @@
+package com.sqx.modules.sys.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.sqx.modules.datacentre.entity.SysUserShop;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface SysUserShopDao extends BaseMapper<SysUserShop> {
+}

+ 9 - 0
src/main/java/com/sqx/modules/sys/service/SysUserShopService.java

@@ -0,0 +1,9 @@
+package com.sqx.modules.sys.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.sqx.modules.datacentre.entity.SysUserShop;
+
+public interface SysUserShopService extends IService<SysUserShop> {
+
+    SysUserShop getByUserId(Long userId);
+}

+ 0 - 2
src/main/java/com/sqx/modules/sys/service/impl/SysUserServiceImpl.java

@@ -5,10 +5,8 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.sqx.common.utils.PageUtils;
-import com.sqx.common.utils.Query;
 import com.sqx.modules.datacentre.dao.ShopAdminDao;
 import com.sqx.modules.datacentre.entity.SysUserShop;
-import com.sqx.modules.order.entity.TbOrder;
 import com.sqx.modules.sys.dao.SysRoleDao;
 import com.sqx.modules.sys.dao.SysUserDao;
 import com.sqx.modules.sys.entity.SysUserEntity;

+ 20 - 0
src/main/java/com/sqx/modules/sys/service/impl/SysUserShopServiceImpl.java

@@ -0,0 +1,20 @@
+package com.sqx.modules.sys.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sqx.modules.datacentre.entity.SysUserShop;
+import com.sqx.modules.sys.dao.SysUserShopDao;
+import com.sqx.modules.sys.service.SysUserShopService;
+import org.springframework.stereotype.Service;
+
+@Service
+public class SysUserShopServiceImpl extends ServiceImpl<SysUserShopDao, SysUserShop> implements SysUserShopService {
+
+    @Override
+    public SysUserShop getByUserId(Long userId) {
+        LambdaQueryWrapper<SysUserShop> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.eq(SysUserShop::getUserId, userId);
+        return this.getOne(queryWrapper);
+    }
+}