From bed3a4e3c936683740b4396c43092f0b1be8abbd Mon Sep 17 00:00:00 2001 From: Jerry Yan <792602257@qq.com> Date: Thu, 23 Oct 2025 21:24:58 +0800 Subject: [PATCH] =?UTF-8?q?feat(printer):=20=E5=AE=9E=E7=8E=B0=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E7=8A=B6=E6=80=81=E7=9A=84=E5=8E=9F=E5=AD=90=E6=80=A7?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=B8=8E=E5=90=8C=E6=AD=A5=E9=94=81=E6=9C=BA?= =?UTF-8?q?=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加 compareAndSetTaskStatus 方法以支持基于期望状态的任务更新 - 引入 ReentrantLock 实现任务同步处理,防止并发冲突 - 在 XML 映射文件中定义 compareAndSetTaskStatus 的 SQL 更新语句 - 定义任务状态常量:TASK_STATUS_PENDING 和 TASK_STATUS_PROCESSING - 优化任务获取逻辑,确保任务状态在处理前正确更新为 PROCESSING --- .../com/ycwl/basic/mapper/PrinterMapper.java | 6 +++- .../printer/impl/PrinterServiceImpl.java | 30 +++++++++++++++---- src/main/resources/mapper/PrinterMapper.xml | 7 ++++- 3 files changed, 36 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/ycwl/basic/mapper/PrinterMapper.java b/src/main/java/com/ycwl/basic/mapper/PrinterMapper.java index de6d71ec..a4fc788d 100644 --- a/src/main/java/com/ycwl/basic/mapper/PrinterMapper.java +++ b/src/main/java/com/ycwl/basic/mapper/PrinterMapper.java @@ -28,6 +28,10 @@ public interface PrinterMapper { int updateTaskStatus(@Param("id") Integer id, @Param("status") Integer status); + int compareAndSetTaskStatus(@Param("id") Integer id, + @Param("expectStatus") Integer expectStatus, + @Param("newStatus") Integer newStatus); + PrintTaskEntity getTaskById(Integer id); List listByScenicId(@Param("scenicId") Long scenicId); @@ -51,4 +55,4 @@ public interface PrinterMapper { void updateUserPhotoListToPrinter(Long memberId, Long scenicId, Integer printerId); List listRelationByOrderId(Long orderId); -} \ No newline at end of file +} diff --git a/src/main/java/com/ycwl/basic/service/printer/impl/PrinterServiceImpl.java b/src/main/java/com/ycwl/basic/service/printer/impl/PrinterServiceImpl.java index 9cebb8fd..08f0e5e2 100644 --- a/src/main/java/com/ycwl/basic/service/printer/impl/PrinterServiceImpl.java +++ b/src/main/java/com/ycwl/basic/service/printer/impl/PrinterServiceImpl.java @@ -69,6 +69,8 @@ import java.util.Map; import java.util.Objects; import java.util.UUID; import java.util.concurrent.TimeUnit; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; import java.util.stream.Collectors; @Slf4j @@ -151,11 +153,26 @@ public class PrinterServiceImpl implements PrinterService { printer.setPrinters(printersStr); printerMapper.update(printer); } - PrintTaskResp task = printerMapper.findTaskByPrinterId(printer.getId()); - if (task == null) { - return Collections.emptyList(); + syncTaskLock.lock(); + try { + while (true) { + PrintTaskResp task = printerMapper.findTaskByPrinterId(printer.getId()); + if (task == null) { + return Collections.emptyList(); + } + int updatedRows = printerMapper.compareAndSetTaskStatus( + task.getId(), + TASK_STATUS_PENDING, + TASK_STATUS_PROCESSING + ); + if (updatedRows == 1) { + task.setStatus(TASK_STATUS_PROCESSING); + return Collections.singletonList(task); + } + } + } finally { + syncTaskLock.unlock(); } - return Collections.singletonList(task); } @Override @@ -427,6 +444,9 @@ public class PrinterServiceImpl implements PrinterService { @Autowired private RedisTemplate redisTemplate; private static final String USER_PHOTO_LIST_TO_PRINTER = "USER_PHOTO_LIST_TO_PRINTER:"; + private static final int TASK_STATUS_PENDING = 0; + private static final int TASK_STATUS_PROCESSING = 3; + private final Lock syncTaskLock = new ReentrantLock(); @Override public void setUserIsBuyItem(Long memberId, Long id, Long orderId) { @@ -550,4 +570,4 @@ public class PrinterServiceImpl implements PrinterService { printTaskMapper.insertTask(task); }); } -} \ No newline at end of file +} diff --git a/src/main/resources/mapper/PrinterMapper.xml b/src/main/resources/mapper/PrinterMapper.xml index 54177f37..567c5eb6 100644 --- a/src/main/resources/mapper/PrinterMapper.xml +++ b/src/main/resources/mapper/PrinterMapper.xml @@ -152,6 +152,11 @@ UPDATE print_task SET status = #{status}, update_time = NOW() WHERE id = #{id} + + UPDATE print_task + SET status = #{newStatus}, update_time = NOW() + WHERE id = #{id} AND status = #{expectStatus} + UPDATE member_print SET crop_url = #{url}, update_time = NOW(), print_url = null WHERE id = #{id} @@ -172,4 +177,4 @@ DELETE FROM member_print WHERE member_id = #{memberId} AND scenic_id = #{scenicId} AND id = #{relationId} LIMIT 1; - \ No newline at end of file +