ComonQrd.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290
  1. <?php
  2. declare (strict_types = 1);
  3. namespace app\admin\listener;
  4. use app\admin\model\Assoc;use app\admin\model\InvoiceInfo;use app\admin\model\InvoicePay;use app\admin\model\InvoicePool;use app\admin\model\InvoiceTicket;use app\admin\model\Pay;use app\admin\model\PayInfo;use app\admin\model\PayInvoice;use app\admin\model\QrdInfo;
  5. class ComonQrd
  6. {
  7. protected function checkPay($data){
  8. $payinfo = Pay::where('payNo',$data['payNo'])->findOrEmpty();
  9. if($payinfo->isEmpty()) return;
  10. if($payinfo->is_comon!=1)return;
  11. $this->CheckComonOrder($payinfo);
  12. }
  13. public function CheckComonOrder($payinfo){
  14. if($payinfo->status==3||$payinfo->status==4 ){
  15. PayInfo::alias('a')
  16. ->leftJoin('ComonOrder b','a.cgdNo=b.cgdNo')
  17. ->where(['payNo'=>$payinfo->payNo,'is_del'=>0,'a.status'=>0])
  18. ->update(['b.status'=>0]);
  19. }else{
  20. if($payinfo->inv_status==3 &&$payinfo->pay_status==3){
  21. PayInfo::alias('a')
  22. ->leftJoin('ComonOrder b','a.cgdNo=b.cgdNo')
  23. ->where(['payNo'=>$payinfo->payNo,'is_del'=>0,'a.status'=>1])
  24. ->update(["b.status"=>2]);
  25. }elseif($payinfo->inv_status!=3|| $payinfo->pay_status!=3){
  26. PayInfo::alias('a')
  27. ->leftJoin('ComonOrder b','a.cgdNo=b.cgdNo')
  28. ->where(['payNo'=>$payinfo->payNo,'is_del'=>0,'a.status'=>1])
  29. ->update(['b.status'=>1]);
  30. }
  31. }
  32. }
  33. /**
  34. * 事件监听处理
  35. * @return mixed
  36. */
  37. public function handle($event)
  38. {
  39. // if($event['type']=="pay")$this->payComon($event);
  40. if($event['type']=="inv")$this->InvToPay($event);
  41. if($event['type']=="rinv")$this->InvToPay($event,false);
  42. // if($event['type']=="check")$this->checkPay($event);
  43. }
  44. public function InvToPay($data,$bool=True){
  45. $invinfo =InvoicePool::where(['invNo'=>$data['invNo']])->findOrEmpty();
  46. if($invinfo->isEmpty())return;
  47. if($bool){
  48. if($invinfo->status!=4 ||$invinfo->is_comon!=1 )return;
  49. $assoc_status=2;
  50. }else{
  51. $assoc_status=3;
  52. if(in_array($invinfo->status,[5,6,7,8,9])||$invinfo->is_comon!=1 )return;
  53. }
  54. $assoc = Assoc::where(["viceCode"=>$data['invNo'],"status"=>$assoc_status,"is_del"=>0,"type"=>1])->select();
  55. if($assoc->isEmpty()) return;
  56. $orderArr = QrdInfo::whereIn("sequenceNo",array_column($assoc->toArray(),"orderCode"))->select();
  57. if($orderArr->isEmpty())return;
  58. $payArr=array_column($assoc->toArray(),"cancel_fee","orderCode");
  59. $tag=[];
  60. $qrdSave=[];
  61. foreach ($orderArr as $item){
  62. if(!isset($payArr[$item->sequenceNo]))continue;
  63. $tag_temp=[
  64. 'code'=>$item->sequenceNo,
  65. 'tag_id'=>11,
  66. 'creater'=>'system',
  67. 'createrid'=>0,
  68. 'tag_fee'=>0,
  69. 'tag_img'=>'',
  70. 'status'=>$bool?1:0
  71. ];
  72. $qrd=[
  73. 'id'=>$item->id,
  74. 'wpay_fee'=>$item->wpay_fee,
  75. 'apay_fee'=>$item->apay_fee,
  76. 'pay_status'=>$item->pay_status,
  77. 'pay_tag_fee'=>$item->pay_tag_fee,
  78. 'pay_tag' => 1
  79. ];
  80. if($bool){
  81. if($item->wpay_fee>$payArr[$item->sequenceNo]){
  82. $tag_temp['tag_fee']= $payArr[$item->sequenceNo];
  83. $qrd['pay_tag_fee'] =$item->pay_tag_fee+$payArr[$item->sequenceNo];
  84. $qrd['wpay_fee'] = $item->wpay_fee-$payArr[$item->sequenceNo];
  85. $qrd['apay_fee'] = $item->apay_fee+$payArr[$item->sequenceNo];
  86. $qrd['pay_status'] = ($qrd['wpay_fee']==0 &&$item->pay_fee==0) ? 3:($qrd['apay_fee']==0?1:2);
  87. }else{
  88. $tag_temp['tag_fee'] =$item->wpay_fee;
  89. $qrd['pay_tag_fee'] =$item->pay_tag_fee+ $item->wpay_fee;
  90. $qrd['wpay_fee'] = 0;
  91. $qrd['apay_fee'] = $item->apay_fee+$item->wpay_fee;
  92. $qrd['pay_status'] = ($qrd['wpay_fee']==0 &&$item->pay_fee==0) ? 3:($qrd['apay_fee']==0?1:2);
  93. }
  94. }else{
  95. if($item->apay_fee>$payArr[$item->sequenceNo]){
  96. $tag_temp['tag_fee']= $payArr[$item->sequenceNo];
  97. $qrd['pay_tag_fee']=$item->pay_tag_fee>$payArr[$item->sequenceNo]?$item->pay_tag_fee-$payArr[$item->sequenceNo]:0;
  98. $qrd['wpay_fee'] = $item->wpay_fee+$payArr[$item->sequenceNo];
  99. $qrd['apay_fee'] = $item->apay_fee-$payArr[$item->sequenceNo];
  100. $qrd['pay_status'] = ($qrd['wpay_fee']==0 &&$item->pay_fee==0) ? 3:($qrd['apay_fee']==0?2:1);
  101. }else{
  102. $tag_temp['tag_fee'] =$item->apay_fee;
  103. $qrd['pay_tag_fee'] =$item->pay_tag_fee>$item->apay_fee?$item->pay_tag_fee-$item->apay_fee:0;
  104. $qrd['wpay_fee'] =$item->apay_fee;
  105. $qrd['apay_fee'] = 0;
  106. $qrd['pay_status'] = ($qrd['wpay_fee']==0 &&$item->pay_fee==0) ? 3:($qrd['apay_fee']==0?2:1);
  107. }
  108. }
  109. $qrdSave[]=$qrd;
  110. $tag[]=$tag_temp;
  111. };
  112. (new \app\admin\model\QrdInfo)->saveAll($qrdSave);
  113. (new \app\admin\model\TagLog)->saveAll($tag);
  114. }
  115. protected function invComon($data){
  116. $invinfo =InvoicePool::where(['invNo'=>$data['invNo']])->findOrEmpty();
  117. if($invinfo->isEmpty())return;
  118. if($invinfo->status!=4 ||$invinfo->is_comon!=1 )return;
  119. $invpay =InvoicePay::where(['invNo'=>$data['invNo']])->findOrEmpty();
  120. if($invpay->isEmpty())return;
  121. if($invpay->status!=0 )return;
  122. $payinfo = Pay::where('payNo',$invpay['payNo'])->findOrEmpty();
  123. if($payinfo->isEmpty()) return;
  124. if($payinfo->is_comon!=1)return;
  125. if(!in_array($payinfo->status,[1,2]))return;
  126. $ticket =InvoiceTicket::where(["invNo"=>$data['invNo'],"type"=>0])->json(['item'])->findOrEmpty();
  127. if($ticket->isEmpty())return;
  128. $pay_fee=0;
  129. if($payinfo->winv_fee >=$invinfo->inv_value){
  130. $pay_fee = $invinfo->inv_value;
  131. }else{
  132. $pay_fee = $payinfo->winv_fee;
  133. }
  134. $payinvoice = [
  135. "payNo"=>$invpay['payNo'],
  136. "hpNo"=>makeNo("hp"),
  137. "apply_id"=>0,
  138. "apply_name"=>"system",
  139. "invType"=>$invinfo->open_type==3?1:3,
  140. "invoiceType"=>$invinfo->inv_type,
  141. "inv_fee"=>$pay_fee,
  142. "inv_subtotal_amount"=>$ticket->inv_subtotal,
  143. "inv_amount"=>$ticket->inv_total,
  144. "invStatus"=>1,
  145. "status"=>4,
  146. "check_time"=>date("Y-m-d H:i:s"),
  147. "open_time"=>$ticket->open_date,
  148. "invoiceNumber"=>$ticket->inv_number,
  149. "seller_check"=>1,
  150. "buyer_check"=>1,
  151. "invoiceCode"=>$ticket->inv_code,
  152. "checkNumber"=>$ticket->check_code,
  153. "checkApi"=>$data['checkApi']??0
  154. ];
  155. $payinfo->winv_fee = $payinfo->winv_fee-$pay_fee;
  156. $payinfo->ainv_fee = $payinfo->ainv_fee+$pay_fee;
  157. $payinfo->inv_status = ($payinfo->winv_fee==0 &&$payinfo->inv_fee==0)?3:($payinfo->ainv_fee==0?1:2);
  158. $this->CheckComonOrder($payinfo);
  159. $payinfo->save();
  160. PayInvoice::create($payinvoice);
  161. if(!empty($ticket->item)){
  162. $itemArr=[];
  163. foreach ($ticket->item as $item){
  164. $temp=[];
  165. $temp['name']=$item['XMMC'];
  166. $temp['unit']=$item['DW'];
  167. $temp['quantity']=$item['SPSL'];
  168. $temp['unit_price']=$item['DJ'];
  169. $temp['amount']=$item['JE'];
  170. $temp['tax']=$item['SE'];
  171. $temp['tax_rate']=strval($item['SL']*100)."%";
  172. $itemArr[]=$temp;
  173. }
  174. }
  175. $info=[
  176. 'payNo' =>$invpay['payNo'] ,
  177. 'hpNo' =>$payinvoice['hpNo'] ,
  178. 'type' =>$invinfo['inv_type'] ,
  179. 'number' =>$ticket->inv_number ,
  180. 'code' =>$ticket->inv_code ,
  181. 'check_code' =>$ticket->check_code ,
  182. 'issue_date' =>date('Ymd' ,strtotime($ticket->open_date)) ,
  183. 'buyer_name' =>$ticket->buyer_title ,
  184. 'buyer_id' =>$ticket->buyer_id ,
  185. 'buyer_address' =>$ticket->buyer_addr . $ticket->buyer_mobile ,
  186. 'buyer_bank' =>$ticket->buyer_bank . $ticket->buyer_bankNo ,
  187. 'seller_name' =>$ticket->seller_title ,
  188. 'seller_id' =>$ticket->seller_id ,
  189. 'seller_address' =>$ticket->seller_addr . $ticket->seller_mobile ,
  190. 'seller_bank' =>$ticket->seller_bank . $ticket->seller_bankNo ,
  191. 'subtotal_amount'=>$ticket->inv_subtotal ,
  192. 'subtotal_tax' =>$ticket->tax_fee ,
  193. 'total' =>$ticket->inv_total ,
  194. 'item_list' =>json_encode($itemArr,JSON_UNESCAPED_UNICODE) ,
  195. 'receiver' =>$ticket->reciver ,
  196. 'issuer' =>$ticket->issuer ,
  197. 'reviewer' =>$ticket->reviewer ,
  198. 'change_field' =>'' ,
  199. ];
  200. InvoiceInfo::create($info);
  201. $invpay->hpNo = $payinvoice['hpNo'];
  202. $invpay->status =1;
  203. $invpay->save();
  204. }
  205. public function payComon($data){
  206. $payinfo = Pay::where("payNo",$data['payNo'])->findOrEmpty();
  207. if($payinfo->isEmpty()) return;
  208. if($payinfo->is_comon!=1)return;
  209. if(!in_array($payinfo->status,[1,2]))return;
  210. $qrdNo = PayInfo::alias("a")->leftJoin("ComonOrder b","a.cgdNo=b.cgdNo")->where(["payNo"=>$data['payNo'],"is_del"=>0,"a.status"=>1])->column("orderCode");
  211. $qrdinfo = QrdInfo::where([["sequenceNo","in",$qrdNo],["wpay_fee",">",0]])->select();
  212. if($qrdinfo->isEmpty())return;
  213. $this->CheckComonOrder($payinfo);
  214. $tag=[];
  215. $qrdSave=[];
  216. foreach ($qrdinfo as $item){
  217. $tag_temp=[
  218. "code"=>$item->sequenceNo,
  219. "tag_id"=>10,
  220. "creater"=>"system",
  221. "createrid"=>0,
  222. "tag_fee"=>0,
  223. "tag_img"=>"",
  224. "status"=>1
  225. ];
  226. $qrd=[
  227. "id"=>$item->id,
  228. "wpay_fee"=>$item->wpay_fee,
  229. "apay_fee"=>$item->apay_fee,
  230. "pay_status"=>$item->pay_status,
  231. "pay_tag_fee"=>0,
  232. "pay_tag" => 1
  233. ];
  234. if($item->wpay_fee>$data['pay_fee']){
  235. $tag_temp['tag_fee'] = $data['pay_fee'];
  236. $qrd['pay_tag_fee'] = $data['pay_fee'];
  237. $qrd['wpay_fee'] = $item->wpay_fee-$data['pay_fee'];
  238. $qrd['apay_fee'] = $item->apay_fee+$data['pay_fee'];
  239. $qrd['pay_status'] = ($qrd['wpay_fee']==0 &&$item->pay_fee==0) ? 3:($qrd['apay_fee']==0?1:2);
  240. $data['pay_fee']=0;
  241. }else{
  242. $data['pay_fee']=$data['pay_fee']-$item->wpay_fee;
  243. $tag_temp['tag_fee'] =$item->wpay_fee;
  244. $qrd['pay_tag_fee'] = $item->wpay_fee;
  245. $qrd['wpay_fee'] = 0;
  246. $qrd['apay_fee'] = $item->apay_fee+$item->wpay_fee;
  247. $qrd['pay_status'] = ($qrd['wpay_fee']==0 &&$item->pay_fee==0) ? 3:($qrd['apay_fee']==0?1:2);
  248. }
  249. $qrdSave[]=$qrd;
  250. $tag[]=$tag_temp;
  251. if($data['pay_fee']==0) break;
  252. }
  253. (new \app\admin\model\QrdInfo)->saveAll($qrdSave);
  254. (new \app\admin\model\TagLog)->saveAll($tag);
  255. }
  256. //新开票完成 创建对应的标签;
  257. public function returnInv($data){
  258. $invinfo =InvoicePool::where(['invNo'=>$data['invNo'],"status"=>[5,6,7,8,9]])->findOrEmpty();
  259. if($invinfo->isEmpty())return;
  260. if($invinfo->is_comon!=1 )return;
  261. $invpay =InvoicePay::where(['invNo'=>$data['invNo']])->findOrEmpty();
  262. if($invpay->isEmpty())return;
  263. if($invpay->status!=1 )return;
  264. $payinfo = Pay::where('payNo',$invpay['payNo'])->findOrEmpty();
  265. if($payinfo->isEmpty()) return;
  266. if($payinfo->is_comon!=1)return;
  267. $payinvoice = PayInvoice::where(["hpNo"=>$invpay->hpNo,"status"=>4])->findOrEmpty();
  268. if($payinvoice->isEmpty())return;
  269. $payinvoice->status=10;
  270. $payinvoice->save();
  271. $payinfo->winv_fee = $payinfo->winv_fee+$payinvoice->inv_fee;
  272. $payinfo->ainv_fee = $payinfo->ainv_fee-$payinvoice->inv_fee;
  273. $payinfo->inv_status = ($payinfo->winv_fee==0 &&$payinfo->inv_fee==0)?3:($payinfo->ainv_fee==0?2:1);
  274. $this->CheckComonOrder($payinfo);
  275. $payinfo->save();
  276. $invpay->status =2;
  277. $invpay->save();
  278. }
  279. }