ComonQrd.php 14 KB

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