false, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_STRINGIFY_FETCHES => false, PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8mb4', ]; $pdo = new PDO('mysql:host=' . $host . ';port=' . $dbport . ';dbname=' . $dbname . '', $dbuser, $dbpassword, $options); $pdo->exec('SET CHARACTER SET utf8mb4'); return $pdo; } catch (PDOException $e) { die("Something wrong: {$e->getMessage()}"); } } /** * 結束資料庫連線 */ function endConnectionDB($pdo) { unset($pdo); } /** * 取得下一個新的作番 * @param string $facility_type : M:新梯 T:汰改 B:保養 * @param string $sale_type : M:内銷 E:外銷 T:他社维保 J:汰改 X:特殊部品 * @param array $make_type : X:小機房 W:無機房 H:家用梯 Z:雜物梯 F:扶梯 B:部品 Q:品保對策 T:研究開發 N:設備 W:出貨現場要求購買 J:營業問題對策 Y:已出貨作番營業進行規格訂正 * @param int $num : 號機 * @return array $new_facility_arr */ function getNextFacilityNo($facility_type, $sale_type, $make_type, $num = 1) { $this->checkYearAndResetAllSeq(); $Y = substr(date("Y"), 3, 1); switch ($facility_type) { case "M": $next_seq = $this->getNextFacilitySeq("mf_vol_no") + 1; $new_facility_arr = []; for ($start_num = 1; $start_num <= $num; $start_num++) { $facility_no_tmp = $Y . $sale_type . $make_type[$start_num - 1] . str_pad($next_seq, 5, "0", STR_PAD_LEFT); array_push($new_facility_arr, $facility_no_tmp); $next_seq++; } return $new_facility_arr; case "T": $next_seq = $this->getNextFacilitySeq("tf_vol_no"); $new_facility_arr = []; for ($start_num = 1; $start_num <= $num; $start_num++) { $facility_no_tmp = $Y . $sale_type . $make_type[$start_num - 1] . str_pad($next_seq + 1, 3, "0", STR_PAD_LEFT) . str_pad($start_num, 2, "0", STR_PAD_LEFT); array_push($new_facility_arr, $facility_no_tmp); } return $new_facility_arr; case "B": $next_seq = $this->getNextFacilitySeq("bf_vol_no"); $new_facility_arr = []; for ($start_num = 1; $start_num <= $num; $start_num++) { $facility_no_tmp = $Y . $sale_type . $make_type[$start_num - 1] . str_pad($next_seq + 1, 3, "0", STR_PAD_LEFT) . str_pad($start_num, 2, "0", STR_PAD_LEFT); array_push($new_facility_arr, $facility_no_tmp); } return $new_facility_arr; default: return "不存在的作番類型"; } } /** * 建立新的作番 * @param string $facility_type : M:新梯 T:汰改 B:保養 * @param string $sale_type : M:内銷 E:外銷 T:他社维保 J:汰改 X:特殊部品 * @param array $make_type : X:小機房 W:無機房 H:家用梯 Z:雜物梯 F:扶梯 B:部品 Q:品保對策 T:研究開發 N:設備 W:出貨現場要求購買 J:營業問題對策 Y:已出貨作番營業進行規格訂正 * @param string $num : 號機 (非必填) * @return string $new_facility_no */ function makeFacilityNo($facility_type, $sale_type, $make_type, $num = null) { $this->checkYearAndResetAllSeq(); $faclikity_details = array( 'facility_type' => $facility_type, 'sale_type' => $sale_type, 'make_type' => $make_type, 'num' => $num ); switch ($facility_type) { case "M": return $this->makeNewMFacilityNo($faclikity_details); break; case "T": return $this->makeNewTFacilityNo($faclikity_details); break; case "B": return $this->makeNewBFacilityNo($faclikity_details); break; default: return "不存在的作番類型"; } } /** * 建立作番 -- 新梯 */ function makeNewMFacilityNo($faclikity_details) { $Y = substr(date("Y"), 3, 1); $sale_type = $faclikity_details['sale_type']; $make_type = $faclikity_details['make_type']; $num = $faclikity_details['num']; $next_seq = $this->getNextFacilitySeq("mf_vol_no") + 1; $new_facility_no_arr = []; for ($i = 1; $i <= $num; $i++) { $new_facility_no = $Y . $sale_type . $make_type[$i - 1] . str_pad($next_seq, 5, "0", STR_PAD_LEFT); array_push($new_facility_no_arr, $new_facility_no); $next_seq++; } foreach ($new_facility_no_arr as $new_facility_no) { if ($this->getMakeNewMFacilityNoStatus($faclikity_details) !== "1") { return $new_facility_no . ":" . $this->getMakeNewTFacilityNoStatus($faclikity_details); } // seq +1 $this->facilitySeqAddOne("M"); } return $new_facility_no_arr; } /** * 建立作番 -- 汰改 */ function makeNewTFacilityNo($faclikity_details) { $Y = substr(date("Y"), 3, 1); $sale_type = $faclikity_details['sale_type']; $make_type = $faclikity_details['make_type']; $num = $faclikity_details['num']; $next_seq = $this->getNextFacilitySeq("tf_vol_no"); $new_facility_no_arr = []; for ($i = 1; $i <= $num; $i++) { $new_facility_no = $Y . $sale_type . $make_type[$i - 1] . str_pad($next_seq + 1, 3, "0", STR_PAD_LEFT) . str_pad($i, 2, "0", STR_PAD_LEFT); array_push($new_facility_no_arr, $new_facility_no); } foreach ($new_facility_no_arr as $new_facility_no) { if ($this->getMakeNewTFacilityNoStatus($faclikity_details) !== "1") { return $new_facility_no . ":" . $this->getMakeNewTFacilityNoStatus($faclikity_details); } // seq +1 $this->facilitySeqAddOne("T"); return $new_facility_no_arr; } } /** * 建立作番 -- 保養 */ function makeNewBFacilityNo($faclikity_details) { $Y = substr(date("Y"), 3, 1); $sale_type = $faclikity_details['sale_type']; $make_type = $faclikity_details['make_type']; $num = $faclikity_details['num']; $next_seq = $this->getNextFacilitySeq("bf_vol_no"); $new_facility_no_arr = []; for ($i = 1; $i <= $num; $i++) { $new_facility_no = $Y . $sale_type . $make_type[$i - 1] . str_pad($next_seq + 1, 3, "0", STR_PAD_LEFT) . str_pad($i, 2, "0", STR_PAD_LEFT); array_push($new_facility_no_arr, $new_facility_no); } foreach ($new_facility_no_arr as $new_facility_no) { if ($this->getMakeNewBFacilityNoStatus($faclikity_details) !== "1") { return $new_facility_no . ":" . $this->getMakeNewBFacilityNoStatus($faclikity_details); } // seq +1 $this->facilitySeqAddOne("B"); return $new_facility_no_arr; } } /** * 檢查作番編列狀態 - 新梯 * @param array $faclikity_details * @return string $status : 1:正確 else:error message */ function getMakeNewMFacilityNoStatus($faclikity_details) { $sale_type = $faclikity_details['sale_type']; $make_type = $faclikity_details['make_type']; if ($this->checkSaleTypeStatus($sale_type) == false) return "銷售代號錯誤"; if ($this->checkMakeTypeStatus($make_type) == false) return "製造編號類型錯誤"; return "1"; } /** * 檢查作番編列狀態 - 汰改 * @param array $faclikity_details * @return string $status : 1:正確 else:error message */ function getMakeNewTFacilityNoStatus($faclikity_details) { $sale_type = $faclikity_details['sale_type']; $make_type = $faclikity_details['make_type']; if ($this->checkSaleTypeStatus($sale_type) == false) return "銷售代號錯誤"; if ($this->checkMakeTypeStatus($make_type) == false) return "製造編號類型錯誤"; return "1"; } /** * 檢查作番編列狀態 - 保養 * @param array $faclikity_details * @return string $status : 1:正確 else:error message */ function getMakeNewBFacilityNoStatus($faclikity_details) { $sale_type = $faclikity_details['sale_type']; $make_type = $faclikity_details['make_type']; if ($this->checkSaleTypeStatus($sale_type) == false) return "銷售代號錯誤"; if ($this->checkMakeTypeStatus($make_type) == false) return "製造編號類型錯誤"; return "1"; } /** * seq 取號 * @param string $type M:新梯 T:汰改 B:保養 */ function facilitySeqAddOne($type) { $type_arr = array( "M" => "mf_vol_no", "T" => "tf_vol_no", "B" => "bf_vol_no", ); if (!empty($type_arr[$type])) { $pdo = $this->connectionDB(); $pdo->exec('SET CHARACTER SET utf8mb4'); $sth = $pdo->prepare('UPDATE sequence SET current_val = current_val + 1 WHERE `seq_name` = ?'); $sth->bindValue(1, $type_arr[$type]); $sth->execute(); } } /** * 修正 seq 取號 * @param string $type M:新梯 T:汰改 B:保養 */ function facilityFixSeq($type) { $pdo = $this->connectionDB(); $pdo->exec('SET CHARACTER SET utf8mb4'); $type_arr = array( "M" => "mf_vol_no", "T" => "tf_vol_no", "B" => "bf_vol_no", ); $after_fix_seq = $this->getMaxSeq($type); $sql = " UPDATE sequence SET current_val = ? WHERE seq_name = ? "; $sth = $pdo->prepare($sql); $sth->bindValue(1, $after_fix_seq); $sth->bindValue(2, $type_arr[$type]); $sth->execute(); } function getMaxSeq($type) { $pdo = $this->connectionDB(); $pdo->exec('SET CHARACTER SET utf8mb4'); $Y = substr(date("Y"), 3, 1); $seq_num = $type == 'M' ? 5 : 3; $sql = " SELECT MAX(SUBSTR(f.facilityno,4,?))+1 AS seq FROM facility AS f WHERE 1=1 AND SUBSTR(f.facilityno,1,1) = ? AND f.define = ? ORDER BY SUBSTR(f.facilityno,4,3) ASC "; $sth = $pdo->prepare($sql); $sth->bindValue(1, $seq_num); $sth->bindValue(2, $Y); $sth->bindValue(3, $type); $sth->execute(); $result = $sth->fetch(); return $result['seq']; } /** * 檢查年月後 新梯及汰改seq歸零 */ function checkYearAndResetAllSeq() { $pdo = $this->connectionDB(); $pdo->exec('SET CHARACTER SET utf8mb4'); $sth = $pdo->prepare('SELECT * FROM `sequence` WHERE `seq_name` = ?'); $sth->bindValue(1, 'mf_vol_no'); $sth->execute(); $result = $sth->fetch(); $yyyymm = $result['yyyymm']; $dataY = substr($yyyymm, 0, 4); $today_Y = date("Y"); $today_Ym = date("Ym"); if ($dataY != $today_Y) { $sth = $pdo->prepare('UPDATE `sequence` SET `current_val` = ? , `yyyymm` = ? WHERE `seq_name` = ?'); $sth->bindValue(1, '0'); $sth->bindValue(2, $today_Ym); $sth->bindValue(3, 'mf_vol_no'); $sth->execute(); } } /** * 檢查作番在 facility table 中是否重複 * @param string|array $facility_no * @return boolean $status : true:沒重複 false:重複 */ function checkFacilityRepeatStatus($facility_no) { if (gettype($facility_no) == "string") { $pdo = $this->connectionDB(); $pdo->exec('SET CHARACTER SET utf8mb4'); $sth = $pdo->prepare('SELECT * FROM `facility` WHERE `facilityno` = ?'); $sth->bindValue(1, $facility_no); $sth->execute(); if ($sth->rowCount() == 0) return true; return false; } if (gettype($facility_no) == "array") { $pdo = $this->connectionDB(); $pdo->exec('SET CHARACTER SET utf8mb4'); $status = true; foreach ($facility_no as $row) { $sth = $pdo->prepare('SELECT * FROM `facility` WHERE `facilityno` = ?'); $sth->bindValue(1, $row); $sth->execute(); if ($sth->rowCount() !== 0) $status = false; } return $status; } } /** * 檢查 $sale_type 是否有存在規則之中 * @param string $sale_type : M:内銷 E:外銷 T:他社维保 J:汰改 X:特殊部品 * @return boolean $status : true:合法代碼 false:非法代碼 */ function checkSaleTypeStatus($sale_type) { if (!in_array($sale_type, ['M', 'E', 'T', 'J', 'X'])) return false; return true; } /** * 檢查 $sale_type 是否有存在規則之中 * @param array $make_type : X:小機房 W:無機房 H:家用梯 Z:雜物梯 F:扶梯 B:部品 Q:品保對策 T:研究開發 N:設備 W:出貨現場要求購買 J:營業問題對策 Y:已出貨作番營業進行規格訂正 * @return boolean $status : true:合法代碼 false:非法代碼 */ function checkMakeTypeStatus($make_type) { foreach ($make_type as $row) if (!in_array($row, ['X', 'W', 'H', 'Z', 'F', 'B', 'Q', 'T', 'N', 'W', 'J', 'Y'])) return false; return true; } /** * 檢查 取得下個作番的 seq * @param string $seq_name : 新梯:mf_vol_no 汰改:tf_vol_no 保養:bf_vol_no * @return int $seq : 作番流水號 */ function getNextFacilitySeq($seq_name) { $pdo = $this->connectionDB(); $pdo->exec('SET CHARACTER SET utf8mb4'); $sth = $pdo->prepare('SELECT * FROM `sequence` WHERE `seq_name` = ?'); $sth->bindValue(1, $seq_name); $sth->execute(); $result = $sth->fetch(); return $result['current_val']; } /** * 建立新的新梯作番 * @param string $sale_type : M:内銷 E:外銷 T:他社维保 J:汰改 X:特殊部品 * @param array $make_type : X:小機房 W:無機房 H:家用梯 Z:雜物梯 F:扶梯 B:部品 Q:品保對策 T:研究開發 N:設備 W:出貨現場要求購買 J:營業問題對策 Y:已出貨作番營業進行規格訂正 * @param int $seq_name : 幾個案場 0-99 * @return array $new_facilityno : 作番號 */ function makeMFacilityNo($sale_type, $make_type, $num) { if (count($make_type) !== $num) return "陣列數量不一致!"; $new_facility_no = $this->getNextFacilityNo("M", $sale_type, $make_type, $num); if ($this->checkFacilityRepeatStatus($new_facility_no) == false) { // 如果作番號重複 使用此函數修正 $this->facilityFixSeq("M"); } return $this->makeFacilityNo("M", $sale_type, $make_type, $num); } /** * 建立新的汰改作番 * @param array $sale_type : M:内銷 E:外銷 T:他社维保 J:汰改 X:特殊部品 * @param array $make_type : X:小機房 W:無機房 H:家用梯 Z:雜物梯 F:扶梯 B:部品 Q:品保對策 T:研究開發 N:設備 W:出貨現場要求購買 J:營業問題對策 Y:已出貨作番營業進行規格訂正 * @param int $seq_name : 幾個案場 0-99 * @return array $new_facilityno : 作番號 */ function makeTFacilityNo($sale_type, $make_type, $num) { if (count($make_type) !== $num) return "陣列數量不一致!"; $new_facility_no = $this->getNextFacilityNo("T", $sale_type, $make_type, $num); if ($this->checkFacilityRepeatStatus($new_facility_no) == false) { // 如果作番號重複 使用此函數修正 $this->facilityFixSeq("T"); } return $this->makeFacilityNo("T", $sale_type, $make_type, $num); } /** * 建立新的保養作番 * @param string $sale_type : M:内銷 E:外銷 T:他社维保 J:汰改 X:特殊部品 * @param array $make_type : X:小機房 W:無機房 H:家用梯 Z:雜物梯 F:扶梯 B:部品 Q:品保對策 T:研究開發 N:設備 W:出貨現場要求購買 J:營業問題對策 Y:已出貨作番營業進行規格訂正 * @param int $seq_name : 幾個案場 0-99 * @return array $new_facilityno : 作番號 */ function makeBFacilityNo($sale_type, $make_type, $num = 1) { if (count($make_type) !== $num) return "陣列數量不一致!"; $new_facility_no = $this->getNextFacilityNo("B", $sale_type, $make_type, $num); if ($this->checkFacilityRepeatStatus($new_facility_no) == false) { // 如果作番號重複 使用此函數修正 $this->facilityFixSeq("B"); } return $this->makeFacilityNo("B", $sale_type, $make_type, $num); } } // $cfn = new CreateFacilityNo; // // 建立作番號 - 新梯 // print_r($cfn->makeMFacilityNo("M", ["X", "W"], 2)); // echo "

"; // // 建立作番號 - 汰改 // print_r($cfn->makeTFacilityNo("M", ["X", "W"], 2)); // echo "

"; // // 建立作番號 - 保養 // print_r($cfn->makeBFacilityNo("M", ["X", "W"], 2)); // echo "

";