OrderCreate.php 52 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193
  1. <?php
  2. /**
  3. * Niushop商城系统 - 团队十年电商经验汇集巨献!
  4. * =========================================================
  5. * Copy right 2019-2029 山西牛酷信息科技有限公司, 保留所有权利。
  6. * ----------------------------------------------
  7. * 官方网址: https://www.niushop.com.cn
  8. * 这不是一个自由软件!您只能在不用于商业目的的前提下对程序代码进行修改和使用。
  9. * 任何企业和个人不允许对程序代码以任何形式任何目的再发布。
  10. * =========================================================
  11. */
  12. namespace app\model\order;
  13. use addon\coupon\model\Coupon;
  14. use app\api\controller\Goodssku;
  15. use app\model\express\ExpressTemplate;
  16. use app\model\goods\Goods;
  17. use app\model\goods\GoodsStock;
  18. use app\model\member\FranchiseeExamine;
  19. use app\model\member\Member;
  20. use app\model\member\Member as MemberModel;
  21. use app\model\member\MemberAccount;
  22. use app\model\member\MemberVip;
  23. use app\model\store\Store;
  24. use app\model\system\Cron;
  25. use app\model\web\Platform as PlatformModel;
  26. use think\facade\Cache;
  27. use app\model\express\Express;
  28. use app\model\system\Pay;
  29. use app\model\goods\Cart;
  30. use app\model\member\MemberAddress;
  31. use app\model\express\Config as ExpressConfig;
  32. use app\model\BaseModel;
  33. use app\model\message\Message;
  34. /**
  35. * 订单创建(普通订单)
  36. *
  37. * @author Administrator
  38. *
  39. */
  40. class OrderCreate extends BaseModel
  41. {
  42. private $goods_money = 0;//商品金额
  43. private $delivery_money = 0;//配送费用
  44. private $coupon_money = 0;//优惠券金额
  45. private $adjust_money = 0;//调整金额
  46. private $invoice_money = 0;//发票费用
  47. private $promotion_money = 0;//优惠金额
  48. private $order_money = 0;//订单金额
  49. private $pay_money = 0;//支付总价
  50. private $is_virtual = 0; //是否是虚拟类订单
  51. private $order_name = ''; //订单详情
  52. private $goods_num = 0; //商品种数
  53. private $error = 0; //是否有错误
  54. private $error_msg = ''; //错误描述
  55. private $pay_type = 'ONLINE_PAY';
  56. private $balance_money = 0;
  57. private $is_exist_not_free = false;
  58. private $is_exist_free = false;
  59. private $member_balance_money = 0;//会员账户余额(计算过程中会逐次减少)
  60. public function ordercreate($data){
  61. $member_arrdess = $this->member_address($data);
  62. $member_level = $this->member_discount($data['member_id']);
  63. if(empty($member_level['data'])){
  64. $member_level['data']['discount'] = 1;
  65. $member_level['data']['name'] = '无折扣';
  66. }
  67. $platform_model = new PlatformModel();
  68. $platform_division = $platform_model->info('platform_division');
  69. $pre =1-$platform_division['data']['value']/100;
  70. $goods_id = model('goods_sku')->getInfo(['sku_id'=>$data['sku'][0]['sku_id']],'goods_id');
  71. model("order")->startTrans();
  72. $dev=['goods_id'=>$goods_id['goods_id'],
  73. 'member_id'=>$data['member_id'],
  74. 'address_id'=>$data['address_id'],
  75. 'num'=>$data['number'],
  76. ];
  77. $delivery_money = $this->freight($dev);
  78. //循环生成多个订单
  79. $pay = new Pay();
  80. $out_trade_no = $pay->createOutTradeNo();
  81. try {
  82. $order_no = $this->createOrderNo($data['site_id']);
  83. $site_id = $data['site_id'];
  84. $site_name = $data['site_name'];
  85. $price = $data['price'];
  86. $number = $data['number'];
  87. $unit_price = $data['unit_price'];
  88. $add_data = [
  89. 'order_no' => $order_no,
  90. 'site_id' => $site_id,
  91. 'site_name' => $site_name,
  92. 'price' => $price,
  93. 'number' => $number,
  94. 'order_type' => 1,
  95. 'order_type_name' => '普通订单',
  96. 'order_status_name' => '待支付',
  97. 'member_id'=>$data['member_id'],
  98. 'order_status_action' =>'{"status":0,"name":"待支付","is_allow_refund":0,"action":[{"action":"orderClose","title":"关闭订单","color":""},{"action":"orderAddressUpdate","title":"修改地址","color":""},{"action":"orderAdjustMoney","title":"调整价格","color":""}],"member_action":[{"action":"orderClose","title":"关闭订单","color":""},{"action":"orderPay","title":"支付","color":""}],"color":""}',
  99. 'name' => $member_arrdess['name'],
  100. 'out_trade_no' => $out_trade_no,
  101. 'mobile' => $member_arrdess['mobile'],
  102. 'telephone' => $member_arrdess['telephone'],
  103. 'province_id' => $member_arrdess['province_id'],
  104. 'city_id' => $member_arrdess['city_id'],
  105. 'district_id' => $member_arrdess['district_id'],
  106. 'community_id' => $member_arrdess['community_id'] ,
  107. 'address' => $member_arrdess['address'] ,
  108. 'full_address' => $member_arrdess['full_address'] ,
  109. 'longitude' => $member_arrdess['longitude'] ,
  110. 'latitude' => $member_arrdess['latitude'] ,
  111. 'buyer_ip' => request()->ip(),
  112. 'create_time' => time(),
  113. 'delivery_money'=>$delivery_money['data'],
  114. 'pay_money' => $price*$member_level['data']['discount'],
  115. 'goods_num'=>$number,
  116. 'order_money'=>$price*$member_level['data']['discount'],
  117. 'goods_money'=>$price,
  118. "discount_name"=>$member_level['data']['name'],
  119. "discount"=>$member_level['data']['discount']*10,
  120. ];
  121. $add_data['shop_money'] = $pre*$add_data['pay_money'];
  122. $add_data['pay_money']=$add_data['pay_money']+$delivery_money['data'];
  123. $order_id = model("order")->add($add_data);
  124. model("order")->commit();
  125. $goods_stock_model = new GoodsStock();
  126. foreach ($data['sku'] as &$v){
  127. $order_goods = $this->goodssku($v['sku_id']);
  128. $data_order_goods =[
  129. 'order_id' => $order_id,
  130. 'site_id' =>$order_goods['goodssku']['site_id'],
  131. 'site_name' =>$order_goods['goodssku']['site_name'],
  132. 'order_no' => $order_no,
  133. 'member_id' => $data['member_id'],
  134. 'sku_id' => $order_goods['goodssku']['sku_id'],
  135. 'sku_name' => $order_goods['goodssku']['sku_name'],
  136. 'sku_image' => $order_goods['goodssku']['sku_image'],
  137. 'sku_no' => $order_goods['goodssku']['sku_no'],
  138. 'is_virtual' => $order_goods['goodssku']['is_virtual'],
  139. 'goods_class' => $order_goods['goodssku']['goods_class'],
  140. 'goods_class_name' => $order_goods['goodssku']['goods_class_name'],
  141. 'price' => $unit_price,
  142. 'cost_price' => $price,
  143. 'num' => $v['num'],
  144. 'goods_money' => $unit_price*$v['num'],
  145. 'cost_money' => '',
  146. 'real_goods_money' =>$unit_price*$v['num'],
  147. 'commission_rate' => $order_goods['goodssku']['commission_rate'],
  148. 'goods_id' => $order_goods['goodssku']['goods_id'],
  149. 'delivery_status' => 0,
  150. 'delivery_status_name' => "未发货",
  151. ];
  152. $data_order_goods['real_goods_money']=$data_order_goods['real_goods_money']*$member_level['data']['discount'];
  153. model("order_goods")->add($data_order_goods);
  154. $stock_result = $goods_stock_model->decStock(["sku_id" => $data_order_goods['sku_id'], "num" => $data_order_goods['num']]);
  155. if($stock_result["code"] != 0){
  156. model("order")->rollback();
  157. return $stock_result;
  158. }
  159. }
  160. $pay->addPay(0, $out_trade_no, $this->pay_type, '商品购买', '商品购买', $add_data['pay_money'], '', 'OrderPayNotify', '');
  161. $this->addOrderCronClose($order_id);//增加关闭订单自动事件
  162. }
  163. catch(\Exception $e)
  164. {
  165. model("order")->rollback();
  166. return $this->error('', $e->getMessage().$e->getFile().$e->getLine());
  167. }
  168. return $this->success(['out_trade_no'=>$out_trade_no,'order_id'=>$order_id,'pay_money'=>$add_data['pay_money']]);
  169. }
  170. /**
  171. * @param $data
  172. * @return mixed
  173. * 用户地址
  174. */
  175. public function member_address($data){
  176. $member_address = new MemberAddress();
  177. $address = $member_address->getMemberAddressInfo([['member_id','=',$data['member_id']],['id', '=', $data['address_id']]]);
  178. $member = $address['data'];
  179. return $member;
  180. }
  181. /**
  182. * 直接下单运费
  183. */
  184. public function freight($data){
  185. $delivery_money = 0;
  186. $goods_model = new Goods();
  187. $template = new ExpressTemplate();
  188. $member_address = $this->member_address($data);
  189. $goods = $goods_model->getGoodsInfo([['goods_id', '=', $data['goods_id']]],'goods_name,site_id,is_free_shipping,shipping_template');
  190. $tag = $data['num'];
  191. if($goods['data']['is_free_shipping']==0){
  192. $temolate_item_info = $template->getExpressTemplateInfo($goods['data']['shipping_template'],$goods['data']['site_id']);
  193. foreach ($temolate_item_info['data']['template_item'] as $k_item => $v_item)
  194. {
  195. if(strpos($v_item['area_ids'] , '"'.$member_address['district_id'].'"') !== false)
  196. {
  197. //开始计算
  198. if ($tag <= $v_item['snum']) {
  199. $delivery_money += $v_item['sprice'];
  200. } else {
  201. $ext_tag = $tag - $v_item['snum'];
  202. if ($v_item['xnum'] == 0) {
  203. $v_item['xnum'] = 1;
  204. }
  205. if (($ext_tag * 100) % ($v_item['xnum'] * 100) == 0) {
  206. $ext_data = $ext_tag / $v_item['xnum'];
  207. } else {
  208. $ext_data = floor($ext_tag / $v_item['xnum']) + 1;
  209. }
  210. $delivery_money += $v_item['sprice'] + $ext_data * $v_item['xprice'];
  211. }
  212. break;
  213. }
  214. }
  215. }
  216. return $this->success($delivery_money);
  217. }
  218. /**
  219. * @param $data
  220. * @return mixed
  221. * 商品信息
  222. */
  223. public function goodsInfo($data){
  224. $goods_model = new Goods();
  225. $goods = $goods_model->getGoodsInfo([['goods_id', '=', $data]],'goods_name,is_free_shipping,shipping_template');
  226. $data['goods'] = $goods['data'];
  227. return $data;
  228. }
  229. public function goodssku($data){
  230. $goods_model =new Goods();
  231. $goods_sku =$goods_model->getGoodsSkuInfo([['sku_id','=',$data]]);
  232. $goodssku['goodssku'] = $goods_sku['data'];
  233. return $goodssku;
  234. }
  235. /**
  236. * 订单创建
  237. * @param unknown $data
  238. */
  239. public function create($data)
  240. {
  241. //查询出会员相关信息
  242. $platform_model = new PlatformModel();
  243. $platform_division = $platform_model->info('platform_division');
  244. $pre =1-$platform_division['data']['value']/100;
  245. $calculate_data = $this->calculate($data);
  246. if($this->error > 0){
  247. return $this->error("", $this->error_msg);
  248. }
  249. $pay = new Pay();
  250. if($this->is_exist_not_free){
  251. $out_trade_no = $pay->createOutTradeNo();
  252. $order_name = [];
  253. }
  254. if($this->is_exist_free){
  255. $free_out_trade_no = $pay->createOutTradeNo();
  256. $free_order_name = [];
  257. }
  258. $member_level = $this->member_discount($data['member_id']);
  259. if(empty($member_level['data'])){
  260. $member_level['data']['discount'] = 1;
  261. $member_level['data']['name'] = '无折扣';
  262. }
  263. model("order")->startTrans();
  264. //循环生成多个订单
  265. try{
  266. $pay_money = 0;
  267. $goods_stock_model = new GoodsStock();
  268. foreach ($calculate_data['shop_goods_list'] as $k => $v)
  269. {
  270. $item_delivery = $v['delivery'] ?? [];
  271. $delivery_type = $item_delivery['delivery_type'] ?? '';
  272. $delivery_type_name = Express::express_type[$delivery_type]["title"] ?? '';
  273. //判断交易流水号
  274. if($v["pay_money"] == 0){
  275. $temp_out_trade_no = $free_out_trade_no;
  276. $free_order_name[] = $v["order_name"];
  277. }else{
  278. $temp_out_trade_no = $out_trade_no;
  279. $order_name[] = $v["order_name"];
  280. }
  281. //订单主表
  282. $order_type = $this->orderType($v, $calculate_data);
  283. $order_no = $this->createOrderNo($v['site_id']);
  284. $data_order = [
  285. 'order_no' => $order_no,
  286. 'site_id' => $v['site_id'],
  287. 'site_name' => $v['site_name'],
  288. 'order_from' => $data['order_from'],
  289. 'order_from_name' => $data['order_from_name'],
  290. 'order_type' => $order_type['order_type_id'],
  291. 'order_type_name' => $order_type['order_type_name'],
  292. 'order_status_name' => $order_type['order_status']['name'],
  293. 'order_status_action' => json_encode($order_type['order_status'], JSON_UNESCAPED_UNICODE),
  294. 'out_trade_no' => $temp_out_trade_no,
  295. 'member_id' => $data['member_id'],
  296. 'name' => $calculate_data['member_address']['name'] ?? '',
  297. 'mobile' => $calculate_data['member_address']['mobile'] ?? '',
  298. 'telephone' => $calculate_data['member_address']['telephone'] ?? '',
  299. 'province_id' => $calculate_data['member_address']['province_id'] ?? '',
  300. 'city_id' => $calculate_data['member_address']['city_id'] ?? '',
  301. 'district_id' => $calculate_data['member_address']['district_id'] ?? '',
  302. 'community_id' => $calculate_data['member_address']['community_id'] ?? '',
  303. 'address' => $calculate_data['member_address']['address'] ?? '',
  304. 'full_address' => $calculate_data['member_address']['full_address'] ?? '',
  305. 'longitude' => $calculate_data['member_address']['longitude'] ?? '',
  306. 'latitude' => $calculate_data['member_address']['latitude'] ?? '',
  307. 'buyer_ip' => request()->ip(),
  308. 'goods_money' => $v['goods_money'],
  309. 'delivery_money' => $v['delivery_money'],
  310. 'coupon_id' => isset($v['coupon_id']) ? $v['coupon_id'] : 0,
  311. 'coupon_money' => $v['coupon_money'],
  312. 'adjust_money' => $v['adjust_money'],
  313. 'invoice_money' => $v['invoice_money'],
  314. 'promotion_money' => $v['promotion_money'],
  315. 'order_money' => $v['order_money']*$member_level['data']['discount'],
  316. 'balance_money' => $v['balance_money'],
  317. 'pay_money' => $v['pay_money']*$member_level['data']['discount'],
  318. 'create_time' => time(),
  319. 'is_enable_refund' => 0,
  320. 'order_name' => $v["order_name"],
  321. 'goods_num' => $v['goods_num'],
  322. 'delivery_type' => $delivery_type,
  323. 'delivery_type_name' => $delivery_type_name,
  324. 'delivery_store_id' => $v["delivery_store_id"] ?? 0,
  325. "delivery_store_name" => $v["delivery_store_name"] ?? '',
  326. "delivery_store_info" => $v["delivery_store_info"] ?? '',
  327. "buyer_message" => $v["buyer_message"],
  328. "website_id" => $v["website_id"],
  329. "discount_name"=>$member_level['data']['name'],
  330. "discount"=>$member_level['data']['discount']*10,
  331. ];
  332. $data_order['shop_money'] = $pre*$data_order['pay_money'];
  333. // print_r($data_order);die;
  334. $order_id = model("order")->add($data_order);
  335. $this->addOrderCronClose($order_id);//增加关闭订单自动事件
  336. $order_id_arr[] = $order_id;
  337. $pay_money += $v['pay_money'];
  338. //订单项目表
  339. foreach ($v['goods_list'] as $k_order_goods => $order_goods)
  340. {
  341. $data_order_goods = array(
  342. 'order_id' => $order_id,
  343. 'site_id' => $v['site_id'],
  344. 'site_name' => $v['site_name'],
  345. 'order_no' => $order_no,
  346. 'member_id' => $data['member_id'],
  347. 'sku_id' => $order_goods['sku_id'],
  348. 'sku_name' => $order_goods['sku_name'],
  349. 'sku_image' => $order_goods['sku_image'],
  350. 'sku_no' => $order_goods['sku_no'],
  351. 'is_virtual' => $order_goods['is_virtual'],
  352. 'goods_class' => $order_goods['goods_class'],
  353. 'goods_class_name' => $order_goods['goods_class_name'],
  354. 'price' => $order_goods['discount_price'],
  355. 'cost_price' => $order_goods['cost_price'],
  356. 'num' => $order_goods['num'],
  357. 'goods_money' => $order_goods['discount_price']*$order_goods['num'],
  358. 'cost_money' => $order_goods['cost_price']*$order_goods['num'],
  359. 'commission_rate' => $order_goods['commission_rate'],
  360. 'goods_id' => $order_goods['goods_id'],
  361. 'delivery_status' => 0,
  362. 'delivery_status_name' => "未发货",
  363. );
  364. $data_order_goods['real_goods_money'] = $member_level['data']['discount']*$data_order_goods['goods_money'];
  365. model("order_goods")->add($data_order_goods);
  366. //库存变化
  367. $stock_result = $goods_stock_model->decStock(["sku_id" => $order_goods['sku_id'], "num" => $order_goods['num']]);
  368. if($stock_result["code"] != 0){
  369. model("order")->rollback();
  370. return $stock_result;
  371. }
  372. // model("goods_sku")->setDec([['sku_id', '=', $order_goods['sku_id']]], 'stock', $order_goods['num']);
  373. // $sku_stock = model("goods_sku")->getInfo([['sku_id', '=', $order_goods['sku_id']]], 'stock');
  374. // if($sku_stock['stock'] < 0)
  375. // {
  376. // model("order")->rollback();
  377. // return $this->error('', "库存不足");
  378. // }
  379. }
  380. //订单满减优惠
  381. $manjian_rule = isset($v['promotion']['manjian']) ? $v['promotion']['manjian'] : '';
  382. if(!empty($manjian_rule))
  383. {
  384. $order_promotion_detail = [
  385. 'order_id' => $order_id,
  386. 'site_id' => $v['site_id'],
  387. 'promotion_text' => '满'.$manjian_rule['money'].'元减'.$manjian_rule['discount_money'],
  388. 'money' => $manjian_rule['discount_money'],
  389. 'create_time' => time()
  390. ];
  391. model('order_promotion_detail')->add($order_promotion_detail);
  392. }
  393. //优惠券
  394. if($data_order['coupon_id'] > 0 && $data_order['coupon_money'] > 0)
  395. {
  396. //优惠券处理方案
  397. $member_coupon_model = new Coupon();
  398. $coupon_use_result = $member_coupon_model->useCoupon($data_order['coupon_id'], $data['member_id'], $order_id);//使用优惠券
  399. if($coupon_use_result['code'] < 0)
  400. {
  401. model("order")->rollback();
  402. return $this->error('', "COUPON_ERROR");
  403. }
  404. }
  405. }
  406. //扣除余额(统一扣除)
  407. if($calculate_data["balance_money"] > 0){
  408. $balance_result = $this->useBalance($calculate_data);
  409. if($balance_result["code"] < 0){
  410. model("order")->rollback();
  411. return $balance_result;
  412. }
  413. }
  414. //生成整体付费支付单据
  415. if($this->is_exist_not_free) {
  416. $order_name_title = implode(",", $order_name);
  417. $pay->addPay(0, $out_trade_no, $this->pay_type, $order_name_title, $order_name_title, $this->pay_money, '', 'OrderPayNotify', '');
  418. }
  419. //免费订单支付单据
  420. if($this->is_exist_free){
  421. $free_order_name_title = implode(",", $free_order_name);
  422. $pay->addPay(0, $free_out_trade_no, $this->pay_type, $free_order_name_title, $free_order_name_title, 0, '', 'OrderPayNotify', '');
  423. }
  424. $cart_ids = isset($data['cart_ids']) ? $data['cart_ids'] : '';
  425. if(!empty($cart_ids))
  426. {
  427. $cart = new Cart();
  428. $data_cart = [
  429. 'cart_id' => $cart_ids,
  430. 'member_id' => $data['member_id']
  431. ];
  432. $cart->deleteCart($data_cart);
  433. }
  434. Cache::tag("order_create_member_".$data['member_id'])->clear();
  435. //循环执行订单完成事件
  436. foreach($order_id_arr as $k => $v){
  437. $result_list = event("OrderCreate", ['order_id' => $v]);
  438. if(!empty($result_list)){
  439. foreach($result_list as $k => $v){
  440. if(!empty($v) && $v["code"] < 0){
  441. model("order")->rollback();
  442. return $v;
  443. }
  444. }
  445. }
  446. }
  447. // $this->checkFree($data_order);//如果订单金额为0, 直接调用支付成功
  448. model("order")->commit();
  449. //订单生成的消息
  450. $message_model = new Message();
  451. $message_model->sendMessage(['keywords' => "ORDER_CREATE", 'order_id'=>$order_id]);
  452. return $this->success(['out_trade_no'=>$out_trade_no ?? $free_out_trade_no,'order_id'=>$order_id_arr,'pay_money'=>$this->pay_money]);
  453. }catch(\Exception $e)
  454. {
  455. model("order")->rollback();
  456. return $this->error('', $e->getMessage().$e->getFile().$e->getLine());
  457. }
  458. }
  459. public function member_discount($member_id){
  460. $member = new MemberModel();
  461. $vip_level = $member->getMemberInfo([['member_id','=',$member_id]],'member_level,member_type');
  462. if($vip_level['data']['member_type']==1) {
  463. $vip_discount = new MemberVip();
  464. $member_discount = $vip_discount->getMemberVipInfo([['id', '=', $vip_level['data']['member_level']]], 'discount,name');
  465. }
  466. if($vip_level['data']['member_type']==2){
  467. $franchisee_discount = new FranchiseeExamine();
  468. $member_discount = $franchisee_discount->getFranchiseeExamineInfo([['member_id', '=', $member_id]], 'discount');
  469. if($member_discount['data']) {
  470. $member_discount['data']['name'] = '加盟商';
  471. }
  472. }
  473. return $member_discount;
  474. }
  475. /**
  476. * 生成订单编号
  477. *
  478. * @param array $site_id
  479. */
  480. public function createOrderNo($site_id)
  481. {
  482. $time_str = date('YmdHi');
  483. $num = 0;
  484. $max_no = Cache::get($site_id . "_" . $time_str);
  485. if (! isset($max_no) || empty($max_no)) {
  486. $max_no = 1;
  487. } else {
  488. $max_no = $max_no + 1;
  489. }
  490. $order_no = $time_str . sprintf("%04d", $max_no);
  491. Cache::set($site_id . "_" . $time_str, $max_no);
  492. return $order_no;
  493. }
  494. /**
  495. * 订单类型判断
  496. * @param unknown $shop_goods
  497. */
  498. public function orderType($shop_goods, $data)
  499. {
  500. if($data["is_virtual"] == 1)
  501. {
  502. $order = new VirtualOrder();
  503. return [
  504. 'order_type_id' => 4,
  505. 'order_type_name' => '虚拟订单',
  506. 'order_status' => $order->order_status[0]
  507. ];
  508. }else{
  509. if($shop_goods['delivery']['delivery_type'] == 'express')
  510. {
  511. $order = new Order();
  512. return [
  513. 'order_type_id' => 1,
  514. 'order_type_name' => '普通订单',
  515. 'order_status' => $order->order_status[0]
  516. ];
  517. }elseif($shop_goods['delivery']['delivery_type'] == 'store'){
  518. $order = new StoreOrder();
  519. return [
  520. 'order_type_id' => 2,
  521. 'order_type_name' => '自提订单',
  522. 'order_status' => $order->order_status[0]
  523. ];
  524. }elseif($shop_goods['delivery']['delivery_type'] == 'local'){
  525. $order = new LocalOrder();
  526. return [
  527. 'order_type_id' => 3,
  528. 'order_type_name' => '外卖订单',
  529. 'order_status' => $order->order_status[0]
  530. ];
  531. }
  532. }
  533. }
  534. /**
  535. * 订单计算
  536. * @param unknown $data
  537. */
  538. public function calculate($data)
  539. {
  540. $data = $this->initMemberAddress($data);//初始化地址
  541. $data = $this->initMemberAccount($data);//初始化会员账户
  542. //余额付款
  543. if($data['is_balance'] > 0)
  544. {
  545. $this->member_balance_money = $data["member_account"]["balance_total"] ?? 0;
  546. }
  547. //传输购物车id组合','隔开要进行拆单
  548. if(!empty($data['cart_ids']))
  549. {
  550. //商品列表信息
  551. $shop_goods_list = $this->getOrderGoodsCalculate($data);
  552. foreach ($shop_goods_list as $k => $v)
  553. {
  554. $data['shop_goods_list'][$k] = $this->shopOrderCalculate($v, $data);
  555. }
  556. }
  557. else{
  558. //商品列表信息
  559. $shop_goods_list = $this->getOrderGoodsCalculate($data);
  560. //判断是否是虚拟订单
  561. if($shop_goods_list[0]['goods_list'][0]['is_virtual'])
  562. {
  563. $this->is_virtual = 1;
  564. }else{
  565. $this->is_virtual = 0;
  566. }
  567. $data['shop_goods_list'][$shop_goods_list[0]['goods_list'][0]['site_id']] = $this->shopOrderCalculate($shop_goods_list[0], $data);
  568. }
  569. //总结计算
  570. $data['delivery_money'] = $this->delivery_money;
  571. $data['coupon_money'] = $this->coupon_money;
  572. $data['adjust_money'] = $this->adjust_money;
  573. $data['invoice_money'] = $this->invoice_money;
  574. $data['promotion_money'] = $this->promotion_money;
  575. $data['order_money'] = $this->order_money;
  576. $data['balance_money'] = $this->balance_money;
  577. $data['pay_money'] = $this->pay_money;
  578. $data['goods_money'] = $this->goods_money;
  579. $data['goods_num'] = $this->goods_num;
  580. $data['is_virtual'] = $this->is_virtual;
  581. return $data;
  582. }
  583. /**
  584. * 待付款订单
  585. * @param unknown $data
  586. */
  587. public function orderPayment($data)
  588. {
  589. $calculate_data = $this->calculate($data);
  590. foreach ($calculate_data['shop_goods_list'] as $k => $v)
  591. {
  592. //1、查询会员优惠券
  593. $member_coupon_model = new Coupon();
  594. $member_coupon_list_result = $member_coupon_model->getMemberCouponList($data["member_id"], 1, $v["site_id"], $v["goods_money"], "money desc");
  595. $coupon_list = $member_coupon_list_result["data"];
  596. $calculate_data['shop_goods_list'][$k]["coupon_list"] = $coupon_list;
  597. $express_type = [];
  598. if($this->is_virtual == 0){
  599. if(!empty($calculate_data['member_address'])){
  600. //2. 查询店铺配送方式(1. 物流 2. 自提 3. 外卖)
  601. if($v["express_config"]["is_use"] == 1){
  602. $express_type[] = ["title" => Express::express_type["express"]["title"], "name" => "express"];
  603. }
  604. //查询店铺是否开启门店自提
  605. if($v["store_config"]["is_use"] == 1){
  606. $store_model = new Store();
  607. $member_address = $calculate_data["member_address"] ?? [];
  608. $province_id = $member_address["province_id"] ?? 0;
  609. $city_id = $member_address["city_id"] ?? 0;
  610. $store_condition = array(
  611. ["site_id", "=", $v["site_id"]],
  612. ["province_id", "=", $province_id],
  613. ["city_id", "=", $city_id],
  614. ["status", "=", 1],
  615. ["is_pickup", "=", 1],
  616. );
  617. $store_list_result = $store_model->getStoreList($store_condition);
  618. $store_list = $store_list_result["data"];
  619. $express_type[] = ["title" => Express::express_type["store"]["title"], "name" => "store", "store_list" => $store_list];
  620. }
  621. //查询店铺是否开启外卖配送
  622. if($v["local_config"]["is_use"] == 1){
  623. //查询本店的通讯地址
  624. $express_type[] = ["title" => "外卖配送", "name" => "local"];
  625. }
  626. }
  627. }
  628. $calculate_data['shop_goods_list'][$k]["express_type"] = $express_type;
  629. }
  630. return $calculate_data;
  631. }
  632. /**
  633. * 初始化收货地址
  634. * @param unknown $data
  635. */
  636. public function initMemberAddress($data)
  637. {
  638. //收货人地址管理
  639. if(empty($data['member_address']))
  640. {
  641. $member_address = new MemberAddress();
  642. $address = $member_address->getMemberAddressInfo([['member_id', '=', $data['member_id']], ['is_default', '=', 1]]);
  643. $data['member_address'] = $address['data'];
  644. }
  645. return $data;
  646. }
  647. /**
  648. * 获取商品的计算信息
  649. * @param unknown $data
  650. */
  651. public function getOrderGoodsCalculate($data)
  652. {
  653. $shop_goods_list = [];
  654. //传输购物车id组合','隔开要进行拆单
  655. if(!empty($data['cart_ids']))
  656. {
  657. // $cache = Cache::get("order_create_cart_".$data['cart_ids'].'_'.$data['member_id']);
  658. // if(!empty($cache))
  659. // {
  660. // return $cache;
  661. // }
  662. $goods_list = $this->getCartGoodsList($data['cart_ids'], $data['member_id']);
  663. foreach ($goods_list as $k => $shop_goods)
  664. {
  665. $shop_goods['promotion_money'] = 0;
  666. //查询店铺是否存在满减活动
  667. $manjian_info = model("promotion_manjian")->getInfo(['site_id' => $shop_goods['site_id'], "status" => 1], 'rule_json');
  668. $manjian_rule = [];
  669. if(!empty($manjian_info))
  670. {
  671. $manjian_rules = json_decode($manjian_info['rule_json'], true);
  672. $manjian_rules = array_reverse($manjian_rules);
  673. foreach ($manjian_rules as $k => $v)
  674. {
  675. if($shop_goods['goods_money'] >= $v['money'])
  676. {
  677. $shop_goods['promotion_money'] += $v['discount_money'];//优惠金额
  678. $promotion_item = $v;
  679. $promotion_item["content"] = "满".$v['money']."减".$v['discount_money'];
  680. $shop_goods['promotion']['manjian'] = $promotion_item;//前台显示满减规则
  681. break;
  682. }
  683. }
  684. }
  685. $shop_goods_list[$shop_goods['site_id']] = $shop_goods;
  686. }
  687. // Cache::tag("order_create_member_".$data['member_id'])->set("order_create_cart_".$data['cart_ids'].'_'.$data['member_id'], $shop_goods_list, 600);
  688. }else{
  689. // $cache = Cache::get("order_create_".$data['sku_id'].'_'.$data['num'].'_'.$data['member_id']);
  690. // if(!empty($cache))
  691. // {
  692. // return $cache;
  693. // }
  694. $shop_goods = $this->getShopGoodsList($data);
  695. //查询店铺是否存在满减活动
  696. $manjian_info = model("promotion_manjian")->getInfo(['site_id' => $shop_goods['site_id'], "status" => 1], 'rule_json');
  697. $manjian_rule = [];
  698. $shop_goods['promotion_money'] = 0;
  699. if(!empty($manjian_info))
  700. {
  701. $manjian_rules = json_decode($manjian_info['rule_json'], true);
  702. $manjian_rules = array_reverse($manjian_rules);
  703. foreach ($manjian_rules as $k => $v)
  704. {
  705. if($shop_goods['goods_money'] >= $v['money'])
  706. {
  707. $shop_goods['promotion_money'] = $v['discount_money'];//优惠金额
  708. $promotion_item = $v;
  709. $promotion_item["content"] = "满".$v['money']."减".$v['discount_money'];
  710. $shop_goods['promotion']['manjian'] = $promotion_item;//前台显示满减规则
  711. break;
  712. }
  713. }
  714. }
  715. $shop_goods_list[0] = $shop_goods;
  716. // Cache::tag("order_create_member_".$data['member_id'])->set("order_create_".$data['sku_id'].'_'.$data['num'].'_'.$data['member_id'], $shop_goods_list, 600);
  717. }
  718. return $shop_goods_list;
  719. }
  720. /**
  721. * 获取购物车商品列表信息
  722. * @param unknown $cart_ids
  723. */
  724. public function getCartGoodsList($cart_ids, $member_id)
  725. {
  726. //组装商品列表
  727. $field = ' ngc.member_id, ngc.sku_id, ngc.num, ngs.sku_name, ngs.sku_no,
  728. ngs.price, ngs.discount_price, ngs.cost_price, ngs.stock, ngs.weight, ngs.volume, ngs.sku_image,
  729. ngs.site_id, ngs.site_name, ngs.website_id, ngs.is_own, ngs.goods_state, ngs.is_virtual,
  730. ngs.is_free_shipping, ngs.shipping_template, ngs.goods_class, ngs.goods_class_name, ngs.commission_rate,ngs.goods_id';
  731. $alias = 'ngc';
  732. $join = [
  733. [
  734. 'goods_sku ngs',
  735. 'ngc.sku_id = ngs.sku_id',
  736. 'inner'
  737. ],
  738. ];
  739. $goods_list = model("goods_cart")->getList([['cart_id', 'in', $cart_ids], ['member_id', '=', $member_id]], $field, '', $alias, $join);
  740. $shop_goods_list = [];
  741. if(!empty($goods_list))
  742. {
  743. foreach ($goods_list as $k => $v)
  744. {
  745. $goods_model = new \app\model\goods\Goods();
  746. $gods_price =$goods_model->getGoodsInfo([['goods_id','=',$v['goods_id']]],'pay_num1,pay_num2,pay_num3,price1,price2,price3');
  747. if($v['num']>=$gods_price['data']['pay_num1']){
  748. $money =$gods_price['data']['price1'];
  749. }
  750. if($v['num']>=$gods_price['data']['pay_num2']){
  751. $money =$gods_price['data']['price2'];
  752. }
  753. if($v['num']>=$gods_price['data']['pay_num3']){
  754. $money =$gods_price['data']['price3'];
  755. }
  756. $v['discount_price'] =$money;
  757. $site_id = $v['site_id'];
  758. if(isset($shop_goods_list[$site_id]))
  759. {
  760. $shop_goods_list[$site_id]['goods_list'][] = $v;
  761. $shop_goods_list[$site_id]['order_name'] = string_split($shop_goods_list[$site_id]['order_name'], ",", $v['sku_name']);
  762. $shop_goods_list[$site_id]['goods_num'] += $v['num'];
  763. $shop_goods_list[$site_id]['goods_money'] += $v['discount_price'] * $v['num'];
  764. $shop_goods_list[$site_id]['goods_list_str'] = $shop_goods_list[$site_id]['goods_list_str'].';'.$v['sku_id'].':'.$v['num'];
  765. }else{
  766. $shop_goods_list[$site_id]['site_id'] = $site_id;
  767. $shop_goods_list[$site_id]['site_name'] = $v['site_name'];
  768. $shop_goods_list[$site_id]['website_id'] = $v['website_id'];
  769. $shop_goods_list[$site_id]['goods_money'] = $v['discount_price'] * $v['num'];
  770. $shop_goods_list[$site_id]['goods_list_str'] = $v['sku_id'].':'.$v['num'];
  771. $shop_goods_list[$site_id]['order_name'] = string_split("", ",", $v['sku_name']);
  772. $shop_goods_list[$site_id]['goods_num'] = $v['num'];
  773. $shop_goods_list[$site_id]['goods_list'][] = $v;
  774. }
  775. }
  776. }
  777. return $shop_goods_list;
  778. }
  779. /**
  780. * 获取立即购买商品信息
  781. * @param unknown $data
  782. * @return multitype:string number unknown mixed
  783. */
  784. public function getShopGoodsList($data)
  785. {
  786. $sku_info = model("goods_sku")->getInfo([['sku_id', '=', $data['sku_id']]], 'sku_id, sku_name, sku_no, price, discount_price,
  787. cost_price, stock, volume, weight, sku_image, site_id, site_name,
  788. website_id, is_own, goods_state, is_virtual, is_free_shipping, shipping_template,goods_class, goods_class_name, commission_rate, goods_id');
  789. $sku_info['num'] = $data['num'];
  790. $goods_money = $sku_info['discount_price'] * $data['num'];
  791. $goods_list[] = $sku_info;
  792. $shop_goods = [
  793. 'goods_money' => $goods_money,
  794. 'site_id' => $sku_info['site_id'],
  795. 'site_name' => $sku_info['site_name'],
  796. 'website_id' => $sku_info['website_id'],
  797. 'goods_list_str' => $sku_info['sku_id'].':'.$sku_info['num'],
  798. 'goods_list' => $goods_list,
  799. 'order_name' => $sku_info["sku_name"],
  800. 'goods_num' => $sku_info['num'],
  801. ];
  802. return $shop_goods;
  803. }
  804. /**
  805. * 获取店铺订单计算
  806. * @param unknown $site_id 店铺id
  807. * @param unknown $site_name 店铺名称
  808. * @param unknown $goods_money 商品总价
  809. * @param unknown $goods_list 店铺商品列表
  810. * @param unknown $data 传输生成订单数据
  811. */
  812. public function shopOrderCalculate($shop_goods, $data)
  813. {
  814. $site_id = $shop_goods['site_id'];
  815. //定义计算金额
  816. $goods_money = $shop_goods['goods_money']; //商品金额
  817. $delivery_money = 0; //配送费用
  818. $promotion_money = $shop_goods['promotion_money']; //优惠费用(满减)
  819. $coupon_money = 0; //优惠券费用
  820. $adjust_money = 0; //调整金额
  821. $invoice_money = 0; //发票金额
  822. $order_money = 0; //订单金额
  823. $balance_money = 0; //会员余额
  824. $pay_money = 0; //应付金额
  825. //计算邮费
  826. if($this->is_virtual == 1)
  827. {
  828. //虚拟订单 运费为0
  829. $delivery_money = 0;
  830. $shop_goods['delivery']['delivery_type'] = '';
  831. }else{
  832. if(empty($data['member_address']))
  833. {
  834. $delivery_money = 0;
  835. $shop_goods['delivery']['delivery_type'] = 'express';
  836. $this->error = 1;
  837. $this->error_msg = "未配置默认收货地址!";
  838. }else{
  839. //查询店铺是否开启快递配送
  840. $express_config_model = new ExpressConfig();
  841. $express_config_result = $express_config_model->getExpressConfig($site_id);
  842. $express_config = $express_config_result["data"];
  843. $shop_goods["express_config"] = $express_config;
  844. //查询店铺是否开启门店自提
  845. $store_config_result = $express_config_model->getStoreConfig($site_id);
  846. $store_config = $store_config_result["data"];
  847. $shop_goods["store_config"] = $store_config;
  848. //查询店铺是否开启外卖配送
  849. $local_config_result = $express_config_model->getLocalDeliveryConfig($site_id);
  850. $local_config = $local_config_result["data"];
  851. $shop_goods["local_config"] = $local_config;
  852. if(!isset($data['delivery'][$site_id]["delivery_type"]) || $data['delivery'][$site_id]["delivery_type"] == "express"){
  853. if($shop_goods["express_config"]["is_use"] == 1){
  854. //物流配送
  855. $express = new Express();
  856. $express_fee_result = $express->calculate($shop_goods, $data);
  857. if($express_fee_result["code"] < 0){
  858. $this->error = 1;
  859. $this->error_msg = $express_fee_result["message"];
  860. $delivery_fee = 0;
  861. }else{
  862. $delivery_fee = $express_fee_result['data']['delivery_fee'];
  863. }
  864. }else{
  865. $this->error = 1;
  866. $this->error_msg = "物流配送方式未开启!";
  867. $delivery_fee = 0;
  868. }
  869. $delivery_money = $delivery_fee;
  870. $shop_goods['delivery']['delivery_type'] = 'express';
  871. }else if($data['delivery'][$site_id]["delivery_type"] == "store"){
  872. //门店自提
  873. $delivery_money = 0;
  874. $shop_goods['delivery']['delivery_type'] = 'store';
  875. if($shop_goods["store_config"]["is_use"] == 0){
  876. $this->error = 1;
  877. $this->error_msg = "门店自提方式未开启!";
  878. }
  879. if(empty($data['delivery'][$site_id]["store_id"])){
  880. $this->error = 1;
  881. $this->error_msg = "门店未选择!";
  882. }
  883. $shop_goods['delivery']['store_id'] = $data['delivery'][$site_id]["store_id"];
  884. $shop_goods = array_merge($shop_goods,$this->storeOrderData($shop_goods, $data));
  885. }else if($data['delivery'][$site_id]["delivery_type"] == "local"){
  886. //外卖配送
  887. $delivery_money = 0;
  888. $shop_goods['delivery']['delivery_type'] = 'local';
  889. if($shop_goods["local_config"]["is_use"] == 0){
  890. $this->error = 1;
  891. $this->error_msg = "外卖配送方式未开启!";
  892. }
  893. }
  894. }
  895. }
  896. $order_money = $goods_money + $delivery_money - $promotion_money + $invoice_money;
  897. //优惠券活动(采用站点id:coupon_id)
  898. if(!empty($data['coupon'][$site_id]) && $data['coupon'][$site_id]["coupon_id"] > 0)
  899. {
  900. $coupon_info = $data['coupon'][$site_id];
  901. $shop_goods['coupon_id'] = $coupon_info["coupon_id"];
  902. //查询优惠券信息,计算优惠券费用
  903. $coupon = new Coupon();
  904. $coupon_info_result = $coupon->getCouponInfo([['coupon_id', '=', $shop_goods['coupon_id']]], 'member_id,at_least,money,state');
  905. $coupon_info = $coupon_info_result["data"];
  906. if(($coupon_info['at_least'] <= $goods_money-$promotion_money) && ($coupon_info['state'] == 1) && $coupon_info['member_id'] == $data['member_id'])
  907. {
  908. $coupon_money = $coupon_info['money'];
  909. }else{
  910. $this->error = 1;
  911. $this->error_msg = "优惠券不可用!";
  912. }
  913. }
  914. if($coupon_money > $order_money){
  915. $coupon_money = $order_money;
  916. }
  917. $order_money -= $coupon_money;
  918. //买家留言
  919. if(isset($data['buyer_message']) && isset($data['buyer_message'][$site_id])){
  920. $item_buyer_message = $data['buyer_message'][$site_id];
  921. $shop_goods["buyer_message"] = $item_buyer_message;
  922. }else{
  923. $shop_goods["buyer_message"] = '';
  924. }
  925. if($order_money < 0)
  926. {
  927. $order_money = 0;
  928. }
  929. //余额抵扣(判断是否使用余额)
  930. if($this->member_balance_money > 0)
  931. {
  932. if($order_money <= $this->member_balance_money)
  933. {
  934. $balance_money = $order_money;
  935. }else{
  936. $balance_money = $this->member_balance_money;
  937. }
  938. }else{
  939. $balance_money = 0;
  940. }
  941. $pay_money = $order_money - $balance_money;//计算出实际支付金额
  942. //判断是否存在支付金额为0的订单
  943. if($pay_money > 0){
  944. $this->is_exist_not_free = true;
  945. }else{
  946. $this->is_exist_free = true;
  947. }
  948. $this->member_balance_money -= $balance_money;//预减少账户余额
  949. $this->balance_money += $balance_money;//累计余额
  950. //总结计算
  951. $shop_goods['goods_money'] = $goods_money;
  952. $shop_goods['delivery_money'] = $delivery_money;
  953. $shop_goods['coupon_money'] = $coupon_money;
  954. $shop_goods['adjust_money'] = $adjust_money;
  955. $shop_goods['invoice_money'] = $invoice_money;
  956. $shop_goods['promotion_money'] = $promotion_money;
  957. $shop_goods['order_money'] = $order_money;
  958. $shop_goods['balance_money'] = $balance_money;
  959. $shop_goods['pay_money'] = $pay_money;
  960. $this->goods_money += $goods_money;
  961. $this->delivery_money += $delivery_money;
  962. $this->coupon_money += $coupon_money;
  963. $this->adjust_money += $adjust_money;
  964. $this->invoice_money += $invoice_money;
  965. $this->promotion_money += $promotion_money;
  966. $this->order_money += $order_money;
  967. $this->pay_money += $pay_money;
  968. $this->goods_num += $shop_goods["goods_num"];
  969. $this->order_name = string_split($this->order_name, ",", $shop_goods["order_name"]);
  970. return $shop_goods;
  971. }
  972. /**
  973. * 增加订单自动关闭事件
  974. * @param $order_id
  975. */
  976. public function addOrderCronClose($order_id){
  977. //计算订单自动关闭时间
  978. $config_model = new Config();
  979. $order_config_result = $config_model->getOrderEventTimeConfig();
  980. $order_config = $order_config_result["data"];
  981. $now_time = time();
  982. if(!empty($order_config)){
  983. $execute_time = $now_time + $order_config["value"]["auto_close"]*60;//自动关闭时间
  984. }else{
  985. $execute_time = $now_time + 3600;//尚未配置 默认一天
  986. }
  987. $cron_model = new Cron();
  988. $cron_model->addCron(1, 0, "订单自动关闭", "CronOrderClose", $execute_time, $order_id);
  989. }
  990. /**
  991. * 验证订单支付金额知否为0 如果为0 立即支付完成
  992. * @param $order_data
  993. */
  994. public function checkFree($order_data){
  995. if($order_data["pay_money"] == 0){
  996. // $pay_model = new Pay();
  997. // $pay_model->onlinePay($order_data["out_trade_no"], "ONLINE_PAY", '', '');
  998. }
  999. }
  1000. /**
  1001. * 补齐门店数据
  1002. * @param $data
  1003. */
  1004. public function storeOrderData($shop_goods, $data){
  1005. $temp_data = [];
  1006. $delivery_store_id = $shop_goods['delivery']['store_id'] ?? 0;//门店id
  1007. if($delivery_store_id > 0){
  1008. $member_address = $data["member_address"] ?? [];
  1009. $province_id = $member_address["province_id"] ?? 0;
  1010. $city_id = $member_address["city_id"] ?? 0;
  1011. $store_model = new Store();
  1012. $condition = array(
  1013. ["store_id", "=", $delivery_store_id],
  1014. ["site_id", "=", $shop_goods['site_id']],
  1015. ["province_id", "=", $province_id],
  1016. ["city_id", "=", $city_id],
  1017. ["status", "=", 1],
  1018. ["is_pickup", "=", 1],
  1019. );
  1020. $store_info_result = $store_model->getStoreInfo($condition);
  1021. $store_info = $store_info_result["data"] ?? [];
  1022. if(empty($store_info)) {
  1023. $this->error = 1;
  1024. $this->error_msg = "当前门店不存在或未开启!";
  1025. }else {
  1026. $temp_data["delivery_store_id"] = $delivery_store_id;
  1027. $delivery_store_name = $store_info_result["data"]["store_name"];
  1028. $temp_data["delivery_store_name"] = $delivery_store_name;
  1029. $delivery_store_info = array(
  1030. "open_date" => $store_info["open_date"],
  1031. "full_address" => $store_info["full_address"],
  1032. "longitude" => $store_info["longitude"],
  1033. "latitude" => $store_info["latitude"],
  1034. "telphone" => $store_info["telphone"],
  1035. );
  1036. $temp_data["delivery_store_info"] = json_encode($delivery_store_info, JSON_UNESCAPED_UNICODE);
  1037. }
  1038. }else{
  1039. $this->error = 1;
  1040. $this->error_msg = "配送门店不可为空!";
  1041. }
  1042. return $temp_data;
  1043. }
  1044. /**
  1045. * 使用余额
  1046. * @param $order_data
  1047. * @return array
  1048. */
  1049. public function useBalance($data){
  1050. $this->pay_type = "BALANCE";
  1051. $member_model = new Member();
  1052. $result = $member_model->checkPayPassword($data["member_id"], $data["pay_password"]);
  1053. if($result["code"] >= 0){
  1054. $balance_money = $data["member_account"]["balance_money"];//不可提现余额
  1055. $balance = $data["member_account"]["balance"];//可提现余额
  1056. $member_account_model = new MemberAccount();
  1057. $surplus_banance = $data["balance_money"];
  1058. //优先扣除不可提现余额
  1059. if($balance > 0){
  1060. if($balance >= $surplus_banance){
  1061. $real_balance = $surplus_banance;
  1062. }else{
  1063. $real_balance = $balance;
  1064. }
  1065. $result = $member_account_model->addMemberAccount($data["member_id"], "balance", -$real_balance, "order", "余额抵扣","订单余额抵扣,扣除不可提现余额:".$real_balance);
  1066. $surplus_banance -= $real_balance;
  1067. }
  1068. // if($balance_money > 0){
  1069. // if($balance_money > $surplus_banance){
  1070. // $real_balance_money = $surplus_banance;
  1071. // }else{
  1072. // $real_balance_money = $balance_money;
  1073. // }
  1074. // $result = $member_account_model->addMemberAccount($data["member_id"], "balance", -$real_balance, "order", "余额抵扣","订单余额抵扣,扣除不可提现余额:".$real_balance);
  1075. // }
  1076. if($surplus_banance > 0){
  1077. $result = $member_account_model->addMemberAccount($data["member_id"], "balance_money", -$surplus_banance, "order", "余额抵扣","订单余额抵扣,扣除可提现余额:".$surplus_banance);
  1078. }
  1079. return $result;
  1080. }else{
  1081. return $result;
  1082. }
  1083. }
  1084. /**
  1085. * 初始化会员账户
  1086. * @param $data
  1087. * @return mixed
  1088. */
  1089. public function initMemberAccount($data){
  1090. $member_model = new Member();
  1091. $member_info_result = $member_model->getMemberDetail($data["member_id"]);
  1092. $member_info = $member_info_result["data"];
  1093. if(!empty($member_info)){
  1094. if(!empty($member_info["pay_password"])){
  1095. $is_pay_password = 1;
  1096. }else{
  1097. $is_pay_password = 0;
  1098. }
  1099. unset($member_info["pay_password"]);
  1100. $member_info["is_pay_password"] = $is_pay_password;
  1101. $data['member_account'] = $member_info;
  1102. }
  1103. return $data;
  1104. }
  1105. }