package com.workbenchclassic; import org.json.JSONArray; import org.json.JSONObject; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.Map; import java.util.stream.Collectors; import javax.ws.rs.Consumes; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; @Path("/updateContacts") public class UpdateContact { private final DBService dbService = new DBService("dsTranNJTA"); @POST @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public Response doUpdate(String jsonBody) { try { JSONObject json = new JSONObject(jsonBody); String station = json.getString("station"); JSONArray dataArray = json.getJSONArray("data"); String vendor = dbService.getDatabaseProductName(); System.out.println("Aktueller DB-Vendor: " + vendor); Connection conn = dbService.getConnection(); GetMetadata metadata = new GetMetadata(); String extPlantResponseString = metadata.getExtPlantJson(station); JSONObject extPlantResponse = new JSONObject(extPlantResponseString); String errorCode = extPlantResponse.optString("errorCode", "0"); if (!"0".equals(errorCode)) { // Return an HTTP 400 or 500 with that JSON return Response.status(Response.Status.BAD_REQUEST).entity(extPlantResponse.toString()).build(); } // 3) werknummer ermitteln // werkResultJson könnte z.B. so aussehen: // {"errorCode":"0","errorMessage":"Done","data":"[{\"werknummer\":\"ABC\"}]"} String werkData = extPlantResponse.optString("data", "[]"); JSONArray werkArr = new JSONArray(werkData); String WERK_NR = null; String COMPANY_NO = null; String CLIENT_NO = null; if (werkArr.length() > 0) { JSONObject row = werkArr.getJSONObject(0); WERK_NR = row.optString("werk_nr", null); COMPANY_NO = row.optString("ext_company_nr", null); CLIENT_NO = row.optString("client_nr", null); } System.out.println("Ermittelte werknummer: " + COMPANY_NO); boolean isMSSQL = "Microsoft SQL Server".equals(vendor); boolean isOracle = "Oracle".equals(vendor); insertIdocStatus(conn, isMSSQL, isOracle); conn.setAutoCommit(false); try { for (int i = 0; i < dataArray.length(); i++) { JSONObject obj = dataArray.getJSONObject(i); Map keyMap = obj.keySet().stream() .collect(Collectors.toMap(String::toLowerCase, key -> key, (existing, replacement) -> existing)); insertContact(conn, obj, COMPANY_NO, WERK_NR, CLIENT_NO, isMSSQL, isOracle, keyMap); if (obj.has("artikel") && !obj.isNull("artikel") && !String.valueOf(obj.get("artikel")).trim().isEmpty()) { insertMaterialContact(conn, obj, COMPANY_NO, WERK_NR, CLIENT_NO, isMSSQL, isOracle, keyMap); } } conn.commit(); } catch (SQLException e) { conn.rollback(); throw e; } finally { conn.setAutoCommit(true); conn.close(); } JSONObject response = new JSONObject(); response.put("status", "ok"); response.put("message", "Daten wurden erfolgreich verarbeitet."); return Response.ok(response.toString()).build(); } catch (Exception e) { e.printStackTrace(); JSONObject error = new JSONObject(); error.put("status", "error"); error.put("message", e.getMessage()); return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(error.toString()).build(); } } private void insertContact(Connection conn, JSONObject obj, String COMPANY_NO, String WERK_NR, String CLIENT_NO, boolean isMSSQL, boolean isOracle, Map keyMap) throws SQLException { String sql; if (isMSSQL) { sql = "INSERT INTO xtran.tran_contact (TRAN_ID, IDOC_ID, SOURCE, STATUS, CREATED, STAMP, PLANT_NO, CLIENT_NO, COMPANY_NO, CONTACT_CODE, CONTACT_NAME, CONTACT_GROUP, STREET, ZIP_CODE, COUNTRY, CITY, IS_SUPPLIER, IS_CUSTOMER, IS_MANUFACTURER, CONTACT_CODE_ERP, INVENTORY, CONTACT_STATE, LATITUDE, LONGITUDE) " + "VALUES (NEXT VALUE FOR xtran.SEQ_tran_contact, (SELECT MAX(id) FROM xtran.tran_idocstatus), ?, ?, GETDATE(), GETDATE(), ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; } else if (isOracle) { sql = "INSERT INTO tran.tran_contact (TRAN_ID, IDOC_ID, SOURCE, STATUS, CREATED, STAMP, PLANT_NO, CLIENT_NO, COMPANY_NO, CONTACT_CODE, CONTACT_NAME, CONTACT_GROUP, STREET, ZIP_CODE, COUNTRY, CITY, IS_SUPPLIER, IS_CUSTOMER, IS_MANUFACTURER, CONTACT_CODE_ERP, INVENTORY, CONTACT_STATE, LATITUDE, LONGITUDE) " + "VALUES (tran.SEQ_TRAN_contact.nextVal, (SELECT MAX(id) FROM tran.tran_idocstatus), ?, ?, SYSDATE, SYSDATE, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; } else { throw new SQLException("DB-Vendor nicht implementiert"); } try (PreparedStatement ps = conn.prepareStatement(sql)) { ps.setInt(1, obj.optInt(keyMap.getOrDefault("source", "source"), 0)); ps.setInt(2, obj.optInt(keyMap.getOrDefault("status", "status"), 0)); ps.setString(3, WERK_NR); ps.setString(4, CLIENT_NO); ps.setString(5, COMPANY_NO); ps.setString(6, obj.optString(keyMap.getOrDefault("contact_code", "contact_code"), "")); ps.setString(7, obj.optString(keyMap.getOrDefault("contact_name", "contact_name"), "")); ps.setString(8, obj.optString(keyMap.getOrDefault("contact_group", "contact_group"), "")); ps.setString(9, obj.optString(keyMap.getOrDefault("street", "street"), "")); ps.setString(10, obj.optString(keyMap.getOrDefault("zip_code", "zip_code"), "")); ps.setString(11, obj.optString(keyMap.getOrDefault("country", "country"), "")); ps.setString(12, obj.optString(keyMap.getOrDefault("city", "city"), "")); ps.setInt(13, obj.optInt(keyMap.getOrDefault("is_supplier", "is_supplier"), 0)); ps.setInt(14, obj.optInt(keyMap.getOrDefault("is_customer", "is_customer"), 0)); ps.setInt(15, obj.optInt(keyMap.getOrDefault("is_manufacturer", "is_manufacturer"), 0)); ps.setString(16, obj.optString(keyMap.getOrDefault("contact_code_erp", "contact_code_erp"), "")); ps.setInt(17, obj.optInt(keyMap.getOrDefault("inventory", "inventory"), 0)); ps.setInt(18, obj.optInt(keyMap.getOrDefault("contact_state", "contact_state"), 0)); ps.setDouble(19, obj.optDouble(keyMap.getOrDefault("latitude", "latitude"), 0.0)); ps.setDouble(20, obj.optDouble(keyMap.getOrDefault("longitude", "longitude"), 0.0)); ps.executeUpdate(); } } private void insertIdocStatus(Connection conn, boolean isMSSQL, boolean isOracle) throws SQLException { String sql; if (isMSSQL) { sql = "INSERT INTO xtran.tran_idocstatus (ID, DATE_CREATION, ewstatus, errorcode, content_type, source) VALUES (NEXT VALUE FOR xtran.seq_tranidocstatus, GETDATE(), 1, 0, 57, 0)"; } else if (isOracle) { sql = "INSERT INTO tran.tran_idocstatus (ID, DATE_CREATION, ewstatus, errorcode, content_type, source) VALUES (tran.seq_tranidocstatus.nextval, SYSDATE, 1, 0, 57, 0)"; } else { throw new SQLException("DB-Vendor nicht implementiert"); } try (PreparedStatement ps = conn.prepareStatement(sql)) { ps.executeUpdate(); } } private void insertMaterialContact(Connection conn, JSONObject obj, String COMPANY_NO, String WERK_NR, String CLIENT_NO, boolean isMSSQL, boolean isOracle, Map keyMap) throws SQLException { String sql; if (isMSSQL) { sql = "INSERT INTO xtran.tran_material_contact (TRAN_ID, SOURCE, STATUS, CREATED, STAMP, CONTACT_CODE, MATERIAL_NO, MATERIAL_NO_EXT, MATERIAL_DESC_EXT, CONTACT_TYPE, DELETE_FLAG, PLANT_NO, COMPANY_NO, CLIENT_NO, IDOC_ID) " + "VALUES (NEXT VALUE FOR xtran.SEQ_tran_material_contact, ?, ?, GETDATE(), GETDATE(), ?, ?, ?, ?, ?, ?, ?, ?, ?, (SELECT MAX(id) FROM xtran.tran_idocstatus))"; } else if (isOracle) { sql = "INSERT INTO tran.tran_material_contact (TRAN_ID, SOURCE, STATUS, CREATED, STAMP, CONTACT_CODE, MATERIAL_NO, MATERIAL_NO_EXT, MATERIAL_DESC_EXT, CONTACT_TYPE, DELETE_FLAG, PLANT_NO, COMPANY_NO, CLIENT_NO, IDOC_ID) " + "VALUES (tran.SEQ_TRAN_material_contact.nextVal, ?, ?, SYSDATE, SYSDATE, ?, ?, ?, ?, ?, ?, ?, ?, ?, (SELECT MAX(id) FROM tran.tran_idocstatus))"; } else { throw new SQLException("DB-Vendor nicht implementiert"); } try (PreparedStatement ps = conn.prepareStatement(sql)) { ps.setInt(1, obj.optInt(keyMap.getOrDefault("source", "source"), 0)); ps.setInt(2, obj.optInt(keyMap.getOrDefault("status", "status"), 0)); ps.setString(3, obj.optString(keyMap.getOrDefault("contact_code", "contact_code"), "")); ps.setString(4, obj.optString(keyMap.getOrDefault("artikel", "artikel"), "")); ps.setString(5, obj.optString(keyMap.getOrDefault("part_ext", "part_ext"), "")); ps.setString(6, obj.optString(keyMap.getOrDefault("part_ext", "material_desc_ext"), "")); ps.setInt(7, obj.optInt(keyMap.getOrDefault("art_bez_ext", "art_bez_ext"), 0)); ps.setInt(8, obj.optInt(keyMap.getOrDefault("delete_flag", "delete_flag"), 0)); ps.setString(9, WERK_NR); ps.setString(10, COMPANY_NO); ps.setString(11, CLIENT_NO); ps.executeUpdate(); } } }