打包费功能添加

This commit is contained in:
Jack 2025-08-15 08:21:28 +08:00
parent bf7489138f
commit 2a764f1516
14 changed files with 339 additions and 51 deletions

View File

@ -98,6 +98,9 @@ public class ShopOrderData implements Serializable {
@ApiModelProperty(value = "平台费(分给平台或代理商的费用),根据不同的店铺分类,从商品原价中扣除相应的费用。") @ApiModelProperty(value = "平台费(分给平台或代理商的费用),根据不同的店铺分类,从商品原价中扣除相应的费用。")
private BigDecimal platform_fee; private BigDecimal platform_fee;
@ApiModelProperty(value = "店铺统一设置的打包费")
private BigDecimal packing_fee;
@ApiModelProperty(value = "代金券id/优惠券/返现:发放选择使用") @ApiModelProperty(value = "代金券id/优惠券/返现:发放选择使用")
private Integer voucher_id; private Integer voucher_id;

View File

@ -62,7 +62,7 @@ public class MchOrderInfoDTO implements Serializable {
private Long arrival_time; private Long arrival_time;
@ApiModelProperty(value = "订单原价") @ApiModelProperty(value = "订单原价")
private BigDecimal order_product_amount; private BigDecimal order_product_amount;
@ApiModelProperty(value = "应付金额/应支付金额:order_goods_amount - order_discount_amount + order_shipping_fee - order_voucher_price - order_points_fee - order_adjust_fee") @ApiModelProperty(value = "应付金额/应支付金额:order_goods_amount - order_discount_amount + order_shipping_fee + packing_fee - order_voucher_price - order_points_fee - order_adjust_fee")
private BigDecimal order_payment_amount; private BigDecimal order_payment_amount;
@ApiModelProperty(value = "货币编号") @ApiModelProperty(value = "货币编号")
private Integer currency_id; private Integer currency_id;
@ -74,6 +74,8 @@ public class MchOrderInfoDTO implements Serializable {
private BigDecimal order_shipping_fee; private BigDecimal order_shipping_fee;
@ApiModelProperty(value = "平台费") @ApiModelProperty(value = "平台费")
private BigDecimal platform_fee; private BigDecimal platform_fee;
@ApiModelProperty(value = "店铺统一设置的打包费")
private BigDecimal packing_fee;
//总计优惠金额 order_discount_amount + order_voucher_price + order_points_fee + order_adjust_fee //总计优惠金额 order_discount_amount + order_voucher_price + order_points_fee + order_adjust_fee
@ApiModelProperty(value = "总计优惠金额,优惠、折扣、活动费用") @ApiModelProperty(value = "总计优惠金额,优惠、折扣、活动费用")
private BigDecimal total_discount_amount; private BigDecimal total_discount_amount;

View File

@ -87,7 +87,7 @@ public class ShopStoreBase implements Serializable {
@ApiModelProperty(value = "店铺分类编号") @ApiModelProperty(value = "店铺分类编号")
private Integer store_category_id; private Integer store_category_id;
@ApiModelProperty(value = "店铺资料信息状态(ENUM):3210-待完善资料; 3220-等待审核 ; 3230-资料审核没有通过; 3240-资料审核通过,待付款") @ApiModelProperty(value = "店铺资料信息状态(ENUM):3210-待完善资料; 3220-等待审核; 3230-资料审核没有通过; 3240-资料审核通过,待付款")
private Integer store_state_id; private Integer store_state_id;
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ -130,4 +130,16 @@ public class ShopStoreBase implements Serializable {
@ApiModelProperty(value = "店铺分账比例数值 0.00-100.00 范围内,数值根据店铺分类计算得出,也可以超管指定一个数值。") @ApiModelProperty(value = "店铺分账比例数值 0.00-100.00 范围内,数值根据店铺分类计算得出,也可以超管指定一个数值。")
private BigDecimal split_ratio; private BigDecimal split_ratio;
@ApiModelProperty(value = "店铺统一的打包费, 0-10元范围")
private BigDecimal packing_fee;
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@ApiModelProperty(value = "新增时间")
private Date created_at;
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@ApiModelProperty(value = "修改时间")
private Date updated_at;
} }

View File

@ -58,6 +58,12 @@ public class ShopStoreInfo implements Serializable {
@ApiModelProperty(value = "卖家电话") @ApiModelProperty(value = "卖家电话")
private String store_tel; private String store_tel;
@ApiModelProperty(value = "联系人")
private String contact_name;
@ApiModelProperty(value = "联系人手机")
private String contact_mobile;
@ApiModelProperty(value = "qq") @ApiModelProperty(value = "qq")
private String store_qq; private String store_qq;

View File

@ -1,7 +1,5 @@
package com.suisung.mall.shop.base.service.impl; package com.suisung.mall.shop.base.service.impl;
import cn.hutool.captcha.CaptchaUtil;
import cn.hutool.captcha.LineCaptcha;
import cn.hutool.core.convert.Convert; import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
@ -96,6 +94,7 @@ public class ShopBaseConfigServiceImpl extends BaseServiceImpl<ShopBaseConfigMap
return Convert.toInt(config_value); return Convert.toInt(config_value);
} }
/** /**
* 获取验证码 * 获取验证码
*/ */
@ -105,35 +104,220 @@ public class ShopBaseConfigServiceImpl extends BaseServiceImpl<ShopBaseConfigMap
response.setHeader("Pragma", "no-cache"); response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache"); response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0); response.setDateHeader("Expires", 0);
// 产生验证码图片的图片的宽是116高是36验证码的长度是4干扰线的条数是20
LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(120, 40, 4, 20);
// 可选设置自定义字体如果需要
// lineCaptcha.setFont(new Font("Arial", Font.BOLD, 16));
// 拼接时间戳
String verify_token = getParameter("verify_token", String.class);
//获取验证码图片中的字符串
String code = RedisConstant.Verifycode_NameSpace + verify_token + lineCaptcha.getCode();
redisService.set(code, "", 60); // 有效期一分钟
//获取到response的响应流
BufferedImage image = lineCaptcha.getImage();
OutputStream os = null; OutputStream os = null;
try { try {
// 获取verify_token参数
String verify_token = getParameter("verify_token", String.class);
if (StrUtil.isBlank(verify_token)) {
logger.warn("验证码请求缺少verify_token参数");
response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
return;
}
// 创建一个不依赖字体的简单数字验证码
String captchaCode = generateSimpleCaptcha(4);
// 手动创建简单的验证码图片
BufferedImage image = createSimpleCaptchaImage(captchaCode);
// 保存验证码到Redis
String code = RedisConstant.Verifycode_NameSpace + verify_token + captchaCode;
redisService.set(code, "", 60); // 有效期一分钟
// 输出图片到响应流
os = response.getOutputStream(); os = response.getOutputStream();
ImageIO.write(image, "png", os); if (image != null) {
} catch (IOException e) { ImageIO.write(image, "png", os);
logger.error("获取验证码响应异常!" + e.getMessage(), e); } else {
} finally { logger.error("生成验证码图片失败image为null");
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
}
os.flush();
} catch (Exception e) {
logger.error("获取验证码响应异常: " + e.getMessage(), e);
try { try {
assert os != null; response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
os.close(); } catch (Exception ex) {
} catch (IOException e) { logger.error("设置错误响应状态异常: " + ex.getMessage(), ex);
logger.error("获取验证码响应异常!" + e.getMessage(), e); }
} finally {
if (os != null) {
try {
os.close();
} catch (IOException e) {
logger.error("关闭输出流异常: " + e.getMessage(), e);
}
} }
} }
} }
/**
* 生成简单的数字验证码
*
* @param length 验证码长度
* @return 验证码字符串
*/
private String generateSimpleCaptcha(int length) {
String chars = "0123456789";
StringBuilder captcha = new StringBuilder();
java.util.Random random = new java.util.Random();
for (int i = 0; i < length; i++) {
captcha.append(chars.charAt(random.nextInt(chars.length())));
}
return captcha.toString();
}
/**
* 创建简单的验证码图片不依赖系统字体
*
* @param captchaCode 验证码
* @return 验证码图片
*/
private BufferedImage createSimpleCaptchaImage(String captchaCode) {
int width = 120;
int height = 40;
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
java.awt.Graphics2D g = image.createGraphics();
// 设置背景色
g.setColor(java.awt.Color.WHITE);
g.fillRect(0, 0, width, height);
// 绘制干扰线
java.util.Random random = new java.util.Random();
g.setColor(java.awt.Color.LIGHT_GRAY);
for (int i = 0; i < 10; i++) {
int x1 = random.nextInt(width);
int y1 = random.nextInt(height);
int x2 = random.nextInt(width);
int y2 = random.nextInt(height);
g.drawLine(x1, y1, x2, y2);
}
// 绘制验证码使用简单的图形而不是文字
g.setColor(java.awt.Color.BLACK);
int fontSize = 20;
for (int i = 0; i < captchaCode.length(); i++) {
char c = captchaCode.charAt(i);
// 使用drawString可能会触发字体问题所以我们用图形代替
int x = 20 + i * 20;
int y = 25;
// 绘制数字的简单表示这里仍然可能有问题所以我们用点阵方式
drawSimpleNumber(g, c, x, y);
}
g.dispose();
return image;
}
/**
* 用简单图形绘制数字避免使用字体
*
* @param g Graphics对象
* @param c 要绘制的字符
* @param x x坐标
* @param y y坐标
*/
private void drawSimpleNumber(java.awt.Graphics2D g, char c, int x, int y) {
// 简单的数字绘制避免使用字体
switch (c) {
case '0':
g.drawOval(x, y - 15, 15, 15);
break;
case '1':
g.drawLine(x + 7, y - 15, x + 7, y);
break;
case '2':
g.drawLine(x, y - 15, x + 15, y - 15); // 上横线
g.drawLine(x + 15, y - 15, x + 15, y - 7); // 右上竖线
g.drawLine(x, y - 7, x + 15, y - 7); // 中横线
g.drawLine(x, y - 7, x, y); // 左下竖线
g.drawLine(x, y, x + 15, y); // 下横线
break;
case '3':
g.drawLine(x, y - 15, x + 15, y - 15); // 上横线
g.drawLine(x + 15, y - 15, x + 15, y); // 右竖线
g.drawLine(x, y - 7, x + 15, y - 7); // 中横线
g.drawLine(x, y, x + 15, y); // 下横线
break;
case '4':
g.drawLine(x, y - 15, x, y - 7); // 左上竖线
g.drawLine(x + 15, y - 15, x + 15, y); // 右竖线
g.drawLine(x, y - 7, x + 15, y - 7); // 中横线
break;
case '5':
g.drawLine(x, y - 15, x + 15, y - 15); // 上横线
g.drawLine(x, y - 15, x, y - 7); // 左上竖线
g.drawLine(x, y - 7, x + 15, y - 7); // 中横线
g.drawLine(x + 15, y - 7, x + 15, y); // 右下竖线
g.drawLine(x, y, x + 15, y); // 下横线
break;
case '6':
g.drawOval(x, y - 15, 15, 15);
g.drawLine(x, y - 7, x, y); // 左下竖线
g.drawLine(x, y, x + 15, y); // 下横线
break;
case '7':
g.drawLine(x, y - 15, x + 15, y - 15); // 上横线
g.drawLine(x + 15, y - 15, x + 15, y); // 右竖线
break;
case '8':
g.drawOval(x, y - 15, 15, 15);
g.drawOval(x, y - 7, 15, 15);
break;
case '9':
g.drawOval(x, y - 15, 15, 15);
g.drawLine(x + 15, y - 7, x + 15, y); // 右下竖线
g.drawLine(x, y, x + 15, y); // 下横线
break;
default:
// 绘制一个简单的点作为默认
g.fillOval(x + 7, y - 7, 3, 3);
}
}
// /**
// * 获取验证码
// */
// @Override
// public void image(HttpServletResponse response) {
// response.setContentType("image/png");
// response.setHeader("Pragma", "no-cache");
// response.setHeader("Cache-Control", "no-cache");
// response.setDateHeader("Expires", 0);
// // 产生验证码图片的图片的宽是116高是36验证码的长度是4干扰线的条数是20
// LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(120, 40, 4, 20);
//
// // 可选设置自定义字体如果需要
//// lineCaptcha.setFont(new Font("Arial", Font.BOLD, 16));
//
// // 拼接时间戳
// String verify_token = getParameter("verify_token", String.class);
//
// //获取验证码图片中的字符串
// String code = RedisConstant.Verifycode_NameSpace + verify_token + lineCaptcha.getCode();
// redisService.set(code, "", 60); // 有效期一分钟
//
// //获取到response的响应流
// BufferedImage image = lineCaptcha.getImage();
// OutputStream os = null;
// try {
// os = response.getOutputStream();
// ImageIO.write(image, "png", os);
// } catch (IOException e) {
// logger.error("获取验证码响应异常!" + e.getMessage(), e);
// } finally {
// try {
// assert os != null;
// os.close();
// } catch (IOException e) {
// logger.error("获取验证码响应异常!" + e.getMessage(), e);
// }
// }
// }
} }

View File

@ -1455,6 +1455,7 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl<ShopOrderBaseMappe
// 配送方式 // 配送方式
cart_data.put("delivery_type_id", delivery_type_id); cart_data.put("delivery_type_id", delivery_type_id);
// 修改为distributor_user_id // 修改为distributor_user_id
Integer distributor_user_id = getParameter("distributor_user_id", Integer.class); Integer distributor_user_id = getParameter("distributor_user_id", Integer.class);
if (CheckUtil.isNotEmpty(distributor_user_id)) { if (CheckUtil.isNotEmpty(distributor_user_id)) {
@ -1573,6 +1574,10 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl<ShopOrderBaseMappe
cart_data.put("order_id", order_id_row); cart_data.put("order_id", order_id_row);
// BigDecimal packingFee = BigDecimal.ZERO;
// if (1 == 1) {
// cart_data.put("packing_fee", packingFee);
// }
// 判断是否拼团购买 // 判断是否拼团购买
if (gb_id != null) { if (gb_id != null) {
@ -5153,7 +5158,7 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl<ShopOrderBaseMappe
if (shopProductItem == null) { if (shopProductItem == null) {
throw new ApiException(I18nUtil._("无法获取订单中的商品,请检查!")); throw new ApiException(I18nUtil._("无法获取订单中的商品,请检查!"));
} }
Integer item_quantity_frozen = shopProductItem.getItem_quantity_frozen(); Integer item_quantity_frozen = shopProductItem.getItem_quantity_frozen();
int quantity_frozen = item_quantity_frozen - order_item_quantity; int quantity_frozen = item_quantity_frozen - order_item_quantity;
shopProductItem.setItem_quantity_frozen(quantity_frozen > 0 ? quantity_frozen : 0); shopProductItem.setItem_quantity_frozen(quantity_frozen > 0 ? quantity_frozen : 0);
@ -6164,9 +6169,11 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl<ShopOrderBaseMappe
Integer kind_id = Convert.toInt(item.get("kind_id")); Integer kind_id = Convert.toInt(item.get("kind_id"));
List<Integer> kinds = Arrays.asList(StateCode.PRODUCT_KIND_FUWU, StateCode.PRODUCT_KIND_CARD); List<Integer> kinds = Arrays.asList(StateCode.PRODUCT_KIND_FUWU, StateCode.PRODUCT_KIND_CARD);
// 是否为虚拟商品订单
boolean isVirtualGoods = kinds.contains(kind_id);
// 新增用于判断次卡优惠券券码在订单种的类型 // 新增用于判断次卡优惠券券码在订单种的类型
ShopProductIndex shopProductIndex = null; ShopProductIndex shopProductIndex = null;
if (kinds.contains(kind_id)) { if (isVirtualGoods) {
if (item_items.size() > 1) { if (item_items.size() > 1) {
throw new ApiException(I18nUtil._("服务类商品每单只可以购买一种商品")); throw new ApiException(I18nUtil._("服务类商品每单只可以购买一种商品"));
} }
@ -6325,13 +6332,28 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl<ShopOrderBaseMappe
//总金额 - 满减 //总金额 - 满减
BigDecimal order_money_select_items = Convert.toBigDecimal(store_item.get("order_money_select_items")); BigDecimal order_money_select_items = Convert.toBigDecimal(store_item.get("order_money_select_items"));
BigDecimal freight = Convert.toBigDecimal(store_item.get("freight")); BigDecimal freight = Convert.toBigDecimal(store_item.get("freight"));
// TODO 配送方式5-到店自提10-普通快递16-同城配送
Integer delivery_type_id = Convert.toInt(checkout_row.get("delivery_type_id")); //StateCode.DELIVERY_TYPE_SAME_CITY;
// 店铺统一设置的打包费
BigDecimal packingFee = BigDecimal.ZERO;
if (!isVirtualGoods && !is_virtual && delivery_type_id.equals(StateCode.DELIVERY_TYPE_SAME_CITY)) {
packingFee = shopStoreBaseService.getStorePackingFee(_store_id);
if (packingFee.compareTo(new BigDecimal("10")) > 0) {
packingFee = new BigDecimal("10");
}
}
BigDecimal voucher_price = Convert.toBigDecimal(order_voucher_row.get("voucher_price")); BigDecimal voucher_price = Convert.toBigDecimal(order_voucher_row.get("voucher_price"));
// 应付款金额计算 // 重要应付款金额计算
BigDecimal order_payment_amount = NumberUtil.sub(NumberUtil.add(order_money_select_items, freight), voucher_price); BigDecimal order_payment_amount = NumberUtil.sub(NumberUtil.add(order_money_select_items, freight, packingFee), voucher_price);
order_payment_amount = NumberUtil.sub(order_payment_amount, dedu_price); order_payment_amount = NumberUtil.sub(order_payment_amount, dedu_price);
order_payment_amount = NumberUtil.max(order_payment_amount, BigDecimal.valueOf(0)); order_payment_amount = NumberUtil.max(order_payment_amount, BigDecimal.valueOf(0));
base_row.put("order_product_amount", Convert.toBigDecimal(store_item.get("productMoneyOriginGoods"))); base_row.put("order_product_amount", Convert.toBigDecimal(store_item.get("productMoneyOriginGoods")));
// 重要应付款金额计算
base_row.put("order_payment_amount", order_payment_amount); base_row.put("order_payment_amount", order_payment_amount);
// 增加汇率 // 增加汇率
@ -6356,7 +6378,7 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl<ShopOrderBaseMappe
cart_type_id = 2; cart_type_id = 2;
} }
// 应付金额/应支付金额:order_goods_amount - order_discount_amount + order_shipping_fee - order_voucher_price - order_points_fee - order_adjust_fee // 应付金额/应支付金额:order_goods_amount - order_discount_amount + order_shipping_fee + packing_fee - order_voucher_price - order_points_fee - order_adjust_fee
// 手工调整默认为0order_points_fee积分折扣暂未开启 // 手工调整默认为0order_points_fee积分折扣暂未开启
Integer store_id = Convert.toInt(store_item.get("store_id")); Integer store_id = Convert.toInt(store_item.get("store_id"));
String store_name = Convert.toStr(store_item.get("store_name")); String store_name = Convert.toStr(store_item.get("store_name"));
@ -6368,14 +6390,14 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl<ShopOrderBaseMappe
base_row.put("buyer_user_id", buyer_user_id); base_row.put("buyer_user_id", buyer_user_id);
base_row.put("buyer_user_name", buyer_user_name); base_row.put("buyer_user_name", buyer_user_name);
// 订单基础信息保存
ShopOrderBase baseRow = Convert.convert(ShopOrderBase.class, base_row); ShopOrderBase baseRow = Convert.convert(ShopOrderBase.class, base_row);
// 订单基础信息保存
boolean flag = saveOrUpdate(baseRow); boolean flag = saveOrUpdate(baseRow);
Integer chain_store_id = chain_row.getStore_id(); Integer chain_store_id = chain_row.getStore_id();
Integer base_store_id = (Integer) base_row.get("store_id"); Integer base_store_id = (Integer) base_row.get("store_id");
// TODO 配送方式5-到店自提10-普通快递16-同城配送
Integer delivery_type_id = (Integer) checkout_row.get("delivery_type_id"); //StateCode.DELIVERY_TYPE_SAME_CITY;
// 订单信息保存处理 // 订单信息保存处理
if (flag) { if (flag) {
@ -6406,7 +6428,6 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl<ShopOrderBaseMappe
} }
} }
info_row.setOrder_id(order_id); info_row.setOrder_id(order_id);
info_row.setOrder_title(product_item_name); // 订单标题 info_row.setOrder_title(product_item_name); // 订单标题
if (fixOrderVo != null && fixOrderVo.isFix_price() && StrUtil.isNotEmpty(fixOrderVo.getOrder_title())) { if (fixOrderVo != null && fixOrderVo.isFix_price() && StrUtil.isNotEmpty(fixOrderVo.getOrder_title())) {
@ -6598,9 +6619,7 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl<ShopOrderBaseMappe
//均分组合套餐 其余活动可视情况使用此处 //均分组合套餐 其余活动可视情况使用此处
BigDecimal deduct_discount = BigDecimal.ZERO; BigDecimal deduct_discount = BigDecimal.ZERO;
BigDecimal reduction_discount = BigDecimal.ZERO; BigDecimal reduction_discount = BigDecimal.ZERO;
BigDecimal reduction_again_discount = BigDecimal.ZERO; BigDecimal reduction_again_discount = BigDecimal.ZERO;
BigDecimal multple_discount = BigDecimal.ZERO; BigDecimal multple_discount = BigDecimal.ZERO;
@ -6733,7 +6752,6 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl<ShopOrderBaseMappe
BigDecimal item_purchase_rate = Convert.toBigDecimal(_item.get("item_purchase_rate")); BigDecimal item_purchase_rate = Convert.toBigDecimal(_item.get("item_purchase_rate"));
BigDecimal item_sales_rate = Convert.toBigDecimal(_item.get("item_sales_rate")); BigDecimal item_sales_rate = Convert.toBigDecimal(_item.get("item_sales_rate"));
item_row.setOrder_id(order_id); item_row.setOrder_id(order_id);
item_row.setBuyer_id((Integer) base_row.get("buyer_user_id")); // 买家user_id 冗余 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.setStore_id((Integer) base_row.get("store_id")); // 店铺ID
@ -6867,6 +6885,7 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl<ShopOrderBaseMappe
item_row.setActivity_type_id(StateCode.ACTIVITY_TYPE_MULTIPLE_FOLD); // 活动类型:0-默认;1101-加价购=搭配宝;1102-店铺满赠-小礼品;1103-限时折扣;1104-优惠套装;1105-店铺优惠券coupon优惠券;1106-拼团;1107-满减送;1108-阶梯价 item_row.setActivity_type_id(StateCode.ACTIVITY_TYPE_MULTIPLE_FOLD); // 活动类型:0-默认;1101-加价购=搭配宝;1102-店铺满赠-小礼品;1103-限时折扣;1104-优惠套装;1105-店铺优惠券coupon优惠券;1106-拼团;1107-满减送;1108-阶梯价
item_row.setActivity_id(actId); // 促销活动ID:与activity_type_id搭配使用, 团购ID/限时折扣ID/优惠套装ID item_row.setActivity_id(actId); // 促销活动ID:与activity_type_id搭配使用, 团购ID/限时折扣ID/优惠套装ID
item_row.setOrder_item_discount_amount(NumberUtil.add(item_row.getOrder_item_discount_amount(), reduceMoney)); // 优惠金额 负数 item_row.setOrder_item_discount_amount(NumberUtil.add(item_row.getOrder_item_discount_amount(), reduceMoney)); // 优惠金额 负数
} else if (CollUtil.isNotEmpty(pulse_groupbooking) && gb_id != null) { } else if (CollUtil.isNotEmpty(pulse_groupbooking) && gb_id != null) {
// 商品可以拼团需要额外判断用户是否拼团购买 // 商品可以拼团需要额外判断用户是否拼团购买
Integer activity_id = Convert.toInt(pulse_groupbooking.get("activity_id")); Integer activity_id = Convert.toInt(pulse_groupbooking.get("activity_id"));
@ -7335,7 +7354,7 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl<ShopOrderBaseMappe
} }
} }
} else { } else {
throw new ApiException(String.format(I18nUtil._("商品 %s 已经下架,不可下单"), item.get("product_item_name"))); throw new ApiException(String.format(I18nUtil._("商品[%s]已下架,不可下单"), item.get("product_item_name")));
} }
} }
@ -7508,20 +7527,25 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl<ShopOrderBaseMappe
data_row.setOrder_heka(order_heka); data_row.setOrder_heka(order_heka);
data_row.setInvoice_company_code(StrUtil.isNotBlank(invoice_company_code) ? invoice_company_code : ""); // 发票信息 data_row.setInvoice_company_code(StrUtil.isNotBlank(invoice_company_code) ? invoice_company_code : ""); // 发票信息
data_row.setOrder_message((String) order_message.get(StrUtil.toString(base_row.get("store_id")))); // 买家订单留言 data_row.setOrder_message((String) order_message.get(StrUtil.toString(base_row.get("store_id")))); // 买家订单留言
data_row.setOrder_item_amount(_order_money_select_items); // 商品总价格/商品金额, 不包含运费
data_row.setOrder_item_amount(_order_money_select_items); // 商品总价格/商品金额, 不包含运费不含打包费
data_row.setOrder_adjust_fee(BigDecimal.valueOf(0)); // 手工调整费用店铺优惠 data_row.setOrder_adjust_fee(BigDecimal.valueOf(0)); // 手工调整费用店铺优惠
data_row.setOrder_points_fee(2 == cart_type_id ? points_amount : BigDecimal.valueOf(0)); // 积分费用, 只考虑每次兑换一个此处直接复用item变量反正只有一个 data_row.setOrder_points_fee(2 == cart_type_id ? points_amount : BigDecimal.valueOf(0)); // 积分费用, 只考虑每次兑换一个此处直接复用item变量反正只有一个
// 积分抵扣费用 是否采用负数 // 积分抵扣费用 是否采用负数
data_row.setOrder_discount_amount(order_discount_amount); // 折扣价格/优惠总金额 data_row.setOrder_discount_amount(order_discount_amount); // 折扣价格/优惠总金额
data_row.setOrder_shipping_fee_amount(_freight); // 运费价格/运费金额 data_row.setOrder_shipping_fee_amount(_freight); // 运费价格/运费金额
data_row.setOrder_shipping_fee(_freight); // 实际运费金额-卖家可修改 data_row.setOrder_shipping_fee(_freight); // 实际运费金额-卖家可修改
// 店铺统一设置的打包费
data_row.setPacking_fee(packingFee);
// base_row 中获取应付款 order_payment_amount计算平台和代理商的总计分账金额 // base_row 中获取应付款 order_payment_amount计算平台和代理商的总计分账金额
BigDecimal split_amount_from = order_payment_amount.subtract(_freight); BigDecimal split_amount_from = NumberUtil.sub(order_payment_amount, _freight, packingFee);
BigDecimal platform_fee = calculatePlatformAndAgentShareAmount(Convert.toInt(base_row.get("store_id")), split_amount_from); BigDecimal platform_fee = calculatePlatformAndAgentShareAmount(Convert.toInt(base_row.get("store_id")), split_amount_from);
data_row.setTotal_separate_value(platform_fee); // 从拉卡拉分账给平台和代理商的总计分账金额 data_row.setTotal_separate_value(platform_fee); // 从拉卡拉分账给平台和代理商的总计分账金额
data_row.setPlatform_fee(platform_fee); data_row.setPlatform_fee(platform_fee);
Integer voucher_id = (Integer) order_voucher_row.get("voucher_id"); Integer voucher_id = (Integer) order_voucher_row.get("voucher_id");
String voucher_code = (String) order_voucher_row.get("voucher_code"); String voucher_code = (String) order_voucher_row.get("voucher_code");
BigDecimal _voucher_price = Convert.toBigDecimal(order_voucher_row.get("voucher_price")); BigDecimal _voucher_price = Convert.toBigDecimal(order_voucher_row.get("voucher_price"));

View File

@ -294,9 +294,11 @@ public interface ShopProductBaseService extends IBaseService<ShopProductBase> {
/** /**
* 加载商品 * 加载商品
*
* @param store_id * @param store_id
* @return * @return
*/ */
Map<String,Long> getProductBasicIdByStore(Integer store_id,List<String> productNumberList); Map<String, Long> getProductBasicIdByStore(Integer store_id, List<String> productNumberList);
} }

View File

@ -4647,7 +4647,6 @@ public class ShopProductBaseServiceImpl extends BaseServiceImpl<ShopProductBaseM
@Override @Override
public boolean isVirtual(Integer kind_id) { public boolean isVirtual(Integer kind_id) {
List<Integer> kindIds = Arrays.asList(StateCode.PRODUCT_KIND_ENTITY, StateCode.PRODUCT_KIND_O2O); List<Integer> kindIds = Arrays.asList(StateCode.PRODUCT_KIND_ENTITY, StateCode.PRODUCT_KIND_O2O);
return !kindIds.contains(kind_id); return !kindIds.contains(kind_id);
} }

View File

@ -211,4 +211,12 @@ public interface ShopStoreBaseService extends IBaseService<ShopStoreBase> {
String appendStoreIdToAccount(Integer userId, Integer storeId); String appendStoreIdToAccount(Integer userId, Integer storeId);
/**
* 获取店铺统一设定的打包费
*
* @param storeId
* @return
*/
BigDecimal getStorePackingFee(Integer storeId);
} }

View File

@ -2308,7 +2308,6 @@ public class ShopStoreBaseServiceImpl extends BaseServiceImpl<ShopStoreBaseMappe
info.setStore_address(store_address); info.setStore_address(store_address);
} }
String store_opening_hours = getParameter("store_opening_hours"); String store_opening_hours = getParameter("store_opening_hours");
if (StrUtil.isNotBlank(store_opening_hours)) { if (StrUtil.isNotBlank(store_opening_hours)) {
info.setStore_opening_hours(store_opening_hours); info.setStore_opening_hours(store_opening_hours);
@ -2339,6 +2338,16 @@ public class ShopStoreBaseServiceImpl extends BaseServiceImpl<ShopStoreBaseMappe
base.setStore_biz_state(storeBizState); base.setStore_biz_state(storeBizState);
} }
// 打包费
BigDecimal packingFee = Convert.toBigDecimal(getParameter("packing_fee"));
if (packingFee != null && packingFee.compareTo(BigDecimal.ZERO) > 0) {
if (packingFee.compareTo(new BigDecimal("10")) > 0) {
return CommonResult.failed("打包费请控制在0到10元范围");
}
base.setPacking_fee(packingFee);
}
// 百度坐标系BD09经纬度 转出 火星坐标系GCJ02经纬度 因为数据库保存的经纬度统一是GCJ02经纬度所以需要转换 // 百度坐标系BD09经纬度 转出 火星坐标系GCJ02经纬度 因为数据库保存的经纬度统一是GCJ02经纬度所以需要转换
base = bd09ToGcj02Gps(base); base = bd09ToGcj02Gps(base);
@ -2490,6 +2499,15 @@ public class ShopStoreBaseServiceImpl extends BaseServiceImpl<ShopStoreBaseMappe
} }
} }
// 打包费联系人联系人手机
BigDecimal packingFee = Convert.toBigDecimal(getParameter("packing_fee"));
if (packingFee != null && packingFee.compareTo(BigDecimal.ZERO) > 0) {
if (packingFee.compareTo(new BigDecimal("10")) > 0) {
return CommonResult.failed("打包费请控制在0到10元范围");
}
base.setPacking_fee(packingFee);
}
// 百度坐标系BD09经纬度 转出 火星坐标系GCJ02经纬度 因为数据库保存的经纬度统一是GCJ02经纬度所以需要转换 // 百度坐标系BD09经纬度 转出 火星坐标系GCJ02经纬度 因为数据库保存的经纬度统一是GCJ02经纬度所以需要转换
base = bd09ToGcj02Gps(base); base = bd09ToGcj02Gps(base);
@ -3091,6 +3109,7 @@ public class ShopStoreBaseServiceImpl extends BaseServiceImpl<ShopStoreBaseMappe
shopStoreBase.setStore_name(shopMchEntry.getStore_name()); shopStoreBase.setStore_name(shopMchEntry.getStore_name());
shopStoreBase.setStore_category_id(shopMchEntry.getBiz_category()); // 重要店铺分类id对应 shop_base_store_category 表的分类 shopStoreBase.setStore_category_id(shopMchEntry.getBiz_category()); // 重要店铺分类id对应 shop_base_store_category 表的分类
shopStoreBase.setSplit_ratio(shopMchEntry.getSplit_ratio()); // 分账比例 shopStoreBase.setSplit_ratio(shopMchEntry.getSplit_ratio()); // 分账比例
shopStoreBase.setPacking_fee(BigDecimal.ZERO);// 默认0元打包费
String storeFacadeImage = shopMchEntry.getFront_facade_image(); String storeFacadeImage = shopMchEntry.getFront_facade_image();
String storeLogoImage = shopMchEntry.getStore_logo(); String storeLogoImage = shopMchEntry.getStore_logo();
if (StrUtil.isBlank(storeLogoImage)) { if (StrUtil.isBlank(storeLogoImage)) {
@ -3136,10 +3155,15 @@ public class ShopStoreBaseServiceImpl extends BaseServiceImpl<ShopStoreBaseMappe
shopStoreInfo.setStore_opening_hours("08:00"); shopStoreInfo.setStore_opening_hours("08:00");
shopStoreInfo.setStore_close_hours("22:00"); shopStoreInfo.setStore_close_hours("22:00");
shopStoreInfo.setStore_discount(BigDecimal.valueOf(10));// 原价 shopStoreInfo.setStore_discount(BigDecimal.valueOf(10));// 原价
shopStoreInfo.setStore_tel(shopMchEntry.getLogin_mobile());
shopStoreInfo.setStore_banner(storeFacadeImage); shopStoreInfo.setStore_banner(storeFacadeImage);
String websiteXFTC = "https://www.gpsxcs.cn"; // 联系人手机号码
String contact_mobile = StrUtil.isBlank(shopMchEntry.getLegal_person_mobile()) ? shopMchEntry.getLogin_mobile() : shopMchEntry.getLegal_person_mobile();
shopStoreInfo.setStore_tel(contact_mobile);
shopStoreInfo.setContact_mobile(contact_mobile);
shopStoreInfo.setContact_name(shopMchEntry.getContact_name());
String websiteXFTC = "https://www.gpxscs.cn";
JSONArray list = new JSONArray(); JSONArray list = new JSONArray();
if (StrUtil.isNotBlank(storeFacadeImage)) { if (StrUtil.isNotBlank(storeFacadeImage)) {
JSONObject slide = new JSONObject(); JSONObject slide = new JSONObject();
@ -3856,5 +3880,28 @@ public class ShopStoreBaseServiceImpl extends BaseServiceImpl<ShopStoreBaseMappe
} }
} }
/**
* 获取店铺统一设定的打包费
*
* @param storeId
* @return
*/
@Override
public BigDecimal getStorePackingFee(Integer storeId) {
if (storeId == null || storeId <= 0) {
return BigDecimal.ZERO;
}
QueryWrapper<ShopStoreBase> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("store_id", storeId).select("packing_fee");
ShopStoreBase shopStoreBase = shopStoreBaseService.findOne(queryWrapper);
if (shopStoreBase != null) {
return shopStoreBase.getPacking_fee();
}
return BigDecimal.ZERO;
}
} }

View File

@ -570,6 +570,7 @@
<result property="order_product_amount" column="order_product_amount"/> <result property="order_product_amount" column="order_product_amount"/>
<result property="order_payment_amount" column="order_payment_amount"/> <result property="order_payment_amount" column="order_payment_amount"/>
<result property="order_shipping_fee" column="order_shipping_fee"/> <result property="order_shipping_fee" column="order_shipping_fee"/>
<result property="packing_fee" column="packing_fee"/>
<!--总计优惠金额 order_discount_amount + order_voucher_price + order_points_fee + order_adjust_fee--> <!--总计优惠金额 order_discount_amount + order_voucher_price + order_points_fee + order_adjust_fee-->
<result property="total_discount_amount" column="total_discount_amount"/> <result property="total_discount_amount" column="total_discount_amount"/>
<result property="order_income_amount" column="order_income_amount"/> <result property="order_income_amount" column="order_income_amount"/>
@ -579,7 +580,6 @@
<result property="currency_id" column="currency_id"/> <result property="currency_id" column="currency_id"/>
<result property="order_state_id" column="order_state_id"/> <result property="order_state_id" column="order_state_id"/>
<result property="delivery_type_id" column="delivery_type_id"/> <result property="delivery_type_id" column="delivery_type_id"/>
<result property="order_shipping_fee" column="order_shipping_fee"/>
<result property="distance" column="distance"/> <result property="distance" column="distance"/>
<!-- 店铺嵌套对象映射 --> <!-- 店铺嵌套对象映射 -->
@ -625,7 +625,7 @@
<result property="h5_url" column="h5_url"/> <result property="h5_url" column="h5_url"/>
<result property="feed" column="feed"/> <result property="feed" column="feed"/>
</association> </association>
<!-- 订单商品集合映射--> <!-- 订单商品集合映射-->
<collection property="order_items" ofType="com.suisung.mall.common.modules.order.dto.MchOrderItemDTO"> <collection property="order_items" ofType="com.suisung.mall.common.modules.order.dto.MchOrderItemDTO">
<result property="product_id" column="product_id"/> <result property="product_id" column="product_id"/>
@ -782,6 +782,7 @@
(ob.order_product_amount-od.order_discount_amount-od.voucher_price-od.order_points_fee-od.order_adjust_fee-od.platform_fee-od.order_shipping_fee) (ob.order_product_amount-od.order_discount_amount-od.voucher_price-od.order_points_fee-od.order_adjust_fee-od.platform_fee-od.order_shipping_fee)
as order_income_amount, as order_income_amount,
od.platform_fee, od.platform_fee,
od.packing_fee,
od.order_message, od.order_message,
sb.store_id, sb.store_id,
sb.store_name, sb.store_name,

View File

@ -7,7 +7,7 @@
, order_desc, order_delay_time, delivery_type_id, delivery_time_id, delivery_time, delivery_time_rang, , order_desc, order_delay_time, delivery_type_id, delivery_time_id, delivery_time, delivery_time_rang,
delivery_time_h, delivery_time_i, delivery_istimer, invoice_type_id, invoice_company_code, order_invoice_title, delivery_time_h, delivery_time_i, delivery_istimer, invoice_type_id, invoice_company_code, order_invoice_title,
order_message, order_item_amount, order_discount_amount, order_adjust_fee, order_points_fee, order_message, order_item_amount, order_discount_amount, order_adjust_fee, order_points_fee,
order_shipping_fee_amount, order_shipping_fee, platform_fee, voucher_id, voucher_number, voucher_price, redpacket_id, order_shipping_fee_amount, order_shipping_fee, platform_fee, packing_fee, voucher_id, voucher_number, voucher_price, redpacket_id,
redpacket_number, redpacket_price, order_redpacket_price, order_resource_ext1, order_resource_ext2, redpacket_number, redpacket_price, order_redpacket_price, order_resource_ext1, order_resource_ext2,
order_resource_ext3, trade_payment_money, trade_payment_recharge_card, trade_payment_credit, order_resource_ext3, trade_payment_money, trade_payment_recharge_card, trade_payment_credit,
order_refund_status, order_refund_amount, order_refund_agree_amount, order_return_status, order_return_num, order_refund_status, order_refund_amount, order_refund_agree_amount, order_return_status, order_return_num,

View File

@ -8,7 +8,7 @@
store_address, store_latitude, store_longitude, store_is_selfsupport, store_type, store_is_open, store_biz_state, shop_parent_id, store_address, store_latitude, store_longitude, store_is_selfsupport, store_type, store_is_open, store_biz_state, shop_parent_id,
store_category_id, store_state_id, store_time, store_end_time, product_category_ids, store_o2o_tags, store_category_id, store_state_id, store_time, store_end_time, product_category_ids, store_o2o_tags,
store_o2o_flag, store_o2o_merchant_id, store_circle, subsite_id, lkl_merchant_no, lkl_term_no, wx_qrcode, store_o2o_flag, store_o2o_merchant_id, store_circle, subsite_id, lkl_merchant_no, lkl_term_no, wx_qrcode,
split_ratio split_ratio, packing_fee, created_at, updated_at
</sql> </sql>
<select id="statisticState" resultType="java.util.Map"> <select id="statisticState" resultType="java.util.Map">

View File

@ -548,7 +548,7 @@
<!--定义基础镜像--> <!--定义基础镜像-->
<!-- <baseImage>java:8</baseImage>--> <!-- <baseImage>java:8</baseImage>-->
<!-- <baseImage>openjdk:8-jre</baseImage>--> <!-- <baseImage>openjdk:8-jre</baseImage>-->
<baseImage>openjdk:8-jre</baseImage> <baseImage>openjdk:8-jre-alpine</baseImage>
<!--定义容器启动命令,注意不能换行--> <!--定义容器启动命令,注意不能换行-->
<entryPoint>["java", "-jar", "-Xms128m", "-Xmx512m", "-XX:MetaspaceSize=128m", "-XX:MaxMetaspaceSize=256m", "-XX:+UseContainerSupport", "-XX:MaxRAMPercentage=60.0", "-XX:+UseSerialGC", "-XX:MinHeapFreeRatio=40", "-XX:MaxHeapFreeRatio=60", "-Dspring.profiles.active=${spring.profile}", "-Duser.timezone=Asia/Shanghai", "/${project.build.finalName}.jar"] <entryPoint>["java", "-jar", "-Xms128m", "-Xmx512m", "-XX:MetaspaceSize=128m", "-XX:MaxMetaspaceSize=256m", "-XX:+UseContainerSupport", "-XX:MaxRAMPercentage=60.0", "-XX:+UseSerialGC", "-XX:MinHeapFreeRatio=40", "-XX:MaxHeapFreeRatio=60", "-Dspring.profiles.active=${spring.profile}", "-Duser.timezone=Asia/Shanghai", "/${project.build.finalName}.jar"]
</entryPoint> </entryPoint>