Axboot 멀티 테이블 수정/저장 예제 (2/2)

Axboot 멀티 테이블 수정/저장 예제 (2/2)

앞 게시글 Axboot 멀티 테이블 수정/저장 예제 (1/2) 에서 연속으로 진행하도록 하겠습니다.

이번 시간에는 4)제품 History 조회와 제품 정보의 판매가 수정 시 제품 History 테이블에 Insert하는 JAVA로직을 

처리하도록 하겠습니다.

4) 제품 History 조회와 제품 정보의 판매가 수정 시 제품 History 테이블에 Insert

   - PrdtPriceHist.java 수정

package com.dasdes.shopmng.domain.prdt;

import com.chequer.axboot.core.annotations.Comment;
import com.dasdes.shopmng.domain.BaseJpaModel;
import java.util.Date;
import javax.persistence.*;
import lombok.*;
import org.apache.ibatis.type.Alias;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;

@Setter
@Getter
@DynamicInsert
@DynamicUpdate
@Entity
@EqualsAndHashCode(callSuper = true)
@IdClass(PrdtPriceHist.class)
@Table(name = "prdt_price_hist")
@Comment(value = "제품가격History")
@Alias("prdtPriceHist")
public class PrdtPriceHist extends BaseJpaModel<String> {

  @Id
  @Column(name = "id", length = 20, nullable = false)
  @Comment(value = "id")
  private String id;

  @Column(name = "prdt_cd", length = 20, nullable = false)
  @Comment(value = "제품코드")
  private String prdtCd;

  @Column(name = "ch_date", nullable = false)
  @Comment(value = "변경일시")
  @Temporal(TemporalType.TIMESTAMP)
  private Date chDate;

  @Column(name = "sales_price", precision = 10, nullable = false)
  @Comment(value = "판매가격")
  private Integer salesPrice;

  @Override
  public String getId() {

    return id;
  }
}

  - PrdtPriceHistRepository.java

package com.dasdes.shopmng.domain.prdt;

import org.springframework.stereotype.Repository;

import com.chequer.axboot.core.domain.base.AXBootJPAQueryDSLRepository;

@Repository

public interface PrdtPriceHistRepository extends AXBootJPAQueryDSLRepository<PrdtPriceHist, String> {

}

  - PrdtPriceHistService.java

package com.dasdes.shopmng.domain.prdt;

import com.chequer.axboot.core.parameter.RequestParams;
import com.dasdes.shopmng.domain.BaseService;
import com.querydsl.core.BooleanBuilder;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class PrdtPriceHistService extends BaseService<PrdtPriceHist, String> {

  private PrdtPriceHistRepository prdtPriceHistRepository;

  @Inject
  public PrdtPriceHistService(PrdtPriceHistRepository prdtPriceHistRepository) {

    super(prdtPriceHistRepository);

    this.prdtPriceHistRepository = prdtPriceHistRepository;
  }

  // 제품 판매가 History조회

  public List<PrdtPriceHist> gets(RequestParams<PrdtPriceHist> requestParams) {

    String prdtCd = requestParams.getString("prdtCd", "");

    String filter = requestParams.getString("filter");

    BooleanBuilder builder = new BooleanBuilder();

    if (isNotEmpty(prdtCd)) {

      builder.and(qProduct.prdtCd.eq(prdtCd));
    }

    List<PrdtPriceHist> prdtpriceHistList =
        select().from(qPrdtPriceHist).where(builder).orderBy(qPrdtPriceHist.prdtCd.asc()).fetch();

    if (isNotEmpty(filter)) {

      prdtpriceHistList = filter(prdtpriceHistList, filter);
    }

    return prdtpriceHistList;
  }

  // 제품 정보에서 호출하는 판매가 insert method

  @Transactional
  public void savePrdPrice(List<Product> product) {

    PrdtPriceHist prdtHist = null;

    List<PrdtPriceHist> hlist = new ArrayList();

    Product prdt = null;

    for (int i = 0; i < product.size(); i++) {

      prdt = (Product) product.get(i);

      if (prdt.is__modified__()) {

        prdtHist = new PrdtPriceHist();

        prdtHist.setPrdtCd(prdt.getPrdtCd());

        prdtHist.setSalesPrice(prdt.getSalesPrice());

        prdtHist.setCreatedBy(prdt.getCreatedBy());

        hlist.add(prdtHist);
      }
    }

    save(hlist);
  }
}

  - ProductService.java : 제품 정보에서 판매가를 수정할 때 제품 History 테이블에 insert되는 method 호출

package com.dasdes.shopmng.domain.prdt;

import com.chequer.axboot.core.parameter.RequestParams;
import com.dasdes.shopmng.domain.BaseService;
import com.dasdes.shopmng.exception.DBException;
import com.querydsl.core.BooleanBuilder;
import java.util.List;
import javax.inject.Inject;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

// import org.slf4j.Logger;

// import org.slf4j.LoggerFactory;

@Service
public class ProductService extends BaseService<Product, String> {

  private ProductRepository productRepository;

  @Inject private PrdtPriceHistService prdtPriceHistService;

  @Inject
  public ProductService(ProductRepository productRepository) {

    super(productRepository);

    this.productRepository = productRepository;
  }

  public List<Product> gets(RequestParams<Product> requestParams) {

    String prdtCd = requestParams.getString("prdtCd", "");

    String prdtNm = requestParams.getString("prdtNm", "");

    String filter = requestParams.getString("filter");

    BooleanBuilder builder = new BooleanBuilder();

    if (isNotEmpty(prdtCd)) {

      builder.and(qProduct.prdtCd.eq(prdtCd));
    }

    if (isNotEmpty(prdtNm)) {

      builder.and(qProduct.prdtNm.eq(prdtNm));
    }

    List<Product> prdtList =
        select()
            .from(qProduct)
            .where(builder)
            .orderBy(qProduct.prdtCd.asc(), qProduct.prdtNm.asc())
            .fetch();

    if (isNotEmpty(filter)) {

      prdtList = filter(prdtList, filter);
    }

    return prdtList;
  }

  @Transactional
  public void savePrdt(List<Product> product) {

    Product prdt = null;

    for (int i = 0; i < product.size(); i++) {

      prdt = (Product) product.get(i);

      // logger.error(i+": {} :"+prdt.toString());

      if (prdt.is__created__() && exists(prdt.getId())) {

        throw new DBException("신규로 추가하신 " + prdt.getId() + "코드는 이미 등록된 제품코드입니다.");
      }
    }

    save(product);

    // 제품 판매가 History Table에 Insert되는 method호출

    prdtPriceHistService.savePrdPrice(product);
  }
}

5) 테스트

  - 서버 구동

   - 제품 정보에서 판매가 수정을 해본다. 

   - 제품 판매가 History 조회 : 하다보니 누가 변경했는지가 필요할 것 같은데 빠졌네요.^^

                                        그 부분은 여러분들이 한번 추가해 보세요..==>과제.


    

어때요? 도움이 많이 되셨나요? ~~~~~~~

#제품가격 #멀티테이블 #Axboot

Read more

2025년  ERP/CRM/SCM 시스템 종류

2025년 ERP/CRM/SCM 시스템 종류

2025년 글로벌 ERP/CRM/SCM 시스템 순위: 회사, 커뮤니티, 기능 비교 분석 기업들은 효율적인 운영과 경쟁력 강화를 위해 ERP, CRM, SCM 시스템 도입을 적극 검토하고 있습니다. 본 글에서는 시장 점유율, 기능, 고객 만족도, 기술 발전을 고려하여 주요 시스템들의 순위와 특징을 정리했습니다. 아래 순위는 주관적 평가이며, 실제 도입 시 기업의 규모와

해외여행 준비 체크리스트

해외여행 준비 체크리스트

해외여행 준비 체크리스트: 완벽한 여행을 위한 필수 준비 가이드 꿈꿔왔던 해외여행, 설렘과 함께 걱정도 따라옵니다. 꼼꼼한 준비가 완벽한 여행의 시작입니다. 2025년 최신 정보를 바탕으로, 놓치기 쉬운 부분까지 포함한 상세 체크리스트와 함께 걱정 없이 여행을 즐겨보세요! 본 가이드는 항공권 예매부터 현지 적응까지, 단계별로 필요한 정보를 제공합니다. 1. 여행 계획 수립 및

ChatGPT 무료와 유료 차이 비교

ChatGPT 무료와 유료 차이 비교

ChatGPT 무료와 유료(Plus,Pro) 차이 비교 ChatGPT는 오픈AI가 개발한 강력한 대규모 언어 모델로, 다양한 작업에 활용 가능한 놀라운 도구입니다. 무료 버전과 유료 버전인 ChatGPT Plus는 여러 측면에서 차이가 있으며, 어떤 버전을 선택해야 할지는 사용 목적과 예산에 따라 달라집니다. 이 글에서는 ChatGPT 무료와 유료 버전의 차이점을 상세하게 비교 분석하여, 여러분의

손흥민의 축구 인생

손흥민의 축구 인생

손흥민, 축구 역사의 한 페이지: 시대별 주요 활약상 손흥민, 대한민국을 대표하는 축구 스타이자 프리미어 리그를 빛낸 월드클래스 선수. 그의 놀라운 여정을 시대별로 나누어 살펴봅니다. 1. 어린 시절과 유소년 시절 (1992-2008) 손흥민은 1992년 강원도 춘천에서 태어나 어린 시절부터 축구에 몰두했습니다. 아버지 손웅정의 지도 아래 체계적인 훈련을 받으며 뛰어난 기술과 슈팅 능력을

Image 3
이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
Image 4
이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.