RefundOrderService.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. <?php
  2. /**
  3. *
  4. * @file:RefundOrderSeivce.php
  5. * @Date: 2023/5/29
  6. * @Time: 09:48
  7. */
  8. namespace Modules\OrderRefund\Services;
  9. use App\Libs\Pay\Palmpay;
  10. use Catch\Exceptions\FailedException;
  11. use Illuminate\Support\Facades\DB;
  12. use Modules\Channel\Services\Order\OrderService;
  13. use Modules\Manage\Models\Miniprogram;
  14. use Modules\OrderRefund\Models\OrdersRefundVerify;
  15. use Modules\User\Models\User;
  16. class RefundOrderService extends BaseServices
  17. {
  18. /**
  19. * 退款订单查询
  20. * name: orderList
  21. * @param array $param
  22. * date 2023/05/29 09:58
  23. */
  24. public static function orderList(array $param, $isAll = false)
  25. {
  26. $list = self::listQuery($param);
  27. $list->orderBy("orders_refund_verify.refund_status",'asc')->orderBy("orders_refund_verify.id",'desc')->select("orders_refund_verify.id",'orders_refund_verify.order_id',"orders_refund_verify.uid","orders_refund_verify.pt_verify_remark","orders_refund_verify.user_id","orders_refund_verify.sh_verify_remark", "orders_refund_verify.sh_verify_status","orders_refund_verify.pt_verify_status","orders_refund_verify.pay_at","orders_refund_verify.refund_status","orders_refund_verify.refund_no","orders_refund_verify.trade_no","orders_refund_verify.refund_price","orders_refund_verify.order_price","orders.puser_id","orders.promotion_id","orders.miniprogram_id","orders.created_at as order_created_at","orders.ranse_created_at","promotions.name as promotion_name",'orders.order_type',"orders.pay_merchant_source");
  28. if ($isAll){
  29. $list = $list->get();
  30. }else{
  31. $list = $list->paginate(getProp($param,'limit',15));
  32. }
  33. if (!$list->isEmpty()) {
  34. $types = array_column(OrderService::getOrderType(), null, 'value');
  35. $verifTxt = self::getVerifyText();
  36. foreach ($list as $val){
  37. $val->username = $val->user_id > 0 ? User::where('id', $val->user_id)->value('username') : "";
  38. $val->company_name = "-";
  39. $val->play_name = '-';
  40. $val->xcx_name = '-';
  41. $company = Miniprogram::where('id', $val->miniprogram_id)->first();
  42. if ($company) {
  43. $val->company_name = $val->puser_id > 0 ? DB::table('users')->where('id',$val->puser_id)->value("username") : "-";
  44. $val->play_name = $company->play_name;
  45. $val->xcx_name = $company->name;
  46. }
  47. if (!$val->promotion_name){
  48. $val->promotion_name = "-";
  49. }
  50. $val->tip_text = $types[$val->order_type]['name'] ?? "-";
  51. $val->pay_name = '微信支付';
  52. $val->pt_verify_status_text = $verifTxt[$val->pt_verify_status]['name'] ?? "-";
  53. if ($val->puser_id > 0){
  54. $val->sh_verify_status_text = $verifTxt[$val->sh_verify_status]['name'] ?? "-";
  55. $val->can_pay = $val->sh_verify_status == 1 && $val->pt_verify_status == 1 ? 1: 0;
  56. }else{
  57. $val->sh_verify_status_text = "-";
  58. $val->can_pay = $val->pt_verify_status == 1 ? 1: 0;
  59. }
  60. $val->status_text = $val->refund_status == 1 ? "已退款": "已付款";
  61. }
  62. }
  63. return $list;
  64. }
  65. protected static function getVerifyText(){
  66. return [
  67. ['value' => 0,'name' => "待审核"],
  68. ['value' => 1,'name' => "审核通过"],
  69. ['value' => 2,'name' => "审核不通过"],
  70. ];
  71. }
  72. /**
  73. * 构建查询语句
  74. * name: listQuery
  75. * @param array $param
  76. * date 2023/05/29 09:59
  77. */
  78. private static function listQuery(array $param)
  79. {
  80. $sql = OrdersRefundVerify::query()->leftJoin("orders",'orders_refund_verify.order_id','=','orders.id')->leftJoin('promotions','orders.promotion_id','=','promotions.id')
  81. ->where('orders_refund_verify.refund_status', getProp($param,'refund_status',0));
  82. if (!empty(getProp($param, 'user_id'))) {
  83. $sql->where('orders.user_id', $param['user_id']);
  84. }
  85. // 公司查询
  86. if (!empty(getProp($param, 'puser_id'))) {
  87. $sql->where('orders.puser_id', $param['puser_id']);
  88. }
  89. // 小程序
  90. if (!empty(getProp($param, 'miniprogram_id'))) {
  91. $sql->where('orders.miniprogram_id', $param['miniprogram_id']);
  92. }
  93. // 推广id
  94. if (!empty(getProp($param, 'promotion_id'))) {
  95. $sql->where('orders.promotion_id', $param['promotion_id']);
  96. }
  97. // 状态查询
  98. if (!empty(getProp($param, 'status'))) {
  99. $sql->where('orders.status', $param['status']);
  100. }
  101. // 充值项类型
  102. if (!empty(getProp($param, 'order_type'))) {
  103. $sql->where('orders.order_type', $param['order_type']);
  104. }
  105. // 用户
  106. if (!empty(getProp($param, 'uid'))) {
  107. $sql->where('orders.uid', $param['uid']);
  108. }
  109. // 订单号查询
  110. if (!empty(getProp($param, 'trade_no'))) {
  111. $sql->where('orders.trade_no', "like", "%" . $param['trade_no'] . "%");
  112. // $sql->where('orders.trade_no', $param['trade_no']);
  113. }
  114. // 订单创建时间
  115. if (getProp($param,'created_at_start','')){
  116. $sql->where('orders.created_at',">=",$param['created_at_start']);
  117. }
  118. if (getProp($param,'created_at_end','')){
  119. $end =$param['created_at_end'];
  120. if ($end == getProp($param,'created_at_start','')){
  121. $end = date("Y-m-d",strtotime($end)) . " 23:59:59";
  122. }
  123. $sql->where('orders.created_at',"<=",$end);
  124. }
  125. // 退款时间
  126. if (getProp($param,'pay_at_start','')){
  127. $sql->where('orders_refund_verify.pay_at',">=",$param['pay_at_start']);
  128. }
  129. if (getProp($param,'pay_at_start','')){
  130. $end =$param['pay_at_end'];
  131. if ($end == getProp($param,'pay_at_start','')){
  132. $end = date("Y-m-d",strtotime($end)) . " 23:59:59";
  133. }
  134. $sql->where('orders_refund_verify.pay_at',"<=",$end);
  135. }
  136. return $sql;
  137. }
  138. /**
  139. * 申请退款
  140. * name: applyRefund
  141. * @param $param
  142. * $param [
  143. * "order_id" => 1, // 订单id
  144. * 'price' => 1, // 金额
  145. * 'create_user_id' => 1, // 申请人id
  146. * ];
  147. * date 2023/05/29 11:46
  148. */
  149. public static function applyRefund($param)
  150. {
  151. $order = DB::table('orders')->where('id',$param['order_id'])->first();
  152. if (empty($order)){
  153. self::throwErrMsg('订单不存在!');
  154. }
  155. if ($order->status != "PAID"){
  156. self::throwErrMsg('此订单未付款,无需退款!');
  157. }
  158. if ($param['price'] > $order->price){
  159. self::throwErrMsg('退款金额不能超过支付金额!');
  160. }
  161. $data = [
  162. 'create_user_id' => $param['create_user_id'],
  163. 'refund_no' => self::CreateRefundNo("RE"),
  164. 'order_id' => $order->id,
  165. 'puser_id' => $order->puser_id,
  166. 'user_id' => $order->user_id,
  167. 'uid' => $order->uid,
  168. 'order_price' => $order->price,
  169. 'trade_no' => $order->trade_no,
  170. 'third_orderid' => $order->third_orderid,
  171. 'refund_price' => $param['price'],
  172. ];
  173. if (OrdersRefundVerify::updateOrCreate(['order_id' => $data['order_id']],$data)){
  174. return '操作成功';
  175. }
  176. return '操作失败';
  177. }
  178. /**
  179. * 生成退款单号
  180. * name: CreateRefundNo
  181. * date 2023/05/29 13:46
  182. */
  183. private static function CreateRefundNo($prefix = '', $time = 0)
  184. {
  185. $time = $time == 0 ? time() : $time;
  186. $billno = $prefix . date('YmdHis', $time) . random(4, true);
  187. if (!empty($table)) {
  188. while (1) {
  189. $count = OrdersRefundVerify::where('refund_no',$billno)->value('id');
  190. if (empty($count)) {
  191. break;
  192. }
  193. $billno = $prefix . date('YmdHis') . random(4, true);
  194. }
  195. }
  196. return $billno;
  197. }
  198. /**
  199. * 更新审核状态
  200. * name: updateRefundVerify
  201. * @param $refundId 退款id
  202. * @param array $param
  203. * @param int $isPlatform 是否平台 1是 0否
  204. * @return string
  205. * date 2023/05/29 16:43
  206. */
  207. public static function updateRefundVerify($refundId, array $param, $isPlatform = 0)
  208. {
  209. $info = OrdersRefundVerify::where('id',$refundId)->first();
  210. if(!$info){
  211. self::throwErrMsg("退款申请不存在");
  212. }
  213. if ($isPlatform ==0 && $info->puser_id < 1){
  214. self::throwErrMsg("无需商户审核");
  215. }
  216. if ($isPlatform == 1 && $info->pt_verify_status == 1){
  217. self::throwErrMsg("已审核通过无需再次操作");
  218. }else if ($isPlatform ==0 && $info->sh_verify_status == 1){
  219. self::throwErrMsg("已审核通过无需再次操作");
  220. }
  221. $res = OrdersRefundVerify::where('id',$refundId)->update($param);
  222. return $res ? "操作成功" : "操作失败";
  223. }
  224. /**
  225. * 退款操作
  226. * name: payToUser
  227. * @param mixed $refundId 申请id
  228. * @param array $option 操作人信息
  229. * date 2023/05/29 16:53
  230. */
  231. public static function payToUser(mixed $refundId, array $option)
  232. {
  233. $info = OrdersRefundVerify::where('id',$refundId)->first();
  234. if(!$info){
  235. self::throwErrMsg("退款申请不存在");
  236. }
  237. if($info->status == 1){
  238. self::throwErrMsg("已退款,无需再次操作");
  239. }
  240. if ($info->puser_id > 0){
  241. if ($info->pt_verify_status != 1 || $info->sh_verify_status != 1){
  242. self::throwErrMsg("双方审核未全部通过,不能退款");
  243. }
  244. }else{
  245. if ($info->pt_verify_status != 1 ){
  246. self::throwErrMsg("审核未通过,不能退款");
  247. }
  248. }
  249. DB::beginTransaction();
  250. try {
  251. $payParam = [
  252. 'third_orderid' => $info->third_orderid,
  253. 'price' => $info->order_price,
  254. 'refund_no' => $info->refund_no,
  255. 'refund_price' => $info->refund_price,
  256. ];
  257. $appid = DB::table(getMiniProgramTableName(1,'users'))->where('id',$info->uid)->value('appid');
  258. $resut = (new Palmpay(['subAppid'=>$appid]))->refund($payParam);
  259. if (!$resut['status']){
  260. self::throwErrMsg($resut['msg']);
  261. }
  262. $param = [
  263. 'refund_status' => 1,
  264. 'pay_at' => get_date(),
  265. 'pay_op_user' => $option,
  266. ];
  267. OrdersRefundVerify::where('id',$refundId)->update($param);
  268. DB::table('orders')->where('id',$info->order_id)->update(['status',"REFUND"]);
  269. DB::commit();
  270. return "操作成功";
  271. }catch (\Exception $exception){
  272. DB::rollBack();
  273. self::throwErrMsg($exception->getMessage());
  274. }
  275. self::throwErrMsg("操作失败");
  276. }
  277. }