PhOrderPay.php 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. <?php
  2. namespace app\common\model;
  3. use app\common\util\AppMsg;
  4. use app\hander\HelpHander;
  5. use think\Db;
  6. use think\Exception;
  7. use think\Log;
  8. use tools\Hwsms;
  9. class PhOrderPay extends Base
  10. {
  11. // 用户生成支付单
  12. public function addSave($userId,$orgId,$orderId,$money,$busType=0){
  13. $data = [
  14. 'sn' => get_unique_id('PH'),
  15. 'order_id' => $orderId,
  16. 'money' => $money,
  17. 'type' => 2,
  18. 'cate' => 1,
  19. 'status' => 0,
  20. 'create_time' => date('Y-m-d H:i:s'),
  21. 'bus_type' => $busType,
  22. 'from' =>input('from',1)
  23. ];
  24. $map[] = ['id','=',$orderId];
  25. $map[] = ['form','=',1];
  26. $map[] = ['user_id','=',$userId];
  27. $map[] = ['org_id','=',$orgId];
  28. if($busType == 1){
  29. $map[] = ['status','=',0];
  30. }else{
  31. $map[] = ['status','in',[0,1]];
  32. }
  33. $order = Db::name('ph_orders')
  34. ->where($map)
  35. ->find();
  36. if(!$order){
  37. HelpHander::error('订单不存在');
  38. }
  39. $payId = Db::name('ph_order_pay')->insertGetId($data);
  40. if(!$payId){
  41. HelpHander::error('操作失败');
  42. }
  43. return $payId;
  44. }
  45. // 用户支付成功预收款,改变状态
  46. public function paySuccess($payId,$type=2){
  47. Db::startTrans();
  48. try{
  49. $pay = Db::name('ph_order_pay')
  50. ->where('id',$payId)
  51. ->find();
  52. if(!$pay){
  53. \exception('支付单不存在');
  54. }
  55. $order = Db::name('ph_orders')
  56. ->where('id',$pay['order_id'])
  57. ->lock(true)
  58. ->find();
  59. if(!$order){
  60. \exception('订单不存在');
  61. }
  62. $res = Db::name('ph_order_pay')->where('id',$payId)->update([
  63. 'status' => 1,
  64. 'type' => $type,
  65. 'pay_time' => date('Y-m-d H:i:s')
  66. ]);
  67. if(!$res){
  68. \exception('操作失败');
  69. }
  70. if($pay['bus_type'] == 0){
  71. $ret = Db::name('ph_orders')->where('id',$pay['order_id'])->update([
  72. 'pre_money' => $order['pre_money'] + $pay['money']
  73. ]);
  74. if(!$ret){
  75. \exception('操作失败');
  76. }
  77. }else{
  78. $ret = Db::name('ph_orders')->where('id',$pay['order_id'])->update([
  79. 'is_service' => 1,
  80. 'update_time' => date("Y-m-d H:i:s")
  81. ]);
  82. if(!$ret){
  83. \exception('操作失败');
  84. }
  85. }
  86. Db::commit();
  87. }catch (Exception $e){
  88. Db::rollback();
  89. $this->error = $e->getMessage();
  90. return false;
  91. }
  92. return true;
  93. }
  94. // 调度生成支付单
  95. public function addSaveDispatch($orgId,$userId,$orderId,$money,$remark='',$busType=0){
  96. $data = [
  97. 'sn' => get_unique_id('PH'),
  98. 'order_id' => $orderId,
  99. 'money' => $money,
  100. 'type' => 1,
  101. 'cate' => 2,
  102. 'status' => 1,
  103. 'create_time' => date('Y-m-d H:i:s'),
  104. 'pay_time' => date('Y-m-d H:i:s'),
  105. 'remark' => $remark,
  106. 'bus_type' => $busType,
  107. 'user_id'=>$userId
  108. ];
  109. Db::startTrans();
  110. try{
  111. $order = Db::name('ph_orders')
  112. ->where('id',$orderId)
  113. ->where('status','in',[0,1])
  114. ->where('org_id',$orgId)
  115. ->lock(true)
  116. ->find();
  117. if(!$order){
  118. \exception('订单不存在');
  119. }
  120. $payId = Db::name('ph_order_pay')->insertGetId($data);
  121. if(!$payId){
  122. \exception('操作失败');
  123. }
  124. if($busType == 1){
  125. $ret = Db::name('ph_orders')->where('id',$orderId)->update([
  126. 'service_money' => $order['service_money'] + $money
  127. ]);
  128. }else{
  129. $ret = Db::name('ph_orders')->where('id',$orderId)->update([
  130. 'pre_money' => $order['pre_money'] + $money
  131. ]);
  132. }
  133. if(!$ret){
  134. \exception('操作失败');
  135. }
  136. Db::commit();
  137. }catch (Exception $e){
  138. Db::rollback();
  139. $this->error = $e->getMessage();
  140. return false;
  141. }
  142. return true;
  143. }
  144. public function refundOrder($userId,$orgId){
  145. $data = [
  146. 'type' => input('type/d',1),
  147. 'money' => input('money/f',0),
  148. 'pay_id' => input('id/d',0),
  149. 'user_id' => $userId,
  150. 'remark' => input('remark','','trim'),
  151. 'create_time' => date('Y-m-d H:i:s'),
  152. ];
  153. if(!in_array($data['type'],[1,2])){
  154. $this->error = '类型不正确';
  155. return false;
  156. }
  157. if($data['money'] <= 0){
  158. $this->error = '金额必须大于0';
  159. return false;
  160. }
  161. $pay = Db::name('ph_order_pay')->where('id',$data['pay_id'])->find();
  162. if(!$pay||$pay['status'] != 1){
  163. $this->error = '订单不存在';
  164. return false;
  165. }
  166. $data['sn'] = get_unique_id('TPH');
  167. $data['order_id'] = $pay['order_id'];
  168. if($data['money'] > ($pay['money'] - $pay['money2'])){
  169. $this->error = '退款金额过大';
  170. return false;
  171. }
  172. if($pay['type'] == 1 && $data['type'] == 2){
  173. $this->error = '线下的记录不能线上退款';
  174. return false;
  175. }
  176. Db::startTrans();
  177. try{
  178. $ret = Db::name('ph_order_refund')->insert($data);
  179. if(!$ret){
  180. \exception('操作失败');
  181. }
  182. $ret2 = Db::name('ph_order_pay')->where('id',$data['pay_id'])->update(['money2' => $pay['money2'] + $data['money']]);
  183. if(!$ret2){
  184. \exception('操作失败');
  185. }
  186. $order = Db::name('ph_orders')
  187. ->where('id',$pay['order_id'])
  188. ->lock(true)
  189. ->find();
  190. if(!$order){
  191. \exception('订单不存在');
  192. }
  193. if($pay['bus_type'] == 1){
  194. $ret = Db::name('ph_orders')->where('id',$pay['order_id'])->update([
  195. 'service_money' => $order['service_money'] - $data['money']
  196. ]);
  197. }else{
  198. if ($order['status'] == 2){ //已完成状态下,要从订单金额里面减去退款金额
  199. $ret = Db::name('ph_orders')->where('id',$pay['order_id'])->update([
  200. 'pre_money' => $order['pre_money'] - $data['money'],
  201. 'amount' => $order['amount'] - $data['money'],
  202. ]);
  203. }else{
  204. $ret = Db::name('ph_orders')->where('id',$pay['order_id'])->update([
  205. 'pre_money' => $order['pre_money'] - $data['money']
  206. ]);
  207. }
  208. }
  209. if(!$ret){
  210. \exception('操作失败');
  211. }
  212. if($data['type'] == 2){ // 线上,微信退款
  213. $config = getPhConfig($orgId,$pay['from']);
  214. $app = \EasyWeChat\Factory::payment($config);
  215. $ret = $app->refund->byOutTradeNumber($pay['sn'], $data['sn'], $pay['money']*100, $data['money']*100);
  216. if($ret['return_code'] != 'SUCCESS' || $ret['result_code'] != 'SUCCESS'){
  217. \exception('退款申请提交失败');
  218. }
  219. }
  220. Db::commit();
  221. }catch (\Exception $e){
  222. Db::rollback();
  223. trace($e->getMessage());
  224. $this->error = $e->getMessage();
  225. return false;
  226. }
  227. return true;
  228. }
  229. }