RefundOrderService.php 12 KB

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