From 477997c83531afe0b72ed0e0dbf20a72184c49a2 Mon Sep 17 00:00:00 2001 From: "B.E.N.S.O.N" Date: Sun, 11 Jan 2026 23:29:19 +0800 Subject: [PATCH] Supporting Function: Equipment Handle and QR Code Printing --- .../fpsms/modules/master/entity/Equipment.kt | 4 +- .../modules/master/entity/EquipmentDetail.kt | 8 +- .../entity/EquipmentDetailRepository.kt | 1 + .../master/service/EquipmentDetailService.kt | 101 +++++++++++++----- .../master/service/EquipmentQrCodeService.kt | 86 +++++++++++++++ .../master/service/EquipmentService.kt | 78 +++++++------- .../modules/master/web/EquipmentController.kt | 22 +++- .../master/web/EquipmentDetailController.kt | 14 ++- .../web/ExportEquipmentQrCodeRequest.kt | 5 + .../web/models/NewEquipmentDetailRequest.kt | 3 + .../qrCodeHandle/equipment_QrHandle.jrxml | 43 ++++++++ 11 files changed, 286 insertions(+), 79 deletions(-) create mode 100644 src/main/java/com/ffii/fpsms/modules/master/service/EquipmentQrCodeService.kt create mode 100644 src/main/java/com/ffii/fpsms/modules/master/web/ExportEquipmentQrCodeRequest.kt create mode 100644 src/main/resources/qrCodeHandle/equipment_QrHandle.jrxml diff --git a/src/main/java/com/ffii/fpsms/modules/master/entity/Equipment.kt b/src/main/java/com/ffii/fpsms/modules/master/entity/Equipment.kt index 419dd97..f2f03da 100644 --- a/src/main/java/com/ffii/fpsms/modules/master/entity/Equipment.kt +++ b/src/main/java/com/ffii/fpsms/modules/master/entity/Equipment.kt @@ -8,9 +8,9 @@ import jakarta.validation.constraints.Size @Table(name = "equipment") @Entity open class Equipment : BaseEntity() { - @Size(max = 30) + @Size(max = 255) @NotNull - @Column(name = "code", nullable = false, length = 30) + @Column(name = "code", nullable = false, length = 255) open var code: String? = null @Size(max = 30) diff --git a/src/main/java/com/ffii/fpsms/modules/master/entity/EquipmentDetail.kt b/src/main/java/com/ffii/fpsms/modules/master/entity/EquipmentDetail.kt index 2e10d80..b99a5bd 100644 --- a/src/main/java/com/ffii/fpsms/modules/master/entity/EquipmentDetail.kt +++ b/src/main/java/com/ffii/fpsms/modules/master/entity/EquipmentDetail.kt @@ -29,14 +29,14 @@ open class EquipmentDetail : BaseEntity() { @Column(name = "repairAndMaintenanceRemarks", nullable = true, length = 255) open var repairAndMaintenanceRemarks: String? = null - @Size(max = 30) + @Size(max = 255) @NotNull - @Column(name = "code", nullable = false, length = 30) + @Column(name = "code", nullable = false, length = 255) open var code: String? = null - @Size(max = 30) + @Size(max = 255) @NotNull - @Column(name = "name", nullable = false, length = 30) + @Column(name = "name", nullable = false, length = 255) open var name: String? = null @Size(max = 500) diff --git a/src/main/java/com/ffii/fpsms/modules/master/entity/EquipmentDetailRepository.kt b/src/main/java/com/ffii/fpsms/modules/master/entity/EquipmentDetailRepository.kt index 26b25fa..b8ef3a5 100644 --- a/src/main/java/com/ffii/fpsms/modules/master/entity/EquipmentDetailRepository.kt +++ b/src/main/java/com/ffii/fpsms/modules/master/entity/EquipmentDetailRepository.kt @@ -9,6 +9,7 @@ interface EquipmentDetailRepository : AbstractRepository fun findByCode(code: String): EquipmentDetail? fun findByIdAndDeletedFalse(id: Long): EquipmentDetail?; fun findByNameAndDeletedIsFalse(name: String): EquipmentDetail?; + fun findByCodeAndDeletedIsFalse(code: String): EquipmentDetail?; fun findByDescriptionAndDeletedIsFalse(description: String): EquipmentDetail?; fun findByEquipmentTypeIdAndDeletedFalse(equipmentTypeId: Long): List; diff --git a/src/main/java/com/ffii/fpsms/modules/master/service/EquipmentDetailService.kt b/src/main/java/com/ffii/fpsms/modules/master/service/EquipmentDetailService.kt index d14144d..029e405 100644 --- a/src/main/java/com/ffii/fpsms/modules/master/service/EquipmentDetailService.kt +++ b/src/main/java/com/ffii/fpsms/modules/master/service/EquipmentDetailService.kt @@ -36,42 +36,94 @@ open class EquipmentDetailService( e.lastRepairAndMaintenanceDate AS lastRepairAndMaintenanceDate, e.repairAndMaintenanceRemarks AS repairAndMaintenanceRemarks FROM equipment_detail e - WHERE e.deleted = FALSE + LEFT JOIN equipment eq ON e.equipmentTypeId = eq.id """ ) + + val whereConditions = mutableListOf() - // Handle combined search for code and equipmentCode (OR logic) + whereConditions.add("e.deleted = FALSE") + whereConditions.add("eq.deleted = FALSE") + val searchTerm = args["equipmentCode"] as? String val codeTerm = args["code"] as? String if (searchTerm != null && codeTerm != null && searchTerm == codeTerm) { - // When both are provided with the same value, search using OR - sql.append(" AND (LOWER(e.code) LIKE LOWER(:equipmentCode) OR LOWER(e.equipmentCode) LIKE LOWER(:equipmentCode)) ") + + whereConditions.add("(LOWER(e.code) LIKE LOWER(:equipmentCode) OR LOWER(e.equipmentCode) LIKE LOWER(:equipmentCode))") } else { - // Otherwise, use individual conditions + if (codeTerm != null && (searchTerm == null || searchTerm != codeTerm)) { - sql.append(" AND LOWER(e.code) LIKE LOWER(:code) ") + whereConditions.add("LOWER(e.code) LIKE LOWER(:code)") } if (searchTerm != null && (codeTerm == null || searchTerm != codeTerm)) { - sql.append(" AND LOWER(e.equipmentCode) LIKE LOWER(:equipmentCode) ") + whereConditions.add("LOWER(e.equipmentCode) LIKE LOWER(:equipmentCode)") } } if (args.containsKey("id")) { - sql.append(" AND e.id like :id ") + whereConditions.add("e.id like :id") } if (args.containsKey("name")) { - sql.append(" AND LOWER(e.name) LIKE LOWER(:name) ") + whereConditions.add("LOWER(e.name) LIKE LOWER(:name)") } if (args.containsKey("description")) { - sql.append(" AND e.description like :description ") + + whereConditions.add("e.description = :description") } if (args.containsKey("repairAndMaintenanceStatus")) { - sql.append(" AND e.repairAndMaintenanceStatus = :repairAndMaintenanceStatus ") + whereConditions.add("e.repairAndMaintenanceStatus = :repairAndMaintenanceStatus") + } + + if (whereConditions.isNotEmpty()) { + sql.append("WHERE ${whereConditions.joinToString(" AND ")}") } return jdbcDao.queryForList(sql.toString(), args) } + open fun getEquipmentDetailsByEquipmentId(equipmentId: Long): List> { + val sql = """ + SELECT + ed.id AS id, + ed.code AS code, + ed.name AS name, + ed.description AS description, + ed.equipmentCode AS equipmentCode, + ed.repairAndMaintenanceStatus AS repairAndMaintenanceStatus, + ed.latestRepairAndMaintenanceDate AS latestRepairAndMaintenanceDate, + ed.lastRepairAndMaintenanceDate AS lastRepairAndMaintenanceDate, + ed.repairAndMaintenanceRemarks AS repairAndMaintenanceRemarks + FROM equipment_detail ed + LEFT JOIN equipment e ON ed.equipmentTypeId = e.id + WHERE ed.deleted = FALSE + AND e.id = :equipmentId + AND e.deleted = FALSE + """ + + val args = mapOf("equipmentId" to equipmentId) + return jdbcDao.queryForList(sql, args) + } + + open fun getEquipmentDetailsByDescriptionIncludingDeleted(description: String): List> { + val sql = """ + SELECT + e.id AS id, + e.code AS code, + e.name AS name, + e.description AS description, + e.equipmentCode AS equipmentCode, + e.repairAndMaintenanceStatus AS repairAndMaintenanceStatus, + e.latestRepairAndMaintenanceDate AS latestRepairAndMaintenanceDate, + e.lastRepairAndMaintenanceDate AS lastRepairAndMaintenanceDate, + e.repairAndMaintenanceRemarks AS repairAndMaintenanceRemarks + FROM equipment_detail e + WHERE e.description = :description + """ + + val args = mapOf("description" to description) + return jdbcDao.queryForList(sql, args) + } + open fun findById(id: Long): EquipmentDetail? { return equipmentDetailRepository.findByIdAndDeletedFalse(id) } @@ -96,61 +148,52 @@ open class EquipmentDetailService( val equipmentDetail = findById(id) ?: throw IllegalArgumentException("Equipment detail not found with id: $id") - // Store the previous status and latest date before updating val previousStatus = equipmentDetail.repairAndMaintenanceStatus val previousLatestDate = equipmentDetail.latestRepairAndMaintenanceDate - // Update status and remarks equipmentDetail.repairAndMaintenanceStatus = request.repairAndMaintenanceStatus equipmentDetail.repairAndMaintenanceRemarks = request.repairAndMaintenanceRemarks - // Handle date updates based on status change when { - // Changing from "是" (true) to "否" (false) previousStatus == true && request.repairAndMaintenanceStatus == false -> { - // Save current latestRepairAndMaintenanceDate to lastRepairAndMaintenanceDate equipmentDetail.lastRepairAndMaintenanceDate = previousLatestDate - // Update latestRepairAndMaintenanceDate to current time equipmentDetail.latestRepairAndMaintenanceDate = LocalDateTime.now() } - // Changing from "否" (false) to "是" (true) - // Keep dates unchanged - no action needed previousStatus == false && request.repairAndMaintenanceStatus == true -> { - // Dates remain unchanged } - // Other cases (null to true/false, or same status) - no date changes } return equipmentDetailRepository.saveAndFlush(equipmentDetail) } -/* @Transactional open fun saveEquipmentDetail(request: NewEquipmentDetailRequest): EquipmentDetail { if (request.code.isNullOrBlank()) { throw IllegalArgumentException("Equipment detail code cannot be null or blank") } - val duplicated = equipmentDetailRepository.findByCodeAndDeletedIsFalse(request.code!!) - if (duplicated != null && duplicated.id != request.id) { - throw IllegalArgumentException("Equipment detail code already exists") + + if (request.id != null && request.id > 0) { + val duplicated = equipmentDetailRepository.findByCodeAndDeletedIsFalse(request.code!!) + if (duplicated != null && duplicated.id != request.id) { + throw IllegalArgumentException("Equipment detail code already exists") + } } - val entity = if (request.id != null && request.id > 0) { - equipmentDetailRepository.findByIdAndDeletedFalse(request.id) ?: EquipmentDetail() } else { EquipmentDetail() } - entity.code = request.code entity.name = request.name entity.description = request.description + entity.equipmentTypeId = request.equipmentTypeId + entity.equipmentCode = request.equipmentCode + entity.repairAndMaintenanceStatus = request.repairAndMaintenanceStatus ?: false return equipmentDetailRepository.saveAndFlush(entity) } -*/ @Transactional open fun deleteEquipmentDetail(id: Long) { val equipmentDetail = equipmentDetailRepository.findByIdAndDeletedFalse(id) diff --git a/src/main/java/com/ffii/fpsms/modules/master/service/EquipmentQrCodeService.kt b/src/main/java/com/ffii/fpsms/modules/master/service/EquipmentQrCodeService.kt new file mode 100644 index 0000000..2ee1ac5 --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/master/service/EquipmentQrCodeService.kt @@ -0,0 +1,86 @@ +package com.ffii.fpsms.modules.master.service + +import com.ffii.core.utils.PdfUtils +import com.ffii.core.utils.QrCodeUtil +import com.ffii.fpsms.modules.master.entity.EquipmentDetailRepository +import com.ffii.fpsms.modules.master.web.ExportEquipmentQrCodeRequest +import net.sf.jasperreports.engine.JasperCompileManager +import net.sf.jasperreports.engine.JasperPrint +import org.springframework.core.io.ClassPathResource +import org.springframework.stereotype.Service +import java.io.FileNotFoundException +import java.awt.GraphicsEnvironment +import kotlinx.serialization.json.Json +import kotlinx.serialization.encodeToString + +@Service +class EquipmentQrCodeService( + private val equipmentDetailRepository: EquipmentDetailRepository +) { + + fun exportEquipmentQrCode(request: ExportEquipmentQrCodeRequest): Map { + val QRCODE_HANDLE_PDF = "qrCodeHandle/equipment_QrHandle.jrxml" + val resource = ClassPathResource(QRCODE_HANDLE_PDF) + if (!resource.exists()) { + throw FileNotFoundException("Report file not found: $QRCODE_HANDLE_PDF") + } + + val inputStream = resource.inputStream + val qrCodeHandleReport = JasperCompileManager.compileReport(inputStream) + + val equipmentDetails = equipmentDetailRepository.findAllById(request.equipmentDetailIds) + if (equipmentDetails.isEmpty()) { + throw IllegalArgumentException("No equipment details found for the provided equipment detail IDs: ${request.equipmentDetailIds}") + } + + val fields = mutableListOf>() + + for (equipmentDetail in equipmentDetails) { + val field = mutableMapOf() + + val code = equipmentDetail.code ?: "" + val equipmentCodeFromDetail = equipmentDetail.equipmentCode ?: "" + + if (code.isBlank() && equipmentCodeFromDetail.isBlank()) { + continue + } + + val qrContentMap = mapOf("equipmentCode" to equipmentCodeFromDetail) + val qrCodeContent = Json.encodeToString(qrContentMap) + + val qrCodeImage = QrCodeUtil.generateQRCodeImage(qrCodeContent) + + field["username"] = code + field["staffNo"] = code + field["qrCode"] = qrCodeImage + field["code"] = code + + fields.add(field) + } + + if (fields.isEmpty()) { + throw IllegalArgumentException("No valid equipment details found for the provided equipment detail IDs: ${request.equipmentDetailIds}") + } + + val params: MutableMap = mutableMapOf() + + val availableFonts = GraphicsEnvironment.getLocalGraphicsEnvironment().availableFontFamilyNames + val chineseFont = availableFonts.find { + it.contains("SimSun", ignoreCase = true) || + it.contains("Microsoft YaHei", ignoreCase = true) || + it.contains("STSong", ignoreCase = true) || + it.contains("SimHei", ignoreCase = true) + } ?: "Arial Unicode MS" + + params["net.sf.jasperreports.default.pdf.encoding"] = "Identity-H" + params["net.sf.jasperreports.default.pdf.embedded"] = true + params["net.sf.jasperreports.default.pdf.font.name"] = chineseFont + + val firstEquipmentDetail = equipmentDetails.firstOrNull() + + return mapOf( + "report" to PdfUtils.fillReport(qrCodeHandleReport, fields, params), + "fileName" to (firstEquipmentDetail?.code ?: "equipment_qrcode") + ) + } +} diff --git a/src/main/java/com/ffii/fpsms/modules/master/service/EquipmentService.kt b/src/main/java/com/ffii/fpsms/modules/master/service/EquipmentService.kt index 9bc2d8f..322e704 100644 --- a/src/main/java/com/ffii/fpsms/modules/master/service/EquipmentService.kt +++ b/src/main/java/com/ffii/fpsms/modules/master/service/EquipmentService.kt @@ -7,6 +7,7 @@ import com.ffii.fpsms.modules.master.entity.EquipmentRepository import org.springframework.stereotype.Service import org.springframework.transaction.annotation.Transactional import com.ffii.fpsms.modules.master.web.models.NewEquipmentRequest + @Service open class EquipmentService( private val jdbcDao: JdbcDao, @@ -18,40 +19,40 @@ open class EquipmentService( } open fun getEquipmentsByPage(args: Map): List> { - val sql = StringBuilder( - """ - SELECT - e.id AS id, - e.code AS code, - e.name AS name, - e.description AS description, - e.equipmentTypeId AS equipmentTypeId, - ed.repairAndMaintenanceStatus AS repairAndMaintenanceStatus, - ed.latestRepairAndMaintenanceDate AS latestRepairAndMaintenanceDate, - ed.lastRepairAndMaintenanceDate AS lastRepairAndMaintenanceDate, - ed.repairAndMaintenanceRemarks AS repairAndMaintenanceRemarks - FROM equipment e - LEFT JOIN equipment_detail ed ON e.code = ed.equipmentCode - WHERE e.deleted = FALSE - """ - ) - if (args.containsKey("code")) { - sql.append(" AND e.code like :code ") - } - if (args.containsKey("id")) { - sql.append(" AND e.id like :id ") - } - if (args.containsKey("name")) { - sql.append(" AND e.name like :name ") - } - if (args.containsKey("description")) { - sql.append(" AND e.description like :description ") - } - if (args.containsKey("equipmentTypeId")) { - sql.append(" AND e.equipmentTypeId like :equipmentTypeId ") + val sql = StringBuilder( + """ + SELECT + e.id AS id, + e.code AS code, + e.name AS name, + e.description AS description, + e.equipmentTypeId AS equipmentTypeId, + ed.repairAndMaintenanceStatus AS repairAndMaintenanceStatus, + ed.latestRepairAndMaintenanceDate AS latestRepairAndMaintenanceDate, + ed.lastRepairAndMaintenanceDate AS lastRepairAndMaintenanceDate, + ed.repairAndMaintenanceRemarks AS repairAndMaintenanceRemarks + FROM equipment e + LEFT JOIN equipment_detail ed ON e.code = ed.equipmentCode + WHERE e.deleted = FALSE + """ + ) + if (args.containsKey("code")) { + sql.append(" AND e.code like :code ") + } + if (args.containsKey("id")) { + sql.append(" AND e.id like :id ") + } + if (args.containsKey("name")) { + sql.append(" AND e.name like :name ") + } + if (args.containsKey("description")) { + sql.append(" AND e.description like :description ") + } + if (args.containsKey("equipmentTypeId")) { + sql.append(" AND e.equipmentTypeId like :equipmentTypeId ") + } + return jdbcDao.queryForList(sql.toString(), args) } - return jdbcDao.queryForList(sql.toString(), args) -} open fun findById(id: Long): Equipment? { return equipmentRepository.findByIdAndDeletedFalse(id) @@ -69,10 +70,8 @@ open class EquipmentService( return equipmentRepository.findByDescriptionAndDeletedIsFalse(description) } - @Transactional open fun saveEquipment(request: NewEquipmentRequest): Equipment { - if (request.code.isNullOrBlank()) { throw IllegalArgumentException("Equipment type code cannot be null or blank") } @@ -81,26 +80,23 @@ open class EquipmentService( throw IllegalArgumentException("Equipment type code already exists") } - val entity = if (request.id != null && request.id > 0) { - equipmentRepository.findByIdAndDeletedFalse(request.id) ?: Equipment() } else { Equipment() } - entity.code = request.code entity.name = request.name entity.description = request.description - entity.EquipmentDetail= request.equipmentType + entity.EquipmentDetail = request.equipmentType return equipmentRepository.saveAndFlush(entity) } @Transactional open fun deleteEquipment(id: Long) { - val Equipment = equipmentRepository.findByIdAndDeletedFalse(id) - Equipment?.let { et -> + val equipment = equipmentRepository.findByIdAndDeletedFalse(id) + equipment?.let { et -> et.deleted = true equipmentRepository.saveAndFlush(et) } diff --git a/src/main/java/com/ffii/fpsms/modules/master/web/EquipmentController.kt b/src/main/java/com/ffii/fpsms/modules/master/web/EquipmentController.kt index b9021ab..6251503 100644 --- a/src/main/java/com/ffii/fpsms/modules/master/web/EquipmentController.kt +++ b/src/main/java/com/ffii/fpsms/modules/master/web/EquipmentController.kt @@ -5,15 +5,22 @@ import com.ffii.core.utils.CriteriaArgsBuilder import com.ffii.core.utils.PagingUtils import com.ffii.fpsms.modules.master.entity.Equipment import com.ffii.fpsms.modules.master.service.EquipmentService +import com.ffii.fpsms.modules.master.service.EquipmentQrCodeService import jakarta.servlet.http.HttpServletRequest +import jakarta.servlet.http.HttpServletResponse import jakarta.validation.Valid import org.springframework.web.bind.annotation.* import java.util.Collections.emptyList import com.ffii.fpsms.modules.master.web.models.NewEquipmentRequest +import net.sf.jasperreports.engine.JasperExportManager +import net.sf.jasperreports.engine.JasperPrint +import java.io.OutputStream + @RestController @RequestMapping("/Equipment") class EquipmentController( - private val equipmentService: EquipmentService + private val equipmentService: EquipmentService, + private val equipmentQrCodeService: EquipmentQrCodeService ) { @GetMapping fun allEquipment(): List { @@ -73,4 +80,17 @@ fun getAllEquipmentByPage( equipmentService.deleteEquipment(id) } + @PostMapping("/export-qrcode") + fun exportQrCode(@Valid @RequestBody request: ExportEquipmentQrCodeRequest, response: HttpServletResponse) { + response.characterEncoding = "utf-8" + response.contentType = "application/pdf" + val out: OutputStream = response.outputStream + val pdf = equipmentQrCodeService.exportEquipmentQrCode(request) + val jasperPrint = pdf["report"] as JasperPrint + val fileName = pdf["fileName"] as String + response.addHeader("Content-Disposition", "attachment; filename=\"${fileName}_qrcode.pdf\"") + out.write(JasperExportManager.exportReportToPdf(jasperPrint)) + out.flush() + } + } \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/master/web/EquipmentDetailController.kt b/src/main/java/com/ffii/fpsms/modules/master/web/EquipmentDetailController.kt index b62cc14..665bf6b 100644 --- a/src/main/java/com/ffii/fpsms/modules/master/web/EquipmentDetailController.kt +++ b/src/main/java/com/ffii/fpsms/modules/master/web/EquipmentDetailController.kt @@ -63,6 +63,18 @@ fun getAllEquipmentDetailByPage( return equipmentDetailService.findById(id) } + @GetMapping("/byEquipmentId/{equipmentId}") + fun getEquipmentDetailsByEquipmentId(@PathVariable equipmentId: Long): RecordsRes> { + val fullList = equipmentDetailService.getEquipmentDetailsByEquipmentId(equipmentId) ?: emptyList() + return RecordsRes(fullList as List>, fullList.size) + } + + @GetMapping("/byDescriptionIncludingDeleted/{description}") + fun getEquipmentDetailsByDescriptionIncludingDeleted(@PathVariable description: String): RecordsRes> { + val fullList = equipmentDetailService.getEquipmentDetailsByDescriptionIncludingDeleted(description) ?: emptyList() + return RecordsRes(fullList as List>, fullList.size) + } + @PutMapping("/update/{id}") fun updateMaintenanceAndRepair( @PathVariable id: Long, @@ -70,12 +82,10 @@ fun getAllEquipmentDetailByPage( ): EquipmentDetail { return equipmentDetailService.updateMaintenanceAndRepair(id, request) } -/* @PostMapping("/save") fun saveEquipmentDetail(@Valid @RequestBody equipmentDetail: NewEquipmentDetailRequest): EquipmentDetail { return equipmentDetailService.saveEquipmentDetail(equipmentDetail) } -*/ @DeleteMapping("/delete/{id}") fun deleteEquipmentDetail(@PathVariable id: Long) { diff --git a/src/main/java/com/ffii/fpsms/modules/master/web/ExportEquipmentQrCodeRequest.kt b/src/main/java/com/ffii/fpsms/modules/master/web/ExportEquipmentQrCodeRequest.kt new file mode 100644 index 0000000..346877d --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/master/web/ExportEquipmentQrCodeRequest.kt @@ -0,0 +1,5 @@ +package com.ffii.fpsms.modules.master.web + +data class ExportEquipmentQrCodeRequest( + val equipmentDetailIds: List +) diff --git a/src/main/java/com/ffii/fpsms/modules/master/web/models/NewEquipmentDetailRequest.kt b/src/main/java/com/ffii/fpsms/modules/master/web/models/NewEquipmentDetailRequest.kt index dcf8d15..1f17b59 100644 --- a/src/main/java/com/ffii/fpsms/modules/master/web/models/NewEquipmentDetailRequest.kt +++ b/src/main/java/com/ffii/fpsms/modules/master/web/models/NewEquipmentDetailRequest.kt @@ -19,6 +19,9 @@ data class NewEquipmentDetailRequest( val id: Long?, val description: String?, + val equipmentTypeId: Long?, + val equipmentCode: String?, + val repairAndMaintenanceStatus: Boolean?, // val type: List?, // val uom: List?, // val weightUnit: List?, diff --git a/src/main/resources/qrCodeHandle/equipment_QrHandle.jrxml b/src/main/resources/qrCodeHandle/equipment_QrHandle.jrxml new file mode 100644 index 0000000..838a60a --- /dev/null +++ b/src/main/resources/qrCodeHandle/equipment_QrHandle.jrxml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +