189 lines
10 KiB
Java
189 lines
10 KiB
Java
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<String, String> 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<String, String> 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<String, String> 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();
|
|
}
|
|
}
|
|
}
|