退款打印方法调试

This commit is contained in:
Jack 2025-11-29 02:27:02 +08:00
parent a73615f350
commit 1d328b38f7
8 changed files with 202 additions and 26 deletions

View File

@ -29,6 +29,9 @@ public class OrderPrintVO implements Serializable {
@ApiModelProperty(value = "退单编号")
private String return_id;
@ApiModelProperty(value = "店铺Id")
private Integer store_id;
@ApiModelProperty(value = "店铺名称")
private String store_name;
@ -132,7 +135,7 @@ public class OrderPrintVO implements Serializable {
private String cashier = "收银员";
@ApiModelProperty(value = "订单商品详情打印对象列表")
private List<OrderItemPrintVO> orderItemPrintVOList;
private List<OrderItemPrintVO> order_items;
}

View File

@ -39,7 +39,7 @@ public class FreeMakerUtils {
* @throws IOException
* @throws TemplateException
*/
public static String processTemplate(Configuration configuration, String templateName, String templateValue, Map<String, Object> binding) {
public static String processTemplate(Configuration configuration, String templateName, String templateValue, Object binding) {
StringWriter stringWriter = new StringWriter();
try {
Template template = new Template(templateName, templateValue, configuration);
@ -63,4 +63,8 @@ public class FreeMakerUtils {
public static String processTemplate(String templateName, String templateValue, Map<String, Object> binding) {
return processTemplate(stringTempConfiguration(), templateName, templateValue, binding);
}
public static String processTemplate(String templateName, String templateValue, Object binding) {
return processTemplate(stringTempConfiguration(), templateName, templateValue, binding);
}
}

View File

@ -20,6 +20,7 @@ import com.suisung.mall.shop.message.service.PushMessageService;
import com.suisung.mall.shop.order.service.ShopOrderBaseService;
import com.suisung.mall.shop.order.service.ShopOrderReturnService;
import com.suisung.mall.shop.sfexpress.service.SFExpressApiService;
import com.suisung.mall.shop.store.service.ShopStorePrinterService;
import com.suisung.mall.shop.store.service.ShopStoreSameCityTransportBaseService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@ -77,7 +78,7 @@ public class LakalaController extends BaseControllerImpl {
@Lazy
@Resource
private LakalaApiService lakalaApiService;
private ShopStorePrinterService shopStorePrinterService;
@Resource
private LklLedgerEcService lklLedgerEcService;
@ -93,7 +94,7 @@ public class LakalaController extends BaseControllerImpl {
// return lakalaApiService.tradeQuery(paramsJSON.getInt("storeId"), paramsJSON.getStr("orderId"));
return JSONUtil.parseObj(shopOrderReturnService.fetchReturnOrderPrintInfo("", "FX_20251127_9"));
return shopStorePrinterService.printShopStoreReturnOrder(paramsJSON.getStr("orderId"), paramsJSON.getStr("returnId"));
}
@ApiOperation(value = "批量发送推送消息 - 测试案例", notes = "批量发送推送消息 - 测试案例")

View File

@ -80,6 +80,15 @@ public interface ShopStorePrinterService extends IBaseService<ShopStorePrinter>
*/
Boolean printShopStoreOrder(Integer storeId, String orderId);
/**
* 退货成功后立即打印门店的退货信息
*
* @param orderId
* @param returnId
* @return
*/
Boolean printShopStoreReturnOrder(String orderId, String returnId);
/**
* 获取店铺所有有效打印机
*

View File

@ -5,11 +5,9 @@ import cn.hutool.core.util.StrUtil;
import com.suisung.mall.common.modules.store.ShopStorePrinterLog;
import com.suisung.mall.core.web.service.impl.BaseServiceImpl;
import com.suisung.mall.shop.store.mapper.ShopStorePrinterLogMapper;
import com.suisung.mall.shop.store.mapper.ShopStorePrinterMapper;
import com.suisung.mall.shop.store.service.ShopStorePrinterLogService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@ -19,41 +17,70 @@ import java.util.List;
public class ShopStorePrinterLogServiceImpl extends BaseServiceImpl<ShopStorePrinterLogMapper, ShopStorePrinterLog> implements ShopStorePrinterLogService {
private static final Logger logger = LoggerFactory.getLogger(ShopStorePrinterLogServiceImpl.class);
@Autowired
private ShopStorePrinterMapper shopStorePrinterMapper;
@Override
public Boolean insertShopStorePrinterLog(ShopStorePrinterLog record) {
// 参数校验
if (record == null) {
logger.warn("插入打印日志失败:记录为空");
return false;
}
// 必要字段校验
if (record.getStore_id() == null ||
StrUtil.isBlank(record.getOrder_id()) ||
StrUtil.isBlank(record.getTemplate_value()) ||
StrUtil.isBlank(record.getPrint_content())) {
logger.warn("插入打印日志失败必要字段缺失storeId={}, orderId={}",
record.getStore_id(), record.getOrder_id());
return false;
}
try {
// 执行插入操作
return add(record);
} catch (Exception e) {
logger.error("插入打印日志时发生异常storeId={}, orderId={}",
record.getStore_id(), record.getOrder_id(), e);
return false;
}
}
@Override
public void insertShopStorePrinterLogBatch(List<ShopStorePrinterLog> records) {
// 参数校验
if (CollUtil.isEmpty(records)) {
logger.debug("批量插入打印日志失败:记录列表为空");
return;
}
try {
for (ShopStorePrinterLog record : records) {
// 单条记录校验
if (record == null) {
logger.warn("批量插入打印日志跳过:记录为空");
continue;
}
if (record.getStore_id() == null ||
StrUtil.isBlank(record.getOrder_id()) ||
StrUtil.isBlank(record.getTemplate_value()) ||
StrUtil.isBlank(record.getPrint_content())) {
logger.warn("批量插入打印日志跳过必要字段缺失storeId={}, orderId={}",
record.getStore_id(), record.getOrder_id());
continue;
}
// 执行插入操作
add(record);
}
logger.debug("批量插入打印日志完成,共处理 {} 条记录", records.size());
} catch (Exception e) {
logger.error("批量插入打印日志时发生异常,记录数: {}", records.size(), e);
}
}
}

View File

@ -14,13 +14,15 @@ import com.suisung.mall.common.domain.UserDto;
import com.suisung.mall.common.modules.store.ShopStorePrinter;
import com.suisung.mall.common.modules.store.ShopStorePrinterLog;
import com.suisung.mall.common.modules.store.ShopStorePrinterTemplate;
import com.suisung.mall.common.pojo.vo.OrderItemPrintVO;
import com.suisung.mall.common.pojo.vo.OrderPrintVO;
import com.suisung.mall.common.pojo.vo.ShopStorePrinterVO;
import com.suisung.mall.common.utils.CheckUtil;
import com.suisung.mall.common.utils.FreeMakerUtils;
import com.suisung.mall.common.utils.JsonUtil;
import com.suisung.mall.core.web.service.impl.BaseServiceImpl;
import com.suisung.mall.shop.order.service.ShopOrderBaseService;
import com.suisung.mall.shop.order.service.impl.ShopOrderInfoServiceImpl;
import com.suisung.mall.shop.order.service.ShopOrderReturnService;
import com.suisung.mall.shop.store.mapper.ShopStorePrinterMapper;
import com.suisung.mall.shop.store.service.ShopStorePrinterLogService;
import com.suisung.mall.shop.store.service.ShopStorePrinterService;
@ -49,15 +51,13 @@ public class ShopStorePrinterServiceImpl extends BaseServiceImpl<ShopStorePrinte
@Autowired
private FeieUtil feieUtil;
@Autowired
private FreeMakerUtils freeMakerUtils;
@Autowired
private ShopStorePrinterTemplateService shopStorePrinterTemplateService;
@Autowired
private ShopOrderBaseService shopOrderBaseService;
@Autowired
private ShopStorePrinterLogService shopStorePrinterLogService;
@Autowired
private ShopOrderInfoServiceImpl shopOrderInfoServiceImpl;
private ShopOrderReturnService shopOrderReturnService;
@Override
public CommonResult shopStorePrinterPageList(String keyword, Integer pageNum, Integer pageSize) {
@ -406,6 +406,137 @@ public class ShopStorePrinterServiceImpl extends BaseServiceImpl<ShopStorePrinte
return true;
}
/**
* 打印店铺退货订单的小票信息
* <p>
* 该方法通过调用飞鹅打票机接口完成指定订单的退货小票打印功能主要流程包括
* 1. 校验订单号是否合法
* 2. 获取订单及店铺相关信息
* 3. 查询对应店铺绑定的打印机列表与打印模板
* 4. 渲染打印内容并发送至所有绑定的打印机
* 5. 记录打印日志
* </p>
*
* @param orderId 订单编号不能为空
* @param returnId 退货单编号用于标识具体的退货记录
* @return 打印操作是否成功成功返回 true否则返回 false
*/
@Override
public Boolean printShopStoreReturnOrder(String orderId, String returnId) {
logger.debug("#### 调用飞鹅打票机的打印退款订单操作开始 ####");
// 参数校验
if (StrUtil.isBlank(returnId)) {
logger.error("退款订单为空,无法打印小票。");
return false;
}
try {
// 获取打印的订单信息并检查订单是否存在且已支付
OrderPrintVO binding = shopOrderReturnService.fetchReturnOrderPrintInfo(orderId, returnId);
if (binding == null) {
logger.error("退款订单Id{}信息无法获取,无法打印小票。", returnId);
return false;
}
logger.debug("退款订单信息:{}", binding);
orderId = binding.getOrder_id();
Integer storeId = binding.getStore_id();
if (CheckUtil.isEmpty(storeId) || CheckUtil.isEmpty(orderId)) {
logger.warn("订单Id:{}店铺ID:{}为空,无法打印小票。", orderId, storeId);
return false;
}
// 查询店铺配置的打印机列表
List<ShopStorePrinter> printerList = selectPrinterList(storeId);
if (CollUtil.isEmpty(printerList)) {
// 店铺没有打印机不再继续执行打印逻辑
logger.error("店铺{}未添加打票机,无法打印小票。", storeId);
return false;
}
// 获取适用于退货场景的打印模板
ShopStorePrinterTemplate template = shopStorePrinterTemplateService.getShopStorePrinterTemplateInner(storeId, StateCode.PRINTER_TEMP_CATE_REFUND);
if (template == null || StrUtil.isBlank(template.getTemplate_name()) || StrUtil.isBlank(template.getTemplate_value())) {
// 模板缺失或无效终止打印流程
logger.error("店铺{}未添加打票机打印模版,无法打印小票。", storeId);
return false;
}
// 重要重构实体类处理标题数量价格适应长度
List<OrderItemPrintVO> orderItems = binding.getOrder_items();
if (CollUtil.isEmpty(orderItems)) {
logger.error("订单{}商品信息为空,无法打印小票。", orderId);
return false;
}
List<OrderItemPrintVO> rebuiltItems = new ArrayList<>(orderItems.size());
for (OrderItemPrintVO item : orderItems) {
if (item != null) {
rebuiltItems.add(item.rebuild());
}
}
binding.setOrder_items(rebuiltItems);
// 使用 FreeMarker 模板引擎渲染实际要打印的内容
String printContent = FreeMakerUtils.processTemplate(template.getTemplate_name(), template.getTemplate_value(), binding);
if (StrUtil.isBlank(printContent)) {
logger.error("订单{}信息模版渲染异常,无法打印小票。", orderId);
return false;
}
logger.debug("打印内容长度:{}", printContent.length());
// 提取所有打印机设备序列号准备批量打印
List<String> printerSnList = new ArrayList<>(printerList.size());
for (ShopStorePrinter printer : printerList) {
if (printer != null && StrUtil.isNotBlank(printer.getPrinter_sn())) {
printerSnList.add(printer.getPrinter_sn());
}
}
if (CollUtil.isEmpty(printerSnList)) {
logger.error("订单{}没有有效的打印机设备,无法打印小票。", orderId);
return false;
}
// 向飞鹅打票机发送打印任务
List<Pair<String, String>> respList = feieUtil.printContentByList(printerSnList, printContent);
if (CollUtil.isEmpty(respList)) {
// 所有打印机均未能响应视为失败
logger.error("订单{}信息打印,调用飞鹅打印机打印失败。", orderId);
return false;
}
// 遍历每台打印机的响应结果记录打印日志
for (Pair<String, String> respSn : respList) {
if (respSn != null) {
// 构造并保存本次打印的日志记录
ShopStorePrinterLog shopStorePrinterLog = new ShopStorePrinterLog(
template.getCategory(),
storeId,
orderId,
template.getTemplate_id(),
template.getTemplate_value(),
JsonUtil.object2json(binding),
printContent,
respSn.getSecond(),
respSn.getFirst()
);
shopStorePrinterLogService.insertShopStorePrinterLog(shopStorePrinterLog);
}
}
logger.debug("#### 调用飞鹅打票机的打印操作结束 ####");
return true;
} catch (Exception e) {
logger.error("打印退货订单小票时发生异常订单ID: {}, 退货单ID: {}", orderId, returnId, e);
return false;
}
}
@Override
public List<ShopStorePrinter> selectPrinterList(Integer storeId) {
if (storeId == null) {

View File

@ -92,6 +92,7 @@
<!--订单对象映射-->
<result property="order_id" column="order_id"/>
<result property="return_id" column="return_id"/>
<result property="store_id" column="store_id"/>
<result property="store_name" column="store_name"/>
<result property="store_tel" column="store_tel"/>
<result property="order_pickup_num_str" column="order_pickup_num_str"/>
@ -123,7 +124,7 @@
<result property="da_address" column="da_address"/>
<result property="cashier" column="cashier"/>
<!-- 集合类型映射 -->
<collection property="orderItemPrintVOList" ofType="com.suisung.mall.common.pojo.vo.OrderItemPrintVO">
<collection property="order_items" ofType="com.suisung.mall.common.pojo.vo.OrderItemPrintVO">
<result property="item_name" column="item_name"/>
<result property="order_item_quantity" column="order_item_quantity"/>
<result property="order_item_amount" column="order_item_amount"/>

View File

@ -47,16 +47,16 @@
--------------------------------<BR>
<CB>#${order_pickup_num_str}</CB><BR>
<L>退款原因:${return_buyer_message!'-'}</L><BR>
<BOLD>配送时间:${payment_time}之后20-30分钟</BOLD><BR>
<BOLD>配送时间:${payment_time?string('yyyy-MM-dd HH:mm:ss')}之后20-30分钟</BOLD><BR>
--------------------------------<BR>
订单编号:${order_id}<BR>
退单编号:${return_id}<BR>
订单来源:${order_channel_name!'微信小程序'}<BR>
支付方式:${payment_type_name!'微信支付'}<BR>
配送来源:${deliver_type_name!'顺丰同城'}<BR>
付款时间:${payment_time}<BR>
申请退款:${return_add_time}<BR>
确认退款:${return_finish_time}<BR>
付款时间:${payment_time?string('yyyy-MM-dd HH:mm:ss')}<BR>
申请退款:${return_add_time?string('yyyy-MM-dd HH:mm:ss')}<BR>
确认退款:${return_finish_time?string('yyyy-MM-dd HH:mm:ss')}<BR>
--------------------------------<BR>
<C>******* 退款商品 ******</C><BR>
--------------------------------<BR>
@ -78,4 +78,4 @@
<CB>${store_name}</CB><BR>--------------------------------<BR><CB>#${order_pickup_num_str}</CB><BR><L>买家备注:${order_message!'-'}</L><BR><BOLD>配送时间:${delivery_time}</BOLD><BR>--------------------------------<BR>订单编号:${order_id}<BR>订单来源:微信小程序<BR>支付方式:微信支付<BR>配送来源:顺丰同城<BR>付款时间:${payment_time}<BR>--------------------------------<BR><L>商品名称 数量 金额</L><BR>--------------------------------<BR><#list order_items as item><L>${item.s_name}</L><L><BOLD>${item.s_quantity}</BOLD></L><L>${item.s_amount}</L><BR><#if item.s_name_segs??><#list item.s_name_segs as seg><L>${seg}</L><BR></#list></#if><BOLD><#if item.product_sn?default("")?trim?length gt 1>${item.product_sn}</BOLD><BR></#if></#list>--------------------------------<BR>商品总件数:<BOLD>${order_items_count!0}</BOLD><BR>商品总额:<BOLD>¥${order_product_amount?string('0.00')}</BOLD><BR>押金:<BOLD>¥${(yajin!0)?string('0.00')}</BOLD><BR>运费:<BOLD>¥${order_shipping_fee?string('0.00')}</BOLD><BR>会员权益:<BOLD>-¥${(quanyi!0)?string('0.00')}</BOLD><BR>秒杀:<BOLD>-¥${(miaosha!0)?string('0.00')}</BOLD><BR>实付金额:<BOLD>¥${order_payment_amount?string('0.00')}</BOLD><BR><#if seller_message?default("")?trim?length gt 1>--------------------------------<BR><BOLD>商家备注:${seller_message!'---'}</BOLD><BR></#if>--------------------------------<BR><BOLD>收货人:${buyer_user_name!''}</BOLD><BR><BOLD>收货人手机:${store_tel!''}</BOLD><BR><BOLD>收货地址:${da_province!'-'}${da_city!'-'}${da_address!'-'}</BOLD><BR>--------------------------------<BR>门店:${store_name}<BR>门店电话:<BOLD>${store_tel!'-'}</BOLD><BR>收银员:${cashier!'-'}<BR>
带参模版:
<CB><B>用户退款订单<BR></B></CB><CB>${store_name}</CB><BR>--------------------------------<BR><CB>#${order_pickup_num_str}</CB><BR><L>退款原因:${return_buyer_message!'-'}</L><BR><BOLD>配送时间:${payment_time}之后20-30分钟</BOLD><BR>--------------------------------<BR>订单编号:${order_id}<BR>退单编号:${return_id}<BR>订单来源:${order_channel_name!'微信小程序'}<BR>支付方式:${payment_type_name!'微信支付'}<BR>配送来源:${deliver_type_name!'顺丰同城'}<BR>付款时间:${payment_time}<BR>申请退款:${return_add_time}<BR>确认退款:${return_finish_time}<BR>--------------------------------<BR><C>******* 退款商品 ******</C><BR>--------------------------------<BR><#list order_items as item><L>${item.s_name}</L><L><BOLD>${item.s_quantity}</BOLD></L><L>${item.s_amount}</L><BR><#if item.s_name_segs??><#list item.s_name_segs as seg><L>${seg}</L><BR></#list></#if><BOLD><#if item.product_sn?default("")?trim?length gt 1>${item.product_sn}</BOLD><BR></#if></#list>--------------------------------<BR>实付金额:<BOLD>¥${order_payment_amount?string('0.00')}元</BOLD><BR>配送费:<BOLD>¥${order_shipping_fee?string('0.00')}元</BOLD><BR>申请退款:<BOLD>¥${return_refund_amount?string('0.00')}</BOLD><BR>退款方式:<BOLD>${return_flag_str}</BOLD><BR>商家审批备注:<BOLD>${return_store_message!'-'}</BOLD><BR>--------------------------------<BR><BOLD>会员名称:${buyer_user_name}</BOLD><BR><BOLD>会员手机:${return_tel}</BOLD><BR>--------------------------------<BR>操作员:${cashier!'-'}<BR>
<CB><B>用户退款订单<BR></B></CB><CB>${store_name}</CB><BR>--------------------------------<BR><CB>#${order_pickup_num_str}</CB><BR><L>退款原因:${return_buyer_message!'-'}</L><BR><BOLD>配送时间:${payment_time?string('yyyy-MM-dd HH:mm:ss')}20-30分钟</BOLD><BR>--------------------------------<BR>订单编号:${order_id}<BR>退单编号:${return_id}<BR>订单来源:${order_channel_name!'微信小程序'}<BR>支付方式:${payment_type_name!'微信支付'}<BR>配送来源:${deliver_type_name!'顺丰同城'}<BR>付款时间:${payment_time?string('yyyy-MM-dd HH:mm:ss')}<BR>申请退款:${return_add_time?string('yyyy-MM-dd HH:mm:ss')}<BR>确认退款:${return_finish_time?string('yyyy-MM-dd HH:mm:ss')}<BR>--------------------------------<BR><C>******* 退款商品 ******</C><BR>--------------------------------<BR><#list order_items as item><L>${item.s_name}</L><L><BOLD>${item.s_quantity}</BOLD></L><L>${item.s_amount}</L><BR><#if item.s_name_segs??><#list item.s_name_segs as seg><L>${seg}</L><BR></#list></#if><BOLD><#if item.product_sn?default("")?trim?length gt 1>${item.product_sn}</BOLD><BR></#if></#list>--------------------------------<BR>实付金额:<BOLD>¥${order_payment_amount?string('0.00')}元</BOLD><BR>配送费:<BOLD>¥${order_shipping_fee?string('0.00')}元</BOLD><BR>申请退款:<BOLD>¥${return_refund_amount?string('0.00')}</BOLD><BR>退款方式:<BOLD>${return_flag_str}</BOLD><BR>商家审批备注:<BOLD>${return_store_message!'-'}</BOLD><BR>--------------------------------<BR><BOLD>会员名称:${buyer_user_name}</BOLD><BR><BOLD>会员手机:${return_tel}</BOLD><BR>--------------------------------<BR>操作员:${cashier!'-'}<BR>