增加银行卡号的校验工具类
This commit is contained in:
parent
4a5252a6d8
commit
a8505167df
@ -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);
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -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 = "查询移动商家端订单详情数据")
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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("店铺名已被使用!");
|
||||
}
|
||||
|
||||
|
||||
@ -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)
|
||||
|
||||
Loading…
Reference in New Issue
Block a user