AllianceOrderComplete.php 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875
  1. <?php
  2. /**
  3. * 重庆赤晓店信息科技有限公司
  4. * https://www.chixiaodian.com
  5. * Copyright (c) 2023 赤店商城 All rights reserved.
  6. */
  7. namespace app\modules\alliance\models;
  8. use app\constants\OptionSetting;
  9. use app\models\Admin;
  10. use app\models\common\events\OrderEvent;
  11. use app\models\AccountLog;
  12. use app\models\CardSend;
  13. use app\models\common\Bind;
  14. use app\models\common\ShareMoney;
  15. use app\models\CouponPaySend;
  16. use app\models\Goods;
  17. use app\models\Option;
  18. use app\models\Order;
  19. use app\models\OrderDetail;
  20. use app\models\OrderMessage;
  21. use app\models\SaaSLeaguePriceLog;
  22. use app\models\SaasUser;
  23. use app\models\Salesman;
  24. use app\models\Share;
  25. use app\models\ShareDetail;
  26. use app\models\ShareHolder;
  27. use app\models\Shop;
  28. use app\models\ShopShare;
  29. use app\models\Store;
  30. use app\models\StoreShareMoney;
  31. use app\models\User;
  32. use app\models\VerifyCard;
  33. use app\models\VerifyCardAccount;
  34. use app\models\VerifyCardSale;
  35. use app\modules\alliance\models\BindForm;
  36. use app\modules\alliance\models\ShareMoneyForm;
  37. use app\utils\BookOrderNum;
  38. use app\utils\Notice\NoticeSend;
  39. use app\utils\PrintOrder;
  40. use app\utils\Share\BonusPool;
  41. use app\utils\Tools;
  42. use yii\base\BaseObject;
  43. use yii\base\Model;
  44. use yii\helpers\Json;
  45. use app\utils\OrderNo;
  46. use app\modules\alliance\models\purchase\order\OrderPayDataForm;
  47. use app\modules\admin\models\pospal\PospalForm;
  48. use app\modules\admin\models\mochat\MochatForm;
  49. use app\models\DeliveryInfo;
  50. use app\utils\Delivery\Delivery;
  51. use app\utils\Delivery\Alipay\ADelivery;
  52. use app\modules\admin\models\maiyatian\MaiyatianForm;
  53. use app\modules\admin\models\keloop\KeloopForm;
  54. class AllianceOrderComplete extends Model
  55. {
  56. public $order;
  57. public $store_id = 1;
  58. public $order_id;
  59. public $order_type;
  60. public $form_id;
  61. public $order_refund_no;
  62. const EVENT_ORDER_FOLLOW = 'order_follow_up';
  63. const EVENT_ORDER_REFUND = 'order_refund';
  64. // 支付完成之后,相关的操作
  65. public function notify(OrderEvent $event = null)
  66. {
  67. $this->store_id = $event ? $event->store_id : $this->store_id;
  68. $this->order_id = $event ? $event->order_id : $this->order_id;
  69. $this->order_type = $event ? $event->order_type : $this->order_type;
  70. try {
  71. // if ($this->order_type == 6) {
  72. // $this->scanOrderNotify($event);
  73. // } else {
  74. try {
  75. $this->OrderNotify($event);
  76. } catch (\Exception $e) {
  77. debug_log($e->getMessage(), 'saas_integral.log');
  78. }
  79. // }
  80. //$is_print = 1;
  81. /**
  82. * @var Order $order
  83. */
  84. $order = $this->order;
  85. // 自提点分红
  86. //$this->shareShop($order, $event);
  87. // 积分抵扣的话减去积分
  88. $this->reduceIntegral($order);
  89. $this->setReturnData($order);
  90. // 分红处理
  91. //BonusPool::levelShare($order->id);
  92. // 股东分红处理
  93. //$this->agent_profit($order);
  94. //发放核销卡
  95. $this->sendVerifyCard($order->id, $order->saas_id, $order->order_type);
  96. // 后台订单提醒
  97. OrderMessage::set($order->id, $order->store_id, $this->order_type, 0);
  98. // 代理订单返佣逻辑
  99. // $this->agencyPrice($order->id);
  100. // 处理虚拟商品订单状态
  101. if (($order->order_type == 4 && $order->verify_card_id == 0)) {
  102. $order->confirm_time = time();
  103. $order->send_time = time();
  104. $order->trade_status = Order::ORDER_FLOW_CONFIRM;
  105. if (!$order->save()) {
  106. \Yii::warning($order->errors);
  107. }
  108. }
  109. if ($order->order_type == 3 && $order->is_offline == 1) {
  110. $order->send_time = time();
  111. $order->trade_status = Order::ORDER_FLOW_SEND;
  112. }
  113. // 生成点餐号码
  114. // if ($order->order_type == 3 && $order->is_offline == 1) {
  115. $order->food_code = self::getFoodCode($order->store_id, $order->md_id);
  116. if (!$order->save()) {
  117. \Yii::warning(['<============= 订单号:' . $order->order_no .'生成点餐号码', $order->errors]);
  118. }
  119. // }
  120. // 同城配送订单下单
  121. $orderNoHead = substr($order->order_no, 0, 2);
  122. if (in_array($orderNoHead, ['AL', OrderNo::ORDER_PT]) && $order->is_delivery == 1) {
  123. $local_type = Option::get(OptionSetting::STORE_LOCAL_TYPE, $order->store_id, 'store')['value'];
  124. $local_type = Option::get(OptionSetting::STORE_LOCAL_TYPE, $order->store_id, 'pay', $local_type)['value'];
  125. if($local_type == 'maiyatian' && !isset($delivery_res) && MaiyatianForm::isopen($order->store_id)){
  126. $delivery_res = MaiyatianForm::order_created($order->store_id, $order->id);
  127. \Yii::error('-----------Maiyatian同城配送返回' . Json::encode($delivery_res));
  128. }
  129. if($local_type == 'keloop' && !isset($delivery_res) && KeloopForm::isSaasOpen()){
  130. $delivery_res = KeloopForm::order_created($order->store_id, $order->id);
  131. \Yii::error('-----------keloop同城配送返回' . Json::encode($delivery_res));
  132. }
  133. if($local_type == 'aggregate'){
  134. if(!isset($delivery_res) && $order->alipay_trade_no){
  135. $delivery_info = DeliveryInfo::findOne(['store_id' => $order->store_id, 'order_no' => $order->order_no]);
  136. $detail_goods = OrderDetail::find()->where(['order_id' => $order->id])->select('goods_name as name, pic, num, total_price as price')->asArray()->all();
  137. $delivery_res = ADelivery::createOrder(0, $order->store_id, $delivery_info->mini_id,
  138. $order->user->alipay_open_id, $detail_goods, $order->order_no, $delivery_info->address_id);
  139. \Yii::error('-----------同城配送返回' . Json::encode($delivery_res));
  140. }else if(!isset($delivery_res)){
  141. $detail_goods = OrderDetail::find()->where(['order_id' => $order->id])->select('goods_name as name, pic, num, total_price as price')->asArray()->all();
  142. $delivery_res = Delivery::addOrder($detail_goods, $order->order_no);
  143. \Yii::error('-----------同城配送返回' . Json::encode($delivery_res));
  144. }
  145. }
  146. if($local_type == 'self'){
  147. }
  148. }
  149. // 订单打印
  150. $printer_order = new PrintOrder($order->store_id, $order->id, 'pay', 0, 0, 0, $order['mch_id']);
  151. $printer_order->print_order();
  152. // $form = new NewMerchantForm();
  153. // $form->store_id = $order->store_id;
  154. // if ($order->store_id > 0) {
  155. // $form->saasGiveIntegral($order->pay_price, $order->user_id, $order->order_no, 1);
  156. // }
  157. } catch (\Exception $e) {
  158. \Yii::error('line->>>' . $e->getLine());
  159. \Yii::error($e->getMessage());
  160. \Yii::error(json_encode($e->getTrace()));
  161. \Yii::error('订单支付完成后操作异常');
  162. }
  163. }
  164. public function setReturnData($order) {
  165. //处理联盟券 用户减少
  166. if($order->take_price > 0){
  167. $user = User::findOne($order->user_id);
  168. $saas_user = SaasUser::findOne(['mobile' => $user->binding]);
  169. if($saas_user){
  170. $take_price = $order->take_price;
  171. $before = $saas_user->league_price;
  172. $saas_user->updateCounters(['league_price' => -floatval($take_price)]);
  173. \app\models\SaaSLeaguePriceLog::setLeaguePriceLog(
  174. $order->store_id,
  175. $saas_user->id,
  176. $take_price,
  177. $before,
  178. \app\models\SaaSLeaguePriceLog::TYPE_DEDUCTION,
  179. \app\models\SaaSLeaguePriceLog::TAKE_TYPE,
  180. \app\models\SaaSLeaguePriceLog::ROLE_USER,
  181. $order->id
  182. );
  183. }
  184. }
  185. }
  186. // private function agencyPrice($order_id){
  187. // try {
  188. // $order = Order::findOne($order_id);
  189. // //获取代理商ID
  190. // $option = Option::get('agency_price_config', 0, 'saas', [])['value'];
  191. // if ($option) {
  192. // $option = json_decode($option, true);
  193. // }
  194. // $province_percent = $option['province_percent'] ?? 0;
  195. // $city_percent = $option['city_percent'] ?? 0;
  196. // $district_percent = $option['district_percent'] ?? 0;
  197. // $store = Store::findOne($order->store_id);
  198. // $admin_list = Admin::find()->where(['province_id' => $store->province_id, 'is_delete' => 0])->andWhere(['>', 'area_level', 0])->asArray()->all();
  199. // $saasUser = get_saas_user();
  200. // foreach ($admin_list as $item) {
  201. // $ag_rebate = 0;
  202. // $rate = 0;
  203. // $desc = '';
  204. // //省
  205. // if ((int)$item['area_level'] === 3) {
  206. // $ag_rebate = $order->ag_rebate * ($province_percent / 100);
  207. // $ag_rebate = sprintf("%.2f", $ag_rebate);
  208. // $desc = '用户' . $saasUser->name . '下单,订单' . $order->order_no . ',发放 ' . $ag_rebate . '元省代佣金';
  209. // }
  210. // //市
  211. // if ((int)$item['area_level'] === 2 && (int)$item['city_id'] === (int)$store->city_id) {
  212. // $ag_rebate = $order->ag_rebate * ($city_percent / 100);
  213. // $ag_rebate = sprintf("%.2f", $ag_rebate);
  214. // $desc = '用户' . $saasUser->name . '下单,订单' . $order->order_no . ',发放 ' . $ag_rebate . '元市代佣金';
  215. // }
  216. // //区
  217. // if ((int)$item['area_level'] === 1 && (int)$item['city_id'] === (int)$store->city_id && (int)$item['district_id'] === (int)$store->district_id) {
  218. // $ag_rebate = $order->ag_rebate * ($district_percent / 100);
  219. // $ag_rebate = sprintf("%.2f", $ag_rebate);
  220. // $desc = '用户' . $saasUser->name . '下单,订单' . $order->order_no . ',发放 ' . $ag_rebate . '元区代佣金';
  221. // }
  222. // if (!$ag_rebate) {
  223. // continue;
  224. // }
  225. // //给用户增加佣金
  226. // $SaasUser = SaasUser::findOne($item['saas_user_id']);
  227. // $SaasUser->share_profit = ($SaasUser->share_profit * 1) + ($ag_rebate * 1);
  228. // $res = $SaasUser->save();
  229. // //增加记录
  230. // if ($res) {
  231. // $form = new StoreShareMoney();
  232. // $form->user_id = $SaasUser->id;
  233. // $form->store_id = $store->id;
  234. // $form->profit = $store->profit;
  235. // $form->total_price = $order->total_price;
  236. // $form->desc = $desc;
  237. // $form->order_id = $order_id;
  238. // $form->created_at = time();
  239. // $form->type = 1;
  240. // $form->status = 0;
  241. // $form->commission = $ag_rebate;
  242. // $form->is_send = 1;
  243. // $form->save();
  244. // }
  245. // }
  246. // } catch (\Exception $e) {
  247. // \Yii::error($e->getMessage());
  248. // }
  249. // }
  250. /**
  251. * @param $order Order
  252. */
  253. private function agent_profit($order) {
  254. // 判断是否开启奖金池
  255. // $setting = [
  256. // 'is_open_area' => Option::get('is_open_area', $order->store_id, 'bonus_pool', 0)['value'],
  257. // ];
  258. //
  259. // if (!$setting['is_open_area']) {
  260. // \Yii::warning('---------------- 未开启代理分红 -------------------');
  261. // return;
  262. // }
  263. // 省代
  264. $province_share_holder = ShareHolder::find()->where(['is_delete' => 0, 'status' => 1, 'store_id' => $order->store_id, 'agent_type' => 1, 'province_id' => $order->province_id, 'agent_rate_status' => 1])->andWhere(['>', 'agent_rate', 0])->one();
  265. if (!$province_share_holder) {
  266. \Yii::error('-------------- 订单号:' . $order->order_no . ' 未发现省代理----------------');
  267. } else {
  268. $detail = new ShareDetail();
  269. $detail->store_id = $order->store_id;
  270. $detail->type_id = $order->id;
  271. $detail->type = 3;
  272. $detail->user_id = $province_share_holder->user_id;
  273. $detail->desc = '订单号:'.$order->order_no.'代理分红';
  274. $detail->is_send = 0;
  275. $detail->money = round($order->profit * $province_share_holder->agent_rate / 100, 2);
  276. $detail->save();
  277. }
  278. // 市代
  279. $city_share_holder = ShareHolder::find()->where(['is_delete' => 0, 'status' => 1, 'store_id' => $order->store_id, 'agent_type' => 2, 'city_id' => $order->city_id, 'agent_rate_status' => 1])->andWhere(['>', 'agent_rate', 0])->one();
  280. if (!$city_share_holder) {
  281. \Yii::error('-------------- 订单号:' . $order->order_no . ' 未发现市代理----------------');
  282. } else {
  283. $detail = new ShareDetail();
  284. $detail->store_id = $order->store_id;
  285. $detail->type_id = $order->id;
  286. $detail->type = 3;
  287. $detail->user_id = $city_share_holder->user_id;
  288. $detail->desc = '订单号:'.$order->order_no.'代理分红';
  289. $detail->is_send = 0;
  290. $detail->money = round($order->profit * $city_share_holder->agent_rate / 100, 2);
  291. $detail->save();
  292. }
  293. // 区代
  294. $district_share_holder = ShareHolder::find()->where(['is_delete' => 0, 'status' => 1, 'store_id' => $order->store_id, 'agent_type' => 3, 'district_id' => $order->district_id, 'agent_rate_status' => 1])->andWhere(['>', 'agent_rate', 0])->one();
  295. if (!$district_share_holder) {
  296. \Yii::error('-------------- 订单号:' . $order->order_no . ' 未发现区域代理----------------');
  297. } else {
  298. $detail = new ShareDetail();
  299. $detail->store_id = $order->store_id;
  300. $detail->type_id = $order->id;
  301. $detail->type = 3;
  302. $detail->user_id = $district_share_holder->user_id;
  303. $detail->desc = '订单号:'.$order->order_no.'代理分红';
  304. $detail->is_send = 0;
  305. $detail->money = round($order->profit * $district_share_holder->agent_rate / 100, 2);
  306. $detail->save();
  307. }
  308. }
  309. private function reduceIntegral($order) {
  310. if ($order->store_id <= 0) {
  311. $type = 0;
  312. $integral = Json::decode($order->integral_price);
  313. $user = SaasUser::findOne($order->saas_id);
  314. } else {
  315. $type = 1;
  316. $integral = Json::decode($order->integral)['forehead_integral'] ?: 0;
  317. $user = User::findOne($order->user_id);
  318. }
  319. // 减去当前用户账户积分
  320. if ($integral > 0) {
  321. $before = $user->integral;
  322. $user->integral -= $integral;
  323. if ($user->save()) {
  324. $log = new AccountLog();
  325. $log->store_id = $order->store_id;
  326. $log->user_id = 0;
  327. if ($type) {
  328. $log->user_id = $user->id;
  329. } else {
  330. $log->saas_id = $user->id;
  331. }
  332. $log->type = AccountLog::TYPE_INTEGRAL;
  333. $log->log_type = AccountLog::LOG_TYPE_EXPEND;
  334. $log->amount = $integral;
  335. $log->desc = "订单积分抵扣支付,订单号为:{$order->order_no}。";
  336. $log->before = $before;
  337. $log->after = $user->integral;
  338. $log->operator = '';
  339. $log->operator_id = 0;
  340. $log->operator_type = AccountLog::TYPE_OPERATOR_NORMAL;
  341. $log->created_at = time();
  342. $log->order_id = $order->id;
  343. $log->order_type = AccountLog::TYPE_PLATFORM_ORDER;
  344. if (!$log->save()) {
  345. debug_log($log->errors,'saas_integral.log');
  346. };
  347. } else {
  348. debug_log($user->errors,'saas_integral.log');
  349. }
  350. }
  351. }
  352. /**
  353. * 发放核销卡
  354. */
  355. private function sendVerifyCard($order_id, $user_id, $order_type) {
  356. $goods_id = OrderDetail::find()->select('goods_id')->where(['order_id' => $order_id,'is_delete' => 0])->asArray()->all();
  357. foreach ($goods_id as $k => $v) {
  358. $verify_card_info = Goods::find()->select('id, verify_card_id')->where(['id' => $v['goods_id'], 'is_delete' => 0])->asArray()->one();
  359. if (empty($verify_card_info)) {
  360. continue;
  361. }
  362. $this->startSendVerifyCard($verify_card_info['verify_card_id'], $verify_card_info['id'], $user_id, $order_type);
  363. }
  364. }
  365. /**
  366. * 核销卡发放
  367. */
  368. private function startSendVerifyCard($verify_card_id, $goods_id, $user_id, $order_type){
  369. if (!empty($verify_card_id)){
  370. $verify_card_id_arr = explode(',', $verify_card_id);
  371. $res = Tools::getVerifyList($verify_card_id_arr);
  372. \Yii::error($res);
  373. foreach($res as $value){
  374. $verify_form = new VerifyCardSale();
  375. $verify_form->store_id = $this->store_id;
  376. $verify_form->user_id = $user_id;
  377. $verify_form->verify_card_id = $value['id'];
  378. if ($value['type'] == 1) {
  379. //查询核销卡使用总次数
  380. $left_info = VerifyCard::find()->select('total_num, expire_day')->where([
  381. 'id' => $value['id'],
  382. 'is_delete' => 0
  383. ])->asArray()->one();
  384. $verify_form->left_num = $left_info['total_num'];
  385. } else {
  386. $verify_form->left_num = 1;
  387. }
  388. $account = VerifyCardAccount::find()->where(['store_id' => $value['store_id'], 'card_id' => $value['id'], 'status' => 0])->one();
  389. if (!$account) {
  390. \Yii::error('================== 卡券发放结果:未找到数据,卡券id为:' . $value['id']);
  391. continue;
  392. }
  393. $verify_form->account_id = $account->id;
  394. $verify_form->sale_time = time();
  395. if ($value['date_type'] == 1) {
  396. $verify_form->end_time = time() + $left_info['expire_day'] * (3600*24);
  397. } else {
  398. $verify_form->end_time = $value['end_time'];
  399. }
  400. $verify_form->goods_id = $goods_id;
  401. $verify_form->order_type = $order_type;
  402. if ($verify_form->save()) {
  403. if ($value['type'] == 1) {
  404. //核销卡核销数量增加
  405. $verify_card_form = VerifyCard::findOne([
  406. 'id' => $value['id'],
  407. 'is_delete' => 0
  408. ]);
  409. $verify_card_form->use_num += 1;
  410. if (!$verify_card_form->save()) {
  411. continue;
  412. }
  413. } else {
  414. $card = VerifyCard::findOne(['id' => $value['id'], 'is_delete' => 0]);
  415. $account = VerifyCardAccount::findOne($verify_form->account_id);
  416. $account->status = 1;
  417. if (!$account->save()) {
  418. continue;
  419. }
  420. $card->send_times += 1;
  421. $card->save();
  422. }
  423. } else {
  424. \Yii::warning($verify_form->errors);
  425. }
  426. }
  427. }
  428. }
  429. // 自提点分销
  430. public function shareShop($order) {
  431. return false;
  432. if ($order->is_offline == 1) {
  433. $shop = Shop::findOne($order->shop_id);
  434. if ($shop) {
  435. $user = User::findOne($order->user_id);
  436. $info = addslashes("会员 ".$user->nickname." 下单,获得奖励");
  437. $orderDetail = OrderDetail::find()->select(['goods_id','total_price','num'])->where(['order_id' => $order->id])->all();
  438. $shop_bili = Option::get(OptionSetting::SHOP_RATIO, $order->store_id)['value'];
  439. $shop_bili_type = Option::get(OptionSetting::SHOP_RATIO_TYPE, $order->store_id)['value'];
  440. $money = 0;
  441. foreach ($orderDetail as $v){
  442. $goods_money = $v['total_price'];
  443. if($shop_bili_type == 2){
  444. $money += $v['num']*$shop_bili;
  445. }else{
  446. $money += $goods_money*$shop_bili * 0.01;
  447. }
  448. }
  449. if ($money > 0.01) {
  450. $share_form = new ShopShare();
  451. $share_form->store_id = $order->store_id;
  452. $share_form->order_id = $order->id;
  453. $share_form->shop_id = $shop->id;
  454. $share_form->amount = $money;
  455. $share_form->user_id = $order->user_id;
  456. $share_form->the_desc = $info;
  457. $share_form->created_at = time();
  458. $share_form->save();
  459. }
  460. }
  461. }
  462. }
  463. // 商城
  464. private function OrderNotify($event)
  465. {
  466. $order = $this->order = Order::findOne(['id' => $this->order_id]);
  467. //$user = User::findOne($order->user_id);
  468. // 如果是余额抵扣订单,两条日志,分别是线上支付和余额支付
  469. $pay_price = $order->pay_price;
  470. // if ($order->is_combine_pay == Order::IS_COMBINE_PAY && $order->combine_money > 0) {
  471. // $money = $user->money;
  472. // $user->money = $user->money - $order->combine_money;
  473. // if ($user->save()) {
  474. // $log = new AccountLog();
  475. // $log->store_id = $order->store_id;
  476. // $log->user_id = $user->id;
  477. // $log->type = AccountLog::TYPE_BALANCE;
  478. // $log->log_type = AccountLog::LOG_TYPE_EXPEND;
  479. // $log->amount = $order->combine_money;
  480. // $log->desc = "商城订单余额支付,订单号为:{$order->order_no}。";
  481. // $log->before = $money;
  482. // $log->after = $user->money;
  483. // $log->operator = '';
  484. // $log->operator_id = 0;
  485. // $log->operator_type = AccountLog::TYPE_OPERATOR_NORMAL;
  486. // $log->created_at = time();
  487. // $log->order_id = $order->id;
  488. // $log->order_type = AccountLog::TYPE_PLATFORM_ORDER;
  489. // $log->save();
  490. // $pay_price = $order->pay_price - $order->combine_money;
  491. // }
  492. // }
  493. // if ($pay_price > 0 && $order->pay_type != 3) {
  494. // $log = new AccountLog();
  495. // $log->store_id = $order->store_id;
  496. // $log->user_id = $user->id;
  497. // $log->type = $order->pay_type == 1 ? AccountLog::TYPE_WECHAT : AccountLog::TYPE_ALIPAY;
  498. // $log->log_type = AccountLog::LOG_TYPE_EXPEND;
  499. // $log->amount = $pay_price;
  500. // $log->desc = "订单线上支付,订单号为:{$order->order_no}。";
  501. // $log->before = 0;
  502. // $log->after = 0;
  503. // $log->operator = '';
  504. // $log->operator_id = 0;
  505. // $log->operator_type = AccountLog::TYPE_OPERATOR_NORMAL;
  506. // $log->created_at = time();
  507. // $log->order_id = $order->id;
  508. // $log->order_type = AccountLog::TYPE_PLATFORM_ORDER;
  509. // $log->save();
  510. // }
  511. // // 首次付款,绑定上下级
  512. // if ($user->parent_id == 0 && $user->parent_user_id > 0) {
  513. // $form = new BindForm();
  514. // $form->user_id = $order->user_id;
  515. // $form->store_id = $order->store_id;
  516. // $form->parent_id = $user->parent_user_id;
  517. // $form->condition = 2;
  518. // $bindForm = $form->save();
  519. // if ($bindForm['code'] == 0) {
  520. // $form = new ShareMoneyForm();
  521. // $form->order = $this->order;
  522. // $form->order_type = $event->order_type;
  523. // $form->setData();
  524. // }
  525. // }
  526. // 预约商品库存操作
  527. BookOrderNum::bookNumReduce($order);
  528. // // 消费满指定金额自动成为分销商
  529. // $this->autoBecomeShare($order->user_id, $order->store_id, 'STORE');
  530. // // 购买指定或任意商品自动成为分销商
  531. // $this->autoBuyGood($order->user_id, $order->store_id, $order->id);
  532. // if ($this->order->pay_type != 2) {
  533. // // 支付成功赠送优惠券
  534. // $this->paySendCoupon($order->store_id, $order->user_id);
  535. // // 支付成功赠送卡券
  536. // $this->paySendCard($order->store_id, $order->user_id, $order->id);
  537. // }
  538. // 记录购买记录
  539. $this->setBuyData($order);
  540. // // 消息通知
  541. // $goods = Goods::findOne(OrderDetail::findOne(['order_id' => $this->order_id])->goods_id);
  542. // NoticeSend::OrderPay($order->user_id, $order->mobile, $order->order_no, $order->pay_price, $goods->name);
  543. // NoticeSend::PlaceOrder($order->order_no, $order->mch_id);
  544. return true;
  545. }
  546. // 当面付订单
  547. private function scanOrderNotify($event)
  548. {
  549. $order = $this->order = \app\plugins\scanCodePay\models\Order::findOne(['id' => $this->order_id]);
  550. $user = User::findOne($order->user_id);
  551. // 如果是余额抵扣订单,两条日志,分别是线上支付和余额支付
  552. $pay_price = $order->pay_price;
  553. if ($order->is_combine_pay == Order::IS_COMBINE_PAY && $order->combine_money > 0) {
  554. $money = $user->money;
  555. $user->money = $user->money - $order->combine_money;
  556. if ($user->save()) {
  557. $log = new AccountLog();
  558. $log->store_id = $order->store_id;
  559. $log->user_id = $user->id;
  560. $log->type = AccountLog::TYPE_BALANCE;
  561. $log->log_type = AccountLog::LOG_TYPE_EXPEND;
  562. $log->amount = $order->combine_money;
  563. $log->desc = "当面付余额支付,订单号为:{$order->order_no}。";
  564. $log->before = $money;
  565. $log->after = $user->money;
  566. $log->operator = '';
  567. $log->operator_id = 0;
  568. $log->operator_type = AccountLog::TYPE_OPERATOR_NORMAL;
  569. $log->created_at = time();
  570. $log->order_id = $order->id;
  571. $log->order_type = AccountLog::TYPE_SCAN_CODE_PAY;
  572. $log->save();
  573. $pay_price = $order->pay_price - $order->combine_money;
  574. }
  575. }
  576. $log = new AccountLog();
  577. $log->store_id = $order->store_id;
  578. $log->user_id = $user->id;
  579. $log->type = $order->pay_type == 1 ? AccountLog::TYPE_WECHAT : AccountLog::TYPE_ALIPAY;
  580. $log->log_type = AccountLog::LOG_TYPE_EXPEND;
  581. $log->amount = $pay_price;
  582. $log->desc = "当面付在线支付,订单号为:{$order->order_no}。";
  583. $log->before = 0;
  584. $log->after = 0;
  585. $log->operator = '';
  586. $log->operator_id = 0;
  587. $log->operator_type = AccountLog::TYPE_OPERATOR_NORMAL;
  588. $log->created_at = time();
  589. $log->order_id = $order->id;
  590. $log->order_type = AccountLog::TYPE_SCAN_CODE_PAY;
  591. $log->save();
  592. // 首次付款,绑定上下级
  593. if ($user->parent_id == 0) {
  594. $form = new Bind();
  595. $form->user_id = $order->user_id;
  596. $form->store_id = $order->store_id;
  597. $form->parent_id = $user->parent_user_id;
  598. $form->condition = 2;
  599. $bindForm = $form->save();
  600. if ($bindForm['code'] == 0) {
  601. $form = new ShareMoneyForm();
  602. $form->order = $this->order;
  603. $form->order_type = $event->order_type;
  604. $form->setData();
  605. }
  606. }
  607. // 消费满指定金额自动成为分销商
  608. $this->autoBecomeShare($order->user_id, $order->store_id, 'STORE');
  609. // 购买指定或任意商品自动成为分销商
  610. $this->autoBuyGood($order->user_id, $order->store_id, $order->id);
  611. if (in_array($this->order->pay_type, [1, 3])) {
  612. // 支付成功赠送优惠券
  613. $this->paySendCoupon($order->store_id, $order->user_id);
  614. // 支付成功赠送卡券
  615. $this->paySendCard($order->store_id, $order->user_id, $order->id);
  616. }
  617. // 记录购买记录
  618. $this->setBuyData($order);
  619. // 消息通知
  620. $goods = Goods::findOne(OrderDetail::findOne(['order_id' => $this->order_id])->goods_id);
  621. NoticeSend::OrderPay($order->user_id, $order->mobile, $order->order_no, $order->pay_price, $goods->name);
  622. NoticeSend::PlaceOrder($order->order_no, $order->mch_id, $order->store_id, $order);
  623. return true;
  624. }
  625. // 支付宝当面付
  626. private function alipayScanOrderNotify($event)
  627. {
  628. $order = $this->order = \app\plugins\scanCodePay\models\Order::findOne(['id' => $this->order_id]);
  629. $user = User::findOne($order->user_id);
  630. $log = new AccountLog();
  631. $log->store_id = $this->store_id;
  632. $log->user_id = $user->id;
  633. $log->type = AccountLog::TYPE_ALIPAY;
  634. $log->log_type = AccountLog::LOG_TYPE_EXPEND;
  635. $log->amount = $order->pay_price;
  636. $log->desc = "当面付支付宝支付,订单号为:{$order->order_no}。";
  637. $log->before = 0;
  638. $log->after = 0;
  639. $log->operator = '';
  640. $log->operator_id = 0;
  641. $log->operator_type = AccountLog::TYPE_OPERATOR_NORMAL;
  642. $log->created_at = time();
  643. $log->order_id = $order->id;
  644. $log->order_type = AccountLog::TYPE_SCAN_CODE_PAY;
  645. $log->save();
  646. // 记录购买记录
  647. $this->setBuyData($order);
  648. return true;
  649. }
  650. /**
  651. * 支付成功送优惠券
  652. */
  653. private function paySendCoupon($store_id, $user_id)
  654. {
  655. $form = new CouponPaySend();
  656. $form->store_id = $store_id;
  657. $form->user_id = $user_id;
  658. $form->save();
  659. }
  660. /**
  661. * 消费满指定金额自动成为分销商
  662. * @param $user_id integer 用户id
  663. */
  664. private function autoBecomeShare($user_id, $store_id, $type = null)
  665. {
  666. $setting = Option::get('share_basic_setting', $store_id);
  667. $setting = $setting ? Json::decode($setting['value']) : [];
  668. $auto_share_val = floatval($setting['auto_share_val']['value']);
  669. if ($auto_share_val == 0) {
  670. return;
  671. }
  672. $share = Share::findOne(['user_id' => $user_id, 'is_delete' => 0, 'store_id' => $store_id]);
  673. if ($share && $share->status == 1) {
  674. return;
  675. }
  676. $consumption_sum = Order::find()->where(['user_id' => $user_id, 'is_delete' => 0, 'is_pay' => 1])->sum('pay_price');
  677. $consumption_sum = floatval(($consumption_sum ? $consumption_sum : 0));
  678. if ($consumption_sum < $auto_share_val) {
  679. return;
  680. }
  681. if (!$share || $share->status == 2) {
  682. $share = new Share();
  683. $share->user_id = $user_id;
  684. $share->mobile = '';
  685. $share->name = '';
  686. $share->is_delete = 0;
  687. $share->store_id = $store_id;
  688. }
  689. $share->status = 1;
  690. $share->created_at = time();
  691. $share->save();
  692. $user = User::findOne($user_id);
  693. $user->time = time();
  694. $user->is_distributor = 1;
  695. $user->save();
  696. }
  697. /**
  698. * 购买指定商品成为分销商
  699. */
  700. public function autoBuyGood($user_id, $store_id, $order_id, $type = 0)
  701. {
  702. $setting = Option::get('share_basic_setting', $store_id);
  703. $setting = $setting ? Json::decode($setting['value']) : [];
  704. //如果开启无需审核才能开始走下面逻辑
  705. if (intval($setting['share_condition']['value']) !== 2) {
  706. return;
  707. }
  708. // 购买商城成分销商关闭状态不执行
  709. if ($setting['share_goods_status']['value'] == 0) {
  710. return;
  711. }
  712. $share = Share::findOne(['user_id' => $user_id, 'is_delete' => 0, 'store_id' => $store_id]);
  713. if ($share && $share->status == 1) {
  714. return;
  715. }
  716. $goodIds = OrderDetail::find()->where(['order_id' => $order_id])->select('goods_id')->all();
  717. $sign = false;
  718. // 购买任意商品
  719. if ($setting['share_goods_status']['value'] == 1) {
  720. $sign = true;
  721. }
  722. // 购买指定商品自动成为分销商
  723. if ($setting['share_goods_status']['value'] == 2) {
  724. foreach ($goodIds as $item) {
  725. $goods_ids = \explode(',', $setting['share_goods_id']['value']);
  726. if (in_array($item->goods_id, $goods_ids)) {
  727. $sign = true;
  728. break;
  729. }
  730. }
  731. }
  732. if ($sign) {
  733. if (!$share || $share->status == 2) {
  734. $share = new Share();
  735. $share->user_id = $user_id;
  736. $share->mobile = '';
  737. $share->name = '';
  738. $share->is_delete = 0;
  739. $share->store_id = $store_id;
  740. }
  741. $share->status = 1;
  742. $share->created_at = time();
  743. $share->save();
  744. $user = User::findOne($user_id);
  745. $user->time = time();
  746. $user->is_distributor = 1;
  747. $user->save();
  748. }
  749. }
  750. /**
  751. * 支付成功送卡券
  752. */
  753. private function paySendCard($store_id, $user_id, $order_id)
  754. {
  755. $form = new CardSend();
  756. $form->store_id = $store_id;
  757. $form->user_id = $user_id;
  758. $form->order_id = $order_id;
  759. $form->save();
  760. }
  761. // 售后订单申请成功,相关操作
  762. public function refund(OrderEvent $event = null)
  763. {
  764. $this->store_id = $event ? $event->store_id : $this->store_id;
  765. $this->order_id = $event ? $event->order_id : $this->order_id;
  766. $this->order_type = $event ? $event->order_type : $this->order_type;
  767. $this->order_refund_no = $event ? $event->order_refund_no : $this->order_refund_no;
  768. $this->form_id = $event ? $event->form_id : $this->form_id;
  769. try {
  770. $order = Order::findOne(['id' => $this->order_id]);
  771. NoticeSend::MchCancel($order->order_no, $order->mch_id);
  772. } catch (\Exception $e) {
  773. }
  774. }
  775. public function setBuyData($order)
  776. {
  777. $key = "buy_data";
  778. // 用户
  779. $user = User::findOne($order->user_id);
  780. $goods = OrderDetail::findOne(['order_id' => $order->id]);
  781. $data = (object)null;
  782. $data->type = 0;
  783. $data->store_id = $order->store_id;
  784. $data->order_no = $order->order_no;
  785. $data->user = $user->nickname;
  786. $data->goods = $goods->goods_id;
  787. $data->address = $goods->goods_name;
  788. $data->avatar_url = $user->avatar_url;
  789. $data->time = time();
  790. $new = json_encode($data);
  791. $cache = cache();
  792. $cache->set($key, $new, 300);
  793. }
  794. /**
  795. * 获取点餐号码
  796. */
  797. public static function getFoodCode($store_id, $md_id = 0) {
  798. $start_time = strtotime(date('Y-m-d 00:00:00'));
  799. $end_time = strtotime(date('Y-m-d 23:59:59'));
  800. $result = Order::find()->where(['store_id' => $store_id, 'md_id' => $md_id])
  801. ->andWhere([
  802. 'and',
  803. [
  804. '>=',
  805. 'created_at',
  806. $start_time
  807. ],
  808. [
  809. '<=',
  810. 'created_at',
  811. $end_time
  812. ]
  813. ])->max('food_code');
  814. return str_pad((string)(intval($result) + 1), 4, "0", STR_PAD_LEFT);
  815. }
  816. }