OrderServer.php 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. <?php
  2. namespace App\Servers;
  3. use App\Models\Config;
  4. use App\Models\ErrorRecord;
  5. use App\Models\Goods;
  6. use App\Models\Main\MainShopOrder;
  7. use App\Models\Main\MainShopSet;
  8. use App\Models\Member;
  9. use App\Models\Order;
  10. use App\Models\OrderItem;
  11. use Carbon\Carbon;
  12. use Illuminate\Support\Facades\DB;
  13. /**
  14. * 外卖订单管理
  15. */
  16. class OrderServer
  17. {
  18. static private $server = null;
  19. private function __construct()
  20. {
  21. }
  22. /**
  23. * 创建对象
  24. * @return OrderServer
  25. */
  26. static function creatServer()
  27. {
  28. if (empty(self::$server)) self::$server = new OrderServer();
  29. return self::$server;
  30. }
  31. function createOrder($m_id,$shop_id,$order_type,$table_number,$diner_number,$note,$goods_data,$shopping_cart)
  32. {
  33. DB::beginTransaction();
  34. try {
  35. //手续费比例
  36. $service_num = CommonServer::creatServer()->getConfigValue('service_num');
  37. if (empty($service_num)) {
  38. $service_num = 0.6;
  39. }
  40. //商品金额
  41. $goods_money = $goods_data['total_goods_money'];//商品总价
  42. $goods_number = $goods_data['total_num'];//商品总数
  43. $pack_price = $goods_data['pack_price'];//打包费
  44. if ($order_type == 1){//堂食不算打包费,并且打包费为0
  45. $order_money = $goods_money;
  46. $pack_price = 0;
  47. }else{//打包
  48. $order_money = bcadd($goods_money, $pack_price, 2);//订单金额 =(商品金额 + 打包费)
  49. }
  50. //预留优惠卷金额
  51. $coupon_money = 0;
  52. //用户支付金额=订单金额 - 优惠卷金额
  53. $pay_money = bcsub($order_money,$coupon_money,2);
  54. $service_money = bcdiv(bcmul($pay_money,$service_num,2),100,2);//交易支付手续费
  55. //商家到账金额 = 订单金额-交易支付手续费
  56. $shop_money = bcsub($order_money,$service_money,2);
  57. //信息入库
  58. $order_info = [
  59. 'order_sn' => CommonServer::creatServer()->createOrderNo('382FDC'),
  60. 'order_type' => $order_type,
  61. 'm_id' => $m_id,
  62. 'shop_id' => $shop_id,
  63. 'order_money' => $order_money,
  64. 'pay_money' => $pay_money,
  65. 'goods_number' => $goods_number,
  66. 'table_number' => $table_number,
  67. 'diner_number' => $diner_number,
  68. 'note' => $note,
  69. 'service_num' => $service_num,
  70. 'service_money' => $service_money,
  71. 'pack_price' => $pack_price,
  72. 'shop_money' => $shop_money,
  73. 'shopping_cart' => $shopping_cart,
  74. ];
  75. //主表信息入库
  76. $order = Order::create($order_info);
  77. $order_id = $order->{'id'};
  78. if (empty($order_id)){
  79. DB::rollBack();
  80. return ['code' => 0, 'msg' => '订单创建失败'];
  81. }
  82. //商品信息入库
  83. $goods_total_money = 0;//商品总金额
  84. foreach ($goods_data['goods_list'] as $goods){
  85. if ($shop_id != $goods['shop_id']){
  86. DB::rollBack();
  87. return ['code' => 0, 'msg' => '商品与商家不符'];
  88. }
  89. $goods_info = [
  90. 'm_id' => $m_id,
  91. 'shop_id' => $shop_id,
  92. 'order_id' => $order_id,
  93. 'goods_id' => $goods['goods_id'],
  94. 'goods_spec_list' => empty($goods['spec_list']) ? '' : $goods['spec_list'],
  95. 'goods_name' => $goods['goods_name'],
  96. 'goods_img' => $goods['goods_image'],
  97. 'goods_attr' => trim($goods['goods_attr'],','),
  98. 'goods_price' => $goods['price'],
  99. 'goods_number' => $goods['goods_number'],
  100. 'goods_money' => $goods['goods_money'],
  101. ];
  102. //总商品金额
  103. $goods_total_money = bcadd($goods_total_money,$goods_info['goods_money'],2);
  104. OrderItem::create($goods_info);
  105. }
  106. //删除购物车
  107. $shopping = ShoppingCartServer::creatServer()->delShopping($m_id,$shop_id);
  108. if ($shopping['code'] == 0){
  109. DB::rollBack();
  110. return ['code' => 0, 'msg' => '下单失败'];
  111. }
  112. DB::commit();
  113. return ['code' => 1, 'msg' => '成功', 'data' => ['order_id'=>$order_id]];
  114. }catch (\Exception $e){
  115. DB::rollBack();
  116. return ['code'=>0,'msg'=>'下单出错'.$e->getMessage()];
  117. }
  118. }
  119. /**
  120. * 支付回调
  121. * @param $pay_type
  122. * @param $order_sn
  123. * @param $pay_code
  124. * @param $pay_money
  125. * @param $notify_info
  126. * @return bool
  127. */
  128. function NotifyPay($pay_type,$order_sn, $pay_code, $pay_money, $notify_info)
  129. {
  130. $order_info = Order::where('order_sn', $order_sn)->where('order_status', 1)->first();
  131. if (empty($order_info)) {
  132. ErrorRecord::create(['msg' => $order_sn . '订单支付状态错误', 'data' => serialize($notify_info)]);
  133. return false;
  134. }
  135. // $is_test = env('TEST_SERVE', false);
  136. $is_test=config('weixin.test_serve',false);
  137. if ($order_info->{'pay_money'} != $pay_money && !$is_test) {
  138. Order::where('id', $order_info->{'id'})->update(['pay_code' => $pay_code]);
  139. ErrorRecord::create(['msg' => $order_info->{'order_sn'} . '支付金额不匹配', 'data' => serialize($notify_info)]);
  140. return false;
  141. }
  142. $date = date('Y-m-d H:i:s');
  143. $shop_id = $order_info->{'shop_id'};
  144. //店铺订单序号生成
  145. $key = $shop_id . '_number';
  146. $total_count = RedisDataServer::creatServer()->getData($key);
  147. if (empty($total_count)){
  148. $total_count = '1';
  149. // 获取当前时间戳
  150. $now = time();
  151. // 获取今天结束的时间戳
  152. $endOfDay = strtotime("tomorrow") - 1;
  153. // 计算剩余时间(秒)
  154. $secondsLeft = bcsub($endOfDay,$now,1);
  155. RedisDataServer::creatServer()->setData($key,$total_count,'str',$secondsLeft);
  156. }
  157. RedisDataServer::creatServer()->setIncr($key);
  158. //订单更新信息
  159. $update['pay_type'] = $pay_type;
  160. $update['pay_time'] = $date;
  161. $update['pay_code'] = $pay_code;
  162. $update['number'] = $total_count;
  163. $update['order_status'] = 2;
  164. //更新订单信息
  165. Order::where('id', $order_info->{'id'})->update($update);
  166. // 投递打印消息
  167. JobServer::creatServer()->shopOrderPrintJob($order_info->{'id'},$order_info->{'shop_id'});
  168. //订单存储
  169. $this->syncOrder($order_info->{'id'});
  170. return true;
  171. }
  172. function syncOrder($orderId)
  173. {
  174. //todo 需要加条件,必须为支付成功的
  175. $order=Order::where('id', $orderId)->where('order_status',2)->first();
  176. if (empty($order)){
  177. return false;
  178. }
  179. $sMid=Member::where('id',$order->{'m_id'})->value('main_id');
  180. //获取店铺配置
  181. $shop_set = MainShopSet::where('shop_id', $order->{'shop_id'})->select(['id', 'shop_id', 'discount', 'province_num', 'city_num', 'area_num', 'sales_num', 'shop_num', 'member_num', 'purchases_num', 'member_cash', 'service_num','is_bean'])->first();
  182. if (empty($shop_set)){
  183. $discount = 0;
  184. }else{
  185. $discount = $shop_set->{'discount'};
  186. }
  187. $pay_info = [
  188. 'shop_id' => $order->{'shop_id'},
  189. 'm_id' => $sMid,
  190. 'rs_sn' => $order->{'order_sn'},
  191. 'pay_sn' => $order->{'pay_code'},
  192. 'pay_type' => $order->{'pay_type'},
  193. 'pay_money' => $order->{'pay_money'},
  194. 'status' => 2,
  195. 'discount' => $discount,
  196. 'is_clearing' => 0,
  197. 'pay_code_source'=>1,
  198. 'is_bank'=>0,
  199. 'food_id'=>$order->{'id'},
  200. ];
  201. return MainShopOrder::create($pay_info);
  202. }
  203. }