From 29ccd209f6480ecaa9d0684581c3e1198bd1d2fd Mon Sep 17 00:00:00 2001 From: "usama.jameel" Date: Thu, 22 May 2025 09:25:13 +0500 Subject: [PATCH 1/5] add line wise detail day target total machine --- .../auth/InventoryAccountRole.java | 14 +++++++ .../InventoryAccountController.java | 5 +-- .../dao/ctp/FinishedItemDAO.java | 2 +- .../dao/ctp/InventoryAccountDAO.java | 24 ++++++++++- .../dao/ctp/InventoryAccountRowMapper.java | 4 ++ .../dao/ctp/InventoryTransactionLegDAO.java | 2 +- .../dao/ctp/PackagingItemsDAO.java | 2 +- .../dao/ctp/StitchingOfflineItemDAO.java | 4 +- .../com/utopiaindustries/model/Roles.java | 3 +- .../model/ctp/InventoryAccount.java | 40 ++++++++++++++++++ .../service/DashboardService.java | 41 ++++++++++--------- src/main/resources/templates/_fragments.html | 9 ++++ .../_inventory-account-fragment.html | 16 ++++++++ src/main/resources/templates/dashboard.html | 2 +- 14 files changed, 138 insertions(+), 30 deletions(-) create mode 100644 src/main/java/com/utopiaindustries/auth/InventoryAccountRole.java diff --git a/src/main/java/com/utopiaindustries/auth/InventoryAccountRole.java b/src/main/java/com/utopiaindustries/auth/InventoryAccountRole.java new file mode 100644 index 0000000..bb55e8f --- /dev/null +++ b/src/main/java/com/utopiaindustries/auth/InventoryAccountRole.java @@ -0,0 +1,14 @@ +package com.utopiaindustries.auth; + +import org.springframework.security.access.prepost.PreAuthorize; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.METHOD, ElementType.TYPE}) +@PreAuthorize("hasAnyRole('ROLE_INVENTORY_ACCOUNT','ROLE_ADMIN')") +public @interface InventoryAccountRole { +} diff --git a/src/main/java/com/utopiaindustries/controller/InventoryAccountController.java b/src/main/java/com/utopiaindustries/controller/InventoryAccountController.java index 30f0400..6f3057d 100644 --- a/src/main/java/com/utopiaindustries/controller/InventoryAccountController.java +++ b/src/main/java/com/utopiaindustries/controller/InventoryAccountController.java @@ -1,16 +1,15 @@ package com.utopiaindustries.controller; -import com.utopiaindustries.auth.AdminRole; +import com.utopiaindustries.auth.InventoryAccountRole; import com.utopiaindustries.model.ctp.InventoryAccount; import com.utopiaindustries.service.InventoryAccountService; -import com.utopiaindustries.util.StringUtils; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.mvc.support.RedirectAttributes; @Controller -@AdminRole +@InventoryAccountRole @RequestMapping( "/inventory-accounts" ) public class InventoryAccountController { diff --git a/src/main/java/com/utopiaindustries/dao/ctp/FinishedItemDAO.java b/src/main/java/com/utopiaindustries/dao/ctp/FinishedItemDAO.java index 3977c18..172f042 100644 --- a/src/main/java/com/utopiaindustries/dao/ctp/FinishedItemDAO.java +++ b/src/main/java/com/utopiaindustries/dao/ctp/FinishedItemDAO.java @@ -196,7 +196,7 @@ public class FinishedItemDAO { return namedParameterJdbcTemplate.query(SELECT_BY_JOB_CARD_AND_DATE, params, new FinishedItemRowMapper()); } - public Long findByOperationDoneDate(String startDate, String endDate, String qaStatus, List ids){ + public Long findByOperationDoneDateAndIdsAndQaStatus(String startDate, String endDate, String qaStatus, List ids){ MapSqlParameterSource params = new MapSqlParameterSource(); params.addValue( "start_date", startDate ); params.addValue( "end_date", endDate ); diff --git a/src/main/java/com/utopiaindustries/dao/ctp/InventoryAccountDAO.java b/src/main/java/com/utopiaindustries/dao/ctp/InventoryAccountDAO.java index 1719428..fe10062 100644 --- a/src/main/java/com/utopiaindustries/dao/ctp/InventoryAccountDAO.java +++ b/src/main/java/com/utopiaindustries/dao/ctp/InventoryAccountDAO.java @@ -20,7 +20,25 @@ public class InventoryAccountDAO { private final String SELECT_QUERY = String.format( "SELECT * FROM %s WHERE id = :id", TABLE_NAME ); private final String SELECT_ALL_QUERY = String.format( "SELECT * FROM %s ORDER BY title DESC", TABLE_NAME ); private final String DELETE_QUERY = String.format( "DELETE FROM %s WHERE id = :id", TABLE_NAME ); - private final String INSERT_QUERY = String.format( "INSERT INTO %s (id, title, parent_entity_type, parent_entity_id, active, created_by, created_at, location_site_id, notes, is_packaging) VALUES (:id, :title, :parent_entity_type, :parent_entity_id, :active, :created_by, :created_at, :location_site_id, :notes, :is_packaging) ON DUPLICATE KEY UPDATE title = VALUES(title), parent_entity_type = VALUES(parent_entity_type), parent_entity_id = VALUES(parent_entity_id), active = VALUES(active), created_by = VALUES(created_by), created_at = VALUES(created_at), location_site_id = VALUES(location_site_id), notes = VALUES(notes), is_packaging = VALUES(is_packaging)", TABLE_NAME ); + private final String INSERT_QUERY = String.format( + "INSERT INTO %s (id, title, parent_entity_type, parent_entity_id, active, created_by, created_at, location_site_id, notes, is_packaging, article_name, daily_target, total_machines, hourly_target) " + + "VALUES (:id, :title, :parent_entity_type, :parent_entity_id, :active, :created_by, :created_at, :location_site_id, :notes, :is_packaging, :article_name, :daily_target, :total_machines, :hourly_target) " + + "ON DUPLICATE KEY UPDATE " + + "title = VALUES(title), " + + "parent_entity_type = VALUES(parent_entity_type), " + + "parent_entity_id = VALUES(parent_entity_id), " + + "active = VALUES(active), " + + "created_by = VALUES(created_by), " + + "created_at = VALUES(created_at), " + + "location_site_id = VALUES(location_site_id), " + + "notes = VALUES(notes), " + + "is_packaging = VALUES(is_packaging), " + + "article_name = VALUES(article_name), " + + "daily_target = VALUES(daily_target), " + + "hourly_target = VALUES(hourly_target), " + + "total_machines = VALUES(total_machines)", + TABLE_NAME + ); private final String SELECT_BY_IDS = String.format( "SELECT * FROM %s WHERE id IN (:ids)", TABLE_NAME ); private final String SELECT_BY_IDS_AND_PARENT_ID = String.format( "SELECT * FROM %s WHERE active = TRUE AND id IN (:ids) AND parent_entity_id = :parent_entity_id", TABLE_NAME ); private final String SELECT_BY_IDS_AND_PARENT_IDS = String.format( "SELECT * FROM %s WHERE active = TRUE AND id IN (:ids) AND parent_entity_id IN (:parent_entity_ids)", TABLE_NAME ); @@ -45,6 +63,10 @@ public class InventoryAccountDAO { .addValue( "created_at", inventoryAccount.getCreatedAt() ) .addValue( "location_site_id", inventoryAccount.getLocationSiteId() ) .addValue( "notes", inventoryAccount.getNotes() ) + .addValue( "article_name", inventoryAccount.getArticleName() ) + .addValue( "total_machines", inventoryAccount.getTotalMachines() ) + .addValue( "daily_target", inventoryAccount.getDailyTarget() ) + .addValue( "hourly_target", inventoryAccount.getHourlyTarget() ) .addValue("is_packaging", inventoryAccount.getIsPackaging() ); return params; } diff --git a/src/main/java/com/utopiaindustries/dao/ctp/InventoryAccountRowMapper.java b/src/main/java/com/utopiaindustries/dao/ctp/InventoryAccountRowMapper.java index 1442d83..12930e5 100644 --- a/src/main/java/com/utopiaindustries/dao/ctp/InventoryAccountRowMapper.java +++ b/src/main/java/com/utopiaindustries/dao/ctp/InventoryAccountRowMapper.java @@ -20,6 +20,10 @@ public class InventoryAccountRowMapper implements RowMapper { } inventoryAccount.setLocationSiteId( rs.getInt( "location_site_id" ) ); inventoryAccount.setNotes( rs.getString( "notes" ) ); + inventoryAccount.setArticleName( rs.getString( "article_name" ) ); + inventoryAccount.setDailyTarget( rs.getLong( "daily_target" ) ); + inventoryAccount.setTotalMachines( rs.getLong( "total_machines" ) ); + inventoryAccount.setHourlyTarget( rs.getLong( "hourly_target" ) ); inventoryAccount.setIsPackaging( rs.getBoolean("is_packaging" ) ); return inventoryAccount; } diff --git a/src/main/java/com/utopiaindustries/dao/ctp/InventoryTransactionLegDAO.java b/src/main/java/com/utopiaindustries/dao/ctp/InventoryTransactionLegDAO.java index 6a5d757..839781d 100644 --- a/src/main/java/com/utopiaindustries/dao/ctp/InventoryTransactionLegDAO.java +++ b/src/main/java/com/utopiaindustries/dao/ctp/InventoryTransactionLegDAO.java @@ -221,7 +221,7 @@ public class InventoryTransactionLegDAO { return namedParameterJdbcTemplate.query( SELECT_JOB_CARD_And_Date_Type_Account_Id , params, new InventoryTransactionLegRowMapper() ); } - public List getParentIDsOFRemainingINVENTORY(String parentType, Integer accountId){ + public List findRemainingByParentTypeAndAccountID(String parentType, Integer accountId){ MapSqlParameterSource params = new MapSqlParameterSource(); params.addValue("account_id", accountId ); params.addValue("parent_document_type", parentType ); diff --git a/src/main/java/com/utopiaindustries/dao/ctp/PackagingItemsDAO.java b/src/main/java/com/utopiaindustries/dao/ctp/PackagingItemsDAO.java index 4d83629..8ddefbe 100644 --- a/src/main/java/com/utopiaindustries/dao/ctp/PackagingItemsDAO.java +++ b/src/main/java/com/utopiaindustries/dao/ctp/PackagingItemsDAO.java @@ -98,7 +98,7 @@ public class PackagingItemsDAO { return namedParameterJdbcTemplate.query(SELECT_BY_JOB_CARD_ID, params, new PackagingItemsRowMapper()); } - public Long findByDateANDIDs(String startDate, String endDate,List ids){ + public Long findByDateAndIds(String startDate, String endDate,List ids){ MapSqlParameterSource params = new MapSqlParameterSource(); params.addValue( "start_date", startDate ); params.addValue( "end_date", endDate ); diff --git a/src/main/java/com/utopiaindustries/dao/ctp/StitchingOfflineItemDAO.java b/src/main/java/com/utopiaindustries/dao/ctp/StitchingOfflineItemDAO.java index ff8b5f8..53c5d31 100644 --- a/src/main/java/com/utopiaindustries/dao/ctp/StitchingOfflineItemDAO.java +++ b/src/main/java/com/utopiaindustries/dao/ctp/StitchingOfflineItemDAO.java @@ -174,7 +174,7 @@ public class StitchingOfflineItemDAO { return namedParameterJdbcTemplate.query( SELECT_BY_JOB_CARD_AND_DATE , params, new StitchingOfflineItemRowMapper() ); } - public Long findByQCDoneDate(String startDate, String endDate, String qaStatus, List ids){ + public Long findByQCOperationDateAndIds(String startDate, String endDate, String qaStatus, List ids){ MapSqlParameterSource params = new MapSqlParameterSource(); params.addValue( "start_date", startDate ); params.addValue( "end_date", endDate ); @@ -183,7 +183,7 @@ public class StitchingOfflineItemDAO { Long count = namedParameterJdbcTemplate.queryForObject(SELECT_BY_DATE_QA_STATUS, params, Long.class); return count != null ? count : 0; } - public Long findByQCDoneDateApproved(String startDate, String endDate, String qaStatus){ + public Long findByQCOperationDateAndApproved(String startDate, String endDate, String qaStatus){ MapSqlParameterSource params = new MapSqlParameterSource(); params.addValue( "start_date", startDate ); params.addValue( "end_date", endDate ); diff --git a/src/main/java/com/utopiaindustries/model/Roles.java b/src/main/java/com/utopiaindustries/model/Roles.java index 7a8abbd..864dca6 100644 --- a/src/main/java/com/utopiaindustries/model/Roles.java +++ b/src/main/java/com/utopiaindustries/model/Roles.java @@ -10,5 +10,6 @@ public enum Roles { ROLE_FINISHING, ROLE_PACKAGING, ROLE_REPORTING, - ROLE_PURCHASE_ORDER + ROLE_PURCHASE_ORDER, + ROLE_INVENTORY_ACCOUNT } diff --git a/src/main/java/com/utopiaindustries/model/ctp/InventoryAccount.java b/src/main/java/com/utopiaindustries/model/ctp/InventoryAccount.java index 5b3ff7e..7f13cb7 100644 --- a/src/main/java/com/utopiaindustries/model/ctp/InventoryAccount.java +++ b/src/main/java/com/utopiaindustries/model/ctp/InventoryAccount.java @@ -14,6 +14,11 @@ public class InventoryAccount { private Integer locationSiteId; private String notes; private Boolean isPackaging; + private String articleName; + private long dailyTarget; + private long totalMachines; + private long hourlyTarget; + //wrapper private String locationTitle; @@ -105,6 +110,37 @@ public class InventoryAccount { this.locationTitle = locationTitle; } + public String getArticleName() { + return articleName; + } + + public void setArticleName(String articleName) { + this.articleName = articleName; + } + + public long getDailyTarget() { + return dailyTarget; + } + + public void setDailyTarget(long dailyTarget) { + this.dailyTarget = dailyTarget; + } + + public long getTotalMachines() { + return totalMachines; + } + + public void setTotalMachines(long totalMachines) { + this.totalMachines = totalMachines; + } + + public long getHourlyTarget() { + return hourlyTarget; + } + + public void setHourlyTarget(long hourlyTarget) { + this.hourlyTarget = hourlyTarget; + } @Override public String toString() { @@ -119,6 +155,10 @@ public class InventoryAccount { ", locationSiteId=" + locationSiteId + ", notes='" + notes + '\'' + ", isPackaging=" + isPackaging + + ", articleName='" + articleName + '\'' + + ", dailyTarget=" + dailyTarget + + ", totalMachines=" + totalMachines + + ", hourlyTarget=" + hourlyTarget + ", locationTitle='" + locationTitle + '\'' + '}'; } diff --git a/src/main/java/com/utopiaindustries/service/DashboardService.java b/src/main/java/com/utopiaindustries/service/DashboardService.java index 62b6eee..4a54793 100644 --- a/src/main/java/com/utopiaindustries/service/DashboardService.java +++ b/src/main/java/com/utopiaindustries/service/DashboardService.java @@ -47,6 +47,9 @@ public class DashboardService { List inventoryAccounts = inventoryAccountDAO.findAll(); + InventoryAccount inventoryAccount = inventoryAccounts.stream() + .filter(e -> cuttingAccount.equals(e.getTitle())).findFirst().orElse(new InventoryAccount()); + Map inventoryAccountMap = inventoryAccounts.stream() .filter(e -> cuttingAccount.equals(e.getTitle()) || stitchingAccount.equals(e.getTitle()) || @@ -55,16 +58,17 @@ public class DashboardService { .collect(Collectors.toMap(InventoryAccount::getTitle, e -> (int) e.getId())); - List stitchingItemIds = inventoryTransactionLegDAO.getParentIDsOFRemainingINVENTORY("STITCHING_OFFLINE", inventoryAccountMap.get(stitchingAccount)); + List stitchingItemIds = inventoryTransactionLegDAO.findRemainingByParentTypeAndAccountID("STITCHING_OFFLINE", inventoryAccountMap.get(stitchingAccount)); + List finishing = inventoryTransactionLegDAO.getInParentIdIdByDate("FINISHED_ITEM", inventoryAccountMap.get(finishingAccount)); - List packagingItemIDs = inventoryTransactionLegDAO.getParentIDsOFRemainingINVENTORY("PACKAGING", inventoryAccountMap.get(packagingAccount)); + List packagingItemIDs = inventoryTransactionLegDAO.findRemainingByParentTypeAndAccountID("PACKAGING", inventoryAccountMap.get(packagingAccount)); Long approvedStitchingOfflineItems = 0L; Long qcReject = 0L; if (stitchingItemIds != null && !stitchingItemIds.isEmpty()) { - approvedStitchingOfflineItems = stitchingOfflineItemDAO.findByQCDoneDateApproved(startDate1, endDate1, "APPROVED"); - qcReject = stitchingOfflineItemDAO.findByQCDoneDate(null, endDate1, "REJECT", stitchingItemIds); + approvedStitchingOfflineItems = stitchingOfflineItemDAO.findByQCOperationDateAndApproved(startDate1, endDate1, "APPROVED"); + qcReject = stitchingOfflineItemDAO.findByQCOperationDateAndIds(null, endDate1, "REJECT", stitchingItemIds); } Long alterationPieceFinish = 0L; @@ -74,19 +78,19 @@ public class DashboardService { Long operationNotPerformed = 0L; if (finishing != null && !finishing.isEmpty()) { - approved = finishedItemDAO.findByOperationDoneDate(startDate1, endDate1, "APPROVED", finishing); - operationNotPerformed = finishedItemDAO.findByOperationDoneDate(null, endDate1, "-", finishing); - rejectFinishedItem = finishedItemDAO.findByOperationDoneDate(null, endDate1, "REJECT", finishing); - washFinishedItem = finishedItemDAO.findByOperationDoneDate(startDate1, endDate1, "WASHED", finishing); - alterationPieceFinish = finishedItemDAO.findByOperationDoneDate(null, endDate1, "ALTER", finishing); + approved = finishedItemDAO.findByOperationDoneDateAndIdsAndQaStatus(startDate1, endDate1, "APPROVED", finishing); + operationNotPerformed = finishedItemDAO.findByOperationDoneDateAndIdsAndQaStatus(null, endDate1, "-", finishing); + rejectFinishedItem = finishedItemDAO.findByOperationDoneDateAndIdsAndQaStatus(null, endDate1, "REJECT", finishing); + washFinishedItem = finishedItemDAO.findByOperationDoneDateAndIdsAndQaStatus(startDate1, endDate1, "WASHED", finishing); + alterationPieceFinish = finishedItemDAO.findByOperationDoneDateAndIdsAndQaStatus(null, endDate1, "ALTER", finishing); } Long packagingItems = 0L; Long packagingItemsHourly = 0L; if (packagingItemIDs != null && !packagingItemIDs.isEmpty()) { - packagingItems = packagingItemsDAO.findByDateANDIDs(startDate1, endDate1, packagingItemIDs); - packagingItemsHourly = packagingItemsDAO.findByDateANDIDs(startDateWithHour, endDateWithHour, packagingItemIDs); + packagingItems = packagingItemsDAO.findByDateAndIds(startDate1, endDate1, packagingItemIDs); + packagingItemsHourly = packagingItemsDAO.findByDateAndIds(startDateWithHour, endDateWithHour, packagingItemIDs); } progress.put("Stitching", (float) approvedStitchingOfflineItems + qcReject); @@ -100,8 +104,8 @@ public class DashboardService { progress.put("packaging", (float) packagingItems); progress.put("Shift Achieved", (float) packagingItems); - progress.put("Efficiency", (float) packagingItems / 1000 * 100); progress.put("Hourly Achieved", Float.valueOf(packagingItemsHourly)); + progress.put("Efficiency", (float) packagingItems / inventoryAccount.getDailyTarget() * 100); return progress; @@ -110,17 +114,16 @@ public class DashboardService { public Map getLineDetails(String lineNo) { String cuttingAccount = "CUTTING ACCOUNT " + lineNo; List inventoryAccounts = inventoryAccountDAO.findAll(); - String articleNote = inventoryAccounts.stream() - .filter(e -> cuttingAccount.equals(e.getTitle())) - .map(InventoryAccount::getNotes).findFirst().orElse(null); + InventoryAccount inventoryAccount = inventoryAccounts.stream() + .filter(e -> cuttingAccount.equals(e.getTitle())).findFirst().orElse(new InventoryAccount()); HashMap details = new HashMap<>(); List jobCards = jobCardDAO.findAll(); - details.put("Shift Target", 1000 + " Pcs"); - details.put("articleNote", articleNote); - details.put("Hourly Target", 1000 / 24 + " Pcs"); + details.put("Shift Target", inventoryAccount.getDailyTarget() + " Pcs"); + details.put("articleName", inventoryAccount.getArticleName()); + details.put("Hourly Target", inventoryAccount.getHourlyTarget() + " Pcs"); details.put("Total Induction", String.valueOf(jobCards.size())); - details.put("Total Machine", String.valueOf(30)); + details.put("Total Machine", String.valueOf(inventoryAccount.getTotalMachines())); details.put("Total Worker", String.valueOf(30)); details.put("line", "Line " + lineNo); return details; diff --git a/src/main/resources/templates/_fragments.html b/src/main/resources/templates/_fragments.html index f6924ac..3ffc86f 100644 --- a/src/main/resources/templates/_fragments.html +++ b/src/main/resources/templates/_fragments.html @@ -94,6 +94,15 @@ class="dropdown-item">User And Roles + +
+ + +
+
+ + +
+
+ + +
+
+ + +
diff --git a/src/main/resources/templates/dashboard.html b/src/main/resources/templates/dashboard.html index f671d71..35075f4 100644 --- a/src/main/resources/templates/dashboard.html +++ b/src/main/resources/templates/dashboard.html @@ -28,7 +28,7 @@

0

-

+

0

-- 2.40.1 From e2001174ddf66df83eb9d60cac28940ffca23238 Mon Sep 17 00:00:00 2001 From: "usama.jameel" Date: Thu, 22 May 2025 09:39:09 +0500 Subject: [PATCH 2/5] fix naming issue --- .../com/utopiaindustries/dao/ctp/FinishedItemDAO.java | 2 +- .../com/utopiaindustries/service/DashboardService.java | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/utopiaindustries/dao/ctp/FinishedItemDAO.java b/src/main/java/com/utopiaindustries/dao/ctp/FinishedItemDAO.java index 172f042..fc4ff9a 100644 --- a/src/main/java/com/utopiaindustries/dao/ctp/FinishedItemDAO.java +++ b/src/main/java/com/utopiaindustries/dao/ctp/FinishedItemDAO.java @@ -196,7 +196,7 @@ public class FinishedItemDAO { return namedParameterJdbcTemplate.query(SELECT_BY_JOB_CARD_AND_DATE, params, new FinishedItemRowMapper()); } - public Long findByOperationDoneDateAndIdsAndQaStatus(String startDate, String endDate, String qaStatus, List ids){ + public Long findByOperationDateAndIdsAndQaStatus(String startDate, String endDate, String qaStatus, List ids){ MapSqlParameterSource params = new MapSqlParameterSource(); params.addValue( "start_date", startDate ); params.addValue( "end_date", endDate ); diff --git a/src/main/java/com/utopiaindustries/service/DashboardService.java b/src/main/java/com/utopiaindustries/service/DashboardService.java index 4a54793..a497eb4 100644 --- a/src/main/java/com/utopiaindustries/service/DashboardService.java +++ b/src/main/java/com/utopiaindustries/service/DashboardService.java @@ -78,11 +78,11 @@ public class DashboardService { Long operationNotPerformed = 0L; if (finishing != null && !finishing.isEmpty()) { - approved = finishedItemDAO.findByOperationDoneDateAndIdsAndQaStatus(startDate1, endDate1, "APPROVED", finishing); - operationNotPerformed = finishedItemDAO.findByOperationDoneDateAndIdsAndQaStatus(null, endDate1, "-", finishing); - rejectFinishedItem = finishedItemDAO.findByOperationDoneDateAndIdsAndQaStatus(null, endDate1, "REJECT", finishing); - washFinishedItem = finishedItemDAO.findByOperationDoneDateAndIdsAndQaStatus(startDate1, endDate1, "WASHED", finishing); - alterationPieceFinish = finishedItemDAO.findByOperationDoneDateAndIdsAndQaStatus(null, endDate1, "ALTER", finishing); + approved = finishedItemDAO.findByOperationDateAndIdsAndQaStatus(startDate1, endDate1, "APPROVED", finishing); + operationNotPerformed = finishedItemDAO.findByOperationDateAndIdsAndQaStatus(null, endDate1, "-", finishing); + rejectFinishedItem = finishedItemDAO.findByOperationDateAndIdsAndQaStatus(null, endDate1, "REJECT", finishing); + washFinishedItem = finishedItemDAO.findByOperationDateAndIdsAndQaStatus(startDate1, endDate1, "WASHED", finishing); + alterationPieceFinish = finishedItemDAO.findByOperationDateAndIdsAndQaStatus(null, endDate1, "ALTER", finishing); } -- 2.40.1 From 6b722b196550abc6c99e50063ff84c39a2db3520 Mon Sep 17 00:00:00 2001 From: "usama.jameel" Date: Thu, 22 May 2025 15:02:45 +0500 Subject: [PATCH 3/5] add formula of efficiency and shift target --- .../dao/ctp/InventoryAccountDAO.java | 14 +- .../dao/ctp/InventoryAccountRowMapper.java | 5 +- .../model/ctp/InventoryAccount.java | 34 ++- .../service/DashboardService.java | 66 +++-- .../_inventory-account-fragment.html | 238 +++++++++--------- src/main/resources/templates/dashboard.html | 3 +- 6 files changed, 209 insertions(+), 151 deletions(-) diff --git a/src/main/java/com/utopiaindustries/dao/ctp/InventoryAccountDAO.java b/src/main/java/com/utopiaindustries/dao/ctp/InventoryAccountDAO.java index fe10062..95b0aee 100644 --- a/src/main/java/com/utopiaindustries/dao/ctp/InventoryAccountDAO.java +++ b/src/main/java/com/utopiaindustries/dao/ctp/InventoryAccountDAO.java @@ -21,8 +21,8 @@ public class InventoryAccountDAO { private final String SELECT_ALL_QUERY = String.format( "SELECT * FROM %s ORDER BY title DESC", TABLE_NAME ); private final String DELETE_QUERY = String.format( "DELETE FROM %s WHERE id = :id", TABLE_NAME ); private final String INSERT_QUERY = String.format( - "INSERT INTO %s (id, title, parent_entity_type, parent_entity_id, active, created_by, created_at, location_site_id, notes, is_packaging, article_name, daily_target, total_machines, hourly_target) " + - "VALUES (:id, :title, :parent_entity_type, :parent_entity_id, :active, :created_by, :created_at, :location_site_id, :notes, :is_packaging, :article_name, :daily_target, :total_machines, :hourly_target) " + + "INSERT INTO %s (id, title, parent_entity_type, parent_entity_id, active, created_by, created_at, location_site_id, notes, is_packaging, article_name, shift_minutes, total_machines, efficiency, sam) " + + "VALUES (:id, :title, :parent_entity_type, :parent_entity_id, :active, :created_by, :created_at, :location_site_id, :notes, :is_packaging, :article_name, :shift_minutes, :total_machines, :efficiency, :sam) " + "ON DUPLICATE KEY UPDATE " + "title = VALUES(title), " + "parent_entity_type = VALUES(parent_entity_type), " + @@ -34,8 +34,9 @@ public class InventoryAccountDAO { "notes = VALUES(notes), " + "is_packaging = VALUES(is_packaging), " + "article_name = VALUES(article_name), " + - "daily_target = VALUES(daily_target), " + - "hourly_target = VALUES(hourly_target), " + + "shift_minutes = VALUES(shift_minutes), " + + "efficiency = VALUES(efficiency), " + + "sam = VALUES(sam), " + "total_machines = VALUES(total_machines)", TABLE_NAME ); @@ -65,8 +66,9 @@ public class InventoryAccountDAO { .addValue( "notes", inventoryAccount.getNotes() ) .addValue( "article_name", inventoryAccount.getArticleName() ) .addValue( "total_machines", inventoryAccount.getTotalMachines() ) - .addValue( "daily_target", inventoryAccount.getDailyTarget() ) - .addValue( "hourly_target", inventoryAccount.getHourlyTarget() ) + .addValue( "shift_minutes", inventoryAccount.getShiftMinutes() ) + .addValue( "efficiency", inventoryAccount.getEfficiency() ) + .addValue( "sam", inventoryAccount.getSam() ) .addValue("is_packaging", inventoryAccount.getIsPackaging() ); return params; } diff --git a/src/main/java/com/utopiaindustries/dao/ctp/InventoryAccountRowMapper.java b/src/main/java/com/utopiaindustries/dao/ctp/InventoryAccountRowMapper.java index 12930e5..d015aea 100644 --- a/src/main/java/com/utopiaindustries/dao/ctp/InventoryAccountRowMapper.java +++ b/src/main/java/com/utopiaindustries/dao/ctp/InventoryAccountRowMapper.java @@ -21,9 +21,10 @@ public class InventoryAccountRowMapper implements RowMapper { inventoryAccount.setLocationSiteId( rs.getInt( "location_site_id" ) ); inventoryAccount.setNotes( rs.getString( "notes" ) ); inventoryAccount.setArticleName( rs.getString( "article_name" ) ); - inventoryAccount.setDailyTarget( rs.getLong( "daily_target" ) ); + inventoryAccount.setShiftMinutes( rs.getLong( "shift_minutes" ) ); inventoryAccount.setTotalMachines( rs.getLong( "total_machines" ) ); - inventoryAccount.setHourlyTarget( rs.getLong( "hourly_target" ) ); + inventoryAccount.setEfficiency( rs.getBigDecimal( "efficiency" ) ); + inventoryAccount.setSam( rs.getBigDecimal( "sam" ) ); inventoryAccount.setIsPackaging( rs.getBoolean("is_packaging" ) ); return inventoryAccount; } diff --git a/src/main/java/com/utopiaindustries/model/ctp/InventoryAccount.java b/src/main/java/com/utopiaindustries/model/ctp/InventoryAccount.java index 7f13cb7..331f528 100644 --- a/src/main/java/com/utopiaindustries/model/ctp/InventoryAccount.java +++ b/src/main/java/com/utopiaindustries/model/ctp/InventoryAccount.java @@ -1,5 +1,6 @@ package com.utopiaindustries.model.ctp; +import java.math.BigDecimal; import java.time.LocalDateTime; public class InventoryAccount { @@ -15,9 +16,10 @@ public class InventoryAccount { private String notes; private Boolean isPackaging; private String articleName; - private long dailyTarget; + private long shiftMinutes; private long totalMachines; - private long hourlyTarget; + private BigDecimal efficiency; + private BigDecimal sam; //wrapper private String locationTitle; @@ -118,12 +120,12 @@ public class InventoryAccount { this.articleName = articleName; } - public long getDailyTarget() { - return dailyTarget; + public long getShiftMinutes() { + return shiftMinutes; } - public void setDailyTarget(long dailyTarget) { - this.dailyTarget = dailyTarget; + public void setShiftMinutes(long shiftMinutes) { + this.shiftMinutes = shiftMinutes; } public long getTotalMachines() { @@ -134,12 +136,20 @@ public class InventoryAccount { this.totalMachines = totalMachines; } - public long getHourlyTarget() { - return hourlyTarget; + public BigDecimal getEfficiency() { + return efficiency; } - public void setHourlyTarget(long hourlyTarget) { - this.hourlyTarget = hourlyTarget; + public void setEfficiency(BigDecimal efficiency) { + this.efficiency = efficiency; + } + + public BigDecimal getSam() { + return sam; + } + + public void setSam(BigDecimal sam) { + this.sam = sam; } @Override @@ -156,9 +166,9 @@ public class InventoryAccount { ", notes='" + notes + '\'' + ", isPackaging=" + isPackaging + ", articleName='" + articleName + '\'' + - ", dailyTarget=" + dailyTarget + + ", shiftMinutes=" + shiftMinutes + ", totalMachines=" + totalMachines + - ", hourlyTarget=" + hourlyTarget + + ", efficiency=" + efficiency + ", locationTitle='" + locationTitle + '\'' + '}'; } diff --git a/src/main/java/com/utopiaindustries/service/DashboardService.java b/src/main/java/com/utopiaindustries/service/DashboardService.java index a497eb4..94b61a2 100644 --- a/src/main/java/com/utopiaindustries/service/DashboardService.java +++ b/src/main/java/com/utopiaindustries/service/DashboardService.java @@ -4,7 +4,11 @@ import com.utopiaindustries.dao.ctp.*; import com.utopiaindustries.model.ctp.*; import org.springframework.stereotype.Service; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.Duration; import java.time.LocalDateTime; +import java.time.LocalTime; import java.time.format.DateTimeFormatter; import java.util.*; import java.util.stream.Collectors; @@ -37,7 +41,9 @@ public class DashboardService { String finishingAccount = "FINISHING ACCOUNT " + lineNo; String packagingAccount = "A GRADE ACCOUNT " + lineNo; - String startDate1 = LocalDateTime.now().withHour(0).withMinute(0).withSecond(1).format(formatter); + LocalDateTime today = LocalDateTime.now().withHour(0).withMinute(0).withSecond(1); + + String startDate1 = today.format(formatter); String endDate1 = LocalDateTime.now().withHour(23).withMinute(59).withSecond(59).format(formatter); String startDateWithHour = LocalDateTime.now().minusHours(1).format(formatter); String endDateWithHour = LocalDateTime.now().format(formatter); @@ -65,7 +71,7 @@ public class DashboardService { List packagingItemIDs = inventoryTransactionLegDAO.findRemainingByParentTypeAndAccountID("PACKAGING", inventoryAccountMap.get(packagingAccount)); Long approvedStitchingOfflineItems = 0L; - Long qcReject = 0L; + long qcReject = 0L; if (stitchingItemIds != null && !stitchingItemIds.isEmpty()) { approvedStitchingOfflineItems = stitchingOfflineItemDAO.findByQCOperationDateAndApproved(startDate1, endDate1, "APPROVED"); qcReject = stitchingOfflineItemDAO.findByQCOperationDateAndIds(null, endDate1, "REJECT", stitchingItemIds); @@ -87,27 +93,35 @@ public class DashboardService { Long packagingItems = 0L; - Long packagingItemsHourly = 0L; if (packagingItemIDs != null && !packagingItemIDs.isEmpty()) { packagingItems = packagingItemsDAO.findByDateAndIds(startDate1, endDate1, packagingItemIDs); - packagingItemsHourly = packagingItemsDAO.findByDateAndIds(startDateWithHour, endDateWithHour, packagingItemIDs); } + LocalDateTime statTime = LocalDateTime.now().withHour(9).withMinute(0).withSecond(0).withNano(0); + LocalDateTime endTime = statTime.plusMinutes(inventoryAccount.getShiftMinutes()); + + long minutesPassed = 0; + + if (statTime.isBefore(LocalDateTime.now()) && LocalDateTime.now().isBefore(endTime)) { + minutesPassed = Duration.between(statTime, LocalDateTime.now()).toMinutes(); + } + + long shiftTargetMinutesWise = getTargetShiftWiseOrHourlyWise(Math.max(0, minutesPassed), inventoryAccount); + float efficiency; + if (shiftTargetMinutesWise == 0) { + efficiency = 0f; + } else { + efficiency = approvedStitchingOfflineItems + (float) qcReject / shiftTargetMinutesWise; + } progress.put("Stitching", (float) approvedStitchingOfflineItems + qcReject); progress.put("totalWips", (float) stitchingItemIds.size() - qcReject); progress.put("Alteration", (float) qcReject); - progress.put("finishing", (float) approved + operationNotPerformed); progress.put("ALTER", (float) alterationPieceFinish); progress.put("Reject", (float) rejectFinishedItem); progress.put("wash", (float) washFinishedItem); progress.put("packaging", (float) packagingItems); - - progress.put("Shift Achieved", (float) packagingItems); - progress.put("Hourly Achieved", Float.valueOf(packagingItemsHourly)); - progress.put("Efficiency", (float) packagingItems / inventoryAccount.getDailyTarget() * 100); - - + progress.put("Efficiency",efficiency); return progress; } @@ -117,15 +131,37 @@ public class DashboardService { InventoryAccount inventoryAccount = inventoryAccounts.stream() .filter(e -> cuttingAccount.equals(e.getTitle())).findFirst().orElse(new InventoryAccount()); + int shiftTarget = getTargetShiftWiseOrHourlyWise(inventoryAccount.getShiftMinutes(), inventoryAccount); + int shiftHourlyTarget = getTargetShiftWiseOrHourlyWise(60, inventoryAccount); + HashMap details = new HashMap<>(); - List jobCards = jobCardDAO.findAll(); - details.put("Shift Target", inventoryAccount.getDailyTarget() + " Pcs"); + details.put("Shift Target", shiftTarget + " Pcs"); details.put("articleName", inventoryAccount.getArticleName()); - details.put("Hourly Target", inventoryAccount.getHourlyTarget() + " Pcs"); - details.put("Total Induction", String.valueOf(jobCards.size())); + details.put("Hourly Target", shiftHourlyTarget + " Pcs"); details.put("Total Machine", String.valueOf(inventoryAccount.getTotalMachines())); details.put("Total Worker", String.valueOf(30)); details.put("line", "Line " + lineNo); return details; } + + //formula for calculating targets --> machine * shiftTime * Efficiency / SAM + private int getTargetShiftWiseOrHourlyWise(long minutes, InventoryAccount inventoryAccount) { + if (inventoryAccount == null || + inventoryAccount.getTotalMachines() == 0 || + inventoryAccount.getEfficiency() == null || + inventoryAccount.getSam() == null) { + return 0; + } + BigDecimal totalMachines = BigDecimal.valueOf(inventoryAccount.getTotalMachines()); + BigDecimal efficiency = inventoryAccount.getEfficiency(); + BigDecimal sam = inventoryAccount.getSam(); + BigDecimal totalShiftProductiveTime = totalMachines + .multiply(BigDecimal.valueOf(minutes)) + .multiply(efficiency); + if (sam.longValue() != 0) { + return totalShiftProductiveTime.divide(sam, 0, RoundingMode.HALF_UP).intValueExact(); + } + return 0; + } + } diff --git a/src/main/resources/templates/_inventory-account-fragment.html b/src/main/resources/templates/_inventory-account-fragment.html index 108db87..e1f81cd 100644 --- a/src/main/resources/templates/_inventory-account-fragment.html +++ b/src/main/resources/templates/_inventory-account-fragment.html @@ -1,122 +1,132 @@ - - -
+ + \ No newline at end of file diff --git a/src/main/resources/templates/dashboard.html b/src/main/resources/templates/dashboard.html index 35075f4..ab2b429 100644 --- a/src/main/resources/templates/dashboard.html +++ b/src/main/resources/templates/dashboard.html @@ -87,7 +87,7 @@

0%

+ th:text="${#numbers.formatDecimal(phases.get('Efficiency'), 1, 2) + ' %'}">0%

Efficiency

@@ -100,7 +100,6 @@ -
-- 2.40.1 From 556502b7a216755f32cc698223b910bc0a565046 Mon Sep 17 00:00:00 2001 From: "usama.jameel" Date: Thu, 22 May 2025 17:49:20 +0500 Subject: [PATCH 4/5] fix achieved items error --- .../java/com/utopiaindustries/service/DashboardService.java | 3 +++ src/main/resources/templates/dashboard.html | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/utopiaindustries/service/DashboardService.java b/src/main/java/com/utopiaindustries/service/DashboardService.java index 94b61a2..e1adf15 100644 --- a/src/main/java/com/utopiaindustries/service/DashboardService.java +++ b/src/main/java/com/utopiaindustries/service/DashboardService.java @@ -116,11 +116,14 @@ public class DashboardService { progress.put("Stitching", (float) approvedStitchingOfflineItems + qcReject); progress.put("totalWips", (float) stitchingItemIds.size() - qcReject); progress.put("Alteration", (float) qcReject); + progress.put("finishing", (float) approved + operationNotPerformed); progress.put("ALTER", (float) alterationPieceFinish); progress.put("Reject", (float) rejectFinishedItem); progress.put("wash", (float) washFinishedItem); + progress.put("packaging", (float) packagingItems); + progress.put("Efficiency",efficiency); return progress; } diff --git a/src/main/resources/templates/dashboard.html b/src/main/resources/templates/dashboard.html index ab2b429..94b88b4 100644 --- a/src/main/resources/templates/dashboard.html +++ b/src/main/resources/templates/dashboard.html @@ -44,7 +44,7 @@

+ th:text="${phases.get('packaging')?.intValue() ?: 0}">

Achieved

-- 2.40.1 From 4402a24fa4dcf198ecdba2d3635b4644b263345e Mon Sep 17 00:00:00 2001 From: "usama.jameel" Date: Fri, 23 May 2025 09:05:25 +0500 Subject: [PATCH 5/5] fix achieved items error --- .../java/com/utopiaindustries/service/DashboardService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/utopiaindustries/service/DashboardService.java b/src/main/java/com/utopiaindustries/service/DashboardService.java index e1adf15..b2da69c 100644 --- a/src/main/java/com/utopiaindustries/service/DashboardService.java +++ b/src/main/java/com/utopiaindustries/service/DashboardService.java @@ -111,7 +111,7 @@ public class DashboardService { if (shiftTargetMinutesWise == 0) { efficiency = 0f; } else { - efficiency = approvedStitchingOfflineItems + (float) qcReject / shiftTargetMinutesWise; + efficiency = (float) approvedStitchingOfflineItems / shiftTargetMinutesWise; } progress.put("Stitching", (float) approvedStitchingOfflineItems + qcReject); progress.put("totalWips", (float) stitchingItemIds.size() - qcReject); -- 2.40.1