동일 품번 수주 시 프로젝트 생성 시점에 기존 엠봄 복사
This commit is contained in:
@@ -1105,48 +1105,53 @@ public class ProductionPlanningService {
|
||||
|
||||
try {
|
||||
sqlSession = SqlMapConfig.getInstance().getSqlSession();
|
||||
|
||||
// 현재 날짜 (YYMMDD)
|
||||
mbomNo = generateMbomNo(sqlSession, sourceBomType, baseBomPartNo);
|
||||
} catch(Exception e) {
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
if(sqlSession != null) {
|
||||
sqlSession.close();
|
||||
}
|
||||
}
|
||||
|
||||
return mbomNo;
|
||||
}
|
||||
|
||||
/**
|
||||
* M-BOM 품번 생성 (기존 트랜잭션 공유)
|
||||
*/
|
||||
public String generateMbomNo(SqlSession sqlSession, String sourceBomType, String baseBomPartNo) {
|
||||
String mbomNo = "";
|
||||
|
||||
try {
|
||||
java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyMMdd");
|
||||
String dateStr = sdf.format(new java.util.Date());
|
||||
|
||||
String mbomPrefix = "";
|
||||
|
||||
if("EBOM".equals(sourceBomType)) {
|
||||
// E-BOM 기준: M-{E-BOM품번}-YYMMDD
|
||||
// E-BOM 품번이 이미 M-으로 시작하면 중복 방지
|
||||
String cleanPartNo = baseBomPartNo;
|
||||
if(cleanPartNo.startsWith("M-")) {
|
||||
cleanPartNo = cleanPartNo.substring(2); // "M-" 제거
|
||||
cleanPartNo = cleanPartNo.substring(2);
|
||||
}
|
||||
mbomPrefix = "M-" + cleanPartNo + "-" + dateStr;
|
||||
} else if("TEMPLATE".equals(sourceBomType)) {
|
||||
// 템플릿 기준: M-{품번}-YYMMDD
|
||||
String cleanPartNo = baseBomPartNo.trim();
|
||||
if(cleanPartNo.startsWith("M-")) {
|
||||
cleanPartNo = cleanPartNo.substring(2); // "M-" 제거
|
||||
cleanPartNo = cleanPartNo.substring(2);
|
||||
}
|
||||
mbomPrefix = "M-" + cleanPartNo + "-" + dateStr;
|
||||
} else if("MBOM".equals(sourceBomType)) {
|
||||
// M-BOM 기준: 기존 M-BOM 품번에서 날짜/순번 부분 제거 후 새 날짜 추가
|
||||
// 예: M-000AN014000-251124-01 → M-000AN014000 → M-000AN014000-251126-01
|
||||
|
||||
String basePart = baseBomPartNo;
|
||||
|
||||
// 잘못된 형식 정규화 (M-M-..., M-E-... 등)
|
||||
// 예: M-M-000AN014000-251124-01-251124 → M-000AN014000-251124-01-251124
|
||||
while(basePart.startsWith("M-M-") || basePart.startsWith("M-E-")) {
|
||||
basePart = "M-" + basePart.substring(4);
|
||||
}
|
||||
|
||||
// 마지막의 모든 날짜-순번 패턴 제거 (중복 복사 대응)
|
||||
// 예: M-000AN014000-251124-01-251125-01 → M-000AN014000
|
||||
// 날짜(6자리) 또는 순번(2자리)가 나오지 않을 때까지 반복
|
||||
while(true) {
|
||||
int lastDashIndex = basePart.lastIndexOf("-");
|
||||
if(lastDashIndex > 0) {
|
||||
String suffix = basePart.substring(lastDashIndex + 1);
|
||||
// 날짜(6자리) 또는 순번(2자리)인 경우만 제거
|
||||
if(suffix.matches("\\d{2}") || suffix.matches("\\d{6}")) {
|
||||
basePart = basePart.substring(0, lastDashIndex);
|
||||
} else {
|
||||
@@ -1157,28 +1162,21 @@ public class ProductionPlanningService {
|
||||
}
|
||||
}
|
||||
|
||||
// 새 날짜 추가
|
||||
mbomPrefix = basePart + "-" + dateStr;
|
||||
}
|
||||
|
||||
// 같은 날짜의 최대 순번 조회
|
||||
Map<String, Object> seqParam = new HashMap<>();
|
||||
seqParam.put("mbomPrefix", mbomPrefix);
|
||||
|
||||
Integer maxSeq = (Integer) sqlSession.selectOne("productionplanning.getMaxMbomSeqByDate", seqParam);
|
||||
int nextSeq = (maxSeq != null ? maxSeq : 0) + 1;
|
||||
|
||||
// 최종 M-BOM 품번 생성
|
||||
mbomNo = mbomPrefix + "-" + String.format("%02d", nextSeq);
|
||||
|
||||
System.out.println("생성된 M-BOM 품번: " + mbomNo);
|
||||
|
||||
} catch(Exception e) {
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
if(sqlSession != null) {
|
||||
sqlSession.close();
|
||||
}
|
||||
}
|
||||
|
||||
return mbomNo;
|
||||
@@ -1591,6 +1589,166 @@ public class ProductionPlanningService {
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 동일 품번의 최신 M-BOM을 새 프로젝트에 자동 복사 (독립 트랜잭션)
|
||||
*/
|
||||
public String copyMbomFromTemplate(HttpServletRequest request, String projectObjId,
|
||||
String templateHeaderObjId, String partNo, String partName) {
|
||||
SqlSession sqlSession = null;
|
||||
String newHeaderObjid = null;
|
||||
|
||||
try {
|
||||
sqlSession = SqlMapConfig.getInstance().getSqlSession(false);
|
||||
HttpSession session = request.getSession();
|
||||
PersonBean person = (PersonBean)session.getAttribute(Constants.PERSON_BEAN);
|
||||
String userId = CommonUtils.checkNull(person.getUserId());
|
||||
|
||||
newHeaderObjid = copyMbomFromTemplate(sqlSession, userId, projectObjId, templateHeaderObjId, partNo, partName);
|
||||
|
||||
if(newHeaderObjid != null) {
|
||||
sqlSession.commit();
|
||||
}
|
||||
} catch(Exception e) {
|
||||
if(sqlSession != null) sqlSession.rollback();
|
||||
newHeaderObjid = null;
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
if(sqlSession != null) sqlSession.close();
|
||||
}
|
||||
|
||||
return newHeaderObjid;
|
||||
}
|
||||
|
||||
/**
|
||||
* 동일 품번의 최신 M-BOM을 새 프로젝트에 자동 복사 (기존 트랜잭션 공유)
|
||||
* 수주 확정 → 프로젝트 자동생성 시 ContractMgmtService에서 호출
|
||||
*/
|
||||
public String copyMbomFromTemplate(SqlSession sqlSession, String userId, String projectObjId,
|
||||
String templateHeaderObjId, String partNo, String partName) {
|
||||
String newHeaderObjid = null;
|
||||
|
||||
try {
|
||||
// 1. 새 MBOM_HEADER 생성 (M-BOM 품번 규칙 적용)
|
||||
newHeaderObjid = CommonUtils.createObjId();
|
||||
String mbomNo = generateMbomNo(sqlSession, "TEMPLATE", partNo);
|
||||
Map<String, Object> headerParam = new HashMap<>();
|
||||
headerParam.put("objid", newHeaderObjid);
|
||||
headerParam.put("mbomNo", mbomNo);
|
||||
headerParam.put("sourceBomType", "TEMPLATE");
|
||||
headerParam.put("sourceEbomObjid", null);
|
||||
headerParam.put("sourceMbomObjid", templateHeaderObjId);
|
||||
headerParam.put("projectObjId", projectObjId);
|
||||
headerParam.put("partNo", partNo);
|
||||
headerParam.put("partName", partName);
|
||||
headerParam.put("sessionUserId", userId);
|
||||
sqlSession.insert("productionplanning.insertMbomHeader", headerParam);
|
||||
|
||||
// 2. 템플릿의 MBOM_DETAIL 조회
|
||||
Map<String, Object> detailParam = new HashMap<>();
|
||||
detailParam.put("mbomHeaderObjid", templateHeaderObjId);
|
||||
List<Map<String, Object>> templateDetails = sqlSession.selectList("productionplanning.getMbomDetailList", detailParam);
|
||||
|
||||
if(templateDetails != null && !templateDetails.isEmpty()) {
|
||||
// 3. CHILD_OBJID 매핑 생성 (old → new)
|
||||
Map<String, String> childObjidMap = new HashMap<>();
|
||||
for(Map<String, Object> detail : templateDetails) {
|
||||
detail = CommonUtils.toUpperCaseMapKey(detail);
|
||||
String oldObjid = CommonUtils.checkNull(detail.get("OBJID"));
|
||||
String oldChildObjid = CommonUtils.checkNull(detail.get("CHILD_OBJID"));
|
||||
if(!"".equals(oldObjid)) {
|
||||
childObjidMap.put(oldObjid, CommonUtils.createObjId());
|
||||
}
|
||||
if(!"".equals(oldChildObjid) && !childObjidMap.containsKey(oldChildObjid)) {
|
||||
childObjidMap.put(oldChildObjid, CommonUtils.createObjId());
|
||||
}
|
||||
}
|
||||
|
||||
// 4. 매핑 적용하여 MBOM_DETAIL 복사 (수주/제작 수량은 초기화)
|
||||
for(Map<String, Object> detail : templateDetails) {
|
||||
detail = CommonUtils.toUpperCaseMapKey(detail);
|
||||
String oldObjid = CommonUtils.checkNull(detail.get("OBJID"));
|
||||
String oldChildObjid = CommonUtils.checkNull(detail.get("CHILD_OBJID"));
|
||||
String oldParentObjid = CommonUtils.checkNull(detail.get("PARENT_OBJID"));
|
||||
|
||||
String newObjid = childObjidMap.containsKey(oldObjid) ? childObjidMap.get(oldObjid) : CommonUtils.createObjId();
|
||||
String newChildObjid = childObjidMap.containsKey(oldChildObjid) ? childObjidMap.get(oldChildObjid) : newObjid;
|
||||
String newParentObjid = !"".equals(oldParentObjid)
|
||||
? (childObjidMap.containsKey(oldParentObjid) ? childObjidMap.get(oldParentObjid) : oldParentObjid) : "";
|
||||
|
||||
Map<String, Object> insertParam = new HashMap<>();
|
||||
insertParam.put("objid", newObjid);
|
||||
insertParam.put("mbomHeaderObjid", newHeaderObjid);
|
||||
insertParam.put("parentObjid", newParentObjid);
|
||||
insertParam.put("childObjid", newChildObjid);
|
||||
insertParam.put("seq", detail.get("SEQ"));
|
||||
insertParam.put("level", detail.get("LEVEL"));
|
||||
insertParam.put("partObjid", detail.get("PART_OBJID"));
|
||||
insertParam.put("partNo", detail.get("PART_NO"));
|
||||
insertParam.put("partName", detail.get("PART_NAME"));
|
||||
insertParam.put("qty", detail.get("QTY"));
|
||||
insertParam.put("unit", detail.get("UNIT"));
|
||||
insertParam.put("supplyType", detail.get("SUPPLY_TYPE"));
|
||||
insertParam.put("makeOrBuy", detail.get("MAKE_OR_BUY"));
|
||||
insertParam.put("rawMaterialPartNo", detail.get("RAW_MATERIAL_PART_NO"));
|
||||
insertParam.put("rawMaterialSpec", detail.get("RAW_MATERIAL_SPEC"));
|
||||
insertParam.put("rawMaterial", detail.get("RAW_MATERIAL"));
|
||||
insertParam.put("rawMaterialSize", detail.get("RAW_MATERIAL_SIZE"));
|
||||
insertParam.put("processingVendor", detail.get("PROCESSING_VENDOR"));
|
||||
insertParam.put("processingDeadline", detail.get("PROCESSING_DEADLINE"));
|
||||
insertParam.put("grindingDeadline", detail.get("GRINDING_DEADLINE"));
|
||||
insertParam.put("requiredQty", detail.get("REQUIRED_QTY"));
|
||||
insertParam.put("orderQty", null);
|
||||
insertParam.put("productionQty", null);
|
||||
insertParam.put("stockQty", null);
|
||||
insertParam.put("shortageQty", null);
|
||||
insertParam.put("netQty", null);
|
||||
insertParam.put("poQty", null);
|
||||
insertParam.put("vendor", detail.get("VENDOR"));
|
||||
insertParam.put("unitPrice", detail.get("UNIT_PRICE"));
|
||||
insertParam.put("processingUnitPrice", detail.get("PROCESSING_UNIT_PRICE"));
|
||||
insertParam.put("totalPrice", null);
|
||||
insertParam.put("currency", detail.get("CURRENCY"));
|
||||
insertParam.put("leadTime", detail.get("LEAD_TIME"));
|
||||
insertParam.put("minOrderQty", detail.get("MIN_ORDER_QTY"));
|
||||
insertParam.put("proposalDate", detail.get("PROPOSAL_DATE"));
|
||||
insertParam.put("remark", detail.get("REMARK"));
|
||||
insertParam.put("sessionUserId", userId);
|
||||
|
||||
sqlSession.insert("productionplanning.insertMbomDetail", insertParam);
|
||||
}
|
||||
}
|
||||
|
||||
// 5. PROJECT_MGMT MBOM_STATUS 업데이트
|
||||
Map<String, Object> statusParam = new HashMap<>();
|
||||
statusParam.put("projectObjId", projectObjId);
|
||||
statusParam.put("sessionUserId", userId);
|
||||
sqlSession.update("productionplanning.updateProjectMbomStatus", statusParam);
|
||||
|
||||
// 6. 이력 저장
|
||||
String historyObjid = CommonUtils.createObjId();
|
||||
Map<String, Object> historyParam = new HashMap<>();
|
||||
historyParam.put("objid", historyObjid);
|
||||
historyParam.put("mbomHeaderObjid", newHeaderObjid);
|
||||
historyParam.put("changeType", "COPY_FROM_TEMPLATE");
|
||||
historyParam.put("changeDescription", "동일 품번(" + partNo + ") M-BOM 자동 복사");
|
||||
historyParam.put("beforeData", "{}");
|
||||
historyParam.put("afterData", "{\"sourceHeaderObjid\":\"" + templateHeaderObjId + "\"}");
|
||||
historyParam.put("sessionUserId", userId);
|
||||
sqlSession.insert("productionplanning.insertMbomHistory", historyParam);
|
||||
|
||||
System.out.println("========== M-BOM 자동 복사 완료 ==========");
|
||||
System.out.println("프로젝트: " + projectObjId);
|
||||
System.out.println("원본 템플릿: " + templateHeaderObjId);
|
||||
System.out.println("새 M-BOM: " + newHeaderObjid);
|
||||
|
||||
} catch(Exception e) {
|
||||
newHeaderObjid = null;
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
return newHeaderObjid;
|
||||
}
|
||||
|
||||
/**
|
||||
* MBOM_HEADER 테이블에 해당 OBJID가 존재하는지 확인
|
||||
* @param objId
|
||||
|
||||
Reference in New Issue
Block a user