2025-10-08 16:41:08.298 [reactor-http-nio-2] DEBUG reactor.netty.http.server.HttpServerOperations - [14b53664, L:/0:0:0:0:0:0:0:1:9002 - R:/0:0:0:0:0:0:0:1:56548] New http connection, requesting read
2025-10-08 16:41:08.298 [reactor-http-nio-3] DEBUG reactor.netty.http.server.HttpServerOperations - [5230cfa4, L:/0:0:0:0:0:0:0:1:9002 - R:/0:0:0:0:0:0:0:1:56549] New http connection, requesting read
2025-10-08 16:41:08.299 [reactor-http-nio-2] DEBUG reactor.netty.transport.TransportConfig - [14b53664, L:/0:0:0:0:0:0:0:1:9002 - R:/0:0:0:0:0:0:0:1:56548] Initialized pipeline DefaultChannelPipeline{(reactor.left.httpCodec = io.netty.handler.codec.http.HttpServerCodec), (reactor.left.httpTrafficHandler = reactor.netty.http.server.HttpTrafficHandler), (reactor.right.reactiveBridge = reactor.netty.channel.ChannelOperationsHandler)}
2025-10-08 16:41:08.299 [reactor-http-nio-3] DEBUG reactor.netty.transport.TransportConfig - [5230cfa4, L:/0:0:0:0:0:0:0:1:9002 - R:/0:0:0:0:0:0:0:1:56549] Initialized pipeline DefaultChannelPipeline{(reactor.left.httpCodec = io.netty.handler.codec.http.HttpServerCodec), (reactor.left.httpTrafficHandler = reactor.netty.http.server.HttpTrafficHandler), (reactor.right.reactiveBridge = reactor.netty.channel.ChannelOperationsHandler)}
2025-10-08 16:41:08.376 [reactor-http-nio-3] DEBUG reactor.netty.http.server.HttpServerOperations - [5230cfa4, L:/0:0:0:0:0:0:0:1:9002 - R:/0:0:0:0:0:0:0:1:56549] Increasing pending responses, now 1
2025-10-08 16:41:08.434 [reactor-http-nio-3] DEBUG reactor.netty.http.server.HttpServer - [5230cfa4-1, L:/0:0:0:0:0:0:0:1:9002 - R:/0:0:0:0:0:0:0:1:56549] Handler is being applied: org.springframework.http.server.reactive.ReactorHttpHandlerAdapter@7c08ed8
2025-10-08 16:41:08.536 [reactor-http-nio-3] DEBUG o.s.web.server.adapter.HttpWebHandlerAdapter - [5230cfa4-1] HTTP POST "/asn/pack/export"
2025-10-08 16:41:08.593 [reactor-http-nio-3] DEBUG o.s.w.r.r.m.a.RequestMappingHandlerMapping - [5230cfa4-1] Mapped to com.hvlink.controller.AsnPackController#exportLabels(AsnPackExportParam)
2025-10-08 16:41:08.625 [reactor-http-nio-3] DEBUG o.s.w.r.r.m.a.RequestBodyMethodArgumentResolver - [5230cfa4-1] Content-Type:application/json
2025-10-08 16:41:08.638 [reactor-http-nio-3] DEBUG o.s.w.r.r.m.a.RequestBodyMethodArgumentResolver - [5230cfa4-1] 0..1 [com.hvlink.entity.param.asn.AsnPackExportParam]
2025-10-08 16:41:08.713 [reactor-http-nio-3] DEBUG reactor.netty.channel.FluxReceive - [5230cfa4-1, L:/0:0:0:0:0:0:0:1:9002 - R:/0:0:0:0:0:0:0:1:56549] [terminated=false, cancelled=false, pending=0, error=null]: subscribing inbound receiver
2025-10-08 16:41:08.815 [reactor-http-nio-3] DEBUG o.s.http.codec.json.Jackson2JsonDecoder - [5230cfa4-1] Decoded [AsnPackExportParam(ids=[6, 7, 8], exportType=B)]
2025-10-08 16:41:08.905 [reactor-http-nio-3] DEBUG org.mybatis.spring.SqlSessionUtils - Creating a new SqlSession
2025-10-08 16:41:08.953 [reactor-http-nio-3] DEBUG org.mybatis.spring.SqlSessionUtils - SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@4e968606] was not registered for synchronization because synchronization is not active
2025-10-08 16:41:09.138 [reactor-http-nio-3] DEBUG o.springframework.jdbc.datasource.DataSourceUtils - Fetching JDBC Connection from DataSource
2025-10-08 16:41:09.138 [reactor-http-nio-3] DEBUG o.m.spring.transaction.SpringManagedTransaction - JDBC Connection [ConnectionID:1 ClientConnectionId: d38df3dc-2a93-45b1-9445-314ac1f77cd9] will not be managed by Spring
2025-10-08 16:41:09.158 [reactor-http-nio-3] DEBUG com.hvlink.mapper.asn.AsnPackMapper.selectByIds - ==> Preparing: SELECT l.id, l.asn_no as asnNo, l.factory_code as factoryCode, (SELECT TOP 1 factory_name FROM tm_factory WHERE factory_code = l.factory_code) as factoryName, l.warehouse_code as warehouseCode, (SELECT TOP 1 warehouse_name FROM tm_warehouse WHERE warehouse_code = l.warehouse_code) as warehouseName, ad.order_no as orderNo, l.part_code as partCode, l.part_desc as partDesc, l.production_batch as productionBatch, l.case_code as caseCode, l.pack_quantity as packQuantity, l.quantity as quantity, l.supplier_code as supplierCode, (SELECT TOP 1 supplier_name FROM tm_supplier WHERE supplier_code = l.supplier_code) as supplierName, l.unique_code as uniqueCode, l.remark as remark FROM tb_asn_pack l INNER JOIN tb_asn_detail ad ON l.asn_no = ad.asn_no AND l.part_code = ad.part_code AND l.factory_code = ad.factory_code AND l.warehouse_code = ad.warehouse_code AND ad.is_deleted = 0 WHERE l.is_deleted = 0 AND l.id IN ( ? , ? , ? )
2025-10-08 16:41:09.335 [reactor-http-nio-3] DEBUG com.hvlink.mapper.asn.AsnPackMapper.selectByIds - ==> Parameters: 6(Integer), 7(Integer), 8(Integer)
2025-10-08 16:41:09.512 [reactor-http-nio-3] DEBUG com.hvlink.mapper.asn.AsnPackMapper.selectByIds - <== Total: 3
2025-10-08 16:41:09.515 [reactor-http-nio-3] DEBUG org.mybatis.spring.SqlSessionUtils - Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@4e968606]
2025-10-08 16:41:10.098 [reactor-http-nio-3] ERROR com.hvlink.service.impl.AsnPackServiceImpl - 标签导出失败
java.io.IOException: C:/Windows/Fonts/sim sun.ttc not found as file or resource.
at com.itextpdf.text.io.RandomAccessSourceFactory.createByReadingToMemory(RandomAccessSourceFactory.java:262)
at com.itextpdf.text.io.RandomAccessSourceFactory.createBestSource(RandomAccessSourceFactory.java:172)
at com.itextpdf.text.pdf.RandomAccessFileOrArray.<init>(RandomAccessFileOrArray.java:150)
at com.itextpdf.text.pdf.TrueTypeFont.process(TrueTypeFont.java:799)
at com.itextpdf.text.pdf.TrueTypeFontUnicode.process(TrueTypeFontUnicode.java:121)
at com.itextpdf.text.pdf.TrueTypeFontUnicode.<init>(TrueTypeFontUnicode.java:98)
at com.itextpdf.text.pdf.BaseFont.createFont(BaseFont.java:705)
at com.itextpdf.text.pdf.BaseFont.createFont(BaseFont.java:625)
at com.itextpdf.text.pdf.BaseFont.createFont(BaseFont.java:460)
at com.hvlink.service.impl.AsnPackServiceImpl.generatePdfBytes(AsnPackServiceImpl.java:174)
at com.hvlink.service.impl.AsnPackServiceImpl.lambda$exportLabels$1(AsnPackServiceImpl.java:105)
at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:45)
at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:64)
at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:157)
at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onNext(FluxOnAssembly.java:539)
at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1839)
at reactor.core.publisher.MonoFlatMap$FlatMapInner.onNext(MonoFlatMap.java:249)
at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onNext(FluxOnAssembly.java:539)
at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onNext(FluxOnErrorResume.java:79)
at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onNext(FluxOnAssembly.java:539)
at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onNext(FluxPeekFuseable.java:210)
at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onNext(FluxOnAssembly.java:539)
at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onNext(FluxPeekFuseable.java:210)
at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onNext(FluxOnAssembly.java:539)
at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.complete(MonoIgnoreThen.java:292)
at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onNext(MonoIgnoreThen.java:187)
at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onNext(FluxOnAssembly.java:539)
at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onNext(FluxOnAssembly.java:539)
at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1839)
at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:151)
at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onNext(FluxOnAssembly.java:539)
at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1839)
at reactor.core.publisher.MonoZip$ZipCoordinator.signal(MonoZip.java:258)
at reactor.core.publisher.MonoZip$ZipInner.onNext(MonoZip.java:347)
at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onNext(FluxOnAssembly.java:539)
at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onNext(MonoPeekTerminal.java:180)
at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onNext(FluxOnAssembly.java:539)
at reactor.core.publisher.FluxDefaultIfEmpty$DefaultIfEmptySubscriber.onNext(FluxDefaultIfEmpty.java:101)
at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onNext(FluxOnAssembly.java:539)
at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onNext(FluxPeekFuseable.java:210)
at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onNext(FluxOnAssembly.java:539)
at reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onNext(FluxSwitchIfEmpty.java:74)
at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onNext(FluxOnAssembly.java:539)
at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onNext(FluxOnErrorResume.java:79)
at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onNext(FluxOnAssembly.java:539)
at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1839)
at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:151)
at reactor.core.publisher.FluxContextWrite$ContextWriteSubscriber.onNext(FluxContextWrite.java:107)
at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onNext(FluxOnAssembly.java:539)
at reactor.core.publisher.FluxMapFuseable$MapFuseableConditionalSubscriber.onNext(FluxMapFuseable.java:299)
at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onNext(FluxOnAssembly.java:539)
at reactor.core.publisher.FluxFilterFuseable$FilterFuseableConditionalSubscriber.onNext(FluxFilterFuseable.java:337)
at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onNext(FluxOnAssembly.java:539)
at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1839)
at reactor.core.publisher.MonoCollect$CollectSubscriber.onComplete(MonoCollect.java:160)
at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onComplete(FluxOnAssembly.java:549)
at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onComplete(FluxMapFuseable.java:152)
at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onComplete(FluxOnAssembly.java:549)
at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onComplete(FluxPeekFuseable.java:277)
at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onComplete(FluxOnAssembly.java:549)
at reactor.core.publisher.FluxMap$MapSubscriber.onComplete(FluxMap.java:144)
at reactor.netty.channel.FluxReceive.onInboundComplete(FluxReceive.java:415)
at reactor.netty.channel.ChannelOperations.onInboundComplete(ChannelOperations.java:439)
at reactor.netty.http.server.HttpServerOperations.onInboundNext(HttpServerOperations.java:656)
at reactor.netty.channel.ChannelOperationsHandler.channelRead(ChannelOperationsHandler.java:114)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
at reactor.netty.http.server.HttpTrafficHandler.channelRead(HttpTrafficHandler.java:276)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:442)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:436)
at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:346)
at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:318)
at io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:251)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:442)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:440)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)
at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166)
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:788)
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:724)
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:650)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:562)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.lang.Thread.run(Thread.java:750)
2025-10-08 16:41:10.131 [reactor-http-nio-3] ERROR com.hvlink.controller.AsnPackController - 标签导出失败
java.lang.RuntimeException: 标签导出失败: C:/Windows/Fonts/sim sun.ttc not found as file or resource.
at com.hvlink.service.impl.AsnPackServiceImpl.lambda$exportLabels$1(AsnPackServiceImpl.java:123)
Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException:
Assembly trace from producer [reactor.core.publisher.MonoError] :
reactor.core.publisher.Mono.error(Mono.java:315)
com.hvlink.service.impl.AsnPackServiceImpl.lambda$exportLabels$1(AsnPackServiceImpl.java:123)
Error has been observed at the following site(s):
*__Mono.error ⇢ at com.hvlink.service.impl.AsnPackServiceImpl.lambda$exportLabels$1(AsnPackServiceImpl.java:123)
*__Mono.defer ⇢ at com.hvlink.service.impl.AsnPackServiceImpl.exportLabels(AsnPackServiceImpl.java:83)
Original Stack Trace:
at com.hvlink.service.impl.AsnPackServiceImpl.lambda$exportLabels$1(AsnPackServiceImpl.java:123)
at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:45)
at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:64)
at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:157)
at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1839)
at reactor.core.publisher.MonoFlatMap$FlatMapInner.onNext(MonoFlatMap.java:249)
at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onNext(FluxOnErrorResume.java:79)
at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onNext(FluxPeekFuseable.java:210)
at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onNext(FluxPeekFuseable.java:210)
at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.complete(MonoIgnoreThen.java:292)
at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onNext(MonoIgnoreThen.java:187)
at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1839)
at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:151)
at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1839)
at reactor.core.publisher.MonoZip$ZipCoordinator.signal(MonoZip.java:258)
at reactor.core.publisher.MonoZip$ZipInner.onNext(MonoZip.java:347)
at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onNext(MonoPeekTerminal.java:180)
at reactor.core.publisher.FluxDefaultIfEmpty$DefaultIfEmptySubscriber.onNext(FluxDefaultIfEmpty.java:101)
at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onNext(FluxPeekFuseable.java:210)
at reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onNext(FluxSwitchIfEmpty.java:74)
at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onNext(FluxOnErrorResume.java:79)
at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1839)
at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:151)
at reactor.core.publisher.FluxContextWrite$ContextWriteSubscriber.onNext(FluxContextWrite.java:107)
at reactor.core.publisher.FluxMapFuseable$MapFuseableConditionalSubscriber.onNext(FluxMapFuseable.java:299)
at reactor.core.publisher.FluxFilterFuseable$FilterFuseableConditionalSubscriber.onNext(FluxFilterFuseable.java:337)
at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1839)
at reactor.core.publisher.MonoCollect$CollectSubscriber.onComplete(MonoCollect.java:160)
at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onComplete(FluxMapFuseable.java:152)
at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onComplete(FluxPeekFuseable.java:277)
at reactor.core.publisher.FluxMap$MapSubscriber.onComplete(FluxMap.java:144)
at reactor.netty.channel.FluxReceive.onInboundComplete(FluxReceive.java:415)
at reactor.netty.channel.ChannelOperations.onInboundComplete(ChannelOperations.java:439)
at reactor.netty.http.server.HttpServerOperations.onInboundNext(HttpServerOperations.java:656)
at reactor.netty.channel.ChannelOperationsHandler.channelRead(ChannelOperationsHandler.java:114)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
at reactor.netty.http.server.HttpTrafficHandler.channelRead(HttpTrafficHandler.java:276)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:442)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:436)
at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:346)
at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:318)
at io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:251)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:442)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:440)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)
at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166)
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:788)
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:724)
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:650)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:562)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.lang.Thread.run(Thread.java:750)
2025-10-08 16:41:10.134 [reactor-http-nio-3] DEBUG o.s.w.r.r.m.a.RequestMappingHandlerAdapter - [5230cfa4-1] Using @ExceptionHandler com.hvlink.exceptions.ExceptionHandle#handleException(Exception)
2025-10-08 16:41:10.137 [reactor-http-nio-3] ERROR com.hvlink.exceptions.ExceptionHandle - ===服务器内部错误==
java.lang.RuntimeException: 标签导出失败: C:/Windows/Fonts/sim sun.ttc not found as file or resource.
at com.hvlink.service.impl.AsnPackServiceImpl.lambda$exportLabels$1(AsnPackServiceImpl.java:123)
Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException:
Assembly trace from producer [reactor.core.publisher.MonoError] :
reactor.core.publisher.Mono.error(Mono.java:315)
com.hvlink.service.impl.AsnPackServiceImpl.lambda$exportLabels$1(AsnPackServiceImpl.java:123)
Error has been observed at the following site(s):
*__________Mono.error ⇢ at com.hvlink.service.impl.AsnPackServiceImpl.lambda$exportLabels$1(AsnPackServiceImpl.java:123)
*__________Mono.defer ⇢ at com.hvlink.service.impl.AsnPackServiceImpl.exportLabels(AsnPackServiceImpl.java:83)
|_ Mono.onErrorResume ⇢ at com.hvlink.controller.AsnPackController.exportLabels(AsnPackController.java:61)
|_ Mono.flatMap ⇢ at org.springframework.web.reactive.result.method.annotation.ResponseEntityResultHandler.handleResult(ResponseEntityResultHandler.java:132)
|_ checkpoint ⇢ Handler com.hvlink.controller.AsnPackController#exportLabels(AsnPackExportParam) [DispatcherHandler]
*__________Mono.error ⇢ at com.hvlink.controller.AsnPackController.lambda$exportLabels$0(AsnPackController.java:63)
Original Stack Trace:
at com.hvlink.service.impl.AsnPackServiceImpl.lambda$exportLabels$1(AsnPackServiceImpl.java:123)
at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:45)
at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:64)
at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:157)
at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1839)
at reactor.core.publisher.MonoFlatMap$FlatMapInner.onNext(MonoFlatMap.java:249)
at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onNext(FluxOnErrorResume.java:79)
at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onNext(FluxPeekFuseable.java:210)
at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onNext(FluxPeekFuseable.java:210)
at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.complete(MonoIgnoreThen.java:292)
at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onNext(MonoIgnoreThen.java:187)
at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1839)
at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:151)
at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1839)
at reactor.core.publisher.MonoZip$ZipCoordinator.signal(MonoZip.java:258)
at reactor.core.publisher.MonoZip$ZipInner.onNext(MonoZip.java:347)
at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onNext(MonoPeekTerminal.java:180)
at reactor.core.publisher.FluxDefaultIfEmpty$DefaultIfEmptySubscriber.onNext(FluxDefaultIfEmpty.java:101)
at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onNext(FluxPeekFuseable.java:210)
at reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onNext(FluxSwitchIfEmpty.java:74)
at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onNext(FluxOnErrorResume.java:79)
at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1839)
at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:151)
at reactor.core.publisher.FluxContextWrite$ContextWriteSubscriber.onNext(FluxContextWrite.java:107)
at reactor.core.publisher.FluxMapFuseable$MapFuseableConditionalSubscriber.onNext(FluxMapFuseable.java:299)
at reactor.core.publisher.FluxFilterFuseable$FilterFuseableConditionalSubscriber.onNext(FluxFilterFuseable.java:337)
at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1839)
at reactor.core.publisher.MonoCollect$CollectSubscriber.onComplete(MonoCollect.java:160)
at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onComplete(FluxMapFuseable.java:152)
at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onComplete(FluxPeekFuseable.java:277)
at reactor.core.publisher.FluxMap$MapSubscriber.onComplete(FluxMap.java:144)
at reactor.netty.channel.FluxReceive.onInboundComplete(FluxReceive.java:415)
at reactor.netty.channel.ChannelOperations.onInboundComplete(ChannelOperations.java:439)
at reactor.netty.http.server.HttpServerOperations.onInboundNext(HttpServerOperations.java:656)
at reactor.netty.channel.ChannelOperationsHandler.channelRead(ChannelOperationsHandler.java:114)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
at reactor.netty.http.server.HttpTrafficHandler.channelRead(HttpTrafficHandler.java:276)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:442)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:436)
at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:346)
at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:318)
at io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:251)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:442)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:440)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)
at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166)
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:788)
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:724)
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:650)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:562)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.lang.Thread.run(Thread.java:750)
2025-10-08 16:41:10.147 [reactor-http-nio-3] DEBUG o.s.w.r.r.m.annotation.ResponseBodyResultHandler - [5230cfa4-1] Using 'application/json' given [*/*] and supported [application/json, application/*+json, application/x-ndjson, text/event-stream]
2025-10-08 16:41:10.147 [reactor-http-nio-3] DEBUG o.s.w.r.r.m.annotation.ResponseBodyResultHandler - [5230cfa4-1] 0..1 [com.hvlink.common.Result<?>]
2025-10-08 16:41:10.218 [reactor-http-nio-3] DEBUG o.s.http.codec.json.Jackson2JsonEncoder - [5230cfa4-1] Encoding [Result(status=500, msg=发现未知问题,请联系管理员!, data=null, timestamp=1759912870145)]
2025-10-08 16:41:10.326 [reactor-http-nio-3] DEBUG reactor.netty.http.server.HttpServerOperations - [5230cfa4-1, L:/0:0:0:0:0:0:0:1:9002 - R:/0:0:0:0:0:0:0:1:56549] Decreasing pending responses, now 0
2025-10-08 16:41:10.326 [reactor-http-nio-3] DEBUG reactor.netty.http.server.HttpServerOperations - [5230cfa4-1, L:/0:0:0:0:0:0:0:1:9002 - R:/0:0:0:0:0:0:0:1:56549] Last HTTP packet was sent, terminating the channel
2025-10-08 16:41:10.327 [reactor-http-nio-3] DEBUG reactor.netty.channel.ChannelOperations - [5230cfa4-1, L:/0:0:0:0:0:0:0:1:9002 - R:/0:0:0:0:0:0:0:1:56549] [HttpServer] Channel inbound receiver cancelled (operation cancelled).
2025-10-08 16:41:10.373 [reactor-http-nio-3] DEBUG o.s.web.server.adapter.HttpWebHandlerAdapter - [5230cfa4-1] Completed 500 INTERNAL_SERVER_ERROR
2025-10-08 16:41:10.392 [reactor-http-nio-3] DEBUG reactor.netty.http.server.HttpServerOperations - [5230cfa4-1, L:/0:0:0:0:0:0:0:1:9002 - R:/0:0:0:0:0:0:0:1:56549] Last HTTP response frame
package com.hvlink.service.impl;
import com.alibaba.nacos.common.utils.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hvlink.entity.dto.asn.AsnPackDTO;
import com.hvlink.entity.param.asn.AsnPackExportParam;
import com.hvlink.entity.param.asn.AsnPackLabelParam;
import com.hvlink.entity.po.asn.AsnPackPO;
import com.hvlink.entity.vo.asn.AsnPackLabelVO;
import com.hvlink.mapper.asn.AsnPackMapper;
import com.hvlink.pagination.PageResult;
import com.hvlink.service.IAsnPackService;
import com.hvlink.utils.BeanCopyUtils;
import com.hvlink.utils.QRCodeUtils;
import com.itextpdf.text.Image;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.*;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.io.ByteArrayResource;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Mono;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;
/**
* ASN包装信息(AsnPack)表服务实现类
*
* @author sunzhuang
* @since 2025-09-23 16:39:02
*/
@Slf4j
@RequiredArgsConstructor
@Service("asnPackService")
public class AsnPackServiceImpl extends ServiceImpl<AsnPackMapper, AsnPackPO> implements IAsnPackService {
private final AsnPackMapper asnPackMapper;
/**
* 查询标签信息
*
* @param asnPackLabelParam 请求参数
* @return 查询结果
*/
@Override
public PageResult<AsnPackLabelVO> queryPage(AsnPackLabelParam asnPackLabelParam) {
// 查询标签数据
Page<AsnPackDTO> page = new Page<>(asnPackLabelParam.getPageIndex(), asnPackLabelParam.getPageSize());
Page<AsnPackDTO> dtoPage = asnPackMapper.queryLabelPage(page, asnPackLabelParam);
// 转换 DTO 到 VO
List<AsnPackLabelVO> voList = Collections.emptyList();
if (!CollectionUtils.isEmpty(dtoPage.getRecords())) {
voList = dtoPage.getRecords().stream()
.map(dto -> BeanCopyUtils.copyBean(dto, AsnPackLabelVO.class))
.collect(Collectors.toList());
}
// 构建分页结果
PageResult<AsnPackLabelVO> result = new PageResult<>();
result.setRecords(voList);
result.setTotal(dtoPage.getTotal());
result.setPageIndex(asnPackLabelParam.getPageIndex());
result.setPageSize(asnPackLabelParam.getPageSize());
return result;
}
@Override
public Mono<ResponseEntity<Resource>> exportLabels(AsnPackExportParam exportParam) {
return Mono.defer(() -> {
try {
// 参数验证
if (exportParam == null || exportParam.getIds() == null || exportParam.getIds().isEmpty()) {
return Mono.error(new IllegalArgumentException("导出参数或ID列表不能为空"));
}
// 查询导出数据
List<AsnPackDTO> exportData = asnPackMapper.selectByIds(exportParam.getIds());
if (exportData.isEmpty()) {
return Mono.error(new RuntimeException("未找到导出数据"));
}
// 验证导出类型
if (!isValidExportType(exportParam.getExportType())) {
return Mono.error(new IllegalArgumentException("不支持的导出类型: " + exportParam.getExportType()));
}
// 根据导出类型选择模板
String templatePath = getTemplatePath(exportParam.getExportType());
// 生成PDF字节数组
byte[] pdfBytes = generatePdfBytes(exportData, exportParam.getExportType(), templatePath);
// 创建资源
Resource resource = new ByteArrayResource(pdfBytes);
// 设置响应头
String fileName = buildFileName(exportParam.getExportType());
ResponseEntity<Resource> responseEntity = ResponseEntity.ok()
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + fileName)
.contentType(MediaType.APPLICATION_PDF)
.contentLength(pdfBytes.length)
.body(resource);
return Mono.just(responseEntity);
} catch (Exception e) {
log.error("标签导出失败", e);
return Mono.error(new RuntimeException("标签导出失败: " + e.getMessage()));
}
});
}
private String getTemplatePath(String exportType) {
switch (exportType.toUpperCase()) {
case "P":
return "static/templates/托标签模板.pdf"; // 托标签模板
case "C":
return "static/templates/箱标签模板.pdf"; // 箱标签模板
case "B":
return "static/templates/包标签模板.pdf"; // 包标签模板
default:
throw new IllegalArgumentException("不支持的导出类型: " + exportType);
}
}
private boolean isValidExportType(String exportType) {
if (exportType == null) return false;
String type = exportType.toUpperCase();
return type.equals("P") || type.equals("C") || type.equals("B");
}
private String buildFileName(String exportType) {
String typeName = "";
switch (exportType.toUpperCase()) {
case "P": typeName = "托标签"; break;
case "C": typeName = "箱标签"; break;
case "B": typeName = "包标签"; break;
default: typeName = "标签";
}
return typeName + "_" + new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + ".pdf";
}
private byte[] generatePdfBytes(List<AsnPackDTO> data, String exportType, String templatePath) throws Exception {
ClassPathResource templateResource = new ClassPathResource(templatePath);
if (!templateResource.exists()) {
throw new RuntimeException("模板文件不存在: " + templatePath);
}
try (InputStream templateStream = templateResource.getInputStream();
ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
PdfReader reader = new PdfReader(templateStream);
PdfStamper stamper = new PdfStamper(reader, outputStream);
AcroFields form = stamper.getAcroFields();
// 添加中文字体支持
BaseFont simSunFont = BaseFont.createFont("C:/Windows/Fonts/sim sun.ttc,0", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
form.addSubstitutionFont(simSunFont);
// 填充第一个数据项
AsnPackDTO item = data.get(0);
fillFormFields(form, item, exportType);
// 添加二维码到指定位置
addQRCode(stamper, form, item, exportType);
// ✅ 关键:压平表单前确保所有操作已完成
stamper.setFormFlattening(true); // 将表单转为静态文本
stamper.close(); // 关闭 stamper 会自动写入修改后的内容
reader.close();
return outputStream.toByteArray();
}
}
private void fillFormFields(com.itextpdf.text.pdf.AcroFields form, AsnPackDTO item, String exportType) throws Exception {
Map<String, String> fieldValues = buildFieldValues(item, exportType);
log.info("要填充的数据: {}", fieldValues);
// 填充表单字段
for (Map.Entry<String, String> entry : fieldValues.entrySet()) {
String fieldName = entry.getKey();
String fieldValue = entry.getValue();
if (form.getFields().containsKey(fieldName)) {
if (StringUtils.hasText(fieldValue)) {
try {
form.setField(fieldName, fieldValue);
log.info("成功填充字段: {} = {}", fieldName, fieldValue);
} catch (Exception e) {
log.error("填充字段失败: {}, 值: {}", fieldName, fieldValue, e);
}
} else {
log.warn("字段值为空: {}", fieldName);
}
} else {
log.warn("未找到表单字段: {}", fieldName);
}
}
}
private Map<String, String> buildFieldValues(AsnPackDTO item, String exportType) {
Map<String, String> values = new HashMap<>();
// 公共字段
values.put("part_desc", item.getPartDesc());
values.put("part_code", item.getPartCode());
values.put("supplier_name", item.getSupplierName());
values.put("supplier_code", item.getSupplierCode());
values.put("order_no", item.getAsnNo());
values.put("production_batch", item.getProductionBatch());
values.put("case_code", generateCaseCode(item, exportType));
values.put("remark", item.getRemark());
// 数量相关字段
switch (exportType.toUpperCase()) {
case "P":
values.put("quantity", formatQuantity(item.getQuantity()));
values.put("pack_quantity", formatQuantity(item.getPackQuantity()));
values.put("unique_code", generateUniqueCode("P", item.getSupplierCode()));
values.put("master_label", "MASTER LABEL " + item.getWarehouseCode());
break;
case "C":
values.put("quantity", formatQuantity(item.getQuantity()));
values.put("pack_quantity", formatQuantity(item.getPackQuantity()));
values.put("unique_code", generateUniqueCode("C", item.getSupplierCode()));
break;
case "B":
values.put("quantity", formatQuantity(item.getQuantity()));
values.put("pack_quantity", formatQuantity(item.getPackQuantity()));
values.put("unique_code", generateUniqueCode("B", item.getSupplierCode()));
break;
}
return values;
}
private String generateCaseCode(AsnPackDTO item, String exportType) {
switch (exportType.toUpperCase()) {
case "P":
return "1/1"; // X/Y格式
case "C":
return "1/5-1"; // X/Y-Z格式
case "B":
return "1/10-C-1"; // X/Y-C-Z格式
default:
return item.getCaseCode();
}
}
private String generateUniqueCode(String prefix, String supplierCode) {
SimpleDateFormat sdf = new SimpleDateFormat("yyMMdd");
String dateStr = sdf.format(new Date());
String sequence = String.format("%06d", System.currentTimeMillis() % 1000000);
return prefix + supplierCode + dateStr + sequence;
}
private String formatQuantity(Double quantity) {
return quantity != null ? String.valueOf(quantity) : "0";
}
private void addQRCode(PdfStamper stamper, AcroFields form, AsnPackDTO item, String exportType) throws Exception {
try {
String uniqueCode = generateUniqueCode(
exportType.equals("P") ? "P" :
exportType.equals("C") ? "C" : "B",
item.getSupplierCode()
);
// 生成二维码
ByteArrayOutputStream qrCodeStream = QRCodeUtils.generateQRCode(uniqueCode, 100, 100);
Image qrCodeImage = Image.getInstance(qrCodeStream.toByteArray());
// 获取字段位置
List<AcroFields.FieldPosition> fieldPositions = form.getFieldPositions("QRcode");
if (fieldPositions == null || fieldPositions.isEmpty()) {
log.warn("未找到 QRcode 字段的位置信息");
return;
}
AcroFields.FieldPosition position = fieldPositions.get(0);
int pageNo = position.page;
Rectangle rect = position.position;
PdfContentByte canvas = stamper.getOverContent(pageNo); // 使用上层绘制,避免干扰底层
qrCodeImage.setAbsolutePosition(rect.getLeft(), rect.getBottom());
qrCodeImage.scaleToFit(rect.getWidth(), rect.getHeight());
canvas.addImage(qrCodeImage);
} catch (Exception e) {
log.error("添加二维码失败", e);
throw e; // 显式抛出便于调试
}
}
}
按照你的修改,报错了