GoodStockInfo.php 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. <?php
  2. declare (strict_types = 1);
  3. namespace app\admin\model;
  4. use think\Exception;
  5. use think\Model;
  6. /**
  7. * @mixin \think\Model
  8. */
  9. class GoodStockInfo extends Model
  10. {
  11. /**
  12. * @param int $stockid 仓库库存id
  13. * @param string $bn bn编号
  14. * @param int $num bn数量
  15. * @param float $origin_price 采购成本价
  16. * @return bool 入库bn库存数新建 或退回bn库存数
  17. */
  18. static function AddBn(int $stockid,string $bn,int $num,float $origin_price=0){
  19. $data=self::where(["stockid"=>$stockid,"bnCode"=>$bn])->findOrEmpty()->toArray();
  20. if(empty($data)){
  21. $data=[
  22. "stockid"=>$stockid,
  23. "bnCode"=>$bn,
  24. "total_num"=>$num,
  25. "used_num"=>0,
  26. "balance_num"=>$num,
  27. "origin_price"=>$origin_price,
  28. "addtime"=>date("Y-m-d H:i:s"),
  29. "updatetime"=>date("Y-m-d H:i:s")
  30. ];
  31. $result=self::insert($data);
  32. }else{
  33. $total_num = $data["balance_num"]+$num;
  34. if($total_num> $data["total_num"]) throw new Exception("批次入库数量超过总数",1006);
  35. $temp=[];
  36. $temp["balance_num"]=$num;
  37. $temp["updatetime"]=date("Y-m-d H:i:s");
  38. $result=self::update($temp,$data);
  39. }
  40. return $result;
  41. }
  42. /**
  43. * @param int $stockid
  44. * @param int $num
  45. * @return array 库存品下单消耗bn库存数
  46. * @throws \think\Exception
  47. * @throws \think\db\exception\DataNotFoundException
  48. * @throws \think\db\exception\DbException
  49. * @throws \think\db\exception\ModelNotFoundException
  50. */
  51. static function SaleBn(int $stockid,int $num){
  52. $arr = self::where([["stockid","=",$stockid],["balance_num",">",0]])->select()->toArray();
  53. if(empty($arr)) throw new Exception("库存批次数量不足","1006");
  54. $list=[];
  55. foreach ($arr as $item) {
  56. if($num<=0) break;
  57. $temp=[];
  58. $update=[];
  59. if($item['balance_num']<=$num){
  60. $update['balance_num'] =0;
  61. $update['used_num']= $item['used_num']+$item['balance_num'];
  62. $num-=$item['balance_num'];
  63. $update['updatetime'] =date("Y-m-d H:i:s");
  64. $temp=["bnCode"=>$item['bnCode'],"num"=>$item['balance_num'],"origin_price"=>$item["origin_price"]];
  65. }else{
  66. $update['balance_num']=$item['balance_num']-$num;
  67. $update['used_num']=$item['used_num']+$num;
  68. $num=0;
  69. $update['updatetime'] =date("Y-m-d H:i:s");
  70. $temp=["bnCode"=>$item['bnCode'],"num"=>$num,"origin_price"=>$item["origin_price"]];
  71. }
  72. self::update($update,$item);
  73. $list[]=$temp;
  74. }
  75. return $list;
  76. }
  77. /**
  78. * @param int $stockid
  79. * @param string $bn
  80. * @param int $num
  81. * @return bool 盘点修改bn仓库库存数
  82. * @throws \think\Exception
  83. */
  84. static function CheckBn(int $stockid,string $bn,int $num){
  85. $data=self::where(["stockid"=>$stockid,"bnCode"=>$bn])->findOrEmpty()->toArray();
  86. if(empty($data)) throw new Exception("未找到Bn库存数据",1006);
  87. $update=[];
  88. $update["balance_num"]=$num;
  89. $update["total_num"]=$data["used_num"]+$num;
  90. $update["updatetime"]=date("Y-m-d H:i:s");
  91. return self::update($update,$data);
  92. }
  93. /**
  94. * @param string $orderCode
  95. * @param int $stockid
  96. * @param int $num
  97. * @return int
  98. * @throws \think\Exception
  99. * @throws \think\db\exception\DataNotFoundException
  100. * @throws \think\db\exception\DbException
  101. * @throws \think\db\exception\ModelNotFoundException
  102. */
  103. static function OrderBn(string $orderCode,int $stockid,int $num){
  104. $bnArr=self::SaleBn($stockid,$num);
  105. if(empty($bnArr)) throw new Exception("未找到Bn库存数据",1006);
  106. $ordBn=[];
  107. foreach ($bnArr as $value){
  108. $saleBn=[
  109. "orderCode"=>$orderCode,
  110. "bnCode"=>$value['bnCode'],
  111. "stockid"=>$stockid,
  112. "num"=>$value['num'],
  113. "origin_price"=>$value['origin_price'],
  114. "addtime"=>date("Y-m-d H:i:s"),
  115. "updatetime"=>date("Y-m-d H:i:s"),
  116. ];
  117. $ordBn[]=$saleBn;
  118. }
  119. return self::name("sale_info")->insertAll($ordBn);
  120. }
  121. /**
  122. * @param string $returnCode
  123. * @param int $salebnid
  124. * @param int $num
  125. * @param int $type
  126. * @return bool
  127. * @throws \think\Exception
  128. */
  129. static function ReturnBn(string $returnCode,int $salebnid,int $num,int $type=1){
  130. $sabn=self::name("sale_info")->where(['id'=>$salebnid])->findOrEmpty()->toArray();
  131. if(empty($sabn))throw new Exception("未找到Bn订单数据",1006);
  132. $return=[
  133. "returnCode"=>$returnCode,
  134. "type"=>$type,
  135. "orderCode"=>$sabn['orderCode'],
  136. "bnCode"=>$sabn['bnCode'],
  137. "origin_price"=>$sabn['origin_price'],
  138. "num"=>$num,
  139. "addtime"=>date("Y-m-d H:i:s")
  140. ];
  141. return self::name("return_info")->insert($return);
  142. }
  143. /** 调拨专用 需要注意bn总数变化
  144. * @param int $stockid 库存id
  145. * @param string $bnCode bn编号
  146. * @param int $num 库存数量
  147. * @param int $flag 操作类型 0 添加库存 1 减少库存
  148. * @param float|int $origin_price 成本价
  149. * @return bool
  150. * @throws \think\Exception
  151. */
  152. static function bnStock(int $stockid,string $bnCode,int $num,int $flag=0,float $origin_price=0){
  153. $stock =self::where(["stockid"=>$stockid,"bnCode"=>$bnCode])->lock(true)->findOrEmpty()->toArray();
  154. $update=[];
  155. if($flag==1) {
  156. if(empty($stock)|| $stock['balance_num']< $num)
  157. throw new Exception("bn库存数不足",1006);
  158. else{
  159. $update['balance_num']=$stock['balance_num']-$num;
  160. $update['total_num']=$stock['total_num']-$num;
  161. $update['updatetime']=date("Y-m-d H:i:s");
  162. }
  163. }else{
  164. if (empty($stock)){
  165. $update=[
  166. "bnCode"=>$bnCode,
  167. "stockid"=>$stockid,
  168. "total_num"=>$num,
  169. "used_num"=>0,
  170. "balance_num"=>$num,
  171. "origin_price"=>$origin_price,
  172. "addtime"=>date("Y-m-d H:i:s"),
  173. "updatetime"=>date("Y-m-d H:i:s")
  174. ];
  175. }else{
  176. $update['balance_num']=$stock['balance_num']+$num;
  177. $update['total_num']=$stock['total_num']+$num;
  178. $update['updatetime']=date("Y-m-d H:i:s");
  179. }
  180. }
  181. return empty($stock)? self::insert($update): self::update($update,$stock);
  182. }
  183. }