選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。
 
 
 
 
 

268 行
13 KiB

  1. package com.ffii.fpsms.m18.service
  2. import com.ffii.core.utils.JwtTokenUtil
  3. import com.ffii.fpsms.api.service.ApiCallerService
  4. import com.ffii.fpsms.m18.M18Config
  5. import com.ffii.fpsms.m18.model.*
  6. import com.ffii.fpsms.m18.utils.CommonUtils
  7. import com.ffii.fpsms.modules.master.service.ItemsService
  8. import com.ffii.fpsms.modules.master.service.ShopService
  9. import com.ffii.fpsms.modules.purchaseOrder.enums.PurchaseOrderLineStatus
  10. import com.ffii.fpsms.modules.purchaseOrder.enums.PurchaseOrderStatus
  11. import com.ffii.fpsms.modules.purchaseOrder.service.PurchaseOrderLineService
  12. import com.ffii.fpsms.modules.purchaseOrder.service.PurchaseOrderService
  13. import com.ffii.fpsms.modules.purchaseOrder.web.model.SavePurchaseOrderLineRequest
  14. import com.ffii.fpsms.modules.purchaseOrder.web.model.SavePurchaseOrderRequest
  15. import org.slf4j.Logger
  16. import org.slf4j.LoggerFactory
  17. import org.springframework.stereotype.Service
  18. import java.time.LocalDate
  19. import java.time.LocalDateTime
  20. import kotlin.reflect.full.memberProperties
  21. @Service
  22. open class M18PurchaseOrderService(
  23. val m18Config: M18Config,
  24. val apiCallerService: ApiCallerService,
  25. val m18DataLogService: M18DataLogService,
  26. val purchaseOrderService: PurchaseOrderService,
  27. val purchaseOrderLineService: PurchaseOrderLineService,
  28. val itemsService: ItemsService,
  29. val shopService: ShopService,
  30. ) {
  31. val dateTimeConverter = CommonUtils()
  32. val logger: Logger = LoggerFactory.getLogger(JwtTokenUtil::class.java)
  33. val lastModifyDate = LocalDate.now().minusDays(1)
  34. val commonConds="(beId=equal=${m18Config.BEID_PF}=or=beId=equal=${m18Config.BEID_PP}=or=beId=equal=${m18Config.BEID_TOA})=and=lastModifyDate=largerOrEqual=${lastModifyDate}"
  35. // M18 API
  36. val M18_LOAD_PURCHASE_ORDER_API = "/root/api/read/po"
  37. val M18_FETCH_PURCHASE_ORDER_LIST_API = "/search/search"
  38. open fun getPurchaseOrders(): M18PurchaseOrderListResponse? {
  39. val purchaseOrdersParams = M18PurchaseOrderListRequest(
  40. params = null,
  41. conds = commonConds
  42. )
  43. var purchaseOrders: M18PurchaseOrderListResponse? = null
  44. try {
  45. purchaseOrders = apiCallerService.get<M18PurchaseOrderListResponse, M18PurchaseOrderListRequest>(
  46. M18_FETCH_PURCHASE_ORDER_LIST_API,
  47. purchaseOrdersParams
  48. ).block()
  49. } catch (e: Exception) {
  50. logger.error("Error on Function - ${e.stackTrace}")
  51. logger.error(e.message)
  52. }
  53. return purchaseOrders
  54. }
  55. open fun getPurchaseOrder(id: Long): M18PurchaseOrderResponse? {
  56. val purchaseOrderParams = M18PurchaseOrderRequest(
  57. id = id
  58. )
  59. var purchaseOrder: M18PurchaseOrderResponse? = null
  60. try {
  61. purchaseOrder = apiCallerService.get<M18PurchaseOrderResponse, M18PurchaseOrderRequest>(
  62. M18_LOAD_PURCHASE_ORDER_API,
  63. purchaseOrderParams
  64. ).block()
  65. } catch (e: Exception) {
  66. logger.error("Error on Function - ${e.stackTrace}")
  67. logger.error(e.message)
  68. }
  69. return purchaseOrder
  70. }
  71. open fun savePurchaseOrders() {
  72. val purchaseOrders = getPurchaseOrders()
  73. val examplePurchaseOrders = listOf<Long>(4764034L)
  74. val successList = mutableListOf<Long>()
  75. val successDetailList = mutableListOf<Long>()
  76. val failList = mutableListOf<Long>()
  77. val failDetailList = mutableListOf<Long>()
  78. if (purchaseOrders != null) {
  79. // Loop for Purchase Orders (values)
  80. purchaseOrders.values.forEach { purchaseOrder ->
  81. val purchaseOrderDetail = getPurchaseOrder(purchaseOrder.id)
  82. var purchaseOrderId: Long? = null //FP-MTMS
  83. // Process for Purchase Order (mainPo)
  84. // Assume only one PO in the PO (search by PO ID)
  85. val mainPo = purchaseOrderDetail?.data?.mainPo?.get(0)
  86. val pot = purchaseOrderDetail?.data?.pot
  87. // purchase_order + m18_data_log table
  88. if (mainPo != null) {
  89. val poRefType = "Purchase Order"
  90. // Find the latest m18 data log by m18 id & type
  91. val latestM18DataLog = m18DataLogService.findLatestM18DataLog(purchaseOrder.id, poRefType)
  92. // Save to m18_data_log table
  93. val mainPoJson =
  94. mainPo::class.memberProperties.associate { prop -> prop.name to prop.getter.call(mainPo) }
  95. .toMutableMap()
  96. val saveM18PurchaseOrderLogRequest = SaveM18DataLogRequest(
  97. id = null,
  98. refType = poRefType,
  99. m18Id = purchaseOrder.id,
  100. m18LastModifyDate = dateTimeConverter.InstantToLocalDateTime(mainPo.lastModifyDate),
  101. dataLog = mainPoJson,
  102. status = true
  103. )
  104. val saveM18PurchaseOrderLog = m18DataLogService.saveM18DataLog(saveM18PurchaseOrderLogRequest)
  105. try {
  106. // Find the purchase_order if exist
  107. val existingPurchaseOrder = latestM18DataLog?.id?.let { purchaseOrderService.findPurchaseOrderByM18Id(it) }
  108. // Save to purchase_order table
  109. val supplierId = shopService.findByM18Id(mainPo.venId)?.id
  110. val savePurchaseOrderRequest = SavePurchaseOrderRequest(
  111. id = existingPurchaseOrder?.id,
  112. code = mainPo.code,
  113. supplierId = supplierId,
  114. orderDate = dateTimeConverter.InstantToLocalDateTime(mainPo.tDate),
  115. estimatedArrivalDate = dateTimeConverter.InstantToLocalDateTime(mainPo.dDate),
  116. completeDate = null,
  117. status = PurchaseOrderStatus.PENDING.value,
  118. m18DataLogId = saveM18PurchaseOrderLog.id,
  119. )
  120. val savePurchaseOrderResponse = purchaseOrderService.savePurchaseOrder(savePurchaseOrderRequest)
  121. purchaseOrderId = savePurchaseOrderResponse.id
  122. successList.add(purchaseOrder.id)
  123. } catch (e: Exception) {
  124. failList.add(purchaseOrder.id)
  125. logger.error("Error on Function - ${e.stackTrace} | Type: Purchase Order | M18 ID: ${purchaseOrder.id} | Different? ${mainPo.id}")
  126. logger.error(e.message)
  127. val errorSaveM18PurchaseOrderLogRequest = SaveM18DataLogRequest(
  128. id = saveM18PurchaseOrderLogRequest.id,
  129. refType = "Purchase Order",
  130. m18Id = purchaseOrder.id,
  131. m18LastModifyDate = dateTimeConverter.InstantToLocalDateTime(mainPo.lastModifyDate),
  132. dataLog = mainPoJson,
  133. status = false
  134. )
  135. m18DataLogService.saveM18DataLog(errorSaveM18PurchaseOrderLogRequest)
  136. }
  137. // purchase_order_line + m18_data_log
  138. if (pot != null) {
  139. // Loop for Purchase Order Lines (pot)
  140. pot.forEach { line ->
  141. val poLineRefType = "Purchase Order Line"
  142. // Find the latest m18 data log by m18 id & type
  143. val latestM18DataLog = m18DataLogService.findLatestM18DataLog(line.id, poLineRefType)
  144. // Save to m18_data_log table
  145. val lineJson =
  146. line::class.memberProperties.associate { prop -> prop.name to prop.getter.call(line) }
  147. .toMutableMap()
  148. val saveM18PurchaseOrderLineLogRequest = SaveM18DataLogRequest(
  149. id = null,
  150. refType = poLineRefType,
  151. m18Id = line.id,
  152. m18LastModifyDate = dateTimeConverter.InstantToLocalDateTime(mainPo.lastModifyDate),
  153. dataLog = lineJson,
  154. status = true
  155. )
  156. val saveM18PurchaseOrderLineLog = m18DataLogService.saveM18DataLog(saveM18PurchaseOrderLineLogRequest)
  157. val item = itemsService.findByM18Id(line.id)
  158. logger.info("Item ID: ${item?.id}")
  159. try {
  160. // Find the purchase_order_line if exist
  161. val existingPurchaseOrderLine = latestM18DataLog?.id?.let { purchaseOrderLineService.findPurchaseOrderLineByM18Id(it) }
  162. // Save to purchase_order_line table
  163. val savePurchaseOrderLineRequest = SavePurchaseOrderLineRequest(
  164. id = existingPurchaseOrderLine?.id,
  165. itemId = item?.id,
  166. uomId = null,
  167. purchaseOrderId = purchaseOrderId,
  168. qty = line.qty,
  169. price = line.amt,
  170. priceUnit = null,
  171. status = existingPurchaseOrderLine?.status?.value ?: PurchaseOrderLineStatus.PENDING.value,
  172. m18DataLogId = saveM18PurchaseOrderLineLog.id,
  173. )
  174. purchaseOrderLineService.savePurchaseOrderLine(savePurchaseOrderLineRequest)
  175. } catch (e: Exception) {
  176. failDetailList.add(line.id)
  177. logger.error("Error on Function - ${e.stackTrace} | Type: Purchase Order Line | M18 ID: ${line.id}")
  178. logger.error(e.message)
  179. val errorSaveM18PurchaseOrderLineLogRequest = SaveM18DataLogRequest(
  180. id = saveM18PurchaseOrderLineLog.id,
  181. refType = "Purchase Order",
  182. m18Id = line.id,
  183. m18LastModifyDate = dateTimeConverter.InstantToLocalDateTime(mainPo.lastModifyDate),
  184. dataLog = lineJson,
  185. status = false
  186. )
  187. m18DataLogService.saveM18DataLog(errorSaveM18PurchaseOrderLineLogRequest)
  188. }
  189. }
  190. } else {
  191. val saveM18PurchaseOrderLineLogRequest = SaveM18DataLogRequest(
  192. id = null,
  193. refType = "Purchase Order Line",
  194. m18Id = purchaseOrder.id,
  195. m18LastModifyDate = dateTimeConverter.InstantToLocalDateTime(mainPo.lastModifyDate),
  196. dataLog = mutableMapOf(Pair("Error Message", "Purchase Order Line is null")),
  197. status = false
  198. )
  199. m18DataLogService.saveM18DataLog(saveM18PurchaseOrderLineLogRequest)
  200. }
  201. } else {
  202. val saveM18DataLogRequest = SaveM18DataLogRequest(
  203. id = null,
  204. refType = "Purchase Order",
  205. m18Id = purchaseOrder.id,
  206. // m18LastModifyDate = if(mainPo?.lastModifyDate != null) dateTimeConverter.InstantToLocalDateTime(mainPo.lastModifyDate) else LocalDateTime.now(),
  207. m18LastModifyDate = LocalDateTime.now(),
  208. dataLog = mutableMapOf(Pair("Error Message", "Purchase Order is null")),
  209. status = false
  210. )
  211. m18DataLogService.saveM18DataLog(saveM18DataLogRequest)
  212. }
  213. }
  214. } else {
  215. logger.error("Purchase Order List is null. May occur errors.")
  216. }
  217. // End of save. Check result
  218. logger.info("Total Success (Purchase Order) (${successList.size}): $successList")
  219. if (failList.size > 0) {
  220. logger.error("Total Fail (Purchase Order) (${failList.size}): $failList")
  221. }
  222. logger.info("Total Success (Purchase Order Line) (${successDetailList.size}): $successDetailList")
  223. if (failDetailList.size > 0) {
  224. logger.error("Total Fail (Purchase Order Line) (${failDetailList.size}): $failDetailList")
  225. }
  226. }
  227. }