Műhelymunka számítása a főképernyőn

This commit is contained in:
Vincze József 2025-02-06 07:04:01 +01:00
parent 1e3988c09d
commit 79b54d6fb9
5 changed files with 380 additions and 84 deletions

398
app.js
View File

@ -25,6 +25,7 @@ var PdfPrinter=require('pdfmake');
//var currentWorkNumber=0; //var currentWorkNumber=0;
const { XMLParser, XMLBuilder, XMLValidator} = require("fast-xml-parser/src/fxp"); const { XMLParser, XMLBuilder, XMLValidator} = require("fast-xml-parser/src/fxp");
const { apiSaveReport, apiGetReport, apiGetReportList, apiGetUsers, apiGetReportDates, apiUpdateReport } = require('./js/workReport.js'); const { apiSaveReport, apiGetReport, apiGetReportList, apiGetUsers, apiGetReportDates, apiUpdateReport } = require('./js/workReport.js');
let WorkReport = require('./models/workReportModel');
moment.locale('HU'); moment.locale('HU');
const fss = require('fs'); const fss = require('fs');
global.currentWorkNumber=0; global.currentWorkNumber=0;
@ -549,7 +550,7 @@ app.post('/apiPostDailyReport/:apiKey',function(req,res){
// Munka lista lekérése és szűrése AJAX CALL // Munka lista lekérése és szűrése AJAX CALL
app.get('/filter', utils.ensureAuthenticated, function(req, res) { app.get('/filter', utils.ensureAuthenticated, async function(req, res) {
//console.log(req.query.year.value); //console.log(req.query.year.value);
var query={ var query={
@ -569,20 +570,60 @@ app.get('/filter', utils.ensureAuthenticated, function(req, res) {
] ]
}; };
Work.find(query,null,{sort: {workNumber: -1}} ,function(err, works){ var works=await Work.find(query,null,{sort: {workNumber: -1}})// ,function(err, works){
if (err) if (!works)
{ {
console.log('ERR:'+err); console.log('ERR:'+err);
} }
else {
var workrReportCount= await WorkReport.aggregate(
[
{$unwind: '$workFlow'},
{"$project":
{
"_id":"$workFlow._id",
"wid":"$workId",
"el":"$workFlow.employeeList",
"count": {$size:"$workFlow.employeeList"},
}
},
{
$group: {
_id: '$wid',
'workName': {$push:'$count'}
}
},{
$project: {
total: {
$reduce: {
input: "$workName",
initialValue: 0,
in: { $add: ["$$value", "$$this"] }
}
}
}
}
]
)
// Server side table generation // Server side table generation
var drCount=''; var drCount='';
var wrCount='';
var tr=''; var tr='';
works.forEach((work,index,array) =>{ works.forEach((work,index,array) =>{
var dr=work.dailyReport; var dr=work.dailyReport;
var wc=0; var wc=0;
var etemp="<td></td>"; var etemp="<td></td>";
var wrc=findById(workrReportCount,work._id)
if (wrc)
{
work.wrc=wrc.total*8
}
else
{
work.wrc=0;
}
dr.forEach((el,index,arr)=>{ dr.forEach((el,index,arr)=>{
wc+=el.employeeList.length; wc+=el.employeeList.length;
}); });
@ -595,9 +636,9 @@ app.get('/filter', utils.ensureAuthenticated, function(req, res) {
if (work.poNumber!=undefined) if (work.poNumber!=undefined)
po=work.poNumber; po=work.poNumber;
if (work.state==='Opened') if (work.state==='Opened')
state="Folyamatban"; state='<td style="text-align:center;vertical-align:middle; color:green"><i class="fa fa-unlock"></i></td>';
else else
state="Lezárva"; state='<td style="text-align:center;vertical-align:middle; color:red"><i class="fa fa-lock"></i></td>'
if (work.enaploTemplate) if (work.enaploTemplate)
{ {
etemp='<td><img src="enaplo.png" alt="" height=16 width=16 style="text-align:center;vertical-align: middle;data-original-title="Enapló köteles";data-toggle="tooltip";data-placement="bottom"; data-container="body"></img>'; etemp='<td><img src="enaplo.png" alt="" height=16 width=16 style="text-align:center;vertical-align: middle;data-original-title="Enapló köteles";data-toggle="tooltip";data-placement="bottom"; data-container="body"></img>';
@ -606,22 +647,28 @@ app.get('/filter', utils.ensureAuthenticated, function(req, res) {
drCount= '<td style="text-align:right"><span class="badge badge-success">' + work.wc+'</td>'; drCount= '<td style="text-align:right"><span class="badge badge-success">' + work.wc+'</td>';
else else
drCount='<td style="text-align:right;vertical-align:middle"><span class="badge">' + work.wc+'</td>'; drCount='<td style="text-align:right;vertical-align:middle"><span class="badge">' + work.wc+'</td>';
if (work.wrc>0)
wrCount= '<td style="text-align:right"><span class="badge" style="background-color: DodgerBlue !important">' + work.wrc+'</td>';
else
wrCount='<td style="text-align:right;vertical-align:middle"><span class="badge">' + work.wrc+'</td>';
tr+='<tr><td>'+(index+1)+'</td>'+ tr+='<tr><td>'+(index+1)+'</td>'+
etemp+ etemp+
//img(src='enaplo.png', width='16px', height='16px',style='text-align:center;vertical-align: middle',data-original-title='Enapló köteles' data-toggle='tooltip' data-placement='bottom' data-container='body')</td>'+ //img(src='enaplo.png', width='16px', height='16px',style='text-align:center;vertical-align: middle',data-original-title='Enapló köteles' data-toggle='tooltip' data-placement='bottom' data-container='body')</td>'+
'<td style="text-align:left; vertical-align:middle;font-size: 9px;font-weight: bold;">' +megrendelo+'</td>'+ '<td style="text-align:left; vertical-align:middle;font-size: 9px;font-weight: bold;">' +megrendelo+'</td>'+
'<td style="vertical-align:middle"><a href="/work/'+work._id+'">'+ work.title+'</a></td>'+ '<td style="vertical-align:middle"><a href="/work/'+work._id+'">'+ work.title+'</a></td>'+
'<td style="text-align:center;vertical-align:middle">' + work.workDate + '</td>'+ '<td style="text-align:center;vertical-align:middle">' + moment(work.workDate).format('YYYY.MM.DD') + '</td>'+
'<td style="text-align:center;vertical-align:middle">' + state+'</td>'+ state+
'<td style="text-align:left;vertical-align:middle">' + work.workNumber+'</td>'+ '<td style="text-align:left;vertical-align:middle">' + work.workNumber+'</td>'+
drCount+ drCount+
wrCount+
'<td style="text-align:center;vertical-align:middle">' + po+'</td>'+ '<td style="text-align:center;vertical-align:middle">' + po+'</td>'+
'<td style="text-align:left;vertical-align:middle"><span class="badge">' + work.devicesArray.length+'</td>' '<td style="text-align:left;vertical-align:middle"><span class="badge">' + work.devicesArray.length+'</td>'
}); });
res.send(tr); res.send(tr);
} // }
}); //});
}); });
var charToByte = exports.charToByte = function charToByte(c) { var charToByte = exports.charToByte = function charToByte(c) {
@ -748,8 +795,16 @@ app.get('/work/generateXML/:wid/:drid',utils.ensureAuthenticated,function(req,re
// var data={result:'HAHA'}; // var data={result:'HAHA'};
// res.send(data); // res.send(data);
}); });
function findById(array, id) {
return array.find(item => {
const a=String(item._id)
const b=String(id)
//if (a===b)console.log(`IDS A: ${a} B: ${b}`)
return a===b;});
}
// Works Route // Works Route
app.get('/', utils.ensureAuthenticated, function(req, res) { app.get('/', utils.ensureAuthenticated,async function(req, res) {
var admin=false; var admin=false;
//var ver=gitVersion(); //var ver=gitVersion();
@ -760,78 +815,60 @@ app.get('/', utils.ensureAuthenticated, function(req, res) {
return; return;
} }
/* A munkában reésztvevők számítása
db.getCollection('dailyreports').aggregate([
{$match:{"workId" : ObjectId("61a9c4bee9b30661f1883c19")}},
{$unwind: '$dailyReport'},
{$unwind: '$dailyReport.employeeList'},
{ $group: {_id: '$dailyReport._id', list: {$push: '$dailyReport.employeeList'},'date': {$first: '$dailyReport.date'},'title': {$first: '$dailyReport.workTitle'}}},
{$project: { var works=await Work.find({},null,{sort: {workNumber: -1}})// ,function(err, works){
item: 1, if (!works)
numberOfColors: { $cond: { if: { $isArray: "$list" }, then: { $size: "$list" }, else: "NA"} }
}},
{$group: {_id: null, total_sum: {'$sum': '$numberOfColors'}}},
*/
// var worksRender=[];
Work.find({},null,{sort: {workNumber: -1}} ,function(err, works){
if (err)
{ {
console.log(err); console.log(err);
} }
else { // else {
// ---------------------------------- var workrReportCount= await WorkReport.aggregate(
/* var bar2 = new Promise((resolve, reject) => { [
works.forEach((element,index,array) =>{ {$unwind: '$workFlow'},
{"$project":
//if (element.dailyReportId){
DailyReport.aggregate([
{$match:{'_id' : element.dailyReportId}},
{$unwind: '$dailyReport'},
{$unwind: '$dailyReport.employeeList'},
{ $group: {_id: '$dailyReport._id', list: {$push: '$dailyReport.employeeList'},'date': {$first: '$dailyReport.date'},'title': {$first: '$dailyReport.workTitle'}}},
{$project: {
item: 1,
numberOfColors: { $cond: { if: { $isArray: "$list" }, then: { $size: "$list" }, else: "NA"} }
}},
{$group: {_id: null, total_sum: {'$sum': '$numberOfColors'}}},
]).exec((err,results)=>{
if (results.length>0)
{ {
//JSON(element). "_id":"$workFlow._id",
element.totalSum=4;//results[0].total_sum; "wid":"$workId",
// worksRender.push(element); "el":"$workFlow.employeeList",
console.log('TS: '+results[0].total_sum); "count": {$size:"$workFlow.employeeList"},
if (index === array.length -1) resolve(); }
},
{
$group: {
_id: '$wid',
'workName': {$push:'$count'}
}
},{
$project: {
total: {
$reduce: {
input: "$workName",
initialValue: 0,
in: { $add: ["$$value", "$$this"] }
}
}
}
} }
});
//}
// else
// {
// element.totalSum=4;//results[0].total_sum;
// worksRender.push(element);
// if (index === array.length -1) resolve(); ]
// } )
}); // forEach
});// Promise
*/
works.forEach((element,index,array) =>{ works.forEach((element,index,array) =>{
var dr=element.dailyReport; var dr=element.dailyReport;
var wrc=findById(workrReportCount,element._id)
var wc=0; var wc=0;
dr.forEach((el,index,arr)=>{ dr.forEach((el,index,arr)=>{
wc+=el.employeeList.length; wc+=el.employeeList.length;
}); });
element.wc=wc*8; element.wc=wc*8;
if (wrc)
{
element.wrc=wrc.total*8
}
else
{
element.wrc=0;
}
}); });
//--------------------------------- //---------------------------------
res.render('index', { res.render('index', {
@ -839,9 +876,9 @@ app.get('/', utils.ensureAuthenticated, function(req, res) {
works: works, works: works,
rot: req.user.isAdmin, rot: req.user.isAdmin,
}); });
} //else // } //else
}); });
}); //});
// Works Route // Works Route
@ -1295,8 +1332,6 @@ app.get('/print_report/:id',utils.ensureAuthenticated,function(req,res){
}); });
}); });
// Napi jelentés Nyomtatási kép generálás // Napi jelentés Nyomtatási kép generálás
function printWork(id,callback) function printWork(id,callback)
{ {
@ -1704,6 +1739,224 @@ function printWork(id,callback)
}
// Napi műhely jelentések nyomtatása
// Get Single Work
app.get('/print_workreport/:id',utils.ensureAuthenticated,async function(req,res){
var PdfPrinter=require('pdfmake');
res.setHeader('Content-Type', 'application/json');
try{
var wtSum=0;
const reports=await WorkReport.find({workId: mongoose.Types.ObjectId(req.params.id)})
const workHeader=await Work.findOne({"_id":mongoose.Types.ObjectId(req.params.id)},{poNumber:1,workNumber:1,megrendelo:1})
const workTimesSum=await WorkReport.aggregate(
[
{ $match: { 'workId': mongoose.Types.ObjectId(req.params.id)} },
{$unwind: '$workFlow'},
{$unwind: '$workFlow.employeeList'},
{$group: {_id: '$workFlow.EmployeeList', count:{$sum:1}}},
{ "$limit": 1 },
{"$project": {"_id":0,
"count": 1,}
}
]
)
if (workTimesSum.length>0) wtSum=workTimesSum[0].count*8
var data=await printWorkReport(reports,workHeader)
console.log(JSON.stringify(data));
// fss.writeFile(path.normalize('d:\\test.json'), JSON.stringify(data));
res.send(data);
//res.send({'response':'ok','reports':reports, 'workTimesSum':wtSum});
}catch(err){
res.status(500).json({'response':'fail','message':'Hiba a mentésnél !\n'+err.message});
}
})
// Műhely Napi jelentés Nyomtatási kép generálás
async function printWorkReport(reports, workHeader)
{
var item=[];
var wName=workHeader;
var i=0;
moment.locale('hu');
item.push([ {text:'#', alignment: 'left'},{text:'Dátum', alignment: 'center'}, {text:'Munkafolyamat', alignment: 'center'}, {text:'Résztvevők', alignment: 'center'}]);
wName=reports[0].workTitle;
reports.forEach((report,index)=>{
report.workFlow.forEach((wf,idx)=>{
var emps="";
wf.employeeList.forEach((employee,ind)=>{
emps=emps+employee.name+'\r\n';
i++;
})
item.push([
{id:i,text: index+1, style:'tableData',rowSpan: report.workFlow.length},
{text: moment(report.date).format('YYYY.MM.DD'), style:'tableData', alignment: 'center',rowSpan: report.workFlow.length},
{text: wf.Title, style:'tableData', alignment: 'center'},
{text: emps, style:'tableData', alignment: 'center'},
]);
})
})
// playground requires you to assign document definition to a variable called dd
var dd = {
pageSize: 'A4',
pageOrientation: 'portrait',//'landscape',
pageMargins: [ 20, 20, 20, 40 ],
keepWithHeaderRows: true,
info: {
title: 'Műhelymunkák',
author: 'IO-Technic Munkanyílvántartó',
subject: 'Műhely munkák naplója',
keywords: 'Napló',
},
/* pageBreakBefore: function(currentNode, followingNodesOnPage, nodesOnNextPage, previousNodesOnPage) {
return currentNode.id === 6 && followingNodesOnPage.length != 0;
},*/
pageBreakBefore: function(currentNode, followingNodesOnPage, nodesOnNextPage, previousNodesOnPage) {
return currentNode.startPosition.top >= 150;
},
//header: 'dsadad',
footer: function(currentPage, pageCount){
return {
height: 30,
stack:[
{text:currentPage.toString() + ' / ' + pageCount.toString(), alignment: 'center'},
{
columns: [
{width: '*',text:'IO-Technic Munkaidő és munkanyílvántartó rendszer. www.iotechnic.eu', alignment: 'center'},
{width: '20%',text: new Date().toString(), alignment: 'center'},
]
},
]
}
},
content: [
{
alignment: 'justify',
columns: [
{text: 'Munka Jelentés ', style: 'header'},
]
},
{
stack:[
{text: 'Megnevezés: '+ wName ,style:workHeader},
{text: 'Megrendelő: '+workHeader.megrendelo,style:workHeader },
{text: 'Munkaszám: '+workHeader.workNumber,style:workHeader},
{text: 'PO: '+workHeader.poNumber,style:workHeader},
]
},
{
width: auto,
style: 'tableExample',
table: {
headerRows: 1,
//dontBreakRows: true,
//widths: [20, 'auto', 80, 80,'*','*','*'],
// widths: [20, '*', 70, 70,50,'auto','auto'],
widths: [20, 70,'*', 100],
body: item,//[],
},
layout: {
fillColor: function (rowIndex, node, columnIndex) {
return (rowIndex % 2 === 0) ? '#CCCCCC' : null;
}
},
}
],
styles: {
header: {
fontSize: 18,
bold: true,
fillColor: '#eeeeee',
margin: [0, 0, 0, 10]
},
footerBrandText:{
fontSize: 12,
bold: false,
fillColor: '#eeeeee',
alignment: 'center'
},
datum: {
fontSize: 18,
bold: true,
fillColor: '#eeeeee',
alignment: 'right'
},
subheader: {
fontSize: 16,
bold: true,
fillColor: '#eeeeee',
margin: [0, 10, 0, 5]
},
tableExample: {
margin: [0, 5, 0, 15]
},
tableHeader: {
bold: true,
fontSize: 10,
fillColor: '#eeeeee',
color: 'red'
},
workHeader: {
bold: false,
fontSize: 10,
italics: true,
color: 'blue'
},
tableData: {
bold: false,
fontSize: 10,
italics: true,
color: 'green'
},
tableDataWe: {
bold: false,
fontSize: 10,
italics: true,
fillColor: '#eeffee',
color: 'red'
}
},
defaultStyle: {
// alignment: 'justify'
}
};
// dd.content[2].table.body=item;
//pdf.createPdf(dd).open();
// callback(null,dd);
// ...
return dd;
} }
// Nyomtatási kép generálás // Nyomtatási kép generálás
@ -1905,6 +2158,7 @@ const { date } = require('jszip/lib/defaults');
const { apiGetWorkList, apiGetEmployeeList, apiGetDailyReport, apiEmployee, apiGetAllReport, apiCheckDevice, apiRegisterDevice,apiRequestAPIkey, apiGetQRCode,apiGetWorkState } = require('./js/androidApi'); const { apiGetWorkList, apiGetEmployeeList, apiGetDailyReport, apiEmployee, apiGetAllReport, apiCheckDevice, apiRegisterDevice,apiRequestAPIkey, apiGetQRCode,apiGetWorkState } = require('./js/androidApi');
const { string } = require('jszip/lib/support'); const { string } = require('jszip/lib/support');
const { generateXML } = require('./js/enaploGen'); const { generateXML } = require('./js/enaploGen');
const { auto } = require('async');
app.use('/devicesrfid', devices_rfid); app.use('/devicesrfid', devices_rfid);
app.use('/vehicles', vehicles); app.use('/vehicles', vehicles);

View File

@ -53,7 +53,7 @@
"passport": "^0.4.1", "passport": "^0.4.1",
"passport-local": "^1.0.0", "passport-local": "^1.0.0",
"pdfkit": "^0.9.1", "pdfkit": "^0.9.1",
"pdfmake": "^0.2.4", "pdfmake": "^0.2.18",
"pizzip": "^3.1.3", "pizzip": "^3.1.3",
"pug": "^3.0.2", "pug": "^3.0.2",
"semantic-ui-table": "^2.3.1", "semantic-ui-table": "^2.3.1",

View File

@ -22,6 +22,32 @@
alert('Nincs mit nyomtatni!'); alert('Nincs mit nyomtatni!');
} }
}); });
// Műhely munka nyomtatása
$("#printWorkReport").click(function(ev) {
isLoaded=false;
var workId = $(this).attr('data-Id');
if (workId)
{
//$.get('/invoices/print2' , function(data) { console.log(data);
$.get('/print_workreport/'+workId , function(data) {
if (!isLoaded)
{ isLoaded=true;
//console.log(data);
pdfMake.createPdf(data).open();
}
});
}
else
{
alert('Nincs mit nyomtatni!');
}
});
function getXML(workId,drId,reportDate){ function getXML(workId,drId,reportDate){
let filename = ''; let filename = '';
fetch("/work/generateXML/"+workId+"/"+drId) fetch("/work/generateXML/"+workId+"/"+drId)

View File

@ -142,10 +142,11 @@ block content
col(width='1%') col(width='1%')
col(width='auto') col(width='auto')
col(width='auto') col(width='auto')
col(width='15%')
col(width='5%') col(width='5%')
col(width='5%') col(width='5%')
col(width='5%') col(width='5%')
col(width='3%')
col(width='3%')
col(width='5%') col(width='5%')
col(width='5%') col(width='5%')
thead thead
@ -158,6 +159,7 @@ block content
th(style='text-align:center') Státusz th(style='text-align:center') Státusz
th(style='text-align:left') M.SZ. th(style='text-align:left') M.SZ.
th(style='text-align:center') Órák th(style='text-align:center') Órák
th(style='text-align:center') Műhely
th(style='text-align:center') PO szám th(style='text-align:center') PO szám
th(style='text-align:left') Ber. th(style='text-align:left') Ber.
tbody(id='workTable',style='overflow-y: auto;') tbody(id='workTable',style='overflow-y: auto;')
@ -172,12 +174,14 @@ block content
td(style='text-align:left; vertical-align:middle;font-size: 9px;font-weight: bold;') #{work.megrendelo || "-"} td(style='text-align:left; vertical-align:middle;font-size: 9px;font-weight: bold;') #{work.megrendelo || "-"}
td(style='vertical-align:middle') td(style='vertical-align:middle')
a(href="/work/"+work._id)= work.title a(href="/work/"+work._id)= work.title
td(style='text-align:center;vertical-align:middle') #{work.workDate} td(style='text-align:center;vertical-align:middle') #{moment(work.workDate).format("YYYY.MM.DD")}
if (work.state==='Opened') if (work.state==='Opened')
td(style='text-align:center;vertical-align:middle') Folyamatban td(style='text-align:center;vertical-align:middle; color:green')
i.fa.fa-unlock
else else
if (work.state==='Closed') if (work.state==='Closed')
td(style='text-align:center;vertical-align:middle') Lezárva td(style='text-align:center;vertical-align:middle; color:red')
i.fa.fa-lock
else else
td(style='text-align:center;vertical-align:middle') td(style='text-align:center;vertical-align:middle')
@ -187,8 +191,16 @@ block content
span.badge.badge-success #{work.wc} span.badge.badge-success #{work.wc}
else else
span.badge #{work.wc} span.badge #{work.wc}
td(style='text-align:center;vertical-align:middle')
if (work.wrc>0)
span.badge(style="background-color: DodgerBlue !important") #{work.wrc}
else
span.badge #{work.wrc}
td(style='text-align:center;vertical-align:middle') #{work.poNumber} td(style='text-align:center;vertical-align:middle') #{work.poNumber}
td(style='text-align:left;vertical-align:middle') td(style='text-align:left;vertical-align:middle')
if (work.devicesArray.length>0)
span.badge.badge-success #{work.devicesArray.length}
else
span.badge #{work.devicesArray.length} span.badge #{work.devicesArray.length}
script(src='/bower_components/jquery/dist/jquery.js') script(src='/bower_components/jquery/dist/jquery.js')
script(type='text/javascript',src='/build/pdfmake.js') script(type='text/javascript',src='/build/pdfmake.js')
@ -311,6 +323,7 @@ block content
var parameters = { year: yr,condition: cond }; var parameters = { year: yr,condition: cond };
$.get( '/filter',parameters, function(data) { $.get( '/filter',parameters, function(data) {
//console.log(data); //console.log(data);
$('#workTable').empty();
var wTable=document.getElementById("workTable"); var wTable=document.getElementById("workTable");
wTable.innerHTML=data; wTable.innerHTML=data;

View File

@ -170,10 +170,13 @@ block content
.panel.panel-warning .panel.panel-warning
.panel-heading .panel-heading
.row .row
.col-md-8 .col-md-7
h4 Műhely munkavégzés h4 Műhely munkavégzés
.col-md-2 .col-md-2
h5#workTimesSum h5#workTimesSum
.col-md-1.float-right
button.btn.btn-success.button-spacer(id='printWorkReport',name='printWorkReport', data-id=work._id,type='button')
span.fa.fa-solid.fa-print
.col-md-2.float-right .col-md-2.float-right
span.pull-right.clickable span.pull-right.clickable
i.glyphicon.glyphicon-chevron-up i.glyphicon.glyphicon-chevron-up