PresaleOrderCreate.php 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977
  1. <?php
  2. /**
  3. * Niushop商城系统 - 团队十年电商经验汇集巨献!
  4. * =========================================================
  5. * Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
  6. * ----------------------------------------------
  7. * 官方网址: https://www.niushop.com
  8. * 这不是一个自由软件!您只能在不用于商业目的的前提下对程序代码进行修改和使用。
  9. * 任何企业和个人不允许对程序代码以任何形式任何目的再发布。
  10. * =========================================================
  11. */
  12. namespace addon\presale\model;
  13. use addon\coupon\model\Coupon;
  14. use addon\store\model\StoreGoodsSku;
  15. use addon\store\model\StoreMember as StoreMemberModel;
  16. use app\model\express\Config as ExpressConfig;
  17. use app\model\express\Express;
  18. use app\model\express\Local;
  19. use app\model\order\Config;
  20. use app\model\order\OrderCreate;
  21. use app\model\order\OrderCreateTool;
  22. use app\model\store\Store;
  23. use app\model\system\Pay;
  24. use think\facade\Cache;
  25. /**
  26. * 订单创建(商品预售)
  27. *
  28. * @author Administrator
  29. *
  30. */
  31. class PresaleOrderCreate extends OrderCreate
  32. {
  33. use OrderCreateTool;
  34. private $goods_money = 0;//商品金额
  35. private $balance_money = 0;//余额
  36. private $delivery_money = 0;//配送费用
  37. private $coupon_money = 0;//优惠券金额
  38. private $adjust_money = 0;//调整金额
  39. private $invoice_money = 0;//发票费用
  40. private $promotion_money = 0;//优惠金额
  41. private $order_money = 0;//订金金额
  42. private $pay_money = 0;//支付总价
  43. private $final_money = 0;//尾款金额
  44. private $is_virtual = 0; //是否是虚拟类订单
  45. private $order_name = ''; //订单详情
  46. private $goods_num = 0; //商品种数
  47. private $member_balance_money = 0;//会员账户余额(计算过程中会逐次减少)
  48. private $pay_type = 'ONLINE_PAY';//支付方式
  49. private $invoice_delivery_money = 0;
  50. private $error = 0; //是否有错误
  51. private $error_msg = ''; //错误描述
  52. private $recommend_member_card; // 推荐会员卡
  53. /************************************************** 定金支付 start *********************************************************************/
  54. /**
  55. * 订单创建
  56. * @param unknown $data
  57. */
  58. public function create($data)
  59. {
  60. //查询出会员相关信息
  61. $calculate_data = $this->depositCalculate($data);
  62. if (isset($calculate_data[ 'code' ]) && $calculate_data[ 'code' ] < 0)
  63. return $calculate_data;
  64. if ($this->error > 0) {
  65. return $this->error([ 'error_code' => $this->error ], $this->error_msg);
  66. }
  67. if (!empty($calculate_data[ 'invoice_type' ])) {
  68. if ($calculate_data[ 'invoice_type' ] == 1 && $calculate_data[ 'invoice_full_address' ] == "") {
  69. //物流,同城
  70. if ($calculate_data[ 'shop_goods_list' ][ 'delivery' ][ 'delivery_type' ] == "express" || $calculate_data[ 'shop_goods_list' ][ 'delivery' ][ 'delivery_type' ] == "local") {
  71. $calculate_data[ 'invoice_full_address' ] = $calculate_data[ 'member_address' ][ 'full_address' ] . $calculate_data[ 'member_address' ][ 'address' ];
  72. $calculate_data[ 'shop_goods_list' ][ 'invoice_full_address' ] = $calculate_data[ 'member_address' ][ 'full_address' ] . $calculate_data[ 'member_address' ][ 'address' ];
  73. }
  74. //门店
  75. if ($calculate_data[ 'shop_goods_list' ][ 'delivery' ][ 'delivery_type' ] == "store") {
  76. $delivery_store_info = json_decode($calculate_data[ 'shop_goods_list' ][ 'delivery_store_info' ], true);
  77. $calculate_data[ 'invoice_full_address' ] = $delivery_store_info[ 'full_address' ];
  78. $calculate_data[ 'shop_goods_list' ][ 'invoice_full_address' ] = $delivery_store_info[ 'full_address' ];
  79. }
  80. }
  81. }
  82. $pay = new Pay();
  83. $out_trade_no = $pay->createOutTradeNo();
  84. $presale_common_order = new PresaleOrderCommon();
  85. $order_status_data = $presale_common_order->getOrderStatus();
  86. $order_status = $order_status_data[ 'data' ];
  87. model("promotion_presale_order")->startTrans();
  88. //循环生成多个订单
  89. try {
  90. $order_item = $calculate_data[ 'shop_goods_list' ]; //订单数据主体
  91. $item_delivery = $order_item[ 'delivery' ] ?? [];
  92. $delivery_type = $item_delivery[ 'delivery_type' ] ?? '';
  93. $site_id = $data[ 'site_id' ];
  94. $express_type_list = ( new \app\model\express\Config() )->getExpressTypeList($site_id);
  95. $delivery_type_name = $express_type_list[ $delivery_type ] ?? '';
  96. $presale_info = $calculate_data[ 'presale_info' ];
  97. $promotion_presale_info = $calculate_data[ 'promotion_presale_info' ];
  98. //订单主表
  99. $order_no = $this->createOrderNo($data[ 'site_id' ]);
  100. $order_type = $this->orderType($order_item, $calculate_data);
  101. $sku_info = $order_item[ 'goods_list' ][ 0 ];
  102. $data_order = [
  103. 'site_id' => $data[ 'site_id' ],
  104. 'site_name' => $sku_info[ 'site_name' ],
  105. 'presale_id' => $data[ 'presale_id' ],
  106. 'order_no' => $order_no,
  107. 'deposit_out_trade_no' => $out_trade_no,
  108. 'order_from' => $data[ 'order_from' ],
  109. 'order_from_name' => $data[ 'order_from_name' ],
  110. 'order_type' => $order_type[ 'order_type_id' ],
  111. 'order_type_name' => $order_type[ 'order_type_name' ],
  112. 'order_status_name' => $order_status[ $presale_common_order::ORDER_CREATE ][ 'name' ],
  113. 'order_status_action' => json_encode($order_status[ $presale_common_order::ORDER_CREATE ], JSON_UNESCAPED_UNICODE),
  114. 'pay_start_time' => $presale_info[ 'pay_start_time' ],
  115. 'pay_end_time' => $presale_info[ 'pay_end_time' ],
  116. 'is_fenxiao' => $presale_info[ 'is_fenxiao' ],
  117. 'goods_id' => $presale_info[ 'goods_id' ],
  118. 'goods_name' => $presale_info[ 'goods_name' ],
  119. 'sku_id' => $data[ 'sku_id' ],
  120. 'sku_name' => $sku_info[ 'sku_name' ],
  121. 'sku_image' => $sku_info[ 'sku_image' ],
  122. 'sku_no' => $sku_info[ 'sku_no' ],
  123. 'is_virtual' => $sku_info[ 'is_virtual' ],
  124. 'goods_class' => $sku_info[ 'goods_class' ],
  125. 'goods_class_name' => $sku_info[ 'goods_class_name' ],
  126. 'cost_price' => $sku_info[ 'cost_price' ],
  127. 'sku_spec_format' => $sku_info[ 'sku_spec_format' ],
  128. 'member_id' => $data[ 'member_id' ],
  129. 'name' => $calculate_data[ 'member_address' ][ 'name' ] ?? '',
  130. 'mobile' => $calculate_data[ 'member_address' ][ 'mobile' ] ?? '',
  131. 'telephone' => $calculate_data[ 'member_address' ][ 'telephone' ] ?? '',
  132. 'province_id' => $calculate_data[ 'member_address' ][ 'province_id' ] ?? '',
  133. 'city_id' => $calculate_data[ 'member_address' ][ 'city_id' ] ?? '',
  134. 'district_id' => $calculate_data[ 'member_address' ][ 'district_id' ] ?? '',
  135. 'community_id' => $calculate_data[ 'member_address' ][ 'community_id' ] ?? '',
  136. 'address' => $calculate_data[ 'member_address' ][ 'address' ] ?? '',
  137. 'full_address' => $calculate_data[ 'member_address' ][ 'full_address' ] ?? '',
  138. 'longitude' => $calculate_data[ 'member_address' ][ 'longitude' ] ?? '',
  139. 'latitude' => $calculate_data[ 'member_address' ][ 'latitude' ] ?? '',
  140. 'buyer_ip' => request()->ip(),
  141. 'buyer_ask_delivery_time' => $order_item[ 'buyer_ask_delivery_time' ] ?? '',//定时达
  142. "buyer_message" => $order_item[ "buyer_message" ],
  143. 'num' => $data[ 'num' ],
  144. 'presale_deposit' => $presale_info[ 'presale_deposit' ],//定金单价
  145. 'presale_deposit_money' => $calculate_data[ 'presale_deposit_money' ],//定金总额
  146. 'presale_price' => $presale_info[ 'presale_price' ],//抵扣单价
  147. 'presale_money' => $calculate_data[ 'presale_money' ],//抵扣总额
  148. 'price' => $sku_info[ 'price' ],
  149. 'goods_money' => $order_item[ 'goods_money' ],
  150. 'balance_deposit_money' => $calculate_data[ 'balance_money' ],
  151. 'pay_deposit_money' => $calculate_data[ 'pay_money' ],
  152. 'delivery_money' => $calculate_data[ 'delivery_money' ],
  153. 'promotion_money' => $calculate_data[ 'promotion_money' ],
  154. 'coupon_id' => $order_item[ 'coupon_id' ] ?? 0,
  155. 'coupon_money' => $calculate_data[ 'coupon_money' ] ?? 0,
  156. 'invoice_money' => $calculate_data[ 'invoice_money' ],
  157. 'final_money' => $calculate_data[ 'final_money' ],
  158. 'order_money' => $calculate_data[ 'order_money' ],
  159. 'delivery_type' => $delivery_type,
  160. 'delivery_type_name' => $delivery_type_name,
  161. 'delivery_store_id' => $item_delivery[ "store_id" ] ?? 0,
  162. "delivery_store_name" => $order_item[ "delivery_store_name" ] ?? '',
  163. "delivery_store_info" => $order_item[ "delivery_store_info" ] ?? '',
  164. "is_invoice" => $order_item[ "is_invoice" ] ?? 0,
  165. "invoice_type" => $order_item[ "invoice_type" ] ?? 0,
  166. "invoice_title" => $order_item[ "invoice_title" ] ?? '',
  167. "taxpayer_number" => $order_item[ "taxpayer_number" ] ?? '',
  168. "invoice_rate" => $order_item[ "invoice_rate" ] ?? 0,
  169. "invoice_content" => $order_item[ "invoice_content" ] ?? '',
  170. "invoice_delivery_money" => $calculate_data[ "invoice_delivery_money" ] ?? 0,
  171. "invoice_full_address" => $order_item[ "invoice_full_address" ] ?? '',
  172. 'is_tax_invoice' => $order_item[ "is_tax_invoice" ] ?? '',
  173. 'invoice_email' => $order_item[ "invoice_email" ] ?? '',
  174. 'invoice_title_type' => $order_item[ "invoice_title_type" ] ?? 0,
  175. 'order_status' => '0',
  176. 'create_time' => time(),
  177. 'is_deposit_back' => $promotion_presale_info[ 'is_deposit_back' ],
  178. 'deposit_agreement' => $promotion_presale_info[ 'deposit_agreement' ],
  179. ];
  180. $order_id = model("promotion_presale_order")->add($data_order);
  181. //预售订单创建
  182. event('PresaleOrderCreate', [ 'id' => $order_id ]);
  183. //添加门店关注记录和减少门店商品库存 最新代码位置
  184. $result_list = $this->addStoreMemberAndDecStock($data_order);
  185. if ($result_list[ 'code' ] < 0) {
  186. model("promotion_presale_order")->rollback();
  187. return $result_list;
  188. }
  189. //减少库存
  190. $stock_result = $this->decStock([ "site_id" => $data[ 'site_id' ], "num" => $data[ 'num' ], 'presale_id' => $data[ 'presale_id' ], 'sku_id' => $data[ 'sku_id' ] ]);
  191. if ($stock_result[ "code" ] != 0) {
  192. model("promotion_presale_order")->rollback();
  193. return $stock_result;
  194. }
  195. //todo 满减送
  196. if (!empty($order_item[ 'manjian_rule_list' ])) {
  197. $mansong_data = [];
  198. foreach ($order_item[ 'manjian_rule_list' ] as $item) {
  199. // 检测是否有赠送内容
  200. if (isset($item[ 'rule' ][ 'point' ]) || isset($item[ 'rule' ][ 'coupon' ])) {
  201. array_push($mansong_data, [
  202. 'manjian_id' => $item[ 'manjian_info' ][ 'manjian_id' ],
  203. 'site_id' => $order_item[ 'site_id' ],
  204. 'manjian_name' => $item[ 'manjian_info' ][ 'manjian_name' ],
  205. 'point' => isset($item[ 'rule' ][ 'point' ]) ? number_format($item[ 'rule' ][ 'point' ]) : 0,
  206. 'coupon' => $item[ 'rule' ][ 'coupon' ] ?? 0,
  207. 'coupon_num' => $item[ 'rule' ][ 'coupon_num' ] ?? '',
  208. 'order_id' => $order_id,
  209. 'member_id' => $data[ 'member_id' ],
  210. 'order_sku_ids' => !empty($item[ 'sku_ids' ]) ? implode($item[ 'sku_ids' ]) : '',
  211. ]);
  212. }
  213. }
  214. if (!empty($mansong_data)) {
  215. model('promotion_mansong_record')->addList($mansong_data);
  216. }
  217. }
  218. //优惠券
  219. if ($data_order[ 'coupon_id' ] > 0 && $data_order[ 'coupon_money' ] > 0) {
  220. //优惠券处理方案
  221. $member_coupon_model = new Coupon();
  222. $coupon_use_result = $member_coupon_model->useCoupon($data_order[ 'coupon_id' ], $data[ 'member_id' ], $order_id); //使用优惠券
  223. if ($coupon_use_result[ 'code' ] < 0) {
  224. model("promotion_presale_order")->rollback();
  225. return $this->error('', "COUPON_ERROR");
  226. }
  227. }
  228. //扣除余额(统一扣除)
  229. if ($calculate_data[ "balance_money" ] > 0) {
  230. $calculate_data[ 'order_id' ] = $order_id;
  231. $this->pay_type = "BALANCE";
  232. $balance_result = $this->useBalance($calculate_data, $data[ 'site_id' ], 'presale_order');
  233. if ($balance_result[ "code" ] < 0) {
  234. model("promotion_presale_order")->rollback();
  235. return $balance_result;
  236. }
  237. }
  238. //添加门店关注记录和减少门店商品库存 原本代码位置
  239. //生成整体支付单据
  240. $pay->addPay($order_item[ 'site_id' ], $out_trade_no, $this->pay_type, $this->order_name, $this->order_name, $this->pay_money, '', 'DepositOrderPayNotify', '');
  241. //增加关闭订单自动事件
  242. $presale_order_model = new PresaleOrderCommon();
  243. $presale_order_model->addDepositOrderCronClose($order_id, $data[ 'site_id' ]);
  244. //如果退定金 增加尾款支付到期时间退定金操作
  245. if ($calculate_data[ 'is_deposit_back' ] == 0) {
  246. $presale_order_model->addRefundOrderCronClose($order_id, $data[ 'site_id' ], $calculate_data[ 'pay_end_time' ]);
  247. }
  248. Cache::tag("order_create_presale_" . $data[ 'member_id' ])->clear();
  249. model("promotion_presale_order")->commit();
  250. return $this->success($out_trade_no);
  251. } catch (\Exception $e) {
  252. model("promotion_presale_order")->rollback();
  253. return $this->error('', $e->getMessage());
  254. }
  255. }
  256. /**
  257. * 订单计算(定金)
  258. * @param unknown $data
  259. */
  260. public function depositCalculate($data)
  261. {
  262. $data = $this->initMemberAddress($data); //初始化地址
  263. $data = $this->initMemberAccount($data);//初始化会员账户
  264. //余额付款
  265. if ($data[ 'is_balance' ] > 0) {
  266. $this->member_balance_money = $data[ "member_account" ][ "balance_total" ] ?? 0;
  267. }
  268. //查询预售活动信息
  269. $promotion_presale_info = model('promotion_presale')->getInfo([ [ 'presale_id', '=', $data[ "presale_id" ] ] ]);
  270. if (empty($promotion_presale_info)) {
  271. $this->error = 1;
  272. $this->error_msg = "预售活动不存在!";
  273. }
  274. $data[ 'promotion_presale_info' ] = $promotion_presale_info;
  275. //查询预售信息
  276. $join = [
  277. [ 'promotion_presale pp', 'pp.presale_id = ppg.presale_id', 'inner' ],
  278. [ 'goods g', 'g.goods_id = ppg.goods_id', 'inner' ]
  279. ];
  280. $condition = [
  281. [ 'ppg.presale_id', '=', $data[ "presale_id" ] ],
  282. [ 'ppg.sku_id', '=', $data[ 'sku_id' ] ],
  283. [ 'g.goods_state', '=', 1 ],
  284. [ 'g.is_delete', '=', 0 ]
  285. ];
  286. $field = 'pp.*,ppg.sku_id,ppg.presale_stock,ppg.presale_deposit,ppg.presale_price,g.goods_name,g.is_virtual';
  287. $presale_info = model('promotion_presale_goods')->getInfo($condition, $field, 'ppg', $join);
  288. $this->is_virtual = $presale_info[ 'is_virtual' ];
  289. if (empty($presale_info)) {
  290. $this->error = 1;
  291. $this->error_msg = "商品不存在!";
  292. }
  293. //判断活动是否过期或开启
  294. if ($presale_info[ "status" ] != 1) {
  295. $this->error = 1;
  296. $this->error_msg = "当前商品预售活动未开启或已过期!";
  297. }
  298. //判断购买数是否超过限购
  299. if ($presale_info[ "presale_num" ] < $data[ 'num' ] && $presale_info[ "presale_num" ] > 0) {
  300. $this->error = 1;
  301. $this->error_msg = "该商品限制购买不能大于" . $presale_info[ "presale_num" ] . "件!";
  302. }
  303. //判断是否已存在订单
  304. $presale_order_count = model('promotion_presale_order')->getCount(
  305. [
  306. [ 'member_id', '=', $data[ 'member_id' ] ],
  307. [ 'presale_id', '=', $data[ 'presale_id' ] ],
  308. [ 'order_status', '>=', 0 ],
  309. [ 'refund_status', '=', 0 ]
  310. ]);
  311. if ($presale_order_count > 0) {
  312. $this->error = 1;
  313. $this->error_msg = "预售期间,同一商品只可购买一次!";
  314. }
  315. $data[ "presale_info" ] = $presale_info;
  316. //商品列表信息
  317. $shop_goods_list = $this->getOrderGoodsCalculate($data);
  318. $data[ 'shop_goods_list' ] = $shop_goods_list;
  319. $data[ 'shop_goods_list' ] = $this->shopOrderCalculate($shop_goods_list, $data);
  320. //定金金额
  321. $presale_deposit_money = $presale_info[ 'presale_deposit' ] * $data[ 'num' ];
  322. //余额抵扣(判断是否使用余额)
  323. if ($this->member_balance_money > 0) {
  324. if ($presale_deposit_money <= $this->member_balance_money) {
  325. $balance_money = $presale_deposit_money;
  326. } else {
  327. $balance_money = $this->member_balance_money;
  328. }
  329. } else {
  330. $balance_money = 0;
  331. }
  332. $pay_money = $presale_deposit_money - $balance_money;//计算出实际支付金额
  333. $this->pay_money += $pay_money;
  334. $this->member_balance_money -= $balance_money;//预减少账户余额
  335. $this->balance_money += $balance_money;//累计余额
  336. $order_money = $this->final_money + $presale_deposit_money;
  337. //总结计算
  338. $data[ 'delivery_money' ] = $this->delivery_money;
  339. $data[ 'coupon_money' ] = $this->coupon_money;
  340. $data[ 'adjust_money' ] = $this->adjust_money;
  341. $data[ 'invoice_money' ] = $this->invoice_money;
  342. $data[ 'invoice_delivery_money' ] = $this->invoice_delivery_money;
  343. $data[ 'promotion_money' ] = $this->promotion_money;
  344. $data[ 'presale_deposit_money' ] = $presale_deposit_money;
  345. $data[ 'order_money' ] = $order_money;
  346. $data[ 'balance_money' ] = $this->balance_money;
  347. $data[ 'pay_money' ] = $this->pay_money;
  348. $data[ 'goods_money' ] = $this->goods_money;
  349. $data[ 'goods_num' ] = $this->goods_num;
  350. $data[ 'is_virtual' ] = $this->is_virtual;
  351. $data[ 'final_money' ] = $this->final_money;
  352. $data[ 'presale_money' ] = $presale_info[ 'presale_price' ] * $data[ 'num' ];
  353. $data[ 'is_deposit_back' ] = $presale_info[ 'is_deposit_back' ];
  354. $data[ 'pay_end_time' ] = $presale_info[ 'pay_end_time' ];
  355. return $data;
  356. }
  357. /**
  358. * 待付款订单(定金)
  359. * @param unknown $data
  360. */
  361. public function depositOrderPayment($data)
  362. {
  363. $calculate_data = $this->depositCalculate($data);
  364. //优惠券
  365. $coupon_list = $this->getOrderCouponList($calculate_data);
  366. $calculate_data[ 'shop_goods_list' ][ "coupon_list" ] = $coupon_list;
  367. $express_type = [];
  368. if ($this->is_virtual == 0) {
  369. foreach ($calculate_data[ 'shop_goods_list' ][ 'deliver_sort' ] as $type) {
  370. // 物流
  371. if ($type == 'express' && $calculate_data[ 'shop_goods_list' ][ 'express_config' ][ 'is_use' ] == 1) {
  372. $title = $calculate_data[ 'shop_goods_list' ][ 'express_config' ][ 'value' ][ 'express_name' ];
  373. if ($title == '') {
  374. $title = Express::express_type[ 'express' ][ 'title' ];
  375. }
  376. $express_type[] = [ 'title' => $title, 'name' => 'express' ];
  377. }
  378. // 自提
  379. if ($type == 'store' && $calculate_data[ 'shop_goods_list' ][ 'store_config' ][ 'is_use' ] == 1) {
  380. //根据坐标查询门店
  381. $store_model = new Store();
  382. $store_condition = array (
  383. [ 'site_id', '=', $data[ 'site_id' ] ],
  384. [ 'is_pickup', '=', 1 ],
  385. [ 'status', '=', 1 ],
  386. [ 'is_frozen', '=', 0 ],
  387. );
  388. $latlng = array (
  389. 'lat' => $data[ 'latitude' ],
  390. 'lng' => $data[ 'longitude' ],
  391. );
  392. $store_list_result = $store_model->getLocationStoreList($store_condition, '*', $latlng);
  393. $store_list = $store_list_result[ 'data' ];
  394. $title = $calculate_data[ 'shop_goods_list' ][ 'store_config' ][ 'value' ][ 'store_name' ];
  395. if ($title == '') {
  396. $title = Express::express_type[ 'store' ][ 'title' ];
  397. }
  398. $express_type[] = [ 'title' => $title, 'name' => 'store', 'store_list' => $store_list ];
  399. }
  400. // 外卖
  401. if ($type == 'local' && $calculate_data[ 'shop_goods_list' ][ 'local_config' ][ 'is_use' ] == 1) {
  402. //查询本店的通讯地址
  403. $title = $calculate_data[ 'shop_goods_list' ][ 'local_config' ][ 'value' ][ 'local_name' ];
  404. if ($title == '') {
  405. $title = '外卖配送';
  406. }
  407. $store_model = new Store();
  408. $store_condition = array (
  409. [ 'site_id', '=', $data[ 'site_id' ] ],
  410. );
  411. if (addon_is_exit('store', $data[ 'site_id' ])) {
  412. $store_condition[] = [ 'is_o2o', '=', 1 ];
  413. $store_condition[] = [ 'status', '=', 1 ];
  414. $store_condition[] = [ 'is_frozen', '=', 0 ];
  415. } else {
  416. $store_condition[] = [ 'is_default', '=', 1 ];
  417. }
  418. $latlng = array (
  419. 'lat' => $data[ 'latitude' ],
  420. 'lng' => $data[ 'longitude' ],
  421. );
  422. $store_list_result = $store_model->getLocationStoreList($store_condition, '*', $latlng);
  423. $store_list = $store_list_result[ 'data' ];
  424. $express_type[] = [ 'title' => $title, 'name' => 'local', 'store_list' => $store_list ];
  425. }
  426. }
  427. }
  428. $calculate_data[ 'shop_goods_list' ][ "express_type" ] = $express_type;
  429. $payment_event_data = event('OrderPayment', $calculate_data);
  430. if (!empty($payment_event_data)) {
  431. $calculate_data = array_merge($calculate_data, ...$payment_event_data);
  432. }
  433. return $calculate_data;
  434. }
  435. /**
  436. * 获取商品的计算信息
  437. * @param unknown $data
  438. */
  439. public function getOrderGoodsCalculate($data)
  440. {
  441. $shop_goods = $this->getPresaleShopGoodsList($data);
  442. $shop_goods[ 'promotion_money' ] = 0;
  443. $shop_goods_list = $shop_goods;
  444. return $shop_goods_list;
  445. }
  446. /**
  447. * 获取立即购买商品信息
  448. * @param unknown $data
  449. * @return multitype:string number unknown mixed
  450. */
  451. public function getPresaleShopGoodsList($data)
  452. {
  453. $join = [
  454. [ 'site ns', 'ngs.site_id = ns.site_id', 'inner' ]
  455. ];
  456. $field = 'sku_id, sku_name, sku_no, price, discount_price,cost_price, stock, volume, weight, sku_image, ngs.site_id, goods_state, is_virtual, is_free_shipping, shipping_template,goods_class, goods_class_name, goods_id, ns.site_name,sku_spec_format,goods_name,max_buy,min_buy,support_trade_type';
  457. $sku_info = model('goods_sku')->getInfo([ [ 'sku_id', '=', $data[ 'sku_id' ] ], [ "ngs.site_id", "=", $data[ "site_id" ] ] ], $field, 'ngs', $join);
  458. if (empty($sku_info)) {
  459. return $this->error([], "不存在的商品!");
  460. }
  461. $price = $sku_info[ "price" ];
  462. $sku_info[ 'num' ] = $data[ 'num' ];
  463. $goods_money = $price * $data[ 'num' ];
  464. $sku_info[ 'price' ] = $price;
  465. $sku_info[ 'goods_money' ] = $goods_money;
  466. $sku_info[ 'real_goods_money' ] = $goods_money;
  467. $sku_info[ 'coupon_money' ] = 0; //优惠券金额
  468. $sku_info[ 'promotion_money' ] = 0; //优惠金额
  469. $sku_info[ 'stock' ] = numberFormat($sku_info[ 'stock' ]);
  470. $goods_list[] = $sku_info;
  471. $shop_goods = [
  472. 'goods_money' => $goods_money,
  473. 'site_id' => $sku_info[ 'site_id' ],
  474. 'site_name' => $sku_info[ 'site_name' ],
  475. 'goods_list_str' => $sku_info[ 'sku_id' ] . ':' . $sku_info[ 'num' ],
  476. 'goods_list' => $goods_list,
  477. 'order_name' => $sku_info[ "sku_name" ],
  478. 'goods_num' => $sku_info[ 'num' ],
  479. 'limit_purchase' => [
  480. 'goods_' . $sku_info[ 'goods_id' ] => [
  481. 'goods_id' => $sku_info[ 'goods_id' ],
  482. 'goods_name' => $sku_info[ "sku_name" ],
  483. 'num' => $sku_info[ 'num' ],
  484. 'max_buy' => $sku_info[ 'max_buy' ],
  485. 'min_buy' => $sku_info[ 'min_buy' ]
  486. ]
  487. ]
  488. ];
  489. if (isset($data[ 'delivery' ][ 'delivery_type' ]) && !empty($data[ 'delivery' ][ 'delivery_type' ]) && strpos($sku_info[ 'support_trade_type' ], $data[ 'delivery' ][ 'delivery_type' ]) === false) {
  490. $express_type_list = ( new \app\model\express\Config() )->getExpressTypeList($data[ 'site_id' ]);
  491. $delivery_type_name = $express_type_list[ $data[ 'delivery' ][ 'delivery_type' ] ] ?? '';
  492. $this->error = 1;
  493. $this->error_msg = '有商品不支持' . $delivery_type_name;
  494. }
  495. return $shop_goods;
  496. }
  497. /**
  498. * 库存变化
  499. * @return array
  500. */
  501. public function decStock($param)
  502. {
  503. $condition = array (
  504. [ 'site_id', '=', $param[ 'site_id' ] ],
  505. [ 'presale_id', '=', $param[ 'presale_id' ] ],
  506. [ 'sku_id', '=', $param[ 'sku_id' ] ]
  507. );
  508. $presale_info = model("promotion_presale_goods")->getInfo($condition, "presale_stock");
  509. if (empty($presale_info))
  510. return $this->error();
  511. if ($presale_info[ "presale_stock" ] <= 0)
  512. return $this->error('', "库存不足!");
  513. //编辑sku库存
  514. $res = model("promotion_presale_goods")->setDec($condition, "presale_stock", $param[ "num" ]);
  515. //减少总库存 2021.06.10
  516. // model("promotion_presale")->setDec(array(['site_id', '=', $param['site_id']],['presale_id', '=', $param['presale_id']],), "presale_stock", $param["num"]);
  517. if ($res === false)
  518. return $this->error();
  519. return $this->success($res);
  520. }
  521. /**
  522. * 获取店铺订单计算
  523. * @param unknown $site_id 店铺id
  524. * @param unknown $goods_money 商品总价
  525. * @param unknown $goods_list 店铺商品列表
  526. * @param unknown $data 传输生成订单数据
  527. */
  528. public function shopOrderCalculate($shop_goods, $data)
  529. {
  530. $site_id = $data[ 'site_id' ];
  531. //交易配置
  532. $config_model = new Config();
  533. $order_config_result = $config_model->getOrderEventTimeConfig($site_id);
  534. $order_config = $order_config_result[ "data" ];
  535. $shop_goods[ 'order_config' ] = $order_config[ 'value' ] ?? [];
  536. //定义计算金额
  537. $goods_money = $shop_goods[ 'goods_money' ]; //商品金额
  538. $delivery_money = 0; //配送费用
  539. $promotion_money = 0; //优惠费用(满减)
  540. $coupon_money = 0; //优惠券费用
  541. $adjust_money = 0; //调整金额
  542. $invoice_money = 0; //发票金额
  543. $final_money = 0; //尾款金额
  544. $balance_money = 0; //会员余额
  545. $pay_money = 0; //应付金额
  546. $order_money = 0; //订单金额
  547. //实际抵扣金额
  548. if ($data[ 'presale_info' ][ 'presale_price' ] == 0) {//全款预售
  549. $deduction_money = 0;
  550. } else {
  551. $deduction_money = $data[ 'presale_info' ][ 'presale_price' ] * $data[ 'num' ] - $data[ 'presale_info' ][ 'presale_deposit' ] * $data[ 'num' ];
  552. }
  553. //计算邮费
  554. if ($this->is_virtual == 1) {
  555. //虚拟订单 运费为0
  556. $delivery_money = 0;
  557. $shop_goods[ 'delivery' ][ 'delivery_type' ] = '';
  558. } else {
  559. $express_config_model = new ExpressConfig();
  560. $deliver_type = $express_config_model->getDeliverTypeSort($site_id)[ 'data' ];
  561. $shop_goods[ 'deliver_sort' ] = explode(',', $deliver_type[ 'value' ][ 'deliver_type' ]);
  562. //查询店铺是否开启快递配送
  563. $express_config_result = $express_config_model->getExpressConfig($site_id);
  564. $express_config = $express_config_result[ "data" ];
  565. $shop_goods[ "express_config" ] = $express_config;
  566. //查询店铺是否开启门店自提
  567. $store_config_result = $express_config_model->getStoreConfig($site_id);
  568. $store_config = $store_config_result[ "data" ];
  569. $shop_goods[ "store_config" ] = $store_config;
  570. //查询店铺是否开启外卖配送
  571. $local_config_result = $express_config_model->getLocalDeliveryConfig($site_id);
  572. $local_config = $local_config_result[ "data" ];
  573. $shop_goods[ "local_config" ] = $local_config;
  574. //如果本地配送开启, 则查询出本地配送的配置
  575. if ($shop_goods[ "local_config" ][ 'is_use' ] == 1 && isset($data[ 'delivery' ][ 'store_id' ])) {
  576. $local_model = new Local();
  577. $local_info_result = $local_model->getLocalInfo([ [ 'site_id', '=', $site_id ], [ 'store_id', '=', $data[ 'delivery' ][ 'store_id' ] ] ]);
  578. $local_info = $local_info_result[ 'data' ];
  579. $shop_goods[ "local_config" ][ 'info' ] = $local_info;
  580. } else {
  581. $shop_goods[ 'local_config' ][ 'info' ] = [];
  582. }
  583. $delivery_array = $data[ 'delivery' ] ?? [];
  584. $delivery_type = $delivery_array[ "delivery_type" ] ?? 'express';
  585. if ($delivery_type == "store") {
  586. if (isset($data[ 'delivery' ][ "delivery_type" ]) && $data[ 'delivery' ][ "delivery_type" ] == "store") {
  587. //门店自提
  588. $delivery_money = 0;
  589. $shop_goods[ 'delivery' ][ 'delivery_type' ] = 'store';
  590. if ($shop_goods[ "store_config" ][ "is_use" ] == 0) {
  591. $this->error = 1;
  592. $this->error_msg = "门店自提方式未开启!";
  593. }
  594. if (empty($data[ 'delivery' ][ "store_id" ])) {
  595. $this->error = 1;
  596. $this->error_msg = "门店未选择!";
  597. }
  598. $shop_goods[ 'delivery' ][ 'store_id' ] = $data[ 'delivery' ][ "store_id" ];
  599. $shop_goods[ 'buyer_ask_delivery_time' ] = $data[ 'buyer_ask_delivery_time' ];
  600. $shop_goods = $this->storeOrderData($shop_goods, $data);
  601. }
  602. } else {
  603. if (empty($data[ 'member_address' ])) {
  604. $delivery_money = 0;
  605. $shop_goods[ 'delivery' ][ 'delivery_type' ] = 'express';
  606. $this->error = 1;
  607. $this->error_msg = "未配置默认收货地址!";
  608. } else {
  609. if (!isset($data[ 'delivery' ][ "delivery_type" ]) || $data[ 'delivery' ][ "delivery_type" ] == "express") {
  610. if ($shop_goods[ "express_config" ][ "is_use" ] == 1) {
  611. //物流配送
  612. $express = new Express();
  613. $express_fee_result = $express->calculate($shop_goods, $data);
  614. if ($express_fee_result[ "code" ] < 0) {
  615. $this->error = 1;
  616. $this->error_msg = $express_fee_result[ "message" ];
  617. $delivery_fee = 0;
  618. } else {
  619. $delivery_fee = $express_fee_result[ 'data' ][ 'delivery_fee' ];
  620. }
  621. } else {
  622. $this->error = 1;
  623. $this->error_msg = "物流配送方式未开启!";
  624. $delivery_fee = 0;
  625. }
  626. $delivery_money = $delivery_fee;
  627. $shop_goods[ 'delivery' ][ 'delivery_type' ] = 'express';
  628. } else if ($data[ 'delivery' ][ "delivery_type" ] == "local") {
  629. //外卖配送
  630. $delivery_money = 0;
  631. $shop_goods[ 'delivery' ][ 'delivery_type' ] = 'local';
  632. if ($shop_goods[ "local_config" ][ "is_use" ] == 0) {
  633. $this->error = 1;
  634. $this->error_msg = "外卖配送方式未开启!";
  635. } else {
  636. if (empty($data[ 'delivery' ][ "store_id" ])) {
  637. $this->error = 1;
  638. $this->error_msg = "门店未选择!";
  639. }
  640. $local_delivery_time = 0;
  641. if (!empty($data[ 'buyer_ask_delivery_time' ])) {
  642. $local_delivery_time = $data[ 'buyer_ask_delivery_time' ];
  643. }
  644. $shop_goods[ 'buyer_ask_delivery_time' ] = $local_delivery_time;
  645. $local_model = new Local();
  646. $local_result = $local_model->calculate($shop_goods, $data);
  647. $shop_goods[ 'delivery' ][ 'start_money' ] = 0;
  648. if ($local_result[ 'code' ] < 0) {
  649. $this->error = $local_result[ 'data' ][ 'code' ];
  650. $this->error_msg = $local_result[ 'message' ];
  651. $shop_goods[ 'delivery' ][ 'start_money' ] = $local_result[ 'data' ][ 'start_money_array' ][ 0 ] ?? 0;
  652. } else {
  653. $delivery_money = $local_result[ 'data' ][ 'delivery_money' ];
  654. if (!empty($local_result[ 'data' ][ 'error_code' ])) {
  655. $this->error = $local_result[ 'data' ][ 'code' ];
  656. $this->error_msg = $local_result[ 'data' ][ 'error' ];
  657. }
  658. }
  659. $shop_goods[ 'delivery' ][ 'error' ] = $this->error;
  660. $shop_goods[ 'delivery' ][ 'error_msg' ] = $this->error_msg;
  661. }
  662. }
  663. }
  664. }
  665. }
  666. //尾款金额
  667. $final_money = $shop_goods[ 'goods_money' ] - $data[ 'presale_info' ][ 'presale_deposit' ] * $data[ 'num' ] - $promotion_money - $deduction_money + $delivery_money;
  668. $shop_goods[ 'order_money' ] = $order_money; //订单总金额
  669. //发票相关
  670. $shop_goods = $this->invoice($shop_goods, $data);
  671. $final_money = $final_money + $shop_goods[ 'invoice_money' ] + $shop_goods[ 'invoice_delivery_money' ];
  672. //理论上是多余的操作
  673. if ($final_money < 0) {
  674. $final_money = 0;
  675. }
  676. //总结计算
  677. $shop_goods[ 'goods_money' ] = $goods_money;
  678. $shop_goods[ 'delivery_money' ] = $delivery_money;
  679. $shop_goods[ 'adjust_money' ] = $adjust_money;
  680. $shop_goods[ 'promotion_money' ] = $promotion_money;
  681. $shop_goods[ 'final_money' ] = $final_money;
  682. $shop_goods[ 'balance_money' ] = $balance_money;
  683. $shop_goods[ 'pay_money' ] = $pay_money;
  684. $shop_goods[ 'order_money' ] = $order_money;
  685. $this->goods_money += $goods_money;
  686. $this->delivery_money += $delivery_money;
  687. $this->coupon_money += $coupon_money;
  688. $this->adjust_money += $adjust_money;
  689. $this->invoice_money += $shop_goods[ 'invoice_money' ];
  690. $this->invoice_delivery_money += $shop_goods[ 'invoice_delivery_money' ];
  691. $this->promotion_money += $promotion_money;
  692. $this->final_money += $final_money;
  693. $this->order_name = string_split($this->order_name, ",", $shop_goods[ "order_name" ]);
  694. //买家留言
  695. if (isset($data[ 'buyer_message' ]) && isset($data[ 'buyer_message' ])) {
  696. $item_buyer_message = $data[ 'buyer_message' ];
  697. $shop_goods[ "buyer_message" ] = $item_buyer_message;
  698. } else {
  699. $shop_goods[ "buyer_message" ] = '';
  700. }
  701. return $shop_goods;
  702. }
  703. /**
  704. * 获取立即购买商品信息
  705. * @param unknown $data
  706. * @return multitype:string number unknown mixed
  707. */
  708. public function getShopGoodsList($data)
  709. {
  710. $join = [
  711. [
  712. 'site ns',
  713. 'ngs.site_id = ns.site_id',
  714. 'inner'
  715. ]
  716. ];
  717. $field = 'sku_id, sku_name, sku_no, price, discount_price,cost_price, stock, volume, weight, sku_image, ngs.site_id, goods_state, is_virtual, is_free_shipping, shipping_template,goods_class, goods_class_name, goods_id, ns.site_name,sku_spec_format,goods_name,max_buy,min_buy';
  718. $sku_info = model('goods_sku')->getInfo([ [ 'sku_id', '=', $data[ 'sku_id' ] ], [ "ngs.site_id", "=", $data[ "site_id" ] ] ], $field, 'ngs', $join);
  719. if (empty($sku_info)) {
  720. return $this->error([], "不存在的商品!");
  721. }
  722. $price = $data[ "price" ];
  723. $sku_info[ 'num' ] = $data[ 'num' ];
  724. $goods_money = $price * $data[ 'num' ];
  725. $sku_info[ 'price' ] = $price;
  726. $sku_info[ 'goods_money' ] = $goods_money;
  727. $sku_info[ 'real_goods_money' ] = $goods_money;
  728. $sku_info[ 'coupon_money' ] = 0; //优惠券金额
  729. $sku_info[ 'promotion_money' ] = 0; //优惠金额
  730. $sku_info[ 'stock' ] = numberFormat($sku_info[ 'stock' ]);
  731. $goods_list[] = $sku_info;
  732. $shop_goods = [
  733. 'goods_money' => $goods_money,
  734. 'site_id' => $sku_info[ 'site_id' ],
  735. 'site_name' => $sku_info[ 'site_name' ],
  736. 'goods_list_str' => $sku_info[ 'sku_id' ] . ':' . $sku_info[ 'num' ],
  737. 'goods_list' => $goods_list,
  738. 'order_name' => $sku_info[ "sku_name" ],
  739. 'goods_num' => $sku_info[ 'num' ],
  740. 'limit_purchase' => [
  741. 'goods_' . $sku_info[ 'goods_id' ] => [
  742. 'goods_id' => $sku_info[ 'goods_id' ],
  743. 'goods_name' => $sku_info[ "sku_name" ],
  744. 'num' => $sku_info[ 'num' ],
  745. 'max_buy' => $sku_info[ 'max_buy' ],
  746. 'min_buy' => $sku_info[ 'min_buy' ]
  747. ]
  748. ]
  749. ];
  750. return $shop_goods;
  751. }
  752. /**
  753. * 添加门店关注记录和减少门店商品库存
  754. * @param $data
  755. * @return array
  756. */
  757. public function addStoreMemberAndDecStock($data)
  758. {
  759. if (!empty($data[ 'delivery_store_id' ])) {
  760. //添加店铺关注记录
  761. $shop_member_model = new StoreMemberModel();
  762. $res = $shop_member_model->addStoreMember($data[ 'delivery_store_id' ], $data[ 'member_id' ]);
  763. if ($res[ "code" ] < 0) {
  764. return $res;
  765. }
  766. $store_goods_sku_model = new StoreGoodsSku();
  767. $stock_result = $store_goods_sku_model->decStock([ "store_id" => $data[ "delivery_store_id" ], "sku_id" => $data[ "sku_id" ], "stock" => $data[ "num" ] ]);
  768. if ($stock_result[ "code" ] < 0) {
  769. return $this->error('', '当前门店库存不足,请选择其他门店');
  770. }
  771. }
  772. return $this->success();
  773. }
  774. /************************************************** 定金支付 end *********************************************************************/
  775. /************************************************** 尾款支付 start *********************************************************************/
  776. /**
  777. * 订单计算(尾款)
  778. * @param unknown $data
  779. */
  780. public function finalCalculate($data)
  781. {
  782. $data = $this->initMemberAccount($data);//初始化会员账户
  783. //余额付款
  784. if ($data[ 'is_balance' ] > 0) {
  785. $this->member_balance_money = $data[ "member_account" ][ "balance_total" ] ?? 0;
  786. }
  787. //查询预售订单信息
  788. $presale_order_model = new PresaleOrder();
  789. $order_info_result = $presale_order_model->getPresaleOrderInfo([ [ "id", "=", $data[ "id" ] ], [ 'site_id', '=', $data[ 'site_id' ] ] ]);
  790. $order_info = $order_info_result[ "data" ];
  791. $data[ "order_info" ] = $order_info;
  792. //判断是否可以支付尾款
  793. if ($order_info[ "pay_start_time" ] > time()) {
  794. $this->error = 1;
  795. $this->error_msg = "尾款支付时间还未开始!";
  796. }
  797. if ($order_info[ "pay_end_time" ] < time()) {
  798. $this->error = 1;
  799. $this->error_msg = "尾款支付时间已过,已停止支付!";
  800. }
  801. //尾款总金额(尾款实际金额 + 发票 + 物流等)
  802. $order_money = $order_info[ 'final_money' ];
  803. //余额抵扣(判断是否使用余额)
  804. if ($this->member_balance_money > 0) {
  805. if ($order_money <= $this->member_balance_money) {
  806. $balance_money = $order_money;
  807. } else {
  808. $balance_money = $this->member_balance_money;
  809. }
  810. } else {
  811. $balance_money = 0;
  812. }
  813. $pay_money = $order_money - $balance_money;//计算出实际支付金额
  814. $this->member_balance_money -= $balance_money;//预减少账户余额
  815. $this->balance_money += $balance_money;//累计余额
  816. $is_use = 1;
  817. $this->pay_money += $pay_money;
  818. //总结计算
  819. $data[ 'balance_final_money' ] = $this->balance_money;
  820. $data[ 'pay_final_money' ] = $this->pay_money;
  821. $data[ 'is_use_balance' ] = $is_use;
  822. $data[ 'balance_money' ] = $this->balance_money;
  823. return $data;
  824. }
  825. /**
  826. * 尾款支付
  827. * @param $data
  828. * @return array
  829. */
  830. public function payfinalMoneyPresaleOrder($data)
  831. {
  832. //查询出会员相关信息
  833. $calculate_data = $this->finalCalculate($data);
  834. if (isset($calculate_data[ 'code' ]) && $calculate_data[ 'code' ] < 0)
  835. return $calculate_data;
  836. if ($this->error > 0) {
  837. return $this->error([ 'error_code' => $this->error ], $this->error_msg);
  838. }
  839. $pay = new Pay();
  840. $out_trade_no = $pay->createOutTradeNo();
  841. $order_data = [
  842. 'balance_final_money' => $calculate_data[ 'balance_final_money' ],
  843. 'pay_final_money' => $calculate_data[ 'pay_final_money' ],
  844. 'final_out_trade_no' => $out_trade_no,
  845. ];
  846. model('promotion_presale_order')->startTrans();
  847. try {
  848. model('promotion_presale_order')->update($order_data, [ [ 'site_id', '=', $data[ 'site_id' ] ], [ 'id', '=', $data[ 'id' ] ] ]);
  849. //扣除余额(统一扣除)
  850. if ($calculate_data[ 'is_use_balance' ] == 1) {
  851. if ($calculate_data[ "balance_final_money" ] > 0) {
  852. $calculate_data[ 'order_id' ] = $data[ 'id' ];
  853. $this->pay_type = "BALANCE";
  854. $balance_result = $this->useBalance($calculate_data, $data[ 'site_id' ], 'presale_order');
  855. if ($balance_result[ "code" ] < 0) {
  856. model("promotion_presale_order")->rollback();
  857. return $balance_result;
  858. }
  859. }
  860. }
  861. $order_name = $calculate_data[ 'order_info' ][ 'sku_name' ];
  862. //生成整体支付单据
  863. $pay->addPay($data[ 'site_id' ], $out_trade_no, $this->pay_type, $order_name, $order_name, $this->pay_money, '', 'FinalOrderPayNotify', '');
  864. model('promotion_presale_order')->commit();
  865. return $this->success($out_trade_no);
  866. } catch (\Exception $e) {
  867. model()->rollback();
  868. return $this->error('', $e->getMessage() . $e->getFile() . $e->getLine());
  869. }
  870. }
  871. /************************************************** 尾款支付 end *********************************************************************/
  872. }