StorageController.php 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Components\AsyncResponse;
  4. use Illuminate\Support\Facades\Auth;
  5. use Illuminate\Support\Facades\DB;
  6. class StorageController extends Controller
  7. {
  8. use AsyncResponse;
  9. public function putShelf()
  10. {
  11. $asn = \request("asn");
  12. $ide = \request("ide");
  13. $barCode = \request("barCode");
  14. $amount = \request("amount");
  15. if (!$asn || !$ide || !$barCode || !$amount)$this->error("信息不完整");
  16. $sql = <<<sql
  17. SELECT * FROM DOC_ASN_DETAILS LEFT JOIN BAS_SKU ON DOC_ASN_DETAILS.CUSTOMERID = BAS_SKU.CUSTOMERID AND DOC_ASN_DETAILS.SKU = BAS_SKU.SKU
  18. WHERE asnno = ? AND (ALTERNATE_SKU1 = ? OR ALTERNATE_SKU2 = ?)
  19. sql;
  20. $asn = DB::connection("oracle")->selectOne(DB::raw($sql),[$asn,$barCode,$barCode]);
  21. if (!$asn || $asn->receivedqty_each<$amount)$this->error("ASN不存在或数量异常");
  22. $sql = <<<sql
  23. SELECT fmlotnum,fmlocation,toid FROM ACT_TRANSACTION_LOG WHERE transactiontype = 'IN' AND fmcustomerid = ? AND fmsku = ? AND docno = ? AND doclineno = ? AND doctype = 'ASN' AND pa_flag = 'Y'
  24. sql;
  25. $act = DB::connection("oracle")->selectOne(DB::raw($sql),[$asn->customerid,$asn->sku,$asn->asnno,$asn->asnlineno]);
  26. if (!$act)$this->error("没有入库记录");
  27. $sql = <<<sql
  28. SELECT * FROM inv_lot_loc_id WHERE lotnum = ? AND traceid = ? AND customerid= ? and sku = ?
  29. sql;
  30. $inv = DB::connection("oracle")->select(DB::raw($sql),[$act->fmlotnum,$act->toid,$asn->customerid,$asn->sku]);
  31. if (!$inv)$this->error("余量与入库不符");
  32. DB::transaction(function ()use($inv,$amount,$ide,$asn,$act){
  33. $db = DB::connection("oracle");
  34. $qty = $amount;
  35. foreach ($inv as $in){
  36. if ($qty==0)break;
  37. if ($in->qty > $qty){
  38. $db->update(DB::raw("update inv_lot_loc_id set qty = qty-?,qtymvout = qty-? where lotnum = ? and locationid = ? and traceid = ?"),[
  39. $qty,$qty,$in->lotnum,$in->locationid,$in->traceid
  40. ]);//TODO 遗留问题:对应生成分配库位上架数量未被变更
  41. $in->qty = $in->qty-$qty;
  42. $qty = 0;
  43. }else{
  44. $db->delete(DB::raw("DELETE FROM inv_lot_loc_id WHERE lotnum = ? and locationid = ? and traceid = ?"),[
  45. $in->lotnum,$in->locationid,$in->traceid
  46. ]);
  47. $qty = $qty-$in->qty;
  48. }
  49. }
  50. if ($qty!=0){
  51. $db->rollBack();
  52. $this->error("上架数量与入库数量不符");
  53. }
  54. $db->delete(DB::raw("DELETE FROM inv_lot_loc_id WHERE lotnum = ? AND traceid = ? AND traceid != '*'"),[
  55. $inv[0]->lotnum,$inv[0]->traceid
  56. ]);
  57. $inv = $db->selectOne(DB::raw("SELECT * FROM inv_lot_loc_id WHERE lotnum = ? AND locationid = ? AND customerid = ? AND sku = ? AND traceid = '*' FOR UPDATE"),[
  58. $inv[0]->lotnum,$ide,$inv[0]->customerid,$inv[0]->sku
  59. ]);
  60. $who = 'WAS'.(Auth::user() ? '-'.Auth::user()["name"] : '');
  61. if ($inv)$db->update(DB::raw("UPDATE inv_lot_loc_id SET qty = qty+? WHERE lotnum = ? AND locationid = ? AND traceid = '*'"),[
  62. (int)$amount,$inv[0]->lotnum,$ide
  63. ]);
  64. else $db->insert(DB::raw("INSERT INTO inv_lot_loc_id VALUES(?,?,'*',?,?,?,0,0,0,0,0,0,TO_DATE(?,'yyyy-mm-dd hh24:mi:ss'),?,TO_DATE(?,'yyyy-mm-dd hh24:mi:ss'),?,0,0,0,0,0,'*',0,null)"),[
  65. $inv[0]->lotnum,$ide,$inv[0]->customerid,$inv[0]->sku,$amount,date("Y-m-d H:i:s"),$who,
  66. date("Y-m-d H:i:s"),$who
  67. ]);
  68. $sql = <<<sql
  69. INSERT INTO ACT_TRANSACTION_LOG VALUES(?,'PA',?,?,?,?,'ASN',?,?,?,?,?,?,?,?,TO_DATE(?,'yyyy-mm-dd hh24:mi:ss')),?,
  70. TO_DATE(?,'yyyy-mm-dd hh24:mi:ss')),?,0,0,0,0,TO_DATE(?,'yyyy-mm-dd hh24:mi:ss'),?,?,null,null,null,'*',?,?,?,?,?,?,?,
  71. ?,?,?,?,?,'N',null,?,?,?,?,?,?,?,null,null)
  72. sql;
  73. $db->insert(DB::raw($sql),[
  74. 'WA'.date('ymdHis').substr(\request("asn"),-2).rand(0,9),$asn->customerid,$asn->sku,
  75. $asn->asnno,$asn->asnlineno,$inv[0]->lotnum,$act->fmlocation,$act->toid,$asn->packid,$asn->uom,$amount,$amount,$act->status,date("Y-m-d H:i:s"),$who,
  76. date("Y-m-d H:i:s"),$who,date("Y-m-d H:i:s"),$asn->customerid,$asn->sku,$ide,$who,$asn->packid,$asn->uom,$amount,$amount,$inv[0]->lotnum,
  77. 'QC_TASKID',$act->qc_sequence,$act->qc_flag,'*',$act->pa_sequence,$act->warehouseid,$act->userdefine1,$act->userdefine2,
  78. $act->userdefine3,$act->userdefine4,$act->userdefine5,$act->edisendflag
  79. ]);
  80. });
  81. //成功后应去修改ASN状态及数量
  82. }
  83. }