From 546463d8102e49eae8f3739a5d2e7d361cb1467d Mon Sep 17 00:00:00 2001 From: "MSI\\derek" Date: Mon, 10 Mar 2025 18:51:07 +0800 Subject: [PATCH] product save & get --- .../master/entity/ProductRepository.kt | 1 + .../modules/master/service/ProductService.kt | 65 ++++++++++++++++++- .../modules/master/web/ProductController.kt | 28 ++++++++ .../master/web/models/NewProductRequest.kt | 8 +-- 4 files changed, 95 insertions(+), 7 deletions(-) create mode 100644 src/main/java/com/ffii/fpsms/modules/master/web/ProductController.kt diff --git a/src/main/java/com/ffii/fpsms/modules/master/entity/ProductRepository.kt b/src/main/java/com/ffii/fpsms/modules/master/entity/ProductRepository.kt index 1bb0363..9fb9e6a 100644 --- a/src/main/java/com/ffii/fpsms/modules/master/entity/ProductRepository.kt +++ b/src/main/java/com/ffii/fpsms/modules/master/entity/ProductRepository.kt @@ -6,4 +6,5 @@ interface ProductRepository: AbstractRepository { fun findAllByDeletedFalse(): List; fun findByIdAndDeletedFalse(id: Long): Product; + fun findByCodeAndDeletedIsFalse(code: String): Product?; } \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/master/service/ProductService.kt b/src/main/java/com/ffii/fpsms/modules/master/service/ProductService.kt index e5efebf..d481544 100644 --- a/src/main/java/com/ffii/fpsms/modules/master/service/ProductService.kt +++ b/src/main/java/com/ffii/fpsms/modules/master/service/ProductService.kt @@ -2,14 +2,73 @@ package com.ffii.fpsms.modules.master.service import com.ffii.core.support.AbstractBaseEntityService import com.ffii.core.support.JdbcDao -import com.ffii.fpsms.modules.master.entity.Material -import com.ffii.fpsms.modules.master.entity.MaterialRepository +import com.ffii.fpsms.enums.RelationColumnType import com.ffii.fpsms.modules.master.entity.Product import com.ffii.fpsms.modules.master.entity.ProductRepository +import com.ffii.fpsms.modules.master.web.models.NewProductRequest +import com.ffii.fpsms.modules.master.web.models.NewProductResponse +import org.springframework.transaction.annotation.Transactional +import kotlin.jvm.optionals.getOrNull class ProductService( private val jdbcDao: JdbcDao, - private val productRepository: ProductRepository + private val productRepository: ProductRepository, + private val uomService: ProductMaterialUomService, + private val typeService: ProductMaterialTypeService, + private val weightUnitService: ProductMaterialWeightUnitService, ): AbstractBaseEntityService(jdbcDao, productRepository) { + // do mapping with projection + open fun allProduct(): List { + // TODO: Replace by actual logic + val materials = productRepository.findAll() + return materials + } + open fun getProduct(id: Long): Product? { + return productRepository.findById(id).getOrNull() + } + @Transactional + open fun saveProduct(request: NewProductRequest): NewProductResponse { + val duplicateProduct = productRepository.findByCodeAndDeletedIsFalse(request.code) + val product = + if (request.id != null && request.id > 0) productRepository.findByIdAndDeletedFalse(request.id) + else Product() + if (duplicateProduct != null && duplicateProduct.id != request.id) { + return NewProductResponse( + id = request.id, + code = request.code, + name = request.name, + message = "The product code has already existed", + errorPosition = "code" + ) + } + product.apply { + code = request.code + name = request.name + isConsumables = request.isConsumables + description = request.description + remarks = request.remarks + shelfLife = request.shelfLife + countryOfOrigin = request.countryOfOrigin + minHumid = request.minHumid + maxHumid = request.maxHumid + minTemp = request.minTemp + maxTemp = request.maxTemp + sampleRate = request.sampleRate + passingRate = request.passingRate + netWeight = request.netWeight + } + val savedProduct = productRepository.saveAndFlush(product) + val columnName = RelationColumnType.PRODUCT + if (!request.uom.isNullOrEmpty()) uomService.saveUom(savedProduct.id!!, columnName, request.uom) + if (!request.weightUnit.isNullOrEmpty()) weightUnitService.saveWeightUnit(savedProduct.id!!, columnName, request.weightUnit) + if (!request.type.isNullOrEmpty()) typeService.saveType(savedProduct.id!!, columnName, request.type) + return NewProductResponse( + id = savedProduct.id, + name = savedProduct.name, + code = savedProduct.code, + message = "Product Save Success", + errorPosition = null, + ) + } } \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/master/web/ProductController.kt b/src/main/java/com/ffii/fpsms/modules/master/web/ProductController.kt new file mode 100644 index 0000000..1b26969 --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/master/web/ProductController.kt @@ -0,0 +1,28 @@ +package com.ffii.fpsms.modules.master.web + +import com.ffii.core.exception.NotFoundException +import com.ffii.fpsms.modules.master.entity.Product +import com.ffii.fpsms.modules.master.service.ProductService +import com.ffii.fpsms.modules.master.web.models.NewProductRequest +import com.ffii.fpsms.modules.master.web.models.NewProductResponse +import jakarta.validation.Valid +import org.springframework.web.bind.annotation.* + +@RestController +@RequestMapping("/product") +class ProductController( + private val productService: ProductService +) { + @GetMapping + fun allProduct(): List { + return productService.allProduct() + } + @GetMapping("/details/{id}") + fun getProduct(@PathVariable id: Long): Product { + return productService.getProduct(id) ?: throw NotFoundException() + } + @PostMapping("/new") + fun saveProduct(@Valid @RequestBody newProduct: NewProductRequest): NewProductResponse { + return productService.saveProduct(newProduct) + } +} \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/master/web/models/NewProductRequest.kt b/src/main/java/com/ffii/fpsms/modules/master/web/models/NewProductRequest.kt index e5523d3..eae457b 100644 --- a/src/main/java/com/ffii/fpsms/modules/master/web/models/NewProductRequest.kt +++ b/src/main/java/com/ffii/fpsms/modules/master/web/models/NewProductRequest.kt @@ -15,7 +15,7 @@ data class NewProductRequest( val id: Long?, val description: String?, val remarks: String?, - val shelfLife: Number?, + val shelfLife: Double?, val countryOfOrigin: String?, val minHumid: Double?, val maxHumid: Double?, @@ -24,7 +24,7 @@ data class NewProductRequest( val sampleRate: Double?, val passingRate: Double?, val netWeight: Double?, - val type: List?, - val uom: List?, - val weightUnit: List?, + val type: List?, + val uom: List?, + val weightUnit: List?, )