[프로젝트] 웹 siCloud - day주말

_bean_·2023년 8월 6일
0

[팀 프로젝트] siCloud

목록 보기
15/21
post-thumbnail

오류 및 문제점

1. String을 Timestamp로 변경

  • 문제점: yyyy-MM-dd 형식의 문자열을 Timestamp로 변경하고자 한다.
  • 해결 방안: SimpleDateFormat을 이용해 Date로 만든 후 getTime()을 이용한다.
SimpleDateFormat pattern = new SimpleDateFormat("yyyy-MM-dd");
Timestamp time = null;
try {
	Date date = pattern.parse(string);
	time = new Timestamp(date.getTime());
} catch (ParseException e) {
	e.printStackTrace();
}
return time;

2. MySQL null 처리

  • 문제점: 쿼리를 실행할 때 모든 값이 필요해 outer join을 사용하지만 where절에서 null값이 걸러진다.
  • 해결 방안: IFNULL() 메서드를 이용해 null 값을 채워준다.
WHERE IFNULL(end_date, SYSDATE()) <= DATE_ADD(SYSDATE(), INTERVAL 0 MONTH)

3. MySQL 조건문

  • 문제점: select문에서 사용할 조건을 다르게 주고자 한다.
  • 해결 방안: if 조건문을 이용해 각각의 상황에 대해 조건을 준다.
WHERE IFNULL(order_status, '') LIKE if(0 > 0, '출고완료', '%')

진행 상황

1. 3PL 남은 창고 자리 조회

  • 계약시 남은 자리 중 선택해 화주사를 할당
public List<WarehouseDTO> findLeftLocation(Long threePLNo) {
	List<WarehouseDTO> warehouseDTOs = new ArrayList<>();
	List<Warehouse> warehouses = warehouseRepository.findByWarehouseNotInMatching(threePLNo);
		
	for(Warehouse warehouse : warehouses) {
		WarehouseDTO warehouseDTO = WarehouseDTO.builder()
				.location(warehouse.getLocation())
				.build();
		warehouseDTOs.add(warehouseDTO);
	}
		
	return warehouseDTOs;
}

2. 화주사와 계약

  • 트리거
    • 계약시 3PL 계약한 화주사수 + 1
    • 계약 종료시 매칭 히스토리에 insert, 3PL 계약한 화주사수 - 1
-- 계약
DELIMITER //
CREATE TRIGGER trigger_matching_inserted
AFTER INSERT ON matching
FOR EACH ROW
BEGIN
	UPDATE threepl SET cnt_contracted = cnt_contracted + 1
	WHERE threepl_no = (SELECT threepl_no FROM warehouse
		WHERE warehouse_no = NEW.warehouse_no);
END //
DELIMITER ;

-- 계약 종료
DELIMITER //
CREATE TRIGGER trigger_history_matching_deleted
AFTER DELETE ON matching
FOR EACH ROW
BEGIN
	INSERT INTO matching_history(history_matching_no, updated_date, updated_type, matching_no, seller_no, end_date, warehouse_no)
	VALUES(seq_nextval('seq_history'), CURRENT_TIMESTAMP(), 'DELETED', OLD.matching_no, OLD.seller_no, OLD.end_date, OLD.warehouse_no);
	UPDATE threepl SET cnt_contracted = cnt_contracted - 1
	WHERE threepl_no = (SELECT threepl_no FROM warehouse
		WHERE warehouse_no = OLD.warehouse_no);
END //
DELIMITER ;
  • 서비스 코드
public boolean contract(MatchingDTO matchingDTO) {
	Seller seller = sellerService.findById(matchingDTO.getSellerNo());
	Warehouse warehouse = warehouseService.findByLocation(matchingDTO.getLocation(), matchingDTO.getThreePLNo());
		
	if(warehouse == null) return false;
		
	Matching matching = Matching
			.builder()
			.endDate(TimestampUtil.convertStringToTimestamp(matchingDTO.getEndDate()))
			.seller(seller)
			.warehouse(warehouse)
			.build();
		
	Matching savedMatching = matchingRepository.save(matching);
	
	return savedMatching != null;
}

3. 조건에 맞는 화주사 검색 진행중

  • SQL로는 결과가 잘 나오나 SpringBoot에서는 빈 리스트가 조회되는 상황
// SellerService.java
@Query(value = "SELECT seller.seller_no, company_name, group_name, end_date "
		+ "FROM seller "
		+ "	JOIN product_group "
		+ "	ON seller.product_group_no = product_group.product_group_no "
		+ "	LEFT OUTER JOIN matching "
		+ "	ON seller.seller_no = matching.seller_no "
		+ "WHERE seller.seller_no IN (SELECT seller.seller_no "
		+ "	FROM exports "
		+ "		JOIN export_product "
		+ "		ON exports.export_no = export_product.export_no "
		+ "		RIGHT OUTER JOIN seller "
		+ "		ON exports.seller_seller_no = seller.seller_no "
		+ " 	WHERE IFNULL(order_status, '') LIKE if(:exportCnt > 0, '출고완료', '%') "
		+ "	GROUP BY seller.seller_no "
		+ "	HAVING COUNT(*) >= :exportCnt) "
		+ "AND product_group.group_name LIKE '%:groupName%' "
		+ "AND seller.address LIKE '%:address%' "
		+ "AND IFNULL(end_date, SYSDATE()) <= DATE_ADD(SYSDATE(), INTERVAL :contractPeriod MONTH)", nativeQuery = true)
public List<Seller> findByMatchingCondition(@Param("groupName")String groupName, @Param("address")String address, 
		@Param("exportCnt")int exportCnt, @Param("contractPeriod")int contractPeriod);

참고 자료

profile
어쩌다 풀스택 :3

0개의 댓글