CheckService.php 8.1 KB

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