提现和顺丰同城配置 转正

This commit is contained in:
Jack 2025-09-29 17:30:41 +08:00
parent 8eb1e4f59f
commit 7fdd03b23e
10 changed files with 148 additions and 25 deletions

View File

@ -61,12 +61,12 @@ public class LklSeparateDTO {
// 测试基于可分账金额的分账算法正常情况
System.out.println("\n=== 基于可分账金额的分账算法测试(正常情况) ===");
LklSeparateDTO dto2 = new LklSeparateDTO();
dto2.setTotalSeparateAmount(1); // 分账总额 1000分
dto2.setShippingFee(0); // 配送费 100分
dto2.setTotalSeparateAmount(1500); // 分账总额 1000分
dto2.setShippingFee(500); // 配送费 100分
// dto2.setRefCanSeparateAmount(null);
dto2.setLklRatio(new BigDecimal("0.0025")); // 拉卡拉分账比例 0.0025
dto2.setMchRatio(new BigDecimal("0.94")); // 商家分账比例 0.857 (会产生小数)
dto2.setPlatRatio(new BigDecimal("0.01")); // 平台分账比例 0.01
dto2.setMchRatio(new BigDecimal("0.95")); // 商家分账比例 0.857 (会产生小数)
dto2.setPlatRatio(new BigDecimal("0.06")); // 平台分账比例 0.01
// 不设置一级和二级代理商分账比例测试不参与分账的情况
// dto2.setAgent1stRatio(new BigDecimal("0.01")); // 一级代理商分账比例 0.023 (会产生小数)
// dto2.setAgent2ndRatio(new BigDecimal("0.04")); // 二级代理商分账比例 0.031 (会产生小数)

View File

@ -188,28 +188,80 @@ public class CheckUtil {
return true;
}
/**
* 校验数据的某个字段是否为指定值
*
* @param value 指定值的字段值
* @param data 需要对比的数据Map
* @param key 字段名
* @return boolean 字段值等于指定值返回true否则返回false
*/
public static boolean checkDataRights(Integer value, Map data, String key) {
if (CollUtil.isEmpty(data)) return false;
// 检查数据是否为空或key是否为空
if (CollUtil.isEmpty(data) || StrUtil.isBlank(key)) {
log.debug("数据为空或key为空, data: {}, key: {}", data, key);
return false;
}
// 从数据中获取指定key的值并转换为Integer类型
Integer _value = Convert.toInt(data.get(key));
return ObjectUtil.equal(_value, value);
// 比较获取的值与指定值是否相等
boolean result = ObjectUtil.equal(_value, value);
log.info("校验数据权限, key: {}, 值: {}==数据值: {} ? 结果: {}", key, value, _value, result);
return result;
}
/**
* 校验数据对象的某个字段是否为指定值
*
* @param value 指定值的字段值
* @param data 需要对比的数据对象
* @param idMapper 获取数据对象ID的函数
* @param <T> 数据对象类型
* @return boolean 字段值等于指定值返回true否则返回false
*/
public static <T> boolean checkDataRights(Integer value, T data, Function<T, Integer> idMapper) {
if (ObjectUtil.isEmpty(data)) return false;
// 检查数据对象或映射函数是否为空
if (ObjectUtil.isEmpty(data) || ObjectUtil.isEmpty(idMapper)) {
log.debug("数据对象或映射函数为空, data: {}, idMapper: {}", data, idMapper);
return false;
}
// 通过映射函数获取数据对象的值
Object _value = idMapper.apply(data);
return ObjectUtil.equal(_value, value);
// 比较获取的值与指定值是否相等
boolean result = ObjectUtil.equal(_value, value);
log.debug("校验单个对象数据权限, 值: {}, 数据值: {}, 结果: {}", value, _value, result);
return result;
}
/**
* 校验数据列表中每个对象的某个字段是否为指定值
*
* @param value 指定值的字段值
* @param data 需要对比的数据列表
* @param idMapper 获取数据对象ID的函数
* @param <T> 数据对象类型
* @return boolean 所有对象字段值都等于指定值返回true否则返回false
*/
public static <T> boolean checkDataRights(Integer value, List<T> data, Function<T, Integer> idMapper) {
if (CollUtil.isEmpty(data)) return false;
// 检查数据列表或映射函数是否为空
if (CollUtil.isEmpty(data) || ObjectUtil.isEmpty(idMapper)) {
log.debug("数据列表或映射函数为空, 数据大小: {}, 映射函数: {}",
data != null ? data.size() : 0, idMapper);
return false;
}
// 遍历数据列表中的每个对象
for (T datum : data) {
// 递归校验每个对象如果有任何一个不匹配则返回false
if (!checkDataRights(value, datum, idMapper)) {
log.debug("列表数据权限校验失败,失败项: {}", datum);
return false;
}
}
log.debug("列表数据权限校验成功, 数据大小: {}, 值: {}", data.size(), value);
return true;
}
public static String addslashes(String str) {
if (str == null) {
return null;

View File

@ -2823,11 +2823,14 @@ public class LakalaApiServiceImpl implements LakalaApiService {
// RMK 本次分账成功后给商户和接收方 D1提现到银行卡
if (CollUtil.isNotEmpty(detailDatas)) {
int idx = 1;
for (JSONObject detailData : detailDatas.jsonIter()) {
String recvNo = detailData.getStr("recv_no");
String amt = detailData.getStr("amt");
if (StrUtil.isNotBlank(recvNo) && StrUtil.isNotBlank(amt)) {
Boolean drawSuccess = ewalletWithDrawD1(recvNo, outSeparateNo, amt, JSONUtil.toJsonStr(detailDatas));
String outSeparateNoTemp = String.format("%s_%s", outSeparateNo, idx);
Boolean drawSuccess = ewalletWithDrawD1(recvNo, outSeparateNoTemp, amt, JSONUtil.toJsonStr(detailDatas));
idx++;
log.info("[拉卡拉分账通知] 账户D1提现{},商户号={},分账单号={},金额={}分",
Boolean.TRUE.equals(drawSuccess) ? "成功" : "失败", recvNo, outSeparateNo, amt);
}

View File

@ -1112,7 +1112,7 @@ public class SFExpressApiServiceImpl implements SFExpressApiService {
// wxOrderShippingService.notifyConfirmReceive(shopStoreSfOrder.getShop_order_id());
// 订单确认收货
// shopOrderBaseService.receive(shopStoreSfOrder.getShop_order_id(), null);
// shopOrderBaseService.receive(shopStoreSfOrder.getShop_order_id(), null);
String orderId = shopStoreSfOrder.getShop_order_id();

View File

@ -137,5 +137,11 @@ public class ShopStorePrinterController {
return shopStorePrinterService.tryPrint(printer_id);
}
@ApiOperation(value = "向厂家删除一个打票机", notes = "向厂家删除一个打票机")
@RequestMapping(value = "/delete/from/feie", method = {RequestMethod.POST})
public CommonResult deleteFeiePrinter(@RequestParam(name = "sn_list", required = true) String snList) {
return shopStorePrinterService.deleteFeiePrinter(snList);
}
}

View File

@ -94,5 +94,13 @@ public interface ShopStorePrinterService extends IBaseService<ShopStorePrinter>
* @param printerId 打印机Id
**/
CommonResult tryPrint(Long printerId);
/**
* 从飞鹅厂家删除飞鹅打印机
*
* @param snList 打印机编号多台打印机请用减号-连接起来316500010-316500011-316500012
* @return
*/
CommonResult deleteFeiePrinter(String snList);
}

View File

@ -786,11 +786,11 @@ public class ShopStoreBaseServiceImpl extends BaseServiceImpl<ShopStoreBaseMappe
}
if (CheckUtil.isNotEmpty(store_category_id)) {
queryWrapper.eq("store_category_id",store_category_id);
queryWrapper.eq("store_category_id", store_category_id);
params.put("store_category_id", store_category_id);
}
if(CheckUtil.isNotEmpty(store_2nd_category_id)){
queryWrapper.eq("store_2nd_category_id",store_2nd_category_id);
if (CheckUtil.isNotEmpty(store_2nd_category_id)) {
queryWrapper.eq("store_2nd_category_id", store_2nd_category_id);
}
@ -3197,6 +3197,7 @@ public class ShopStoreBaseServiceImpl extends BaseServiceImpl<ShopStoreBaseMappe
shopStoreBase.setUser_id(userId);
shopStoreBase.setStore_name(shopMchEntry.getStore_name());
// 店铺二级分类
if (CheckUtil.isEmpty(shopStoreBase.getStore_category_id())) {
shopStoreBase.setStore_category_id(shopMchEntry.getBiz_category());
}
@ -3204,6 +3205,7 @@ public class ShopStoreBaseServiceImpl extends BaseServiceImpl<ShopStoreBaseMappe
shopStoreBase.setStore_2nd_category_id(
CheckUtil.isNotEmpty(shopMchEntry.getBiz_second_category()) ? shopMchEntry.getBiz_second_category() : 0);
}
// 计算分账比例
BigDecimal splitRatio = shopMchEntryService.getMchEntryRatioOrDefault(
shopMchEntry.getBiz_category(),

View File

@ -131,6 +131,9 @@ public class ShopStorePrinterServiceImpl extends BaseServiceImpl<ShopStorePrinte
return CommonResult.success(null, "打票机已添加,请勿重复操作");
}
// 从厂家删除其他店使用该打印机的记录
feieUtil.delPrinter(record.getPrinter_sn());
if (add(record)) {
return CommonResult.success(null, "添加成功");
}
@ -138,27 +141,36 @@ public class ShopStorePrinterServiceImpl extends BaseServiceImpl<ShopStorePrinte
return CommonResult.failed("添加失败!");
}
/**
* 更新店铺打印机信息
*
* @param record 打印机信息
* @return 更新结果
*/
@Override
public CommonResult updateShopStorePrinter(ShopStorePrinter record) {
// 判断有没有权限
UserDto user = getCurrentUser();
if (user == null || !user.isStore()) {
logger.warn("用户无权限操作更新打印机用户ID: {}", user != null ? user.getId() : "null");
return CommonResult.failed("无权限操作!");
}
Integer userId = user.getId() == null ? 0 : user.getId();
if (record == null || record.getPrinter_id() <= 0) {
logger.warn("更新打印机失败记录不存在或ID无效打印机ID: {}", record != null ? record.getPrinter_id() : "null");
return CommonResult.failed("记录不存在!");
}
if (StrUtil.isBlank(record.getPrinter_sn()) || StrUtil.isBlank(record.getPrinter_key()) || StrUtil.isBlank(record.getPrinter_name())) {
logger.warn("更新打印机失败缺少必要参数打印机ID: {}", record.getPrinter_id());
return CommonResult.failed("缺少必要参数!");
}
ShopStorePrinter existRecord = getById(record.getPrinter_id());
if (existRecord == null) {
logger.warn("更新打印机失败打票机不存在打印机ID: {}", record.getPrinter_id());
return CommonResult.failed("打票机不存在!");
}
@ -171,6 +183,8 @@ public class ShopStorePrinterServiceImpl extends BaseServiceImpl<ShopStorePrinte
updateWrapper.set("region_id", record.getRegion_id());
updateWrapper.set("paper_with", record.getPaper_with());
updateWrapper.set("website_url", record.getWebsite_url());
// 根据原记录状态设置更新后的状态
if (existRecord.getStatus() == null || !CommonConstant.Enable.equals(existRecord.getStatus())) {
updateWrapper.set("status", CommonConstant.Disable2);
} else {
@ -181,40 +195,53 @@ public class ShopStorePrinterServiceImpl extends BaseServiceImpl<ShopStorePrinte
updateWrapper.set("updated_by", userId);
String msg = "修改成功";
// 检查是否更改了打印机SN
if (!existRecord.getPrinter_sn().equals(record.getPrinter_sn())) {
logger.info("检测到打印机SN变更原SN: {}, 新SN: {}", existRecord.getPrinter_sn(), record.getPrinter_sn());
// 更改了 sn并且 sn 从未添加过打票机不在门店内的
QueryWrapper<ShopStorePrinter> queryWrapper2 = new QueryWrapper<>();
queryWrapper2.eq("store_id", record.getStore_id());
queryWrapper2.eq("printer_sn", record.getPrinter_sn());
ShopStorePrinter existRecord2 = getOne(queryWrapper2);
ShopStorePrinter existRecord2 = findOne(queryWrapper2);
if (existRecord2 == null || existRecord2.getPrinter_id() <= 0) {
// 打印机从未加入到厂家到情况往厂商添加打印机
// 格式"922441475#r6ZXPvHH#核销柜台";
Pair<Boolean, String> retPair = feieUtil.addPrinter(String.format("%s#%s#%s", record.getPrinter_sn(), record.getPrinter_key(), record.getPrinter_name()));
String printerInfo = String.format("%s#%s#%s", record.getPrinter_sn(), record.getPrinter_key(), record.getPrinter_name());
logger.info("向厂家添加新打印机: {}", printerInfo);
Pair<Boolean, String> retPair = feieUtil.addPrinter(printerInfo);
if (retPair.getFirst()) {
logger.info("向厂家添加打印机成功SN: {}", record.getPrinter_sn());
updateWrapper.set("flag", CommonConstant.Enable);
updateWrapper.set("status", CommonConstant.Enable);
} else {
logger.warn("向厂家添加打印机失败SN: {}, 错误信息: {}", record.getPrinter_sn(), retPair.getSecond());
msg = msg + ",但打印机绑定未成功,请检查打印机编号和密钥是否填写正确。";
updateWrapper.set("flag", CommonConstant.Disable2);
updateWrapper.set("status", CommonConstant.Disable2);
}
// 解绑之前的打印机
logger.info("解绑原打印机SN: {}", existRecord.getPrinter_sn());
feieUtil.delPrinter(existRecord.getPrinter_sn());
} else {
// 打印机编号已被使用
logger.warn("打印机已添加请勿重复操作SN: {}", record.getPrinter_sn());
return CommonResult.success(null, "打票机已添加,请勿重复操作");
}
}
boolean success = update(updateWrapper);
if (success) {
logger.info("更新打印机信息成功打印机ID: {}", record.getPrinter_id());
return CommonResult.success(null, msg);
}
logger.error("更新打印机信息失败打印机ID: {}", record.getPrinter_id());
return CommonResult.failed("修改失败!");
}
@ -243,9 +270,9 @@ public class ShopStorePrinterServiceImpl extends BaseServiceImpl<ShopStorePrinte
} else {
status = CommonConstant.Disable2;
// 向厂家解绑打印机
boolean success = feieUtil.delPrinter(record.getPrinter_sn());
if (!success) {
return CommonResult.failed("打印机解绑定未成功,操作失败。");
Pair<Boolean, String> retPair = feieUtil.delPrinter(record.getPrinter_sn());
if (!retPair.getFirst()) {
return CommonResult.failed(retPair.getSecond());
}
}
@ -442,5 +469,30 @@ public class ShopStorePrinterServiceImpl extends BaseServiceImpl<ShopStorePrinte
}
}
/**
* 从飞鹅厂家删除飞鹅打印机
*
* @param snList 打印机编号多台打印机请用减号"-"连接起来316500010-316500011-316500012
* @return 删除结果
*/
@Override
public CommonResult deleteFeiePrinter(String snList) {
// 参数校验
if (StrUtil.isBlank(snList)) {
logger.warn("删除飞鹅打印机失败:打印机编号列表为空");
return CommonResult.failed("打印机编号不能为空");
}
logger.info("开始从厂家删除飞鹅打印机,打印机编号: {}", snList);
Pair<Boolean, String> retPair = feieUtil.delPrinter(snList);
if (!retPair.getFirst()) {
logger.error("从厂家删除飞鹅打印机失败,打印机编号: {}", snList);
return CommonResult.failed(retPair.getSecond());
}
logger.info("从厂家删除飞鹅打印机成功,打印机编号: {}", snList);
return CommonResult.success("从厂家删除飞鹅打印机成功");
}
}

View File

@ -120,18 +120,18 @@ public class FeieUtil {
* @param snList 打印机编号多台打印机请用减号-连接起来316500010-316500011-316500012
* @return
*/
public boolean delPrinter(String snList) {
public Pair<Boolean, String> delPrinter(String snList) {
List<NameValuePair> nvps = new ArrayList<NameValuePair>();
nvps.add(new BasicNameValuePair("snlist", snList));
FeiePrinterApiRes reps = sendHttpPost("Open_printerDelList", nvps);
logger.info("飞鹅删除打印机返回数据:{}", reps);
if (reps != null && reps.getRet().equals(0)) {
return true;
return Pair.of(true, "打印机删除成功!");
}
logger.error("飞鹅删除打印机操作失败:{}", reps.getMsg());
return false;
return Pair.of(true, "打印机删除失败:" + reps.getMsg());
}
/**

View File

@ -191,7 +191,7 @@ sf-express:
# dev_id: 1715091463
# appid: 1715091463
# appkey: 47466ae69c530f831395e1bc405639fb
enable: 2
enable: 1
#拉卡拉进件配置
lakala:
#服务地址