2012年7月23日 星期一

PHP get monthly serial number

PHP版本的自動生成有規則的訂單號(或編號)
生成的格式是:200908010001 前面幾位為當前的日期,後面五位為系統自增長類型的編號原理:
1.獲取當前日期格式化值
2.讀取文件,上次編號的值+1最為當前此次編號的值(記錄以文件的形式存儲,下月會接著這個編號)

<?php

class FileEveryDaySerialNumber 
{
 private $filename;    //檔名
 private $separate;    //系統分隔符號
 private $width;       //自動增長部分的個數

 public function __construct($width, $filename, $separate) 
 {
  $this->width = $width;
  $this->filename = $filename;
  $this->separate = $separate;
 }

 public function getOrUpdateNumber($current, $start) 
 {

  $record = IOUtil::read_content($this->filename);
  $arr = explode($this->separate, $record);
  if($current == $arr[0])
  { 
   //如果是同一天,則繼續增長
   $arr[1]++;
   IOUtil::write_content("$arr[0],$arr[1]", $this->filename); //將新值存入文件中

   return "$arr[0]".str_pad($arr[1],$this->width,0,STR_PAD_LEFT);

  }
  else
  { 
   //如果兩個日期不一樣則重新從起始值開始
   $arr[0] = $current;
   $arr[1] = $start;
   IOUtil::write_content("$arr[0],$arr[1]", $this->filename); //將新值存入文件中

   return "$arr[0]".str_pad($arr[1],$this->width,0,STR_PAD_LEFT);
  }

 }
}

class IOUtil
{

 public static function read_content($filename)
 {

  $handle = fopen($filename,"r");
  $content = fread($handle,filesize($filename));

  return $content;
 }

 public static function write_content($content, $filename)
 {

  $handle = fopen($filename,"w");
  fseek($handle,0);
  fwrite($handle, $content);

  return $content;
 }

}


?>
參數含義分別是日期後自增長數的位數, 存儲的文件名稱, 日期與自增長數的分割數
注意:網站目錄下需有EveryDaySerialNumber.dat否則會發生錯誤

使用範例(一)
 $obj = new FileEveryDaySerialNumber(4,"EveryDaySerialNumber.dat",",");   
 $current_date = date("Ymd");
 echo $obj->getOrUpdateNumber($current_date,1);
輸出結果: 201207230001


使用範例(二)
 $obj = new FileEveryDaySerialNumber(3,"EveryDaySerialNumber.dat",",");   
 $current_date = date("ym");
 echo $obj->getOrUpdateNumber($current_date,1);
輸出結果: 1207001

沒有留言:

張貼留言