瀏覽代碼

update migration cpx

masarifyuli 6 天之前
父節點
當前提交
9b5917cdf6

+ 3 - 1
config/general-setting.yml

@@ -170,6 +170,7 @@ license:
   pbxSupport: 2
   ldap: true
   expired: 20270101
+  boardMasterEnabled: false
 redirectUrl:
 - http://192.168.100.18:8080/oauth2redirect
 - http://192.168.100.22:8080/oauth2redirect
@@ -182,4 +183,5 @@ redirectUrl:
 - http://localhost:4200/oauth2redirect
 - https://cmpd.telmessenger.com/oauth2redirect
 - https://app.insomnia.rest/oauth/redirect
-dataKey: aY6tKotSoUoMIi7JiTBZq0KhtC4bslM0qvnU1EZgmMJ9rsAaBP8fCV3cugOaHB%2BO0rdqCT8BLvRpW3zZRMyaZN%2BOgLPchzBSS4WXWMJ2e%2BWfVKtx1U0WBWevGkoDU3IK
+dataKey: jRA4iyjy1ZCaIdlJBe6Cm%2BRPGb%2BwcO85%2FWR7Z9%2B8AFURWHXpnGGRrpm5yDHcoOF2C8Tqft8J9CV0I10piI5WYAsZ1UMMpIchLQcZOX75weOqRmZ%2Fu1OgDvG7H5q6CpMrnJaU0QbwWh5ogjjyITsHvQ%3D%3D
+

+ 1 - 0
config/migration.yml

@@ -1,4 +1,5 @@
 migration:
+#  patternDatetime: "yyyy-MM-dd HH:mm:ss.SSS"
   type: FILE
   autoCreateCorcos: true
   sourceDatabase:

+ 2 - 0
src/main/kotlin/com/datacomsolusindo/migration/MigrationSetting.kt

@@ -11,6 +11,8 @@ class MigrationSettingService {
     var target: Array<String>? = arrayOf()
     var schema: Array<MigrationSchema> = arrayOf()
     var autoCreateCorcos: Boolean = false
+    var patternDatetime: String = "yyyy-MM-dd'T'HH:mm:ss.SSS"
+    var rawDataDatetime: String = "yyyy-MM-dd HH:mm:ss"
 }
 
 class MigrationSchema(

+ 106 - 23
src/main/kotlin/com/datacomsolusindo/migration/data/FinalizedDataService.kt

@@ -320,8 +320,9 @@ class FinalizedDataService(
             if (temporaryDataByCode.any { a -> a.key == keyCode }) {
                 temporaryDataByCode[keyCode]
             } else {
-                 var dataUid = try {
-                    val fd = if (table == "trunk") " AND (subscribed_no != 'new trunk' OR subscribed_no IS NULL) " else " "
+                var dataUid = try {
+                    val fd =
+                        if (table == "trunk") " AND (subscribed_no != 'new trunk' OR subscribed_no IS NULL) " else " "
                     apiService.transaction { em ->
                         val result = em.createNativeQuery("SELECT $select FROM $tableName WHERE $field = :$field $fd")
                             .setParameter(field, value.toString())
@@ -334,11 +335,13 @@ class FinalizedDataService(
                     null
                 }
                 if (tableName == "corcos" && dataUid == null && migrationSettingService.autoCreateCorcos) {
-                    dataUid = insertDataService.insertDataWithNativeQuery(tableName, "command", mutableMapOf(
-                        "command" to value,
-                        "name" to value,
-                        "description" to "auto create corcos"
-                    ))
+                    dataUid = insertDataService.insertDataWithNativeQuery(
+                        tableName, "command", mutableMapOf(
+                            "command" to value,
+                            "name" to value,
+                            "description" to "auto create corcos"
+                        )
+                    )
                 }
                 temporaryDataByCode[keyCode] = dataUid
                 dataUid
@@ -527,7 +530,8 @@ class FinalizedDataService(
                 finalMapEntity,
                 functionAfter = { uid, isUpdate ->
                     // create budget
-                    if (BudgetUserType.entries.any { a -> a.name == table.uppercase() }) {
+//                    if (BudgetUserType.entries.any { a -> a.name == table.uppercase() }) {
+                    if (table == "phone_user") {
                         insertDataService.insertDataWithNativeQuery(
                             "budget", uniqueTable = null, mutableMapOf(
                                 "userType" to BudgetUserType.valueOf(table.uppercase()).ordinal,
@@ -569,19 +573,21 @@ class FinalizedDataService(
         }
     }
 
+    private fun pattern(format: String) = DateTimeFormatter.ofPattern(format)
+
     private fun buildRawData(data: MutableMap<String, Any?>): List<Any?> {
         val seg1 = "CDR"
         val seg2 = data["pbx_id"]?.let { findCodeByUid("pbx", it) ?: "" } ?: ""
         val seg3 = data["direction"]?.let { Direction.entries[it.toString().toInt()].code } ?: ""
 
         val startOfCall = data["startOfCall"]?.toString()?.let {
-            LocalDateTime.parse(it, DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS"))
+            LocalDateTime.parse(it, pattern(migrationSettingService.patternDatetime))
         }
         val endOfCall = startOfCall?.plusSeconds(data["duration"]?.toString()?.toLong() ?: 0)
 
-        val seg4 = startOfCall?.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) ?: ""
-        val seg5 = startOfCall?.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) ?: ""
-        val seg6 = endOfCall?.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) ?: ""
+        val seg4 = startOfCall?.format(pattern(migrationSettingService.rawDataDatetime)) ?: ""
+        val seg5 = startOfCall?.format(pattern(migrationSettingService.rawDataDatetime)) ?: ""
+        val seg6 = endOfCall?.format(pattern(migrationSettingService.rawDataDatetime)) ?: ""
         val seg7 = ""
         val seg8 = data["duration"]
         val seg9 = data["accessNumber"] ?: ""
@@ -634,6 +640,7 @@ class FinalizedDataService(
         val buildRawData = buildRawData(data)
         val rawData = buildRawData.joinToString(",")
 
+        data["endOfCall"] = buildRawData[5]
         data["rawData"] = rawData
         getCallTo(buildRawData[12].toString())?.forEach { (t, u) -> data[t] = u }
 //
@@ -789,8 +796,29 @@ class InsertDataService(
             fields.add(t)
         }
 
-        val fieldKey = fieldUnique?.split(";")?.mapNotNull { m -> mapData[m]?.toString() }?.joinToString(";")
-        val uidFromDb = temporaryDataByCode["$table;uid;$fieldKey"]
+        val uidFromDb = if (table == "calltransaction") null else {
+            fieldUnique?.split(";")?.let { fieldKey ->
+                val keyName = fieldKey.mapNotNull { m -> finalMap[m.replace("_uid", "_id")] }
+                    .joinToString(";")
+                temporaryDataByCode["$table;uid;$keyName"]
+//                val uidUpdate = temporaryDataByCode["$table;uid;$keyName"]
+//                if (table == "trunk" && uidUpdate == null) {
+////                    println("find trunk by name")
+//                    val keyName = fieldKey.mapNotNull { m ->
+//                        finalMap[m.replace("code", "name").replace("_uid", "_id")]?.let {
+//                            if (it.contains("Auto ")) null else it
+//                        }
+//                    }.joinToString(";")
+////                    println("keyName $table;uid;$keyName")
+//                    temporaryDataByCode["$table;uid;$keyName"]
+//                } else uidUpdate
+            }
+//            val fieldKey = fieldUnique?.split(";")?.mapNotNull { m ->
+//                finalMap[m.replace("_uid", "_id")]
+//            }?.joinToString(";")
+//            println("update key: $table;uid;$fieldKey")
+//            temporaryDataByCode["$table;uid;$fieldKey"]
+        }
         val uid = uidFromDb ?: ULID.random()
         val isUpdate = uidFromDb != null
 
@@ -808,10 +836,34 @@ class InsertDataService(
         if (isUpdate) {
             fields.remove("uid")
         }
-        val query =
-            if (table == "calltransaction") "INSERT INTO $table (${fields.joinToString() { it.camelToSnake() }}) " +
-                    "VALUES (${fields.joinToString() { ":$it" }})"
-            else {
+
+        // prepare final data
+//        println("map: ${Util.mapper.writeValueAsString(finalMap)}")
+//        if (table == "trunk") {
+//            val code = finalMap["code"]!!
+//            val name = finalMap["name"]!!
+//            if (name.startsWith("Auto ")) {
+//                finalMap["name"] = code
+//            } else {
+//                finalMap["code"] = name
+//            }
+////            println("final map: ${Util.mapper.writeValueAsString(finalMap)}")
+//        }
+
+//        println("uidFromDb: $uidFromDb")
+
+        val query = when {
+            table == "calltransaction" -> {
+                "INSERT INTO $table (${fields.joinToString() { it.camelToSnake() }}) " +
+                        "VALUES (${fields.joinToString() { ":$it" }})"
+            }
+
+            uidFromDb != null -> {
+                "UPDATE $table SET ${fields.joinToString(",\n") { "${it.camelToSnake()} = :${it}" }} " +
+                        "WHERE uid = :uid "
+            }
+
+            else -> {
                 fieldUnique?.let { fu ->
                     val uniqueOn = fu.split(";").joinToString(" AND ") { m -> "t.$m = s.$m" }
                     """
@@ -829,21 +881,52 @@ class InsertDataService(
                 } ?: ("INSERT INTO $table (${fields.joinToString() { it.camelToSnake() }}) " +
                         "VALUES (${fields.joinToString() { ":$it" }})")
             }
+        }
+
+//        val query =
+//            if (table == "calltransaction") "INSERT INTO $table (${fields.joinToString() { it.camelToSnake() }}) " +
+//                    "VALUES (${fields.joinToString() { ":$it" }})"
+//            else {
+//                fieldUnique?.let { fu ->
+//                    val uniqueOn = fu.split(";").joinToString(" AND ") { m -> "t.$m = s.$m" }
+//                    """
+//    MERGE INTO $table WITH (HOLDLOCK) AS t
+//    USING (VALUES (${fields.joinToString() { ":$it" }}))
+//        AS s(${fields.joinToString() { it.camelToSnake() }})
+//    ON $uniqueOn
+//    WHEN MATCHED THEN
+//        UPDATE SET
+//            ${fields.joinToString(",\n") { "t.${it.camelToSnake()} = s.${it.camelToSnake()}" }}
+//    WHEN NOT MATCHED THEN
+//        INSERT (${fields.joinToString { it.camelToSnake() }})
+//        VALUES (${fields.joinToString { "s.${it.camelToSnake()}" }});
+//""".trimIndent()
+//                } ?: ("INSERT INTO $table (${fields.joinToString() { it.camelToSnake() }}) " +
+//                        "VALUES (${fields.joinToString() { ":$it" }})")
+//            }
 
 
         val sqlNative = apiService.em.createNativeQuery(query)
 
-        if (table != "calltransaction" && !isUpdate) {
+        val useUidParam = if (isUpdate) true else table != "calltransaction"
+        if (useUidParam) {
             sqlNative.setParameter("uid", uid)
         }
 
         structure?.let { sqlNative.setParameter("structure", structure) }
         finalMap.forEach { (t, u) -> sqlNative.setParameter(t.replace("_id", "_uid"), u) }
-        sqlNative.executeUpdate()
-
-        functionAfter?.invoke(uid, isUpdate)
 
-        return uid
+       return try {
+           sqlNative.executeUpdate()
+           functionAfter?.invoke(uid, isUpdate)
+           uid
+       } catch (e: Exception) {
+//           println("failed insert data")
+//           println("data: ${Util.mapper.writeValueAsString(finalMap)}")
+           null
+       }
+
+//        return uid
     }
 
     fun createTableCallTransactionTemporary() {