package com.oqpo.api.service.stinfo; import com.oqpo.api.client.oqlink.OqlinkClient; import com.oqpo.api.client.oqlink.dto.OqScmMenuModel; import com.oqpo.api.client.oqlink.dto.OqScmStorePriceChangeReqModel; import com.oqpo.api.client.oqlink.dto.OqScmStorePriceChangeResModel; import com.oqpo.api.client.oqlink.util.HmacUtil; import com.oqpo.api.entity.CodeEntity; import com.oqpo.api.entity.oper.FileEntity; import com.oqpo.api.entity.oper.UserMngEntity; import com.oqpo.api.entity.stinfo.*; import com.oqpo.api.enums.SystemMessageCode; import com.oqpo.api.exception.GlobalException; import com.oqpo.api.mapper.FileMapper; import com.oqpo.api.mapper.oper.UserMngMapper; import com.oqpo.api.mapper.stinfo.ItemMapper; import com.oqpo.api.mapper.stinfo.ItemUnitMapper; import com.oqpo.api.mapper.stinfo.StoreBaseInfoMapper; import com.oqpo.api.mapper.stinfo.StoreItemUnitMapper; import com.oqpo.api.service.CommonService; import com.oqpo.api.util.StringUtil; import com.oqpo.api.web.dto.request.GridRequest; import com.oqpo.api.web.dto.request.stinfo.item.DelItemInfolRequest; import com.oqpo.api.web.dto.request.stinfo.item.SaveItemClassMngInfolRequest; import com.oqpo.api.web.dto.request.stinfo.item.SaveItemInfolRequest; import com.oqpo.api.web.dto.request.stinfo.itemUnit.SaveItemUnitInfolRequest; import com.oqpo.api.web.dto.request.stinfo.itemUnit.SaveStoreItemUnitInfolRequest; import com.oqpo.api.web.dto.request.stinfo.itemUnit.StoreItemUnitInfolRequest; import com.oqpo.api.web.dto.response.GridResponse; import com.oqpo.api.web.dto.response.code.CodeSearchListResponse; import com.oqpo.api.web.dto.response.stinfo.item.*; import com.oqpo.api.web.dto.response.stinfo.itemUnit.ItemUnitInfoResponse; import com.oqpo.api.web.dto.response.stinfo.itemUnit.ItemUnitSearchResponse; import com.oqpo.api.web.dto.response.stinfo.itemUnit.StoreItemUnitInfoResponse; import com.oqpo.api.web.dto.response.stinfo.itemUnit.StoreItemUnitSearchResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.lang.reflect.GenericDeclaration; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.stream.Collectors; @Service @Slf4j public class ItemUnitService extends CommonService { @Autowired private ItemUnitMapper itemUnitMapper; @Autowired private ItemMapper itemMapper; @Autowired private StoreItemUnitMapper storeItemUnitMapper; @Autowired private StoreBaseInfoMapper storeBaseInfoMapper; @Autowired private FileMapper fileMapper; @Autowired private UserMngMapper userMngMapper; @Autowired private OqlinkClient oqlinkClient; /* 브랜드 공급사 단가 리스트 조회 */ public GridResponse selectItemUnitGridList(String sBrandId, String fromDt, String toDt, String sUnitStCd, String sSpplyId, String sClass1, String sClass2, String sClass3, String sClass4, String sItemNm, GridRequest gridRequest) throws Exception { int gridPage = gridRequest.getGridPage(); int gridSize = gridRequest.getGridSize(); fromDt = fromDt == null ? null : fromDt.replace(".", ""); toDt = toDt == null ? null : toDt.replace(".", ""); int gridRecords = itemUnitMapper.selectItemUnitGridCnt(sBrandId, fromDt, toDt, sUnitStCd, sSpplyId, sClass1, sClass2, sClass3, sClass4, sItemNm); int gridTotal = fnCalculateGridTotal(gridSize, gridRecords); List entities = itemUnitMapper.selectItemUnitGridList(sBrandId, fromDt, toDt, sUnitStCd, sSpplyId, sClass1, sClass2, sClass3, sClass4, sItemNm, gridRequest); List gridRows = entities.stream() .map(m -> ItemUnitSearchResponse.builder() .viewCd("R") .brandUnitUnqNo(m.getBrandUnitUnqNo()) .brandId(m.getBrandId()) .itemId(m.getItemId()) .itemNm(m.getItemNm()) .spplyId(m.getSpplyId()) .spplyNm(m.getSpplyNm()) .contSttDt(m.getContSttDt() == null ? "" : m.getContSttDt()) .contEndDt(m.getContEndDt() == null ? "" : m.getContEndDt()) .curr(m.getCurr() == null ? "" : m.getCurr()) .currNm(m.getCurrNm() == null ? "" : m.getCurrNm()) .unit(m.getUnit() == null ? "" : m.getUnit()) .unitNm(m.getUnitNm() == null ? "" : m.getUnitNm()) .unitAmt(m.getUnitAmt() == null ? 0 : m.getUnitAmt()) .leadTime(m.getLeadTime() == null ? 0 : m.getLeadTime()) .spplyItemId(m.getSpplyItemId() == null ? "" : m.getSpplyItemId()) .unitStCd(m.getUnitStCd() == null ? "" : m.getUnitStCd()) .unitStNm(m.getUnitStNm() == null ? "" : m.getUnitStNm()) .stddQty(m.getStddQty() == null ? 0 : m.getStddQty()) .build()) .collect(Collectors.toList()); return GridResponse.toDTO(gridPage, gridTotal, gridRecords, gridRows); } /* 공급사단가 리스트 조회 */ public GridResponse selectSpplyItemUnitGridList(String sBrandId, String fromDt, String toDt, String sUnitStCd, String sSpplyId, String sItemNm, GridRequest gridRequest) throws Exception { int gridPage = gridRequest.getGridPage(); int gridSize = gridRequest.getGridSize(); fromDt = fromDt == null ? null : fromDt.replace(".", ""); toDt = toDt == null ? null : toDt.replace(".", ""); int gridRecords = itemUnitMapper.selectItemUnitGridCnt(sBrandId, fromDt, toDt, sUnitStCd, sSpplyId, "", "", "", "", sItemNm); int gridTotal = fnCalculateGridTotal(gridSize, gridRecords); List entities = itemUnitMapper.selectItemUnitGridList(sBrandId, fromDt, toDt, sUnitStCd, sSpplyId, "", "", "", "", sItemNm, gridRequest); List gridRows = entities.stream() .map(m -> ItemUnitSearchResponse.builder() .viewCd("R") .brandUnitUnqNo(m.getBrandUnitUnqNo()) .brandId(m.getBrandId()) .itemId(m.getItemId()) .itemNm(m.getItemNm()) .spplyId(m.getSpplyId()) .spplyNm(m.getSpplyNm()) .contSttDt(m.getContSttDt() == null ? "" : m.getContSttDt()) .contEndDt(m.getContEndDt() == null ? "" : m.getContEndDt()) .curr(m.getCurr() == null ? "" : m.getCurr()) .currNm(m.getCurrNm() == null ? "" : m.getCurrNm()) .unit(m.getUnit() == null ? "" : m.getUnit()) .unitNm(m.getUnitNm() == null ? "" : m.getUnitNm()) .unitAmt(m.getUnitAmt() == null ? 0 : m.getUnitAmt()) .leadTime(m.getLeadTime() == null ? 0 : m.getLeadTime()) .spplyItemId(m.getSpplyItemId() == null ? "" : m.getSpplyItemId()) .unitStCd(m.getUnitStCd() == null ? "" : m.getUnitStCd()) .unitStNm(m.getUnitStNm() == null ? "" : m.getUnitStNm()) .stddQty(m.getStddQty() == null ? 0 : m.getStddQty()) .build()) .collect(Collectors.toList()); return GridResponse.toDTO(gridPage, gridTotal, gridRecords, gridRows); } /* 공급사 단가 정보 */ public ItemUnitInfoResponse selectItemUnitInfo(String brandId, String brandUnitUnqNo) throws Exception { ItemUnitEntity entity = itemUnitMapper.selectItemUnitInfo(brandId, brandUnitUnqNo); List fileContInfoList = null; if (!StringUtil.isEmpty(entity.getShortContFileNo())) { fileContInfoList = fileMapper.selectFileList(entity.getShortContFileNo()); } else { fileContInfoList = new ArrayList(); } return ItemUnitInfoResponse.toDTO(entity, fileContInfoList); } /* 공급사 단가 저장 */ @Transactional public void saveItemUnitInfo(String userId, SaveItemUnitInfolRequest saveItemUnitInfolRequest) throws Exception { try { ItemUnitEntity entity = new ItemUnitEntity(); entity.setBrandUnitUnqNo(saveItemUnitInfolRequest.getBrandUnitUnqNo()); entity.setBrandId(saveItemUnitInfolRequest.getBrandId()); entity.setBrandNm(saveItemUnitInfolRequest.getBrandNm()); entity.setItemId(saveItemUnitInfolRequest.getItemId()); entity.setItemNm(saveItemUnitInfolRequest.getItemNm()); entity.setSpplyId(saveItemUnitInfolRequest.getSpplyId()); entity.setSpplyNm(saveItemUnitInfolRequest.getSpplyNm()); entity.setContSttDt(saveItemUnitInfolRequest.getContSttDt().replaceAll("\\.", "")); entity.setContEndDt(saveItemUnitInfolRequest.getContEndDt().replaceAll("\\.", "")); entity.setCurr(saveItemUnitInfolRequest.getCurr()); entity.setUnit(saveItemUnitInfolRequest.getUnit()); entity.setUnitAmt(saveItemUnitInfolRequest.getUnitAmt()); entity.setLeadTime(saveItemUnitInfolRequest.getLeadTime()); entity.setDlvCndt(saveItemUnitInfolRequest.getDlvCndt()); entity.setShortContFileNo(saveItemUnitInfolRequest.getShortContFileNo()); entity.setSpplyItemId(saveItemUnitInfolRequest.getSpplyItemId()); entity.setUnitStCd(saveItemUnitInfolRequest.getUnitStCd()); entity.setStddQty(saveItemUnitInfolRequest.getStddQty()); entity.setStoreSaleStddQty(saveItemUnitInfolRequest.getStoreSaleStddQty()); entity.setStoreSaleUnitAmt(saveItemUnitInfolRequest.getStoreSaleUnitAmt()); if ("C".equals(saveItemUnitInfolRequest.getViewCd())) { //selectItemUnitDupContInfoNo 날짜 기준 계약 존재여부 파악 int dupCnt = itemUnitMapper.selectItemUnitDupCnt(entity.getBrandId(), entity.getSpplyId(), entity.getItemId(), entity.getContSttDt()); if (dupCnt != 0) { // 이미 진행중인 계약단가가 있습니다. throw new GlobalException(SystemMessageCode.ERR_EXISTUNIT); } } else { String passChk = itemUnitMapper.selectItemUnitChaPass(entity.getBrandUnitUnqNo(), entity.getContSttDt()); if ("N".equals(passChk)) { // 시작일은 변경 불가 throw new GlobalException(SystemMessageCode.ERR_NOTCHGDT); } } if (StringUtil.isEmpty(entity.getBrandUnitUnqNo())) { itemUnitMapper.insertItemUnitInfo(userId, entity); } else { itemUnitMapper.updateItemUnitInfo(userId, entity); } } catch (GlobalException e) { e.printStackTrace(); //e.getStackTrace(); throw new GlobalException(e.getSystemMessageCode()); } catch (Exception e) { e.printStackTrace(); //e.getStackTrace(); throw new RuntimeException(); } } /* 브랜드 매장 단가 리스트 조회 */ public GridResponse selectStoreItemUnitGridList(String userId, String sBrandId, String sStoreId, String sStoreNm, GridRequest gridRequest) throws Exception { int gridPage = gridRequest.getGridPage(); int gridSize = gridRequest.getGridSize(); //사용자 정보로 매장정보 가져오기 UserMngEntity uEntity = userMngMapper.selectGroupUserInfo(userId); if ("50".equals(uEntity.getAuthTpCd())) { if (StringUtil.isEmpty(sStoreId)) { throw new GlobalException(SystemMessageCode.ERR_NONSTOREID); } else { if (!sStoreId.equals(uEntity.getStoreId())) { throw new GlobalException(SystemMessageCode.ERR_NOTSTOREBELONG); } } } int gridRecords = storeItemUnitMapper.selectStoreItemUnitGridCnt(sBrandId, sStoreId, sStoreNm); int gridTotal = fnCalculateGridTotal(gridSize, gridRecords); List entities = storeItemUnitMapper.selectStoreItemUnitGridList(sBrandId, sStoreId, sStoreNm, gridRequest); List gridRows = entities.stream() .map(m -> StoreItemUnitSearchResponse.builder() .viewCd("R") .brandId(m.getBrandId()) .brandNm(m.getBrandNm()) .storeId(m.getStoreId()) .storeNm(m.getStoreNm()) .contSttDt(m.getContSttDt()) .contEndDt(m.getContEndDt()) .sysRegDttm(m.getSysRegDttm()) .itemCnt(m.getItemCnt()) .build()) .collect(Collectors.toList()); return GridResponse.toDTO(gridPage, gridTotal, gridRecords, gridRows); } /* 매장용 매장 단가 리스트 조회 */ /* public GridResponse selectSstoreItemUnitGridList(String sBrandId, String sStoreId, GridRequest gridRequest) throws Exception { int gridPage = gridRequest.getGridPage(); int gridSize = gridRequest.getGridSize(); int gridRecords = storeItemUnitMapper.selectSstoreItemUnitGridCnt( sBrandId, sStoreId ); int gridTotal = fnCalculateGridTotal(gridSize, gridRecords); List entities = storeItemUnitMapper.selectSstoreItemUnitGridList(sBrandId, sStoreId, gridRequest); List gridRows = entities.stream() .map(m -> StoreItemUnitSearchResponse.builder() .viewCd("R") .brandId(m.getBrandId()) .brandNm(m.getBrandNm()) .storeId(m.getStoreId()) .storeNm(m.getStoreNm()) .contSttDt(m.getContSttDt()) .contEndDt(m.getContEndDt()) .sysRegDttm(m.getSysRegDttm()) .itemCnt(m.getItemCnt()) .build()) .collect(Collectors.toList()); return GridResponse.toDTO(gridPage, gridTotal, gridRecords, gridRows); } */ /* 신규 매장단가 정보 초기 세팅값 */ /* 매장 단가 정보 */ public StoreItemUnitInfoResponse selectStoreNewItemUnitInfo(String brandId) throws Exception { List entities = storeItemUnitMapper.selectStoreNewItemUnitInfo(brandId); return StoreItemUnitInfoResponse.toDTO(entities); } /* 매장 단가 정보 */ public StoreItemUnitInfoResponse selectStoreItemUnitInfo(String userId, StoreItemUnitInfolRequest storeItemUnitInfolRequest) throws Exception { //사용자 정보로 매장정보 가져오기 UserMngEntity uEntity = userMngMapper.selectGroupUserInfo(userId); if ("50".equals(uEntity.getAuthTpCd())) { if (StringUtil.isEmpty(storeItemUnitInfolRequest.getStoreId())) { throw new GlobalException(SystemMessageCode.ERR_NONSTOREID); } else { if (!storeItemUnitInfolRequest.getStoreId().equals(uEntity.getStoreId())) { throw new GlobalException(SystemMessageCode.ERR_NOTSTOREBELONG); } } } String brandId = storeItemUnitInfolRequest.getBrandId(); String storeId = storeItemUnitInfolRequest.getStoreId(); String contSttDt = storeItemUnitInfolRequest.getContSttDt(); String contEndDt = storeItemUnitInfolRequest.getContEndDt(); contSttDt = contSttDt == null ? null : contSttDt.replace(".", ""); contEndDt = contEndDt == null ? null : contEndDt.replace(".", ""); List entities = storeItemUnitMapper.selectStoreItemUnitInfo(brandId, storeId, contSttDt, contEndDt); return StoreItemUnitInfoResponse.toDTO(entities); } /* 매장 단가 저장 */ @Transactional public void saveStroeItemUnitInfo(String userId, SaveStoreItemUnitInfolRequest saveStoreItemUnitInfolRequest) throws Exception { try { StoreItemUnitEntity entity = new StoreItemUnitEntity(); entity.setBrandId(saveStoreItemUnitInfolRequest.getBrandId()); entity.setStoreId(saveStoreItemUnitInfolRequest.getStoreId()); entity.setContSttDt(saveStoreItemUnitInfolRequest.getContSttDt().replaceAll("\\.", "")); entity.setContEndDt(saveStoreItemUnitInfolRequest.getContEndDt().replaceAll("\\.", "")); //신규 // 종료일짜 변경 여부 확인 String chgEndDtYn = "N"; if ("U".toString().equals(saveStoreItemUnitInfolRequest.getViewCd())) { String lastEndDt = storeItemUnitMapper.selectStoreItemUnitEndDtInfo(entity.getBrandId(), entity.getStoreId(), entity.getContSttDt()); if (!lastEndDt.equals(entity.getContEndDt())) { chgEndDtYn = "Y"; } } List gridUpdateData = saveStoreItemUnitInfolRequest.toCodeEntities(saveStoreItemUnitInfolRequest.getGridUpdateData()); List gridInsertData = saveStoreItemUnitInfolRequest.toCodeEntities(saveStoreItemUnitInfolRequest.getGridInsertData()); if (gridInsertData.size() > 0) { for (int k = 0; k < gridInsertData.size(); k++) { if ("C".toString().equals(saveStoreItemUnitInfolRequest.getViewCd())) { gridInsertData.get(k).setContSttDt(entity.getContSttDt()); gridInsertData.get(k).setContEndDt(entity.getContEndDt()); } else { gridInsertData.get(k).setContSttDt(gridInsertData.get(k).getContSttDt().replaceAll("\\.", "")); gridInsertData.get(k).setContEndDt(gridInsertData.get(k).getContEndDt().replaceAll("\\.", "")); } } } if (gridUpdateData.size() > 0) { for (int k = 0; k < gridUpdateData.size(); k++) { gridUpdateData.get(k).setContSttDt(gridUpdateData.get(k).getContSttDt().replaceAll("\\.", "")); gridUpdateData.get(k).setContEndDt(gridUpdateData.get(k).getContEndDt().replaceAll("\\.", "")); } } // 신규일경우 계약기간 날짜 체크함 if ("C".toString().equals(saveStoreItemUnitInfolRequest.getViewCd())) { SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd"); Date chkenddate = formatter.parse(entity.getContEndDt()); Date chksttdate = formatter.parse(entity.getContSttDt()); int result1 = chkenddate.compareTo(chksttdate); // 시작일과 종료일이 반대기간으로 되어져있을 경우 if (result1 < 0) { throw new GlobalException(SystemMessageCode.ERR_CHGDTOPP); } StoreItemUnitEntity dtEntity = storeItemUnitMapper.selectStoreItemUnitContDtInfo(entity.getBrandId(), entity.getStoreId()); if (dtEntity.getContSttDt() != null && !dtEntity.getContSttDt().equals("")) { // 서로 상이하면 기존 종료일자는 전송시작일보다 클경우 오류 // 문자열 -> Date Date dtEnddate = formatter.parse(dtEntity.getContEndDt()); Date sttdate = formatter.parse(entity.getContSttDt()); int result = dtEnddate.compareTo(sttdate); if (result > 0) { // 진행중 단가계약이 있습니다. throw new GlobalException(SystemMessageCode.ERR_EXISTUNIT); } } } if (gridInsertData.size() > 0) { storeItemUnitMapper.insertStoreItemUnitInfo(userId, entity.getBrandId(), entity.getStoreId(), entity.getContSttDt(), entity.getContEndDt(), gridInsertData); } if (gridUpdateData.size() > 0) { storeItemUnitMapper.updateStoreItemUnitInfo(userId, entity.getBrandId(), entity.getStoreId(), entity.getContSttDt(), entity.getContEndDt(), gridUpdateData); } // 수정에 대해 날짜 변동시 전체 변동처리함 if ("Y".toString().equals(chgEndDtYn)) { storeItemUnitMapper.updateStoreItemUnitChgContEnd(entity.getBrandId(), entity.getStoreId(), entity.getContSttDt(), entity.getContEndDt()); } // TODO 오더퀸 연동 StoreBaseInfoEntity storeInfo = storeBaseInfoMapper.selectStoreInfo(saveStoreItemUnitInfolRequest.getBrandId(), saveStoreItemUnitInfolRequest.getStoreId()); if (!StringUtil.isEmpty(storeInfo.getOqBrandId()) && !StringUtil.isEmpty(storeInfo.getOqStoreId())) { List menuList = new ArrayList<>(); // 등록 리스트 처리 for (StoreItemUnitEntity item : gridInsertData) { OqScmMenuModel menu = toOqScmMenuModel(saveStoreItemUnitInfolRequest, item); menuList.add(menu); } // 수정 리스트 처리 for (StoreItemUnitEntity item : gridUpdateData) { OqScmMenuModel menu = toOqScmMenuModel(saveStoreItemUnitInfolRequest, item); menuList.add(menu); } if (menuList.size() > 0) { OqScmStorePriceChangeReqModel req = new OqScmStorePriceChangeReqModel(); req.setBrandCd(storeInfo.getOqBrandId()); req.setStoreNo(storeInfo.getOqStoreId()); req.setMenuList(menuList); log.info("IF TRANS DATA ==============================="); log.info(req.toString()); OqScmStorePriceChangeResModel res = oqlinkClient.changeScmStorePrice(HmacUtil.makeHmacValue4OqLink(req), req); log.info("IF RETURN DATA ==============================="); log.info(res.toString()); if (SystemMessageCode.BO_IF_OK.getId() == Integer.parseInt(res.getCode())) { // 오더퀸 메뉴코드 업데이트 ItemEntity itemEntity = null; for (OqScmMenuModel item : res.getMenuList()) { itemEntity = toItemEntity4OqLink(item); itemMapper.updateItemInfo4OqLinik(userId, itemEntity); } } else { throw new GlobalException(SystemMessageCode.valueOf(Integer.valueOf(res.getCode()))); } } } } catch (GlobalException e) { e.getStackTrace(); throw new GlobalException(e.getSystemMessageCode()); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(); } } private ItemEntity toItemEntity4OqLink(OqScmMenuModel item) { ItemEntity itemEntity = new ItemEntity(); itemEntity.setItemId(item.getItemId()); itemEntity.setOqMenuCd(item.getMenuCd()); return itemEntity; } private OqScmMenuModel toOqScmMenuModel(SaveStoreItemUnitInfolRequest saveStoreItemUnitInfolRequest, StoreItemUnitEntity item) throws Exception { ItemEntity itemInfo = itemMapper.selectItemInfo(saveStoreItemUnitInfolRequest.getBrandId(), item.getItemId()); OqScmMenuModel menu = new OqScmMenuModel(); menu.setItemId(item.getItemId()); // 품목아이디 menu.setSupplyPrice(item.getUnitAmt().intValue()); // 단가금액 menu.setMenuCd(itemInfo == null || StringUtil.isEmpty(itemInfo.getOqMenuCd()) ? null : itemInfo.getOqMenuCd()); return menu; } }