我对 JavaScript 承诺很陌生。我正在尝试编写一个脚本来计算客户每台机器的效率,我需要处理的情况是班次是否发生了模具变化,如果有多少。现在,每个模具都有不同的目标产量,因此在给定的时间段内效率会随着产量的变化而变化。而且,这是我到目前为止提出的:
var request = require("request");
var cron = require("node-cron");
var express = require("express");
var async = require('async');
var userDetails;
app = express();
var clientId = 'clientId';
var idealCycletime = (6/60) ;
var downFor = (1000 * 60 * 5);
var assignedBreaks = (1000 * 60 * 45);
var apiUrl = 'http://apiUrl/';
var token = 'tokenValue';
var getMachines = apiUrl + 'getMachines/',
getDie = apiUrl + 'getDie/',
getDieLogs = apiUrl + 'getDieLogs/',
getShiftTiming = apiUrl + 'getShiftTiming/',
getCycleTimeLimited = apiUrl + 'getCycleTimeLimited/',
countCycleTimeLimited = apiUrl + 'countCycleTimeLimited/',
getDowntimeLogs = apiUrl + 'getDowntimeLogs/',
getComputedProduction = apiUrl + 'getComputedProduction/';
cron.schedule("*/1 * * * *", function () {
var machines = apiCall(getMachines, {'clientId': clientId}, 'POST'); //array of machines for the client eg: [{"machineId":"machineId", "hourlyTarget":"hourlyTarget", ...}, ....]
var shiftTimings = apiCall(getShiftTiming, {'clientId': clientId}, 'POST'); //shiftTiming for the client eg: {"clientId":"clientId", shiftA":"08:00:00", "shiftB":"20:00:00", "shiftC":""}
var shiftTiming;
var currentDateTime = IST();
console.log(currentDateTime);
var endDateTime = new Date(currentDateTime);
endDateTime.setSeconds(00);
endDateTime.setMilliseconds(000);
var startDateTime = new Date(endDateTime);
startDateTime.setMinutes(startDateTime.getMinutes() - 6);
var hours = endDateTime.getHours() < 10 ? "0" + endDateTime.getHours() : endDateTime.getHours();
var minutes = endDateTime.getMinutes() < 10 ? "0" + endDateTime.getMinutes() : endDateTime.getMinutes();
var seconds = endDateTime.getSeconds() < 10 ? "0" + endDateTime.getSeconds() : endDateTime.getSeconds();
var currentTime = hours + ":" + minutes + ":" + seconds;
var shiftAStartDateTime = new Date(endDateTime);
var shiftBStartDateTime = new Date(endDateTime);
var shiftCStartDateTime = new Date(endDateTime);
var prodDate;
shiftTimings.then(JSON.parse)
.then(function(shifts) {
if (shifts.shiftC == '') {
shiftAStartDateTime.setHours(shifts.shiftA[0]+shifts.shiftA[1]);
shiftAStartDateTime.setMinutes(shifts.shiftA[3]+shifts.shiftA[4]);
shiftBStartDateTime.setHours(shifts.shiftB[0]+shifts.shiftB[1]);
shiftBStartDateTime.setMinutes(shifts.shiftB[3]+shifts.shiftB[4]);
} else {
shiftAStartDateTime.setHours(shifts.shiftA[0]+shifts.shiftA[1]);
shiftAStartDateTime.setMinutes(shifts.shiftA[3]+shifts.shiftA[4]);
shiftBStartDateTime.setHours(shifts.shiftB[0]+shifts.shiftB[1]);
shiftBStartDateTime.setMinutes(shifts.shiftB[3]+shifts.shiftB[4]);
shiftCStartDateTime.setHours(shifts.shiftC[0]+shifts.shiftC[1]);
shiftCStartDateTime.setMinutes(shifts.shiftC[3]+shifts.shiftC[4]);
}
if (currentTime >= "00:00:00" && currentTime < shifts.shiftA) {
shiftAStartDateTime.setDate(shiftAStartDateTime.getDate()-1);
shiftBStartDateTime.setDate(shiftBStartDateTime.getDate()-1);
shiftCStartDateTime.setDate(shiftCStartDateTime.getDate()-1);
var month = ('0' + (shiftAStartDateTime.getMonth() + 1)).slice(-2);
var day = ('0' + shiftAStartDateTime.getDate()).slice(-2);
var year = shiftAStartDateTime.getFullYear();
prodDate = year + "-" + month + "-" + day;
}
else{
var month = ('0' + (shiftAStartDateTime.getMonth() + 1)).slice(-2);
var day = ('0' + shiftAStartDateTime.getDate()).slice(-2);
var year = shiftAStartDateTime.getFullYear();
prodDate = year + "-" + month + "-" + day;
}
shiftTiming = shifts;
var machines = apiCall(getMachines, {'clientId': clientId}, 'POST').then(JSON.parse);
return machines;
}).then(function(allMachines) {
async.map(allMachines , function(machine, callback) {
// console.log(machine.machineId);
var machineDataA, machineDataB, machineDataC, machineDataNow;
var currentShiftALength = 0, currentShiftBLength = 0, currentShiftCLength = 0;
var downtimeA = 0, uptimeA = 0, downtimeB = 0, uptimeB = 0, downtimeC = 0, uptimeC = 0;
var utilizationShiftA = 0, utilizationShiftB = 0, utilizationShiftC = 0;
var utilizationShiftAData = 0, utilizationShiftBData = 0, utilizationShiftCData = 0;
var efficiencyShiftA = 0, efficiencyShiftB = 0, efficiencyShiftC = 0;
var efficiencyShiftAData = 0, efficiencyShiftBData = 0, efficiencyShiftCData = 0;
var goodCountA = 0, totalCountA = 0, rejectCountA = 0, targetCountA = 0;
var goodCountB = 0, totalCountB = 0, rejectCountB = 0, targetCountB = 0;
var goodCountC = 0, totalCountC = 0, rejectCountC = 0, targetCountC = 0;
var goodCountNow = 0, totalCountNow = 0, rejectCountNow = 0, targetCountNow = 0;
var qualityShiftA = 0, qualityShiftB = 0, qualityShiftC = 0;
var performanceShiftA = 0, performanceShiftB = 0, performanceShiftC = 0;
var oeeShiftA = 0, oeeShiftB = 0, oeeShiftC = 0;
var oeeShiftAData = 0, oeeShiftBData = 0, oeeShiftCData = 0;
// console.log(currentDateTime);
if (shiftTiming.shiftC == '') {
if (true) {
machineDataA = {
'machineId' : machine.machineId,
'startDateTime' : shiftAStartDateTime,
'endDateTime' : shiftBStartDateTime,
'eDate' : prodDate
};
machineDataB = {
'machineId' : machine.machineId,
'startDateTime' : shiftBStartDateTime,
'endDateTime' : endDateTime,
'eDate' : prodDate
};
// console.log(machineDataA);
currentShiftALength = (endDateTime - shiftAStartDateTime)/(1000 * 60);
var dieLogsA = apiCall(getDieLogs, machineDataA, 'POST');
dieLogsA.then(JSON.parse)
.then(function(dieLogs) {
//dieLogs Array eg:
// [{
// "id" : "5500A24141F7",
// "machineId" : "DEMOAISPL1",
// "dateTime" : ISODate("2018-09-11T04:59:29.000Z"),
// "startDateTime" : ISODate("2018-09-11T04:59:29.000Z"),
// "endDateTime" : ISODate("2018-09-11T04:59:38.000Z"),
// "clientId" : "DEMO"
// },
// {
// "id" : "5500A24141F7",
// "machineId" : "DEMOAISPL1",
// "dateTime" : ISODate("2018-09-11T04:59:57.000Z"),
// "startDateTime" : ISODate("2018-09-11T04:59:57.000Z"),
// "endDateTime" : ISODate("2018-09-11T05:00:06.000Z"),
// "clientId" : "DEMO"
// }]
if (dieLogs == '') {
var actualA = apiCall(countCycleTimeLimited, machineDataA, 'POST').then(JSON.parse).then(function(countA) {
totalCountA = countA['count'];
if (machine.currentDie != '') {
var targetA = apiCall(getDie, {'dieId' : machine.currentDie}, 'POST').then(JSON.parse).then(function(dieA) {
targetCountA = (dieA['target']/60)*currentShiftALength;
efficiencyShiftA = efficiency(totalCountA,targetCountA)*100;
// console.log(machine.machineId,totalCountA,targetCountA, efficiencyShiftA);
});
} else {
targetCountA = (machine.hourlyTarget/60)*currentShiftALength;
efficiencyShiftA = efficiency(totalCountA,targetCountA)*100;
// console.log(machine.machineId,totalCountA,targetCountA, efficiencyShiftA);
}
});
} else {
var eff = [];
var betweenDies =[];
var i;
for (i = 0; i <= dieLogs.length; i++) {
var dieStart, dieEnd, timeDiff;
if (i == 0) {
dieStart = new Date(dieLogs[i]['startDateTime']);
dieEnd = new Date(dieLogs[i]['endDateTime']);
if (dieStart < shiftAStartDateTime) {
dieStart = new Date(shiftAStartDateTime);
dieEnd = new Date(dieLogs[i]['endDateTime']);
timeDiff = (dieEnd - dieStart)/(1000 * 60);
var targetA = apiCall(getDie, {'dieId' : dieLogs[i]['id']}, 'POST').then(JSON.parse).then(function(dieA) {
targetCountA = (dieA['target']/60)*timeDiff;
machineDataA = {
'machineId' : machine.machineId,
'startDateTime' : dieStart,
'endDateTime' : dieEnd,
'eDate' : prodDate
};
var actualA = apiCall(countCycleTimeLimited, machineDataA, 'POST').then(JSON.parse).then(function(countA) {
totalCountA = countA['count'];
efficiencyShiftA = efficiency(totalCountA,targetCountA)*100;
eff.push(efficiencyShiftA);
});
});
} else {
dieStart = new Date(dieLogs[i]['startDateTime']);
dieEnd = new Date(dieLogs[i]['endDateTime']);
timeDiff = (dieEnd - dieStart)/(1000 * 60);
var targetA = apiCall(getDie, {'dieId' : dieLogs[i]['id']}, 'POST').then(JSON.parse).then(function(dieA) {
targetCountA = (dieA['target']/60)*timeDiff;
machineDataA = {
'machineId' : machine.machineId,
'startDateTime' : dieStart,
'endDateTime' : dieEnd,
'eDate' : prodDate
};
var actualA = apiCall(countCycleTimeLimited, machineDataA, 'POST').then(JSON.parse).then(function(countA) {
totalCountA = countA['count'];
efficiencyShiftA = efficiency(totalCountA,targetCountA)*100;
console.log('0', efficiencyShiftA);
eff.push(efficiencyShiftA);
});
});
}
} else if (i == dieLogs.length) {
dieStart = new Date(dieLogs[i-1]['startDateTime']);
dieEnd = new Date(endDateTime);
timeDiff = (dieEnd - dieStart)/(1000 * 60);
machineDataA = {
'machineId' : machine.machineId,
'startDateTime' : dieStart,
'endDateTime' : dieEnd,
'eDate' : prodDate
};
var actualA = apiCall(countCycleTimeLimited, machineDataA, 'POST').then(JSON.parse).then(function(countA) {
totalCountA = countA['count'];
if (machine.currentDie != '') {
var targetA = apiCall(getDie, {'dieId' : machine.currentDie}, 'POST').then(JSON.parse).then(function(dieA) {
targetCountA = (dieA['target']/60)*timeDiff;
efficiencyShiftA = efficiency(totalCountA,targetCountA)*100;
eff.push(efficiencyShiftA);
});
} else {
targetCountA = (machine.hourlyTarget/60)*timeDiff;
efficiencyShiftA = efficiency(totalCountA,targetCountA)*100;
eff.push(efficiencyShiftA);
}
}).then(function () {
var effShiftA = 0;
for (var i = 0; i < eff.length; i++) {
effShiftA = effShiftA + eff[i];
}
efficiencyShiftA = effShiftA/eff.length;
}).then(function () {
console.log(eff);
console.log(machine.machineId,totalCountA,targetCountA, efficiencyShiftA);
});
} else {
dieStart = new Date(dieLogs[i]['startDateTime']);
dieEnd = new Date(dieLogs[i]['endDateTime']);
timeDiff = (dieEnd - dieStart)/(1000 * 60);
var targetA = apiCall(getDie, {'dieId' : dieLogs[i]['id']}, 'POST').then(JSON.parse).then(function(dieA) {
targetCountA = (dieA['target']/60)*timeDiff;
machineDataA = {
'machineId' : machine.machineId,
'startDateTime' : dieStart,
'endDateTime' : dieEnd,
'eDate' : prodDate
};
var actualA = apiCall(countCycleTimeLimited, machineDataA, 'POST').then(JSON.parse).then(function(countA) {
totalCountA = countA['count'];
efficiencyShiftA = efficiency(totalCountA,targetCountA)*100;
console.log('2', efficiencyShiftA);
eff.push(efficiencyShiftA);
});
});
}
console.log(i);
}
}
}).catch(function (err) {
console.log('I caught your error! inside the loop' );
});
} else {
console.log('shift b else');
}
} else {
console.log('shift c else');
}
});
}).catch(function (err) {
console.log('I caught your error!' );
});
// machines.then(JSON.parse, errHandler)
// .then(function(allMachines) {
// async.map(allMachines , function(machine, callback) {
// // console.log(machine.machineId);
// });
// // console.log(result);
// // Do one more async operation here
// // var anotherPromise = getData(userDetails.followers_url, null, 'GET').then(JSON.parse);
// // return anotherPromise;
// }, errHandler);
// // .then(function(data) {
// // console.log(data)
// // }, errHandler);
});
function apiCall(url, requestData, method) {
// Setting URL and headers for request
var options = {
url: url,
form: requestData,
headers: {
"Authorization":"JWT " + token,
'User-Agent': 'request'
},
method: method
};
// Return new promise
return new Promise(function(resolve, reject) {
// Do async job
request(options, function(err, resp, body) {
if (err) {
reject(err);
} else {
resolve(body);
}
})
})
}
var errHandler = function(err) {
console.log(err);
}
function IST(){
var dateUTC = new Date();
var dateUTC = dateUTC.getTime();
var dateIST = new Date(dateUTC);
//converting date time to IST
dateIST.setHours(dateIST.getHours() + 5);
dateIST.setMinutes(dateIST.getMinutes() + 30);
return dateIST;
}
function efficiency(actual,target)
{
return (actual/target);
}
app.listen(3129);
假设 for 循环应该运行 4 次并向 eff 数组添加 4 个元素,有时它只运行一次并向数组添加 1 个元素,有时它运行三次并且只添加 2 个元素,它永远不会运行 4 次,因为它应该我想要所有即使console.logs有时也不会发生阵列中的效率是错误的,因为没有返回预期的内容,所以我不知道哪里出错了