CheckService.php 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. <?php
  2. namespace App\Service;
  3. use App\Model\InOutRecord;
  4. use App\Model\ProductInventory;
  5. use App\Model\PurchaseOrder;
  6. use App\Model\PurchaseOrderInfo;
  7. use App\Model\SalesOrder;
  8. use App\Model\Setting;
  9. use Illuminate\Support\Facades\DB;
  10. class CheckService extends Service
  11. {
  12. //审批操作对应的数值
  13. const one = 1; //收货
  14. const two = 2; //发货
  15. const three = 3; //采购单
  16. const four = 4; //销售订单
  17. const five = 5; //施工单
  18. //中文对照
  19. public $map = [
  20. self::one => '收货单',
  21. self::two => '发货单',
  22. self::three => '采购单',//确认后入库
  23. self::four => '销售订单',
  24. self::five => '施工单',
  25. ];
  26. //入库操作
  27. public static $in_opt = [
  28. self::three,
  29. ];
  30. //出库操作
  31. public static $out_opt = [
  32. self::five,
  33. ];
  34. const TYPE_ONE = 1;//通过
  35. const TYPE_TWO = 2;//不通过
  36. //单据操作
  37. public static $opt_case = [
  38. self::three => 'confirmPurchaseOrder',
  39. self::four => 'confirmSalesOrder',
  40. ];
  41. //单据库存流水
  42. public static $record = [
  43. self::three => 'recordPurchaseOrder',
  44. ];
  45. public function confirmPurchaseOrder($data){
  46. $model = PurchaseOrder::where('id',$data['id'])
  47. ->where('del_time',0)
  48. ->first();
  49. if(empty($model)) return [false, '采购订单不存在或已被删除'];
  50. if($model->state != PurchaseOrder::STATE_ZERO) return [false, '请确认采购订单状态,操作失败'];
  51. PurchaseOrder::where('del_time',0)->where('id',$data['id'])
  52. ->update(['state' => PurchaseOrder::STATE_ONE]);
  53. return [true, $model->toArray()];
  54. }
  55. public function recordPurchaseOrder($data, $order){
  56. $result = PurchaseOrderInfo::where('del_time',0)
  57. ->where('order_number',$order['order_number'])
  58. ->get()->toArray();
  59. if(empty($result)) return [false,'采购单产品信息不存在或已被删除'];
  60. $insert = [];
  61. foreach ($result as $value){
  62. if(isset($insert[$value['product_id']])){
  63. $insert[$value['product_id']]['number'] += $value['number'];
  64. }else{
  65. $insert[$value['product_id']] = [
  66. 'product_id' => $value['product_id'],
  67. 'number' => $value['number'],
  68. 'order_type' => PurchaseOrder::prefix
  69. ];
  70. }
  71. }
  72. $insert = array_values($insert);
  73. $bool = InOutRecord::insert($insert);
  74. if(! $bool) return [false,'流水写入失败'];
  75. return [true,''];
  76. }
  77. public function confirmSalesOrder($data){
  78. $model = SalesOrder::where('id',$data['id'])->where('del_time',0)->first();
  79. if(empty($model)) return [false, '销售订单不存在或已被删除'];
  80. if($data['type'] == self::TYPE_ONE){
  81. if($model->state == SalesOrder::State_one) return [false,'已锁定,操作失败!'];
  82. $model->state = SalesOrder::State_one;
  83. }else{
  84. if($model->state == SalesOrder::State_zero) return [false,'未锁定,操作失败!'];
  85. $model->state = SalesOrder::State_zero;
  86. }
  87. $model->save();
  88. return [true,$model->toArray()];
  89. }
  90. public function checkAll($data,$user){
  91. if(empty($data['id']) || empty($data['opt_case']) || empty($data['type'])) return [false,'必传参数不能为空或者参数值错误!'];
  92. //具体方法
  93. $function = self::$opt_case[$data['opt_case']] ?? "";
  94. $record = self::$record[$data['opt_case']] ?? "";
  95. try{
  96. DB::beginTransaction();
  97. list($bool,$msg) = $this->$function($data);
  98. if(! $bool){
  99. DB::rollBack();
  100. return [false, $msg];
  101. }
  102. $order = $msg;
  103. if($record) {
  104. //流水
  105. $bool = $this->$record($data, $order);
  106. if(! $bool) {
  107. DB::rollBack();
  108. return [false, $msg];
  109. }
  110. //库存
  111. $bool = $this->changeInventory($data, $order);
  112. if(! $bool) {
  113. DB::rollBack();
  114. return [false, $msg];
  115. }
  116. }
  117. DB::commit();
  118. return [true, ''];
  119. }catch (\Throwable $exception){
  120. DB::rollBack();
  121. return [false, $exception->getMessage()];
  122. }
  123. }
  124. //更新库存
  125. public function changeInventory($data,$order){
  126. $number_symbol = ">";
  127. if(in_array($data['opt_case'],self::$in_opt)){
  128. $number_symbol = ">";
  129. }elseif (in_array($data['opt_case'],self::$out_opt)){
  130. $number_symbol = "<";
  131. }
  132. //获取单据最新数据时间 正常审核的数据
  133. $latest = InOutRecord::where('del_time',0)
  134. ->where('order_number',$order['order_number'])
  135. ->where('number',$number_symbol,0)
  136. ->select('crt_time')
  137. ->orderBy('crt_time', 'desc')
  138. ->first();
  139. $model = InOutRecord::where('del_time',0)
  140. ->where('order_number',$order['order_number'])
  141. ->where('number',$number_symbol,0)
  142. ->select(DB::raw("sum(number) as number"),'crt_time','product_id');
  143. if(! empty($latest)) {
  144. $t = $latest->toArray();
  145. $model->where('crt_time',$t['crt_time']);
  146. }
  147. $result = $model->get()->toArray();
  148. if (empty($result)) return [false,'流水记录不存在'];
  149. //是否锁定
  150. $setting_map = Setting::where('setting_name','lock_number')
  151. ->pluck('setting_value','setting_name')->toArray();
  152. foreach ($result as $key => $value){
  153. $m = ProductInventory::where('product_id',$value['product_id'])
  154. ->select('product_id','number')
  155. ->first();
  156. if(empty($m)){
  157. ProductInventory::insert($result[$key]);
  158. }else{
  159. $lock_number = 0;
  160. if(! empty($setting_map['lock_number']) && in_array($data['opt_case'],self::$out_opt)) $lock_number = $value['number'];
  161. ProductInventory::where('product_id',$m->product_id)
  162. ->lockForUpdate()
  163. ->update([
  164. 'number' => DB::raw('number + ('. $value['number'] . ')'),
  165. 'lock_number' => DB::raw('lock_number + ('. $lock_number . ')')
  166. ]);
  167. }
  168. }
  169. return [true,''];
  170. }
  171. }