ReplacebuyOrderCreate.php 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750
  1. <?php
  2. /**
  3. * Niushop商城系统 - 团队十年电商经验汇集巨献!
  4. * =========================================================
  5. * Copy right 2019-2029 上海牛之云网络科技有限公司, 保留所有权利。
  6. * ----------------------------------------------
  7. * 官方网址: https://www.niushop.com
  8. * =========================================================
  9. */
  10. namespace addon\replacebuy\model;
  11. use addon\coupon\model\Coupon;
  12. use app\model\express\Config as ExpressConfig;
  13. use app\model\express\Express;
  14. use app\model\goods\Goods;
  15. use app\model\goods\GoodsStock;
  16. use app\model\member\Member;
  17. use app\model\member\MemberAccount;
  18. use app\model\order\OrderCommon;
  19. use app\model\order\OrderCreate;
  20. use app\model\store\Store;
  21. use app\model\system\Pay;
  22. use think\facade\Cache;
  23. use app\model\order\Config;
  24. use app\model\express\Local;
  25. use app\model\member\MemberAddress;
  26. use app\model\system\User;
  27. /**
  28. * 订单创建
  29. * @author Administrator
  30. */
  31. class ReplacebuyOrderCreate extends OrderCreate
  32. {
  33. private $goods_money = 0;//商品金额
  34. private $balance_money = 0;//余额
  35. private $delivery_money = 0;//配送费用
  36. private $coupon_money = 0;//优惠券金额
  37. private $adjust_money = 0;//调整金额
  38. private $invoice_money = 0;//发票费用
  39. private $promotion_money = 0;//优惠金额
  40. private $order_money = 0;//订单金额
  41. private $pay_money = 0;//支付总价
  42. private $is_virtual = 0; //是否是虚拟类订单
  43. private $order_name = ''; //订单详情
  44. private $goods_num = 0; //商品种数
  45. private $member_balance_money = 0;//会员账户余额(计算过程中会逐次减少)
  46. private $pay_type = 'ONLINE_PAY';//支付方式
  47. private $invoice_delivery_money = 0;
  48. private $error = 0; //是否有错误
  49. private $error_msg = ''; //错误描述
  50. /**
  51. * 订单创建
  52. * @param unknown $data
  53. */
  54. public function create($data)
  55. {
  56. //查询出会员相关信息
  57. $calculate_data = $this->calculate($data);
  58. if (isset($calculate_data['code']) && $calculate_data['code'] < 0)
  59. return $calculate_data;
  60. if ($this->error > 0) {
  61. return $this->error(['error_code' => $this->error], $this->error_msg);
  62. }
  63. if(!empty($calculate_data['invoice_type'])){
  64. if($calculate_data['invoice_type'] == 1 && $calculate_data['invoice_full_address'] == ""){
  65. //物流,同城
  66. if($calculate_data[ 'shop_goods_list' ]['delivery']['delivery_type'] == "express" || $calculate_data[ 'shop_goods_list' ]['delivery']['delivery_type'] == "local"){
  67. $calculate_data['invoice_full_address'] = $calculate_data['member_address']['full_address'].$calculate_data['member_address']['address'];
  68. $calculate_data[ 'shop_goods_list' ]['invoice_full_address'] = $calculate_data['member_address']['full_address'].$calculate_data['member_address']['address'];
  69. }
  70. //门店
  71. if($calculate_data[ 'shop_goods_list' ]['delivery']['delivery_type'] == "store"){
  72. $delivery_store_info = json_decode($calculate_data[ 'shop_goods_list' ]['delivery_store_info'], true);
  73. $calculate_data['invoice_full_address'] = $delivery_store_info['full_address'];
  74. $calculate_data[ 'shop_goods_list' ]['invoice_full_address'] = $delivery_store_info['full_address'];
  75. }
  76. }
  77. }
  78. $pay = new Pay();
  79. $out_trade_no = $pay->createOutTradeNo($data['member_id']);
  80. model("order")->startTrans();
  81. //循环生成多个订单
  82. try {
  83. $pay_money = 0;
  84. $goods_stock_model = new GoodsStock();
  85. $shop_goods_list = $calculate_data['shop_goods_list'];
  86. $item_delivery = $shop_goods_list['delivery'] ?? [];
  87. $delivery_type = $item_delivery['delivery_type'] ?? '';
  88. $delivery_type_name = Express::express_type[$delivery_type]["title"] ?? '';
  89. //订单主表
  90. $order_type = $this->orderType($shop_goods_list, $calculate_data);
  91. $order_no = $this->createOrderNo($shop_goods_list['site_id'], $data['member_id']);
  92. $data_order = [
  93. 'order_no' => $order_no,
  94. 'site_id' => $shop_goods_list['site_id'],
  95. 'site_name' => $shop_goods_list['site_name'],
  96. 'order_from' => $data['order_from'],
  97. 'order_from_name' => $data['order_from_name'],
  98. 'order_type' => $order_type['order_type_id'],
  99. 'order_type_name' => $order_type['order_type_name'],
  100. 'order_status_name' => $order_type['order_status']['name'],
  101. 'order_status_action' => json_encode($order_type['order_status'], JSON_UNESCAPED_UNICODE),
  102. 'out_trade_no' => $out_trade_no,
  103. 'member_id' => $data['member_id'],
  104. 'name' => $calculate_data['member_address']['name'] ?? '',
  105. 'mobile' => $calculate_data['member_address']['mobile'] ?? '',
  106. 'telephone' => $calculate_data['member_address']['telephone'] ?? '',
  107. 'province_id' => $calculate_data['member_address']['province_id'] ?? '',
  108. 'city_id' => $calculate_data['member_address']['city_id'] ?? '',
  109. 'district_id' => $calculate_data['member_address']['district_id'] ?? '',
  110. 'community_id' => $calculate_data['member_address']['community_id'] ?? '',
  111. 'address' => $calculate_data['member_address']['address'] ?? '',
  112. 'full_address' => $calculate_data['member_address']['full_address'] ?? '',
  113. 'longitude' => $calculate_data['member_address']['longitude'] ?? '',
  114. 'latitude' => $calculate_data['member_address']['latitude'] ?? '',
  115. 'buyer_ip' => request()->ip(),
  116. 'goods_money' => $shop_goods_list['goods_money'],
  117. 'delivery_money' => $shop_goods_list['delivery_money'],
  118. 'coupon_id' => isset($shop_goods_list['coupon_id']) ? $shop_goods_list['coupon_id'] : 0,
  119. 'coupon_money' => $shop_goods_list['coupon_money'] ?? 0,
  120. 'adjust_money' => $shop_goods_list['adjust_money'],
  121. 'invoice_money' => $shop_goods_list['invoice_money'],
  122. 'promotion_money' => $shop_goods_list['promotion_money'],
  123. 'order_money' => $shop_goods_list['order_money'],
  124. 'balance_money' => $shop_goods_list['balance_money'],
  125. 'pay_money' => $shop_goods_list['pay_money'],
  126. 'create_time' => time(),
  127. 'is_enable_refund' => 0,
  128. 'order_name' => $shop_goods_list["order_name"],
  129. 'goods_num' => $shop_goods_list['goods_num'],
  130. 'delivery_type' => $delivery_type,
  131. 'delivery_type_name' => $delivery_type_name,
  132. 'delivery_store_id' => $calculate_data["delivery_store_id"] ?? 0,
  133. "delivery_store_name" => $calculate_data["delivery_store_name"] ?? '',
  134. "delivery_store_info" => $calculate_data["delivery_store_info"] ?? '',
  135. "buyer_message" => $data["buyer_message"],
  136. "promotion_type" => "replacebuy",
  137. "promotion_type_name" => "代客下单",
  138. "promotion_status_name" => "",
  139. "invoice_delivery_money" => $shop_goods_list["invoice_delivery_money"] ?? 0,
  140. "taxpayer_number" => $shop_goods_list["taxpayer_number"] ?? '',
  141. "invoice_rate" => $shop_goods_list["invoice_rate"] ?? 0,
  142. "invoice_content" => $shop_goods_list["invoice_content"] ?? '',
  143. "invoice_full_address" => $shop_goods_list["invoice_full_address"] ?? '',
  144. "is_invoice" => $shop_goods_list["is_invoice"] ?? 0,
  145. "invoice_type" => $shop_goods_list["invoice_type"] ?? 0,
  146. "invoice_title" => $shop_goods_list["invoice_title"] ?? '',
  147. 'is_tax_invoice' => $shop_goods_list["is_tax_invoice"] ?? '',
  148. 'invoice_email' => $shop_goods_list["invoice_email"] ?? '',
  149. 'invoice_title_type' => $shop_goods_list["invoice_email"] ?? 0,
  150. ];
  151. $order_id = model("order")->add($data_order);
  152. $pay_money += $shop_goods_list['pay_money'];
  153. //订单项目表
  154. foreach ($shop_goods_list['goods_list'] as $k_order_goods => $order_goods) {
  155. $data_order_goods = array(
  156. 'order_id' => $order_id,
  157. 'site_id' => $shop_goods_list['site_id'],
  158. 'order_no' => $order_no,
  159. 'member_id' => $data['member_id'],
  160. 'sku_id' => $order_goods['sku_id'],
  161. 'sku_name' => $order_goods['sku_name'],
  162. 'sku_image' => $order_goods['sku_image'],
  163. 'sku_no' => $order_goods['sku_no'],
  164. 'is_virtual' => $order_goods['is_virtual'],
  165. 'goods_class' => $order_goods['goods_class'],
  166. 'goods_class_name' => $order_goods['goods_class_name'],
  167. 'price' => $order_goods['discount_price'],
  168. 'cost_price' => $order_goods['cost_price'],
  169. 'num' => $order_goods['num'],
  170. 'goods_money' => $order_goods['discount_price'] * $order_goods['num'],
  171. 'cost_money' => $order_goods['cost_price'] * $order_goods['num'],
  172. 'goods_id' => $order_goods['goods_id'],
  173. 'delivery_status' => 0,
  174. 'delivery_status_name' => "未发货",
  175. "real_goods_money" => $order_goods["real_goods_money"],
  176. 'coupon_money' => $order_goods["coupon_money"] ?? 0,
  177. 'promotion_money' => $order_goods["promotion_money"],
  178. 'goods_name' => $order_goods['goods_name'],
  179. 'sku_spec_format' => $order_goods['sku_spec_format'],
  180. );
  181. model("order_goods")->add($data_order_goods);
  182. //库存变化
  183. $stock_result = $goods_stock_model->decStock(["sku_id" => $order_goods['sku_id'], "num" => $order_goods['num']]);
  184. if ($stock_result["code"] != 0) {
  185. model("order")->rollback();
  186. return $stock_result;
  187. }
  188. }
  189. $result_list = event("OrderCreate", ['order_id' => $order_id,'site_id'=>$shop_goods_list['site_id']]);
  190. if (!empty($result_list)) {
  191. foreach ($result_list as $k => $v) {
  192. if (!empty($v) && $v["code"] < 0) {
  193. model("order")->rollback();
  194. return $v;
  195. }
  196. }
  197. }
  198. $config_model = new Config();
  199. $balance_config = $config_model->getBalanceConfig($shop_goods_list['site_id']);
  200. //扣除余额(统一扣除)
  201. if ($calculate_data["balance_money"] > 0 && $balance_config[ 'data' ][ 'value' ][ 'balance_show' ] == 1) {
  202. $calculate_data['order_id'] = $order_id;
  203. $balance_result = $this->storeUseBalance($calculate_data);
  204. if ($balance_result["code"] < 0) {
  205. model("order")->rollback();
  206. return $balance_result;
  207. }
  208. }
  209. //优惠券
  210. if ($data_order['coupon_id'] > 0 && $data_order['coupon_money'] > 0) {
  211. //优惠券处理方案
  212. $member_coupon_model = new Coupon();
  213. $coupon_use_result = $member_coupon_model->useCoupon($data_order['coupon_id'], $data['member_id'], $order_id);//使用优惠券
  214. if ($coupon_use_result['code'] < 0) {
  215. model("order")->rollback();
  216. return $this->error('', "COUPON_ERROR");
  217. }
  218. }
  219. //记录订单日志 start
  220. $order_common_model = new OrderCommon();
  221. //获取用户信息
  222. $member_info = model('member')->getInfo(['member_id'=>$data['member_id']],'nickname');
  223. $user_info = (new User)->userInfo($data['app_module'], $shop_goods_list['site_id']);
  224. $log_data = [
  225. 'order_id' => $order_id,
  226. 'action' => '商家通过【代客下单】创建订单,管理员账号:'.$user_info['username'],
  227. 'uid' => $data[ 'member_id' ],
  228. 'nick_name' => $member_info['nickname'],
  229. 'action_way' => 2,
  230. 'order_status' => 0,
  231. 'order_status_name' => $order_type[ 'order_status' ][ 'name' ]
  232. ];
  233. $order_common_model->addOrderLog($log_data);
  234. //生成整体支付单据
  235. $pay->addPay($data['site_id'], $out_trade_no, $this->pay_type, $this->order_name, $this->order_name, $this->pay_money, '', 'OrderPayNotify', '');
  236. $this->addOrderCronClose($order_id, $data['site_id']);//增加关闭订单自动事件
  237. Cache::tag("order_create_cash_" . $data['member_id'])->clear();
  238. model("order")->commit();
  239. //记录订单日志 end
  240. return $this->success($out_trade_no);
  241. } catch (\Exception $e) {
  242. model("order")->rollback();
  243. return $this->error('', $e->getMessage());
  244. }
  245. }
  246. /**
  247. * 订单计算
  248. * @param unknown $data
  249. */
  250. public function calculate($data)
  251. {
  252. $data = $this->initMemberAddressInfo($data);
  253. $data = $this->initMemberAccount($data);//初始化会员账户
  254. //余额付款
  255. if ($data['is_balance'] > 0) {
  256. $this->member_balance_money = $data["member_account"]["balance_total"] ?? 0;
  257. }
  258. //商品列表信息
  259. $shop_goods_list = $this->getOrderGoodsCalculate($data);
  260. $data['shop_goods_list'] = $this->shopOrderCalculate($shop_goods_list, $data);
  261. //总结计算
  262. $data['delivery_money'] = sprintf("%.2f",$this->delivery_money);
  263. $data['coupon_money'] = $this->coupon_money;
  264. $data['adjust_money'] = $this->adjust_money;
  265. $data['invoice_money'] = $this->invoice_money;
  266. $data['invoice_delivery_money'] = $this->invoice_delivery_money;
  267. $data['promotion_money'] = $this->promotion_money;
  268. $data['order_money'] = $this->order_money;
  269. $data['balance_money'] = $this->balance_money;
  270. $data['pay_money'] = sprintf("%.2f",$this->pay_money);
  271. $data['goods_money'] = sprintf("%.2f",$this->goods_money);
  272. $data['goods_num'] = $this->goods_num;
  273. $data['is_virtual'] = $this->is_virtual;
  274. return $data;
  275. }
  276. /**
  277. * 待付款订单
  278. * @param unknown $data
  279. */
  280. public function orderPayment($data)
  281. {
  282. $calculate_data = $this->calculate($data);
  283. if (isset($calculate_data['code']) && $calculate_data['code'] < 0)
  284. return $calculate_data;
  285. //1、查询会员优惠券
  286. $coupon_list = $this->getOrderCouponList($calculate_data);
  287. $calculate_data['shop_goods_list']["coupon_list"] = $coupon_list;
  288. $express_type = [];
  289. $calculate_data['shop_goods_list']["express_type"] = $express_type;
  290. return $this->success($calculate_data);
  291. }
  292. /**
  293. * 获取商品的计算信息
  294. * @param unknown $data
  295. */
  296. public function getOrderGoodsCalculate($data)
  297. {
  298. $shop_goods_list = [];
  299. //通过秒杀id查询 商品数据
  300. // $cache = Cache::get("order_create_store_".$data['id'].'_'.$data['num'].'_'.$data['member_id']);
  301. // if(!empty($cache))
  302. // {
  303. // return $cache;
  304. // }
  305. $goods_list = $this->getStoreGoodsList($data["sku_ids"], $data['nums'], $data['member_id'], $data['site_id']);
  306. $goods_list['promotion_money'] = 0;
  307. $shop_goods_list = $goods_list;
  308. //满减优惠
  309. $shop_goods_list = $this->manjianPromotion($shop_goods_list);
  310. // Cache::tag("order_create_store_".$data['member_id'])->set("order_create_seckill_".$data['id'].'_'.$data['num'].'_'.$data['member_id'], $shop_goods_list, 600);
  311. return $shop_goods_list;
  312. }
  313. /**
  314. * 获取秒杀商品列表信息
  315. * @param unknown $bl_id
  316. */
  317. public function getStoreGoodsList($sku_ids, $nums, $member_id, $site_id)
  318. {
  319. $goods_model = new Goods();
  320. //组装商品列表
  321. $prefix = config('database.connections.mysql.prefix');
  322. $field = 'sku_name, sku_id,sku_no,
  323. price, discount_price, cost_price, stock, weight, volume, sku_image,
  324. site_id, goods_state, is_virtual,
  325. is_free_shipping, shipping_template, goods_class, goods_class_name, goods_id,sku_spec_format,goods_name,
  326. (SELECT site_name FROM '.$prefix.'site ns WHERE site_id = ns.site_id) as site_name';
  327. $goods_list = model("goods_sku")->getList([['sku_id', 'in', $sku_ids], ['site_id', '=', $site_id]], $field);
  328. // $shop_goods_list = [];
  329. if (!empty($goods_list)) {
  330. foreach ($goods_list as $k => $v) {
  331. $num = $nums[$v["sku_id"]] ?? 0;
  332. $v["num"] = $num;
  333. $site_id = $v['site_id'];
  334. $price_result = $goods_model->getGoodsPrice($v['sku_id'], $member_id);
  335. $price_info = $price_result["data"];
  336. $price = $price_info["price"];
  337. $v['price'] = $price;
  338. $v['goods_money'] = $price * $v['num'];
  339. $v['real_goods_money'] = $v['goods_money'];
  340. $v['coupon_money'] = 0;//优惠券金额
  341. $v['promotion_money'] = 0;//优惠金额
  342. if (isset($shop_goods_list)) {
  343. $shop_goods_list['goods_list'][] = $v;
  344. $shop_goods_list['order_name'] = string_split($shop_goods_list['order_name'], ",", $v['sku_name']);
  345. $shop_goods_list['goods_num'] += $num;
  346. $shop_goods_list['goods_money'] += $v['goods_money'];
  347. $shop_goods_list['goods_list_str'] = $shop_goods_list['goods_list_str'] . ';' . $v['sku_id'] . ':' . $num;
  348. } else {
  349. // $shop_goods_list['site_id'] = $site_id;
  350. $shop_goods_list['site_id'] = $v['site_id'];
  351. $shop_goods_list['site_name'] = $v['site_name'];
  352. $shop_goods_list['goods_money'] = $v['goods_money'];
  353. $shop_goods_list['goods_list_str'] = $v['sku_id'] . ':' . $num;
  354. $shop_goods_list['order_name'] = string_split("", ",", $v['sku_name']);
  355. $shop_goods_list['goods_num'] = $num;
  356. $shop_goods_list['goods_list'][] = $v;
  357. }
  358. }
  359. }
  360. return $shop_goods_list;
  361. }
  362. /**
  363. * 获取店铺订单计算
  364. * @param unknown $site_id 店铺id
  365. * @param unknown $goods_money 商品总价
  366. * @param unknown $goods_list 店铺商品列表
  367. * @param unknown $data 传输生成订单数据
  368. */
  369. public function shopOrderCalculate($shop_goods, $data)
  370. {
  371. $site_id = $data[ 'site_id' ];
  372. //交易配置
  373. $config_model = new Config();
  374. $order_config_result = $config_model->getOrderEventTimeConfig($site_id);
  375. $order_config = $order_config_result[ "data" ];
  376. $shop_goods[ 'order_config' ] = $order_config[ 'value' ] ?? [];
  377. //定义计算金额
  378. $goods_money = $shop_goods[ 'goods_money' ]; //商品金额
  379. $delivery_money = 0; //配送费用
  380. $promotion_money = $shop_goods[ 'promotion_money' ]; //优惠费用(满减)
  381. $coupon_money = 0; //优惠券费用
  382. $adjust_money = 0; //调整金额
  383. $invoice_money = 0; //发票金额
  384. $order_money = 0; //订单金额
  385. $balance_money = 0; //会员余额
  386. $pay_money = 0; //应付金额
  387. //计算邮费
  388. if ($this->is_virtual == 1) {
  389. //虚拟订单 运费为0
  390. $delivery_money = 0;
  391. $shop_goods[ 'delivery' ][ 'delivery_type' ] = '';
  392. } else {
  393. $express_config_model = new ExpressConfig();
  394. $deliver_type = $express_config_model->getDeliverTypeSort($site_id);
  395. $deliver_type = $deliver_type[ "data" ];
  396. $shop_goods[ "deliver_sort" ] = explode(',', $deliver_type['value']['deliver_type']);
  397. //查询店铺是否开启快递配送
  398. $express_config_result = $express_config_model->getExpressConfig($site_id);
  399. $express_config = $express_config_result[ "data" ];
  400. $shop_goods[ "express_config" ] = $express_config;
  401. //查询店铺是否开启门店自提
  402. $store_config_result = $express_config_model->getStoreConfig($site_id);
  403. $store_config = $store_config_result[ "data" ];
  404. $shop_goods[ "store_config" ] = $store_config;
  405. //查询店铺是否开启外卖配送
  406. $local_config_result = $express_config_model->getLocalDeliveryConfig($site_id);
  407. $local_config = $local_config_result[ "data" ];
  408. $shop_goods[ "local_config" ] = $local_config;
  409. //如果本地配送开启, 则查询出本地配送的配置
  410. if ($shop_goods[ "local_config" ][ 'is_use' ] == 1) {
  411. $local_model = new Local();
  412. $local_info_result = $local_model->getLocalInfo([ [ 'site_id', '=', $site_id ] ]);
  413. $local_info = $local_info_result[ 'data' ];
  414. $shop_goods[ "local_config" ][ 'info' ] = $local_info;
  415. }
  416. $delivery_array = $data[ 'delivery' ] ?? [];
  417. $delivery_type = $delivery_array[ "delivery_type" ] ?? 'express';
  418. if ($delivery_type == "store") {
  419. if (isset($data[ 'delivery' ][ "delivery_type" ]) && $data[ 'delivery' ][ "delivery_type" ] == "store") {
  420. //门店自提
  421. $delivery_money = 0;
  422. $shop_goods[ 'delivery' ][ 'delivery_type' ] = 'store';
  423. if ($shop_goods[ "store_config" ][ "is_use" ] == 0) {
  424. $this->error = 1;
  425. $this->error_msg = "门店自提方式未开启!";
  426. }
  427. if (empty($data[ 'delivery' ][ "store_id" ])) {
  428. $this->error = 1;
  429. $this->error_msg = "门店未选择!";
  430. }
  431. $shop_goods[ 'delivery' ][ 'store_id' ] = $data[ 'delivery' ][ "store_id" ];
  432. $shop_goods[ 'buyer_ask_delivery_time' ] = $data[ 'buyer_ask_delivery_time' ];
  433. $shop_goods = $this->storeOrderData($shop_goods, $data);
  434. }
  435. } else {
  436. if (empty($data[ 'member_address' ])) {
  437. $delivery_money = 0;
  438. $shop_goods[ 'delivery' ][ 'delivery_type' ] = 'express';
  439. $this->error = 1;
  440. $this->error_msg = "未配置默认收货地址!";
  441. } else {
  442. if (!isset($data[ 'delivery' ][ "delivery_type" ]) || $data[ 'delivery' ][ "delivery_type" ] == "express") {
  443. if ($shop_goods[ "express_config" ][ "is_use" ] == 1) {
  444. //物流配送
  445. $express = new Express();
  446. $express_fee_result = $express->calculate($shop_goods, $data);
  447. if ($express_fee_result[ "code" ] < 0) {
  448. $this->error = 1;
  449. $this->error_msg = $express_fee_result[ "message" ];
  450. $delivery_fee = 0;
  451. } else {
  452. $delivery_fee = $express_fee_result[ 'data' ][ 'delivery_fee' ];
  453. }
  454. } else {
  455. $this->error = 1;
  456. $this->error_msg = "物流配送方式未开启!";
  457. $delivery_fee = 0;
  458. }
  459. $delivery_money = $delivery_fee;
  460. $shop_goods[ 'delivery' ][ 'delivery_type' ] = 'express';
  461. } else if ($data[ 'delivery' ][ "delivery_type" ] == "local") {
  462. //外卖配送
  463. $delivery_money = 0;
  464. $shop_goods[ 'delivery' ][ 'delivery_type' ] = 'local';
  465. if ($shop_goods[ "local_config" ][ "is_use" ] == 0) {
  466. $this->error = 1;
  467. $this->error_msg = "外卖配送方式未开启!";
  468. } else {
  469. $local_delivery_time = 0;
  470. if (!empty($data[ 'buyer_ask_delivery_time' ])) {
  471. //$buyer_ask_delivery_time_temp = explode(':', $data['buyer_ask_delivery_time']);
  472. //$local_delivery_time = $buyer_ask_delivery_time_temp[0] * 3600 + $buyer_ask_delivery_time_temp[1] * 60;
  473. $local_delivery_time = $data[ 'buyer_ask_delivery_time' ];
  474. }
  475. $shop_goods[ 'buyer_ask_delivery_time' ] = $local_delivery_time;
  476. $local_model = new Local();
  477. $local_result = $local_model->calculate($shop_goods, $data);
  478. if ($local_result[ 'code' ] < 0) {
  479. $this->error = $local_result[ 'data' ][ 'code' ];
  480. $this->error_msg = $local_result[ 'message' ];
  481. } else {
  482. $delivery_money = $local_result[ 'data' ][ 'delivery_money' ];
  483. if (!empty($local_result[ 'data' ][ 'error_code' ])) {
  484. $this->error = $local_result[ 'data' ][ 'code' ];
  485. $this->error_msg = $local_result[ 'data' ][ 'error' ];
  486. }
  487. }
  488. }
  489. }
  490. }
  491. }
  492. }
  493. //满额包邮插件
  494. $shop_goods = $this->freeShippingCalculate($shop_goods, $data);
  495. //会员等级包邮权益
  496. $shop_goods = $this->memberLevelCalculate($shop_goods, $data);
  497. //是否符合免邮
  498. $is_free_delivery = $shop_goods[ 'is_free_delivery' ] ?? false;
  499. if ($is_free_delivery) {
  500. $delivery_money = 0;
  501. }
  502. $shop_goods[ 'delivery_money' ] = $delivery_money;
  503. $order_money = $shop_goods[ 'goods_money' ] + $delivery_money - $promotion_money;
  504. $shop_goods[ 'order_money' ] = $order_money; //订单总金额
  505. //优惠券活动(采用站点id:coupon_id)
  506. $shop_goods = $this->couponPromotion($shop_goods, $data);
  507. $coupon_money = $shop_goods[ 'coupon_money' ] ?? 0;
  508. $order_money = $shop_goods[ 'order_money' ];
  509. // 积分抵现
  510. $shop_goods[ 'max_usable_point' ] = 0;
  511. $point_money = 0;
  512. if ($data[ 'member_account' ][ 'point' ] > 0 && addon_is_exit('pointcash', $data[ 'site_id' ])) {
  513. $shop_goods = $this->getMaxUsablePoint($shop_goods, $data);
  514. $point_money = $shop_goods[ 'point_money' ] ?? 0;
  515. $order_money = $shop_goods[ 'order_money' ];
  516. }
  517. //发票相关
  518. $shop_goods = $this->invoice($shop_goods, $data);
  519. // 会员卡开卡金额
  520. $member_card_money = $this->calculateMemberCardMoney($data);
  521. $order_money = $order_money + $shop_goods[ 'invoice_money' ] + $shop_goods[ 'invoice_delivery_money' ] + $member_card_money;
  522. //理论上是多余的操作
  523. if ($order_money < 0) {
  524. $order_money = 0;
  525. }
  526. //余额抵扣(判断是否使用余额)
  527. if ($this->member_balance_money > 0) {
  528. $temp_order_money = $order_money;
  529. if ($temp_order_money <= $this->member_balance_money) {
  530. $balance_money = $temp_order_money;
  531. } else {
  532. $balance_money = $this->member_balance_money;
  533. }
  534. } else {
  535. $balance_money = 0;
  536. }
  537. $pay_money = $order_money - $balance_money; //计算出实际支付金额
  538. //判断是否存在支付金额为0的订单
  539. $this->member_balance_money -= $balance_money; //预减少账户余额
  540. $this->balance_money += $balance_money; //累计余额
  541. //总结计算
  542. $shop_goods[ 'goods_money' ] = $goods_money;
  543. $shop_goods[ 'delivery_money' ] = $delivery_money;
  544. $shop_goods[ 'adjust_money' ] = $adjust_money;
  545. // $shop_goods['invoice_money'] = $invoice_money;
  546. $shop_goods[ 'promotion_money' ] = $promotion_money;
  547. $shop_goods[ 'order_money' ] = $order_money;
  548. $shop_goods[ 'balance_money' ] = $balance_money;
  549. $shop_goods[ 'pay_money' ] = $pay_money;
  550. $this->goods_money += $goods_money;
  551. $this->delivery_money += $delivery_money;
  552. $this->coupon_money += $coupon_money;
  553. $this->adjust_money += $adjust_money;
  554. $this->invoice_money += $shop_goods[ 'invoice_money' ];
  555. $this->invoice_delivery_money += $shop_goods[ 'invoice_delivery_money' ];
  556. $this->promotion_money += $promotion_money;
  557. $this->order_money += $order_money;
  558. $this->pay_money += $pay_money;
  559. $this->goods_num += $shop_goods[ "goods_num" ];
  560. $this->order_name = string_split($this->order_name, ",", $shop_goods[ "order_name" ]);
  561. return $shop_goods;
  562. }
  563. /**
  564. * 补齐门店数据
  565. * @param $data
  566. */
  567. public function storeInfo($data)
  568. {
  569. $delivery_store_id = $data["store_id"] ?? 0;//门店id
  570. if ($delivery_store_id > 0) {
  571. $store_model = new Store();
  572. $condition = array(
  573. ["store_id", "=", $delivery_store_id],
  574. );
  575. $store_info_result = $store_model->getStoreInfo($condition);
  576. $store_info = $store_info_result["data"] ?? [];
  577. if (empty($store_info)) {
  578. $this->error = 1;
  579. $this->error_msg = "当前门店不存在或未开启!";
  580. } else {
  581. $data['site_id'] = $store_info['site_id'];
  582. $data["delivery_store_id"] = $delivery_store_id;
  583. $delivery_store_name = $store_info_result["data"]["store_name"];
  584. $data["delivery_store_name"] = $delivery_store_name;
  585. $delivery_store_info = array(
  586. "open_date" => $store_info["open_date"],
  587. "full_address" => $store_info["full_address"] . $store_info["address"],
  588. "longitude" => $store_info["longitude"],
  589. "latitude" => $store_info["latitude"],
  590. "telphone" => $store_info["telphone"],
  591. "store_image" => $store_info["store_image"],
  592. );
  593. $data["delivery_store_info"] = json_encode($delivery_store_info, JSON_UNESCAPED_UNICODE);
  594. $data["member_address"] = array(
  595. 'name' => '门店收银',
  596. 'mobile' => '',
  597. 'telephone' => '',
  598. 'province_id' => $store_info['province_id'],
  599. 'city_id' => $store_info['city_id'],
  600. 'district_id' => $store_info['district_id'],
  601. 'community_id' => $store_info['community_id'],
  602. 'address' => $store_info['address'],
  603. 'full_address' => str_replace(",", "-", $store_info['full_address']),
  604. 'longitude' => $store_info['longitude'],
  605. 'latitude' => $store_info['latitude'],
  606. );
  607. }
  608. } else {
  609. $this->error = 1;
  610. $this->error_msg = "配送门店不可为空!";
  611. }
  612. return $data;
  613. }
  614. /**
  615. * 使用余额
  616. * @param $order_data
  617. * @return array
  618. */
  619. public function storeUseBalance($data)
  620. {
  621. $this->pay_type = "BALANCE";
  622. $balance_money = $data["member_account"]["balance_money"];//不可提现余额
  623. $balance = $data["member_account"]["balance"];//可提现余额
  624. $member_account_model = new MemberAccount();
  625. $surplus_banance = $data["balance_money"];
  626. //优先扣除不可提现余额
  627. if ($balance > 0) {
  628. if ($balance >= $surplus_banance) {
  629. $real_balance = $surplus_banance;
  630. } else {
  631. $real_balance = $balance;
  632. }
  633. $result = $member_account_model->addMemberAccount($data['site_id'], $data["member_id"], "balance", -$real_balance, "order", $data['order_id'], "订单余额抵扣,扣除不可提现余额:" . $real_balance);
  634. $surplus_banance -= $real_balance;
  635. }
  636. if ($surplus_banance > 0) {
  637. $result = $member_account_model->addMemberAccount($data['site_id'], $data["member_id"], "balance_money", -$surplus_banance, "order", $data['order_id'], "订单余额抵扣,扣除可提现余额:" . $surplus_banance);
  638. }
  639. return $result;
  640. }
  641. /**
  642. * 初始化收货地址
  643. * @param unknown $data
  644. */
  645. public function initMemberAddressInfo($data)
  646. {
  647. $delivery_type = $data[ 'delivery' ][ "delivery_type" ] ?? '';
  648. if (empty($data[ 'member_address' ])) {
  649. $member_address = new MemberAddress();
  650. $type = 1;
  651. if ($delivery_type == 'local') {
  652. $type = 2;
  653. }
  654. $address = $member_address->getMemberAddressInfo([ [ 'id', '=', $data[ 'address_id' ] ], [ 'type', '=', $type ], [ 'member_id', '=', $data['member_id'] ] ]);
  655. // $address = $member_address->getMemberAddressInfo([ [ 'member_id', '=', $data[ 'member_id' ] ], [ 'is_default', '=', 1 ], [ 'type', '=', $type ] ]);
  656. $data[ 'member_address' ] = $address[ 'data' ];
  657. }
  658. if (!empty($data[ 'member_address' ])) {
  659. if ($delivery_type == 'local') {
  660. //外卖订单 如果收货地址没有定位的话,就不取用地址
  661. $type = $data[ 'member_address' ][ 'type' ] ?? 1;
  662. if ($type == 1) {
  663. $data[ 'member_address' ] = '';
  664. }
  665. }
  666. }
  667. return $data;
  668. }
  669. }