多個訂單輪流分配給多個人怎麼實現?

edited 四月 2014 in PHP新手區
環境是PHP+Mysql
多個訂單輪流分配給多個人怎麼實現。。訂單id:1,2,3,4,5,6,7,8 人員A,B,C
我需要這樣分配:
1給A
2給B
3給C
4給A
5給B
6給C
7給A
8給B
8個訂單分配完後記錄上次分配給哪個人(即人員B,下次來了訂單需要從C開始分配)
第二次來了訂單9,10,11需要這麼分配
9給C
10給A
11給B

敘述的蠻白吃的
但這個功能,有沒有大師可以指點一下方向
小弟非本科出身
先謝過了。感恩

評論

  • $array_id = array (1,2,3,4,5,6,7,8,9,10);
    $array_emp = array ('A','B','C');
    $array_r = array();
    foreach ($array_id as $va1){
       foreach ($array_emp as $val2)
             $array_r[$va1] = $val2 ;
    }
    //完了 ,看結果如下
    echo '<pre>';
    print_r($array_r);
    echo '</pre>';
    
  • runli wrote: »
    $array_id = array (1,2,3,4,5,6,7,8,9,10);
    $array_emp = array ('A','B','C');
    $array_r = array();
    foreach ($array_id as $va1){
       foreach ($array_emp as $val2)
             $array_r[$va1] = $val2 ;
    }
    //完了 ,看結果如下
    echo '<pre>';
    print_r($array_r);
    echo '</pre>';
    

    感謝大大的回應
    只是,我們的A,B,C的人員有可能會增加或減少,也是就會有D,E,F等等....
    所以,當人數一變動,或是訂單增減時
    是不是又會不一樣了呢??
    對於這個問題
    我想到的是
    "讀取最後一個訂單是誰接收的,然後按順序分配給下一個人受理即可"。
    只是要怎麼實現呢?
    感謝大大
  • 存人員資料的 table :usertb 欄位 userid
    存訂單資料的 table :potb 欄位 pono,userid
    <?php
      $sysparamx="localhost";
      $sysparamy="root";
      $sysparamz="password";
      $conn =mysql_connect($sysparamx, $sysparamy,$sysparamz);
      mysql_select_db('test');
    
      // 取出最大的 userid:maxuserid
    
      $sSql1='select max(userid) as maxuserid
              from usertb';
      $s1 =mysql_query($sSql1,$conn);
      $s1_record =mysql_fetch_array($s1);
      $maxuserid=$s1_record[maxuserid];
    
      // 取出最大訂單號碼的 userid:tempid
    
      $sSql2='select userid as tempid
              from potb
              where pono=(select max(pono) from potb)';
      $s2 =mysql_query($sSql2,$conn);
      $s2_record =mysql_fetch_array($s2);
      $tempid=$s2_record[tempid]; 
      //
      if ($tempid==$maxuserid)
      {
        $tempid='';
      }  
      //
      $sSql3='select userid as newuserid
              from usertb
              where userid>"'.$tempid.'"
              order by userid limit 0,1';      
      $s3 =mysql_query($sSql3,$conn);
      $s3_record =mysql_fetch_array($s3);  
      $newuserid=$s3_record[newuserid]; 
      // 新的 userid
      echo 'newuserid='.$newuserid.'</br>';
    ?>
    

    http://www.hahago.biz

    歡迎有空來逛逛
  • roger 寫得很清楚了.

    (命題:讀取最後一個訂單是誰接收的,然後按順序分配給下一個人受理即可)
    $array_emp = array ('A','B','C');(目前能接單的人,該陣列會隨時間變動)
    $array_r = (目前訂單與僱員紀錄) //$array_r[order_id] = $emp_name
    $last_emp_name =$array_r[count($array_r)]; //取得最後一位處理者名字
    
    foreach ($array_emp as $key=>$val) //取得最後一位處理者的順位
    if ($last_emp_name ==$val and ) $last_emp_id = $key; 
    
    
    $array_r[($last_order_id++)]  = $array_emp[($last_emp_id++)%count($array_emp) ];
    //最新一筆訂單處理者 = 僱員陣列中( (排序+1)%總數 ) 
    
    //完了 ,看結果如下
    echo '<pre>';
    print_r($array_r);
    echo '</pre>';
    
  • edited 四月 2014
    roger wrote: »
    存人員資料的 table :usertb 欄位 userid
    存訂單資料的 table :potb 欄位 pono,userid
    
    
    感謝roger 大神
    花了4個小時,終於了解了您寫的意思並正確執行(PS.包括去書店找資料啦>.<)$newuserid就是在[存人員資料的 table :usertb 欄位 userid]
    的下一個輪到的人員
    所以,在寫入table :potb的欄位userid
    要怎麼寫呢?

    我用以下的語法
    $query_sSql4 = "update guest
    set userid = $newuserid
    where id=(select max(id) from guest)";
    $sSql4 = mysql_query($query_sSql4, $vv) or die(mysql_error()); //最大id的陣列元素

    echo "以下是查陣列結果:";
    echo $sSql4;
    但出現You can't specify target table 'guest' for update in FROM clause

    哎呀,請問這關怎麼解決呢?感覺只差一步就可以完成了也,感謝




  • edited 四月 2014
    上面已取出下一個輪到的人員 $newuserid
    <?php
      // 取出下一個將寫入的 pono
      $sSql4='select IFNULL(max(pono),0) as maxpono
              from potb';
      $s4 =mysql_query($sSql4,$conn);
      $s4_record =mysql_fetch_array($s4);
      $maxpono=$s4_record[maxpono];  
     
      // 假設訂單id:1,2,3,4,5,6,7,8 是純數字,而非 po1,po2,po3... (前面有固定的 'po'字串)
      $pono=$maxpono+1;
      $sSql5 = "insert into potb(pono,userid)
                values('$pono','$newuserid')";
      mysql_query($sSql5,$conn);  
    ?>
    
  • 存人員資料的 table :usertb 欄位 userid
    存訂單資料的 table :potb 欄位 pono,userid

    1. select max(pono) from potb //取得最新單號 $lastpono
    2. select userid from potb where pono = $lastpono //取得最後處理者 $last_user
    3. select * from usertb order by userid (排序欄位,依狀況設定) //取得所有處理者名單與順位
    4. 把 3 結果依次塞到 $array_user
    5. 用 $last_user 與 $array_user 找出下一個 $user(處理者)
    6. insert into potb ( userid,(其他資訊欄位)) valuse ($user,(其他資訊))
  • edited 四月 2014
    真誠感謝roger及runli 老師的指點
    讓我這個菜鳥順利完成了這個任務
    想當初,連看roger老師的語法都看了老半天才能理解(runli 老師的目前還看不太懂)
    沒想到,最後竟然可以完成之前覺得不太可能的事

    在這個過程中也學到很多
    最後感謝 台灣PHP聯盟 提供這麼好的環境
    ths
  • 恭喜你把它實作出來了,但是這樣的網頁在同一時間只能一個人使用.

    因為兩個人同時使用時會得到相同的 $maxpono(下一個將寫入的 pono),第一個人執行 mysql_query($sSql5,$conn) 是 ok 的,當第二個人執行 mysql_query($sSql5,$conn) 程式就會出錯;(通常訂單資料的欄位 pono會是 key)

    若有碰到這樣的問題時再來討論吧
  • roger 老師
    目前同時只能有一個人使用的問題不大(可能是因為人還不夠多吧!)
    比較麻煩的是,有時候寫入時,名單會重覆的問題
    @?
    目前這個還想不出原因??
    roger wrote: »
    恭喜你把它實作出來了,但是這樣的網頁在同一時間只能一個人使用.

    因為兩個人同時使用時會得到相同的 $maxpono(下一個將寫入的 pono),第一個人執行 mysql_query($sSql5,$conn) 是 ok 的,當第二個人執行 mysql_query($sSql5,$conn) 程式就會出錯;(通常訂單資料的欄位 pono會是 key)

    若有碰到這樣的問題時再來討論吧

  • edited 四月 2014
    存人員資料的 table :usertb 欄位 userid
    存訂單資料的 table :potb 欄位 pono,userid

    "比較麻煩的是,有時候寫入時,名單會重覆的問題
    ex.pono不同,可是留下的資料相同"

    "名單"是甚麼?
    "留下的資料相同"?是甚麼資料?

    你可以在 mysql_query($sSql5,$conn); 之前
    echo 'pono='.$pono.'</br>';
    echo 'newuserid='.$newuserid.'</br>';
    看跟寫入資料庫的值是否一致.

    基本上,po上來的程式碼我都有經過測試
  • 感謝roger老師
    我是用Dreamweaver cs6
    基本上,我是用一個問卷表單在blogger上
    客戶填完表單後,名單就會寫到後台。
    但目前有一定的機率客戶名單會重覆

    我是有在想,如果在寫入的時候,檢查mysql中是否有相同姓名,如果有就不要寫入
    不知道這樣的方式是否可以解決客戶名單重覆的問題。

    以下是完整的原始碼:
    <?php require_once('Connections/vv.php'); ?>
    <?php
    session_start();

    mysql_query('SET NAMES utf8');
    mysql_query('SET CHARACTER_SET_CLIENT=utf8');
    mysql_query('SET CHARACTER_SET_RESULTS=utf8');
    error_reporting(0);
    $userid = -1
    ?>

    <?php
    mysql_select_db($database_vv, $vv);
    $query_sSql1 = "select max(userid) as maxuserid from account";//在後台人員表中,找出當中最大的userid
    $sSql1 = mysql_query($query_sSql1, $vv) or die(mysql_error());
    $s1_record =mysql_fetch_array($sSql1);//抓出userid的陣列元素
    $maxuserid=$s1_record[maxuserid]; // 代入maxuserid取出最大的 userid:maxuserid

    $query_sSql2 = "select userid as tempid from guest
    where id=(select max(id) from guest)";//在客戶表中,從id最大的那列,在userid這欄,
    $sSql2 = mysql_query($query_sSql2, $vv) or die(mysql_error());
    $s2_record =mysql_fetch_array($sSql2);//最大id的陣列元素
    $tempid=$s2_record[tempid]; //代入最大id那列,userid的數值

    if ($tempid==$maxuserid)
    {
    $tempid='0';//當在最大的id[訂單編號]中,userid的值 等於 在後台人員表中,最大的userid的值時,把在客戶表中userid設定清空
    }

    $query_sSql3 = "select userid as newuserid from account
    where userid> $tempid
    order by userid limit 0,1";//在後台人員表中,找到userid大於在客戶表中最大id那一列的userid大的第一個
    $sSql3 = mysql_query($query_sSql3, $vv) or die(mysql_error());
    $s3_record =mysql_fetch_array($sSql3);
    $newuserid=$s3_record[newuserid]; // 新的 userid

    //

    $query_sSql4 = "select IFNULL(max(id),0) as maxid
    from guest";//在客戶表中,找到id值最大的
    $sSql4 = mysql_query($query_sSql4, $vv) or die(mysql_error());
    $s4_record =mysql_fetch_array($sSql4);
    $maxid=$s4_record[maxid];


    // 假設訂單id:1,2,3,4,5,6,7,8 是純數字,而非 po1,po2,po3... (前面有固定的 'po'字串)
    $uid=$maxid+1;

    //$query_sSql5 ="insert into guest(id,userid)
    // values($id,$newuserid)";
    //mysql_query($query_sSql5, $vv) or die(mysql_error());


    ?>
    <?php
    if (!function_exists("GetSQLValueString")) {
    function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "")
    {
    if (PHP_VERSION < 6) {
    $theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue;
    }

    $theValue = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue);

    switch ($theType) {
    case "text":
    $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
    break;
    case "long":
    case "int":
    $theValue = ($theValue != "") ? intval($theValue) : "NULL";
    break;
    case "double":
    $theValue = ($theValue != "") ? doubleval($theValue) : "NULL";
    break;
    case "date":
    $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
    break;
    case "defined":
    $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
    break;
    }
    return $theValue;
    }
    }

    $editFormAction = $_SERVER;
    if (isset($_SERVER)) {
    $editFormAction .= "?" . htmlentities($_SERVER);
    }

    if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form1")) {
    $insertSQL = sprintf("INSERT INTO guest (source, CulbName, timedat, name, sex, birthday, height, kg, tel, period, qq, ttime, whyfar, job, other, msn, yahoo, userid) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)",
    GetSQLValueString($_POST, "text"),
    GetSQLValueString($_SESSION, "text"),
    GetSQLValueString($_POST, "text"),
    GetSQLValueString($_POST, "text"),
    GetSQLValueString($_POST, "text"),
    GetSQLValueString($_POST, "int"),
    GetSQLValueString($_POST, "int"),
    GetSQLValueString($_POST, "int"),
    GetSQLValueString($_POST, "text"),
    GetSQLValueString($_POST, "text"),
    GetSQLValueString($_POST, "text"),
    GetSQLValueString($_POST, "text"),
    GetSQLValueString($_POST, "text"),
    GetSQLValueString($_POST, "text"),
    GetSQLValueString($_POST, "text"),
    GetSQLValueString($_POST, "text"),
    GetSQLValueString($_POST, "text"),
    GetSQLValueString($newuserid, "text"));

    mysql_select_db($database_vv, $vv);
    $Result1 = mysql_query($insertSQL, $vv) or die(mysql_error());
    }

    $colname_dbupdate = "-1";
    if (isset($_POST)) {
    $colname_dbupdate = $_POST;
    }
    mysql_select_db($database_vv, $vv);
    $query_dbupdate = sprintf("SELECT * FROM guest WHERE id = %s", GetSQLValueString($colname_dbupdate, "int"));
    $dbupdate = mysql_query($query_dbupdate, $vv) or die(mysql_error());
    $row_dbupdate = mysql_fetch_assoc($dbupdate);
    $totalRows_dbupdate = mysql_num_rows($dbupdate);

    mysql_select_db($database_vv, $vv);
    $query_dbaccount = "SELECT * FROM account WHERE userid = $newuserid";
    $dbaccount = mysql_query($query_dbaccount, $vv) or die(mysql_error());
    $row_dbaccount = mysql_fetch_assoc($dbaccount);
    $totalRows_dbaccount = mysql_num_rows($dbaccount);
    ?>

  • edited 四月 2014
    1.
    if ($tempid==$maxuserid)
    {
    $tempid='0';
    }
    ===
    不是 $tempid='0'; 是 $tempid='';
    輪流分配的訣竅1

    2.
    $query_sSql3 = "select userid as newuserid from account
    where userid> $tempid
    order by userid limit 0,1";
    ===
    不是 where userid> $tempid ;是 where userid>'".$tempid."'
    輪流分配的訣竅2

    3.
    $uid=$maxid+1;
    $uid 完全沒用到

    4.
    $query_dbaccount = "SELECT * FROM account WHERE userid = $newuserid";
    應該是
    $query_dbaccount = "SELECT * FROM account WHERE userid = '".$newuserid."'";

    5.
    本版討論的是"多個訂單輪流分配給多個人",與"但目前有一定的機率客戶名單會重覆" 有關嗎?

    若"但目前有一定的機率客戶名單會重覆" 是另一個問題,建議另開一個討論.

    "我是有在想,如果在寫入的時候,檢查mysql中是否有相同姓名,如果有就不要寫入".
    若是在'寫入的時候'檢查,那代表 user 浪費時間多填寫一次;建議在填寫前先檢查.
  • roger wrote: »
    1.
    if ($tempid==$maxuserid)
    {
    $tempid='0';

    "我是有在想,如果在寫入的時候,檢查mysql中是否有相同姓名,如果有就不要寫入".
    若是在'寫入的時候'檢查,那代表 user 浪費時間多填寫一次;建議在填寫前先檢查.

    感謝,來研究看看
  • 多個訂單輪流分配給多個人 => 多個訂單 , 輪流分配給 ,多個人
    1.訂單表 主key =>訂單號 oredr_id
    2.處理者名單 主key = > 雇員id us_id
    3.訂單處理表 主key => 訂單號 oredr_id , 雇員id us_id

    依據上面三張,邏輯是
    1.取出一筆未分配訂單
    2.取出處理者名單,並根據需要排序(能力,序號,年資......)
    3.取出最新一筆訂單處理表,找到 處理者
    4.根據 step 2 資料,找到下一位處理者
    5.寫入訂單處理表
  • 對於不重複分配這種應用
    如果環境允許
    建議使用innodb lock row的方式去操作
    這樣才能保證不會重複,"先檢查"這種作法,在高併發的環境下肯定會出問題
    但如果client不多的話就無所謂了
  • 把訂單處理表主key 設成 訂單號 id and 處理者 id
    這樣在資料庫面只要是重複就無法寫入
  • 感謝以上各位大大的建議,關於innodb lock row我去google研究看看。還是說有什麼書籍可以學習的嗎?
  • edited 六月 2014
    $query_sSql2 = "select userid as tempid from guest
    where id=(select max(id) from guest)";//在客戶表中,從id最大的那列,在userid這欄,
    $sSql2 = mysql_query($query_sSql2, $vv) or die(mysql_error()); 
    $s2_record =mysql_fetch_array($sSql2);
    $tempid=$s2_record[tempid]; //代入最大id那列,userid的數值
    

    請問,有沒有辦法限定找到,userid數值不為空的呢?(也就是,只找到userid有數值的那1列;因為有可能會遇到userid為空的時候)
    感謝~
  • guest 的 userid 若未建任何資料時會是空的,這時應該彈出畫面告訴使用者,
    而且中斷程式不讓使用者進行分配的動作

    guest 的 userid 若有建資料時應該不會有一筆是空的 userid,
    若發生此狀況時應檢查建立 userid 到 guest 的那支程式,為何會發生此種狀況
  • roger wrote: »
    guest 的 userid 若未建任何資料時會是空的,這時應該彈出畫面告訴使用者,
    而且中斷程式不讓使用者進行分配的動作

    guest 的 userid 若有建資料時應該不會有一筆是空的 userid,
    若發生此狀況時應檢查建立 userid 到 guest 的那支程式,為何會發生此種狀況
    感謝ROGER大
    會空是因為我刻意要留空的啦!因為有時候有些名單不想讓它排入輪流中,所以才會有這的需求。感謝

  • 有些名單不想讓它排入輪流中
    解法:
    guest 多開一個欄位 aa,預設值填 0
    不排入的填 1

    原本 select .... from guest
    多加一個條件 aa=0
  • roger wrote: »
    有些名單不想讓它排入輪流中
    解法:
    guest 多開一個欄位 aa,預設值填 0
    不排入的填 1

    原本 select .... from guest
    多加一個條件 aa=0
    哇,這個方法真的太好了
  • edited 六月 2014
    請問,當改成以下時 (0後面的\ 不知道為什麼會跑出來,但原本的我是沒有\)
    $query_sSql2 = "select userid as tempid from guest
    where id=(select max(id) from guest) and aa=0"
    $sSql2 = mysql_query($query_sSql2, $vv) or die(mysql_error()); 
    $s2_record =mysql_fetch_array($sSql2);//最大id的陣列元素
    $tempid=$s2_record[tempid]; //代入最大id那列,userid的數值
    
    遇到aa=1的時候,下一個填表的就會遇到
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'order by userid limit 0,1' at line 3
    
    請問這個有什麼方式可以解決呢?感謝!!
  • 我上面下的 sql:
    $sSql1='select max(userid) as maxuserid
    from usertb';

    $sSql2='select userid as tempid
    from potb
    where pono=(select max(pono) from potb)';

    $sSql3='select userid as newuserid
    from usertb
    where userid>"'.$tempid.'"
    order by userid limit 0,1';

    $sSql4='select IFNULL(max(pono),0) as maxpono
    from potb';

    $sSql5 = "insert into potb(pono,userid)
    values('$pono','$newuserid')";

    aa 欄位應該開在 usertb;所以要找有 from usertb 的sql
    $sSql1='select max(userid) as maxuserid
    from usertb';
    改成
    $sSql1='select max(userid) as maxuserid
    from usertb where aa=0';
    ===========================
    $sSql3='select userid as newuserid
    from usertb
    where userid>"'.$tempid.'"
    order by userid limit 0,1';
    改成

    $sSql3='select userid as newuserid
    from usertb
    where userid>"'.$tempid.'"
    and aa=0
    order by userid limit 0,1';
  • roger wrote: »
    我上面下的 sql:
    $sSql1='select max(userid) as maxuserid
    from usertb';

    $sSql2='select userid as tempid
    from potb
    where pono=(select max(pono) from potb)';

    $sSql3='select userid as newuserid
    from usertb
    where userid>"'.$tempid.'"
    order by userid limit 0,1';

    $sSql4='select IFNULL(max(pono),0) as maxpono
    from potb';

    $sSql5 = "insert into potb(pono,userid)
    values('$pono','$newuserid')";

    aa 欄位應該開在 usertb;所以要找有 from usertb 的sql
    $sSql1='select max(userid) as maxuserid
    from usertb';
    改成
    $sSql1='select max(userid) as maxuserid
    from usertb where aa=0';
    ===========================
    $sSql3='select userid as newuserid
    from usertb
    where userid>"'.$tempid.'"
    order by userid limit 0,1';
    改成

    $sSql3='select userid as newuserid
    from usertb
    where userid>"'.$tempid.'"
    and aa=0
    order by userid limit 0,1';

    R大,我想應該是我表達的太差了,所以您的回應跟我想的有點不太一樣,不知道是不是我哪部份理解錯了。
    我是希望,從"特定表單"寫入的資料,不要放在輪流名單potb中,可以只有給特定的usertb中的人看到。
    感謝~

  • 從"特定表單"寫入的資料,不要放在輪流名單potb中,可以只有給特定的usertb中的人看到。
    看無.

    舉例說明看看
  • @"
    在potb增加1欄為aa,0為要排入輪流,1為不要
    $sSql2='select userid as tempid
    from potb
    where pono=(select max(pono) from potb where aa=0)';
    
    感謝r大的啟發
Sign In or Register to comment.