Просмотр исходного кода

上架逻辑更改,拆分任务时跟踪号保持不变,优化查询,增加行级锁

Zhouzhendong 4 лет назад
Родитель
Сommit
59110624df
2 измененных файлов с 48 добавлено и 18 удалено
  1. 11 1
      app/Http/Controllers/TestController.php
  2. 37 17
      app/Services/StorageService.php

+ 11 - 1
app/Http/Controllers/TestController.php

@@ -147,7 +147,17 @@ class TestController extends Controller
     }
     public function test()
     {
-        dd(explode("/","/register"));
+        $c = "name";
+        DB::transaction(function (){
+            $unit = Unit::query()->find(1);
+            if ($unit->update(["name"=>"tttt3"])) {
+                throw new \Exception("余量错误");
+                return false;
+            }
+            dd(2);
+            return true;
+        });
+        dd(Unit::query()->find(1));
     }
     public function orderCreateBill()
     {

+ 37 - 17
app/Services/StorageService.php

@@ -334,16 +334,16 @@ sql;
         try {
             $columns = '';
             $values = '';
-            $seq = 0;
             foreach ($task as $key=>$val){
                 if (Str::upper($key)=='TASKID_SEQUENCE') {
                     $taskMax = DB::connection("oracle")->selectOne(DB::raw("select MAX(TASKID_SEQUENCE) maxseq from TSK_TASKLISTS where taskid = ?"),[$task->taskid]);
                     $val = $taskMax->maxseq + 1;
-                    $seq = $val;
                 }
                 if (Str::upper($key)=='FMQTY' || Str::upper($key)=='FMQTY_EACH'
-                    || Str::upper($key)=='PLANTOQTY' || Str::upper($key)=='PLANTOQTY_EACH')$val = $amount;
-                if (Str::upper($key)=='FMID')$val = "WAS".$val;
+                    || Str::upper($key)=='PLANTOQTY' || Str::upper($key)=='PLANTOQTY_EACH'){
+                    $val -= $amount;
+                    $task->$key = $amount;
+                }
                 $columns .= $key.",";
                 $values .= $this->valFormat($val) .",";
             }
@@ -353,10 +353,10 @@ sql;
     INSERT INTO TSK_TASKLISTS({$columns}) VALUES({$values})
 sql;
             DB::connection("oracle")->insert(DB::raw($sql));
-            DB::connection("oracle")->update(DB::raw("UPDATE TSK_TASKLISTS SET FMQTY = FMQTY-?,FMQTY_EACH = FMQTY_EACH-?,PLANTOQTY=PLANTOQTY-?,PLANTOQTY_EACH=PLANTOQTY_EACH-? WHERE TASKID = ? AND TASKID_SEQUENCE = ?"),[
+            DB::connection("oracle")->update(DB::raw("UPDATE TSK_TASKLISTS SET FMQTY = ?,FMQTY_EACH = ?,PLANTOQTY=?,PLANTOQTY_EACH=? WHERE TASKID = ? AND TASKID_SEQUENCE = ?"),[
                 $amount,$amount,$amount,$amount,$task->taskid,$task->taskid_sequence
             ]);
-            $invs = DB::connection("oracle")->select(DB::raw("SELECT * FROM INV_LOT_LOC_ID WHERE LOTNUM = ? AND LOCATIONID IN (?,?) AND TRACEID = ?"),[
+            /*$invs = DB::connection("oracle")->select(DB::raw("SELECT * FROM INV_LOT_LOC_ID WHERE LOTNUM = ? AND LOCATIONID IN (?,?) AND TRACEID = ?"),[
                 $task->fmlotnum,$task->fmlocation,$task->plantolocation,$task->fmid
             ]);
             foreach ($invs as $inv){
@@ -392,13 +392,14 @@ sql;
                     $values = mb_substr($values,0,-1);
                     DB::connection("oracle")->insert(DB::raw("INSERT INTO inv_lot_loc_id({$columns}) VALUES({$values})"));
                 }
-            }
+            }*/
             DB::connection("oracle")->commit();
         }catch(\Exception $e) {
             DB::connection("oracle")->rollBack();
             throw new \Exception("拆分任务失败:".$e->getMessage());
         }
-        return DB::connection("oracle")->selectOne(DB::raw("SELECT * FROM TSK_TASKLISTS WHERE TASKID = ? AND TASKID_SEQUENCE = ?"),[$task->taskid,$seq]);
+        //return DB::connection("oracle")->selectOne(DB::raw("SELECT * FROM TSK_TASKLISTS WHERE TASKID = ? AND TASKID_SEQUENCE = ?"),[$task->taskid,$seq]);
+        return $task;
     }
 
     /**
@@ -441,16 +442,26 @@ sql;
     {
         if (!$task->taskid)return false;//ASN单无此入库信息,禁止上架
         $amount = (int)$task->fmqty;
-        $sql = <<<sql
-SELECT * FROM inv_lot_loc_id  WHERE lotnum = ? AND traceid = ? AND customerid= ?  and sku = ? and qty = {$amount}
+        $db = DB::connection("oracle");
+        $db->transaction(function ()use($db,$amount,$ide,$task,&$who){
+            $sql = <<<sql
+SELECT * FROM inv_lot_loc_id  WHERE lotnum = ? AND traceid = ? AND locationid = ? AND customerid= ?  and sku = ? and qtypa >= {$amount} FOR UPDATE
 sql;
-        $inv = DB::connection("oracle")->selectOne(DB::raw($sql),[$task->fmlotnum,$task->fmid,$task->customerid,$task->sku]);
-        if (!$inv)return false;//余量与入库不符
-        DB::connection("oracle")->transaction(function ()use($inv,$amount,$ide,$task,&$who){
-            $db = DB::connection("oracle");
-            $db->delete(DB::raw("DELETE FROM inv_lot_loc_id WHERE lotnum = ? AND traceid = ? AND traceid != '*'"),[
-                $inv->lotnum,$inv->traceid
+            $inv = $db->selectOne(DB::raw($sql),[$task->plantolotnum,$task->plantoid,$task->plantolocation,$task->customerid,$task->sku]);
+            if (!$inv)return false;//余量与入库不符
+
+            $inv1 = $db->update(DB::raw("UPDATE inv_lot_loc_id SET qty = qty - ? WHERE LOTNUM = ? AND LOCATIONID = ? AND TRACEID = ? AND traceid != '*'"),[
+                $amount,$task->fmlotnum,$task->fmlocation,$task->fmid
             ]);
+            $sql = "UPDATE inv_lot_loc_id SET qty = qtypa - ?";
+            if ($inv->qtypa==$amount)$sql .= ",LOCATIONID = '{$ide}'";
+            $inv2 = $db->update(DB::raw($sql." WHERE LOTNUM = ? AND LOCATIONID = ? AND TRACEID = ? AND traceid != '*'"),[
+                $amount,$task->plantolotnum,$task->plantolocation,$task->plantoid
+            ]);
+            if ($inv1!=1 || $inv2!=1){
+                $db->rollBack();
+                return false;//库存余量错误
+            }
             $invHistory = $db->selectOne(DB::raw("SELECT * FROM inv_lot_loc_id WHERE lotnum = ? AND locationid = ? AND customerid = ? AND sku = ? AND traceid = '*' FOR UPDATE"),[
                 $inv->lotnum,$ide,$inv->customerid,$inv->sku
             ]);
@@ -477,7 +488,7 @@ sql;
             ]);
             $this->setTrNumber($max);
             $sql = <<<sql
-update TSK_TASKLISTS set TASKPROCESS = '99',REASONCODE = 'OK',PLANTOLOCATION = ?,PLANLOGICALTOSEQUENCE = ?,FMID = '*',
+update TSK_TASKLISTS set TASKPROCESS = '99',REASONCODE = 'OK',PLANTOLOCATION = ?,PLANLOGICALTOSEQUENCE = ?,
 COMPLETED_TRANSACTIONID = ?,OPENWHO = ?,OPENTIME = TO_DATE(?,'yyyy-mm-dd hh24:mi:ss'),
  CLOSEWHO = ?,CLOSETIME = ?,EDITTIME = ?,EDITWHO = ?
  where taskid = ? AND TASKID_SEQUENCE = ?
@@ -487,6 +498,7 @@ sql;
             ]);
             $task->who = $who;
             $this->checkAsn($task);
+            return true;
         });
         return true;
     }
@@ -509,6 +521,14 @@ SQL;
             [date("Y-m-d H:i:s"),$task->who,$task->docno]);
         DB::connection("oracle")->update(DB::raw("UPDATE DOC_ASN_DETAILS SET linestatus = '99',edittime = TO_DATE(?,'yyyy-mm-dd hh24:mi:ss'),editwho = ? WHERE asnno = ?"),
             [date("Y-m-d H:i:s"),$task->who,$task->docno]);
+        $sql = <<<SQL
+DELETE FROM INV_LOT_LOC_ID WHERE ((LOTNUM,LOCATIONID,TRACEID) IN
+(SELECT PLANTOLOTNUM,PLANTOLOCATION,PLANTOID FROM TSK_TASKLISTS WHERE DOCNO = ? AND DOCTYPE = 'ASN' AND TASKTYPE = 'PA' AND TASKPROCESS = '99') OR
+(LOTNUM,LOCATIONID,TRACEID) IN
+(SELECT FMLOTNUM,FMLOCATION,FMID FROM TSK_TASKLISTS WHERE DOCNO = ? AND DOCTYPE = 'ASN' AND TASKTYPE = 'PA' AND TASKPROCESS = '99'))
+AND QTY = 0 AND QTYPA = 0
+SQL;
+        DB::connection("oracle")->delete(DB::raw($sql),[$task->docno,$task->docno]);
     }
     /**
      * put cache rack box to warehousing(将缓存架料箱入库)