yudao-module-aftersales/src/main/java/cn/iocoder/yudao/module/aftersales/service/ticket/AfterSaleTicketServiceImpl.java
@@ -67,13 +67,14 @@
                .setOwnerUserId(userId);
        ticketMapper.insert(ticket);
        // 3. 插入明细行
        // 3. 插入明细行(每条生成独立售后单号:工单号-序号)
        if (CollUtil.isNotEmpty(createReqVO.getItems())) {
            createReqVO.getItems().forEach(item -> {
                AfterSaleTicketItemDO itemDO = BeanUtils.toBean(item, AfterSaleTicketItemDO.class);
            for (int i = 0; i < createReqVO.getItems().size(); i++) {
                AfterSaleTicketItemDO itemDO = BeanUtils.toBean(createReqVO.getItems().get(i), AfterSaleTicketItemDO.class);
                itemDO.setTicketId(ticket.getId());
                itemDO.setItemNo(buildItemNo(no, i + 1));
                ticketItemMapper.insert(itemDO);
            });
            }
        }
        // 4. 绑定附件
@@ -102,14 +103,15 @@
        AfterSaleTicketDO updateObj = BeanUtils.toBean(updateReqVO, AfterSaleTicketDO.class);
        ticketMapper.updateById(updateObj);
        // 3. 更新明细行(先删后增)
        // 3. 更新明细行(先删后增,每条生成独立售后单号:工单号-序号)
        ticketItemMapper.deleteByTicketId(ticket.getId());
        if (CollUtil.isNotEmpty(updateReqVO.getItems())) {
            updateReqVO.getItems().forEach(item -> {
                AfterSaleTicketItemDO itemDO = BeanUtils.toBean(item, AfterSaleTicketItemDO.class);
            for (int i = 0; i < updateReqVO.getItems().size(); i++) {
                AfterSaleTicketItemDO itemDO = BeanUtils.toBean(updateReqVO.getItems().get(i), AfterSaleTicketItemDO.class);
                itemDO.setTicketId(ticket.getId());
                itemDO.setItemNo(buildItemNo(ticket.getNo(), i + 1));
                ticketItemMapper.insert(itemDO);
            });
            }
        }
        // 4. 更新附件
@@ -204,6 +206,11 @@
    // ========== 内部方法 ==========
    /** 生成明细售后单号:工单号-两位序号 */
    private String buildItemNo(String ticketNo, int index) {
        return ticketNo + "-" + String.format("%02d", index);
    }
    private AfterSaleTicketDO validateTicketExists(Long id) {
        AfterSaleTicketDO ticket = ticketMapper.selectById(id);
        if (ticket == null) {