瀏覽代碼

update bom, item, po & m18

create_edit_user
cyril.tsui 3 月之前
父節點
當前提交
47ed47f5ac
共有 31 個檔案被更改,包括 273 行新增25 行删除
  1. +1
    -2
      src/main/java/com/ffii/fpsms/m18/entity/M18DataLog.kt
  2. +2
    -1
      src/main/java/com/ffii/fpsms/m18/entity/M18DataLogRepository.kt
  3. +1
    -0
      src/main/java/com/ffii/fpsms/m18/model/M18MasterDataRequest.kt
  4. +40
    -0
      src/main/java/com/ffii/fpsms/m18/model/M18MasterDataResponse.kt
  5. +2
    -0
      src/main/java/com/ffii/fpsms/m18/model/M18PurchaseOrderResponse.kt
  6. +1
    -0
      src/main/java/com/ffii/fpsms/m18/model/M18PurchaseQuotationResponse.kt
  7. +3
    -4
      src/main/java/com/ffii/fpsms/m18/service/M18DataLogService.kt
  8. +88
    -3
      src/main/java/com/ffii/fpsms/m18/service/M18MasterDataService.kt
  9. +7
    -5
      src/main/java/com/ffii/fpsms/m18/service/M18PurchaseOrderService.kt
  10. +1
    -0
      src/main/java/com/ffii/fpsms/m18/service/M18PurchaseQuotationService.kt
  11. +18
    -0
      src/main/java/com/ffii/fpsms/m18/web/M18TestController.kt
  12. +7
    -2
      src/main/java/com/ffii/fpsms/modules/master/entity/Bom.kt
  13. +6
    -4
      src/main/java/com/ffii/fpsms/modules/master/entity/BomMaterial.kt
  14. +2
    -0
      src/main/java/com/ffii/fpsms/modules/master/entity/BomRepository.kt
  15. +1
    -1
      src/main/java/com/ffii/fpsms/modules/master/entity/Items.kt
  16. +2
    -0
      src/main/java/com/ffii/fpsms/modules/master/entity/UomConversionRepository.kt
  17. +4
    -0
      src/main/java/com/ffii/fpsms/modules/master/service/BomService.kt
  18. +4
    -0
      src/main/java/com/ffii/fpsms/modules/master/service/ShopService.kt
  19. +3
    -0
      src/main/java/com/ffii/fpsms/modules/master/service/UomConversionService.kt
  20. +18
    -0
      src/main/java/com/ffii/fpsms/modules/master/web/BomController.kt
  21. +5
    -0
      src/main/java/com/ffii/fpsms/modules/master/web/UomConversionController.kt
  22. +4
    -0
      src/main/java/com/ffii/fpsms/modules/purchaseOrder/entity/PurchaseOrder.kt
  23. +4
    -1
      src/main/java/com/ffii/fpsms/modules/purchaseOrder/service/PurchaseOrderService.kt
  24. +2
    -0
      src/main/java/com/ffii/fpsms/modules/purchaseOrder/web/model/SavePurchaseOrderRequest.kt
  25. +1
    -0
      src/main/java/com/ffii/fpsms/modules/purchaseOrder/web/model/SavePurchaseOrderResponse.kt
  26. +2
    -2
      src/main/java/com/ffii/fpsms/modules/purchaseQuotation/entity/PurchaseQuotationLine.kt
  27. +1
    -0
      src/main/java/com/ffii/fpsms/modules/purchaseQuotation/service/PurchaseQuotationService.kt
  28. +2
    -0
      src/main/java/com/ffii/fpsms/modules/purchaseQuotation/web/model/SavePurchaseQuotationRequest.kt
  29. +26
    -0
      src/main/resources/db/changelog/changes/20250526_01_cyril/01_update_bom.sql
  30. +9
    -0
      src/main/resources/db/changelog/changes/20250526_01_cyril/02_update_purchase_order.sql
  31. +6
    -0
      src/main/resources/db/changelog/changes/20250526_01_cyril/03_update_m18_data_log.sql

+ 1
- 2
src/main/java/com/ffii/fpsms/m18/entity/M18DataLog.kt 查看文件

@@ -25,9 +25,8 @@ open class M18DataLog : BaseEntity<Long>() {
@Column(name = "m18Id", nullable = false)
open var m18Id: Long? = null

@NotNull
@JdbcTypeCode(SqlTypes.JSON)
@Column(name = "dataLog", nullable = false)
@Column(name = "dataLog")
open var dataLog: MutableMap<String, Any?>? = null

@NotNull


+ 2
- 1
src/main/java/com/ffii/fpsms/m18/entity/M18DataLogRepository.kt 查看文件

@@ -1,10 +1,11 @@
package com.ffii.fpsms.m18.entity

import com.ffii.core.support.AbstractRepository
import com.ffii.fpsms.m18.enums.M18DataLogStatus
import org.springframework.stereotype.Repository

@Repository
interface M18DataLogRepository : AbstractRepository<M18DataLog, Long> {
// find latest m18 data log by m18 id & ref type & status is true & deleted is false (order by id asc limit 1)
fun findTopByM18IdAndRefTypeAndDeletedIsFalseAndStatusIsTrueOrderByIdDesc(m18Id: Long, refType: String): M18DataLog?
fun findTopByM18IdAndRefTypeAndDeletedIsFalseAndStatusOrderByIdDesc(m18Id: Long, refType: String, status: M18DataLogStatus): M18DataLog?
}

+ 1
- 0
src/main/java/com/ffii/fpsms/m18/model/M18MasterDataRequest.kt 查看文件

@@ -8,6 +8,7 @@ enum class StSearchType(val value: String) {
UNIT("unit"),
CURRENCY("cur"),
BOM("udfbomforshop"),
BUSINESS_UNIT("virDept"),
}

/** M18 Common Master Data Request */


+ 40
- 0
src/main/java/com/ffii/fpsms/m18/model/M18MasterDataResponse.kt 查看文件

@@ -191,4 +191,44 @@ data class M18BomUdfProduct (
val udfProduct: Long,
val udfIngredients: String,
val udfBaseUnit: String,
)

/** Shop Response */
data class M18BusinessUnitResponse (
val data: M18BusinessUnitData?,
val messages: List<M18ErrorMessages>?
)

data class M18BusinessUnitData (
val virdept: List<M18BusinessUnitVirdept>?
)

data class M18BusinessUnitVirdept (
val id: Long,
val code: String,
/** name */
val desc: String,
val `desc_zh-TW`: String,
/** contactNo */
val tel: String,
val email: String,
val addr: String,
val addr_en: String,
val addr2: String,
val addr2_en: String,
val addr3: String,
val addr3_en: String,
val udfdistrict: Long,
val lastModifyDate: Long,
)

/** BusinessUnit List Response */
data class M18BusinessUnitListResponse (
val values: List<M18BusinessUnitListValue>?,
val messages: List<M18ErrorMessages>?
)

data class M18BusinessUnitListValue (
val id: Long,
val lastModifyDate: String?,
)

+ 2
- 0
src/main/java/com/ffii/fpsms/m18/model/M18PurchaseOrderResponse.kt 查看文件

@@ -27,6 +27,8 @@ data class M18PurchaseOrderMainPo (
val tDate: Long,
val lastModifyDate: Long,
val curId: Long,
/** Business Unit (Shop) */
val virDeptId: Long?,
)

data class M18PurchaseOrderPot (


+ 1
- 0
src/main/java/com/ffii/fpsms/m18/model/M18PurchaseQuotationResponse.kt 查看文件

@@ -19,6 +19,7 @@ data class M18PurchaseQuotationMainvqu(
val tDate: Long,
val venId: Long,
val manId: Long,
val curId: Long,
val code: String,
)



+ 3
- 4
src/main/java/com/ffii/fpsms/m18/service/M18DataLogService.kt 查看文件

@@ -5,7 +5,6 @@ import com.ffii.fpsms.m18.entity.M18DataLogRepository
import com.ffii.fpsms.m18.enums.M18DataLogStatus
import com.ffii.fpsms.m18.model.M18DataLogResponse
import com.ffii.fpsms.m18.model.SaveM18DataLogRequest
import com.ffii.fpsms.modules.purchaseOrder.enums.PurchaseOrderStatus
import org.springframework.stereotype.Service
import kotlin.jvm.optionals.getOrDefault

@@ -13,8 +12,8 @@ import kotlin.jvm.optionals.getOrDefault
class M18DataLogService(
val m18DataLogRepository: M18DataLogRepository
) {
fun findLatestM18DataLog(m18Id: Long, refType: String): M18DataLog? {
return m18DataLogRepository.findTopByM18IdAndRefTypeAndDeletedIsFalseAndStatusIsTrueOrderByIdDesc(m18Id, refType)
fun findLatestM18DataLogWithSuccess(m18Id: Long, refType: String): M18DataLog? {
return m18DataLogRepository.findTopByM18IdAndRefTypeAndDeletedIsFalseAndStatusOrderByIdDesc(m18Id, refType, M18DataLogStatus.SUCCESS)
}

fun saveM18DataLog(request: SaveM18DataLogRequest): M18DataLogResponse {
@@ -27,7 +26,7 @@ class M18DataLogService(
refType = request.refType ?: this.refType
m18Id = request.m18Id ?: this.m18Id
m18LastModifyDate = request.m18LastModifyDate ?: this.m18LastModifyDate
dataLog = request.dataLog ?: request.dataLog
dataLog = request.dataLog ?: this.dataLog
this.status = status
}



+ 88
- 3
src/main/java/com/ffii/fpsms/m18/service/M18MasterDataService.kt 查看文件

@@ -54,6 +54,7 @@ open class M18MasterDataService(
val M18_LOAD_UNIT_API = "${M18_COMMON_LOAD_LINE_API}/${StSearchType.UNIT.value}"
val M18_LOAD_CURRENCY_API = "${M18_COMMON_LOAD_LINE_API}/${StSearchType.CURRENCY.value}"
val M18_LOAD_BOM_API = "${M18_COMMON_LOAD_LINE_API}/${StSearchType.BOM.value}"
val M18_LOAD_BUSINESS_UNIT_API = "${M18_COMMON_LOAD_LINE_API}/${StSearchType.BUSINESS_UNIT.value}" // for shop po?

// --------------------------------------------- Common Function --------------------------------------------- ///
private inline fun <reified T : Any> getList(
@@ -302,7 +303,7 @@ open class M18MasterDataService(
logger.info("--------------------------------------------End - Saving M18 Vendors--------------------------------------------")
}

// --------------------------------------------- Unit --------------------------------------------- ///
// --------------------------------------------- Unit (UoM) --------------------------------------------- ///
open fun getUnits(): M18UnitListResponse? {
// seems no beId
return getList<M18UnitListResponse>(
@@ -487,7 +488,6 @@ open class M18MasterDataService(
logger.info(bomUdfProduct.toString())
if (bomUdfBomForShop != null && bomUdfProduct != null) {
// Save Bom
logger.info("AAAAA")
val saveBomRequest = SaveBomRequest(
// itemId = itemsService.findByNameAndM18UomId(bomUdfBomForShop.desc, bomUdfBomForShop.udfUnit)?.id,
code = bomUdfBomForShop.code,
@@ -500,7 +500,6 @@ open class M18MasterDataService(
m18Id = bomUdfBomForShop.id,
m18LastModifyDate = commonUtils.timestampToLocalDateTime(bomUdfBomForShop.lastModifyDate)
)
logger.info("BBBBB")
val bomId = bomService.saveBom(saveBomRequest).id
successList += bom.id

@@ -560,4 +559,90 @@ open class M18MasterDataService(

logger.info("--------------------------------------------End - Saving Boms--------------------------------------------")
}

// --------------------------------------------- Business Unit (Shop) --------------------------------------------- ///
open fun getBusinessUnits(): M18BusinessUnitListResponse? {
// seems no beId
return getList<M18BusinessUnitListResponse>(
stSearch = StSearchType.BUSINESS_UNIT.value,
params = null,
// conds = beIdConds
)
}

open fun getBusinessUnit(id: Long): M18BusinessUnitResponse? {
logger.info("M18 Business Unit ID: $id")
return getLine<M18BusinessUnitResponse>(
id = id,
params = null,
api = M18_LOAD_BUSINESS_UNIT_API
)
}

open fun saveBusinessUnits() {
logger.info("--------------------------------------------Start - Saving M18 Business Units (Shops)--------------------------------------------")
val businessUnits = getBusinessUnits()

val successList = mutableListOf<Long>()
val failList = mutableListOf<Long>()
val values = businessUnits?.values?.sortedBy { it.id }
val busMessages = if(businessUnits?.messages?.isNotEmpty() == true) businessUnits.messages[0] else null

if (values != null) {
values.forEach { businessUnit ->
// if (vendor.id in exampleVendors) {
try {
val businessUnitDetail = getBusinessUnit(businessUnit.id)
val virdept = businessUnitDetail?.data?.virdept?.get(0)
val buMessages = if(businessUnitDetail?.messages?.isNotEmpty() == true) businessUnitDetail?.messages[0] else null

if (virdept != null) {

val saveShopRequest = SaveShopRequest(
id = null,
code = virdept.code,
name = virdept.desc.ifEmpty { virdept.`desc_zh-TW` },
brNo = null,
contactNo = virdept.tel,
contactEmail = virdept.email,
contactName = null,
addr1 = virdept.addr.ifEmpty { virdept.addr_en },
addr2 = virdept.addr2.ifEmpty { virdept.addr2_en },
addr3 = virdept.addr3.ifEmpty { virdept.addr3_en },
addr4 = null,
district = null,
type = ShopType.SHOP.value,
m18Id = businessUnit.id,
m18LastModifyDate = commonUtils.timestampToLocalDateTime(virdept.lastModifyDate)
)

shopService.saveShop(saveShopRequest)
successList.add(businessUnit.id)
logger.info("Success Count ${successList.size}: ${businessUnit.id} | ${virdept.code} | ${virdept.desc}")
} else {
failList.add(businessUnit.id)
logger.error("(Business Unit) Fail Message: ${buMessages?.msgDetail}")
logger.error("(Business Unit) Fail Count ${failList.size}: Business Unit ID - ${businessUnit.id} Not Found")
}
} catch (e: Exception) {
failList.add(businessUnit.id)
logger.error("(Business Unit) Exception")
logger.error("(Business Unit) Fail Message: ${e.message}")
logger.error("(Business Unit) Fail Count ${failList.size}: Business Unit ID - ${businessUnit.id}")
}
// }
}
} else {
logger.error("(Business Unit) Business Unit List is null. May occur errors.")
logger.error("(Business Unit)) Fail Message: ${busMessages?.msgDetail}")
logger.error("(Business Unit) Business Unit List is null. May occur errors.")
}

logger.info("Total Success (${successList.size})")

if (failList.size > 0) {
logger.error("Total Fail (${failList.size}): $failList")
}
logger.info("--------------------------------------------End - Saving M18 Business Units--------------------------------------------")
}
}

+ 7
- 5
src/main/java/com/ffii/fpsms/m18/service/M18PurchaseOrderService.kt 查看文件

@@ -56,7 +56,7 @@ open class M18PurchaseOrderService(
val materialPoBuyers =
commonUtils.listToString(listOf(m18Config.BEID_PP, m18Config.BEID_PF), "beId=equal=", "=or=")
val materialPoSupplierNot = commonUtils.listToString(
shopService.findM18VendorIdsByCodeNotRegexp(m18Config.MATERIAL_PO_SUPPLIER_NOT),
shopService.findM18VendorIdsByCodeRegexp(m18Config.MATERIAL_PO_SUPPLIER_NOT),
"venId=unequal=",
"=or="
)
@@ -194,8 +194,9 @@ open class M18PurchaseOrderService(
// Find the latest m18 data log by m18 id & type
logger.info("${poRefType}: Finding For Latest M18 Data Log...")
val latestPurchaseOrderLog =
m18DataLogService.findLatestM18DataLog(purchaseOrder.id, poRefType)
m18DataLogService.findLatestM18DataLogWithSuccess(purchaseOrder.id, poRefType)

logger.info(latestPurchaseOrderLog.toString())
// Save to m18_data_log table
logger.info("${poRefType}: Saving for M18 Data Log...")
val mainpoJson =
@@ -228,6 +229,7 @@ open class M18PurchaseOrderService(
id = existingPurchaseOrder?.id,
code = mainpo.code,
m18SupplierId = mainpo.venId,
m18ShopId = mainpo.virDeptId,
m18CurrencyId = mainpo.curId,
orderDate = commonUtils.timestampToLocalDateTime(mainpo.tDate),
estimatedArrivalDate = commonUtils.timestampToLocalDateTime(mainpo.dDate),
@@ -243,7 +245,7 @@ open class M18PurchaseOrderService(

// Update m18_data_log with success
val successSaveM18PurchaseOrderLogRequest = SaveM18DataLogRequest(
id = saveM18PurchaseOrderLogRequest.id,
id = saveM18PurchaseOrderLog.id,
dataLog = mainpoJson,
statusEnum = M18DataLogStatus.SUCCESS
)
@@ -261,7 +263,7 @@ open class M18PurchaseOrderService(
logger.error(e.message)

val errorSaveM18PurchaseOrderLogRequest = SaveM18DataLogRequest(
id = saveM18PurchaseOrderLogRequest.id,
id = saveM18PurchaseOrderLog.id,
dataLog = mutableMapOf(Pair("Exception Message", e.message)),
statusEnum = M18DataLogStatus.FAIL
)
@@ -279,7 +281,7 @@ open class M18PurchaseOrderService(
// Find the latest m18 data log by m18 id & type
logger.info("${poLineRefType}: Finding For Latest M18 Data Log...")
val latestPurchaseOrderLineLog =
m18DataLogService.findLatestM18DataLog(line.id, poLineRefType)
m18DataLogService.findLatestM18DataLogWithSuccess(line.id, poLineRefType)
// logger.info("${poLineRefType}: Latest M18 Data Log ID: ${latestPurchaseOrderLineLog?.id}")

// Save to m18_data_log table


+ 1
- 0
src/main/java/com/ffii/fpsms/m18/service/M18PurchaseQuotationService.kt 查看文件

@@ -118,6 +118,7 @@ open class M18PurchaseQuotationService(
expiryDate = commonUtils.timestampToLocalDateTime(mainvqu.expDate),
effectiveDate = commonUtils.timestampToLocalDateTime(mainvqu.tDate),
m18ShopId = mainvqu.venId,
m18CurrencyId = mainvqu.curId,
remarks = remvqu?.remarks,
m18Id = mainvqu.id,
m18LastModifyDate = commonUtils.timestampToLocalDateTime(mainvqu.lastModifyDate)


+ 18
- 0
src/main/java/com/ffii/fpsms/m18/web/M18TestController.kt 查看文件

@@ -57,6 +57,18 @@ class M18TestController (
println(response?.uom?.id)
return response
}
// --------------------------------------------- Master Data --------------------------------------------- ///
@GetMapping("/master-data")
fun m18MasterData() {
// Master Data
m18MasterDataService.saveUnits()
m18MasterDataService.saveProducts()
m18MasterDataService.saveVendors()
m18MasterDataService.saveBusinessUnits()
m18MasterDataService.saveCurrencies()
m18MasterDataService.saveBoms()
}

// --------------------------------------------- Master Data --------------------------------------------- ///
@GetMapping("/product")
fun m18Products() {
@@ -88,6 +100,12 @@ class M18TestController (
m18MasterDataService.saveBoms()
}

@GetMapping("/businessUnit")
fun m18BusinessUnit() {
logger.info("Access token: ${m18Config.ACCESS_TOKEN}")
m18MasterDataService.saveBusinessUnits()
}

// --------------------------------------------- Purchase Order --------------------------------------------- ///
@GetMapping("/po")
fun m18PO() {


+ 7
- 2
src/main/java/com/ffii/fpsms/modules/master/entity/Bom.kt 查看文件

@@ -1,5 +1,6 @@
package com.ffii.fpsms.modules.master.entity

import com.fasterxml.jackson.annotation.JsonManagedReference
import com.ffii.core.entity.BaseEntity
import jakarta.persistence.*
import jakarta.validation.constraints.NotNull
@@ -20,9 +21,9 @@ open class Bom : BaseEntity<Long>() {
@Column(name = "code", nullable = false, length = 30)
open var code: String? = null

@Size(max = 30)
@Size(max = 100)
@NotNull
@Column(name = "name", nullable = false, length = 30)
@Column(name = "name", nullable = false, length = 100)
open var name: String? = null

@Size(max = 100)
@@ -44,6 +45,10 @@ open class Bom : BaseEntity<Long>() {
@JoinColumn(name = "uomId")
open var uom: UomConversion? = null

@JsonManagedReference
@OneToMany(mappedBy = "bom", cascade = [CascadeType.ALL], orphanRemoval = true)
open var bomMaterials: MutableList<BomMaterial> = mutableListOf()

@Column(name = "m18Id")
open var m18Id: Long? = null



+ 6
- 4
src/main/java/com/ffii/fpsms/modules/master/entity/BomMaterial.kt 查看文件

@@ -1,5 +1,6 @@
package com.ffii.fpsms.modules.master.entity

import com.fasterxml.jackson.annotation.JsonBackReference
import com.ffii.core.entity.BaseEntity
import jakarta.persistence.*
import jakarta.validation.constraints.NotNull
@@ -15,8 +16,8 @@ open class BomMaterial : BaseEntity<Long>() {
@JoinColumn(name = "itemId")
open var item: Items? = null

@Size(max = 50)
@Column(name = "itemName", length = 50)
@Size(max = 100)
@Column(name = "itemName", length = 100)
open var itemName: String? = null

@NotNull
@@ -31,13 +32,14 @@ open class BomMaterial : BaseEntity<Long>() {
@JoinColumn(name = "uomId")
open var uom: UomConversion? = null

@Size(max = 50)
@Column(name = "uomName", length = 50)
@Size(max = 100)
@Column(name = "uomName", length = 100)
open var uomName: String? = null

@NotNull
@ManyToOne(optional = false)
@JoinColumn(name = "bomId", nullable = false)
@JsonBackReference
open var bom: Bom? = null

@NotNull


+ 2
- 0
src/main/java/com/ffii/fpsms/modules/master/entity/BomRepository.kt 查看文件

@@ -6,6 +6,8 @@ import java.io.Serializable

@Repository
interface BomRepository : AbstractRepository<Bom, Long> {
fun findAllByDeletedIsFalse(): List<Bom>

fun findByIdAndDeletedIsFalse(id: Serializable): Bom?

fun findByM18IdAndDeletedIsFalse(m18Id: Long): Bom?

+ 1
- 1
src/main/java/com/ffii/fpsms/modules/master/entity/Items.kt 查看文件

@@ -44,5 +44,5 @@ open class Items : BaseEntity<Long>() {

@JsonManagedReference
@OneToMany(mappedBy = "item", cascade = [CascadeType.ALL], orphanRemoval = true)
open var itemUoms: MutableSet<ItemUom> = mutableSetOf()
open var itemUoms: MutableList<ItemUom> = mutableListOf()
}

+ 2
- 0
src/main/java/com/ffii/fpsms/modules/master/entity/UomConversionRepository.kt 查看文件

@@ -7,6 +7,8 @@ import java.time.LocalDateTime
@Repository
interface UomConversionRepository : AbstractRepository<UomConversion, Long> {
//fun importFromM18(): ArrayList<UomConversion>;
fun findAllByDeletedFalse(): List<UomConversion>;

fun findByIdAndDeletedFalse(id: Long): UomConversion?;

fun findByM18IdAndDeletedFalse(m18Id: Long): UomConversion?;


+ 4
- 0
src/main/java/com/ffii/fpsms/modules/master/service/BomService.kt 查看文件

@@ -14,6 +14,10 @@ open class BomService(
val uomConversionService: UomConversionService
) {

open fun findAll(): List<Bom> {
return bomRepository.findAll()
}

open fun findById(id: Long): Bom? {
return bomRepository.findByIdAndDeletedIsFalse(id)
}


+ 4
- 0
src/main/java/com/ffii/fpsms/modules/master/service/ShopService.kt 查看文件

@@ -25,6 +25,10 @@ open class ShopService(
return shopRepository.findByM18IdAndTypeAndDeletedIsFalse(m18Id, ShopType.SUPPLIER)
}

open fun findShopByM18Id(m18Id: Long): Shop? {
return shopRepository.findByM18IdAndTypeAndDeletedIsFalse(m18Id, ShopType.SHOP)
}

open fun findM18VendorIdsByCodeRegexp(code: List<String>): List<Long>? {
val codeRegexp = code.joinToString("|")
return shopRepository.findM18IdsByCodeRegexpAndTypeAndDeletedIsFalse(codeRegexp, type = ShopType.SUPPLIER.value)


+ 3
- 0
src/main/java/com/ffii/fpsms/modules/master/service/UomConversionService.kt 查看文件

@@ -195,6 +195,9 @@ open class UomConversionService(
}
}
}
open fun findAll(): List<UomConversion> {
return uomConversionRepository.findAllByDeletedFalse();
}

open fun findById(id: Long): UomConversion? {
return uomConversionRepository.findByIdAndDeletedFalse(id)


+ 18
- 0
src/main/java/com/ffii/fpsms/modules/master/web/BomController.kt 查看文件

@@ -0,0 +1,18 @@
package com.ffii.fpsms.modules.master.web

import com.ffii.fpsms.modules.master.entity.Bom
import com.ffii.fpsms.modules.master.service.BomService
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController

@RestController
@RequestMapping("/bom")
class BomController (
val bomService: BomService,
) {
@GetMapping
fun getBoms(): List<Bom> {
return bomService.findAll()
}
}

+ 5
- 0
src/main/java/com/ffii/fpsms/modules/master/web/UomConversionController.kt 查看文件

@@ -24,6 +24,11 @@ class UomConversionController(
// return uomConversionService.allItems()
// }

@GetMapping
fun getUoms(): List<UomConversion> {
return uomConversionService.findAll()
}

@RequestMapping(value = ["/castBom"], method = [RequestMethod.GET])
fun convertBom(request: HttpServletRequest?): ArrayList<UomConversion> {
try {


+ 4
- 0
src/main/java/com/ffii/fpsms/modules/purchaseOrder/entity/PurchaseOrder.kt 查看文件

@@ -25,6 +25,10 @@ open class PurchaseOrder : BaseEntity<Long>() {
@JoinColumn(name = "supplierId")
open var supplier: Shop? = null

@ManyToOne
@JoinColumn(name = "shopId")
open var shop: Shop? = null

@Column(name = "orderDate")
open var orderDate: LocalDateTime? = null



+ 4
- 1
src/main/java/com/ffii/fpsms/modules/purchaseOrder/service/PurchaseOrderService.kt 查看文件

@@ -92,6 +92,8 @@ open class PurchaseOrderService(
request.id?.let { purchaseOrderRepository.findById(it).getOrDefault(PurchaseOrder()) } ?: PurchaseOrder()
val supplier = request.m18SupplierId?.let { shopService.findVendorByM18Id(it) }
?: request.supplierId?.let { shopService.findById(it) }
val shop = request.m18ShopId?.let { shopService.findShopByM18Id(it) }
?: request.shopId?.let { shopService.findById(it) }
val currency = request.m18CurrencyId?.let { currencyService.findByM18Id(it) }
?: request.currencyId?.let { currencyService.findById(it) }
val status = request.status?.let { status -> PurchaseOrderStatus.entries.find { it.value == status } }
@@ -99,10 +101,10 @@ open class PurchaseOrderService(
val m18DataLog = request.m18DataLogId?.let { m18DataLogRepository.findById(it).getOrNull() }

//Need check duplicate?

purchaseOrder.apply {
code = request.code
this.supplier = supplier
this.shop = shop
this.currency = currency
orderDate = request.orderDate
estimatedArrivalDate = request.estimatedArrivalDate
@@ -117,6 +119,7 @@ open class PurchaseOrderService(
id = it.id,
code = it.code,
supplierCode = it.supplier?.code,
shopCode = it.shop?.code,
currencyCode = it.currency?.code,
orderDate = it.orderDate,
estimatedArrivalDate = it.estimatedArrivalDate,


+ 2
- 0
src/main/java/com/ffii/fpsms/modules/purchaseOrder/web/model/SavePurchaseOrderRequest.kt 查看文件

@@ -9,6 +9,8 @@ data class SavePurchaseOrderRequest (
val code: String?,
val supplierId: Long? = null,
val m18SupplierId: Long? = null,
val shopId: Long? = null,
val m18ShopId: Long? = null,
val currencyId: Long? = null,
val m18CurrencyId: Long? = null,
val orderDate: LocalDateTime?,


+ 1
- 0
src/main/java/com/ffii/fpsms/modules/purchaseOrder/web/model/SavePurchaseOrderResponse.kt 查看文件

@@ -8,6 +8,7 @@ data class SavePurchaseOrderResponse (
val id: Long?,
val code: String?,
val supplierCode: String?,
val shopCode: String?,
val currencyCode: String?,
val orderDate: LocalDateTime?,
val estimatedArrivalDate: LocalDateTime?,


+ 2
- 2
src/main/java/com/ffii/fpsms/modules/purchaseQuotation/entity/PurchaseQuotationLine.kt 查看文件

@@ -23,8 +23,8 @@ open class PurchaseQuotationLine : BaseEntity<Long>() {
@Column(name = "code", length = 30)
open var code: String? = null

@Size(max = 30)
@Column(name = "description", length = 30)
@Size(max = 300)
@Column(name = "description", length = 300)
open var description: String? = null

@ManyToOne


+ 1
- 0
src/main/java/com/ffii/fpsms/modules/purchaseQuotation/service/PurchaseQuotationService.kt 查看文件

@@ -23,6 +23,7 @@ open class PurchaseQuotationService(
open fun savePurchaseQuotation(request: SavePurchaseQuotationRequest): SavePurchaseQuotationResponse {
val purchaseQuotation = request.m18Id?.let { findByM18Id(it) } ?: request.id?.let { findById(it) } ?: PurchaseQuotation()
val shop = request.m18ShopId?.let { shopService.findVendorByM18Id(it) } ?: request.shopId?.let { shopService.findById(it) }
val currency = request.m18CurrencyId?.let { }

purchaseQuotation.apply {
code = request.code


+ 2
- 0
src/main/java/com/ffii/fpsms/modules/purchaseQuotation/web/model/SavePurchaseQuotationRequest.kt 查看文件

@@ -9,6 +9,8 @@ data class SavePurchaseQuotationRequest(
val effectiveDate: LocalDateTime? = null,
val shopId: Long? = null,
val m18ShopId: Long? = null,
val currencyId: Long? = null,
val m18CurrencyId: Long? = null,
val remarks: String? = null,
val m18Id: Long? = null,
val m18LastModifyDate: LocalDateTime? = null,


+ 26
- 0
src/main/resources/db/changelog/changes/20250526_01_cyril/01_update_bom.sql 查看文件

@@ -0,0 +1,26 @@
-- liquibase formatted sql

-- changeset cyril:update bom
ALTER TABLE `bom`
CHANGE COLUMN `name` `name` VARCHAR(100) NOT NULL ;


ALTER TABLE `bom_material`
ADD COLUMN `itemName` VARCHAR(100) NULL AFTER `itemId`,
ADD COLUMN `uomName` VARCHAR(100) NULL AFTER `uomId`,
ADD COLUMN `remarks` VARCHAR(1000) NULL AFTER `bomId`
;

ALTER TABLE `bom_material`
DROP FOREIGN KEY `FK_BOM_MATERIAL_ON_ITEMID`,
DROP FOREIGN KEY `FK_BOM_MATERIAL_ON_UOMID`;
ALTER TABLE `bom_material`
CHANGE COLUMN `itemId` `itemId` INT NULL,
CHANGE COLUMN `uomId` `uomId` INT NULL;
ALTER TABLE `bom_material`
ADD CONSTRAINT `FK_BOM_MATERIAL_ON_ITEMID`
FOREIGN KEY (`itemId`)
REFERENCES `items` (`id`),
ADD CONSTRAINT `FK_BOM_MATERIAL_ON_UOMID`
FOREIGN KEY (`uomId`)
REFERENCES `uom_conversion` (`id`);

+ 9
- 0
src/main/resources/db/changelog/changes/20250526_01_cyril/02_update_purchase_order.sql 查看文件

@@ -0,0 +1,9 @@
-- liquibase formatted sql

-- changeset cyril:update purchase order

ALTER TABLE `purchase_order`
ADD COLUMN `shopId` INT NULL AFTER `supplierId`,
ADD CONSTRAINT `FK_PURCHASE_ORDER_ON_SHOPID`
FOREIGN KEY (`shopId`)
REFERENCES `shop` (`id`);

+ 6
- 0
src/main/resources/db/changelog/changes/20250526_01_cyril/03_update_m18_data_log.sql 查看文件

@@ -0,0 +1,6 @@
-- liquibase formatted sql

-- changeset cyril:update m18 data log

ALTER TABLE `m18_data_log`
CHANGE COLUMN `dataLog` `dataLog` JSON NULL ;

Loading…
取消
儲存