From 4b2f3410e6f1e3568c1c97c733de1611f88ddd7f Mon Sep 17 00:00:00 2001 From: "kelvin.yau" Date: Mon, 27 Oct 2025 10:22:40 +0800 Subject: [PATCH 1/3] update --- .../DeliveryNote/DeliveryNotePDF.jrxml | 140 +++++++++--------- 1 file changed, 70 insertions(+), 70 deletions(-) diff --git a/src/main/resources/DeliveryNote/DeliveryNotePDF.jrxml b/src/main/resources/DeliveryNote/DeliveryNotePDF.jrxml index 2583b02..8852a12 100644 --- a/src/main/resources/DeliveryNote/DeliveryNotePDF.jrxml +++ b/src/main/resources/DeliveryNote/DeliveryNotePDF.jrxml @@ -38,9 +38,9 @@ - <band height="50"> + <band height="88"> <staticText> - <reportElement x="430" y="10" width="40" height="18" uuid="ddea10c9-9e96-484b-b76b-bfff59950a98"> + <reportElement x="430" y="0" width="40" height="18" uuid="ddea10c9-9e96-484b-b76b-bfff59950a98"> <property name="com.jaspersoft.studio.unit.y" value="px"/> <property name="com.jaspersoft.studio.unit.height" value="px"/> </reportElement> @@ -50,14 +50,14 @@ <text><![CDATA[頁數]]></text> </staticText> <textField> - <reportElement x="470" y="10" width="20" height="18" uuid="f4a20909-91b8-41bd-940f-140adced5b18"> + <reportElement x="470" y="0" width="20" height="18" uuid="f4a20909-91b8-41bd-940f-140adced5b18"> <property name="com.jaspersoft.studio.unit.height" value="px"/> </reportElement> <textElement textAlignment="Center" verticalAlignment="Middle"/> <textFieldExpression><![CDATA[$V{PAGE_NUMBER}]]></textFieldExpression> </textField> <staticText> - <reportElement x="530" y="10" width="25" height="18" uuid="586df5fc-ea37-4896-b8df-2290890341a8"> + <reportElement x="530" y="0" width="25" height="18" uuid="586df5fc-ea37-4896-b8df-2290890341a8"> <property name="com.jaspersoft.studio.unit.y" value="px"/> <property name="com.jaspersoft.studio.unit.height" value="px"/> </reportElement> @@ -67,7 +67,7 @@ <text><![CDATA[頁]]></text> </staticText> <textField evaluationTime="Report"> - <reportElement x="510" y="10" width="20" height="18" uuid="8718a2eb-22fd-4bce-ade2-1b5869800c55"> + <reportElement x="510" y="0" width="20" height="18" uuid="8718a2eb-22fd-4bce-ade2-1b5869800c55"> <property name="com.jaspersoft.studio.unit.width" value="px"/> <property name="com.jaspersoft.studio.unit.height" value="px"/> </reportElement> @@ -75,7 +75,7 @@ <textFieldExpression><![CDATA[$V{PAGE_NUMBER}]]></textFieldExpression> </textField> <staticText> - <reportElement x="490" y="10" width="20" height="18" uuid="460a4235-1ce6-47d8-9e34-952e5ac9a660"> + <reportElement x="490" y="0" width="20" height="18" uuid="460a4235-1ce6-47d8-9e34-952e5ac9a660"> <property name="com.jaspersoft.studio.unit.y" value="px"/> <property name="com.jaspersoft.studio.unit.height" value="px"/> </reportElement> @@ -85,7 +85,7 @@ <text><![CDATA[/]]></text> </staticText> <textField> - <reportElement x="223" y="2" width="108" height="23" uuid="17f9fd50-da7c-43b2-93ea-7306e59aea90"> + <reportElement x="220" y="0" width="108" height="23" uuid="17f9fd50-da7c-43b2-93ea-7306e59aea90"> <property name="com.jaspersoft.studio.unit.x" value="px"/> <property name="com.jaspersoft.studio.unit.y" value="px"/> <property name="com.jaspersoft.studio.unit.width" value="px"/> @@ -96,82 +96,110 @@ </textElement> <textFieldExpression><![CDATA[$P{dnTitle}]]></textFieldExpression> </textField> - </band> - - - - + - + - + + + + + + + + + + - + - - + - + + + + + + + + - + - - + - + + + + + + + + + + + + + + + + + + + - + - + - + - + - + - + - - + + - + - + @@ -180,38 +208,10 @@ - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - + @@ -226,7 +226,7 @@ - + @@ -235,7 +235,7 @@ - + @@ -244,7 +244,7 @@ - + @@ -268,7 +268,7 @@ - + @@ -279,7 +279,7 @@ - + @@ -323,7 +323,7 @@ - + @@ -334,7 +334,7 @@ - + @@ -343,7 +343,7 @@ - + From 058b1151465458bb05026940fd3cf829c12e043e Mon Sep 17 00:00:00 2001 From: kelvinsuen Date: Mon, 27 Oct 2025 19:09:21 +0800 Subject: [PATCH 2/3] update po --- .../stock/service/StockInLineService.kt | 29 +++++++++---------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/ffii/fpsms/modules/stock/service/StockInLineService.kt b/src/main/java/com/ffii/fpsms/modules/stock/service/StockInLineService.kt index 63f18c1..226aff1 100644 --- a/src/main/java/com/ffii/fpsms/modules/stock/service/StockInLineService.kt +++ b/src/main/java/com/ffii/fpsms/modules/stock/service/StockInLineService.kt @@ -126,10 +126,7 @@ open class StockInLineService( // update po status to receiving if (po != null) { - po.apply { - status = PurchaseOrderStatus.RECEIVING - } - val savedPo = poRepository.save(po) + val savedPo = updatePurchaseOrderStatus(po) stockInLine.apply { this.purchaseOrder = savedPo } @@ -323,19 +320,21 @@ open class StockInLineService( @Throws(IOException::class) @Transactional - open fun updatePurchaseOrderStatus(po : PurchaseOrder) { - val unfinishedPol = polRepository - .findAllByPurchaseOrderIdAndStatusNotAndDeletedIsFalse(po.id!!, - PurchaseOrderLineStatus.COMPLETED) - // If all POL is completed - if (unfinishedPol.isEmpty()) { - po.apply { - status = PurchaseOrderStatus.COMPLETED - } - poRepository.saveAndFlush(po) - } else { + open fun updatePurchaseOrderStatus(po : PurchaseOrder) : PurchaseOrder { + val pols = polRepository.findAllByPurchaseOrderIdAndDeletedIsFalse(po.id!!) + var newStatus = PurchaseOrderStatus.PENDING + if (pols.isNotEmpty()) { + newStatus = if (pols.any { pol-> pol.status != PurchaseOrderLineStatus.COMPLETED }) { + PurchaseOrderStatus.RECEIVING + } else { + PurchaseOrderStatus.COMPLETED + } + } + po.apply { + status = newStatus } + return poRepository.saveAndFlush(po) } @Throws(IOException::class) @Transactional From d8ee69661ffe9ae828e01d6871b40553977f2e59 Mon Sep 17 00:00:00 2001 From: kelvinsuen Date: Tue, 28 Oct 2025 18:48:50 +0800 Subject: [PATCH 3/3] update qc master data (WIP) --- .../master/entity/QcCategoryRepository.kt | 1 + .../master/service/QcCategoryService.kt | 62 +++++++++++++++++++ .../modules/master/service/QcItemService.kt | 8 +-- .../master/web/QcCategoryController.kt | 19 ++++++ .../web/models/SaveQcCategoryRequest.kt | 12 ++++ .../web/models/SaveQcCategoryResponse.kt | 9 +++ 6 files changed, 107 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/ffii/fpsms/modules/master/web/models/SaveQcCategoryRequest.kt create mode 100644 src/main/java/com/ffii/fpsms/modules/master/web/models/SaveQcCategoryResponse.kt diff --git a/src/main/java/com/ffii/fpsms/modules/master/entity/QcCategoryRepository.kt b/src/main/java/com/ffii/fpsms/modules/master/entity/QcCategoryRepository.kt index 6283526..6843922 100644 --- a/src/main/java/com/ffii/fpsms/modules/master/entity/QcCategoryRepository.kt +++ b/src/main/java/com/ffii/fpsms/modules/master/entity/QcCategoryRepository.kt @@ -9,6 +9,7 @@ import org.springframework.stereotype.Repository @Repository interface QcCategoryRepository : AbstractRepository { fun findAllByDeletedIsFalse(): List; + fun findByIdAndDeletedIsFalse(id: Long): QcCategory?; fun findQcCategoryComboByDeletedIsFalse(): List; diff --git a/src/main/java/com/ffii/fpsms/modules/master/service/QcCategoryService.kt b/src/main/java/com/ffii/fpsms/modules/master/service/QcCategoryService.kt index 0d1fb09..55a14c5 100644 --- a/src/main/java/com/ffii/fpsms/modules/master/service/QcCategoryService.kt +++ b/src/main/java/com/ffii/fpsms/modules/master/service/QcCategoryService.kt @@ -3,9 +3,14 @@ package com.ffii.fpsms.modules.master.service import com.ffii.core.support.AbstractBaseEntityService import com.ffii.fpsms.modules.master.entity.QcCategory import com.ffii.fpsms.modules.master.entity.QcCategoryRepository +import com.ffii.fpsms.modules.master.entity.QcItem import com.ffii.fpsms.modules.master.entity.projections.QcCategoryCombo +import com.ffii.fpsms.modules.master.web.models.SaveQcCategoryRequest +import com.ffii.fpsms.modules.master.web.models.SaveQcCategoryResponse import com.ffii.fpsms.modules.qc.entity.projection.QcCategoryInfo +import jakarta.validation.Valid import org.springframework.stereotype.Service +import org.springframework.web.bind.annotation.RequestBody @Service open class QcCategoryService( @@ -16,6 +21,10 @@ open class QcCategoryService( return qcCategoryRepository.findAllByDeletedIsFalse() } + open fun findQcCategoryById(id: Long): QcCategory? { + return qcCategoryRepository.findByIdAndDeletedIsFalse(id) + } + open fun getQcCategoryCombo(): List { return qcCategoryRepository.findQcCategoryComboByDeletedIsFalse(); } @@ -40,4 +49,57 @@ open class QcCategoryService( } return result; } + + open fun markDeleted(id: Long): List { + val qcItem = qcCategoryRepository.findById(id).orElseThrow().apply { + deleted = true + } + + qcCategoryRepository.save(qcItem) + + return allQcCategories() + } + + open fun saveQcCategory(@Valid @RequestBody request: SaveQcCategoryRequest): SaveQcCategoryResponse { + val errors = mutableMapOf() + val id = request.id + val qcCategory = if (id != null) qcCategoryRepository.findById(id).orElseThrow() else QcCategory() + + // check duplicated code +// val duplicateQcCategory = findQcCategoryByCode(request.code) +// if (duplicateQcCategory != null && duplicateQcCategory.id != qcCategory.id) { +// errors["code"] = "Code is duplicated" +// } + + if (errors.isNotEmpty()) { + request.let { + SaveQcCategoryResponse( + id = it.id, + code = it.code, + name = it.name, + description = it.description, + errors = errors + ) + } + } + + // Save Qc Item + qcCategory.apply { + code = request.code + name = request.name + description = request.description + } + + val savedQcCategory = qcCategoryRepository.save(qcCategory) + + return savedQcCategory.let { + SaveQcCategoryResponse( + id = it.id, + code = it.code, + name = it.name, + description = it.description, + errors = null + ) + } + } } \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/master/service/QcItemService.kt b/src/main/java/com/ffii/fpsms/modules/master/service/QcItemService.kt index d5641a0..66475d9 100644 --- a/src/main/java/com/ffii/fpsms/modules/master/service/QcItemService.kt +++ b/src/main/java/com/ffii/fpsms/modules/master/service/QcItemService.kt @@ -54,10 +54,10 @@ open class QcItemService( val qcItem = if (id != null) qcItemRepository.findById(id).orElseThrow() else QcItem() // check duplicated code - val duplicateQcItem = findQcItemByCode(request.code) - if (duplicateQcItem != null && duplicateQcItem.id != qcItem.id) { - errors["code"] = "Code is duplicated" - } +// val duplicateQcItem = findQcItemByCode(request.code) +// if (duplicateQcItem != null && duplicateQcItem.id != qcItem.id) { +// errors["code"] = "Code is duplicated" +// } if (errors.isNotEmpty()) { request.let { diff --git a/src/main/java/com/ffii/fpsms/modules/master/web/QcCategoryController.kt b/src/main/java/com/ffii/fpsms/modules/master/web/QcCategoryController.kt index e493c1d..9cc43f1 100644 --- a/src/main/java/com/ffii/fpsms/modules/master/web/QcCategoryController.kt +++ b/src/main/java/com/ffii/fpsms/modules/master/web/QcCategoryController.kt @@ -2,9 +2,13 @@ package com.ffii.fpsms.modules.master.web import com.ffii.core.exception.NotFoundException import com.ffii.fpsms.modules.master.entity.QcCategory +import com.ffii.fpsms.modules.master.entity.QcItem import com.ffii.fpsms.modules.master.entity.projections.QcCategoryCombo import com.ffii.fpsms.modules.master.service.QcCategoryService +import com.ffii.fpsms.modules.master.web.models.SaveQcCategoryRequest +import com.ffii.fpsms.modules.master.web.models.SaveQcCategoryResponse import com.ffii.fpsms.modules.qc.entity.projection.QcCategoryInfo +import jakarta.validation.Valid import org.springframework.web.bind.annotation.* @RestController @@ -17,6 +21,21 @@ class QcCategoryController( return qcCategoryService.allQcCategories() } + @DeleteMapping("/{id}") + fun deleteQcItem(@PathVariable id: Long): List { + return qcCategoryService.markDeleted(id) + } + + @GetMapping("/details/{id}") + fun qcCategoryDetails(@PathVariable id: Long): QcCategory { + return qcCategoryService.findQcCategoryById(id) ?: throw NotFoundException() + } + + @PostMapping("/save") + fun saveQcCategory(@Valid @RequestBody request: SaveQcCategoryRequest): SaveQcCategoryResponse { + return qcCategoryService.saveQcCategory(request) + } + @GetMapping("/combo") fun getQcCategoryCombo(): List { return qcCategoryService.getQcCategoryCombo(); diff --git a/src/main/java/com/ffii/fpsms/modules/master/web/models/SaveQcCategoryRequest.kt b/src/main/java/com/ffii/fpsms/modules/master/web/models/SaveQcCategoryRequest.kt new file mode 100644 index 0000000..f2cea8e --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/master/web/models/SaveQcCategoryRequest.kt @@ -0,0 +1,12 @@ +package com.ffii.fpsms.modules.master.web.models + +import jakarta.validation.constraints.NotBlank + +data class SaveQcCategoryRequest( + val id: Long?, + @field:NotBlank(message = "Code cannot be empty") + val code: String, + @field:NotBlank(message = "Name cannot be empty") + val name: String, + val description: String?, +) \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/master/web/models/SaveQcCategoryResponse.kt b/src/main/java/com/ffii/fpsms/modules/master/web/models/SaveQcCategoryResponse.kt new file mode 100644 index 0000000..576f4e6 --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/master/web/models/SaveQcCategoryResponse.kt @@ -0,0 +1,9 @@ +package com.ffii.fpsms.modules.master.web.models + +data class SaveQcCategoryResponse( + val id: Long?, + val code: String?, + val name: String?, + val description: String?, + val errors: MutableMap? +) \ No newline at end of file