فهرست منبع

perbaikan call transaction

masarif 1 هفته پیش
والد
کامیت
23e101ecfc

+ 1 - 1
config/general-setting.yml

@@ -182,7 +182,7 @@ redirectUrl:
 - http://localhost:4200/oauth2redirect
 - https://cmpd.telmessenger.com/oauth2redirect
 - https://app.insomnia.rest/oauth/redirect
-dataKey: aY6tKotSoUoMIi7JiTBZq%2B9DncnROCQuIFA4CyJXUMuktp4W0u5C9eZjKuE%2FC8LaLa7mh1RZlROXD10B%2BNuLQLMWT5KP1ibNurybHs0Ced49gXYJZlqA%2BmuDNpA9DXLe
+dataKey: RMyvjTZXDMBnCr3jymw9oEib1gkpn7D%2FUH%2FdpJG9aJKNSkY9oU9nYuXGxkgsI6zBBLEAetoMH4gd7KdidD2Yp7Tieldm5LHjFFV2JTjcXibjwZdDx0GR8LhkB400WpwV
 
 #database: 
 #  type: sqlserver

+ 1 - 0
src/main/kotlin/com/datacomsolusindo/migration/MigrationApplication.kt

@@ -57,6 +57,7 @@ class AppEvent(
 
     @EventListener(ApplicationReadyEvent::class)
     fun doSomethingAfterStartup() {
+        println("runtime max ram: ${Runtime.getRuntime().maxMemory()}");
         logger.info("started service migration data with support mandiri menghidupi")
         logger.info("build information 20260520.1")
 //        val folder = Paths.get("migration")

+ 121 - 60
src/main/kotlin/com/datacomsolusindo/migration/data/FinalizedDataService.kt

@@ -20,6 +20,7 @@ import kotlin.time.measureTimedValue
 val temporaryPrepareCallTransactionCallTo: MutableMap<String, Map<String, Any?>?> = mutableMapOf()
 val temporaryPrepareCallTransactionCallFrom: MutableMap<String, String?> = mutableMapOf()
 
+
 @Service
 class FinalizedDataService(
     private val cpDecrypt: CpDecrypt,
@@ -318,7 +319,8 @@ class FinalizedDataService(
                 temporaryDataByCode[keyCode]
             } else {
                 try {
-                    val fd = if (table == "trunk") " AND (subscribed_no != 'new trunk' OR subscribed_no IS NULL) " else " "
+                    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())
@@ -444,7 +446,8 @@ class FinalizedDataService(
             val finalMapEntity = when (table) {
                 "calltransaction" -> {
                     val callMap = prepareDataCallTransaction(finalizer)
-                    callMap["additionalData1"] = "migration"
+                    callMap["additionalData1"] =
+                        "migration-${LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"))}"
                     callMap
                 }
 
@@ -601,25 +604,28 @@ class FinalizedDataService(
         data["transferType"] = when {
             (data["extTransferFrom"]?.toString()?.isBlank() ?: false)
                     && (data["extTransferTo"]?.toString()?.isBlank() ?: false) -> TransferType.DIRECT
+
             (data["extTransferFrom"]?.toString()?.isBlank() ?: false)
                     && (data["extTransferTo"]?.toString()?.isNotBlank() ?: false) -> TransferType.TRANSFER_TO
+
             (data["extTransferFrom"]?.toString()?.isNotBlank() ?: false)
                     && (data["extTransferTo"]?.toString()?.isBlank() ?: false) -> TransferType.TRANSFER_FROM
+
             else -> null
         }
         val buildRawData = buildRawData(data)
         val rawData = buildRawData.joinToString(",")
 
         data["rawData"] = rawData
-        getCallTo(buildRawData[12].toString())?.forEach { (t, u) -> data[t] = u }
-
-        data["area_uid"]?.toString()?.let { area ->
-            val domainFrom = getCallFrom(area, buildRawData[10]?.toString(), buildRawData[1]?.toString())
-            data["zone_uid"]?.toString()?.let {
-                val zoneDomain = if (data["domain"] == domainFrom) "LOC" else "NDD"
-                data["zone_uid"] = findUidByCode("zone", zoneDomain)
-            }
-        }
+//        getCallTo(buildRawData[12].toString())?.forEach { (t, u) -> data[t] = u }
+//
+//        data["area_uid"]?.toString()?.let { area ->
+//            val domainFrom = getCallFrom(area, buildRawData[10]?.toString(), buildRawData[1]?.toString())
+//            data["zone_uid"]?.toString()?.let {
+//                val zoneDomain = if (data["domain"] == domainFrom) "LOC" else "NDD"
+//                data["zone_uid"] = findUidByCode("zone", zoneDomain)
+//            }
+//        }
         data["transferType"]?.let {
             data["transferType"] = (it as TransferType).ordinal
         }
@@ -688,6 +694,33 @@ class FinalizedDataService(
         }
     }
 
+    fun prepareDataCallTransaction() {
+        apiService.findListAll(PhoneUser::class.java, select = listOf("uid", "code")).forEach {
+            val keyCode = "phone_user;uid;${it["code"] ?: "#"}"
+            temporaryDataByCode[keyCode] = it["uid"]?.toString()
+        }
+        apiService.findListAll(Organization::class.java, select = listOf("uid", "code")).forEach {
+            val keyCode = "organization;uid;${it["code"] ?: "#"}"
+            temporaryDataByCode[keyCode] = it["uid"]?.toString()
+        }
+        apiService.findListAll(CostCenter::class.java, select = listOf("uid", "code")).forEach {
+            val keyCode = "cost_center;uid;${it["code"] ?: "#"}"
+            temporaryDataByCode[keyCode] = it["uid"]?.toString()
+        }
+        apiService.findListAll(Pbx::class.java, select = listOf("uid", "code")).forEach {
+            val keyCode = "pbx;uid;${it["code"] ?: "#"}"
+            temporaryDataByCode[keyCode] = it["uid"]?.toString()
+        }
+        apiService.findListAll(Trunk::class.java, select = listOf("uid", "code")).forEach {
+            val keyCode = "trunk;uid;${it["code"] ?: "#"}"
+            temporaryDataByCode[keyCode] = it["uid"]?.toString()
+        }
+        apiService.findListAll(Account::class.java, select = listOf("uid", "code")).forEach {
+            val keyCode = "account;uid;${it["code"] ?: "#"}"
+            temporaryDataByCode[keyCode] = it["uid"]?.toString()
+        }
+    }
+
 
 }
 
@@ -763,10 +796,12 @@ class InsertDataService(
             }
         }
 
-
-        val query = fieldUnique?.let { fu ->
-            val uniqueOn = fu.split(";").joinToString(" AND ") { m -> "t.$m = s.$m" }
-            """
+        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() }})
@@ -778,8 +813,10 @@ class InsertDataService(
         INSERT (${fields.joinToString { it.camelToSnake() }})
         VALUES (${fields.joinToString { "s.${it.camelToSnake()}" }});
 """.trimIndent()
-        } ?: ("INSERT INTO $table (${fields.joinToString() { it.camelToSnake() }}) " +
-                "VALUES (${fields.joinToString() { ":$it" }})")
+                } ?: ("INSERT INTO $table (${fields.joinToString() { it.camelToSnake() }}) " +
+                        "VALUES (${fields.joinToString() { ":$it" }})")
+            }
+
 
         val sqlNative = apiService.em.createNativeQuery(query)
 
@@ -796,53 +833,77 @@ class InsertDataService(
         return uid
     }
 
+    fun createTableCallTransactionTemporary() {
+        try {
+            apiService.transaction { em ->
+                em.createNativeQuery(
+                    "IF OBJECT_ID('dbo.calltransaction_temp', 'U') IS NOT NULL\n" +
+                            "BEGIN\n" +
+                            "    TRUNCATE TABLE dbo.calltransaction_temp;\n" +
+                            "END\n" +
+                            "ELSE\n" +
+                            "BEGIN\n" +
+                            "    SELECT TOP 0 *\n" +
+                            "    INTO dbo.calltransaction_temp\n" +
+                            "    FROM dbo.calltransaction;\n" +
+                            "END"
+                )
+                    .executeUpdate()
+            }
+        } catch (e: Exception) {
+            SimpleLogger.getLogger(this::class.java).error("failed create table call transaction temporary", e)
+        }
+    }
+
 
     fun updateRawData() {
         try {
             apiService.transaction { em ->
-                em.createNativeQuery("UPDATE ct\n" +
-                        "SET raw_data = CONCAT_WS(',',\n" +
-                        "\t'CDR',\n" +
-                        "    ISNULL(pbx.code, ''),\n" +
-                        "    CASE \n" +
-                        "        WHEN ct.direction = 0 THEN 'G'\n" +
-                        "        WHEN ct.direction = 1 THEN 'C'\n" +
-                        "        ELSE 'I'\n" +
-                        "    END,\n" +
-                        "    CONVERT(VARCHAR, ct.start_of_call, 120),\n" +
-                        "    CONVERT(VARCHAR, ct.start_of_call, 120),\n" +
-                        "    CONVERT(VARCHAR, DATEADD(SECOND, ct.duration, ct.start_of_call), 120),\n" +
-                        "    '',\n" +
-                        "    ct.duration,\n" +
-                        "    ISNULL(ct.access_number, ''),\n" +
-                        "    '',\n" +
-                        "    ISNULL(trunk.code, ''),\n" +
-                        "    '',\n" +
-                        "    ISNULL(ct.number,''),\n" +
-                        "    ISNULL(ct.caller_number,''),\n" +
-                        "    ISNULL(ct.pin,''),\n" +
-                        "    '',\n" +
-                        "    ISNULL(ct.extension,''),\n" +
-                        "    ISNULL(ct.ext_transfer_from,''),\n" +
-                        "    ISNULL(ct.ext_transfer_to,''),\n" +
-                        "    ISNULL(CASE WHEN ct.transfer_type = 0 THEN 'D'\n" +
-                        "\tWHEN ct.transfer_type = 1 THEN 'TF'\n" +
-                        "\tWHEN ct.transfer_type = 2 THEN 'TT'\n" +
-                        "\tELSE 'F' END,''),\n" +
-                        "    '',\n" +
-                        "    '',\n" +
-                        "    ISNULL(ct.redirect_reason,''),\n" +
-                        "    ISNULL(ct.termination_code,''),\n" +
-                        "    CASE \n" +
-                        "        WHEN ct.additional_data1 = 'migration' THEN ''\n" +
-                        "        ELSE ISNULL(ct.additional_data1,'')\n" +
-                        "    END,\n" +
-                        "    ISNULL(ct.additional_data2,'')\n" +
-                        ")\n" +
-                        "FROM calltransaction ct\n" +
-                        "LEFT JOIN pbx pbx ON pbx.uid = ct.pbx_uid\n" +
-                        "LEFT JOIN trunk trunk ON trunk.uid = ct.trunk_uid\n" +
-                        "WHERE ct.raw_data IS NULL OR ct.raw_data = ''")
+                em.createNativeQuery(
+                    "UPDATE ct\n" +
+                            "SET raw_data = CONCAT_WS(',',\n" +
+                            "\t'CDR',\n" +
+                            "    ISNULL(pbx.code, ''),\n" +
+                            "    CASE \n" +
+                            "        WHEN ct.direction = 0 THEN 'G'\n" +
+                            "        WHEN ct.direction = 1 THEN 'C'\n" +
+                            "        ELSE 'I'\n" +
+                            "    END,\n" +
+                            "    CONVERT(VARCHAR, ct.start_of_call, 120),\n" +
+                            "    CONVERT(VARCHAR, ct.start_of_call, 120),\n" +
+                            "    CONVERT(VARCHAR, DATEADD(SECOND, ct.duration, ct.start_of_call), 120),\n" +
+                            "    '',\n" +
+                            "    ct.duration,\n" +
+                            "    ISNULL(ct.access_number, ''),\n" +
+                            "    '',\n" +
+                            "    ISNULL(trunk.code, ''),\n" +
+                            "    '',\n" +
+                            "    ISNULL(ct.number,''),\n" +
+                            "    ISNULL(ct.caller_number,''),\n" +
+                            "    ISNULL(ct.pin,''),\n" +
+                            "    '',\n" +
+                            "    ISNULL(ct.extension,''),\n" +
+                            "    ISNULL(ct.ext_transfer_from,''),\n" +
+                            "    ISNULL(ct.ext_transfer_to,''),\n" +
+                            "    ISNULL(CASE WHEN ct.transfer_type = 0 THEN 'D'\n" +
+                            "\tWHEN ct.transfer_type = 1 THEN 'TF'\n" +
+                            "\tWHEN ct.transfer_type = 2 THEN 'TT'\n" +
+                            "\tELSE 'F' END,''),\n" +
+                            "    '',\n" +
+                            "    '',\n" +
+                            "    ISNULL(ct.redirect_reason,''),\n" +
+                            "    ISNULL(ct.termination_code,''),\n" +
+                            "    CASE \n" +
+                            "        WHEN ct.additional_data1 = 'migration' THEN ''\n" +
+                            "        ELSE ISNULL(ct.additional_data1,'')\n" +
+                            "    END,\n" +
+                            "    ISNULL(ct.additional_data2,'')\n" +
+                            ")\n" +
+                            "FROM calltransaction ct\n" +
+                            "LEFT JOIN pbx pbx ON pbx.uid = ct.pbx_uid\n" +
+                            "LEFT JOIN trunk trunk ON trunk.uid = ct.trunk_uid\n" +
+                            "WHERE ct.raw_data IS NULL OR ct.raw_data = ''"
+                )
             }.executeUpdate()
         } catch (e: Exception) {
             SimpleLogger.getLogger(this::class.java).error("failed update raw data blank data", e)

+ 3 - 0
src/main/kotlin/com/datacomsolusindo/migration/service/WorkerMigrationService.kt

@@ -52,7 +52,9 @@ class WorkerMigrationService(
                 val migrationData = queueInsertMigrationData.take()
                 val attribute = migrationData.first
                 if (attribute.table == "calltransaction") {
+//                    insertDataService.createTableCallTransactionTemporary()
                     insertDataService.updateRawData()
+                    finalizedDataService.prepareDataCallTransaction()
                 }
                 val data = migrationData.second
             //.take(100)
@@ -83,6 +85,7 @@ class WorkerMigrationService(
                                     "takes time ${process.duration.inWholeMilliseconds}ms"
                         )
                     }
+                    println("MIGRATION DATA END---")
                 } catch (ex: Exception) {
                     logger.error("Insert failed", ex)
                 }