S SmartDocs
Serie: Java java 93 líneas · Actualizado 2026-04-09

GoodsService.java

Java/Baasid/src/main/java/com/baasid/service/GoodsService.java

package com.baasid.service;

import com.baasid.dto.GoodsRequest;
import com.baasid.dto.GoodsResponse;
import com.baasid.entity.Goods;
import com.baasid.entity.SystemUser;
import com.baasid.exception.ResourceNotFoundException;
import com.baasid.repository.GoodsRepository;
import com.baasid.repository.SystemUserRepository;
import org.springframework.lang.NonNull;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.UUID;

/**
 * 商品領域邏輯:透過 JPA Repository 存取 {@link Goods},並組裝對外 {@link GoodsResponse}。
 */
@Service
public class GoodsService {

    private final GoodsRepository goodsRepository;
    private final SystemUserRepository userRepository;

    public GoodsService(GoodsRepository goodsRepository, SystemUserRepository userRepository) {
        this.goodsRepository = goodsRepository;
        this.userRepository = userRepository;
    }

    /**
     * 新增商品:{@code cr_user} 與 {@code up_user} 皆為 {@code userId} 對應之使用者。
     */
    @Transactional
    public GoodsResponse addGoods(GoodsRequest request, @NonNull UUID userId) {
        // getReferenceById:僅建立代理、不立即 SELECT,適合只設關聯欄位
        SystemUser user = userRepository.getReferenceById(userId);

        Goods goods = new Goods();
        goods.setName(request.goodsName());
        goods.setCrUser(user);
        goods.setUpUser(user);

        goods = goodsRepository.save(goods);
        return toResponse(goods);
    }

    /** 查詢全部並轉成 DTO 列表。 */
    @Transactional(readOnly = true)
    public List<GoodsResponse> getAllGoods() {
        return goodsRepository.findAll().stream()
                .map(this::toResponse)
                .toList();
    }

    /** 依 ID 查單筆;不存在則 {@link ResourceNotFoundException}(404)。 */
    @Transactional(readOnly = true)
    public GoodsResponse getGoodsById(@NonNull UUID id) {
        Goods goods = goodsRepository.findById(id)
                .orElseThrow(() -> new ResourceNotFoundException("商品不存在: " + id));
        return toResponse(goods);
    }

    /**
     * 更新商品名稱與最後更新者;{@code cr_user}/建立時間不變。
     */
    @Transactional
    public GoodsResponse updateGoods(@NonNull UUID id, GoodsRequest request, @NonNull UUID userId) {
        Goods goods = goodsRepository.findById(id)
                .orElseThrow(() -> new ResourceNotFoundException("商品不存在: " + id));

        SystemUser user = userRepository.getReferenceById(userId);

        goods.setName(request.goodsName());
        goods.setUpUser(user);

        goods = goodsRepository.save(goods);
        return toResponse(goods);
    }

    /** 存在則刪除;不存在則與查詢一致拋 {@link ResourceNotFoundException}。 */
    @Transactional
    public void deleteGoods(@NonNull UUID id) {
        if (!goodsRepository.existsById(id)) {
            throw new ResourceNotFoundException("商品不存在: " + id);
        }
        goodsRepository.deleteById(id);
    }

    private GoodsResponse toResponse(Goods goods) {
        return new GoodsResponse(goods.getId().toString(), goods.getName());
    }
}

Artículos relacionados