Üretim Plan
Merhaba arkadaşlar,
Üretimi takip etmek amaçlı birşey yapmak istiyorum ama nasıl yapacağımı bilemiyorum yardımcı olurmusunuz?
7.15 de mesai başlıyor. 17.00 de bitiyor. 9.00 - 09.15 , 12.00 - 12.45 , 15.15 - 15.30 gibi üç molamız bulunuyor.
yapmak istediğim olay şu. zaman = 100 saniye. iş adedi: 130 adet 100x130 = 13000 saniye ediyor. 3saat 36 dakika sonra işi bitirecek yapan kişi.
ama bu süre uzayada bilir yada molaya denk gelebilir molayıda baslagıc saatine göre eklesin süreye istiyorum. işi 3 saatte değilde 12 saattede bitirebilir yani bir gün sonraya sarkacak. 17:00 a kadar olan çıkacak adedi bana bulsun bir sonraki güne aktarsın saat kaçta biteceğini yazdırayım istiyorum..
Umarım açıklayıcı olmuştur yardımlarınızı bekliyorum.
Soru hatalı mı? 👎
Eğer sorunun kurallara aykırı olduğunu düşünüyorsanız lütfen bize bildirin!
Cevaplar (21)
function calculate(string $start, int $count, int $time, array & $k): string
{
$to = $count * $time;
$workingDays = [1, 2, 3, 4, 5];
$from = new DateTime($start);
$interval = new DateInterval("PT1S");
$r = ($to * 10) + 172800;
$periods = new DatePeriod($from, $interval, $r);
$sec = 0;
$x = -1;
$z = 0;
foreach ($periods as $period) {
if (!in_array($period->format('N'), $workingDays)) continue;
$h = intval($period->format('H'));
$m = intval($period->format('i'));
if($period->format('N') != $x){
$x = $period->format('N');
if($z > 0){
array_push($k, $count - $z);
$z = 0;
}
}
if($sec >= $to){
return $period->format('Y-m-d H:i:s');
break;
}
if(($h >= 7 && $h <= 9)){
if($h == 7 && $m < 15){
continue;
} else if($h == 9 && $m >= 30 && $m < 45){
continue;
} else {
$sec++;
}
} else if(($h >= 9 && $h <= 12)){
if($h == 9 && $m < 45){
continue;
} else if($h == 12 && $m >= 15){
continue;
} else {
$sec++;
}
} else if(($h >= 13 && $h <= 15)){
if($h == 15 && $m >= 30 && $m < 45){
continue;
} else {
$sec++;
}
} else if(($h >= 15 && $h <= 17)){
if($h == 15 && $m >= 30 && $m < 45){
continue;
} else if($h == 17 && $m >= 30){
continue;
} else {
$sec++;
}
}
if($sec % $time == 0){
$z++;
}
}
}
@makifgokce ,
hangi tarih yazarsa yazsın bir gün sonranın tarihini gösteriyor bazen
ve
$baslangic_tarihi = "2021-12-01 10:03:00";
$adet = 382;
$sure = 70;
böyle bir süre girdiğimde, bir gün sonraya geçiyor ama boş gösteriyor kalanı. saat 9'a denk gelirse kalan sayıyı gösteriyor hocam ya
function calculate(string $start, int $count, int $time, array & $k): string
{
$to = $count * $time;
$workingDays = [1, 2, 3, 4, 5];
$from = new DateTime($start);
$interval = new DateInterval("PT1S");
$r = ($to * 10) + 172800;
$periods = new DatePeriod($from, $interval, $r);
$sec = 0;
$x = -1;
$z = $count;
$f = new DateTime($start);
foreach ($periods as $period) {
if (!in_array($period->format('N'), $workingDays)) continue;
$h = intval($period->format('H'));
$m = intval($period->format('i'));
if($period->format('N') != $x){
$e = new DateTime($period->format('Y-m-d')." 17:30:00");
$diff = $e->getTimestamp() - $f->getTimestamp();
$d = $e->modify('+1 days');
if (!in_array($d->format('N'), $workingDays)){
$d = $d->modify('+2 days');
}
$f = new DateTime($d->format('Y-m-d')." 07:15:00");
$x = $period->format('N');
$z -= ($diff / $time);
if($z > 0){
array_push($k, $z);
}
}
if($sec >= $to){
return $period->format('Y-m-d H:i:s');
break;
}
if(($h >= 7 && $h <= 9)){
if($h == 7 && $m < 15){
continue;
} else if($h == 9 && $m >= 30 && $m < 45){
continue;
} else {
$sec++;
}
} else if(($h >= 9 && $h <= 12)){
if($h == 9 && $m < 45){
continue;
} else if($h == 12 && $m >= 15){
continue;
} else {
$sec++;
}
} else if(($h >= 13 && $h <= 15)){
if($h == 15 && $m >= 30 && $m < 45){
continue;
} else {
$sec++;
}
} else if(($h >= 15 && $h <= 17)){
if($h == 15 && $m >= 30 && $m < 45){
continue;
} else if($h == 17 && $m >= 30){
continue;
} else {
$sec++;
}
}
}
}
$baslangic_tarihi = "2021-12-01 08:00:00";
$adet = 360;
$sure = 100;
$kalan = [];
echo calculate($baslangic_tarihi, $adet, $sure, $kalan)."<br>";
print_r($kalan);
/**
* 2021-12-02 09:00:00
* Array ( [0] => 18 )
*/
burada kalanları array olarak alabilirsin.
Hocam çok teşekkür ederim çok güzel çalışıyor mola olayıda ekliymiş yeni fark ettim. her mola ek olarak süreye ekleniyor:)
peki şöyle birşey nasıl yapılır; iş gün sonu bitmiyor bir sonraki günde bitecek mesela. 17:30'a kadar yapacağı adet sayısını yazdırabilirmiiz hocam? eğer bir gün sonraya sarkıyorsa iş tabiki.
05.12.2021 -> mesai sonuna kadar yapılacak iş sayısı: 205 adet
06.12.2021 -> bir sonraki güne kalan adet sayısı: 29 adet
gibi bunuda eklersek bitiyor. cidden çok teşekkür ederim tekrar tekrar
if(($h >= 7 && $h <= 9)){
if($h == 7 && $m < 15){
continue;
} else if($h == 9 && $m >= 30 && $m < 45){
continue;
} else {
$sec++;
}
} else if(($h >= 9 && $h <= 12)){
if($h == 9 && $m < 45){
continue;
} else if($h == 12 && $m >= 15){
continue;
} else {
$sec++;
}
} else if(($h >= 13 && $h <= 15)){
if($h == 15 && $m >= 30 && $m < 45){
continue;
} else {
$sec++;
}
} else if(($h >= 15 && $h <= 17)){
if($h == 15 && $m >= 30 && $m < 45){
continue;
} else if($h == 17 && $m >= 30){
continue;
} else {
$sec++;
}
}
$r = ($to * 10) + 172800;
buradaki 172800
2günün sn olarak karşılığı araya cumartesi pazar tatili girerse foreach()
döngüsü durmasın diye.
şuan bunu çok açıklayamadım biliyorum ama nasıl açıklayacağımıda bilemedim.
Cumartesi, Pazar ve molalardan dolayı iş süresinden fazla değer girmek gerekiyordu bu yüzden öyle bişey yaptım.
Ek mola yazmışsın o kısmı tam olarak anlamadım şuan yazdığın molaları zaten hesaplıyor.
Örnek:
10(600dk) saatlik bir iş var diyelim saat 8 de başlıyor.
Saat 8den 17:30 a kadar toplamda 495dk çalışma saati var(molalar çıkartılınca) 600-495 = 105dk
ertesi gün 7:15 te başlayıp 105 dk 09:00 da iş bitiyor.
// 36000 sn = 10saat
echo calculate("2021-12-01 08:00:00", 36000); // 2021-12-02 09:00:00
@makifgokce,
Hocam çok teşekkür ederim Allah razı olsun. sizden son bir değişiklik isteyeceğim.
07:15 başlangıç
09:30 / 09:45 arası mola 15 dakika.
12:15 / 13:00 arası öğle molası 45 dakika.
15:30 / 15:45 arası ikinci mola 15 dakika.
17:30'da iş bitiş saati
olarak güncelleyebilirmisiniz ben değişiyorum ama bir türlü olmuyor anlamadım:)
ve ek olarak saat 8'de işe başladı ve 13:15 gibi bitecek iş diyelim. o saat aralığında 2 mola olacak. 15 dakika ve 45 dakika mesela. onlarıda süreye ekleyemezmiyiz?
13:15 e ek mola süreleride dahil olsa. 14:15'de bitecek molalarıda ekleyince bu özelliği ekleyebilirsek çok güzel olur uzun zamandır arıyordum yardımcı oldunuz çok teşekkür ederim cidden işimi çok kolaylaştıracak bu durum
ve $r = ($to * 10) + 172800; buradaki rakamlar ne anlama geliyor hocam merak ettim.
böyle denermisin sanki bu sefer oldu gibi
if(($h >= 7 && $h < 9)){
if($h == 7 && $m < 15){
continue;
} else {
$sec++;
}
} else if(($h >= 9 && $h < 12)){
if($h == 9 && $m < 15){
continue;
} else {
$sec++;
}
} else if(($h >= 12 && $h <= 15)){
if($h == 12 && $m < 45){
continue;
} else if($h == 15 && $m > 15 && $m < 30){
continue;
} else {
$sec++;
}
} else if(($h >= 15 && $h < 17)){
if($h == 15 && $m > 15 && $m < 30){
continue;
} else {
$sec++;
}
}
if kısmını bu şekilde düzenle
if((($h >= 7 && $m >= 15) || ($h <= 8 && $m <= 59)) || // 07:15-09:00
(($h >= 9 && $m >= 15) || ($h <= 11 && $m <= 59)) || // 09:15-12:00
(($h >= 12 && $m >= 45) || ($h <= 15 && $m <= 14)) || // 12:45-15:15
(($h >= 15 && $m >= 30) || ($h <= 16 && $m <= 59))){ // 15:30-17:00
$sec++;
}
başlangıç tarihi ve iş için gereken süreyi saniye olarak girmen yeterli
$baslangic_tarihi = "2021-12-01 07:15:00";
$adet = 130;
echo calculate($baslangic_tarihi, $adet * 100); // bu şekilde kullanabilirsin.
doğru çalışıyor gibi umarım işini görür.
Hafta içi her gün mesai saatlerine göre hesaplıyor.
function calculate($from, $to)
{
$workingDays = [1, 2, 3, 4, 5];
$from = new DateTime($from);
$interval = new DateInterval("PT1S");
$r = ($to * 10) + 172800;
$periods = new DatePeriod($from, $interval, $r);
$sec = 0;
foreach ($periods as $period) {
if (!in_array($period->format('N'), $workingDays)) continue;
$h = intval($period->format('H'));
$m = intval($period->format('i'));
if($sec >= $to){
return $period->format('Y-m-d H:i:s');
break;
}
// 07:15 09:00 09:15 12:00 12:45 15:15 15:30 17:00
if(($h >= 7 && $m >= 15) && ($h <= 8 && $m <= 59) || ($h >= 9 && $m >= 15) && ($h <= 11 && $m <= 59) || ($h >= 12 && $m >= 45) && ($h <= 15 && $m <= 14) || ($h >= 15 && $m >= 30) && ($h <= 16 && $m <= 59)){
$sec++;
}
}
}
echo calculate("2021-12-01 07:15:00", 13000); // 2021-12-01 11:51:40
@resulevis , çok teşekkür ederim ama bazı şeyler ekleyebilirmiyiz? mesela başlangıç tarihi girdik diyelim. İş başlama: 9:15 olsun. 09:30da mola var diyelim. İş süresi:10 saniye iş adet: 100 adet , 16 dakika oluyor ama sorun şu 09:31 yazmasın 09:46 yazsın istiyorum Molaya denk gelirse bitiş saati o 15 dakika aralığını atlasın , molada iş yapamayacağı için. 😊
ve birşey daha rica edeceğim. Bitiş tarihinin ve saatinin yanına 1 saat 10 dakika sürecek iş gibisinden yazabilirmiyiz? ve Bitiş saati 17:00 ı geçiyorsa eğer Gün sonunda yapacağı iş adedi: 200 , Bitireceği tarih (07:15 i baz alıp bir sonraki günde devam ettirip, geriye kalan iş adedini tamamlayacağı saati yazdırsak.) 17:00den önce bitersede iş zaten normal bitiş saati ve kaç saat süreceğini yazdırsak tarihle yeterli. Çalıştığım yerde bu çok gerekli pratiklik açısından hocam bu düzenlemeleride ekleyebilirsek çok mutlu olurum.
ve kodda şöyle bir sıkıntı daha var. iş başlama saati değişebiliyor. 10:04 de işe başlayabilir her hangibi bir saat diliminde. saat 07:15den başlatırsam eğer düzgün çalışıyor kod. ama başka saat eklediğğimde molaları kaçırıyor ek mola dakikalarını katmıyor. :/
$birinciMola = '09:00-09:15'; //15 Dakika Mola
$ikinciMola = '12:00-12:75'; // 45 Dakika Mola
$ucuncuMola = '15:15-15:30'; // 15 Dakika Mola
$isbaslangictarih = "18-10-2021";//İş başlangıç tarih
$isbaslangic = '07:15';
$isbitis = '17:00';
$toplamcalismadk = strtotime($isbitis) - strtotime($isbaslangic); // İş Başlangıc ve bitiş saati arasıbdaki saniye farkı
$toplamcalismadk = floor($toplamcalismadk/60) - 75; // saniye farkını dakikaya çevirme ve toplam mola saati çıkarıldı.
$ismiktari = 450;
$uretimsuresi = 100; // iş süresi saniye cinsinden hesaplandı
//İş Süresini Saniye Cinsinden hesaplama
$toplamsure_Sn = $ismiktari * $uretimsuresi;
$toplamsure_Dk =floor($toplamsure_Sn/60); // İşin Toplam sürecek zamanı dakika
$kacgun = floor($toplamsure_Dk / $toplamcalismadk); // İşin Kaç gün süreceğini hesaplamak
$toplamsure_Dk = floor($toplamsure_Dk % $toplamcalismadk); //
$isbitistarih = date("d-m-Y", strtotime($kacgun.' day', strtotime($isbaslangictarih))); // İş başlangıc tarihine iş sürecek gün sayısı eklendi
if ($toplamsure_Dk <=105) { //İş başlangıcından birinci molaya kadar ise
$bitis = date('H:i', strtotime('+'.$toplamsure_Dk.' minutes', strtotime($isbaslangic)));
}else if ($toplamsure_Dk > 105 && $toplamsure_Dk <= 270 ) {// İş 2. molaya kadar yapılacaksa
$toplamsure_Dk = $toplamsure_Dk + 15;
$bitis = date('H:i', strtotime('+'.$toplamsure_Dk.' minutes', strtotime($isbaslangic)));
}else if ($toplamsure_Dk > 270 && $toplamsure_Dk <= 420 ) { //İş 2. molaya kadar yapılacaksa
//toplam süreye 60 eklenecek
$toplamsure_Dk = $toplamsure_Dk + 60;
$bitis = date('H:i', strtotime('+'.$toplamsure_Dk.' minutes', strtotime($isbaslangic)));
}else if ($toplamsure_Dk > 420 && $toplamsure_Dk <= 510 ) { // İş 3. moladan sonra bitecekse
//toplam süreye 75 eklenecek
$toplamsure_Dk = $toplamsure_Dk + 75;
$bitis = date('H:i', strtotime('+'.$toplamsure_Dk.' minutes', strtotime($isbaslangic)));
}
echo 'İş Bitiş Tarihi : '.$isbitistarih.' - '.$bitis;
Daha dinamik hale getirilebilir Mola saatleri farklılık gösterilecekse molalar arası dakika farkı alınır.