增加银行卡号的校验工具类

This commit is contained in:
Jack 2025-03-26 16:56:09 +08:00
parent 4a5252a6d8
commit a8505167df
10 changed files with 221 additions and 13 deletions

View File

@ -2786,7 +2786,7 @@ public class AccountUserBaseServiceImpl extends BaseServiceImpl<AccountUserBaseM
/**
* 手机号登陆操作
* 使用到的后台管理员或商家登录
* 使用到的后台管理员或商家登录客户c端
*
* @param user_mobile
* @return
@ -2855,7 +2855,7 @@ public class AccountUserBaseServiceImpl extends BaseServiceImpl<AccountUserBaseM
if (accountUserBase == null) {
throw new ApiException(_("账号注册失败!"));
}
// SMS_481085172 发送短信通知用户告知用户随机密码您已成功注册密码${password}该密码可用于登录商家APP登录后请尽快修改密码
Map<String, Object> smsArgs = new HashMap<>();
smsArgs.put("password", user_password);

View File

@ -30,6 +30,9 @@ public class MchOrderBuyerDTO implements Serializable {
@ApiModelProperty(value = "买家编号")
private Integer buyer_user_id;
@ApiModelProperty(value = "是否为新买家1-是2-否")
private Integer is_new_buyer;
@ApiModelProperty(value = "买家姓名")
private String da_name;

View File

@ -0,0 +1,130 @@
/*
* Copyright (c) 2025. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
* Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan.
* Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna.
* Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus.
* Vestibulum commodo. Ut rhoncus gravida arcu.
*/
package com.suisung.mall.common.utils;
import cn.hutool.core.util.StrUtil;
/**
* 中国银行相关工具类
*/
public class BankUtil {
public static void main(String[] args) {
String mainlandAccount = "6217680389311429";
String hongKongAccount = "00100212345678901";
String macauAccount = "0102123456789012";
String taiwanAccount = "00100021234567890";
System.out.println("内地账号是否有效: " + isValidZHCNBankAccount(mainlandAccount));
System.out.println("香港账号是否有效: " + isValidZHHKBankAccount(hongKongAccount));
System.out.println("澳门账号是否有效: " + isValidZHMOBankAccount(macauAccount));
System.out.println("台湾账号是否有效: " + isValidZHTWBankAccount(taiwanAccount));
System.out.println("账号是否有效: " + isValidZHBankAccount(mainlandAccount));
}
// 校验中国银行账号的 Luhn 算法
public static boolean isValidZHBankAccount(String accountNumber) {
if (StrUtil.isBlank(accountNumber)) {
return false;
}
if (isValidZHCNBankAccount(accountNumber)) {
return true;
}
if (isValidZHHKBankAccount(accountNumber)) {
return true;
}
if (isValidZHMOBankAccount(accountNumber)) {
return true;
}
return isValidZHTWBankAccount(accountNumber);
}
// 校验中国内地银行卡号的 Luhn 算法
public static boolean isValidZHCNBankAccount(String accountNumber) {
if (accountNumber == null || accountNumber.length() < 13 || accountNumber.length() > 19) {
return false;
}
try {
long number = Long.parseLong(accountNumber);
} catch (NumberFormatException e) {
return false;
}
int sum = 0;
boolean alternate = false;
for (int i = accountNumber.length() - 1; i >= 0; i--) {
int n = Integer.parseInt(accountNumber.substring(i, i + 1));
if (alternate) {
n *= 2;
if (n > 9) {
n = (n % 10) + 1;
}
}
sum += n;
alternate = !alternate;
}
return (sum % 10 == 0);
}
// 校验香港银行账号
public static boolean isValidZHHKBankAccount(String accountNumber) {
// 简单示例假设格式为 3 位银行代码 + 3 位分行代码 + 11 位账号
if (accountNumber == null || accountNumber.length() != 17) {
return false;
}
try {
// 检查是否为纯数字
Integer.parseInt(accountNumber.substring(0, 3));
Integer.parseInt(accountNumber.substring(3, 6));
Integer.parseInt(accountNumber.substring(6));
} catch (NumberFormatException e) {
return false;
}
return true;
}
// 校验澳门银行账号
public static boolean isValidZHMOBankAccount(String accountNumber) {
// 简单示例假设格式为 2 位银行代码 + 2 位分行代码 + 12 位账号
if (accountNumber == null || accountNumber.length() != 16) {
return false;
}
try {
// 检查是否为纯数字
Integer.parseInt(accountNumber.substring(0, 2));
Integer.parseInt(accountNumber.substring(2, 4));
Integer.parseInt(accountNumber.substring(4));
} catch (NumberFormatException e) {
return false;
}
return true;
}
// 校验台湾银行账号
public static boolean isValidZHTWBankAccount(String accountNumber) {
// 简单示例假设格式为 3 位银行代码 + 4 位分行代码 + 10 位账号
if (accountNumber == null || accountNumber.length() != 17) {
return false;
}
try {
// 检查是否为纯数字
Integer.parseInt(accountNumber.substring(0, 3));
Integer.parseInt(accountNumber.substring(3, 7));
Integer.parseInt(accountNumber.substring(7));
} catch (NumberFormatException e) {
return false;
}
return true;
}
}

View File

@ -37,6 +37,4 @@ public class BanksBranchController extends BaseControllerImpl {
Page<GlobalBranchBanks> list = branchBanksService.searchBranchBanksPageList(paramsJSON.getStr("keyword"), paramsJSON.getInt("pageNum"), paramsJSON.getInt("pageSize"));
return CommonResult.success(list);
}
}

View File

@ -220,7 +220,10 @@ public class UserOrderController extends BaseControllerImpl {
@ApiOperation(value = "查询移动商家端订单数据(新)", notes = "查询移动商家端订单数据(新)")
@RequestMapping(value = "/mch/order/list", method = RequestMethod.POST)
public CommonResult selectMchOrderPageList(@RequestBody JSONObject params) {
return CommonResult.success(shopOrderBaseService.selectMchOrderPageList(params.getInt("storeId"), params.getStr("keyword"), params.getInt("status"), 25, params.getInt("pageNum"), params.getInt("pageSize")));
Map<String, Object> respMap = new HashMap<>();
respMap.put("order_page_list", shopOrderBaseService.selectMchOrderPageList(params.getInt("storeId"), params.getStr("keyword"), params.getInt("delivery"), params.getInt("status"), 25, params.getInt("pageNum"), params.getInt("pageSize")));
respMap.put("order_count", shopOrderBaseService.mchOrderCountByStoreId(params.getInt("storeId")));
return CommonResult.success(respMap);
}
@ApiOperation(value = "查询移动商家端订单详情数据", notes = "查询移动商家端订单详情数据")

View File

@ -68,5 +68,5 @@ public interface ShopOrderBaseMapper extends BaseMapper<ShopOrderBase> {
* @param status 订单状态
* @return
*/
IPage<MchOrderInfoDTO> selectMchOrderPageList(@Param("storeId") Integer storeId, @Param("keyword") String keyword, @Param("status") Integer status, @Param("expiredMinute") Integer expiredMinute, IPage<MchOrderInfoDTO> page);
IPage<MchOrderInfoDTO> selectMchOrderPageList(@Param("storeId") Integer storeId, @Param("keyword") String keyword, @Param("delivery") Integer delivery, @Param("status") Integer status, @Param("expiredMinute") Integer expiredMinute, IPage<MchOrderInfoDTO> page);
}

View File

@ -1,5 +1,6 @@
package com.suisung.mall.shop.order.service;
import cn.hutool.json.JSONObject;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.suisung.mall.common.api.CommonResult;
import com.suisung.mall.common.modules.order.ShopOrderBase;
@ -539,12 +540,20 @@ public interface ShopOrderBaseService extends IBaseService<ShopOrderBase> {
*
* @param storeId
* @param keyword 订单搜索关键字
* @param delivery 配送方式1-同城配送2-物流配送
* @param status 查询状态1-进行中时效内2-异常订单已超时的3-退款订单
* @param expiredMinute 配送超时的分钟数单位分钟
* @param pageNum 页码
* @param pageSize 页大小
* @return
*/
IPage<MchOrderInfoDTO> selectMchOrderPageList(Integer storeId, String keyword, Integer status, Integer expiredMinute, Integer pageNum, Integer pageSize);
IPage<MchOrderInfoDTO> selectMchOrderPageList(Integer storeId, String keyword, Integer delivery, Integer status, Integer expiredMinute, Integer pageNum, Integer pageSize);
/**
* 商家订单各个分类和状态的订单数量
*
* @param storeId
* @return
*/
JSONObject mchOrderCountByStoreId(Integer storeId);
}

View File

@ -8486,6 +8486,7 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl<ShopOrderBaseMappe
*
* @param storeId
* @param keyword 订单搜索关键字
* @param delivery 配送方式1-同城配送2-物流配送
* @param status 查询状态1-进行中时效内2-异常订单已超时的3-退款订单
* @param expiredMinute 配送超时的分钟数单位分钟
* @param pageNum 页码
@ -8493,12 +8494,54 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl<ShopOrderBaseMappe
* @return
*/
@Override
public IPage<MchOrderInfoDTO> selectMchOrderPageList(Integer storeId, String keyword, Integer status, Integer expiredMinute, Integer pageNum, Integer pageSize) {
public IPage<MchOrderInfoDTO> selectMchOrderPageList(Integer storeId, String keyword, Integer delivery, Integer status, Integer expiredMinute, Integer pageNum, Integer pageSize) {
// order_state_id 订单状态(LIST):2011-待订单审核;2013-待财务审核;2020-待配货/待出库审核;2030-待发货;2040-已发货/待收货确认;2060-已完成/已签收;2070-已取消/已作废;
Page<MchOrderInfoDTO> page = new Page<>(pageNum, pageSize);
if (expiredMinute == null || expiredMinute <= 0) {
expiredMinute = 25;
expiredMinute = 20;
}
return shopOrderBaseMapper.selectMchOrderPageList(storeId, keyword, status, expiredMinute, page);
return shopOrderBaseMapper.selectMchOrderPageList(storeId, keyword, delivery, status, expiredMinute, page);
}
/**
* 商家订单各个分类和状态的订单数量
*
* @param storeId
* @return
*/
@Override
public JSONObject mchOrderCountByStoreId(Integer storeId) {
if (ObjectUtil.isEmpty(storeId)) {
return null;
}
JSONObject jsonObject = new JSONObject();
// 全部订单总数量
jsonObject.put("all_order_count", 100);
// 同城配送订单总数量
jsonObject.put("same_city_order_count", 30);
// 同城配送进行中订单数量
jsonObject.putByPath("all_same_city_order.progress_count", 12);
// 同城配送超时订单数量
jsonObject.putByPath("same_city_order.overtime_count", 8);
// 同城配送退款订单数量
jsonObject.putByPath("same_city_order.refund_count", 10);
// 普通物流订单总数量
jsonObject.put("logistics_order_count", 10);
// 普通物流订单总数量
jsonObject.putByPath("logistics_order.progress_count", 5);
// 普通物流订单总数量
jsonObject.putByPath("logistics_order.overtime_count", 1);
// 普通物流订单总数量
jsonObject.putByPath("logistics_order.refund_count", 2);
// 普通物流订单总数量
jsonObject.putByPath("logistics_order.refund_count", 2);
// todo 预订单数量相关数量
return jsonObject;
}
}

View File

@ -20,6 +20,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.suisung.mall.common.api.CommonResult;
import com.suisung.mall.common.constant.CommonConstant;
import com.suisung.mall.common.modules.merch.ShopMerchEntry;
import com.suisung.mall.common.utils.BankUtil;
import com.suisung.mall.common.utils.StringUtils;
import com.suisung.mall.common.utils.phone.PhoneNumberUtils;
import com.suisung.mall.core.web.service.impl.BaseServiceImpl;
@ -186,7 +187,11 @@ public class ShopMerchEntryServiceImpl extends BaseServiceImpl<ShopMerchEntryMap
return CommonResult.failed("缺少银行账号信息!");
}
if (shopStoreBaseService.isExistsByStoreName(record.getStore_name())) {
if (!BankUtil.isValidZHBankAccount(record.getAccount_number())) {
return CommonResult.failed("收款账号(银行卡号)格式有误!");
}
if (StrUtil.isNotBlank(record.getStore_name()) && shopStoreBaseService.isExistsByStoreName(record.getStore_name())) {
return CommonResult.failed("店铺名已被使用!");
}
@ -279,7 +284,11 @@ public class ShopMerchEntryServiceImpl extends BaseServiceImpl<ShopMerchEntryMap
return CommonResult.failed("法人手机号码有误!");
}
if (shopStoreBaseService.isExistsByStoreName(record.getStore_name())) {
if (StrUtil.isNotBlank(record.getAccount_number()) && !BankUtil.isValidZHBankAccount(record.getAccount_number())) {
return CommonResult.failed("收款账号(银行卡号)格式有误!");
}
if (StrUtil.isNotBlank(record.getStore_name()) && shopStoreBaseService.isExistsByStoreName(record.getStore_name())) {
return CommonResult.failed("店铺名已被使用!");
}

View File

@ -544,6 +544,7 @@
<resultMap id="MchOrderResult" type="com.suisung.mall.common.modules.order.dto.MchOrderInfoDTO">
<!--订单对象映射-->
<id property="order_id" column="order_id"/>
<result property="order_title" column="order_title"/>
<result property="order_pickup_num" column="order_pickup_num"/>
@ -574,6 +575,7 @@
<!-- 买家嵌套对象映射 -->
<association property="buyer_info" javaType="com.suisung.mall.common.modules.order.dto.MchOrderBuyerDTO">
<result property="buyer_user_id" column="buyer_user_id"/>
<result property="is_new_buyer" column="is_new_buyer"/>
<result property="da_name" column="da_name"/>
<result property="da_mobile" column="da_mobile"/>
<result property="order_message" column="order_message"/>
@ -600,7 +602,7 @@
<result property="h5_url" column="h5_url"/>
<result property="feed" column="feed"/>
</association>
<!-- 订单商品集合映射-->
<collection property="order_items" ofType="com.suisung.mall.common.modules.order.dto.MchOrderItemDTO">
<result property="product_id" column="product_id"/>
<result property="item_id" column="item_id"/>
@ -631,6 +633,8 @@
oi.order_pickup_num,
oi.delivery_type_id,
oi.buyer_user_id,
IF((SELECT count(*) FROM shop_order_base WHERE buyer_user_id = oi.buyer_user_id AND order_state_id>=2020)>1,2,1)
AS is_new_buyer,
oi.payment_time,
od.order_shipping_fee,
od.order_message,
@ -695,6 +699,15 @@
OR spi.item_barcode LIKE CONCAT('%', #{keyword}, '%'))
</if>
<!--配送方式1-同城配送2-物流配送-->
<if test="delivery!=null and delivery==1">
and oi.delivery_type_id IN (16, 5)
</if>
<if test="delivery!=null and delivery==2">
and oi.delivery_type_id NOT IN (16,5)
</if>
<!--进行中-->
<if test="status!=null and status==1">
and ob.order_state_id IN (2020, 2030, 2040)