add stitching report dashboard #19
|
@ -95,6 +95,36 @@ public class ReportingController {
|
|||
return "/reporting/cutting-report";
|
||||
}
|
||||
|
||||
@GetMapping( value = "/stitching-report" )
|
||||
public String stitchingReport(@RequestParam(value = "job-card-id", required = false ) String jobCardId, @RequestParam(value = "accountId" , required = false) String accountId, @RequestParam(value = "start-date", required = false) String startDate, @RequestParam(value = "end-date", required = false) String endDate, Model model ){
|
||||
|
||||
LocalDate startDate1 = StringUtils.isNullOrEmpty(startDate) ? LocalDate.now().minusDays(31) : LocalDate.parse(startDate);
|
||||
LocalDate endDate1 = StringUtils.isNullOrEmpty(endDate) ? LocalDate.now() : LocalDate.parse(endDate);
|
||||
model.addAttribute("startDate", startDate1);
|
||||
model.addAttribute("endDate", endDate1);
|
||||
model.addAttribute("accounts" , inventoryAccountService.findInventoryAccounts( 2L ) );
|
||||
model.addAttribute("stitching",reportingService.getStitchingDetails(jobCardId, accountId, startDate1.toString(), endDate1.toString()));
|
||||
|
||||
return "/reporting/stitching-report";
|
||||
}
|
||||
|
||||
@GetMapping( "/inventory-transactions" )
|
||||
public String getInventoryTransactionsByAccount( @RequestParam( value = "account-id", required = false) String accountId,
|
||||
@RequestParam( value = "jobCard-id", required = false) String jobCardId,
|
||||
@RequestParam( value = "sku", required = false) String sku,
|
||||
@RequestParam( value = "startDate", required = false) String startDate,
|
||||
@RequestParam( value = "endDate", required = false) String endDate,
|
||||
Model model ){
|
||||
|
||||
LocalDate startDate1 = StringUtils.isNullOrEmpty(startDate) ? LocalDate.now().minusDays(31) : LocalDate.parse(startDate);
|
||||
LocalDate endDate1 = StringUtils.isNullOrEmpty(endDate) ? LocalDate.now() : LocalDate.parse(endDate);
|
||||
model.addAttribute("startDate", startDate1);
|
||||
model.addAttribute("endDate", endDate1);
|
||||
model.addAttribute("transactions", reportingService.stitchingItemsTransactions( jobCardId, accountId, sku, startDate1.toString(), endDate1.toString() ));
|
||||
return "/reporting/accounts-transaction-table";
|
||||
}
|
||||
|
||||
|
||||
private ArrayList<LocalDate> generateDateList(LocalDate start, LocalDate end) {
|
||||
ArrayList<LocalDate> localDates = new ArrayList<>();
|
||||
while (start.isBefore(end)) {
|
||||
|
|
|
@ -4,7 +4,7 @@ public class CuttingJobCardItemWrapper {
|
|||
private long jobCardId;
|
||||
private String poName;
|
||||
private String sku;
|
||||
private Long totalCutting;
|
||||
private Long total;
|
||||
private String width;
|
||||
private String length;
|
||||
private String gsm;
|
||||
|
@ -13,8 +13,8 @@ public class CuttingJobCardItemWrapper {
|
|||
private String articleName;
|
||||
private boolean isComplete;
|
||||
private String jobCardCode;
|
||||
private String cuttingOperatorName;
|
||||
private long cuttingAccountId;
|
||||
private String operatorName;
|
||||
private long accountId;
|
||||
|
||||
public long getJobCardId() {
|
||||
return jobCardId;
|
||||
|
@ -40,14 +40,6 @@ public class CuttingJobCardItemWrapper {
|
|||
this.sku = sku;
|
||||
}
|
||||
|
||||
public Long getTotalCutting() {
|
||||
return totalCutting;
|
||||
}
|
||||
|
||||
public void setTotalCutting(Long totalCutting) {
|
||||
this.totalCutting = totalCutting;
|
||||
}
|
||||
|
||||
public String getWidth() {
|
||||
return width;
|
||||
}
|
||||
|
@ -104,13 +96,6 @@ public class CuttingJobCardItemWrapper {
|
|||
this.jobCardCode = jobCardCode;
|
||||
}
|
||||
|
||||
public long getCuttingAccountId() {
|
||||
return cuttingAccountId;
|
||||
}
|
||||
|
||||
public void setCuttingAccountId(long cuttingAccountId) {
|
||||
this.cuttingAccountId = cuttingAccountId;
|
||||
}
|
||||
|
||||
public String getLength() {
|
||||
return length;
|
||||
|
@ -120,31 +105,47 @@ public class CuttingJobCardItemWrapper {
|
|||
this.length = length;
|
||||
}
|
||||
|
||||
public String getCuttingOperatorName() {
|
||||
return cuttingOperatorName;
|
||||
public String getOperatorName() {
|
||||
return operatorName;
|
||||
}
|
||||
|
||||
public void setCuttingOperatorName(String cuttingOperatorName) {
|
||||
this.cuttingOperatorName = cuttingOperatorName;
|
||||
public void setOperatorName(String operatorName) {
|
||||
this.operatorName = operatorName;
|
||||
}
|
||||
|
||||
public long getAccountId() {
|
||||
return accountId;
|
||||
}
|
||||
|
||||
public void setAccountId(long accountId) {
|
||||
this.accountId = accountId;
|
||||
}
|
||||
|
||||
public Long getTotal() {
|
||||
return total;
|
||||
}
|
||||
|
||||
public void setTotal(Long total) {
|
||||
this.total = total;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "CuttingJobCardItemWrapper{" +
|
||||
"cuttingAccountId=" + cuttingAccountId +
|
||||
", cuttingOperatorName='" + cuttingOperatorName + '\'' +
|
||||
", jobCardCode='" + jobCardCode + '\'' +
|
||||
", isComplete=" + isComplete +
|
||||
", articleName='" + articleName + '\'' +
|
||||
", ply='" + ply + '\'' +
|
||||
", wtPly='" + wtPly + '\'' +
|
||||
", gsm='" + gsm + '\'' +
|
||||
", length='" + length + '\'' +
|
||||
", width='" + width + '\'' +
|
||||
", totalCutting=" + totalCutting +
|
||||
", sku='" + sku + '\'' +
|
||||
"jobCardId=" + jobCardId +
|
||||
", poName='" + poName + '\'' +
|
||||
", jobCardId=" + jobCardId +
|
||||
", sku='" + sku + '\'' +
|
||||
", total=" + total +
|
||||
", width='" + width + '\'' +
|
||||
", length='" + length + '\'' +
|
||||
", gsm='" + gsm + '\'' +
|
||||
", wtPly='" + wtPly + '\'' +
|
||||
", ply='" + ply + '\'' +
|
||||
", articleName='" + articleName + '\'' +
|
||||
", isComplete=" + isComplete +
|
||||
", jobCardCode='" + jobCardCode + '\'' +
|
||||
", operatorName='" + operatorName + '\'' +
|
||||
", accountId=" + accountId +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
|
|
|
@ -71,8 +71,11 @@ public class SummaryInventoryReportQueryBuilder {
|
|||
|
||||
public static String cuttingQueryBuild(long jobCardId,
|
||||
List<Long> account,
|
||||
String sku,
|
||||
String startDate,
|
||||
String endDate,String type) {
|
||||
String endDate,
|
||||
String type,
|
||||
String parentDocumentType) {
|
||||
|
||||
QueryBuilder qb = new QueryBuilder()
|
||||
.setTable(TABLE_NAME)
|
||||
|
@ -84,11 +87,17 @@ public class SummaryInventoryReportQueryBuilder {
|
|||
.and()
|
||||
.columnEqualToOrLessThan("transaction_leg_datetime",endDate)
|
||||
.and()
|
||||
.columnEquals("type",type);
|
||||
.columnEquals("type",type)
|
||||
.and()
|
||||
.columnEquals("parent_document_type",parentDocumentType);
|
||||
if (jobCardId != 0){
|
||||
qb.and()
|
||||
.columnEquals("job_card_id", jobCardId );
|
||||
}
|
||||
if (!StringUtils.isNullOrEmpty(sku)){
|
||||
qb.and()
|
||||
.columnEquals("sku", sku );
|
||||
}
|
||||
return qb.build();
|
||||
}
|
||||
}
|
|
@ -351,13 +351,18 @@ public class BarcodeService {
|
|||
|
||||
PdfFont font = PdfFontFactory.createFont(StandardFonts.COURIER_OBLIQUE);
|
||||
String id = String.valueOf(artifact.getId());
|
||||
float textSize = stickerSize.getTextSize() + 8;
|
||||
float charWidth = textSize * 0.6f;
|
||||
float idWidth = id.length() * charWidth;
|
||||
float xCentered = (labelWidth / 2f) - (idWidth / 2f);
|
||||
|
||||
document.add(new Paragraph(id)
|
||||
.setFont(font)
|
||||
.setBold()
|
||||
.setFontColor(ColorConstants.BLACK)
|
||||
.setFontSize(stickerSize.getTextSize() + 8)
|
||||
.setTextAlignment(TextAlignment.LEFT)
|
||||
.setFixedPosition(textX - 25, textY + 13, 100));
|
||||
.setFontSize(textSize)
|
||||
.setFixedPosition(xCentered, textY + 13, 100));
|
||||
|
||||
|
||||
float dottedLine = textY - 65;
|
||||
for(int i= 0 ;i<16;i++){
|
||||
|
|
|
@ -618,7 +618,7 @@ public class ReportingService {
|
|||
inventoryAccountIds = List.of(Long.parseLong(cuttingTableId));
|
||||
}
|
||||
|
||||
String query = SummaryInventoryReportQueryBuilder.cuttingQueryBuild(jobCardIdTemp, inventoryAccountIds, startDate1, endDate1, "IN");
|
||||
String query = SummaryInventoryReportQueryBuilder.cuttingQueryBuild(jobCardIdTemp, inventoryAccountIds, null, startDate1, endDate1, "IN","BUNDLE");
|
||||
List<InventoryTransactionLeg> inventoryTransactionLegs = inventoryTransactionLegDAO.findByQuery(query);
|
||||
|
||||
Map<String, Integer> dateWiseProduction = new TreeMap<>();
|
||||
|
@ -670,15 +670,15 @@ public class ReportingService {
|
|||
wrapper.setGsm(item.getGsm());
|
||||
wrapper.setPly(item.getPly());
|
||||
wrapper.setSku(item.getSku());
|
||||
wrapper.setTotalCutting(item.getActualProduction().longValue());
|
||||
wrapper.setTotal(item.getActualProduction().longValue());
|
||||
wrapper.setWidth(item.getWidth());
|
||||
wrapper.setWtPly(item.getWtPly());
|
||||
wrapper.setComplete(item.isComplete());
|
||||
wrapper.setPoName(jobCard.getPurchaseOrderId());
|
||||
wrapper.setCuttingOperatorName(bundle.getCreatedBy());
|
||||
wrapper.setOperatorName(bundle.getCreatedBy());
|
||||
wrapper.setJobCardId(item.getJobCardId());
|
||||
wrapper.setLength(item.getLength());
|
||||
wrapper.setCuttingAccountId(accountId);
|
||||
wrapper.setAccountId(accountId);
|
||||
return wrapper;
|
||||
}).collect(Collectors.toList());
|
||||
|
||||
|
@ -691,6 +691,129 @@ public class ReportingService {
|
|||
return cuttingDetails;
|
||||
}
|
||||
|
||||
public Map<String, Object> getStitchingDetails(String jobCardId, String stitchingLine, String startDate, String endDate) {
|
||||
Map<String, Object> stitchingDetails = new HashMap<>();
|
||||
long jobCardIdTemp = 0L;
|
||||
String startDate1 = null;
|
||||
String endDate1 = null;
|
||||
|
||||
if (!StringUtils.isNullOrEmpty(startDate)) {
|
||||
String formattedStart = CTPDateTimeFormat.getMySQLFormattedDateString(startDate, CTPDateTimeFormat.HTML5_DATE_INPUT_FORMAT);
|
||||
String formattedEnd = !StringUtils.isNullOrEmpty(endDate)
|
||||
? CTPDateTimeFormat.getMySQLFormattedDateString(endDate, CTPDateTimeFormat.HTML5_DATE_INPUT_FORMAT)
|
||||
: LocalDate.now().toString();
|
||||
|
||||
startDate1 = String.format("'%s 00:00:01'", formattedStart);
|
||||
endDate1 = String.format("'%s 23:59:59'", formattedEnd);
|
||||
}
|
||||
|
||||
List<InventoryAccount> inventoryAccounts = inventoryAccountDAO.findByParentEntityTypeAndParentId("PROCESS", 2L);
|
||||
List<Long> inventoryAccountIds = inventoryAccounts.stream().map(InventoryAccount::getId).collect(Collectors.toList());
|
||||
|
||||
if (!StringUtils.isNullOrEmpty(jobCardId)) {
|
||||
jobCardIdTemp = Long.parseLong(jobCardId);
|
||||
} else if (!StringUtils.isNullOrEmpty(stitchingLine)) {
|
||||
inventoryAccountIds = List.of(Long.parseLong(stitchingLine));
|
||||
}
|
||||
|
||||
String query = SummaryInventoryReportQueryBuilder.cuttingQueryBuild(jobCardIdTemp, inventoryAccountIds,null, startDate1, endDate1, "IN","STITCHING_OFFLINE");
|
||||
List<InventoryTransactionLeg> inventoryTransactionLegs = inventoryTransactionLegDAO.findByQuery(query);
|
||||
|
||||
Map<String, Integer> dateWiseProduction = new TreeMap<>();
|
||||
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy");
|
||||
|
||||
Map<LocalDate, List<Long>> dateWiseJobCardIds = inventoryTransactionLegs.stream()
|
||||
.filter(e -> e.getTransactionLegDateTime() != null && e.getJobCardId() != 0)
|
||||
.collect(Collectors.groupingBy(
|
||||
e -> e.getTransactionLegDateTime().toLocalDate(),
|
||||
Collectors.mapping(InventoryTransactionLeg::getJobCardId, Collectors.toList())
|
||||
));
|
||||
|
||||
for (Map.Entry<LocalDate, List<Long>> entry : dateWiseJobCardIds.entrySet()) {
|
||||
LocalDate date = entry.getKey();
|
||||
List<Long> jobCardIds = entry.getValue();
|
||||
|
||||
if (!jobCardIds.isEmpty()) {
|
||||
int totalProduction = inventoryTransactionLegs.stream()
|
||||
.filter(item -> jobCardIds.contains(item.getJobCardId()) &&
|
||||
"STITCHING_OFFLINE".equals(item.getParentDocumentType()) && item.getTransactionLegDateTime().toLocalDate().equals(date))
|
||||
.mapToInt(item -> item.getQuantity().intValue())
|
||||
.sum();
|
||||
|
||||
dateWiseProduction.put(date.format(formatter), totalProduction);
|
||||
}
|
||||
}
|
||||
|
||||
List<Long> distinctJobCardIds = inventoryTransactionLegs.stream()
|
||||
.map(InventoryTransactionLeg::getJobCardId)
|
||||
.filter(id -> id != 0)
|
||||
.distinct()
|
||||
.collect(Collectors.toList());
|
||||
|
||||
Map<Long, List<CuttingJobCardItemWrapper>> jobCardItemsStitchingDetailsMap = new HashMap<>();
|
||||
Map<String, Integer> totalStitchingBasedOnAccountID = new HashMap<>();
|
||||
|
||||
for (long jobCardIdEntry : distinctJobCardIds) {
|
||||
Long accountId = inventoryTransactionLegs.stream()
|
||||
.filter(e -> e.getJobCardId() == jobCardIdEntry)
|
||||
.map(e -> e.getAccountId().longValue())
|
||||
.findFirst()
|
||||
.orElse(0L);
|
||||
|
||||
JobCard jobCard = jobCardDAO.find(jobCardIdEntry);
|
||||
List<StitchingOfflineItem> stitchingOfflineItem = stitchingOfflineItemDAO.findByJobCardId(jobCardIdEntry);
|
||||
|
||||
List<JobCardItem> jobCardItems = jobCardItemDAO.findByCardId(jobCardIdEntry);
|
||||
|
||||
List<CuttingJobCardItemWrapper> wrappers = jobCardItems.stream().map(item -> {
|
||||
CuttingJobCardItemWrapper wrapper = new CuttingJobCardItemWrapper();
|
||||
wrapper.setArticleName(jobCard.getArticleName());
|
||||
wrapper.setJobCardId(jobCard.getId());
|
||||
wrapper.setJobCardCode(jobCard.getCode());
|
||||
wrapper.setSku(item.getSku());
|
||||
wrapper.setPoName(jobCard.getPurchaseOrderId());
|
||||
wrapper.setJobCardId(item.getJobCardId());
|
||||
wrapper.setOperatorName(stitchingOfflineItem.get(0).getCreatedBy());
|
||||
wrapper.setAccountId(accountId);
|
||||
return wrapper;
|
||||
|
||||
}).collect(Collectors.toList());
|
||||
totalStitchingBasedOnAccountID.put(jobCard.getId()+stitchingOfflineItem.get(0).getSku(), stitchingOfflineItem.size());
|
||||
jobCardItemsStitchingDetailsMap.computeIfAbsent(accountId, k -> new ArrayList<>()).addAll(wrappers);
|
||||
}
|
||||
|
||||
stitchingDetails.put("totalStitchingBasedOnAccountID", totalStitchingBasedOnAccountID);
|
||||
stitchingDetails.put("jobCardItemsStitchingDetailsMap", jobCardItemsStitchingDetailsMap);
|
||||
stitchingDetails.put("Date Wise Stitching", dateWiseProduction);
|
||||
|
||||
stitchingDetails.put("stitchingAccount", inventoryAccounts);
|
||||
return stitchingDetails;
|
||||
}
|
||||
|
||||
public List<StitchingOfflineItem> stitchingItemsTransactions(String jobCardId, String accountId, String sku, String startDate, String endDate) {
|
||||
List<Long> accountID = new ArrayList<>();
|
||||
String startDate1 = null;
|
||||
String endDate1 = null;
|
||||
|
||||
if (!StringUtils.isNullOrEmpty(startDate) && !StringUtils.isNullOrEmpty(accountId) && !StringUtils.isNullOrEmpty(jobCardId)) {
|
||||
String formattedStart = CTPDateTimeFormat.getMySQLFormattedDateString(startDate, CTPDateTimeFormat.HTML5_DATE_INPUT_FORMAT);
|
||||
String formattedEnd = !StringUtils.isNullOrEmpty(endDate)
|
||||
? CTPDateTimeFormat.getMySQLFormattedDateString(endDate, CTPDateTimeFormat.HTML5_DATE_INPUT_FORMAT)
|
||||
: LocalDate.now().toString();
|
||||
|
||||
startDate1 = String.format("'%s 00:00:01'", formattedStart);
|
||||
endDate1 = String.format("'%s 23:59:59'", formattedEnd);
|
||||
accountID.add(Long.parseLong(accountId));
|
||||
}
|
||||
|
||||
|
||||
String query = SummaryInventoryReportQueryBuilder.cuttingQueryBuild(Long.parseLong(jobCardId), accountID, sku, startDate1, endDate1,"IN","STITCHING_OFFLINE");
|
||||
List<InventoryTransactionLeg> inventoryTransactionLegs = inventoryTransactionLegDAO.findByQuery(query);
|
||||
List<Long> stitchingItemsList = inventoryTransactionLegs.stream()
|
||||
.map(InventoryTransactionLeg::getParentDocumentId)
|
||||
.collect(Collectors.toList());
|
||||
return stitchingOfflineItemDAO.findByIds(stitchingItemsList);
|
||||
}
|
||||
|
||||
private StringBuilder generateTime(LocalDateTime startDate, LocalDateTime endDate){
|
||||
StringBuilder totalTime = new StringBuilder();
|
||||
|
|
|
@ -137,65 +137,69 @@ document.addEventListener("DOMContentLoaded", function () {
|
|||
});
|
||||
}
|
||||
|
||||
function createSingleBarChart(divId, height, width, title,Heading, Data, dates, fontSize, maxValue) {
|
||||
if (!document.getElementById(divId)) {
|
||||
return;
|
||||
}
|
||||
Highcharts.chart(divId, {
|
||||
chart: {
|
||||
type: 'column',
|
||||
height: height,
|
||||
width: width,
|
||||
},
|
||||
title: {
|
||||
text: title,
|
||||
align: 'center',
|
||||
verticalAlign: 'top',
|
||||
y: 30,
|
||||
style: {
|
||||
fontSize: fontSize,
|
||||
fontWeight: 'bold',
|
||||
}
|
||||
},
|
||||
xAxis: {
|
||||
categories: dates,
|
||||
labels: {
|
||||
rotation: -45,
|
||||
style: {
|
||||
fontSize: 10-fontSize,
|
||||
fontWeight: 'bold'
|
||||
}
|
||||
}
|
||||
},
|
||||
yAxis: {
|
||||
min: 0,
|
||||
max: maxValue,
|
||||
softMax: maxValue,
|
||||
softMin: 0,
|
||||
startOnTick: true,
|
||||
endOnTick: true,
|
||||
title: {
|
||||
text: 'Total Progress',
|
||||
style: {
|
||||
fontSize: fontSize,
|
||||
fontWeight: 'bold',
|
||||
}
|
||||
},
|
||||
labels: {
|
||||
format: '{value}%'
|
||||
}
|
||||
},
|
||||
|
||||
scrollbar: {
|
||||
enabled: true
|
||||
},
|
||||
series: [{
|
||||
name: Heading,
|
||||
data: Data
|
||||
}]
|
||||
});
|
||||
}
|
||||
|
||||
function createSingleBarChart(divId, height, width, title,Heading, Data, dates, fontSize, maxValue) {
|
||||
if (!document.getElementById(divId)) {
|
||||
return;
|
||||
}
|
||||
Highcharts.chart(divId, {
|
||||
chart: {
|
||||
type: 'column',
|
||||
height: height,
|
||||
width: width,
|
||||
},
|
||||
title: {
|
||||
text: title,
|
||||
align: 'center',
|
||||
verticalAlign: 'top',
|
||||
y: 30,
|
||||
style: {
|
||||
fontSize: fontSize,
|
||||
fontWeight: 'bold',
|
||||
}
|
||||
},
|
||||
xAxis: {
|
||||
categories: dates,
|
||||
labels: {
|
||||
rotation: -45,
|
||||
style: {
|
||||
fontSize: 10-fontSize,
|
||||
fontWeight: 'bold'
|
||||
}
|
||||
}
|
||||
},
|
||||
yAxis: {
|
||||
min: 0,
|
||||
max: maxValue,
|
||||
softMax: maxValue,
|
||||
softMin: 0,
|
||||
startOnTick: true,
|
||||
endOnTick: true,
|
||||
title: {
|
||||
text: 'Total Progress',
|
||||
style: {
|
||||
fontSize: fontSize,
|
||||
fontWeight: 'bold',
|
||||
}
|
||||
},
|
||||
labels: {
|
||||
format: '{value}%'
|
||||
}
|
||||
},
|
||||
legend: {
|
||||
itemStyle: {
|
||||
fontSize: 10-fontSize,
|
||||
fontWeight: 'bold'
|
||||
}
|
||||
},
|
||||
scrollbar: {
|
||||
enabled: true
|
||||
},
|
||||
series: [{
|
||||
name: Heading,
|
||||
data: Data
|
||||
}]
|
||||
});
|
||||
}
|
||||
|
||||
initializeGauges();
|
||||
function initializeGauges() {
|
||||
|
@ -256,7 +260,7 @@ document.addEventListener("DOMContentLoaded", function () {
|
|||
createBarChart( divId, height, width, title, aHeading, aData, bHeading, bData, cHeading, cData, dHeading, dData, datesArray, fontSize, maxValue);
|
||||
});
|
||||
|
||||
const cuttingBarChart = document.querySelectorAll('.cuttingBarChart');
|
||||
const cuttingBarChart = document.querySelectorAll('.singleBarChart');
|
||||
cuttingBarChart.forEach(function (div) {
|
||||
const title = div.getAttribute('data-title');
|
||||
const height = div.getAttribute('data-height');
|
||||
|
|
|
@ -144,6 +144,10 @@
|
|||
th:classappend="${#strings.startsWith(#httpServletRequest.getRequestURI(), '/ctp/reporting/cutting-report') ? 'active' : ''}">
|
||||
<a th:href="@{/reporting/cutting-report}" class="nav-link">Cutting Tables Report</a>
|
||||
</li>
|
||||
<li class="nav-item"
|
||||
th:classappend="${#strings.startsWith(#httpServletRequest.getRequestURI(), '/ctp/reporting/stitching-report') ? 'active' : ''}">
|
||||
<a th:href="@{/reporting/stitching-report}" class="nav-link">Stitching Line Report</a>
|
||||
</li>
|
||||
<li class="nav-item"
|
||||
th:classappend="${#strings.startsWith(#httpServletRequest.getRequestURI(), '/ctp/reporting/summary') ? 'active' : ''}">
|
||||
<a th:href="@{/reporting/summary}" class="nav-link">Summary</a>
|
||||
|
|
|
@ -0,0 +1,113 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Title</title>
|
||||
<style>
|
||||
/* Custom CSS for full height and center alignment of span */
|
||||
.vertical-divider {
|
||||
display: flex;
|
||||
justify-content: center; /* Center horizontally */
|
||||
align-items: center; /* Center vertically */
|
||||
}
|
||||
|
||||
.vertical-divider span {
|
||||
display: inline-block;
|
||||
width: 1px;
|
||||
background-color: #dee2e6;
|
||||
height: 100%; /* Take full height of the parent div */
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-sm-12">
|
||||
<table th:if="${#lists.size(transactions) != 0 && #lists != null }" class="table table-bordered font-sm mb-4" data-account-tables>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>ID</th>
|
||||
<th>Item ID</th>
|
||||
<th>SKU</th>
|
||||
<th>QR Code</th>
|
||||
<th>Created By</th>
|
||||
<th>Created At</th>
|
||||
<th>Bundle Id</th>
|
||||
<th>QA Status</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr th:each="transaction : ${transactions}" th:object="${transaction}">
|
||||
<td th:text="*{id}"></td>
|
||||
<td th:text="*{itemId}"></td>
|
||||
<td th:text="*{sku}"></td>
|
||||
<td th:text="*{barcode}"></td>
|
||||
<td th:text="*{createdBy}"></td>
|
||||
<td th:text="*{createdAt}"></td>
|
||||
<td th:text="*{bundleId}"></td>
|
||||
<td>
|
||||
<span th:if="*{ not isQa}" class="badge badge-danger">NOT PERFORMED</span>
|
||||
<div th:if="*{isQa}">
|
||||
<span class="badge badge-APPROVED">PERFORMED</span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<!-- More rows as needed -->
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<h5 th:if="${#lists.size(transactions) == 0}" class="mt-2">No Inventory Transactions found.</h5>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div th:replace="_fragments :: page-footer-scripts"></div>
|
||||
<script th:inline="javascript">
|
||||
|
||||
// Initialize DataTables for each individual table
|
||||
$('table[data-account-tables]').each(function () {
|
||||
const $table = $(this);
|
||||
|
||||
// Prevent reinitializing if already done
|
||||
if (!$.fn.DataTable.isDataTable($table)) {
|
||||
$table.DataTable({
|
||||
pageLength: 5,
|
||||
searching: true,
|
||||
lengthChange: false,
|
||||
processing: false,
|
||||
dom: `
|
||||
<'row'<'col-sm-5'B><'col-sm-7'f>>
|
||||
<'row'<'col-sm-12't>>
|
||||
<'row'<'col-sm-5'i><'col-sm-7'p>>`,
|
||||
buttons: [{
|
||||
extend: 'excel',
|
||||
text: '',
|
||||
className: 'bi bi-file-earmark-spreadsheet btn-sm d-none' // Keep it hidden
|
||||
}]
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
(async function () {
|
||||
const $selectAllCheckBox = $('[data-checkbox-all]');
|
||||
|
||||
$selectAllCheckBox.change(function () {
|
||||
if ($selectAllCheckBox.prop('checked')) {
|
||||
// When parent checkbox is checked, check all child checkboxes
|
||||
$('[name="parent-doc-type-ids"]').each(function () {
|
||||
let $this = $(this);
|
||||
$this.prop('checked', true);
|
||||
});
|
||||
} else {
|
||||
// When parent checkbox is unchecked, uncheck all child checkboxes
|
||||
$('[name="parent-doc-type-ids"]').each(function () {
|
||||
let $this = $(this);
|
||||
$this.prop('checked', false);
|
||||
});
|
||||
}
|
||||
});
|
||||
})(jQuery)
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
|
@ -22,7 +22,7 @@
|
|||
<input type="date" class="form-control" name="end-date" th:value="${param['end-date'] ?: endDate}">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label>Cutting Account</label>
|
||||
<label>Select Account</label>
|
||||
<select class="form-control" name="accountId">
|
||||
<option value="">Please Select</option>
|
||||
<option th:each="account : ${accounts}"
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
<tr>
|
||||
<td th:if="${cutting.get('Date Wise Cutting') != null}" style="padding-left: 150px;">
|
||||
<div style="border: 2px solid #d5d8dc; padding-top: 10px; border-radius: 10px; height: 560px; width: 80%; overflow-x: auto;">
|
||||
<div id="cuttingBarChart" class="cuttingBarChart" style="height: 500px; width: 1600px;"
|
||||
<div id="singleBarChart" class="singleBarChart" style="height: 500px; width: 1600px;"
|
||||
th:data-width="1600"
|
||||
th:data-height="500"
|
||||
th:data-title="'Days Wise Progress'"
|
||||
|
@ -57,8 +57,8 @@
|
|||
<td th:text="${wrap.poName}"></td>
|
||||
<td th:text="${wrap.sku}"></td>
|
||||
<td th:text="${wrap.articleName}"></td>
|
||||
<td th:text="${wrap.totalCutting}"></td>
|
||||
<td th:text="${wrap.cuttingOperatorName}"></td>
|
||||
<td th:text="${wrap.total}"></td>
|
||||
<td th:text="${wrap.operatorName}"></td>
|
||||
<td th:text="${wrap.width}"></td>
|
||||
<td th:text="${wrap.length}"></td>
|
||||
<td th:text="${wrap.gsm}"></td>
|
||||
|
|
|
@ -0,0 +1,132 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en" xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.w3.org/1999/xhtml"
|
||||
xmlns:ctp="http://www.w3.org/1999/xhtml">
|
||||
|
||||
<head th:replace="_fragments :: head('Stitching Report')"></head>
|
||||
|
||||
<body>
|
||||
<div class="container-fluid">
|
||||
<header class="row page-header" th:replace="_fragments :: page-header"></header>
|
||||
<main class="row page-main">
|
||||
<aside class="col-sm-2" th:replace="/reporting/cutting-report-sidebar :: sidebar"></aside>
|
||||
<div class="col-lg-10">
|
||||
<div th:if="${stitching.get('Date Wise Stitching') != null}" style="padding-left: 150px;">
|
||||
<div style="border: 2px solid #d5d8dc; padding-top: 10px; border-radius: 10px; height: 560px; width: 80%; overflow-x: auto;">
|
||||
<div id="singleBarChart" class="singleBarChart" style="height: 500px; width: 1600px;"
|
||||
th:data-width="1600"
|
||||
th:data-height="500"
|
||||
th:data-title="'Days Wise Progress'"
|
||||
th:data-dates="${stitching.get('Date Wise Stitching').keySet()}"
|
||||
th:data-barData="${stitching.get('Date Wise Stitching').values()}"
|
||||
th:data-barHeading="'Stitching'"
|
||||
th:data-stitching="''"
|
||||
th:data-quality="''"
|
||||
th:data-finishing="''"
|
||||
th:data-totalProduction="'500'"
|
||||
th:data-fontSize="30"
|
||||
></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mt-3" th:if="${stitching.get('stitchingAccount') != null && stitching.get('jobCardItemsStitchingDetailsMap').get(stitchingAccount.id) != null}"
|
||||
th:each="stitchingAccount, index : ${stitching.get('stitchingAccount')}">
|
||||
<div class="bg-dark text-white py-2 px-3 fs-5 fw-bold text-center mb-2"
|
||||
th:text="${stitchingAccount.title}"></div>
|
||||
|
||||
<table class="table table-striped " data-account-table th:data-account-id="${stitchingAccount.id}">
|
||||
<thead>
|
||||
<tr>
|
||||
<th></th>
|
||||
<th>Job Card</th>
|
||||
<th>PO Number</th>
|
||||
<th>SKU</th>
|
||||
<th>Article Name</th>
|
||||
<th>Stitching Operator Name</th>
|
||||
<th>Total Stitching</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr th:each="wrap, index : ${stitching.get('jobCardItemsStitchingDetailsMap').get(stitchingAccount.id)}">
|
||||
<td data-show-dropdown-transactions
|
||||
th:data-account-id="${stitchingAccount.id}"
|
||||
th:data-jobcardid="${wrap.jobCardId}"
|
||||
th:data-sku="${wrap.sku}"
|
||||
th:data-start-date="${param['start-date'] ?: startDate}"
|
||||
th:data-end-date="${param['end-date'] ?: endDate}"
|
||||
title="Transactions">
|
||||
<span data-dropdown-icon-transactions class="bi bi-caret-right-fill"></span>
|
||||
</td>
|
||||
<td th:text="${wrap.jobCardCode}"></td>
|
||||
<td th:text="${wrap.poName}"></td>
|
||||
<td th:text="${wrap.sku}"></td>
|
||||
<td th:text="${wrap.articleName}"></td>
|
||||
<td th:text="${wrap.operatorName}"></td>
|
||||
<td th:text="${stitching.get('totalStitchingBasedOnAccountID').get(wrap.jobCardId+wrap.sku)}"></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
</div>
|
||||
<script>
|
||||
const $body = $('body');
|
||||
|
||||
// Initialize DataTables for each individual table
|
||||
$('table[data-account-table]').each(function () {
|
||||
$(this).DataTable({
|
||||
paging: false,
|
||||
pageLength: 100,
|
||||
searching: false,
|
||||
lengthChange: false,
|
||||
processing: false,
|
||||
dom: `
|
||||
<'row'<'col-sm-5'B><'col-sm-7'f>>
|
||||
<'row'<'col-sm-12't>>
|
||||
<'row'<'col-sm-5'i><'col-sm-7'p>>`,
|
||||
buttons: [{
|
||||
extend: 'excel',
|
||||
text: '',
|
||||
className: 'bi bi-file-earmark-spreadsheet btn-sm d-none'
|
||||
}]
|
||||
});
|
||||
});
|
||||
|
||||
// Dropdown transactions toggle
|
||||
$body.on('click', '[data-show-dropdown-transactions]', function (e) {
|
||||
e.preventDefault();
|
||||
|
||||
const $this = $(this);
|
||||
const $tr = $this.closest('tr');
|
||||
const $table = $this.closest('table');
|
||||
const dataTable = $table.DataTable();
|
||||
const $row = dataTable.row($tr);
|
||||
const $spanDropdown = $this.find('[data-dropdown-icon-transactions]');
|
||||
const accountId = $this.data('account-id');
|
||||
const jobCardId = $this.data('jobcardid');
|
||||
const sku = $this.data('sku');
|
||||
const startDate = $this.data('start-date');
|
||||
const endDate = $this.data('end-date');
|
||||
|
||||
$spanDropdown.toggleClass('bi-caret-right-fill bi-caret-down-fill');
|
||||
|
||||
if ($row.child.isShown()) {
|
||||
$row.child.hide();
|
||||
} else {
|
||||
$row.child(`<span class="spinner-border text-center spinner-border-md" role="status"></span>`).show();
|
||||
|
||||
$.ajax({
|
||||
url: `/ctp/reporting/inventory-transactions?account-id=${accountId}&jobCard-id=${jobCardId}&sku=${sku}&startDate=${startDate}&endDate=${endDate}`,
|
||||
success: function (data) {
|
||||
$row.child(data).show();
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<!-- Load JavaScript file -->
|
||||
<script th:src="@{/js/charts.js}"></script>
|
||||
|
||||
</body>
|
||||
</html>
|
Loading…
Reference in New Issue