<?php
ini_set('display_errors',1); //错误信息
ini_set('display_startup_errors',1); //php启动错误信息
error_reporting(-1); //打印出所有的 错误信息
header('Content-Type: application/json; charset=utf-8');
require_once dirname(__FILE__)."../../../../../phpspreadsheet/vendor/autoload.php";
require_once "../../../database/DB.class.php";
$date=date("Y-m-d H:i:s",time()+8*60*60);
$db = MySQLDB::getInstance();
set_time_limit(0);
$project = isset($_POST['project'])?$_POST['project']:@$_GET['project'];
$db->beginTransaction();
$total = 0; // 统计总插入条数(解决作用域问题)
function convertDateToWeekFormat($date) {
// 将输入的字符串转换为 DateTime 对象
$inputDateTime = new DateTime($date);
// 获取当前日期是星期几(1 表示星期日,2 表示星期一,以此类推
$weekDay = date('N');
if($weekDay<4){
// 将日期减去4天
$inputDateTime->modify('-7 days');
}
// 获取月份缩写
$monthAbbreviation = $inputDateTime->format('M');
// 提取年份最后两位
$yearLastTwoDigits = substr($inputDateTime->format('Y'), -2);
// 创建一个时间戳,用于计算第几周(Week)
$weekNumber = (int)ceil(($inputDateTime->getTimestamp() - strtotime("{$date} - 1 day")) / (7 * 86400));
// 计算该日期所在的周数(从当年的第一天开始计算)
$weekNumber = (int)$inputDateTime->format('W');
// return "{$yearLastTwoDigits}{$monthAbbreviation} wk{$weekNumber}";
return "{$yearLastTwoDigits}wk{$weekNumber}";
}
$week=convertDateToWeekFormat($date);
// 产能计划计算
function CapactityPlan($db, $project, $module, $col,$week) {
$days = "day" . $col;
// 改用预处理语句防注入
$sqla = "select `$days` as qty from ctb_capacity where `project` = '$project' and module='$module' and week='$week'";
$resa = $db->fetchRow($sqla);
if(empty($resa)){$resa['qty']=0;}
$sqlb = "select sum(qty) as qty from openpo_plan where `project` = '$project' and module='$module' and week='$week' and days = '$days'";
$resb = $db->fetchRow($sqlb);
if(empty($resb)){$resa['qty']=0;}
$qty = ($resa['qty'] ?? 0) - ($resb['qty'] ?? 0);
return $qty < 0 ? 0 : $qty;
}
// eeee库存计算
function eeeeStock($db, $project, $module, $eeee, $col,$week) {
$days = "day" . $col;
if ($col == 1) {
$sqla = "select `$days` as qty from ctb_eeee where `project` = '$project' and module = '$module' and week='$week' and `eeee` like '%$eeee%'";
$resa = $db->fetchRow($sqla);
} else {
$sumDays = [];
for ($i = 1; $i <= $col; $i++) {
$sumDays[] = "`day$i`";
}
$sumDaysStr = implode('+', $sumDays);
$sqla = "select sum($sumDaysStr) as qty from ctb_eeee where `project` = '$project' and module = '$module' and week='$week' and `eeee` like '%$eeee%'";
$resa = $db->fetchRow($sqla);
}
$sqlb = "select sum(qty) as qty from openpo_plan where `project` = '$project' and module = '$module' and week='$week' and `eeee` like '%$eeee%'";
$resb = $db->fetchRow($sqlb);
$qty = ($resa['qty'] ?? 0) - ($resb['qty'] ?? 0);
return $qty < 0 ? 0 : $qty;
}
// Hsg库存计算
function HsgStock($db, $project, $module, $knk, $color_code, $col) {
$days = "day" . $col;
if ($col == 1) {
$sqla = "select `$days` as qty from ctb_hsg where `project` = '$project' and `knk` = '$knk' and color_code = '$color_code'";
$resa = $db->fetchRow($sqla);
} else {
$sumDays = [];
for ($i = 1; $i <= $col; $i++) {
$sumDays[] = "`day$i`";
}
$sumDaysStr = implode('+', $sumDays);
$sqla = "select sum($sumDaysStr) as qty from ctb_hsg where `project` = '$project' and `knk` = '$knk' and color_code = '$color_code'";
$resa = $db->fetchRow($sqla);
}
$sqlb = "select sum(qty) as qty from openpo_plan where `project` = '$project' and `knk` = '$knk' and color_code = '$color_code'";
$resb = $db->fetchRow($sqlb);
$qty = ($resa['qty'] ?? 0) - ($resb['qty'] ?? 0);
return $qty < 0 ? 0 : $qty;
}
// 取最小值
function getMin_first($a, $b, $c) {
return min([$a, $b, $c]);
}
// 取最小值
function getMin_second($a, $b) {
return min([$a, $b]);
}
function getWeekday($date) {
// 将日期字符串转为 Unix 时间戳
$timestamp = strtotime($date);
// 获取星期几,返回值从周日开始(0 表示周日)
return date('w', $timestamp);
}
$sql = "DELETE FROM openpo_plan where week ='$week' and project='$project'";
$res = $db->query($sql);
// 提前查询openpo数据(减少重复查询)
$sqla = "select * from openpo where week ='$week' and project='$project'";
$resa = $db->fetchAll($sqla);
$now = new DateTime();
$current_date = $now->format('Y-m-d');
$Sunday = strtotime($date) + (7 - getWeekday($date)) * 86400; //周日
$aftermon_timestamp = strtotime($date) + (7 - getWeekday($date)) * 86400 + (3 * 86400); //第一天
$aftermon = date('Y-m-d', $aftermon_timestamp); //第一天
// 生成后续日期
$day0 = date('Y-m-d', $Sunday);
$day1 = date('Y-m-d', $aftermon_timestamp + 0 * 86400); // 第1天
$day2 = date('Y-m-d', $aftermon_timestamp + 1 * 86400); // 第2天
$day3 = date('Y-m-d', $aftermon_timestamp + 2 * 86400); // 第3天
$day4 = date('Y-m-d', $aftermon_timestamp + 3 * 86400); // 第4天
$day5 = date('Y-m-d', $aftermon_timestamp + 5 * 86400); // 第5天
$day6 = date('Y-m-d', $aftermon_timestamp + 6 * 86400); // 第6天
$day7 = date('Y-m-d', $aftermon_timestamp + 7 * 86400); // 第7天
$day8 = date('Y-m-d', $aftermon_timestamp + 8 * 86400); // 第8天
$day9 = date('Y-m-d', $aftermon_timestamp + 9 * 86400); // 第9天
$day10 = date('Y-m-d', $aftermon_timestamp + 10 * 86400); // 第10天
$day11 = date('Y-m-d', $aftermon_timestamp + 12 * 86400); // 第11天
$day12 = date('Y-m-d', $aftermon_timestamp + 13 * 86400); // 第12天
$mo_dates=[$day0,$day1,$day2,$day3,$day4,$day5,$day6,$day7,$day8,$day9,$day10,$day11,$day12];
$dataA=[];
// 循环处理12个周期
for ($col = 1; $col <= 12; $col++) {
$days = "day" . $col;
$mo_date = $mo_dates[$col];
$i = 0;
foreach ($resa as $row) {
// 提取数据
$project = $row['project'];
$module = $row['module'];
$stage = $row['stage'];
$pc_type = $row['pc_type'];
$cust_pn = $row['cust_pn'];
$knk = $row['knk'];
$color_code = $row['color_code'];
$color_option = $row['color_option'];
$eeee = $row['eeee'];
// 计算可用资源
$SurPlusCapactity = CapactityPlan($db, $project, $module, $col,$week);
if($col<=6){
$SurPluseeeeStock = eeeeStock($db, $project, $module, $eeee, $col,$week);
// $SurPlusHsgStock = HsgStock($db, $project, $module, $knk, $color_code, $col);
}else{
$SurPluseeeeStock =0;
// $SurPlusHsgStock =0;
}
// 计算待排和已排数量(修正条件判断和变量名)
if ($col == 1) { // 修正:== 判断相等
$daipaip0[$i] = $row['p0'];
// $daipai = getMin_first($daipaip0[$i], $SurPlusCapactity, $SurPluseeeeStock, $SurPlusHsgStock);
$daipai = getMin_first($daipaip0[$i], $SurPlusCapactity, $SurPluseeeeStock);
$yipaip0[$i] = $daipai;
$SurPlusDaipai = max($daipaip0[$i] - $yipaip0[$i], 0);
$daipaip0[$i] = $SurPlusDaipai;
} else {
if($col<=6){
// $daipai = getMin_first($daipaip0[$i], $SurPlusCapactity, $SurPluseeeeStock, $SurPlusHsgStock); // 修正变量名
$daipai = getMin_first($daipaip0[$i], $SurPlusCapactity, $SurPluseeeeStock); // 修正变量名
}else{
$daipai = getMin_second($daipaip0[$i], $SurPlusCapactity); // 修正变量名
}
$yipaip0[$i] = $daipai;
$SurPlusDaipai = max($daipaip0[$i] - $yipaip0[$i], 0);
$daipaip0[$i] = $SurPlusDaipai;
}
// $dataA[]=[$daipaip0[$i],$cust_pn, $project,$module,$eeee,$knk, $color_code,$daipaip0[$i],$SurPlusCapactity,$SurPluseeeeStock,$yipaip0[$i],$SurPlusDaipai,$days ,"p0"];
if($daipai >0){
// 插入openpo_plan(单条插入修正)
$dataA[]=[$daipaip0[$i],$cust_pn, $project,$module,$eeee,$knk, $color_code,$daipaip0[$i],$SurPlusCapactity,$SurPluseeeeStock,$yipaip0[$i],$SurPlusDaipai,$days ,"p0"];
$values = [
$project, $module,$stage, $pc_type, $cust_pn, $knk,
$color_code, $color_option, $eeee, $daipai, $days,"P0", $mo_date, $week, $date
];
$data['project']=$project;
$data['module']=$module;
$data['stage']=$stage;
$data['pc_type']=$pc_type;
$data['cust_pn']=$cust_pn;
$data['knk']=$knk;
$data['color_code']=$color_code;
$data['color_option']=$color_option;
$data['eeee']=$eeee;
$data['qty']=$daipai;
$data['days']=$days;
$data['agep0']="P0";
$data['mo_date']=$mo_date;
$data['week']=$week;
$data['create_time']=$date;
$types = '';
// $params = [];
foreach ($values as $value) {
if (is_int($value)) {
$types .= 'i'; // 如果是整数类型
$params[] = &$value;
} else {
$types .= 's'; // 否则假定为字符串类型
$params[] = &$value;
}
}
$placeholders = '(' . implode(',', array_fill(0, count($values), '?')) . ')';
$sqlb = "INSERT INTO `openpo_plan` (
`project`,`module`,`stage`,`pc_type`,`cust_pn`,`knk`,
`color_code`,`color_option`,`eeee`,`qty`,`days`,`agep0`,`mo_date`,`week`,`create_time`
) values ".$placeholders; // 单条占位符
$stmt = $db->query($sqlb,$types,$data);
if ($stmt) {
$total++; // 累计成功条数
}
}
$i++;
}
// 处理age相关逻辑(同上面p0逻辑,省略重复注释)
$i = 0;$j =0;
foreach ($resa as $row) {
// 提取数据(同上)
$project = $row['project'];
$module = $row['module'];
$stage = $row['stage'];
$pc_type = $row['pc_type'];
$cust_pn = $row['cust_pn'];
$knk = $row['knk'];
$color_code = $row['color_code'];
$color_option = $row['color_option'];
$eeee = $row['eeee'];
// 计算可用资源(同上)
$SurPlusCapactity = CapactityPlan($db, $project, $module, $col, $week);
if($col<=6){
$SurPluseeeeStock = eeeeStock($db, $project, $module, $eeee, $col, $week);
// $SurPlusHsgStock = HsgStock($db, $project, $module, $knk, $color_code, $col);
}else{
$SurPluseeeeStock =0;
// $SurPlusHsgStock =0;
}
// 计算待排和已排数量
if ($col == 1) { // 修正:== 判断相等
$daipaiage[$i] = $row['age']- $yipaip0[$i];
// $daipai = getMin_first($daipaiage[$i], $SurPlusCapactity, $SurPluseeeeStock, $SurPlusHsgStock);
$daipai = getMin_first($daipaiage[$i], $SurPlusCapactity, $SurPluseeeeStock);
$yipaiage[$i] = $daipai;
$SurPlusDaipai = max($daipaiage[$i] - $yipaiage[$i],0);$daipaiage[$i] = $SurPlusDaipai;
} else {
$daipaiage[$i] = max($daipaiage[$i] - $yipaip0[$i],0);
if($col<=6){
// $daipai = getMin_first($daipaiage[$i], $SurPlusCapactity, $SurPluseeeeStock, $SurPlusHsgStock);
$daipai = getMin_first($daipaiage[$i], $SurPlusCapactity, $SurPluseeeeStock);
}else{
$daipai = getMin_second($daipaiage[$i], $SurPlusCapactity);
}
$yipaiage[$i] = $daipai;
$SurPlusDaipai = max($daipaiage[$i] - $yipaiage[$i],0);$daipaiage[$i] = $SurPlusDaipai;
}
$dataA[]=[$i,$daipaiage[$i],$cust_pn, $project,$module,$eeee,$knk, $color_code,$daipaiage[$i],$SurPlusCapactity,$SurPluseeeeStock,$yipaiage[$i],$SurPlusDaipai,$days ,"age"];
if($daipai>0){
// 插入openpo_plan(单条插入修正)
// $dataA[]=[$daipaiage[$i],$cust_pn, $project,$module,$eeee,$knk, $color_code,$daipaiage[$i],$SurPlusCapactity,$SurPluseeeeStock,$yipaiage[$i],$SurPlusDaipai,$days ,"age"];
$values = [
$project, $module,$stage, $pc_type, $cust_pn, $knk,
$color_code, $color_option, $eeee, $daipai, $days,"AGE", $mo_date,$week, $date
];
$data['project']=$project;
$data['module']=$module;
$data['stage']=$stage;
$data['pc_type']=$pc_type;
$data['cust_pn']=$cust_pn;
$data['knk']=$knk;
$data['color_code']=$color_code;
$data['color_option']=$color_option;
$data['eeee']=$eeee;
$data['qty']=$daipai;
$data['days']=$days;
$data['agep0']="AGE";
$data['mo_date']=$mo_date;
$data['week']=$week;
$data['create_time']=$date;
$types = '';
// $params = [];
foreach ($values as $value) {
if (is_int($value)) {
$types .= 'i'; // 如果是整数类型
$params[] = &$value;
} else {
$types .= 's'; // 否则假定为字符串类型
$params[] = &$value;
}
}
$placeholders = '(' . implode(',', array_fill(0, count($values), '?')) . ')';
$sqlb = "INSERT INTO `openpo_plan` (
`project`,`module`,`stage`,`pc_type`,`cust_pn`,`knk`,
`color_code`,`color_option`,`eeee`,`qty`,`days`,`agep0`,`mo_date`,`week`,`create_time`
) values ".$placeholders; // 单条占位符
// echo json_encode($data,true);
$stmt = $db->query($sqlb,$types,$data);
if ($stmt) {
$total++; // 累计成功条数
}
}
$i++;
}
}
$db->beginTransaction();
$sql = "DELETE FROM openpo_9c81 where project='$project' and week='$week'";
$res = $db->query($sql);
$data=[];
$sqla="select project,module,pc_type,cust_pn,knk,color_code,color_option,eeee,mo_date,days,sum(qty) as qty
from `openpo_plan` where project='$project' and week='$week'
GROUP BY project, module,pc_type,cust_pn,days";
$resa=$db->fetchAll($sqla);
$i=0;
foreach($resa as $row){
$project=$row['project'];
$module=$row['module'];
$pc_type=$row['pc_type'];
$cust_pn=$row['cust_pn'];
$knk=$row['knk'];
$color_code=$row['color_code'];
$color_option=$row['color_option'];
$eeee=$row['eeee'];
$mo_date=$row['mo_date'];
$days=$row['days'];
$qty=$row['qty'];
$data[]=[
'project' => $project,
'module' => $module,
'pc_type' => $pc_type,
'cust_pn' => $cust_pn,
'knk' => $knk,
'color_code' => $color_code,
'color_option' => $color_option,
'eeee' => $eeee,
'mo_date' => $mo_date,
'qty' => $qty,
'days' => $days,
'week' => $week,
'create_time' => $date
];
$i++;
}
if (!empty($data)) {
// 生成插入语句的占位符字符串和值数组
$chunkSize = 100;
$dataChunks = array_chunk($data, $chunkSize);
// 循环执行插入操作
foreach ($dataChunks as $chunk) {
$placeholders = [];
$values = [];
$types = ''; // 参数类型字符串
$params = []; // 绑定的参数值
foreach ($chunk as $row) {
foreach ($row as $value) {
if (is_int($value)) {
$types .= 'i'; // 如果是整数类型
} else {
$types .= 's'; // 否则假定为字符串类型
}
}
$placeholders[] = '(' . implode(',', array_fill(0, count($row), '?')) . ')';
$values = array_merge($values, array_values($row));
}
$sql="INSERT INTO `openpo_9c81` (`project`,`module`,`pc_type`,`cust_pn`,`knk`,`color_code`,`color_option`,`eeee`,`mo_date`,`qty`,`days`,`week`,`create_time`) values " . implode(', ', $placeholders);
$stmt = $db->prepare($sql); // 准备预处理语句
if($stmt){
$stmt->bind_param($types, ...$values); // 绑定参数
$stmt->execute(); // 执行插入操作
$stmt->close(); // 关闭预处理语句
}
}
}
// 响应结果(修正消息和判断条件)
$response = [
'code' => $i > 0 ? 0 : -1,
'count' => $total,
'data' => $dataA,
// 'sqlb' => $daipai,
'message' => $total > 0 ? "插入成功!" : "插入失败,先确认机种!"
];
$db->commit();
echo json_encode($response);
?>
增加遗传算法,退火算法