diff --git a/WebContent/WEB-INF/view/productionplanning/mBomPopupLeft.jsp b/WebContent/WEB-INF/view/productionplanning/mBomPopupLeft.jsp index ee44d64..7d18f84 100644 --- a/WebContent/WEB-INF/view/productionplanning/mBomPopupLeft.jsp +++ b/WebContent/WEB-INF/view/productionplanning/mBomPopupLeft.jsp @@ -45,6 +45,9 @@ var _tabulGrid; // 프로젝트 수주수량 (최상위 프레임에서 가져오기) var projectQuantity = 1; // 기본값 +// 소재 목록 전역 변수 +var materialList = []; + $(function(){ // 최상위 프레임(mBomPopupHeaderFs.jsp)에서 프로젝트 수주수량 가져오기 try { @@ -58,10 +61,37 @@ $(function(){ console.log("프로젝트 수주수량 가져오기 실패:", e); } + // 소재 목록 로드 + fn_loadMaterialList(); + // Tabulator 초기화 fn_initGrid(); }); +// 소재 목록 로드 +function fn_loadMaterialList() { + $.ajax({ + url: '/admin/getMaterialList.do', + method: 'POST', + async: false, + success: function(response) { + if(response && response.list) { + // 중복 제거하여 소재 코드만 추출 + var uniqueMaterials = {}; + response.list.forEach(function(item) { + uniqueMaterials[item.MATERIAL_CODE] = true; + }); + materialList = Object.keys(uniqueMaterials); + console.log("소재 목록 로드 완료:", materialList); + } + }, + error: function() { + console.error("소재 목록 로드 실패"); + materialList = []; + } + }); +} + // Tabulator 그리드 초기화 function fn_initGrid() { var maxLevel = ${empty MAXLEV ? 1 : MAXLEV}; @@ -312,26 +342,7 @@ function fn_initGrid() { field: 'RAW_MATERIAL', editor: 'list', editorParams: { - values: ['SM45C', 'STS304', 'STS316', 'AL6061', 'AL7075'] // TODO: 실제 소재 목록으로 교체 - }, - editable: function(cell) { - return cell.getRow().getData().SUPPLY_TYPE === '사급'; - }, - formatter: function(cell) { - var data = cell.getRow().getData(); - if(data.SUPPLY_TYPE === '자급') return '-'; - return cell.getValue() || ''; - } - }, - { - headerHozAlign: 'center', - hozAlign: 'left', - width: 100, - title: '사이즈', - field: 'SIZE', - editor: 'list', - editorParams: { - values: ['Φ10', 'Φ20', 'Φ30', '10x10', '20x20'] // TODO: 실제 사이즈 목록으로 교체 + values: materialList // 로드된 소재 목록 사용 }, editable: function(cell) { return cell.getRow().getData().SUPPLY_TYPE === '사급'; @@ -342,12 +353,77 @@ function fn_initGrid() { return cell.getValue() || ''; }, cellEdited: function(cell) { - // 소재, 사이즈 선택 시 소재품번 자동 생성 + // 소재 선택 시 사이즈 초기화 + var row = cell.getRow(); + row.update({ + SIZE: '', + RAW_MATERIAL_NO: '' + }); + } + }, + { + headerHozAlign: 'center', + hozAlign: 'left', + width: 100, + title: '사이즈', + field: 'SIZE', + editor: 'list', + editorParams: function(cell) { + // 선택된 소재에 따라 동적으로 사이즈 목록 로드 + var data = cell.getRow().getData(); + var materialCode = data.RAW_MATERIAL; + + if(!materialCode) { + return {values: []}; + } + + // 서버에서 해당 소재의 사이즈 목록 가져오기 + var sizes = []; + $.ajax({ + url: '/admin/getMaterialSizes.do', + method: 'POST', + data: {materialCode: materialCode}, + async: false, + success: function(response) { + if(response && response.list) { + sizes = response.list.map(function(item) { + return item.SIZE_SPEC; + }); + } + } + }); + + return {values: sizes}; + }, + editable: function(cell) { + var data = cell.getRow().getData(); + return data.SUPPLY_TYPE === '사급' && data.RAW_MATERIAL; + }, + formatter: function(cell) { + var data = cell.getRow().getData(); + if(data.SUPPLY_TYPE === '자급') return '-'; + return cell.getValue() || ''; + }, + cellEdited: function(cell) { + // 사이즈 선택 시 소재품번 자동 조회 var row = cell.getRow(); var data = row.getData(); + if(data.RAW_MATERIAL && data.SIZE) { - var materialNo = data.RAW_MATERIAL + '-' + data.SIZE; - row.update({RAW_MATERIAL_NO: materialNo}); + // 서버에서 소재품번 조회 + $.ajax({ + url: '/admin/getMaterialPartNo.do', + method: 'POST', + data: { + materialCode: data.RAW_MATERIAL, + sizeSpec: data.SIZE + }, + success: function(response) { + if(response && response.MATERIAL_PART_NO) { + row.update({RAW_MATERIAL_NO: response.MATERIAL_PART_NO}); + } + } + }); } } }, diff --git a/src/com/pms/controller/AdminController.java b/src/com/pms/controller/AdminController.java index 9aee2a0..104351a 100644 --- a/src/com/pms/controller/AdminController.java +++ b/src/com/pms/controller/AdminController.java @@ -4986,6 +4986,69 @@ public String clientImportFileProc(HttpServletRequest request, HttpSession sessi //return "/ajax/ajaxResult"; } + /** + * 소재 목록 조회 (중복 제거된 소재 코드) + */ + @RequestMapping("/admin/getMaterialList.do") + @ResponseBody + public Map getMaterialList(HttpServletRequest request, @RequestParam Map paramMap) { + Map resultMap = new HashMap<>(); + try { + List list = adminService.getMaterialList(paramMap); + list = CommonUtils.keyChangeUpperList(list); + resultMap.put("list", list); + resultMap.put("result", true); + } catch(Exception e) { + e.printStackTrace(); + resultMap.put("result", false); + resultMap.put("msg", "소재 목록 조회 중 오류가 발생했습니다."); + } + return resultMap; + } + /** + * 특정 소재의 사이즈 목록 조회 + */ + @RequestMapping("/admin/getMaterialSizes.do") + @ResponseBody + public Map getMaterialSizes(HttpServletRequest request, @RequestParam Map paramMap) { + Map resultMap = new HashMap<>(); + try { + List list = adminService.getMaterialSizes(paramMap); + list = CommonUtils.keyChangeUpperList(list); + resultMap.put("list", list); + resultMap.put("result", true); + } catch(Exception e) { + e.printStackTrace(); + resultMap.put("result", false); + resultMap.put("msg", "사이즈 목록 조회 중 오류가 발생했습니다."); + } + return resultMap; + } + + /** + * 소재 코드 + 사이즈로 소재품번 조회 + */ + @RequestMapping("/admin/getMaterialPartNo.do") + @ResponseBody + public Map getMaterialPartNo(HttpServletRequest request, @RequestParam Map paramMap) { + Map resultMap = new HashMap<>(); + try { + Map result = adminService.getMaterialPartNo(paramMap); + if(result != null) { + result = CommonUtils.toUpperCaseMapKey(result); + resultMap.putAll(result); + resultMap.put("result", true); + } else { + resultMap.put("result", false); + resultMap.put("msg", "해당 소재품번을 찾을 수 없습니다."); + } + } catch(Exception e) { + e.printStackTrace(); + resultMap.put("result", false); + resultMap.put("msg", "소재품번 조회 중 오류가 발생했습니다."); + } + return resultMap; + } } diff --git a/src/com/pms/mapper/admin.xml b/src/com/pms/mapper/admin.xml index d365846..5d2fbe0 100644 --- a/src/com/pms/mapper/admin.xml +++ b/src/com/pms/mapper/admin.xml @@ -9325,5 +9325,45 @@ SELECT ) RESULT --> + + + + + + + + + \ No newline at end of file diff --git a/src/com/pms/service/AdminService.java b/src/com/pms/service/AdminService.java index f1a504b..3fa380c 100644 --- a/src/com/pms/service/AdminService.java +++ b/src/com/pms/service/AdminService.java @@ -7263,6 +7263,42 @@ public class AdminService extends BaseService { } } + /** + * 소재 목록 조회 + */ + public List getMaterialList(Map paramMap) throws Exception { + SqlSession sqlSession = SqlMapConfig.getInstance().getSqlSession(); + try { + return sqlSession.selectList("admin.getMaterialList", paramMap); + } finally { + sqlSession.close(); + } + } + + /** + * 특정 소재의 사이즈 목록 조회 + */ + public List getMaterialSizes(Map paramMap) throws Exception { + SqlSession sqlSession = SqlMapConfig.getInstance().getSqlSession(); + try { + return sqlSession.selectList("admin.getMaterialSizes", paramMap); + } finally { + sqlSession.close(); + } + } + + /** + * 소재 코드 + 사이즈로 소재품번 조회 + */ + public Map getMaterialPartNo(Map paramMap) throws Exception { + SqlSession sqlSession = SqlMapConfig.getInstance().getSqlSession(); + try { + return (Map) sqlSession.selectOne("admin.getMaterialPartNo", paramMap); + } finally { + sqlSession.close(); + } + } + }