OrderComplete.php 76 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700
  1. <?php
  2. /**
  3. * 重庆赤晓店信息科技有限公司
  4. * https://www.chixiaodian.com
  5. * Copyright (c) 2023 赤店商城 All rights reserved.
  6. */
  7. namespace app\modules\client\models;
  8. use app\constants\OptionSetting;
  9. use app\jobs\CreatedOrderTranJob;
  10. use app\models\BuyGoodsLog;
  11. use app\models\common\events\OrderEvent;
  12. use app\models\AccountLog;
  13. use app\models\CardSend;
  14. use app\models\common\Bind;
  15. use app\models\Coupon;
  16. use app\models\CouponPaySend;
  17. use app\models\Goods;
  18. use app\models\LevelOrder;
  19. use app\models\MdGroupActivities;
  20. use app\models\Option;
  21. use app\models\Order;
  22. use app\models\OrderDetail;
  23. use app\models\OrderMessage;
  24. use app\models\SaasUser;
  25. use app\models\Share;
  26. use app\models\ShareDetail;
  27. use app\models\ShareGroupPurchaseParentLog;
  28. use app\models\ShareHolder;
  29. use app\models\Shop;
  30. use app\models\ShopShare;
  31. use app\models\Store;
  32. use app\models\SuperSales;
  33. use app\models\User;
  34. use app\models\UserCoupon;
  35. use app\models\VerifyCard;
  36. use app\models\VerifyCardAccount;
  37. use app\models\VerifyCardSale;
  38. use app\modules\alliance\models\NewMerchantForm;
  39. use app\modules\client\models\v1\BindForm;
  40. use app\modules\client\models\v1\ShareMoneyForm;
  41. use app\plugins\adopt\models\AdoptCostOrder;
  42. use app\utils\BookOrderNum;
  43. use app\utils\Delivery\WechatNewDelivery;
  44. use app\utils\Notice\NoticeSend;
  45. use app\utils\OrderNo;
  46. use app\utils\PrintOrder;
  47. use app\utils\Share\BonusPool;
  48. use app\utils\Tools;
  49. use yii\base\Model;
  50. use yii\helpers\ArrayHelper;
  51. use yii\helpers\Json;
  52. use app\modules\admin\models\pospal\PospalForm;
  53. use app\modules\admin\models\mochat\MochatForm;
  54. use app\models\DeliveryInfo;
  55. use app\utils\Delivery\Delivery;
  56. use app\utils\Delivery\Alipay\ADelivery;
  57. use app\modules\admin\models\maiyatian\MaiyatianForm;
  58. use app\modules\admin\models\keloop\KeloopForm;
  59. use app\models\FreeQueue;
  60. use app\models\FreeQueueGoods;
  61. use app\models\QueueLog;
  62. use app\models\Mch;
  63. use app\models\VerifyCardLog;
  64. class OrderComplete extends Model
  65. {
  66. public $order;
  67. public $store_id = 1;
  68. public $order_id;
  69. public $order_type;
  70. public $form_id;
  71. public $order_refund_no;
  72. public $notify_res = [];
  73. public $is_auto_repeat = 0;
  74. const EVENT_ORDER_FOLLOW = 'order_follow_up';
  75. const EVENT_ORDER_REFUND = 'order_refund';
  76. // 支付完成之后,相关的操作
  77. public function notify(OrderEvent $event = null)
  78. {
  79. $this->store_id = $event ? $event->store_id : $this->store_id;
  80. $this->order_id = $event ? $event->order_id : $this->order_id;
  81. $this->order_type = $event ? $event->order_type : $this->order_type;
  82. try {
  83. if ($this->order_type == 6) {
  84. $this->scanOrderNotify($event);
  85. }else {
  86. $this->OrderNotify($event);
  87. }
  88. $is_print = 1;
  89. /**
  90. * @var Order $order
  91. */
  92. $order = $this->order;
  93. // try {
  94. // $form = new NewMerchantForm();
  95. // $type = 1;
  96. // if ($this->order_type == 6) {
  97. // $type = 0;
  98. // }
  99. // $form->store_id = $order->store_id;
  100. // $result = $form->saasGiveIntegral($order->pay_price, $order->user_id, $order->order_no, $type);
  101. // debug_log($result, 'orderComplete.log');
  102. // } catch (\Exception $e) {
  103. // debug_log($e->getMessage(), 'orderComplete.log');
  104. // }
  105. //处理超级卖货系统
  106. try {
  107. $result = SuperSales::getNotFinishSales($order->user_id, $order->id, $order->store_id);
  108. debug_log(['order_no' => $order->order_no, 'result' => $result], 'superSales.log');
  109. } catch (\Throwable $e) {
  110. debug_log($e->getMessage(), 'superSales.log');
  111. }
  112. \app\modules\admin\models\TeamBonusForm::afterOrderComplete($order);
  113. //处理免单队列
  114. $this->freeQueueOrder($order);
  115. //adapay处理
  116. $this->adapay();
  117. // $this->shareShop($order, $event);
  118. // 积分抵扣的话减去积分
  119. $this->reduceIntegral($order);
  120. // 余额抵扣的话减去余额
  121. $this->reduceBalance($order);
  122. // 分红处理
  123. BonusPool::levelShare($order->id);
  124. //购买指定商城成为股东
  125. BonusPool::userAuto2ShareHolder($order, 1);
  126. BonusPool::userSelfBuyGoods2ShareHolder($order, 1);
  127. // BonusPool::userAuto2ShareHolder($order->id);
  128. // \queue_push(new \app\jobs\UserBuyGoodsUpdateShareHolderJob(['order_id' => $order->id]));
  129. // 股东分红处理(区域分红)
  130. $this->agent_profit($order);
  131. //是否存在用户升级
  132. $this->LevelOrder($order);
  133. //普通商品支付完成后需要上门安装逻辑
  134. // $this->isNeedInstall($order->id);
  135. // 发放核销卡 这里不在发放核销卡和优惠券 调整至售后期之后发放
  136. // //发放优惠券
  137. // $this->sendCouponCard($order->id, $order->user_id);
  138. //系统设置支付后发放积分
  139. $store_integral_time = Option::get(OptionSetting::STORE_INTEGRAL_TIME, $order['store_id'], 'gift', 0)['value'];
  140. if ($store_integral_time == 1){
  141. $this->give_integral($order);
  142. }
  143. //系统设置支付后发放优惠券
  144. $store_coupon_time = Option::get(OptionSetting::STORE_COUPON_TIME, $order['store_id'], 'gift', 0)['value'];
  145. if ($store_coupon_time ==1){
  146. $this->sendCouponCard($order->id, $order->user_id);
  147. }
  148. //系统设置支付后发放核销卡
  149. $store_card_time = Option::get(OptionSetting::STORE_CARD_TIME, $order['store_id'], 'gift', 0)['value'];
  150. if ($store_card_time == 1){
  151. $this->sendVerifyCard($order->id, $order->user_id, $order->order_type,1);
  152. } else {
  153. if ($order->order_type == 4) {//虚拟产品直接发放
  154. $this->sendVerifyCard($order->id, $order->user_id, $order->order_type);
  155. }
  156. }
  157. // 后台订单提醒
  158. OrderMessage::set($order->id, $order->store_id, $this->order_type, 0);
  159. // 余额支付订单储值卡消费记录
  160. if($order->order_type == 0 && ($order->pay_type == 3 || ($order->is_combine_pay == Order::IS_COMBINE_PAY && $order->combine_money > 0) || $order->balance > 0)) {
  161. $this->verifyCardPayLog($order);
  162. }
  163. // 代理订单返佣逻辑
  164. // $this->agencyPrice($order->id);
  165. // 处理虚拟商品订单状态
  166. if (($order->order_type == 4 && $order->verify_card_id == 0)) {
  167. $order->confirm_time = time();
  168. $order->send_time = time();
  169. $order->trade_status = Order::ORDER_FLOW_CONFIRM;
  170. if (!$order->save()) {
  171. \Yii::warning($order->errors);
  172. }
  173. }
  174. // 生成点餐号码
  175. if ($order->order_type == 3 && $order->is_offline == 1) {
  176. $order->send_time = time();
  177. $order->trade_status = Order::ORDER_FLOW_SEND;
  178. }
  179. $order->food_code = self::getFoodCode($order->store_id, $order->md_id);
  180. if (!$order->save()) {
  181. \Yii::warning(['<============= 订单号:' . $order->order_no .'生成点餐号码', $order->errors]);
  182. }
  183. // //云仓转单
  184. // $is_auth_trans = Store::findOne($order->store_id)->is_auth_trans;
  185. // // 开启自动转单
  186. // if ($is_auth_trans) {
  187. // queue_push(new CreatedOrderTranJob(['order_id' => $order->id]));
  188. $this->MerSetPurchaseOrder($order->id);
  189. // }
  190. // 同城配送订单下单
  191. $orderNoHead = substr($order->order_no, 0, 2);
  192. if (in_array($orderNoHead, ['ML', OrderNo::ORDER_PT]) && $order->is_delivery == 1) {
  193. $local_type = Option::get(OptionSetting::STORE_LOCAL_TYPE, $order->store_id, 'store')['value'];
  194. $local_type = Option::get(OptionSetting::STORE_LOCAL_TYPE, $order->store_id, 'pay', $local_type)['value'];
  195. if($local_type == 'keloop' && !isset($delivery_res) && KeloopForm::isSaasOpen()){
  196. $delivery_res = KeloopForm::order_created($order->store_id, $order->id);
  197. \Yii::error('-----------keloop同城配送返回' . Json::encode($delivery_res));
  198. }
  199. if($local_type == 'maiyatian' && !isset($delivery_res) && MaiyatianForm::isopen($order->store_id)){
  200. $delivery_res = MaiyatianForm::order_created($order->store_id, $order->id);
  201. \Yii::error('-----------Maiyatian同城配送返回' . Json::encode($delivery_res));
  202. }
  203. if($local_type == 'aggregate'){
  204. if(!isset($delivery_res) && $order->alipay_trade_no){
  205. $delivery_info = DeliveryInfo::findOne(['store_id' => $order->store_id, 'order_no' => $order->order_no]);
  206. $detail_goods = OrderDetail::find()->where(['order_id' => $order->id])->select('goods_name as name, pic, num, total_price as price')->asArray()->all();
  207. $delivery_res = ADelivery::createOrder(0, $order->store_id, $delivery_info->mini_id,
  208. $order->user->alipay_open_id, $detail_goods, $order->order_no, $delivery_info->address_id);
  209. \Yii::error('-----------同城配送返回' . Json::encode($delivery_res));
  210. }elseif(!isset($delivery_res)){
  211. $detail_goods = OrderDetail::find()->alias('od')->where(['order_id' => $order->id])
  212. ->leftJoin(['g' => Goods::tableName()], 'od.goods_id = g.id')
  213. ->select('od.goods_name as name, od.pic, od.num, od.total_price as price, g.weight')->asArray()->all();
  214. $deliveryInfo = DeliveryInfo::findOne(['order_no' => $order->order_no]);
  215. if ($deliveryInfo && intval($deliveryInfo->wechat_delivery_type) === 1) {
  216. $goods_list = [];
  217. foreach ($detail_goods as $goods_index => $goods_item) {
  218. $goods_list[$goods_index]['weight'] = $goods_item['weight'];
  219. $goods_list[$goods_index]['price'] = sprintf('%.2f', ($goods_item['price'] / $goods_item['num']));
  220. $goods_list[$goods_index]['name'] = $goods_item['name'];
  221. $goods_list[$goods_index]['pic'] = $goods_item['pic'];
  222. $goods_list[$goods_index]['num'] = $goods_item['num'];
  223. }
  224. $user = User::findOne($order->user_id);
  225. $address = json_decode($order->address_data, true);
  226. $form = new WechatNewDelivery();
  227. $result = $form->addOrder([
  228. 'address' => array_merge($address, [
  229. 'name' => $order->name,
  230. 'mobile' => $order->mobile,
  231. ]),
  232. 'goods_list' => $goods_list,
  233. 'store_id' => $this->order->store_id,
  234. 'md_id' => $order->md_id ?: 0,
  235. 'order_no' => $order->order_no,
  236. 'store_user' => ArrayHelper::toArray($user),
  237. 'order_seq' => $deliveryInfo->serial_num,
  238. 'order_detail_path' => '/order/order-detail/order-detail?id=' . $order->id,
  239. ]);
  240. debug_log($result, 'delivery_.log');
  241. } else {
  242. $delivery_res = Delivery::addOrder($detail_goods, $order->order_no);
  243. \Yii::error('-----------同城配送返回' . Json::encode($delivery_res));
  244. }
  245. }
  246. }
  247. if($local_type == 'self'){
  248. }
  249. }
  250. (new PospalForm(['store_id' => $order->store_id]))->orderNotify($order);
  251. // 订单打印
  252. if ((int)$order->md_id === -1 || (int)$order->md_id === 0 || !isset($order->md_id)) {
  253. $order->md_id = 0;
  254. }
  255. $printer_order = new PrintOrder($order->store_id, $order->id, 'pay', 0, $order->md_id, 0, $order->mch_id);
  256. $printer_order->print_order();
  257. ShareGroupPurchaseParentLog::addOrder($order->user_id, $order->id, $this->is_auto_repeat);
  258. //拆单(区分供应商商品和非供应商商品)
  259. $this->checkOrder($order->id);
  260. // 如果是团购活动订单 检测本活动是否满足条件
  261. if ($order->md_group_activities_id > 0) {
  262. $this->handleGroupActivities($order);
  263. }
  264. // 下单记录
  265. foreach($order->goods as $goods){
  266. BuyGoodsLog::set($goods['id'], $order->user->nickname, $order->user->avatar_url);
  267. }
  268. } catch (\Exception $e) {
  269. \Yii::error('line->>>' . $e->getLine());
  270. \Yii::error($e->getMessage());
  271. \Yii::error('订单支付完成后操作异常');
  272. }
  273. }
  274. private function handleGroupActivities($order)
  275. {
  276. $mdGroupActivitiesModel = MdGroupActivities::find()->where(['id'=>$order->md_group_activities_id,'store_id'=>$order->store_id,'is_delete'=>0])->one();
  277. if (!$mdGroupActivitiesModel) {
  278. return true;
  279. }
  280. if($mdGroupActivitiesModel->rules == 0){
  281. $order->md_group_activities_status = 1;
  282. $order->save();
  283. return true;
  284. }
  285. $orderIds = [];
  286. // 满人 也就是满多少订单
  287. if($mdGroupActivitiesModel->type == 1){
  288. // 已支付 团购后动为完成的订单
  289. $orderListQuery = Order::find()->where(['store_id'=>$order->store_id,'md_group_activities_id'=>$order->md_group_activities_id,'md_group_activities_status'=>0])->andWhere(['!=','trade_status',1])->andWhere(['is_pay' => 1]);
  290. if($orderListQuery->count() >= $mdGroupActivitiesModel->rules){
  291. $orderIds = $orderListQuery->select('id')->column();
  292. }
  293. }
  294. // 满商品的件数量
  295. if($mdGroupActivitiesModel->type == 2){
  296. $orderDetailQuery = OrderDetail::find()->alias('od')->leftJoin(['o'=>Order::tableName()],'od.order_id=o.id')->where(['o.store_id'=>$order->store_id,'o.md_group_activities_id'=>$order->md_group_activities_id,'o.md_group_activities_status'=>0])->andWhere(['!=','o.trade_status',1])->andWhere(['o.is_pay' => 1]);
  297. if($orderDetailQuery->sum('od.num') >= $mdGroupActivitiesModel->rules){
  298. $orderIds = $orderDetailQuery->select('o.id')->column();
  299. // 去重复
  300. $orderIds = array_unique($orderIds);
  301. }
  302. }
  303. if(count($orderIds) > 0){
  304. Order::updateAll(['md_group_activities_status' => 1],['id' => $orderIds]);
  305. }
  306. return true;
  307. }
  308. //adapay处理
  309. public function adapay() {
  310. try{
  311. if(isset($this->notify_res['user_huifu_id']) && $this->order->user_id){
  312. $user = User::findOne($this->order->user_id);
  313. $user->adapay_user_huifu_id = $this->notify_res['user_huifu_id'];
  314. $user->save();
  315. }
  316. } catch (\Exception $ex) {
  317. \Yii::error($ex);
  318. debug_log([__METHOD__, __LINE__, $ex->getMessage()], __CLASS__ . '.log');
  319. }
  320. }
  321. //拆单(区分供应商商品(仓库配送和其他云仓商品)和非供应商商品)
  322. public function checkOrder($order_id) {
  323. //获取订单
  324. $order = Order::findOne($order_id);
  325. if (!$order) {
  326. return false;
  327. }
  328. //获取下单商品
  329. $orderDetail = OrderDetail::find()->where(['order_id' => $order->id, 'is_delete' => 0])->asArray()->all();
  330. if (!$orderDetail) {
  331. return false;
  332. }
  333. //根据云仓商品组成新的订单详情数组
  334. $new_order_detail_arr = [];
  335. foreach ($orderDetail as $order_detail_item) {
  336. $is_cloud_goods = 0;
  337. $goods = Goods::findOne($order_detail_item['goods_id']);
  338. if (!$goods) {
  339. continue;
  340. }
  341. if ($goods->cloud_goods_id > 0 && !intval($goods->is_wholesale)) {
  342. $is_cloud_goods = 1;
  343. //仓库自配
  344. if (intval($goods->is_front_delivery)) {
  345. $is_cloud_goods = 2;
  346. }
  347. }
  348. $new_order_detail_arr[$is_cloud_goods][] = $order_detail_item;
  349. }
  350. if (count($new_order_detail_arr) > 1) {
  351. //只计算订单表pay_price价格 先不计算total_price价格 因为包含会员价 复原容易出问题
  352. foreach ($new_order_detail_arr as $new_order_detail_index => $new_order_detail_item) {
  353. $goods_total_price = array_sum(array_column($new_order_detail_item, 'total_price'));
  354. if ($new_order_detail_index) {
  355. $old_order = ArrayHelper::toArray($order);
  356. unset($old_order['id']);
  357. $new_order = new Order();
  358. $new_order->attributes = $old_order;
  359. $new_order->order_no = OrderNo::getOrderNo(OrderNo::ORDER_MALL);
  360. $new_order->total_price = $new_order->pay_price = $goods_total_price;
  361. $new_order->transaction_id = $old_order['transaction_id'];
  362. $new_order->alipay_trade_no = $old_order['alipay_trade_no'];
  363. $new_order->first_price = 0;
  364. $new_order->second_price = 0;
  365. $new_order->third_price = 0;
  366. $new_order->holder_first_price = 0;
  367. $new_order->holder_second_price = 0;
  368. $new_order->holder_third_price = 0;
  369. $new_order->old_holder_first_price = 0;
  370. $new_order->old_holder_second_price = 0;
  371. $new_order->old_holder_third_price = 0;
  372. $new_order->share_order_profit = 0;
  373. $new_order->limit_price = 0;
  374. $new_order->coupon_sub_price = 0;
  375. $new_order->user_coupon_id = 0;
  376. $new_order->user_coupon_ids = '';
  377. $new_order->integral = 0;
  378. $new_order->give_integral = 0;
  379. $new_order->get_verify_id = 0;
  380. $new_order->buy_level_id = 0;
  381. $new_order->level_order_id = 0;
  382. $new_order->level_diff_price = 0;
  383. $new_order->get_coupon_id = 0;
  384. $new_order->save();
  385. foreach ($new_order_detail_item as $new_order_detail) {
  386. $new_order_detail_model = OrderDetail::findOne($new_order_detail['id']);
  387. $new_order_detail_model->attributes = $new_order_detail;
  388. $new_order_detail_model->order_id = $new_order->id;
  389. $new_order_detail_model->save();
  390. array_push($order_detail_id_arr, $new_order_detail['id']);
  391. }
  392. array_push($order_id_arr, $new_order->id);
  393. } else {
  394. $order->total_price = $order->pay_price = bcadd($goods_total_price, $order->express_price, 2);;
  395. $order->save();
  396. // foreach ($new_order_detail_item as $new_order_detail) {
  397. // array_push($order_detail_id_arr, $new_order_detail['id']);
  398. // }
  399. }
  400. }
  401. }
  402. }
  403. //认养订单支付完成之后,相关的操作
  404. public function adoptOrderCostNotify(OrderEvent $event = null) {
  405. $order = $this->order = AdoptCostOrder::findOne(['id' => $this->order_id]);
  406. $user = User::findOne($order->user_id);
  407. $goods = Goods::findOne(OrderDetail::findOne(['order_id' => $order->order_id])->goods_id);
  408. NoticeSend::OrderPay($order->user_id, $order->mobile, $order->order_no, $order->pay_price, $goods->name,2);
  409. NoticeSend::PlaceOrder($order->order_no, $order->md_id, $order->store_id, $order);
  410. }
  411. //购买会员卡订单
  412. public function LevelOrder($order) {
  413. if ($order->level_order_id) {
  414. $levelOrder = LevelOrder::findOne($order->level_order_id);
  415. if (!$levelOrder) {
  416. return;
  417. }
  418. if ($levelOrder->is_pay == 1) {
  419. return;
  420. }
  421. $levelOrder->is_pay = 1;
  422. $levelOrder->pay_time = time();
  423. $levelOrder->pay_type = 3;
  424. if ($levelOrder->save()) {
  425. //会员升级
  426. $user = User::findOne($levelOrder->user_id);
  427. $user->level = $levelOrder->after_level;
  428. $user->save();
  429. try {
  430. if ($levelOrder->is_use_platform_mch == 1) {
  431. $store = Store::findOne($levelOrder->store_id);
  432. $profit = $levelOrder->pay_price * $store->transfer_profit / 100;
  433. $price = $levelOrder->pay_price - $profit;
  434. Store::addMoney($store, $price, '用户购买会员等级', $levelOrder->id, $levelOrder->user_id);
  435. }
  436. } catch (\Exception $e) {
  437. // Todo
  438. }
  439. }
  440. }
  441. }
  442. //自动转单
  443. public function MerSetPurchaseOrder($order_id) {
  444. try {
  445. $order = Order::findOne($order_id);
  446. $order_detail = OrderDetail::find()->where(['order_id' => $order_id])->select('goods_id')->asArray()->all();
  447. if (!empty($order) && !empty($order_detail)) {
  448. $form = new \app\modules\admin\models\MerchantForm();
  449. $form->store_id = $order->store_id;
  450. $form->address = $order->address;
  451. $form->province_id = $order->province_id;
  452. $form->city_id = $order->city_id;
  453. $form->district_id = $order->district_id;
  454. $form->order_id = $order_id;
  455. $form->tel = $order->mobile;
  456. $form->name = $order->name;
  457. debug_log('自动转单000----'. 3);
  458. $result = $form->mchSetPurchaseOrder();
  459. debug_log('自动转单000----'. json_encode($result));
  460. }
  461. } catch (\Exception $e) {
  462. debug_log('自动转单----'. json_encode($e->getFile() . $e->getMessage() . $e->getLine()));
  463. }
  464. }
  465. // private function agencyPrice($order_id){
  466. // try {
  467. // $order = Order::findOne($order_id);
  468. // $option = Option::get('agency_price_config', 0, 'saas', [])['value'];
  469. // debug_log('agency_price_config' . $option);
  470. // if ($option) {
  471. // $option = json_decode($option, true);
  472. // }
  473. // $province_percent = $option['province_percent'] ?? 0;
  474. // $city_percent = $option['city_percent'] ?? 0;
  475. // $district_percent = $option['district_percent'] ?? 0;
  476. // //获取代理商ID
  477. // $store = Store::findOne($order->store_id);
  478. // $admin_list = Admin::find()->where(['province_id' => $store->province_id, 'is_delete' => 0])->andWhere(['>', 'area_level', 0])->asArray()->all();
  479. // $user = User::findOne($order->user_id);
  480. // $saasUser = SaasUser::findOne(['mobile' => $user->binding]);
  481. // $saas_user_name = '-';
  482. // if ($saasUser) {
  483. // $saas_user_name = $saasUser->name;
  484. // }
  485. // foreach ($admin_list as $item) {
  486. // $ag_rebate = 0;
  487. // $rate = 0;
  488. // $desc = '';
  489. // //省
  490. // if ((int)$item['area_level'] === 3) {
  491. // $ag_rebate = $order->ag_rebate * ($province_percent / 100);
  492. // $ag_rebate = sprintf("%.2f", $ag_rebate);
  493. // $rate = $province_percent;
  494. // $desc = '用户' . $saas_user_name . '下单,订单' . $order->order_no . ',发放 ' . $ag_rebate . '元省代佣金';
  495. // }
  496. // //市
  497. // if ((int)$item['area_level'] === 2 && (int)$item['city_id'] === (int)$store->city_id) {
  498. // $ag_rebate = $order->ag_rebate * ($city_percent / 100);
  499. // $ag_rebate = sprintf("%.2f", $ag_rebate);
  500. // $rate = $city_percent;
  501. // $desc = '用户' . $saas_user_name . '下单,订单' . $order->order_no . ',发放 ' . $ag_rebate . '元市代佣金';
  502. // }
  503. // //区
  504. // if ((int)$item['area_level'] === 1 && (int)$item['city_id'] === (int)$store->city_id && (int)$item['district_id'] === (int)$store->district_id) {
  505. // $ag_rebate = $order->ag_rebate * ($district_percent / 100);
  506. // $ag_rebate = sprintf("%.2f", $ag_rebate);
  507. // $rate = $district_percent;
  508. // $desc = '用户' . $saas_user_name . '下单,订单' . $order->order_no . ',发放 ' . $ag_rebate . '元区代佣金';
  509. // }
  510. // if (!$ag_rebate) {
  511. // continue;
  512. // }
  513. // //给用户增加佣金
  514. // $SaasUser = SaasUser::findOne($item['saas_user_id']);
  515. // $SaasUser->share_profit = ($SaasUser->share_profit * 1) + ($ag_rebate * 1);
  516. // $res = $SaasUser->save();
  517. // //增加记录
  518. // if ($res) {
  519. // $form = new StoreShareMoney();
  520. // $form->user_id = $SaasUser->id;
  521. // $form->store_id = $store->id;
  522. // $form->profit = $rate;
  523. // $form->total_price = $order->total_price;
  524. // $form->desc = $desc;
  525. // $form->order_id = $order_id;
  526. // $form->created_at = time();
  527. // $form->type = 1;
  528. // $form->status = 0;
  529. // $form->commission = $ag_rebate;
  530. // $form->is_send = 1;
  531. // $res = $form->save();
  532. // if (!$res) {
  533. // debug_log($form->errors);
  534. // }
  535. // }
  536. // }
  537. // } catch (\Exception $e) {
  538. // \Yii::error($e->getMessage());
  539. // }
  540. // }
  541. /**
  542. * @param $order Order
  543. */
  544. private function agent_profit($order) {
  545. // 判断是否开启奖金池
  546. // $setting = [
  547. // 'is_open_area' => Option::get('is_open_area', $order->store_id, 'bonus_pool', 0)['value'],
  548. // ];
  549. // if (!$setting['is_open_area']) {
  550. // \Yii::warning('---------------- 未开启代理分红 -------------------');
  551. // return;
  552. // }
  553. $is_multi_agent = Option::get('is_multi_agent', $order->store_id, 'bonus_pool_area_agent', 0)['value'];
  554. if($is_multi_agent){
  555. $multi_agent_type1 = Option::get('multi_agent_type1', $order->store_id, 'bonus_pool_area_agent', 0)['value'];
  556. $multi_agent_type2 = Option::get('multi_agent_type2', $order->store_id, 'bonus_pool_area_agent', 0)['value'];
  557. $multi_agent_type3 = Option::get('multi_agent_type3', $order->store_id, 'bonus_pool_area_agent', 0)['value'];
  558. $multi_agent_type4 = Option::get('multi_agent_type4', $order->store_id, 'bonus_pool_area_agent', 0)['value'];
  559. }
  560. $profit = $order->profit;
  561. $goods = OrderDetail::find()->alias('od')
  562. ->leftJoin(Goods::tableName() . ' g', "g.id=od.goods_id and g.is_delete=0")
  563. ->where(['od.order_id' => $order->id])
  564. ->select('g.dl_p_rate,g.dl_p_rate_type,g.dl_c_rate,g.dl_c_rate_type,g.dl_d_rate,g.dl_d_rate_type,g.dl_t_rate,g.dl_t_rate_type')
  565. ->asArray()->all();
  566. // 省代
  567. $province_share_holder_query = 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]);
  568. $province_share_holder = $province_share_holder_query->orderBy('agent_time ASC')->one();
  569. if (!$province_share_holder) {
  570. \Yii::error('-------------- 订单号:' . $order->order_no . ' 未发现省代理----------------');
  571. } else {
  572. $money = 0;
  573. $open = true;
  574. foreach ($goods as $v) {
  575. if ($v['dl_p_rate'] > 0) {
  576. $open = false;
  577. if ($v['dl_p_rate_type'] > 0) {
  578. $money += round($v['dl_p_rate'], 2);
  579. } else {
  580. $money += round($profit * $v['dl_p_rate'] / 100, 2);
  581. }
  582. }
  583. }
  584. if ($open) {
  585. if($is_multi_agent){
  586. $money += round($profit * $multi_agent_type1 / 100, 2);
  587. }else{
  588. $money += round($profit * $province_share_holder->agent_rate / 100, 2);
  589. }
  590. }
  591. $province_share_holder_list = [$province_share_holder];
  592. if($is_multi_agent){
  593. $province_share_holder_list = $province_share_holder_query->all();
  594. $count = count($province_share_holder_list);
  595. $money = round($money / $count, 2);
  596. }
  597. if ($money > 0) {
  598. foreach($province_share_holder_list as $province_share_holder){
  599. $detail = new ShareDetail();
  600. $detail->store_id = $order->store_id;
  601. $detail->type_id = $order->id;
  602. $detail->type = 3;
  603. $detail->user_id = $province_share_holder->user_id;
  604. $detail->desc = '订单号:'.$order->order_no.'代理分红';
  605. $detail->is_send = 0;
  606. $detail->money = $money;
  607. // $detail->money = round($order->profit * $province_share_holder->agent_rate / 100, 2);
  608. $detail->save();
  609. }
  610. }
  611. }
  612. // 市代
  613. $city_share_holder_query = 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]);
  614. $city_share_holder = $city_share_holder_query->orderBy('agent_time ASC')->one();
  615. if (!$city_share_holder) {
  616. \Yii::error('-------------- 订单号:' . $order->order_no . ' 未发现市代理----------------');
  617. } else {
  618. $money = 0;
  619. $open = true;
  620. foreach ($goods as $v) {
  621. if ($v['dl_c_rate'] > 0) {
  622. $open = false;
  623. if ($v['dl_c_rate_type'] > 0) {
  624. $money += round($v['dl_c_rate'], 2);
  625. } else {
  626. $money += round($profit * $v['dl_c_rate'] / 100, 2);
  627. }
  628. }
  629. }
  630. if ($open) {
  631. if($is_multi_agent){
  632. $money += round($profit * $multi_agent_type2 / 100, 2);
  633. }else{
  634. $money = round($profit * $city_share_holder->agent_rate / 100, 2);
  635. }
  636. }
  637. $city_share_holder_list = [$city_share_holder];
  638. if($is_multi_agent){
  639. $city_share_holder_list = $city_share_holder_query->all();
  640. $count = count($city_share_holder_list);
  641. $money = round($money / $count, 2);
  642. }
  643. if ($money > 0) {
  644. foreach($city_share_holder_list as $city_share_holder){
  645. $detail = new ShareDetail();
  646. $detail->store_id = $order->store_id;
  647. $detail->type_id = $order->id;
  648. $detail->type = 3;
  649. $detail->user_id = $city_share_holder->user_id;
  650. $detail->desc = '订单号:'.$order->order_no.'代理分红';
  651. $detail->is_send = 0;
  652. $detail->money = $money;
  653. // $detail->money = round($order->profit * $city_share_holder->agent_rate / 100, 2);
  654. $detail->save();
  655. }
  656. }
  657. }
  658. // 区代
  659. $district_share_holder_query = 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]);
  660. $district_share_holder = $district_share_holder_query->orderBy('agent_time ASC')->one();
  661. if (!$district_share_holder) {
  662. \Yii::error('-------------- 订单号:' . $order->order_no . ' 未发现区域代理----------------');
  663. } else {
  664. $money = 0;
  665. $open = true;
  666. foreach ($goods as $v) {
  667. if ($v['dl_d_rate'] > 0) {
  668. $open = false;
  669. if ($v['dl_d_rate_type'] > 0) {
  670. $money += round($v['dl_d_rate'], 2);
  671. } else {
  672. $money += round($profit * $v['dl_d_rate'] / 100, 2);
  673. }
  674. }
  675. }
  676. if ($open) {
  677. if($is_multi_agent){
  678. $money += round($profit * $multi_agent_type3 / 100, 2);
  679. }else{
  680. $money = round($profit * $district_share_holder->agent_rate / 100, 2);
  681. }
  682. }
  683. $district_share_holder_list = [$district_share_holder];
  684. if($is_multi_agent){
  685. $district_share_holder_list = $district_share_holder_query->all();
  686. $count = count($district_share_holder_list);
  687. $money = round($money / $count, 2);
  688. }
  689. if ($money > 0) {
  690. foreach($district_share_holder_list as $district_share_holder){
  691. $detail = new ShareDetail();
  692. $detail->store_id = $order->store_id;
  693. $detail->type_id = $order->id;
  694. $detail->type = 3;
  695. $detail->user_id = $district_share_holder->user_id;
  696. $detail->desc = '订单号:'.$order->order_no.'代理分红';
  697. $detail->is_send = 0;
  698. $detail->money = $money;
  699. // $detail->money = round($order->profit * $district_share_holder->agent_rate / 100, 2);
  700. $detail->save();
  701. }
  702. }
  703. }
  704. // 镇代
  705. $town_share_holder_query = ShareHolder::find()->where(['is_delete' => 0, 'status' => 1, 'store_id' => $order->store_id, 'agent_type' => 4, 'town_id' => $order->town_id, 'agent_rate_status' => 1]);
  706. $town_share_holder = $town_share_holder_query->orderBy('agent_time ASC')->one();
  707. if (!$town_share_holder) {
  708. \Yii::error('-------------- 订单号:' . $order->order_no . ' 未发现镇代理----------------');
  709. } else {
  710. $money = 0;
  711. $open = true;
  712. foreach ($goods as $v) {
  713. if ($v['dl_t_rate'] > 0) {
  714. $open = false;
  715. if ($v['dl_t_rate_type'] > 0) {
  716. $money += round($v['dl_t_rate'], 2);
  717. } else {
  718. $money += round($profit * $v['dl_t_rate'] / 100, 2);
  719. }
  720. }
  721. }
  722. if ($open) {
  723. if($is_multi_agent){
  724. $money += round($profit * $multi_agent_type4 / 100, 2);
  725. }else{
  726. $money = round($profit * $town_share_holder->agent_rate / 100, 2);
  727. }
  728. }
  729. $town_share_holder_list = [$town_share_holder];
  730. if($is_multi_agent){
  731. $town_share_holder_list = $town_share_holder_query->all();
  732. $count = count($town_share_holder_list);
  733. $money = round($money / $count, 2);
  734. }
  735. foreach($town_share_holder_list as $town_share_holder){
  736. $detail = new ShareDetail();
  737. $detail->store_id = $order->store_id;
  738. $detail->type_id = $order->id;
  739. $detail->type = 3;
  740. $detail->user_id = $town_share_holder->user_id;
  741. $detail->desc = '订单号:'.$order->order_no.'代理分红';
  742. $detail->is_send = 0;
  743. $detail->money = $money;
  744. // $detail->money = round($order->profit * $district_share_holder->agent_rate / 100, 2);
  745. $detail->save();
  746. }
  747. }
  748. }
  749. private function reduceIntegral($order) {
  750. $integral = Json::decode($order->integral_price);
  751. // 减去当前用户账户积分
  752. if ($integral > 0) {
  753. $user = User::findOne($order->user_id);
  754. $before = $user->integral;
  755. $user->integral -= $integral;
  756. if ($user->save()) {
  757. $log = new AccountLog();
  758. $log->store_id = $order->store_id;
  759. $log->user_id = $user->id;
  760. $log->type = AccountLog::TYPE_INTEGRAL;
  761. $log->log_type = AccountLog::LOG_TYPE_EXPEND;
  762. $log->amount = $integral;
  763. $log->desc = "订单积分抵扣支付,订单号为:{$order->order_no}。";
  764. $log->before = $before;
  765. $log->after = $user->integral;
  766. $log->operator = '';
  767. $log->operator_id = 0;
  768. $log->operator_type = AccountLog::TYPE_OPERATOR_NORMAL;
  769. $log->created_at = time();
  770. $log->order_id = $order->id;
  771. $log->order_type = AccountLog::TYPE_PLATFORM_ORDER;
  772. $log->save();
  773. }
  774. }
  775. }
  776. private function reduceBalance($order) {
  777. $balance = Json::decode($order->balance);
  778. // 减去当前用户账户余额
  779. if ($balance > 0) {
  780. $user = User::findOne($order->user_id);
  781. $before = $user->money;
  782. $user->money -= $balance;
  783. if ($user->save()) {
  784. $log = new AccountLog();
  785. $log->store_id = $order->store_id;
  786. $log->user_id = $user->id;
  787. $log->type = AccountLog::TYPE_GOODS_BALANCE;
  788. $log->log_type = AccountLog::LOG_TYPE_EXPEND;
  789. $log->amount = $balance;
  790. $log->desc = "订单余额抵扣支付,订单号为:{$order->order_no}。";
  791. $log->before = $before;
  792. $log->after = $user->money;
  793. $log->operator = '';
  794. $log->operator_id = 0;
  795. $log->operator_type = AccountLog::TYPE_OPERATOR_NORMAL;
  796. $log->created_at = time();
  797. $log->order_id = $order->id;
  798. $log->order_type = AccountLog::TYPE_PLATFORM_ORDER;
  799. $log->save();
  800. }
  801. }
  802. }
  803. /**
  804. * 发放优惠券
  805. */
  806. public function sendCouponCard($order_id, $user_id) {
  807. $goods_id = OrderDetail::find()->select('goods_id, num')->where(['order_id' => $order_id,'is_delete' => 0])->asArray()->all();
  808. $coupon_arr = [];
  809. foreach ($goods_id as $k => $v) {
  810. $coupon_card_info = Goods::find()->select('id, coupon_card_id, send_coupon_card_num')->where(['id' => $v['goods_id'], 'is_delete' => 0])->asArray()->one();
  811. if (empty($coupon_card_info)) {
  812. continue;
  813. }
  814. $coupon_card_id = $coupon_card_info['coupon_card_id'];
  815. $coupon_card_id_arr = explode(',', $coupon_card_id);
  816. $send_coupon_card_num = intval($coupon_card_info['send_coupon_card_num']);
  817. $coupon_list = Coupon::find()->where(['id' => $coupon_card_id_arr, 'is_delete' => 0])->select('total_count, id')->asArray()->all();
  818. foreach ($coupon_list as $item) {
  819. for ($i = 0; $i < $send_coupon_card_num; $i++) {
  820. $coupon_send_count = UserCoupon::find()->where([
  821. 'coupon_id' => $item['id'],
  822. 'type' => [
  823. UserCoupon::TYPE_STORE,
  824. UserCoupon::TYPE_AUTO,
  825. UserCoupon::TYPE_GET
  826. ]
  827. ])->select('id')->count();
  828. if (intval($item['total_count']) === -1 || $item['total_count'] > $coupon_send_count) {
  829. debug_log([
  830. 'user_id' => $user_id,
  831. 'id' => $item['id']
  832. ] ,'coupon.log');
  833. $use_coupon = coupon::userAddCoupon($user_id, $item['id']);
  834. if ($use_coupon) {
  835. array_push($coupon_arr, intval($use_coupon));
  836. }
  837. }
  838. }
  839. }
  840. }
  841. $order = Order::findOne($order_id);
  842. $order->get_coupon_id = implode(',', $coupon_arr);
  843. $order->save();
  844. }
  845. /**
  846. * 发放核销卡
  847. */
  848. private function sendVerifyCard($order_id, $user_id, $order_type, $card_time = 0) {
  849. try {
  850. if (($order_type != 4 && $card_time) || $order_type == 4){
  851. $goods_id = OrderDetail::find()->select('goods_id, num')->where(['order_id' => $order_id,'is_delete' => 0])->asArray()->all();
  852. foreach ($goods_id as $k => $v) {
  853. $verify_card_info = Goods::find()->select('id, verify_card_id, send_verify_card_num, product_type')
  854. ->where(['id' => $v['goods_id'], 'is_delete' => 0])->asArray()->one();
  855. if (empty($verify_card_info)) {
  856. continue;
  857. }
  858. $num = intval($verify_card_info['send_verify_card_num'] ?? 0) * intval($v['num']);
  859. if (in_array($verify_card_info['product_type'], [3, 4])) {
  860. $num = 1;
  861. }
  862. $this->startSendVerifyCard($verify_card_info['verify_card_id'], $verify_card_info['id'], $user_id, $order_type, $order_id, $num);
  863. }
  864. }
  865. } catch (\Exception $e) {
  866. debug_log(['message' => $e->getMessage(), 'line' => $e->getLine(), 'file' => $e->getFile()], 'order_complete.log');
  867. }
  868. }
  869. /**
  870. * 核销卡发放
  871. */
  872. private function startSendVerifyCard($verify_card_id, $goods_id, $user_id, $order_type, $order_id, $num){
  873. if (!empty($verify_card_id)){
  874. $order = Order::findOne($order_id);
  875. $used_verify_card_id = '';
  876. if($order->verify_card_id){
  877. $used_verify_sale_id = $order->verify_card_id;
  878. $verify_sale = VerifyCardSale::findOne($used_verify_sale_id);
  879. $used_verify_card_id = $verify_sale['verify_card_id'];
  880. }
  881. $verify_card_id_arr = explode(',', $verify_card_id);
  882. $res = Tools::getVerifyList($verify_card_id_arr);
  883. \Yii::error($res);
  884. $ids = '';
  885. foreach($res as $value){
  886. if($value['id'] == $used_verify_card_id){
  887. \Yii::error('================== 卡券发放结果:订单消费的卡券不再赠送,卡券id为:' . $value['id']);
  888. continue;
  889. }
  890. for ($i = 0; $i < $num; $i++) {
  891. $verify_form = new VerifyCardSale();
  892. $verify_form->store_id = $order->store_id;
  893. $verify_form->user_id = $user_id;
  894. $verify_form->verify_card_id = $value['id'];
  895. //查询核销卡使用总次数
  896. $left_info = VerifyCard::find()->select('total_num, expire_day')->where([
  897. 'id' => $value['id'],
  898. 'is_delete' => 0
  899. ])->asArray()->one();
  900. if ($value['type'] == 1) {
  901. $verify_form->left_num = $left_info['total_num'];
  902. } else {
  903. $verify_form->left_num = 1;
  904. }
  905. $account = VerifyCardAccount::find()->where(['store_id' => $value['store_id'], 'card_id' => $value['id'], 'status' => 0])->limit(1)->one();
  906. if (!$account) {
  907. \Yii::error('================== 卡券发放结果:未找到数据,卡券id为:' . $value['id']);
  908. continue;
  909. }
  910. $verify_form->account_id = $account->id;
  911. $verify_form->sale_time = time();
  912. if ($value['date_type'] == 1) {
  913. $verify_form->end_time = time() + $left_info['expire_day'] * (3600*24);
  914. } else {
  915. $verify_form->end_time = $value['end_time'];
  916. }
  917. $verify_form->goods_id = $goods_id;
  918. $verify_form->order_type = $order_type;
  919. if ($verify_form->save()) {
  920. $ids .= $verify_form->id . ',';
  921. if ($value['type'] == 1) {
  922. //核销卡核销数量增加
  923. $verify_card_form = VerifyCard::findOne([
  924. 'id' => $value['id'],
  925. 'is_delete' => 0
  926. ]);
  927. $verify_card_form->use_num += 1;
  928. if (!$verify_card_form->save()) {
  929. continue;
  930. }
  931. } else {
  932. $card = VerifyCard::findOne(['id' => $value['id'], 'is_delete' => 0]);
  933. $account = VerifyCardAccount::findOne($verify_form->account_id);
  934. $card->send_times += 1;
  935. $card->save();
  936. }
  937. $account->status = 1;
  938. if (!$account->save()) {
  939. continue;
  940. }
  941. } else {
  942. \Yii::warning($verify_form->errors);
  943. }
  944. }
  945. }
  946. $order->get_verify_id = $ids;
  947. $order->save();
  948. }
  949. }
  950. /**
  951. * 积分发放
  952. */
  953. public function give_integral($id)
  954. {
  955. $order_id = $id;
  956. if(isset($order_id->id)){
  957. $give = $order_id;
  958. }else{
  959. $give = Order::findOne($order_id);
  960. }
  961. if ($give['give_integral'] != 0) {
  962. return;
  963. }
  964. $integral = OrderDetail::find()
  965. ->andWhere(['order_id' => $give['id'], 'is_delete' => 0])
  966. ->select([
  967. 'sum(integral)',
  968. ])->scalar();
  969. if (!$integral) {
  970. return;
  971. }
  972. $giveUser = User::findOne(['id' => $give['user_id']]);
  973. $before = $giveUser->integral;
  974. if ($giveUser) {
  975. $giveUser->integral += $integral;
  976. $giveUser->total_integral += $integral;
  977. $giveUser->save();
  978. }
  979. $give->give_integral = 1;
  980. $give->save();
  981. $log = new AccountLog();
  982. $log->store_id = $give->store_id;
  983. $log->user_id = $giveUser->id;
  984. $log->type = AccountLog::TYPE_INTEGRAL;
  985. $log->log_type = AccountLog::LOG_TYPE_INCOME;
  986. $log->amount = $integral;
  987. $log->desc = '订单'.$give->order_no.'赠送积分';
  988. $log->before = $before;
  989. $log->after = $giveUser->integral;
  990. $log->operator = '';
  991. $log->operator_id = 0;
  992. $log->operator_type = AccountLog::TYPE_OPERATOR_NORMAL;
  993. $log->created_at = time();
  994. $log->order_id = $give->id;
  995. $log->order_type = AccountLog::TYPE_PLATFORM_ORDER;
  996. $log->save();
  997. }
  998. // 自提点分销
  999. public function shareShop($order) {
  1000. return false;
  1001. if ($order->is_offline == 1) {
  1002. $shop = Shop::findOne($order->shop_id);
  1003. if ($shop) {
  1004. $user = User::findOne($order->user_id);
  1005. $info = addslashes("会员 ".$user->nickname." 下单,获得奖励");
  1006. $orderDetail = OrderDetail::find()->select(['goods_id','total_price','num'])->where(['order_id' => $order->id])->all();
  1007. $shop_bili = Option::get(OptionSetting::SHOP_RATIO, $order->store_id)['value'];
  1008. $shop_bili_type = Option::get(OptionSetting::SHOP_RATIO_TYPE, $order->store_id)['value'];
  1009. $money = 0;
  1010. foreach ($orderDetail as $v){
  1011. $goods_money = $v['total_price'];
  1012. if($shop_bili_type == 2){
  1013. $money += $v['num']*$shop_bili;
  1014. }else{
  1015. $money += $goods_money*$shop_bili * 0.01;
  1016. }
  1017. }
  1018. if ($money > 0.01) {
  1019. $share_form = new ShopShare();
  1020. $share_form->store_id = $order->store_id;
  1021. $share_form->order_id = $order->id;
  1022. $share_form->shop_id = $shop->id;
  1023. $share_form->amount = $money;
  1024. $share_form->user_id = $order->user_id;
  1025. $share_form->the_desc = $info;
  1026. $share_form->created_at = time();
  1027. $share_form->save();
  1028. }
  1029. }
  1030. }
  1031. }
  1032. // 商城
  1033. private function OrderNotify($event)
  1034. {
  1035. $order = $this->order = Order::findOne(['id' => $this->order_id]);
  1036. $user = User::findOne($order->user_id);
  1037. // 如果是余额抵扣订单,两条日志,分别是线上支付和余额支付
  1038. $pay_price = $order->pay_price;
  1039. if ($order->is_combine_pay == Order::IS_COMBINE_PAY && $order->combine_money > 0) {
  1040. $money = $user->money;
  1041. $user->money = $user->money - $order->combine_money;
  1042. if ($user->money < 0) {
  1043. throw new \Exception('余额不足');
  1044. }
  1045. if ($user->save()) {
  1046. $log = new AccountLog();
  1047. $log->store_id = $order->store_id;
  1048. $log->user_id = $user->id;
  1049. $log->type = AccountLog::TYPE_BALANCE;
  1050. $log->log_type = AccountLog::LOG_TYPE_EXPEND;
  1051. $log->amount = $order->combine_money;
  1052. $log->desc = "商城订单余额支付,订单号为:{$order->order_no}。";
  1053. $log->before = $money;
  1054. $log->after = $user->money;
  1055. $log->operator = '';
  1056. $log->operator_id = 0;
  1057. $log->operator_type = AccountLog::TYPE_OPERATOR_NORMAL;
  1058. $log->created_at = time();
  1059. $log->order_id = $order->id;
  1060. $log->order_type = AccountLog::TYPE_PLATFORM_ORDER;
  1061. $log->save();
  1062. $pay_price = $order->pay_price - $order->combine_money;
  1063. }
  1064. }
  1065. if ($pay_price > 0 && !in_array($order->pay_type,[3,7])) {
  1066. $log = new AccountLog();
  1067. $log->store_id = $order->store_id;
  1068. $log->user_id = $user->id;
  1069. $log->type = $order->pay_type == 1 ? AccountLog::TYPE_WECHAT : AccountLog::TYPE_ALIPAY;
  1070. $log->log_type = AccountLog::LOG_TYPE_EXPEND;
  1071. $log->amount = $pay_price;
  1072. $log->desc = "订单线上支付,订单号为:{$order->order_no}。";
  1073. $log->before = 0;
  1074. $log->after = 0;
  1075. $log->operator = '';
  1076. $log->operator_id = 0;
  1077. $log->operator_type = AccountLog::TYPE_OPERATOR_NORMAL;
  1078. $log->created_at = time();
  1079. $log->order_id = $order->id;
  1080. $log->order_type = AccountLog::TYPE_PLATFORM_ORDER;
  1081. $log->save();
  1082. }
  1083. // 首次付款,绑定上下级
  1084. if ($user->parent_id == 0 && $user->parent_user_id > 0) {
  1085. $form = new BindForm();
  1086. $form->user_id = $order->user_id;
  1087. $form->store_id = $order->store_id;
  1088. $form->parent_id = $user->parent_user_id;
  1089. $form->old_parent_id = $user->parent_user_id;
  1090. $form->condition = 2;
  1091. $bindForm = $form->save();
  1092. if ($bindForm['code'] == 0) {
  1093. $form = new ShareMoneyForm();
  1094. $form->order = $this->order;
  1095. $form->order_type = $event->order_type;
  1096. $form->store_id = $order->store_id;
  1097. $form->setData();
  1098. }
  1099. }
  1100. // 预约商品库存操作
  1101. BookOrderNum::bookNumReduce($order);
  1102. // 消费满指定金额自动成为分销商
  1103. $this->autoBecomeShare($order->user_id, $order->store_id, 'STORE');
  1104. // 购买指定或任意商品自动成为分销商
  1105. $this->autoBuyGood($order->user_id, $order->store_id, $order->id);
  1106. if ($this->order->pay_type != 2) {
  1107. // 支付成功赠送优惠券
  1108. $this->paySendCoupon($order->store_id, $order->user_id);
  1109. // 支付成功赠送卡券
  1110. $this->paySendCard($order->store_id, $order->user_id, $order->id);
  1111. }
  1112. // 记录购买记录
  1113. $this->setBuyData($order);
  1114. // 消息通知
  1115. $goods = Goods::findOne(OrderDetail::findOne(['order_id' => $this->order_id])->goods_id);
  1116. $saas_user = SaasUser::findOne(['mobile' => $user->binding, 'is_delete' => 0]);
  1117. MochatForm::sendMsg(1, $order->store_id, MochatForm::MSG_TYPE_PAY_ORDER, $saas_user->id, ['goods_id' => $goods->id]);
  1118. $mch_name = '';
  1119. if($order['mch_id']){
  1120. $mch = Mch::findOne($order['mch_id']);
  1121. $mch && $mch_name = '[' . $mch['name'] . ']';
  1122. }
  1123. if ($order->order_type == Order::ORDER_TYPE_Adopt) {
  1124. NoticeSend::OrderPay($order->user_id, $order->mobile, $order->order_no, $order->pay_price, $goods->name, 1);
  1125. } else {
  1126. NoticeSend::OrderPay($order->user_id, $order->mobile, $order->order_no, $order->pay_price, $mch_name . $goods->name);
  1127. }
  1128. NoticeSend::PlaceOrder($order->order_no, $order->md_id, $order->store_id, $order);
  1129. NoticeSend::MchOrder($order->order_no, $order->store_id, $order);
  1130. /* begin 2025/07/11 11:06:57 如果订单是上门服务订单的话,通知符合条件的服务人员进行抢单 WPing丶 */
  1131. if ($order->order_type == Order::ORDER_TYPE_WORKER) {
  1132. NoticeSend::ServiceNewOrder($order->order_no, $order->store_id, $order);
  1133. }
  1134. /* end */
  1135. return true;
  1136. }
  1137. // 当面付订单
  1138. private function scanOrderNotify($event)
  1139. {
  1140. $order = $this->order = \app\plugins\scanCodePay\models\Order::findOne(['id' => $this->order_id]);
  1141. $user = User::findOne($order->user_id);
  1142. // 如果是余额抵扣订单,两条日志,分别是线上支付和余额支付
  1143. $pay_price = $order->pay_price;
  1144. if ($order->is_combine_pay == Order::IS_COMBINE_PAY && $order->combine_money > 0) {
  1145. $money = $user->money;
  1146. $user->money = $user->money - $order->combine_money;
  1147. if ($user->save()) {
  1148. $log = new AccountLog();
  1149. $log->store_id = $order->store_id;
  1150. $log->user_id = $user->id;
  1151. $log->type = AccountLog::TYPE_BALANCE;
  1152. $log->log_type = AccountLog::LOG_TYPE_EXPEND;
  1153. $log->amount = $order->combine_money;
  1154. $log->desc = "当面付余额支付,订单号为:{$order->order_no}。";
  1155. $log->before = $money;
  1156. $log->after = $user->money;
  1157. $log->operator = '';
  1158. $log->operator_id = 0;
  1159. $log->operator_type = AccountLog::TYPE_OPERATOR_NORMAL;
  1160. $log->created_at = time();
  1161. $log->order_id = $order->id;
  1162. $log->order_type = AccountLog::TYPE_SCAN_CODE_PAY;
  1163. $log->save();
  1164. $pay_price = $order->pay_price - $order->combine_money;
  1165. }
  1166. }
  1167. $log = new AccountLog();
  1168. $log->store_id = $order->store_id;
  1169. $log->user_id = $user->id;
  1170. $log->type = $order->pay_type == 1 ? AccountLog::TYPE_WECHAT : AccountLog::TYPE_ALIPAY;
  1171. $log->log_type = AccountLog::LOG_TYPE_EXPEND;
  1172. $log->amount = $pay_price;
  1173. $log->desc = "当面付在线支付,订单号为:{$order->order_no}。";
  1174. $log->before = 0;
  1175. $log->after = 0;
  1176. $log->operator = '';
  1177. $log->operator_id = 0;
  1178. $log->operator_type = AccountLog::TYPE_OPERATOR_NORMAL;
  1179. $log->created_at = time();
  1180. $log->order_id = $order->id;
  1181. $log->order_type = AccountLog::TYPE_SCAN_CODE_PAY;
  1182. $log->save();
  1183. // 首次付款,绑定上下级
  1184. if ($user->parent_id == 0) {
  1185. $form = new Bind();
  1186. $form->user_id = $order->user_id;
  1187. $form->store_id = $order->store_id;
  1188. $form->parent_id = $user->parent_user_id;
  1189. //$form->old_parent_id = $user->parent_user_id;
  1190. $form->condition = 2;
  1191. $bindForm = $form->save();
  1192. if ($bindForm['code'] == 0) {
  1193. $form = new ShareMoneyForm();
  1194. $form->order = $this->order;
  1195. $form->order_type = $event->order_type;
  1196. $form->setData();
  1197. }
  1198. }
  1199. // 消费满指定金额自动成为分销商
  1200. $this->autoBecomeShare($order->user_id, $order->store_id, 'STORE');
  1201. // 购买指定或任意商品自动成为分销商
  1202. $this->autoBuyGood($order->user_id, $order->store_id, $order->id);
  1203. if (in_array($this->order->pay_type, [1, 3])) {
  1204. // 支付成功赠送优惠券
  1205. $this->paySendCoupon($order->store_id, $order->user_id);
  1206. // 支付成功赠送卡券
  1207. $this->paySendCard($order->store_id, $order->user_id, $order->id);
  1208. }
  1209. // 记录购买记录
  1210. $this->setBuyData($order);
  1211. // 消息通知
  1212. // $goods = Goods::findOne(OrderDetail::findOne(['order_id' => $this->order_id])->goods_id);
  1213. NoticeSend::OrderPay($order->user_id, $order->mobile, $order->order_no, $order->pay_price, '当面付');
  1214. NoticeSend::PlaceOrder($order->order_no, $order->mch_id, $order->store_id, $order);
  1215. return true;
  1216. }
  1217. // 支付宝当面付
  1218. private function alipayScanOrderNotify($event)
  1219. {
  1220. $order = $this->order = \app\plugins\scanCodePay\models\Order::findOne(['id' => $this->order_id]);
  1221. $user = User::findOne($order->user_id);
  1222. $log = new AccountLog();
  1223. $log->store_id = $this->store_id;
  1224. $log->user_id = $user->id;
  1225. $log->type = AccountLog::TYPE_ALIPAY;
  1226. $log->log_type = AccountLog::LOG_TYPE_EXPEND;
  1227. $log->amount = $order->pay_price;
  1228. $log->desc = "当面付支付宝支付,订单号为:{$order->order_no}。";
  1229. $log->before = 0;
  1230. $log->after = 0;
  1231. $log->operator = '';
  1232. $log->operator_id = 0;
  1233. $log->operator_type = AccountLog::TYPE_OPERATOR_NORMAL;
  1234. $log->created_at = time();
  1235. $log->order_id = $order->id;
  1236. $log->order_type = AccountLog::TYPE_SCAN_CODE_PAY;
  1237. $log->save();
  1238. // 记录购买记录
  1239. $this->setBuyData($order);
  1240. return true;
  1241. }
  1242. /**
  1243. * 支付成功送优惠券
  1244. */
  1245. private function paySendCoupon($store_id, $user_id)
  1246. {
  1247. $form = new CouponPaySend();
  1248. $form->store_id = $store_id;
  1249. $form->user_id = $user_id;
  1250. $form->save();
  1251. }
  1252. /**
  1253. * 消费满指定金额自动成为分销商
  1254. * @param $user_id integer 用户id
  1255. */
  1256. private function autoBecomeShare($user_id, $store_id, $type = null)
  1257. {
  1258. $setting = Option::get('share_basic_setting', $store_id);
  1259. $setting = $setting ? Json::decode($setting['value']) : [];
  1260. if (intval($setting['share_condition']['value']) !== 2) {
  1261. return;
  1262. }
  1263. $auto_share_val = floatval($setting['auto_share_val']['value']);
  1264. if ($auto_share_val == 0) {
  1265. return;
  1266. }
  1267. $share = Share::findOne(['user_id' => $user_id, 'is_delete' => 0, 'store_id' => $store_id]);
  1268. if ($share && $share->status == 1) {
  1269. return;
  1270. }
  1271. $consumption_sum = Order::find()->where(['user_id' => $user_id, 'is_delete' => 0, 'is_pay' => 1])->sum('pay_price');
  1272. $consumption_sum = floatval(($consumption_sum ? $consumption_sum : 0));
  1273. if ($consumption_sum < $auto_share_val) {
  1274. return;
  1275. }
  1276. if (!$share || $share->status == 2) {
  1277. $share = new Share();
  1278. $share->user_id = $user_id;
  1279. $share->mobile = '';
  1280. $share->name = '';
  1281. $share->is_delete = 0;
  1282. $share->store_id = $store_id;
  1283. }
  1284. $share->status = 1;
  1285. $share->created_at = time();
  1286. $share->save();
  1287. $user = User::findOne($user_id);
  1288. $user->time = time();
  1289. $user->is_distributor = 1;
  1290. $user->save();
  1291. }
  1292. /**
  1293. * 购买指定商品成为分销商
  1294. */
  1295. public function autoBuyGood($user_id, $store_id, $order_id, $type = 0)
  1296. {
  1297. $setting = Option::get('share_basic_setting', $store_id);
  1298. $setting = $setting ? Json::decode($setting['value']) : [];
  1299. //如果开启无需审核才能开始走下面逻辑
  1300. if (intval($setting['share_condition']['value']) !== 2) {
  1301. return;
  1302. }
  1303. // 购买商城成分销商关闭状态不执行
  1304. if ($setting['share_goods_status']['value'] == 0) {
  1305. return;
  1306. }
  1307. $share = Share::findOne(['user_id' => $user_id, 'is_delete' => 0, 'store_id' => $store_id]);
  1308. if ($share && $share->status == 1) {
  1309. return;
  1310. }
  1311. $goodIds = OrderDetail::find()->where(['order_id' => $order_id])->select('goods_id')->all();
  1312. $sign = false;
  1313. // 购买任意商品
  1314. if ($setting['share_goods_status']['value'] == 1) {
  1315. $sign = true;
  1316. }
  1317. // 购买指定商品自动成为分销商
  1318. if ($setting['share_goods_status']['value'] == 2) {
  1319. foreach ($goodIds as $item) {
  1320. $goods_ids = \explode(',', $setting['share_goods_id']['value']);
  1321. if (in_array($item->goods_id, $goods_ids)) {
  1322. $sign = true;
  1323. break;
  1324. }
  1325. }
  1326. }
  1327. if ($sign) {
  1328. if (!$share || $share->status == 2) {
  1329. $share = new Share();
  1330. $share->user_id = $user_id;
  1331. $share->mobile = '';
  1332. $share->name = '';
  1333. $share->is_delete = 0;
  1334. $share->store_id = $store_id;
  1335. }
  1336. $share->status = 1;
  1337. $share->created_at = time();
  1338. $share->save();
  1339. $user = User::findOne($user_id);
  1340. $user->time = time();
  1341. $user->is_distributor = 1;
  1342. $user->save();
  1343. }
  1344. }
  1345. /**
  1346. * 支付成功送卡券
  1347. */
  1348. private function paySendCard($store_id, $user_id, $order_id)
  1349. {
  1350. $form = new CardSend();
  1351. $form->store_id = $store_id;
  1352. $form->user_id = $user_id;
  1353. $form->order_id = $order_id;
  1354. $form->save();
  1355. }
  1356. // 售后订单申请成功,相关操作
  1357. public function refund(OrderEvent $event = null)
  1358. {
  1359. $this->store_id = $event ? $event->store_id : $this->store_id;
  1360. $this->order_id = $event ? $event->order_id : $this->order_id;
  1361. $this->order_type = $event ? $event->order_type : $this->order_type;
  1362. $this->order_refund_no = $event ? $event->order_refund_no : $this->order_refund_no;
  1363. $this->form_id = $event ? $event->form_id : $this->form_id;
  1364. try {
  1365. $order = Order::findOne(['id' => $this->order_id]);
  1366. NoticeSend::MchCancel($order->order_no, $order->mch_id);
  1367. } catch (\Exception $e) {
  1368. }
  1369. }
  1370. public function setBuyData($order)
  1371. {
  1372. $key = "buy_data";
  1373. // 用户
  1374. $user = User::findOne($order->user_id);
  1375. $goods = OrderDetail::findOne(['order_id' => $order->id]);
  1376. $data = (object)null;
  1377. $data->type = 0;
  1378. $data->store_id = $order->store_id;
  1379. $data->order_no = $order->order_no;
  1380. $data->user = $user->nickname;
  1381. $data->goods = $goods->goods_id;
  1382. $data->address = $goods->goods_name;
  1383. $data->avatar_url = $user->avatar_url;
  1384. $data->time = time();
  1385. $new = json_encode($data);
  1386. $cache = cache();
  1387. $cache->set($key, $new, 300);
  1388. }
  1389. /**
  1390. * 获取点餐号码
  1391. */
  1392. public static function getFoodCode($store_id, $md_id = 0) {
  1393. $start_time = strtotime(date('Y-m-d 00:00:00'));
  1394. $end_time = strtotime(date('Y-m-d 23:59:59'));
  1395. $result = Order::find()->where(['store_id' => $store_id, 'md_id' => $md_id])
  1396. ->andWhere([
  1397. 'and',
  1398. [
  1399. '>=',
  1400. 'created_at',
  1401. $start_time
  1402. ],
  1403. [
  1404. '<=',
  1405. 'created_at',
  1406. $end_time
  1407. ]
  1408. ])->max('food_code');
  1409. return str_pad((string)(intval($result) + 1), 4, "0", STR_PAD_LEFT);
  1410. }
  1411. public function freeQueueOrder($order)
  1412. {
  1413. try {
  1414. $order_detail_all = OrderDetail::find()->select('goods_id, total_price, goods_name, num')->where(['order_id' => $order->id])->asArray()->all();
  1415. foreach ($order_detail_all as $order_detail) {
  1416. $free_queue_goods = FreeQueueGoods::find()->select('activity_id')->where(['goods_id' => $order_detail['goods_id'], 'is_delete' => 0])->one();
  1417. if (!$free_queue_goods) {
  1418. continue;
  1419. }
  1420. $free_queue = FreeQueue::find()->where(['is_delete' => 0, 'status' => 1, 'id' => $free_queue_goods->activity_id])->one();
  1421. if (!$free_queue) {
  1422. continue;
  1423. }
  1424. if (time() < $free_queue->start_time || time() > $free_queue->end_time) {
  1425. continue;
  1426. }
  1427. if (($free_queue->cashback_type ? ($free_queue->cashback_money <= 0) : ($free_queue->cashback_bili <= 0)) || $free_queue->single_bili <= 0) {
  1428. continue;
  1429. }
  1430. $order_detail_total_price = $order_detail['total_price'];
  1431. $cashback_money = $free_queue->cashback_money;
  1432. $money_queue = QueueLog::find()
  1433. ->where(['user_id' => $order->user_id, 'queue_id' => $free_queue->id])
  1434. ->andWhere('`status` != 2')
  1435. ->andWhere(['>', 'order_detail_total_price_item', 0])
  1436. ->orderBy('`id` ASC')->all();
  1437. $order_detail_total_price_sum = array_sum(array_column($money_queue, 'order_detail_total_price_item'));
  1438. $order_detail_total_price += $order_detail_total_price_sum;
  1439. while(1){
  1440. if($free_queue->cashback_type && $order_detail_total_price < $cashback_money){
  1441. if($queue_log){
  1442. $queue_log->order_detail_total_price_item = round($order_detail_total_price, 2);
  1443. $queue_log->save();
  1444. }
  1445. break;
  1446. }
  1447. $order_detail_total_price -= $cashback_money;
  1448. $from_queue_list = [];
  1449. if($free_queue->cashback_type){
  1450. foreach ($money_queue as $mqi => $mqv) {
  1451. if($mqv->order_detail_total_price_item <= 0){
  1452. continue;
  1453. }
  1454. $oneMoney = 0;
  1455. $getMoney += $mqv->order_detail_total_price_item;
  1456. $mqvMoney = $mqv->order_detail_total_price_item;
  1457. if($getMoney >= $free_queue->cashback_money){
  1458. $oneMoney = 1;
  1459. $mqv->order_detail_total_price_item = $getMoney - $free_queue->cashback_money;
  1460. $mqvMoney = $mqvMoney - $mqv->order_detail_total_price_item;
  1461. }else{
  1462. $mqv->order_detail_total_price_item = 0;
  1463. }
  1464. $mqvMoney > 0 && $from_queue_list[] = ['from_queue_log_id' => $mqv->id, 'order_id' => $mqv->order_id, 'money' => $mqvMoney];
  1465. if(!$mqv->save()){
  1466. throw new \Exception('扣减金额错误' . $mqv->id . array_shift($mqv->getFirstErrors()));
  1467. }
  1468. if($oneMoney){
  1469. break;
  1470. }
  1471. }
  1472. }
  1473. $goods = Goods::findOne($order_detail['goods_id']);
  1474. $queue_log = new QueueLog();
  1475. $queue_log->store_id = $order->store_id;
  1476. $queue_log->user_id = $order->user_id;
  1477. $queue_log->order_id =$order->id;//订单id
  1478. $queue_log->goods_id = $order_detail['goods_id'];//商品id
  1479. $queue_log->created_at = time();
  1480. $queue_log->returned_money = 0;//已返金额
  1481. $queue_log->total_money = $free_queue->cashback_type ? round($free_queue->cashback_money * $free_queue->cashback_money_bili / 100, 2) : round(($order_detail['total_price'] * $free_queue->cashback_bili / 100),2);//总金额
  1482. $queue_log->rate = ($goods && $goods->queue_rate > 0) ? $goods->queue_rate : $free_queue->single_bili;//单次返现比例
  1483. $queue_log->is_pay = 1;
  1484. $queue_log->cashback_bili = $free_queue->cashback_bili;//返现比例
  1485. $queue_log->cashback_time = $free_queue->cashback_time;
  1486. $queue_log->cashback_type = $free_queue->cashback_type;
  1487. $queue_log->cashback_money = $free_queue->cashback_money;
  1488. $queue_log->cashback_money_bili = $free_queue->cashback_money_bili;
  1489. $queue_log->queue_id = $free_queue->id;//活动id
  1490. $queue_log->goods_name = $order_detail['goods_name'];//商品名称
  1491. $queue_log->goods_price = round(($order_detail['total_price'] / $order_detail['num']), 2);
  1492. $queue_log->num = $order_detail['num'];
  1493. $queue_log->self_bili = $free_queue->self_bili;
  1494. $queue_log->share_bili = $free_queue->share_bili;
  1495. $queue_log->order_money_pool = $order_detail['total_price'];
  1496. if($free_queue->cashback_type){
  1497. $queue_log->order_money_pool = $cashback_money;
  1498. $queue_log->order_detail_total_price_list = json_encode($from_queue_list);
  1499. }
  1500. $queue_log->save();
  1501. if(!$free_queue->cashback_type){
  1502. break;
  1503. }
  1504. }
  1505. }
  1506. } catch (\Throwable $e) {
  1507. debug_log($e->getMessage(), 'free_queue.log');
  1508. }
  1509. }
  1510. /* begin 2024/11/19 09:42:11 id1026 保存储值卡消费记录 WPing丶 */
  1511. public function verifyCardPayLog($order) {
  1512. //查出当前用户名下所有的核销卡
  1513. $card_list = VerifyCardLog::find()->alias('vcl')
  1514. ->leftJoin(['vcs' => VerifyCardSale::tableName()], 'vcl.sale_id=vcs.id')
  1515. ->leftJoin(['vc' => VerifyCard::tableName()], 'vcs.verify_card_id=vc.id')
  1516. ->where([
  1517. 'vcl.store_id' => $order->store_id,
  1518. 'vc.type' => 3,
  1519. 'vcl.user_id' => $order->user_id,
  1520. 'vcl.type' => VerifyCardLog::WRITE_TYPE_EXCHANGE,
  1521. 'vcl.is_complete' => 0,
  1522. ])
  1523. ->select('vc.total_price as price, vcl.*')
  1524. ->orderBy(['vcl.use_time' => SORT_ASC])
  1525. ->asArray()
  1526. ->all();
  1527. if($card_list) {
  1528. $order_balance = 0;//上张储值卡扣完后订单剩余未扣的钱
  1529. foreach($card_list as $card) {
  1530. $card_balance = bcsub($card['price'],$card['use_price'],2);//卡内余额
  1531. $order_price = $order_balance > 0 ? $order_balance : ($order->combine_money > 0 ? $order->combine_money : ($order->balance > 0 ? $order->balance : $order->pay_price));
  1532. if($order_price <= $card_balance) {
  1533. //储值卡内余额足以支付这笔订单
  1534. $log = VerifyCardLog::findOne($card['id']);
  1535. $log->use_price += $order_price;
  1536. if($log->use_order_ids) {
  1537. $use_order_ids = explode(',', $log->use_order_ids);
  1538. $use_order_ids[] = $order->id;
  1539. $log->use_order_ids = implode(',', $use_order_ids);
  1540. } else {
  1541. $log->use_order_ids = $order->id;
  1542. }
  1543. if($order_price == $card_balance) {//如果储值卡内余额刚好够支付当前订单
  1544. $log->is_complete = 1;
  1545. }
  1546. if (!$log->save()) {
  1547. debug_log('储值卡消费记录保存失败', 'VerifyCard.log');
  1548. debug_log($log->errors, 'VerifyCard.log');
  1549. }
  1550. break;
  1551. } else {
  1552. //储值卡内余额不足支付这笔订单
  1553. $log = VerifyCardLog::findOne($card['id']);
  1554. $log->use_price += $card_balance;
  1555. if($log->use_order_ids) {
  1556. $use_order_ids = explode(',', $log->use_order_ids);
  1557. $use_order_ids[] = $order->id;
  1558. $log->use_order_ids = implode(',', $use_order_ids);
  1559. } else {
  1560. $log->use_order_ids = $order->id;
  1561. }
  1562. $log->is_complete = 1;
  1563. $order_balance = bcsub($order_price, $card_balance, 2);
  1564. if (!$log->save()) {
  1565. debug_log('储值卡消费记录保存失败', 'VerifyCard.log');
  1566. debug_log($log->errors, 'VerifyCard.log');
  1567. }
  1568. }
  1569. }
  1570. }
  1571. }
  1572. /* end */
  1573. }