From 454200d86ac7e9b9f69397d6eab3933ab1b0fa55 Mon Sep 17 00:00:00 2001 From: "cyril.tsui" Date: Thu, 25 Apr 2024 17:44:28 +0800 Subject: [PATCH] Update claim and file --- .../modules/claim/service/ClaimService.kt | 132 +++++++++++++----- .../tsms/modules/claim/web/ClaimController.kt | 47 ++++++- .../claim/web/models/SaveClaimRequest.kt | 5 +- .../modules/data/entity/StaffRepository.java | 2 + .../modules/data/service/StaffsService.kt | 4 + .../com/ffii/tsms/modules/file/entity/File.kt | 6 +- .../ffii/tsms/modules/file/entity/FileBlob.kt | 3 +- .../ffii/tsms/modules/file/entity/FileRef.kt | 3 +- .../tsms/modules/file/service/FileService.kt | 13 +- .../tsms/modules/file/web/FileController.kt | 2 +- .../modules/file/web/UploadFileController.kt | 2 +- .../modules/file/web/model/UpdateFileReq.kt | 2 +- 12 files changed, 164 insertions(+), 57 deletions(-) diff --git a/src/main/java/com/ffii/tsms/modules/claim/service/ClaimService.kt b/src/main/java/com/ffii/tsms/modules/claim/service/ClaimService.kt index 3103e7b..4597503 100644 --- a/src/main/java/com/ffii/tsms/modules/claim/service/ClaimService.kt +++ b/src/main/java/com/ffii/tsms/modules/claim/service/ClaimService.kt @@ -1,28 +1,41 @@ package com.ffii.tsms.modules.claim.service +import com.ffii.core.support.AbstractBaseEntityService +import com.ffii.core.support.JdbcDao import com.ffii.tsms.modules.claim.entity.Claim import com.ffii.tsms.modules.claim.entity.ClaimDetail import com.ffii.tsms.modules.claim.entity.ClaimDetailRepository import com.ffii.tsms.modules.claim.entity.ClaimRepository -import com.ffii.tsms.modules.claim.web.models.SaveClaimDetailRequest -import com.ffii.tsms.modules.claim.web.models.SaveClaimRequest import com.ffii.tsms.modules.claim.web.models.SaveClaimResponse -import com.ffii.tsms.modules.file.entity.FileBlob +import com.ffii.tsms.modules.data.entity.StaffRepository +import com.ffii.tsms.modules.data.service.StaffsService +import com.ffii.tsms.modules.file.entity.FileRepository import com.ffii.tsms.modules.file.service.FileService import com.ffii.tsms.modules.project.entity.ProjectRepository -import org.springframework.beans.BeanUtils +import com.ffii.tsms.modules.user.entity.User +import com.ffii.tsms.modules.user.entity.UserRepository +import com.ffii.tsms.modules.user.service.UserService +import org.springframework.security.core.Authentication +import org.springframework.security.core.context.SecurityContextHolder import org.springframework.stereotype.Service import org.springframework.transaction.annotation.Transactional -import java.text.NumberFormat +import org.springframework.web.multipart.MultipartFile +import java.math.BigDecimal import java.time.LocalDate import java.time.format.DateTimeFormatter -import java.util.HashMap +import java.util.* @Service open class ClaimService( private val claimRepository: ClaimRepository, - private val fileService: FileService, private val claimDetailRepository: ClaimDetailRepository, private val projectRepository: ProjectRepository -) { + private val fileService: FileService, + private val claimDetailRepository: ClaimDetailRepository, + private val projectRepository: ProjectRepository, + private val jdbcDao: JdbcDao, + private val fileRepository: FileRepository, + private val userRepository: UserRepository, + private val staffsService: StaffsService, + ) : AbstractBaseEntityService(jdbcDao, claimRepository) { open fun allClaims(): List { return claimRepository.findAllByDeletedFalse() } @@ -41,52 +54,99 @@ open class ClaimService( } @Transactional(rollbackFor = [Exception::class]) - open fun saveClaimDetail(claimDetail: SaveClaimDetailRequest, claim: Claim) { - val oldSupportingDocumentId = claimDetail.oldSupportingDocument?.id // fileId - val newSupportingDocument = claimDetail.newSupportingDocument - val claimDetailId = claimDetail.id - val projectId = claimDetail.project.id + open fun saveClaimDetail( + claimDetailId: Long, + claimDetailInvoiceDate: LocalDate, + claimDetailProjectId: Long, + claimDetailDescription: String, + claimDetailAmount: BigDecimal, + claimDetailNewSupportingDocument: MultipartFile?, + claimDetailOldSupportingDocumentId: Long?, + claim: Claim, + ) { var result: MutableMap = HashMap() - if (oldSupportingDocumentId != null && oldSupportingDocumentId > 0 && newSupportingDocument != null) { - result = fileService.updateFile(multipartFile = newSupportingDocument, refId = claim.id, refType = "claimDetail", refCode = claim.code, maxSize = 50, fileId = oldSupportingDocumentId) - } else if ((oldSupportingDocumentId == null || oldSupportingDocumentId <= 0) && newSupportingDocument != null) { - result = fileService.uploadFile(multipartFile = newSupportingDocument, refId = claim.id, refType = "claimDetail", refCode = claim.code, maxSize = 50) + if (claimDetailOldSupportingDocumentId != null && claimDetailOldSupportingDocumentId > 0 && claimDetailNewSupportingDocument != null) { + result = fileService.updateFile( + multipartFile = claimDetailNewSupportingDocument, + refId = claim.id, + refType = "claimDetail", + refCode = claim.code, + maxSize = 50, + fileId = claimDetailOldSupportingDocumentId + ) + } else if ((claimDetailOldSupportingDocumentId == null || claimDetailOldSupportingDocumentId <= 0) && claimDetailNewSupportingDocument != null) { + result = fileService.uploadFile( + multipartFile = claimDetailNewSupportingDocument, + refId = claim.id, + refType = "claimDetail", + refCode = claim.code, + maxSize = 50 + ) } - val instance = claimDetailRepository.findById(claimDetailId).orElse(ClaimDetail()) - BeanUtils.copyProperties(claimDetail, instance) + if (result["fileId"] != null && result["fileId"] as Long > 0) { + val instance = claimDetailRepository.findById(claimDetailId).orElse(ClaimDetail()) + val project = projectRepository.findById(claimDetailProjectId).orElseThrow() + val file = fileRepository.findById(result["fileId"] as Long).orElseThrow() + instance.apply { + this.claim = claim + invoiceDate = claimDetailInvoiceDate + this.project = project + description = claimDetailDescription + amount = claimDetailAmount + this.file = file + } - val project = projectRepository.findById(projectId!!).orElseThrow() - instance.apply { - this.project = project + claimDetailRepository.save(instance) + } else { + logger.info("error") } - - claimDetailRepository.save(instance) } @Transactional(rollbackFor = [Exception::class]) - open fun saveClaim(saveClaimRequest: SaveClaimRequest): SaveClaimResponse { - - val claimId = saveClaimRequest.id - val addClaimDetails = saveClaimRequest.addClaimDetails + open fun saveClaim( + id: Long?, + expenseType: String, + status: String, + addClaimDetailIds: List, + addClaimDetailInvoiceDates: List, + addClaimDetailProjectIds: List, + addClaimDetailDescriptions: List, + addClaimDetailAmounts: List, + addClaimDetailNewSupportingDocuments: List, + addClaimDetailOldSupportingDocumentIds: List + ): SaveClaimResponse { // Save to claim - val instance = if (claimId != null && claimId > 0) claimRepository.findById(claimId).orElseThrow() else Claim(); - + val instance = if (id != null && id > 0) claimRepository.findById(id).orElseThrow() else Claim(); + val user = SecurityContextHolder.getContext().authentication.principal as User + logger.info(user.id) + val staff = staffsService.findByUserId(user.id!!).orElseThrow() instance.apply { - type = saveClaimRequest.expenseType - code = if(instance.code.isNullOrEmpty()) generateCode() else instance.code + type = expenseType + code = if (instance.code.isNullOrEmpty()) generateCode() else instance.code + this.staff = staff + this.status = status } claimRepository.save(instance) // Save to claim detail - if (addClaimDetails.isNotEmpty()) { - for(addClaimDetail in addClaimDetails) { - saveClaimDetail(addClaimDetail, instance) + if (addClaimDetailIds.isNotEmpty()) { + for (i in addClaimDetailIds.indices) { + saveClaimDetail( + addClaimDetailIds[i], + addClaimDetailInvoiceDates[i], + addClaimDetailProjectIds[i], + addClaimDetailDescriptions[i], + addClaimDetailAmounts[i], + addClaimDetailNewSupportingDocuments[i], + addClaimDetailOldSupportingDocumentIds[i], + instance + ) } } - return SaveClaimResponse(claim = instance, message = "Success"); + return SaveClaimResponse(claim = Claim(), message = "Success"); } } diff --git a/src/main/java/com/ffii/tsms/modules/claim/web/ClaimController.kt b/src/main/java/com/ffii/tsms/modules/claim/web/ClaimController.kt index 8a2c0fe..0cd896e 100644 --- a/src/main/java/com/ffii/tsms/modules/claim/web/ClaimController.kt +++ b/src/main/java/com/ffii/tsms/modules/claim/web/ClaimController.kt @@ -1,17 +1,28 @@ package com.ffii.tsms.modules.claim.web import com.ffii.tsms.modules.claim.entity.Claim +import com.ffii.tsms.modules.claim.entity.ClaimDetail import com.ffii.tsms.modules.claim.service.ClaimService +import com.ffii.tsms.modules.claim.web.models.SaveClaimDetailRequest import com.ffii.tsms.modules.claim.web.models.SaveClaimRequest import com.ffii.tsms.modules.claim.web.models.SaveClaimResponse import com.ffii.tsms.modules.data.web.models.SaveCustomerResponse import com.ffii.tsms.modules.project.web.models.SaveCustomerRequest import jakarta.validation.Valid +import org.apache.logging.log4j.core.config.plugins.validation.constraints.Required +import org.springframework.web.bind.ServletRequestBindingException import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.ModelAttribute import org.springframework.web.bind.annotation.PostMapping import org.springframework.web.bind.annotation.RequestBody import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RequestParam +import org.springframework.web.bind.annotation.RequestPart import org.springframework.web.bind.annotation.RestController +import org.springframework.web.multipart.MultipartFile +import java.io.IOException +import java.math.BigDecimal +import java.time.LocalDate @RestController @RequestMapping("/claim") @@ -22,8 +33,40 @@ class ClaimController(private val claimService: ClaimService) { return claimService.allClaims() } + @PostMapping("/test") + fun forTest(@RequestBody testFiles: List) { + System.out.println(testFiles.size) + } + @PostMapping("/save") - fun saveClaim(@Valid @RequestBody saveClaimRequest: SaveClaimRequest): SaveClaimResponse { - return claimService.saveClaim(saveClaimRequest) + fun saveClaim( + @RequestParam(required = false) id: Long?, + @RequestParam expenseType: String, + @RequestParam status: String, + @RequestParam addClaimDetailIds: List, + @RequestParam addClaimDetailInvoiceDates: List, + @RequestParam addClaimDetailProjectIds: List, + @RequestParam addClaimDetailDescriptions: List, + @RequestParam addClaimDetailAmounts: List, + @RequestParam addClaimDetailNewSupportingDocuments: List, + @RequestParam addClaimDetailOldSupportingDocumentIds: List, + ): SaveClaimResponse { + System.out.println("yo") + return claimService.saveClaim(id, expenseType, status, addClaimDetailIds, addClaimDetailInvoiceDates, addClaimDetailProjectIds, addClaimDetailDescriptions, addClaimDetailAmounts, addClaimDetailNewSupportingDocuments, addClaimDetailOldSupportingDocumentIds) + } + + @PostMapping("/save2") + fun saveClaim2( + @RequestParam id: Long, + @RequestParam expenseType: String, + @RequestParam status: String, + @RequestParam addClaimDetailIds: List, + @RequestParam addClaimDetailInvoiceDates: List, + @RequestParam addClaimDetailDescriptions: List, + @RequestParam addClaimDetailProjectIds: List, + @RequestParam addClaimDetailNewSupportingDocuments: List, + @RequestParam addClaimDetailOldSupportingDocumentIds: List, + ) { + System.out.println("yo") } } \ No newline at end of file diff --git a/src/main/java/com/ffii/tsms/modules/claim/web/models/SaveClaimRequest.kt b/src/main/java/com/ffii/tsms/modules/claim/web/models/SaveClaimRequest.kt index 604c58c..c0be19b 100644 --- a/src/main/java/com/ffii/tsms/modules/claim/web/models/SaveClaimRequest.kt +++ b/src/main/java/com/ffii/tsms/modules/claim/web/models/SaveClaimRequest.kt @@ -16,9 +16,9 @@ data class Project ( val id: Long, ) data class SaveClaimDetailRequest ( - val id: Long, + val id: String?, val invoiceDate: LocalDate, - val description: String, + val description: String?, val project: Project, val amount: BigDecimal, val newSupportingDocument: MultipartFile?, @@ -30,6 +30,7 @@ data class SaveClaimRequest ( val expenseType: String, val addClaimDetails: List, + val addClaimDetailsFiles: List, val status: String, val id: Long?, diff --git a/src/main/java/com/ffii/tsms/modules/data/entity/StaffRepository.java b/src/main/java/com/ffii/tsms/modules/data/entity/StaffRepository.java index bc595bb..c2b527b 100644 --- a/src/main/java/com/ffii/tsms/modules/data/entity/StaffRepository.java +++ b/src/main/java/com/ffii/tsms/modules/data/entity/StaffRepository.java @@ -15,4 +15,6 @@ public interface StaffRepository extends AbstractRepository { List findAllStaffSearchInfoByIdIn(List ids); Optional findByStaffId(@Param("staffId") String staffId); + + Optional findByUserId(@Param("userId") Long userId); } \ No newline at end of file diff --git a/src/main/java/com/ffii/tsms/modules/data/service/StaffsService.kt b/src/main/java/com/ffii/tsms/modules/data/service/StaffsService.kt index f4f710f..89c1791 100644 --- a/src/main/java/com/ffii/tsms/modules/data/service/StaffsService.kt +++ b/src/main/java/com/ffii/tsms/modules/data/service/StaffsService.kt @@ -70,6 +70,10 @@ open class StaffsService( return staffRepository.findByStaffId(id); } + open fun findByUserId(userId: Long): Optional { + return staffRepository.findByUserId(userId); + } + @Transactional(rollbackFor = [Exception::class]) open fun saveStaff(req: NewStaffRequest): Staff { val user = userRepository.saveAndFlush( diff --git a/src/main/java/com/ffii/tsms/modules/file/entity/File.kt b/src/main/java/com/ffii/tsms/modules/file/entity/File.kt index 882afc9..e5930e5 100644 --- a/src/main/java/com/ffii/tsms/modules/file/entity/File.kt +++ b/src/main/java/com/ffii/tsms/modules/file/entity/File.kt @@ -1,19 +1,15 @@ package com.ffii.tsms.modules.file.entity import com.ffii.core.entity.BaseEntity -import com.ffii.core.entity.IdEntity import jakarta.persistence.Column import jakarta.persistence.Entity import jakarta.persistence.Table import jakarta.validation.constraints.NotNull -import java.math.BigInteger @Entity @Table(name = "file") open class File : BaseEntity() { - open val DEFAULT_UPLOAD_MAX_FILE_SIZE_MB: Int = 50 - @NotNull @Column(name = "skey", length = 32) open var skey: String? = null @@ -24,7 +20,7 @@ open class File : BaseEntity() { @NotNull @Column(name = "extension", length = 10) - open var description: String? = null + open var extension: String? = null @NotNull @Column(name = "mimetype", length = 255) diff --git a/src/main/java/com/ffii/tsms/modules/file/entity/FileBlob.kt b/src/main/java/com/ffii/tsms/modules/file/entity/FileBlob.kt index 625c466..ad89dd5 100644 --- a/src/main/java/com/ffii/tsms/modules/file/entity/FileBlob.kt +++ b/src/main/java/com/ffii/tsms/modules/file/entity/FileBlob.kt @@ -1,6 +1,5 @@ package com.ffii.tsms.modules.file.entity -import com.ffii.core.entity.BaseEntity import com.ffii.core.entity.IdEntity import jakarta.persistence.Column import jakarta.persistence.Entity @@ -11,7 +10,7 @@ import jakarta.validation.constraints.NotNull @Entity @Table(name = "file_blob") -open class FileBlob : BaseEntity() { +open class FileBlob : IdEntity() { @NotNull @OneToOne diff --git a/src/main/java/com/ffii/tsms/modules/file/entity/FileRef.kt b/src/main/java/com/ffii/tsms/modules/file/entity/FileRef.kt index e57a3f7..fc9a136 100644 --- a/src/main/java/com/ffii/tsms/modules/file/entity/FileRef.kt +++ b/src/main/java/com/ffii/tsms/modules/file/entity/FileRef.kt @@ -1,6 +1,5 @@ package com.ffii.tsms.modules.file.entity -import com.ffii.core.entity.BaseEntity import com.ffii.core.entity.IdEntity import jakarta.persistence.Column import jakarta.persistence.Entity @@ -11,7 +10,7 @@ import jakarta.validation.constraints.NotNull @Entity @Table(name = "file_ref") -open class FileRef : BaseEntity() { +open class FileRef : IdEntity() { @NotNull @Column(name = "refType", length = 20) diff --git a/src/main/java/com/ffii/tsms/modules/file/service/FileService.kt b/src/main/java/com/ffii/tsms/modules/file/service/FileService.kt index a1150c8..9b7314f 100644 --- a/src/main/java/com/ffii/tsms/modules/file/service/FileService.kt +++ b/src/main/java/com/ffii/tsms/modules/file/service/FileService.kt @@ -5,6 +5,7 @@ import com.ffii.core.support.JdbcDao import com.ffii.core.utils.FileUtils import com.ffii.core.utils.NumberUtils import com.ffii.core.utils.Params +import com.ffii.core.utils.StringUtils import com.ffii.tsms.modules.file.entity.* import org.apache.commons.lang3.RandomStringUtils import org.springframework.stereotype.Service @@ -13,8 +14,8 @@ import org.springframework.transaction.annotation.Transactional import org.springframework.web.multipart.MultipartFile import java.io.ByteArrayInputStream import java.io.IOException -import java.util.* import java.util.Map +import java.util.Optional import javax.imageio.ImageIO @@ -99,7 +100,7 @@ open class FileService( + " fr.refType," + " f.created," + " u.name AS createdByName," - + " f.description" + + " f.extension" + " FROM file f" + " LEFT JOIN file_ref fr ON f.id = fr.fileId" + " LEFT JOIN user u ON f.createdBy = u.id" @@ -155,7 +156,7 @@ open class FileService( @Transactional(isolation = Isolation.SERIALIZABLE, rollbackFor = [Exception::class], readOnly = false) open fun saveFile( filename: String, - description: String, +// extension: String, refType: String, refId: Long, refCode: String, @@ -165,7 +166,7 @@ open class FileService( file.apply { this.filename = filename - this.description = description + this.extension = StringUtils.substringAfterLast(filename, "."); mimetype = FileUtils.guessMimetype(filename) filesize = NumberUtils.toLong(bytes.size, 0L) skey = RandomStringUtils.randomAlphanumeric(32) @@ -207,7 +208,7 @@ open class FileService( @Throws(IOException::class) open fun uploadFile( multipartFile: MultipartFile, refId: Long?, refType: String?, refCode: String?, - maxSize: Int + maxSize: Int = 50 ): MutableMap { val result: MutableMap = HashMap() @@ -221,6 +222,7 @@ open class FileService( file.apply { filename = multipartFile.originalFilename + extension = StringUtils.substringAfterLast(multipartFile.originalFilename, "."); mimetype = FileUtils.guessMimetype(multipartFile.originalFilename) filesize = multipartFile.size skey = RandomStringUtils.randomAlphanumeric(32) @@ -287,6 +289,7 @@ open class FileService( file.apply { filename = multipartFile.originalFilename + extension = StringUtils.substringAfterLast(multipartFile.originalFilename, "."); mimetype = FileUtils.guessMimetype(multipartFile.originalFilename) filesize = multipartFile.size skey = RandomStringUtils.randomAlphanumeric(32) diff --git a/src/main/java/com/ffii/tsms/modules/file/web/FileController.kt b/src/main/java/com/ffii/tsms/modules/file/web/FileController.kt index 12f4a19..5367ef3 100644 --- a/src/main/java/com/ffii/tsms/modules/file/web/FileController.kt +++ b/src/main/java/com/ffii/tsms/modules/file/web/FileController.kt @@ -49,7 +49,7 @@ open class FileController (private val fileService: FileService) { if (file != null) { file.apply { filename = req.filename - description = req.description + extension = req.extension } fileService.saveFile(file) diff --git a/src/main/java/com/ffii/tsms/modules/file/web/UploadFileController.kt b/src/main/java/com/ffii/tsms/modules/file/web/UploadFileController.kt index 2725e78..cd8b0c2 100644 --- a/src/main/java/com/ffii/tsms/modules/file/web/UploadFileController.kt +++ b/src/main/java/com/ffii/tsms/modules/file/web/UploadFileController.kt @@ -35,7 +35,7 @@ class UploadFileController(private val settingsService: SettingsService, private if (multipartFileList != null) { for (multipartFile in multipartFileList) { - result = fileService.uploadFile(multipartFile, refId, refType, refCode, File().DEFAULT_UPLOAD_MAX_FILE_SIZE_MB) + result = fileService.uploadFile(multipartFile, refId, refType, refCode, 50) } } diff --git a/src/main/java/com/ffii/tsms/modules/file/web/model/UpdateFileReq.kt b/src/main/java/com/ffii/tsms/modules/file/web/model/UpdateFileReq.kt index d31b81b..6d628e0 100644 --- a/src/main/java/com/ffii/tsms/modules/file/web/model/UpdateFileReq.kt +++ b/src/main/java/com/ffii/tsms/modules/file/web/model/UpdateFileReq.kt @@ -4,5 +4,5 @@ data class UpdateFileReq ( val fileId: Long, val filename: String, val skey: String, - val description: String, + val extension: String, ) \ No newline at end of file