Kaynağa Gözat

Merge branch 'production' of https://git.2fi-solutions.com/jason/FPSMS-backend into production

production
tommy 1 hafta önce
ebeveyn
işleme
e438ae1d29
5 değiştirilmiş dosya ile 66 ekleme ve 27 silme
  1. +3
    -0
      .gitignore
  2. +48
    -26
      src/main/java/com/ffii/fpsms/modules/deliveryOrder/service/DoWorkbenchReleaseService.kt
  3. +1
    -1
      src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/DoWorkbenchController.kt
  4. +12
    -0
      src/main/java/com/ffii/fpsms/modules/jobOrder/web/JobOrderController.kt
  5. +2
    -0
      src/main/resources/db/changelog/changes/20260515_fpsms/01_m18_bom_shop_sync_log_columns.sql

+ 3
- 0
.gitignore Dosyayı Görüntüle

@@ -35,6 +35,9 @@ out/

### VS Code ###
.vscode/

### Cursor (local-only rules) ###
.cursor/rules/local/
package-lock.json
python/Bag3.spec
python/dist


+ 48
- 26
src/main/java/com/ffii/fpsms/modules/deliveryOrder/service/DoWorkbenchReleaseService.kt Dosyayı Görüntüle

@@ -1066,24 +1066,31 @@ open class DoWorkbenchReleaseService(
)
}

private fun isValidMergeLeftTicket(row: DopoMergeRow): Boolean {
val rt = row.releaseType?.trim()?.lowercase().orEmpty()
if (isWorkbenchMergeTicketNo(row.ticketNo)) {
return rt == WorkbenchReleaseTypeSupport.IS_EXTRA_BATCH.lowercase() ||
rt == WorkbenchReleaseTypeSupport.IS_EXTRA_SINGLE.lowercase()
}
return rt == WorkbenchReleaseTypeSupport.BATCH.lowercase() ||
rt == WorkbenchReleaseTypeSupport.SINGLE.lowercase()
}

@Transactional(rollbackFor = [Exception::class])
open fun mergeTicketsCase3(batchOrSingleDopoId: Long, isExtraDopoId: Long): MessageResponse {
if (batchOrSingleDopoId == isExtraDopoId) {
return mergeTicketsError("SAME_TICKET", "Cannot merge a ticket with itself")
}
val batchRow = loadDopoRowForMerge(batchOrSingleDopoId)
?: return mergeTicketsError("NOT_FOUND", "Batch/single ticket not found")
?: return mergeTicketsError("NOT_FOUND", "Left ticket not found")
val extraRow = loadDopoRowForMerge(isExtraDopoId)
?: return mergeTicketsError("NOT_FOUND", "isExtra ticket not found")

val batchRt = batchRow.releaseType?.trim()?.lowercase().orEmpty()
if (batchRt != WorkbenchReleaseTypeSupport.BATCH.lowercase() &&
batchRt != WorkbenchReleaseTypeSupport.SINGLE.lowercase()
) {
return mergeTicketsError("INVALID_BATCH", "Left ticket must be plain batch or single")
}
if (isWorkbenchMergeTicketNo(batchRow.ticketNo)) {
return mergeTicketsError("INVALID_BATCH", "Left ticket must not be a TI-M merge ticket")
if (!isValidMergeLeftTicket(batchRow)) {
return mergeTicketsError(
"INVALID_BATCH",
"Left ticket must be plain batch/single or an active TI-M merge ticket",
)
}
if (extraRow.releaseType?.trim()?.lowercase() != WorkbenchReleaseTypeSupport.LEGACY_IS_EXTRA.lowercase()) {
return mergeTicketsError("INVALID_EXTRA", "Right ticket must be releaseType isExtra")
@@ -1103,23 +1110,35 @@ open class DoWorkbenchReleaseService(
)
}

val isSingleRelease = batchRt == WorkbenchReleaseTypeSupport.SINGLE.lowercase()
val requiredDate = batchRow.requiredDeliveryDate ?: LocalDate.now()
val storeId = batchRow.storeId
val isDefaultTruckLane = storeId.isNullOrBlank()
val ticketFloorSegment = resolveTicketFloorSegment(storeId, isDefaultTruckLane)
val leftIsExistingMerge = isWorkbenchMergeTicketNo(batchRow.ticketNo)
val batchRt = batchRow.releaseType?.trim()?.lowercase().orEmpty()
val isSingleRelease = when {
leftIsExistingMerge ->
batchRt == WorkbenchReleaseTypeSupport.IS_EXTRA_SINGLE.lowercase()
else -> batchRt == WorkbenchReleaseTypeSupport.SINGLE.lowercase()
}

val mergeHeaderId = insertMergeHeaderFromDopoRow(
template = batchRow,
isSingleRelease = isSingleRelease,
requiredDate = requiredDate,
ticketFloorSegment = ticketFloorSegment,
) ?: return mergeTicketsError("CREATE_FAILED", "Failed to create TI-M merge ticket")
val mergeHeaderId = if (leftIsExistingMerge) {
batchOrSingleDopoId
} else {
val requiredDate = batchRow.requiredDeliveryDate ?: LocalDate.now()
val storeId = batchRow.storeId
val isDefaultTruckLane = storeId.isNullOrBlank()
val ticketFloorSegment = resolveTicketFloorSegment(storeId, isDefaultTruckLane)
insertMergeHeaderFromDopoRow(
template = batchRow,
isSingleRelease = isSingleRelease,
requiredDate = requiredDate,
ticketFloorSegment = ticketFloorSegment,
) ?: return mergeTicketsError("CREATE_FAILED", "Failed to create TI-M merge ticket")
}

retireSourceTicketIntoMergeHeader(batchOrSingleDopoId, mergeHeaderId)
if (!leftIsExistingMerge) {
retireSourceTicketIntoMergeHeader(batchOrSingleDopoId, mergeHeaderId)
}
retireSourceTicketIntoMergeHeader(isExtraDopoId, mergeHeaderId)

val newTicketNo = jdbcDao.queryForList(
val mergeTicketNo = jdbcDao.queryForList(
"SELECT ticketNo AS t FROM fpsmsdb.delivery_order_pick_order WHERE id = :id",
mapOf("id" to mergeHeaderId),
).firstOrNull()?.let { row ->
@@ -1131,13 +1150,14 @@ open class DoWorkbenchReleaseService(
code = "SUCCESS",
name = "workbench_merge_tickets",
type = "workbench_merge_tickets",
message = "Merged into $newTicketNo",
message = "Merged into $mergeTicketNo",
errorPosition = null,
entity = mapOf(
"mergeDeliveryOrderPickOrderId" to mergeHeaderId,
"ticketNo" to newTicketNo,
"ticketNo" to mergeTicketNo,
"batchOrSingleDopoId" to batchOrSingleDopoId,
"isExtraDopoId" to isExtraDopoId,
"mergedIntoExistingTiM" to leftIsExistingMerge,
),
)
}
@@ -1205,8 +1225,10 @@ open class DoWorkbenchReleaseService(
when (side) {
"batchFamily" -> sql.append(
"""
AND LOWER(COALESCE(dop.releaseType, '')) IN ('batch', 'single')
AND (dop.ticketNo IS NULL OR dop.ticketNo NOT LIKE 'TI-M-%')
AND (
LOWER(COALESCE(dop.releaseType, '')) IN ('batch', 'single')
OR dop.ticketNo LIKE 'TI-M-%'
)
""".trimIndent().let { " $it" },
)
"isExtra" -> sql.append(" AND LOWER(COALESCE(dop.releaseType, '')) = 'isextra' ")


+ 1
- 1
src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/DoWorkbenchController.kt Dosyayı Görüntüle

@@ -227,7 +227,7 @@ class DoWorkbenchController(
): WorkbenchMergeTicketCandidatesResponse =
doWorkbenchReleaseService.getMergeTicketCandidates(requiredDate, shopSearch)

/** Case 3: merge selected batch/single + isExtra into a new [TI-M] ticket. */
/** Case 3 / 3b: merge batch/single or existing [TI-M] + isExtra into [TI-M]. */
@PostMapping("/merge-tickets")
fun mergeWorkbenchTickets(@RequestBody request: WorkbenchMergeTicketsRequest): MessageResponse =
doWorkbenchReleaseService.mergeTicketsCase3(


+ 12
- 0
src/main/java/com/ffii/fpsms/modules/jobOrder/web/JobOrderController.kt Dosyayı Görüntüle

@@ -233,6 +233,18 @@ fun recordSecondScanIssue(
jobOrderService.printPickRecord(request)
}

@PostMapping("/PickRecord")
@Throws(UnsupportedEncodingException::class, NoSuchMessageException::class, ParseException::class, Exception::class)
fun exportPickRecord(@Valid @RequestBody request: ExportPickRecordRequest, response: HttpServletResponse) {
response.characterEncoding = "utf-8"
response.contentType = "application/pdf"
val out: OutputStream = response.outputStream
val pdf = jobOrderService.exportPickRecord(request)
val jasperPrint = pdf["report"] as JasperPrint
response.addHeader("filename", "${pdf["filename"]}.pdf")
out.write(JasperExportManager.exportReportToPdf(jasperPrint))
}

@PostMapping("/FGStockInLabel")
@Throws(UnsupportedEncodingException::class, NoSuchMessageException::class, ParseException::class, Exception::class)
fun exportFGStockInLabel(@Valid @RequestBody request: ExportFGStockInLabelRequest, response: HttpServletResponse){


+ 2
- 0
src/main/resources/db/changelog/changes/20260515_fpsms/01_m18_bom_shop_sync_log_columns.sql Dosyayı Görüntüle

@@ -1,5 +1,7 @@
--liquibase formatted sql
--changeset fpsms:20260515_m18_bom_shop_sync_log_columns
--preconditions onFail:MARK_RAN
--precondition-sql-check expectedResult:0 SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'm18_bom_shop_sync_log' AND COLUMN_NAME = 'finished_item_code'

ALTER TABLE `m18_bom_shop_sync_log`
ADD COLUMN `finished_item_code` VARCHAR(100) NULL COMMENT 'BOM finished-good item code' AFTER `bom_id`,


Yükleniyor…
İptal
Kaydet