下单增加 item_barcode 字段

This commit is contained in:
Jack 2025-10-26 01:57:59 +08:00
parent 6b7cc54b01
commit 654fd82cf6
4 changed files with 70 additions and 87 deletions

View File

@ -45,10 +45,13 @@ public class ShopOrderItem implements Serializable {
@ApiModelProperty(value = "产品编号")
private Long product_id;
@ApiModelProperty(value = "货品编号")
private Long item_id;
@ApiModelProperty(value = "产品条形码(唯一码)")
private String item_barcode;
@ApiModelProperty(value = "商品名称")
private String item_name;

View File

@ -1610,20 +1610,22 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl<ShopOrderBaseMappe
}
}
// 预约订单检测
Integer bookingState = Convert.toInt(getParameter("booking_state"));
if (CheckUtil.isNotEmpty(bookingState) && CommonConstant.Order_Booking_State_YY.equals(bookingState)) {
String bookingBeginTime = getParameter("booking_begin_time");
String bookingEndTime = getParameter("booking_end_time");
Pair<Boolean, String> pair = shopOrderInfoService.checkBookingOrderArgs(checkedStore, bookingState, bookingBeginTime, bookingEndTime);
if (!pair.getFirst()) {
throw new ApiException(I18nUtil._(pair.getSecond()));
}
cartData.put("booking_state", bookingState);
cartData.put("booking_begin_time", bookingBeginTime);
cartData.put("booking_end_time", bookingEndTime);
}
// // 预约订单检测
// Integer bookingState = Convert.toInt(getParameter("booking_state"));
// if (CheckUtil.isNotEmpty(bookingState) && CommonConstant.Order_Booking_State_YY.equals(bookingState)) {
// String bookingBeginTime = getParameter("booking_begin_time");
// String bookingEndTime = getParameter("booking_end_time");
// Long bookingAt = getParameter("booking_at", 0L);
// Pair<Boolean, String> pair = shopOrderInfoService.checkBookingOrderArgs(checkedStore, bookingState, bookingBeginTime, bookingEndTime);
// if (!pair.getFirst()) {
// throw new ApiException(I18nUtil._(pair.getSecond()));
// }
//
// cartData.put("booking_state", bookingState);
// cartData.put("booking_begin_time", bookingBeginTime);
// cartData.put("booking_end_time", bookingEndTime);
// cartData.put("booking_at", bookingAt);
// }
// 添加保存订单关键方法
List<String> orderIdRow = addOrder(cartData, true, false, null);
@ -6306,6 +6308,7 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl<ShopOrderBaseMappe
}
}
// 遍历多个店铺的订单记录
for (Map store_item : items) {
// 判断店铺状态关闭状态不可以下单
Boolean store_is_open = Convert.toBool(store_item.get("store_is_open"));
@ -6313,7 +6316,8 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl<ShopOrderBaseMappe
throw new ApiException(I18nUtil._("店铺关闭中,不可以下单!"));
}
// 判断是否为虚拟订单
// 每个订单记录的商品列表
List<Map> item_items = (List<Map>) store_item.get("items");
Map activitys = (Map) ObjectUtil.defaultIfNull(store_item.get("activitys"), new HashMap());
@ -6324,6 +6328,7 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl<ShopOrderBaseMappe
Map item = CollUtil.isEmpty(item_items) ? new HashMap() : item_items.get(0);
Integer kind_id = Convert.toInt(item.get("kind_id"));
// 判断是否为虚拟订单
List<Integer> kinds = Arrays.asList(StateCode.PRODUCT_KIND_FUWU, StateCode.PRODUCT_KIND_CARD);
// 是否为虚拟商品订单
boolean isVirtualGoods = kinds.contains(kind_id);
@ -6636,23 +6641,46 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl<ShopOrderBaseMappe
info_row.setCoupon_type_id(shopProductIndex.getCoupon_type_id());
}
// 预约订单关键字段保存处理
Integer bookingState = Convert.toInt(cart_data.get("booking_state"));
Date bookingBeginTime = DateTimeUtils.tryParseDateTimeToDate(Convert.toStr(cart_data.get("booking_begin_time")));
Date bookingEndTime = DateTimeUtils.tryParseDateTimeToDate(Convert.toStr(cart_data.get("booking_end_time")));
if (CommonConstant.Order_Booking_State_YY.equals(bookingState) && bookingBeginTime != null && bookingEndTime != null) {
// 预约订单检测
Integer bookingState = Convert.toInt(getParameter("booking_state"));
if (CheckUtil.isNotEmpty(bookingState) && CommonConstant.Order_Booking_State_YY.equals(bookingState)) {
String bookingBeginTimeStr = getParameter("booking_begin_time", "");
String bookingEndTimeStr = getParameter("booking_end_time", "");
Long bookingAt = getParameter("booking_at", 0L);
// 参数校验
if (StrUtil.isBlank(bookingBeginTimeStr)) {
throw new ApiException(I18nUtil._("预约下单时间参数不能为空!"));
}
Pair<Boolean, String> pair = shopOrderInfoService.checkBookingOrderArgs(info_row.getStore_id(), bookingState, bookingBeginTimeStr, bookingEndTimeStr);
if (!pair.getFirst()) {
throw new ApiException(I18nUtil._(pair.getSecond()));
}
Date bookingBeginTime = DateTimeUtils.tryParseDateTimeToDate(bookingBeginTimeStr);
Date bookingEndTime = DateTimeUtils.tryParseDateTimeToDate(bookingEndTimeStr);
if (bookingBeginTime == null) {
throw new ApiException(I18nUtil._("预约下单时间格式有误!"));
}
// 设置预约时间戳
if (CheckUtil.isEmpty(bookingAt)) {
bookingAt = bookingBeginTime.getTime() / 1000; // 预订单到达时间戳
}
info_row.setBooking_state(bookingState);
info_row.setBooking_at(bookingBeginTime.getTime() / 1000); // 预订单到达时间戳
info_row.setBooking_at(bookingAt);
info_row.setBooking_begin_time(bookingBeginTime);
info_row.setBooking_end_time(bookingEndTime);
// 重要预约订单任务创建处理
Boolean isSuccess = shopOrderBookingService.setupRedisBookingTask(info_row.getOrder_id(), info_row.getBooking_at());
if (!isSuccess) {
if (!shopOrderBookingService.setupRedisBookingTask(info_row.getOrder_id(), info_row.getBooking_at())) {
throw new ApiException(I18nUtil._("保存预约订单任务失败!"));
}
}
info_row.setActivity_json(JSONUtil.toJsonStr(store_item.get("discount_detail_rows")));
info_row.setPayment_form_id(payment_form_id);
UserDto user = getCurrentUser();
@ -6886,13 +6914,13 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl<ShopOrderBaseMappe
cart_ids.add(cart_id);
}
// 如果商品在售中
Boolean is_on_sale = Convert.toBool(_item.get("is_on_sale"));
if (is_on_sale || CollUtil.isNotEmpty(giftbag)) {
ShopOrderItem item_row = new ShopOrderItem();
Long product_id = Convert.toLong(_item.get("product_id"));
Long item_id = Convert.toLong(_item.get("item_id"));
String item_barcode = Convert.toStr(_item.get("item_barcode"));
String item_src_id = Convert.toStr(_item.get("item_src_id")); // 商品 SKU id
if (CheckUtil.isEmpty(item_src_id)) {
item_src_id = String.valueOf(item_id);
@ -6932,6 +6960,7 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl<ShopOrderBaseMappe
item_row.setBuyer_id((Integer) base_row.get("buyer_user_id")); // 买家user_id 冗余
item_row.setStore_id((Integer) base_row.get("store_id")); // 店铺ID
item_row.setProduct_id(product_id); // 产品id
item_row.setItem_barcode(item_barcode);// 商品条形码(唯一码)
item_row.setItem_id(item_id); // 货品id
item_row.setItem_src_id(item_src_id); // 商品 SKU id
item_row.setItem_name(product_item_name); // 商品名称
@ -7555,6 +7584,7 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl<ShopOrderBaseMappe
}
}
// 保存订单商品信息
if (!shopOrderItemService.saveOrUpdate(item_rows)) {
throw new ApiException(I18nUtil._("保存订单信息数据失败!"));
}
@ -9240,64 +9270,12 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl<ShopOrderBaseMappe
if (StringUtils.isBlank(value)) {
return defaultValue;
}
// 使用 Long.valueOf 替代 Long.parseLong同时处理 NumberFormatException 异常
return Long.valueOf(value.trim());
} catch (NumberFormatException e) {
// 当配置值不是有效数字时记录警告日志并返回默认值
logger.warn("Same city order expire seconds config value is not a valid number, using default value: {}", defaultValue);
return defaultValue;
return Convert.toLong(value.trim());
} catch (Exception e) {
// 捕获其他可能的异常确保方法总是返回一个有效值
logger.error("Error getting same city order expire seconds, using default value: {}", defaultValue, e);
logger.error("获取同城配送最大有效值失败, 使用默认值: {}", defaultValue, e);
return defaultValue;
}
}
/**
* 取货单号格式化
*
* @param pickNum 一般是 Long 类型
* @return
*/
/**
* 计算平台与代理商的总分账金额
*
* @param storeId 店铺ID
* @param pendingAmount 待分账金额 =订单实际支付金额单位减去运费
* @return 分账给平台和代理商的总金额单位
*/
public BigDecimal calculatePlatformAndAgentShareAmount(Integer storeId, BigDecimal pendingAmount) {
// 检查参数有效性
if (storeId == null || storeId <= 0 || pendingAmount == null || pendingAmount.compareTo(BigDecimal.ZERO) <= 0) {
logger.warn("计算分账金额参数无效: storeId={}, pendingAmount={}", storeId, pendingAmount);
return BigDecimal.ZERO;
}
try {
// 获取店铺的分账比例例如 5 表示 5%
BigDecimal storeSplitRatio = shopStoreBaseService.getStoreSplitRatio(storeId, false);
if (storeSplitRatio == null) {
logger.warn("获取店铺分账比例失败storeId: {}", storeId);
return BigDecimal.ZERO;
}
// 确保比例在合理范围 [0, 100]
storeSplitRatio = storeSplitRatio.max(BigDecimal.ZERO).min(new BigDecimal(100));
// 分账金额 = 支付金额 × 平台和代理商分账比例 ÷ 100 将百分比转换为小数
BigDecimal result = pendingAmount.multiply(new BigDecimal(100).subtract(storeSplitRatio))
.divide(new BigDecimal(100), 2, RoundingMode.HALF_DOWN); // 保留两位小数
logger.debug("计算分账金额: storeId={}, pendingAmount={}, ratio={}, result={}",
storeId, pendingAmount, storeSplitRatio, result);
return result;
} catch (Exception e) {
logger.error("计算平台与代理商分账金额异常storeId: {}, pendingAmount: {}", storeId, pendingAmount, e);
return BigDecimal.ZERO;
}
}
}

View File

@ -879,18 +879,18 @@ public class ShopOrderInfoServiceImpl extends BaseServiceImpl<ShopOrderInfoMappe
}
// 3. 时间格式检查
if (StrUtil.hasBlank(bookingBeginTimeStr, bookingEndTimeStr)) {
if (StrUtil.isBlank(bookingBeginTimeStr)) {
return Pair.of(false, "[预约订单校验] 预约时间不能为空");
}
Date bookingBeginTime = DateTimeUtils.tryParseDateTimeToDate(bookingBeginTimeStr);
Date bookingEndTime = DateTimeUtils.tryParseDateTimeToDate(bookingEndTimeStr);
if (bookingBeginTime == null || bookingEndTime == null) {
if (bookingBeginTime == null) {
return Pair.of(false, "[预约订单校验] 预约时间格式有误");
}
// 4. 时间逻辑检查 - 开始时间不能晚于结束时间
if (bookingBeginTime.after(bookingEndTime)) {
if (bookingEndTime != null && bookingBeginTime.after(bookingEndTime)) {
return Pair.of(false, "[预约订单校验] 开始时间不能晚于截止时间");
}

View File

@ -14,14 +14,15 @@
order_item_commission_fee,
order_item_commission_fee_refund, policy_discountrate, item_voucher, order_item_note, order_item_file,
order_item_confirm_file, order_item_confirm_status, design_file_images, order_item_saler_id, item_src_id,
order_item_supplier_sync, src_order_id
order_item_supplier_sync, src_order_id, item_barcode
</sql>
<select id="listItem" resultType="java.util.Map">
SELECT
shop_order_item.store_id,
shop_order_item.product_id,
shop_order_item.item_id,
shop_order_item.item_barcode,
shop_order_item.item_name,
shop_order_item.item_unit_price,
shop_order_item.order_item_image,
@ -86,6 +87,7 @@
ORDER BY
item_total DESC
</select>
<select id="getOrderItemList" resultType="java.util.Map">
select *
from shop_order_item m left join shop_order_info o on m.order_id = o.order_id
@ -157,7 +159,7 @@
a.order_item_unit_price,
a.order_item_quantity,
a.order_item_amount,
"" as product_sn
a.item_barcode as product_sn
FROM shop_order_item a WHERE a.order_id = #{orderId} ORDER BY a.order_item_id asc
</select>
</mapper>