AisOrder.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. <?php
  2. /**
  3. * @copyright Copyright (c) 2017 https://www.sapixx.com All rights reserved.
  4. * @license Licensed (http://www.apache.org/licenses/LICENSE-2.0).
  5. * @author pillar<ltmn@qq.com>
  6. * 订单管理
  7. */
  8. namespace app\ais\model;
  9. use app\common\model\SystemUserLevel;
  10. use app\common\facade\WechatPay;
  11. use think\Model;
  12. class AisOrder extends Model{
  13. public function store(){
  14. return $this->hasOne('AisStore','id','store_id');
  15. }
  16. public function conponUser(){
  17. return $this->hasOne('AisCouponUser','id','coupon_user_id');
  18. }
  19. public function user(){
  20. return $this->hasOne('app\common\model\SystemUser','id','uid');
  21. }
  22. /**
  23. * 创建订单
  24. * @param array $param
  25. * @return void
  26. */
  27. public static function addOrder(array $param){
  28. $data = [];
  29. $data['member_miniapp_id'] = $param['member_miniapp_id'];
  30. $data['store_id'] = $param['store_id'];
  31. $data['store_chain_id'] = $param['store_chain_id'];
  32. $data['parent_store_id'] = $param['parent_store_id'] ?? 0;
  33. $data['uid'] = $param['uid'];
  34. $data['coupon_user_id'] = $param['user_couponr_id'];
  35. $data['order_no'] = $param['order_no'];
  36. $data['amount'] = $param['money']; //输入金额
  37. $data['price'] = $param['price']; //实际金额
  38. $data['coupon_cache'] = empty($param['coupon_cache'])?'':json_encode($param['coupon_cache']); //留存优惠券
  39. $data['state'] = 0;
  40. $data['update_time'] = time();
  41. return self::insertGetId($data);
  42. }
  43. /**
  44. * 计算器付款价格
  45. * @param array $param [计算参数]
  46. * @return type
  47. */
  48. public static function countPrice(array $param){
  49. $money = floatval($param['money']); //用户默认付款价
  50. //我的优惠券
  51. $coupon_user = [];
  52. $coupon_user['member_miniapp_id'] = $param['member_miniapp_id'];
  53. $coupon_user['store_id'] = $param['store_id'];
  54. $coupon_user['id'] = $param['user_couponr_id'];
  55. $coupon_user['uid'] = $param['uid'];
  56. $coupon_user['is_end'] = 0;
  57. $coupon_user_rel = AisCouponUser::where($coupon_user)->find();
  58. //需要优惠的价格(分)
  59. $coupon_user_price = 0;
  60. if(!empty($coupon_user_rel)){
  61. if($money < $coupon_user_rel->howmuch){
  62. return false;
  63. }
  64. $config = AisConfig::getConfig($coupon_user['member_miniapp_id']);
  65. if(!empty($config->coupon_longtime) && ($coupon_user_rel->create_time + $config->coupon_longtime * 60 * 60) <= time()){
  66. return false;
  67. }
  68. if($coupon_user_rel->types){//折扣
  69. $coupon_user_price = $money - $money * ($coupon_user_rel->discount/10);
  70. }else{//代金
  71. $coupon_user_price = $coupon_user_rel->price;
  72. }
  73. }
  74. $amount = $money - $coupon_user_price;
  75. $data['price'] = $amount <= 0 ? 0.01 : $amount;
  76. $data['coupon'] = $coupon_user_rel;
  77. return $data;
  78. }
  79. /**
  80. * 微信买单收益分账
  81. * @param array $order 订单信息
  82. * @return void
  83. */
  84. public static function income($order,$allMoney,$flag){
  85. $store = AisStore::where(['id' => $order->store_id])->find();
  86. if(empty($store)){
  87. return;
  88. }
  89. $setting = AisConfig::getConfig($store->member_miniapp_id);
  90. $storeProfit = AisStore::where(['id' => $order->parent_store_id])->find();
  91. //没有分帐直接返回
  92. if($flag == 'N'){
  93. //如果是店铺直接会员 只扣手续费
  94. $order->parent_store_price = 0;
  95. $order->real = money($allMoney - $allMoney * 6 / 1000);
  96. return $order;
  97. }
  98. //平台所扣费率
  99. $charge = $store->charge ?? $setting->charge;
  100. $queen = []; //分账队列参数
  101. //会员买单奖励
  102. if($flag == 'Y' && !empty($setting) && !empty($setting->group_profit)){
  103. //平台所需扣除总额
  104. $profitMoney = money($allMoney * $charge);
  105. //平台承担手续费
  106. $charges = money($allMoney * 6 / 1000);
  107. //扣除平台收费后所余
  108. $allMoney = money($allMoney - $profitMoney);
  109. //用户的直接上级会员
  110. $level = SystemUserLevel::where(['user_id' => $order->uid,'level' => 1])->find();
  111. if(!empty($level)){
  112. //直接上级会员所属会员组
  113. $storeLevel_1 = AisStore::where(['manage_uid' => $level->parent_id])->find();
  114. $vipUser = AisVipUser::where(['member_miniapp_id' => $store->member_miniapp_id,'uid' => $level->parent_id,'is_lock' => 0])->find();
  115. $ex = $profitMoney; //临时用
  116. //根据直接上级会员组配置开始分帐
  117. if(!empty($vipUser)){
  118. $vip = AisVip::where(['member_miniapp_id' => $store->member_miniapp_id,'id' => $vipUser->vip_id,'is_lock' => 0])->find();
  119. if(!empty($vip)){
  120. $money = money($ex * $vip->pay_share_reward);
  121. //会员余额增加
  122. $bank = AisBank::where(['uid' => $level->parent_id])->find();
  123. if(empty($bank)){
  124. $bank = new AisBank;
  125. $bank->uid = $level->parent_id;
  126. $bank->member_miniapp_id = $order->member_miniapp_id;
  127. $bank->money = 0;
  128. }
  129. $bank->money = $bank->money + $money;
  130. $bank->save();
  131. AisBill::add(['member_miniapp_id' => $store->miniapp_id,'store_id' => $store->id,'money' => $money,'uid' => $level->parent_id],'微信支付[奖励]');
  132. }
  133. }
  134. //如果上级会员有店铺
  135. if(!empty($storeLevel_1)){
  136. $level_2 = SystemUserLevel::where(['user_id' => $level->parent_id,'level' => 1])->find();
  137. if(empty($level_2)){
  138. $vipUser = AisVipUser::where(['member_miniapp_id' => $store->member_miniapp_id,'uid' => $level_2->parent_id,'is_lock' => 0])->find();
  139. if(!empty($vipUser)){
  140. $vip = AisVip::where(['member_miniapp_id' => $store->member_miniapp_id,'id' => $vipUser->vip_id,'is_lock' => 0])->find();
  141. if(!empty($vip)){
  142. $money = money($ex * $vip->pay_queue_reward);
  143. //会员余额增加
  144. $bank = AisBank::where(['uid' => $level_2->parent_id])->find();
  145. if(empty($bank)){
  146. $bank = new AisBank;
  147. $bank->uid = $level_2->parent_id;
  148. $bank->member_miniapp_id = $order->member_miniapp_id;
  149. $bank->money = 0;
  150. }
  151. $bank->money = $bank->money + $money;
  152. $bank->save();
  153. AisBill::add(['member_miniapp_id' => $store->miniapp_id,'store_id' => $store->id,'money' => $money,'uid' => $level_2->parent_id],'微信支付[奖励]');
  154. }
  155. }
  156. }
  157. }
  158. }
  159. //引荐买单奖励
  160. $profitMoney = 0;
  161. if(!empty($storeProfit)){
  162. $money = money($ex * $setting->group_profit);
  163. $profitMoney = money($profitMoney - $money);
  164. $queen[] = [
  165. 'member_miniapp_id' => $storeProfit->member_miniapp_id,
  166. 'store_id' => $storeProfit->id,
  167. 'uid' => 0,
  168. 'mch_id' => $storeProfit->mch_id,
  169. 'amount' => $money * 100,
  170. 'transaction_id' => $order->paid_no,
  171. 'out_order_no' => $order->order_no,
  172. 'is_finish' => 0,
  173. 'types' => 1,
  174. 'msg' =>'结算到商户号',
  175. ];
  176. AisStoreBill::add(['miniapp_id' => $storeProfit->member_miniapp_id,'uid' => $storeProfit->manage_uid,'store_id' => $storeProfit->id,'pay_uid' => $order['user_id'],'money' => $profitMoney],'引荐买单奖励'); //引荐商家账单
  177. }
  178. //平台收入
  179. $profitMoney = money($profitMoney - $charges);
  180. if(!empty($setting->config)){
  181. $queen[] = [
  182. 'member_miniapp_id' => $store->member_miniapp_id,
  183. 'store_id' => $store->id,
  184. 'uid' => 0,
  185. 'mch_id' => 0,
  186. 'amount' => $profitMoney * 100,
  187. 'transaction_id' => $order->paid_no,
  188. 'out_order_no' => $order->order_no,
  189. 'is_finish' => 0,
  190. 'types' => 2,
  191. 'msg' => '结算到平台',
  192. ];
  193. }
  194. //分给商户
  195. $queen[] = [
  196. 'member_miniapp_id' => $store->member_miniapp_id,
  197. 'store_id' => $store->id,
  198. 'uid' => 0,
  199. 'mch_id' => $store->mch_id,
  200. 'amount' => $allMoney * 100,
  201. 'transaction_id' => $order->paid_no,
  202. 'out_order_no' => $order->order_no,
  203. 'is_finish' => 0,
  204. 'types' => 1,
  205. 'msg' => '结算到商户号',
  206. ];
  207. $order->parent_store_price = $profitMoney;
  208. $order->real = $allMoney;
  209. AisQueen::createQueen($queen);
  210. }
  211. return $order;
  212. }
  213. //优惠券补贴
  214. public static function subsidy($order){
  215. $subsideze = AisCouponSubsidize::where(['member_miniapp_id' =>$order->member_miniapp_id,'coupon_id' => $order->conponUser->coupon_id])->find();
  216. if($subsideze){
  217. // $setting = AisConfig::getConfig($order->member_miniapp_id);
  218. //判断是否成功
  219. $is_success = false;
  220. $trade_no = $order->order_no . 'WE';
  221. $subsidezeBill = AisFundBill::where(['member_miniapp_id' =>$order->member_miniapp_id,'order_no' => $trade_no])->find();
  222. if(empty($subsidezeBill)){
  223. $subsidezeBill = new AisFundBill;
  224. $subsidezeBill->member_miniapp_id = $order->member_miniapp_id;
  225. $subsidezeBill->store_id = $order->store_id;
  226. $subsidezeBill->uid = $order->member_miniapp_id;
  227. $subsidezeBill->types = 1;
  228. $subsidezeBill->money = $subsideze->how_much;
  229. $subsidezeBill->order_no = $trade_no;
  230. }
  231. if(!empty($order->store->user->official_uid) && $subsideze->how_much < 5000){
  232. $app = WechatPay::doPay($order->member_miniapp_id,true);
  233. $rel = $app->transfer->toBalance(['partner_trade_no' => $trade_no,'openid' => $order->store->user->official_uid,'check_name' => 'NO_CHECK','amount' => $subsideze->how_much*100,'desc' => '优惠券补贴']);
  234. if ($rel['return_code'] === 'SUCCESS') {
  235. if ($rel['result_code'] === 'SUCCESS') {
  236. $is_success = true;
  237. $subsidezeBill->state = 1;
  238. $subsidezeBill->message = "优惠券补贴已结算到微信钱包";
  239. }else{
  240. $subsidezeBill->message = $rel['err_code_des'];
  241. }
  242. }else{
  243. $subsidezeBill->message = $rel['return_msg'];
  244. }
  245. }
  246. if(!$is_success){
  247. $subsidezeBill->state = 2;
  248. }
  249. $subsidezeBill->update_time = time();
  250. return $subsidezeBill->save();
  251. }else{
  252. return false;
  253. }
  254. }
  255. }