오류 및 문제점
1. 3PL 매칭 조건 검색 쿼리 수정
- 문제점: 현재 쿼리로는 계약 자리가 남아있어도 최근 계약이 오래 남으면 검색되지 않는다.
- 해결 방안: 계약 기간 조건에 or로 자리가 남은 경우를 추가한다.
SELECT *
FROM threepl
JOIN product_group
ON threepl.product_group_no = product_group.product_group_no
JOIN (SELECT threepl_no, IFNULL(MIN(end_date), SYSDATE()) AS end_date
FROM matching
RIGHT OUTER JOIN warehouse
ON matching.warehouse_no = warehouse.warehouse_no
GROUP BY warehouse.threepl_no) AS dateinfo
ON threepl.threepl_no = dateinfo.threepl_no
WHERE product_group.group_name LIKE CONCAT('%', '%')
AND threepl.address LIKE CONCAT('%','%')
AND threepl.fee <= 10000000
AND (end_date <= DATE_ADD(SYSDATE(), INTERVAL 2 MONTH) OR (cnt_total - cnt_contracted > 0))
ORDER BY end_date, company_name
2. SQL 매일 일어나는 이벤트
- 문제점: 계약 여부를 매일 확인해야 한다.
- 해결 방안: SQL 이벤트를 만들어 하루에 한 번 계약 종료일이 어제인 계약을 만료시킨다.
CREATE EVENT event_contract_expiration
ON SCHEDULE EVERY 1 DAY
STARTS '2023-08-11 00:00:00'
DO
DELETE FROM matching
WHERE DATE_FORMAT(end_date, '%Y-%m-%d') = DATE_FORMAT(DATE_ADD(SYSDATE(), INTERVAL -1 DAY), '%Y-%m-%d');
진행 상황
1. 쇼핑몰 주문 자동 생성
- 주소, 채널, 주문자명 배열에서 난수를 이용해 랜덤 주문 목록 생성
- 주소: 네이버 지도에 'OO도 아파트' 검색해서 짧은 주소 선택
- 주문자명: 랜덤 이름 생성기 사용
- 특정 화주사의 상품 목록, 구매 퍼센트(소비자가*0.9의 가격으로 구매), 구매 수량 배열에서 난수를 이용해 랜덤 주문 상품 생성
@Transactional
public List<ShoppingProductDTO> register(Long sellerNo) {
List<SimpleProductDTO> products = productService.findByAllProductSimpledata(sellerNo);
String[] addresses = {"서울 강남구 개포동 190", "서울 용산구 서빙고로 17",
"경기 파주시 심학산로 385", "경기 의정부시 용민로 10",
"강원 춘천시 동면 만천로 242", "강원 춘천시 안마산로 133",
"충북 청주시 상당구 방서동", "충북 청주시 흥덕구 대농로 55",
"충남 아산시 갈산샛들로 67", "충남 천안시 서북구 미라2길 19",
"전북 군산시 하나운2길 15", "전북 전주시 덕진구 호반로 11",
"전남 여수시 웅천중앙로 47", "전남 목포시 옥암로 156",
"경북 구미시 옥계북로 69", "경북 구미시 문장로 111",
"경남 양산시 물금읍 새실로 11", "경남 진주시 새평거로 30"};
String[] channels = {"11번가", "스마트스토어", "G마켓", "카카오선물하기", "SSG닷컴", "옥션"};
String[] orderers = {"임시아", "장원우", "고서준", "문민경", "오진아", "강다운", "정다운"};
double[] sellingPct = {1.0, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4};
List<ShoppingProductDTO> shoppingProductDTOs = new ArrayList<>();
List<String> productNos = new ArrayList<>();
List<ShoppingProduct> shoppingProducts = new ArrayList<>();
String address = addresses[getRandomNumber(addresses.length)];
String channel = channels[getRandomNumber(channels.length)];
String orderer = orderers[getRandomNumber(orderers.length)];
Seller seller = sellerService.findById(sellerNo);
StringBuilder exportNo = new StringBuilder("S");
exportNo.append(sellerNo);
exportNo.append("-");
exportNo.append(new Date().getTime() % 10000000);
Shopping shopping = Shopping
.builder()
.exportNo(exportNo.toString())
.seller(seller)
.salesChannel(channel)
.address(address)
.orderName(orderer)
.build();
Shopping savedShopping = shoppingRepository.save(shopping);
int numOfProduct = getRandomNumber(5) + 1;
while(shoppingProductDTOs.size() < numOfProduct) {
int idx = getRandomNumber(products.size());
int amount = getRandomNumber(10) + 1;
double pct = sellingPct[getRandomNumber(sellingPct.length)];
while(productNos.indexOf(products.get(idx).getProductNo()) != -1) {
idx = getRandomNumber(products.size());
}
productNos.add(products.get(idx).getProductNo());
ShoppingProductDTO shoppingProductDTO = ShoppingProductDTO
.builder()
.productNo(products.get(idx).getProductNo())
.amount(amount)
.sellingPrice((int) (products.get(idx).getConsumerPrice() * amount * pct))
.build();
shoppingProductDTOs.add(shoppingProductDTO);
}
for(ShoppingProductDTO shoppingProductDTO: shoppingProductDTOs) {
Product findedProduct = productService.findByProductNo(shoppingProductDTO.getProductNo());
shoppingProducts.add(shoppingProductDTO.toShoppingProduct(findedProduct, savedShopping));
}
List<ShoppingProduct> savedProduct = shoppingProductRepository.saveAll(shoppingProducts);
if(savedProduct == null || savedShopping == null) return null;
return findShoppings(sellerNo);
}
2. 시연 데이터 생성중
참고 자료