OrderService.php 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. <?php
  2. namespace app\admin\service\order;
  3. use app\model\Member;
  4. use app\model\Order;
  5. use app\model\OrderSheet;
  6. use app\model\PayDetail;
  7. use app\model\SysDept;
  8. use support\Db;
  9. use support\exception\BusinessException;
  10. use support\Redis;
  11. use Yansongda\Pay\Log;
  12. use Yansongda\Pay\Pay;
  13. class OrderService
  14. {
  15. /**
  16. * @Desc 自动确认收货
  17. * @Author Gorden
  18. * @Date 2024/4/11 16:09
  19. *
  20. * @return void
  21. */
  22. public static function AutomaticReceipt()
  23. {
  24. try {
  25. Db::beginTransaction();
  26. $timeUnix = strtotime("-7 days");
  27. $orders = Order::where('order_status_system', 'SIGNED')
  28. ->where('order_addtimes', '<', $timeUnix)
  29. ->get();
  30. foreach ($orders as $order) {
  31. // 订单主表
  32. Order::where('order_id', $order->order_id)->update([
  33. 'order_is_complete' => 'Y',
  34. 'order_status_system' => 'CONFIRM',
  35. 'order_status_storage'=> 'DONE'
  36. ]);
  37. // 订单详情表
  38. OrderSheet::where('join_sheet_order_id', $order->order_id)->update(['order_sheet_status' => 'DONE']);
  39. // 7天后自动完成 order_is_complete=Y
  40. // $redis = Redis::connection();
  41. // $key = Order::AUTOMATIC_COMPLETE_PREFIX . date('Ymd', strtotime("+7 days"));
  42. // $redis->sadd($key, $order->order_id);
  43. }
  44. Db::commit();
  45. } catch (\Exception $e) {
  46. Db::rollBack();
  47. }
  48. }
  49. /**
  50. * @Desc 自动完成订单
  51. * @Author Gorden
  52. * @Date 2024/7/16 9:37
  53. *
  54. * @return void
  55. */
  56. public static function AutomaticComplete()
  57. {
  58. Db::beginTransaction();
  59. try {
  60. $redis = Redis::connection();
  61. $key = Order::AUTOMATIC_COMPLETE_PREFIX . date('Ymd');
  62. $orderIds = $redis->smembers($key);
  63. foreach ($orderIds as $orderId){
  64. $order = Order::where('order_id',$orderId)
  65. ->select('order_is_complete','order_category','order_status_system')
  66. ->first();
  67. if ($order && $order->order_is_complete != 'Y' && $order->order_category != 'RETURN' && in_array($order->order_status_system,['RECVING','SIGNED','CONFIRM'])){
  68. // 更新主表
  69. Order::where('order_id',$orderId)->update(['order_is_complete'=>'Y','order_status_system'=>'CONFIRM','order_status_storage'=>'DONE']);
  70. // sheet表
  71. OrderSheet::where('join_sheet_order_id',$orderId)->update(['order_sheet_status'=>'DONE']);
  72. }
  73. }
  74. $redis->del($key);
  75. Db::commit();
  76. } catch (\Exception $e) {
  77. dump($e->getMessage());
  78. Db::rollBack();
  79. }
  80. }
  81. public static function checkPayingOrder()
  82. {
  83. try {
  84. Db::beginTransaction();
  85. $timeUnix = strtotime("-30 minutes");
  86. $orders = Order::where('order_status_system', 'PAYING')
  87. ->where('order_category','<>','DISHES')
  88. ->where('order_platform','<>','SYSTEM') // 后台产生的订单不自动取消
  89. ->where('order_addtimes', '<', $timeUnix)
  90. ->get();
  91. foreach ($orders as $order) {
  92. // 订单主表
  93. Order::where('order_id', $order->order_id)->update([
  94. 'order_is_complete' => 'Y',
  95. 'order_status_system' => 'CANCEL',
  96. 'order_status_payment' => 'CANCEL'
  97. ]);
  98. // 订单详情表
  99. OrderSheet::where('join_sheet_order_id', $order->order_id)->update(['order_sheet_status' => 'CANCEL']);
  100. // 支付表
  101. PayDetail::where('pay_id', $order->order_groupby)->update([
  102. 'pay_status' => 'CANCEL',
  103. ]);
  104. }
  105. Db::commit();
  106. } catch (\Exception $e) {
  107. Db::rollBack();
  108. }
  109. }
  110. public static function generateWriteOffData($params)
  111. {
  112. return [
  113. 'charge' => [
  114. 'charge_amount' => 1,
  115. 'charge_content' => $params['order_remark'] ?? '',
  116. 'charge_user_id' => $params['write_off_member_id'],
  117. 'charge_premises' => $params['dept_premises_id'],
  118. ],
  119. 'member_id' => $params['join_order_member_id']
  120. ];
  121. }
  122. public static function generateAppointmentApplyData($params)
  123. {
  124. $member = Member::with('cert','info')
  125. ->where('member_id',$params['join_order_member_id'])
  126. ->first();
  127. $name = '';
  128. if (!empty($member) && !empty($member->cert) && !empty($member->cert->member_cert_name)){
  129. $name = $member->cert->member_cert_name;
  130. }else if (!empty($member) && !empty($member->info) && !empty($member->info->member_info_nickname)){
  131. $name = $member->info->member_info_nickname;
  132. }
  133. return [
  134. 'name' => $name,
  135. 'times' => '',
  136. 'mobile' => !empty($member) ? $member->member_mobile : '',
  137. 'person' => $params['order_sheet_num'] ?? '',
  138. 'premises' => $params['dept_premises_id'] ?? ''
  139. ];
  140. }
  141. /**
  142. * 微信支付宝扫码支付
  143. */
  144. public static function qrcodePay($params)
  145. {
  146. $qrcodeNbr = $params['qrcode_nbr'];
  147. $prefix = substr($qrcodeNbr,0,2);
  148. // 微信支付
  149. if(in_array($prefix,[10,11,12,13,14,15])){
  150. $payData = [
  151. 'out_trade_no' => $params['orderGroupId'],
  152. 'body' => '万悦康养订单',
  153. 'total_fee' => $params['order_amount_pay']*100,
  154. 'auth_code' => $params['qrcode_nbr'],
  155. ];
  156. try{
  157. $result = Pay::wechat(config('payment.wxpay'))->pos($payData);
  158. }catch(\Exception $e){
  159. Log::error("WXPAY",['msg'=>$e->getMessage()]);
  160. throw new BusinessException("支付失败");
  161. }
  162. Log::info("WXPAY_RETURN",json_decode(json_encode($result),true));
  163. }else if(in_array($prefix,[25,26,27,28,29,30])){
  164. $payData = [
  165. 'out_trade_no' => $params['orderGroupId'],
  166. 'total_amount' => $params['order_amount_pay'],
  167. 'subject' => '万悦康养订单',
  168. 'auth_code' => $params['qrcode_nbr'],
  169. ];
  170. try{
  171. $result = Pay::alipay(config('payment.alipay'))->pos($payData);
  172. }catch(\Exception $e){
  173. Log::error("ALIPAY",['msg'=>$e->getMessage()]);
  174. throw new BusinessException("支付失败");
  175. }
  176. Log::info("ALIPAY_RETURN",json_decode(json_encode($result),true));
  177. }else{
  178. throw new BusinessException("二维码无效");
  179. }
  180. return $result;
  181. }
  182. }