Compare commits
4 Commits
001f38d0f3
...
5df50b7247
| Author | SHA1 | Date | |
|---|---|---|---|
| 5df50b7247 | |||
| 5959604464 | |||
| b53b20945b | |||
| ba09a208cf |
@@ -433,30 +433,41 @@ var gridFn = {
|
|||||||
url: "/partMng/parsingExcelFile.do"
|
url: "/partMng/parsingExcelFile.do"
|
||||||
,datatype : "json"
|
,datatype : "json"
|
||||||
,postData:{"targetObjId":"${objid}","docType":"PART_EXCEL_IMPORT","OBJID":"${CONTRACT_OBJID}"}
|
,postData:{"targetObjId":"${objid}","docType":"PART_EXCEL_IMPORT","OBJID":"${CONTRACT_OBJID}"}
|
||||||
,loadComplete : function(data) {
|
,loadComplete : function(data) {
|
||||||
// CSV 파일에서만 LEVEL 값을 PARENT_PART_NO 컬럼에 표시
|
gridFn.footerSummary();
|
||||||
if(data && data.rows) {
|
|
||||||
for(var i = 0; i < data.rows.length; i++) {
|
|
||||||
var row = data.rows[i];
|
|
||||||
// CSV 파일이고 LEVEL 값이 있는 경우
|
|
||||||
if(row.IS_CSV === 'Y' && row.LEVEL && row.LEVEL !== '') {
|
|
||||||
// LEVEL 값을 PARENT_PART_NO 컬럼에 표시 (화면용)
|
|
||||||
grid.jqGrid('setCell', row.id, 'PARENT_PART_NO', row.LEVEL);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
gridFn.footerSummary();
|
|
||||||
}
|
|
||||||
,gridComplete : function() {
|
,gridComplete : function() {
|
||||||
//gridFn.opennEdit(); //수정가능
|
|
||||||
var valid = true;
|
var valid = true;
|
||||||
gridFn.closeEdit();
|
gridFn.closeEdit();
|
||||||
//var tempGrid = $('#expenseDetailGrid');
|
|
||||||
|
// 1번 레벨(PARENT_PART_NO가 비어있는 행)의 품번/품명을 헤더에 자동 설정
|
||||||
|
var isFirstLevelSet = false;
|
||||||
|
|
||||||
$.each(grid.getRowData(), function(i, d){
|
$.each(grid.getRowData(), function(i, d){
|
||||||
console.log(d);
|
console.log("Row data:", d);
|
||||||
|
|
||||||
|
// NOTE 검증
|
||||||
if(!fnc_isEmpty(d["NOTE"])){
|
if(!fnc_isEmpty(d["NOTE"])){
|
||||||
valid = false;
|
valid = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// PARENT_PART_NO가 비어있으면 1번 레벨 (최상위)
|
||||||
|
var parentPartNo = d["PARENT_PART_NO"] || '';
|
||||||
|
if(!isFirstLevelSet && parentPartNo === '') {
|
||||||
|
var partNo = d["PART_NO"] || '';
|
||||||
|
var partName = d["PART_NAME"] || '';
|
||||||
|
|
||||||
|
console.log("Level 1 found - PART_NO:", partNo, ", PART_NAME:", partName);
|
||||||
|
|
||||||
|
// 새로 CSV 업로드 시 항상 덮어쓰기
|
||||||
|
if(partNo !== '') {
|
||||||
|
$('#bom_part_no').val(partNo);
|
||||||
|
}
|
||||||
|
if(partName !== '') {
|
||||||
|
$('#bom_part_name').val(partName);
|
||||||
|
}
|
||||||
|
isFirstLevelSet = true;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
gridFn.opennEdit();
|
gridFn.opennEdit();
|
||||||
|
|
||||||
@@ -967,11 +978,11 @@ function fn_save(){
|
|||||||
</td>
|
</td>
|
||||||
<td style="font-size:12px;" class="align_c"><label for="bom_part_no">품번</label></td>
|
<td style="font-size:12px;" class="align_c"><label for="bom_part_no">품번</label></td>
|
||||||
<td>
|
<td>
|
||||||
<input type="text" name="bom_part_no" id="bom_part_no" required reqTitle="품번" value="<%= bomPartNo %>" style="width: 100%;"/>
|
<input type="text" name="bom_part_no" id="bom_part_no" required reqTitle="품번" value="<%= bomPartNo %>" style="width: 100%;" readonly/>
|
||||||
</td>
|
</td>
|
||||||
<td style="font-size:12px;" class="align_c"><label for="bom_part_name">품명</label></td>
|
<td style="font-size:12px;" class="align_c"><label for="bom_part_name">품명</label></td>
|
||||||
<td>
|
<td>
|
||||||
<input type="text" name="bom_part_name" id="bom_part_name" required reqTitle="품명" value="<%= bomPartName %>" style="width: 200px;"/>
|
<input type="text" name="bom_part_name" id="bom_part_name" required reqTitle="품명" value="<%= bomPartName %>" style="width: 200px;" readonly/>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
|
|||||||
@@ -949,8 +949,7 @@ function compareItemFields(before, after) {
|
|||||||
<td>
|
<td>
|
||||||
<input type="text" name="search_part_name" id="search_part_name" style="width: 300px;" value="" readonly>
|
<input type="text" name="search_part_name" id="search_part_name" style="width: 300px;" value="" readonly>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td><label for="search_mbom_part_no">M-BOM 품번</label></td>
|
<td><label for="search_mbom_part_no">M-BOM 품번</label></td>
|
||||||
<td>
|
<td>
|
||||||
<input type="text" name="search_mbom_part_no" id="search_mbom_part_no" style="width: 300px;" value="" readonly>
|
<input type="text" name="search_mbom_part_no" id="search_mbom_part_no" style="width: 300px;" value="" readonly>
|
||||||
|
|||||||
@@ -1223,10 +1223,122 @@ public class ProductionPlanningController extends BaseService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(mbomDetailList != null && !mbomDetailList.isEmpty()) {
|
if(mbomDetailList != null && !mbomDetailList.isEmpty()) {
|
||||||
|
// 할당된 E-BOM/M-BOM인 경우: 프로젝트의 PART_OBJID로 PART_MNG에서 파트 정보 조회하여 1레벨로 사용
|
||||||
|
if("ASSIGNED_EBOM".equals(bomDataType) || "ASSIGNED_MBOM".equals(bomDataType)) {
|
||||||
|
String partObjId = CommonUtils.checkNull(projectInfo.get("PART_OBJID"));
|
||||||
|
|
||||||
|
// PART_OBJID가 있으면 PART_MNG 테이블에서 파트 정보 조회
|
||||||
|
String projectPartNo = "";
|
||||||
|
String projectPartName = "";
|
||||||
|
String projectPartObjId = "";
|
||||||
|
|
||||||
|
if(!"".equals(partObjId)) {
|
||||||
|
Map<String, Object> partParam = new HashMap<>();
|
||||||
|
partParam.put("partObjId", partObjId);
|
||||||
|
Map<String, Object> partInfo = commonService.selectOne("partMng.getPartInfoByObjId", request, partParam);
|
||||||
|
|
||||||
|
if(partInfo != null) {
|
||||||
|
projectPartNo = CommonUtils.checkNull(partInfo.get("PART_NO"));
|
||||||
|
projectPartName = CommonUtils.checkNull(partInfo.get("PART_NAME"));
|
||||||
|
projectPartObjId = partObjId;
|
||||||
|
System.out.println("PART_MNG에서 파트 정보 조회 - PART_OBJID: " + partObjId + ", PART_NO: " + projectPartNo + ", PART_NAME: " + projectPartName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// PART_OBJID로 조회 실패 시 PROJECT_MGMT의 PART_NO, PART_NAME 사용 (fallback)
|
||||||
|
if("".equals(projectPartNo)) {
|
||||||
|
projectPartNo = CommonUtils.checkNull(projectInfo.get("PART_NO"));
|
||||||
|
projectPartName = CommonUtils.checkNull(projectInfo.get("PART_NAME"));
|
||||||
|
System.out.println("PROJECT_MGMT의 파트 정보 사용 (fallback) - PART_NO: " + projectPartNo + ", PART_NAME: " + projectPartName);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 프로젝트에 파트 정보가 있고, PART_OBJID가 유효한 경우에만 1레벨 교체
|
||||||
|
// PART_OBJID가 없으면 외래키 제약조건 위반으로 저장 불가
|
||||||
|
if(!"".equals(projectPartNo) && !"".equals(projectPartName) && !"".equals(projectPartObjId)) {
|
||||||
|
List<Map<String, Object>> newMbomDetailList = new ArrayList<>();
|
||||||
|
|
||||||
|
// 1레벨의 CHILD_OBJID 생성 (부모-자식 관계 연결용)
|
||||||
|
String newLevel1ChildObjid = CommonUtils.createObjId();
|
||||||
|
|
||||||
|
// 1레벨: PART_MNG 테이블의 파트 정보로 생성
|
||||||
|
Map<String, Object> level1Item = new HashMap<>();
|
||||||
|
level1Item.put("LEVEL", 1);
|
||||||
|
level1Item.put("PART_NO", projectPartNo);
|
||||||
|
level1Item.put("PART_NAME", projectPartName);
|
||||||
|
level1Item.put("QTY", 1); // 1레벨 수량은 항상 1
|
||||||
|
level1Item.put("PART_OBJID", projectPartObjId); // 실제 PART_MNG의 OBJID 사용
|
||||||
|
level1Item.put("CHILD_OBJID", newLevel1ChildObjid); // 부모-자식 연결용
|
||||||
|
level1Item.put("PARENT_OBJID", ""); // 1레벨은 부모 없음
|
||||||
|
newMbomDetailList.add(level1Item);
|
||||||
|
|
||||||
|
// 기존 BOM의 1레벨 CHILD_OBJID 찾기 (2레벨의 PARENT_OBJID 매핑용)
|
||||||
|
String originalLevel1ChildObjid = "";
|
||||||
|
String originalLevel1PartNo = "";
|
||||||
|
for(Map<String, Object> item : mbomDetailList) {
|
||||||
|
Integer level = null;
|
||||||
|
Object levelObj = item.get("LEVEL");
|
||||||
|
if(levelObj instanceof Integer) {
|
||||||
|
level = (Integer) levelObj;
|
||||||
|
} else if(levelObj instanceof Long) {
|
||||||
|
level = ((Long) levelObj).intValue();
|
||||||
|
} else if(levelObj instanceof String) {
|
||||||
|
try { level = Integer.parseInt((String) levelObj); } catch(Exception e) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(level != null && level == 1) {
|
||||||
|
originalLevel1ChildObjid = CommonUtils.checkNull(item.get("CHILD_OBJID"));
|
||||||
|
originalLevel1PartNo = CommonUtils.checkNull(item.get("PART_NO"));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2레벨 이상 데이터 추가 (레벨 조정 없이 그대로)
|
||||||
|
// 단, 원래 1레벨의 자식(2레벨)은 프로젝트 파트의 자식이 됨
|
||||||
|
for(Map<String, Object> item : mbomDetailList) {
|
||||||
|
Integer level = null;
|
||||||
|
Object levelObj = item.get("LEVEL");
|
||||||
|
if(levelObj instanceof Integer) {
|
||||||
|
level = (Integer) levelObj;
|
||||||
|
} else if(levelObj instanceof Long) {
|
||||||
|
level = ((Long) levelObj).intValue();
|
||||||
|
} else if(levelObj instanceof String) {
|
||||||
|
try { level = Integer.parseInt((String) levelObj); } catch(Exception e) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(level != null && level >= 2) {
|
||||||
|
Map<String, Object> newItem = new HashMap<>(item);
|
||||||
|
// 원래 2레벨(1레벨의 직접 자식)은 부모를 프로젝트 파트로 변경
|
||||||
|
if(level == 2) {
|
||||||
|
String parentObjid = CommonUtils.checkNull(item.get("PARENT_OBJID"));
|
||||||
|
String parentPartNo = CommonUtils.checkNull(item.get("PARENT_PART_NO"));
|
||||||
|
// PARENT_OBJID가 원래 1레벨의 CHILD_OBJID와 같으면 새 1레벨로 변경
|
||||||
|
if(parentObjid.equals(originalLevel1ChildObjid) || parentPartNo.equals(originalLevel1PartNo)) {
|
||||||
|
newItem.put("PARENT_OBJID", newLevel1ChildObjid);
|
||||||
|
newItem.put("PARENT_PART_NO", projectPartNo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
newMbomDetailList.add(newItem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mbomDetailList = newMbomDetailList;
|
||||||
|
System.out.println("프로젝트 파트 정보로 1레벨 교체 완료 - " + projectPartNo + " / " + projectPartName + " / CHILD_OBJID: " + newLevel1ChildObjid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 저장된 M-BOM 데이터가 있으면 이를 표시
|
// 저장된 M-BOM 데이터가 있으면 이를 표시
|
||||||
int maxLevel = 1;
|
int maxLevel = 1;
|
||||||
for(Map<String, Object> item : mbomDetailList) {
|
for(Map<String, Object> item : mbomDetailList) {
|
||||||
Integer level = (Integer) item.get("LEVEL");
|
Integer level = null;
|
||||||
|
Object levelObj = item.get("LEVEL");
|
||||||
|
if(levelObj instanceof Integer) {
|
||||||
|
level = (Integer) levelObj;
|
||||||
|
} else if(levelObj instanceof Long) {
|
||||||
|
level = ((Long) levelObj).intValue();
|
||||||
|
} else if(levelObj instanceof String) {
|
||||||
|
try { level = Integer.parseInt((String) levelObj); } catch(Exception e) {}
|
||||||
|
}
|
||||||
|
|
||||||
if(level != null && level > maxLevel) {
|
if(level != null && level > maxLevel) {
|
||||||
maxLevel = level;
|
maxLevel = level;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8115,4 +8115,21 @@ SELECT PM.OBJID
|
|||||||
ORDER BY REGDATE DESC, PART_NO
|
ORDER BY REGDATE DESC, PART_NO
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
|
<!-- PART_OBJID로 PART_MNG 테이블에서 파트 정보 조회 -->
|
||||||
|
<select id="getPartInfoByObjId" parameterType="map" resultType="com.pms.common.UpperKeyMap">
|
||||||
|
SELECT
|
||||||
|
OBJID,
|
||||||
|
PART_NO,
|
||||||
|
PART_NAME,
|
||||||
|
PART_TYPE,
|
||||||
|
UNIT,
|
||||||
|
MATERIAL,
|
||||||
|
SPEC,
|
||||||
|
MAKER,
|
||||||
|
SUPPLY_CODE
|
||||||
|
FROM PART_MNG
|
||||||
|
WHERE OBJID::VARCHAR = #{partObjId}
|
||||||
|
LIMIT 1
|
||||||
|
</select>
|
||||||
|
|
||||||
</mapper>
|
</mapper>
|
||||||
@@ -3137,6 +3137,7 @@
|
|||||||
PM.CONTRACT_OBJID,
|
PM.CONTRACT_OBJID,
|
||||||
PM.PROJECT_NO,
|
PM.PROJECT_NO,
|
||||||
PM.BOM_REPORT_OBJID,
|
PM.BOM_REPORT_OBJID,
|
||||||
|
PM.PART_OBJID,
|
||||||
PM.PART_NO,
|
PM.PART_NO,
|
||||||
PM.PART_NAME,
|
PM.PART_NAME,
|
||||||
PM.SOURCE_BOM_TYPE,
|
PM.SOURCE_BOM_TYPE,
|
||||||
|
|||||||
Reference in New Issue
Block a user