INSERT INTO PLANNING_ISSUE ( OBJID ,ISSUE_NO ,PROJECT_OBJID ,UNIT_CODE ,PART_OBJID ,ISSUE_CATEGORY ,ISSUE_TYPE ,CONTENT ,DESIGN_USERID ,DESIGN_RESULT ,DESIGN_DATE ,PURCHASE_USERID ,PURCHASE_RESULT ,PURCHASE_DATE ,QUALITY_USERID ,QUALITY_RESULT ,QUALITY_DATE ,PRODUCTION_USERID ,PRODUCTION_RESULT ,PRODUCTION_DATE ,REG_DATE ,WRITER ,STATUS ) VALUES ( #{objId} ,(SELECT 'ISSUE' || to_char(now(),'YY')||'-'||LPAD((SELECT CASE WHEN MAX(SUBSTR(ISSUE_NO,9,3)) IS NULL THEN 1 ELSE MAX(SUBSTR(ISSUE_NO,9,3))::INTEGER+1 END FROM PLANNING_ISSUE)::VARCHAR,3,'0')) ,#{project_objid} ,#{unit_code} ,#{part_objid} ,#{issue_category} ,#{issue_type} ,#{content} ,#{design_userid} ,#{design_result} ,#{design_date} ,#{purchase_userid} ,#{purchase_result} ,#{purchase_date} ,#{quality_userid} ,#{quality_result} ,#{quality_date} ,#{production_userid} ,#{production_result} ,#{production_date} ,now() ,#{writer} ,'write' ) ON CONFLICT (OBJID) DO UPDATE SET PROJECT_OBJID=#{project_objid} ,UNIT_CODE=#{unit_code} ,PART_OBJID=#{part_objid} ,ISSUE_CATEGORY=#{issue_category} ,ISSUE_TYPE=#{issue_type} ,CONTENT=#{content} ,DESIGN_USERID=#{design_userid} ,DESIGN_RESULT=#{design_result} ,DESIGN_DATE=#{design_date} ,PURCHASE_USERID=#{purchase_userid} ,PURCHASE_RESULT=#{purchase_result} ,PURCHASE_DATE=#{purchase_date} ,QUALITY_USERID=#{quality_userid} ,QUALITY_RESULT=#{quality_result} ,QUALITY_DATE=#{quality_date} ,PRODUCTION_USERID=#{production_userid} ,PRODUCTION_RESULT=#{production_result} ,PRODUCTION_DATE=#{production_date} DELETE FROM PLANNING_ISSUE WHERE OBJID = #{OBJID} UPDATE PLANNING_ISSUE SET STATUS='release' WHERE OBJID = #{OBJID} INSERT INTO ASSEMBLY_WBS_TASK ( OBJID ,BOM_QTY_CHILD_OBJID ,PART_OBJID ,PARENT_OBJID ,ASSEMBLY_USER_ID ,ASSEMBLY_DATE ,INSOURCING ,OUTSOURCING ,WRITER ,REGDATE ) VALUES ( #{OBJID} ,#{CHILD_OBJID} ,#{PART_OBJID} ,#{PARENT_OBJID} ,#{ASSEMBLY_USER_ID} ,#{ASSEMBLY_DATE} ,#{INSOURCING} ,#{OUTSOURCING} ,#{WRITER} ,now() ) ON CONFLICT (OBJID) DO UPDATE SET ASSEMBLY_USER_ID = #{ASSEMBLY_USER_ID} ,ASSEMBLY_DATE = #{ASSEMBLY_DATE} ,INSOURCING = #{INSOURCING} ,OUTSOURCING = #{OUTSOURCING} ,WRITER = #{WRITER} DELETE FROM RECEIVE_HISTORY WHERE OBJID = #{OBJID} DELETE FROM RECEIVE_HISTORY WHERE PARENT_OBJID = #{parentObjId} AND PART_OBJID = #{partObjid} INSERT INTO RECEIVE_HISTORY ( OBJID ,PART_OBJID ,PARENT_OBJID ,RECEIVE_DATE ,RECEIVE_QTY ,RECEIVE_USER_ID ,TRANSFER_USER_ID ,WRITER ,REGDATE ) VALUES ( #{OBJID} ,#{PART_OBJID} ,#{PARENT_OBJID} ,#{RECEIVE_DATE} ,#{RECEIVE_QTY} ,#{RECEIVE_USER_ID} ,#{TRANSFER_USER_ID} ,#{WRITER} ,now() ) ON CONFLICT (OBJID) DO UPDATE SET RECEIVE_DATE = #{RECEIVE_DATE} ,RECEIVE_QTY = #{RECEIVE_QTY} ,RECEIVE_USER_ID = #{RECEIVE_USER_ID} ,TRANSFER_USER_ID = #{TRANSFER_USER_ID} ,WRITER = #{WRITER} INSERT INTO WORK_DIARY ( OBJID ,CONTRACT_OBJID ,UNIT_CODE ,DIVISION ,TASK_NAME ,WORKER_ID ,WORK_START_DATE ,WORK_END_DATE ,WORK_HOUR ,REMARK ,STATUS ,WRITER ,REGDATE ,SOURCING_TYPE ,PRODUCTION_TYPE ) VALUES ( #{objId } ,#{project_objid } ,#{unit_code } ,#{division } ,#{task_name } ,#{worker_id } ,#{work_start_date } ,#{work_end_date } ,#{work_hour } ,#{remark } ,'write' ,#{writer } ,now() ,#{sourcing_type } ,#{production_type } ) ON CONFLICT (OBJID) DO UPDATE SET CONTRACT_OBJID = #{project_objid } ,UNIT_CODE = #{unit_code } ,DIVISION = #{division } ,TASK_NAME = #{task_name } ,WORKER_ID = #{worker_id } ,WORK_START_DATE = #{work_start_date } ,WORK_END_DATE = #{work_end_date } ,WORK_HOUR = #{work_hour } ,REMARK = #{remark } ,SOURCING_TYPE = #{sourcing_type } ,PRODUCTION_TYPE = #{production_type } DELETE FROM WORK_DIARY WHERE OBJID = #{OBJID} UPDATE WORK_DIARY SET STATUS='complete' WHERE OBJID = #{OBJID} UPDATE PROJECT_MGMT SET PART_OBJID = #{bomReportObjid} WHERE OBJID = #{projectMgmtObjid} /* productionplanning.saveMbomFromEbom - E-BOM을 M-BOM으로 복사 */ /* 1. 새로운 PART_BOM_REPORT 생성 (M-BOM용) */ /* M-BOM 품번을 PART_NO에 저장 (규칙: M-{품번}-YYMMDD-01) */ WITH new_bom_report AS ( INSERT INTO PART_BOM_REPORT ( OBJID, PART_NO, PART_NAME, WRITER, REGDATE, STATUS ) VALUES ( (SELECT (FLOOR(RANDOM() * 1000000000) + 1000000000)::INTEGER), #{MBOM_PART_NO}, #{PART_NAME}, #{USER_ID}, NOW(), 'Y' ) RETURNING OBJID ), /* 2. E-BOM의 BOM_PART_QTY 데이터를 새 M-BOM으로 복사 */ copied_bom_data AS ( INSERT INTO BOM_PART_QTY ( BOM_REPORT_OBJID, OBJID, PARENT_OBJID, CHILD_OBJID, PARENT_PART_NO, PART_NO, QTY, ITEM_QTY, QTY_TEMP, REGDATE, WRITER, SEQ, STATUS, LAST_PART_OBJID ) SELECT (SELECT OBJID FROM new_bom_report), (SELECT (FLOOR(RANDOM() * 1000000000) + 1000000000 + ROW_NUMBER() OVER (ORDER BY OBJID))::INTEGER), PARENT_OBJID, CHILD_OBJID, PARENT_PART_NO, PART_NO, QTY, ITEM_QTY, QTY_TEMP, NOW(), #{USER_ID}, ROW_NUMBER() OVER (ORDER BY OBJID), 'adding', LAST_PART_OBJID FROM BOM_PART_QTY WHERE BOM_REPORT_OBJID::VARCHAR = #{SOURCE_BOM_OBJID} AND COALESCE(STATUS, '') NOT IN ('deleting', 'deleted') RETURNING 1 ) /* 3. PROJECT_MGMT 업데이트 */ UPDATE PROJECT_MGMT SET BOM_REPORT_OBJID = (SELECT OBJID FROM new_bom_report), MBOM_STATUS = 'Y', PART_NO = #{PART_NO}, PART_NAME = #{PART_NAME} WHERE OBJID::VARCHAR = #{PROJECT_OBJID} UPDATE PROJECT_MGMT SET SOURCE_BOM_TYPE = #{sourceBomType}, SOURCE_EBOM_OBJID = CASE WHEN #{sourceBomType} = 'EBOM' THEN #{sourceBomObjId} ELSE NULL END, SOURCE_MBOM_OBJID = CASE WHEN #{sourceBomType} = 'MBOM' THEN #{sourceBomObjId} ELSE NULL END WHERE OBJID::VARCHAR = #{projectObjId} UPDATE MBOM_HEADER SET STATUS = 'INACTIVE', EDIT_DATE = NOW() WHERE OBJID = #{mbomHeaderObjid} UPDATE MBOM_DETAIL SET STATUS = 'INACTIVE', EDIT_DATE = NOW() WHERE MBOM_HEADER_OBJID = #{mbomHeaderObjid} INSERT INTO MBOM_HEADER ( OBJID, MBOM_NO, SOURCE_BOM_TYPE, SOURCE_EBOM_OBJID, SOURCE_MBOM_OBJID, PROJECT_OBJID, PART_NO, PART_NAME, STATUS, MBOM_STATUS, WRITER, REGDATE ) VALUES ( #{objid}, #{mbomNo}, #{sourceBomType}, #{sourceEbomObjid}, #{sourceMbomObjid}, #{projectObjId}, #{partNo}, #{partName}, 'Y', 'DRAFT', #{sessionUserId}, NOW() ) INSERT INTO MBOM_DETAIL ( OBJID, MBOM_HEADER_OBJID, PARENT_OBJID, CHILD_OBJID, SEQ, LEVEL, PART_OBJID, PART_NO, PART_NAME, QTY, UNIT, SUPPLY_TYPE, MAKE_OR_BUY, RAW_MATERIAL_PART_NO, RAW_MATERIAL_SPEC, RAW_MATERIAL, RAW_MATERIAL_SIZE, PROCESSING_VENDOR, PROCESSING_DEADLINE, GRINDING_DEADLINE, REQUIRED_QTY, ORDER_QTY, PRODUCTION_QTY, STOCK_QTY, SHORTAGE_QTY, NET_QTY, PO_QTY, VENDOR, UNIT_PRICE, TOTAL_PRICE, CURRENCY, LEAD_TIME, MIN_ORDER_QTY, PROPOSAL_DATE, STATUS, WRITER, REGDATE, REMARK ) VALUES ( #{objid}, #{mbomHeaderObjid}, #{parentObjid}, #{childObjid}, #{seq}, #{level}, #{partObjid}, #{partNo}, #{partName}, #{qty}, #{unit}, #{supplyType}, #{makeOrBuy}, #{rawMaterialPartNo}, #{rawMaterialSpec}, #{rawMaterial}, #{rawMaterialSize}, #{processingVendor}, #{processingDeadline}, #{grindingDeadline}, #{requiredQty}, #{orderQty}, #{productionQty}, #{stockQty}, #{shortageQty}, #{netQty}, #{poQty}, #{vendor}, #{unitPrice}, #{totalPrice}, #{currency}, #{leadTime}, #{minOrderQty}, #{proposalDate}, 'ACTIVE', #{sessionUserId}, NOW(), #{remark} ) UPDATE MBOM_HEADER SET PART_NO = #{partNo}, PART_NAME = #{partName}, EDITER = #{sessionUserId}, EDIT_DATE = NOW() WHERE OBJID = #{mbomHeaderObjid} DELETE FROM MBOM_DETAIL WHERE MBOM_HEADER_OBJID = #{mbomHeaderObjid} INSERT INTO MBOM_HISTORY ( OBJID, MBOM_HEADER_OBJID, CHANGE_TYPE, CHANGE_DESCRIPTION, BEFORE_DATA, AFTER_DATA, CHANGE_USER, CHANGE_DATE ) VALUES ( #{objid}, #{mbomHeaderObjid}, #{changeType}, #{changeDescription}, #{beforeData}::JSONB, #{afterData}::JSONB, #{sessionUserId}, NOW() ) UPDATE PROJECT_MGMT SET MBOM_STATUS = 'Y', MBOM_WRITER = #{sessionUserId}, MBOM_REGDATE = NOW() WHERE OBJID::VARCHAR = #{projectObjId}