v2.5.2
Giriş yap

Üretim Plan

okan
943 defa görüntülendi ve 2 kişi tarafından değerlendirildi

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.

Cevap yaz
Cevaplar (21)
okan
1039 gün önce

hesaplama yaparken 1000 üzeri adet yazınca hesaplaması 3-4 dakikayı buluyor bunun için ne yapabilirim acaba

okan
1082 gün önce

@makifgokce çok teşekkür ederim yardımlarınız için :)

makifgokce
1082 gün önce
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++;
		}
	}
}
okan
1083 gün önce

@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

makifgokce
1083 gün önce
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.

okan
1083 gün önce

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

makifgokce
1083 gün önce
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
okan
1083 gün önce

@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.

makifgokce
1083 gün önce

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++;
	}
}
okan
1084 gün önce

bu seferde 09:10 da bitse bile yazıyor. yani molaya 15 dakika eklemiyor hocam. bir türlü istediğim sonucu alamıyorum :(

makifgokce
1084 gün önce

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++;
}
okan
1084 gün önce

12:00'dan sonra direk saat 3'e atlıyor,

$baslangic_tarihi = "2021-12-01 08:00:00";
$adet = 361; // 360 yapınca 12'de bitiyor 361 yapınca direk 15:30'da bitiyor gözüküyor
echo calculate($baslangic_tarihi, $adet * 30);

makifgokce
1084 gün önce

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.
okan
1084 gün önce

@makifgokce , iş adet sayısını ve süresini nereye yazıyoruz onu anlayamadım onlar ekli değil mi ve cevap için teşekkür ederim

makifgokce
1088 gün önce

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
okan
1088 gün önce

arkadaşlar yardımcı olabilecek birisi yokmu :(

okan
1111 gün önce

Yardımlarınızı bekliyorum arkadaşlar bir türlü çözümü bulamadım

okan
1113 gün önce

@resulevis , çok teşekkür ederim :)

resulevis
1113 gün önce

@okan öncelikle rica ederim. dediğim gibi mola saatleri daha dinamik hale getirilebilir.
Bu aksam eve geçince tekrar bakıp daha dinamik hale getirmeye calısacagım.

okan
1113 gün önce

@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. :/

resulevis
1118 gün önce
$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.