GiftcardOrderCreate.php 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584
  1. <?php
  2. /**
  3. * Niushop商城系统 - 团队十年电商经验汇集巨献!
  4. * =========================================================
  5. * Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
  6. * ----------------------------------------------
  7. * 官方网址: https://www.niushop.com
  8. * =========================================================
  9. */
  10. namespace addon\giftcard\model;
  11. use addon\store\model\StoreGoodsSku;
  12. use app\model\goods\Goods;
  13. use app\model\order\OrderCreate;
  14. use app\model\goods\GoodsStock;
  15. use app\model\store\Store;
  16. use think\facade\Cache;
  17. use app\model\express\Express;
  18. use app\model\system\Pay;
  19. use app\model\express\Config as ExpressConfig;
  20. use app\model\order\Config;
  21. use app\model\express\Local;
  22. /**
  23. * 订单创建(礼品卡)
  24. * @author Administrator
  25. */
  26. class GiftcardOrderCreate extends OrderCreate
  27. {
  28. private $goods_money = 0;//商品金额
  29. private $balance_money = 0;//余额
  30. private $delivery_money = 0;//配送费用
  31. private $adjust_money = 0;//调整金额
  32. private $order_money = 0;//订单金额
  33. private $pay_money = 0;//支付总价
  34. private $invoice_money = 0; //发票费用
  35. private $is_virtual = 0; //是否是虚拟类订单
  36. private $order_name = ''; //订单详情
  37. private $goods_num = 0; //商品种数
  38. private $member_balance_money = 0;//会员账户余额(计算过程中会逐次减少)
  39. private $pay_type = 'ONLINE_PAY';//支付方式
  40. private $error = 0; //是否有错误
  41. private $error_msg = ''; //错误描述
  42. /**
  43. * 订单创建
  44. * @param unknown $data
  45. */
  46. public function create($data)
  47. {
  48. //查询出会员相关信息
  49. $calculate_data = $this->calculate($data);
  50. if (isset($calculate_data[ 'code' ]) && $calculate_data[ 'code' ] < 0)
  51. return $calculate_data;
  52. if ($this->error > 0) {
  53. return $this->error([ 'error_code' => $this->error ], $this->error_msg);
  54. }
  55. if(!empty($calculate_data['invoice_type'])){
  56. if($calculate_data['invoice_type'] == 1 && $calculate_data['invoice_full_address'] == ""){
  57. //物流,同城
  58. if($calculate_data[ 'shop_goods_list' ]['delivery']['delivery_type'] == "express" || $calculate_data[ 'shop_goods_list' ]['delivery']['delivery_type'] == "local"){
  59. $calculate_data['invoice_full_address'] = $calculate_data['member_address']['full_address'].$calculate_data['member_address']['address'];
  60. $calculate_data[ 'shop_goods_list' ]['invoice_full_address'] = $calculate_data['member_address']['full_address'].$calculate_data['member_address']['address'];
  61. }
  62. //门店
  63. if($calculate_data[ 'shop_goods_list' ]['delivery']['delivery_type'] == "store"){
  64. $delivery_store_info = json_decode($calculate_data[ 'shop_goods_list' ]['delivery_store_info'], true);
  65. $calculate_data['invoice_full_address'] = $delivery_store_info['full_address'];
  66. $calculate_data[ 'shop_goods_list' ]['invoice_full_address'] = $delivery_store_info['full_address'];
  67. }
  68. }
  69. }
  70. $pay = new Pay();
  71. $out_trade_no = $pay->createOutTradeNo($data['member_id']);
  72. model("order")->startTrans();
  73. //循环生成多个订单
  74. try {
  75. $pay_money = 0;
  76. $goods_stock_model = new GoodsStock();
  77. $shop_goods_list = $calculate_data[ 'shop_goods_list' ];
  78. $item_delivery = $shop_goods_list[ 'delivery' ] ?? [];
  79. $delivery_type = $item_delivery[ 'delivery_type' ] ?? '';
  80. $site_id = $data['site_id'];
  81. $express_type_list = (new \app\model\express\Config())->getExpressTypeList($site_id);
  82. $delivery_type_name = $express_type_list[$delivery_type] ?? '';
  83. //订单主表
  84. $order_type = $this->orderType($shop_goods_list, $calculate_data);
  85. $order_no = $this->createOrderNo($shop_goods_list[ 'site_id' ], $data['member_id']);
  86. $data_order = [
  87. 'order_no' => $order_no,
  88. 'site_id' => $shop_goods_list[ 'site_id' ],
  89. 'site_name' => $shop_goods_list[ 'site_name' ],
  90. 'order_from' => $data[ 'order_from' ],
  91. 'order_from_name' => $data[ 'order_from_name' ],
  92. 'order_type' => $order_type[ 'order_type_id' ],
  93. 'order_type_name' => $order_type[ 'order_type_name' ],
  94. 'order_status_name' => $order_type[ 'order_status' ][ 'name' ],
  95. 'order_status_action' => json_encode($order_type[ 'order_status' ], JSON_UNESCAPED_UNICODE),
  96. 'out_trade_no' => $out_trade_no,
  97. 'member_id' => $data[ 'member_id' ],
  98. 'name' => $calculate_data[ 'member_address' ][ 'name' ] ?? '',
  99. 'mobile' => $calculate_data[ 'member_address' ][ 'mobile' ] ?? '',
  100. 'telephone' => $calculate_data[ 'member_address' ][ 'telephone' ] ?? '',
  101. 'province_id' => $calculate_data[ 'member_address' ][ 'province_id' ] ?? '',
  102. 'city_id' => $calculate_data[ 'member_address' ][ 'city_id' ] ?? '',
  103. 'district_id' => $calculate_data[ 'member_address' ][ 'district_id' ] ?? '',
  104. 'community_id' => $calculate_data[ 'member_address' ][ 'community_id' ] ?? '',
  105. 'address' => $calculate_data[ 'member_address' ][ 'address' ] ?? '',
  106. 'full_address' => $calculate_data[ 'member_address' ][ 'full_address' ] ?? '',
  107. 'longitude' => $calculate_data[ 'member_address' ][ 'longitude' ] ?? '',
  108. 'latitude' => $calculate_data[ 'member_address' ][ 'latitude' ] ?? '',
  109. 'buyer_ip' => request()->ip(),
  110. 'goods_money' => $shop_goods_list[ 'goods_money' ],
  111. 'delivery_money' => $shop_goods_list[ 'delivery_money' ],
  112. 'coupon_id' => isset($shop_goods_list[ 'coupon_id' ]) ? $shop_goods_list[ 'coupon_id' ] : 0,
  113. 'coupon_money' => $shop_goods_list[ 'coupon_money' ] ?? 0,
  114. 'adjust_money' => $shop_goods_list[ 'adjust_money' ],
  115. 'invoice_money' => $this->invoice_money,
  116. 'promotion_money' => $shop_goods_list[ 'promotion_money' ],
  117. 'order_money' => $shop_goods_list[ 'order_money' ],
  118. 'balance_money' => $this->balance_money,
  119. 'pay_money' => $shop_goods_list[ 'pay_money' ],
  120. 'create_time' => time(),
  121. 'is_enable_refund' => 0,
  122. 'order_name' => $shop_goods_list[ "order_name" ],
  123. 'goods_num' => $shop_goods_list[ 'goods_num' ],
  124. 'delivery_type' => $delivery_type,
  125. 'delivery_type_name' => $delivery_type_name,
  126. 'delivery_store_id' => $shop_goods_list[ "delivery_store_id" ] ?? 0,
  127. "delivery_store_name" => $shop_goods_list[ "delivery_store_name" ] ?? '',
  128. "delivery_store_info" => $shop_goods_list[ "delivery_store_info" ] ?? '',
  129. "buyer_message" => $data[ "buyer_message" ],
  130. "promotion_type" => "giftcard",
  131. "promotion_type_name" => "礼品卡",
  132. "promotion_status_name" => "",
  133. "invoice_delivery_money" => $shop_goods_list[ "invoice_delivery_money" ] ?? 0,
  134. "taxpayer_number" => $shop_goods_list[ "taxpayer_number" ] ?? '',
  135. "invoice_rate" => $shop_goods_list[ "invoice_rate" ] ?? 0,
  136. "invoice_content" => $shop_goods_list[ "invoice_content" ] ?? '',
  137. "invoice_full_address" => $shop_goods_list[ "invoice_full_address" ] ?? '',
  138. "is_invoice" => $shop_goods_list[ "is_invoice" ] ?? 0,
  139. "invoice_type" => $shop_goods_list[ "invoice_type" ] ?? 0,
  140. "invoice_title" => $shop_goods_list[ "invoice_title" ] ?? '',
  141. 'is_tax_invoice' => $shop_goods_list[ "is_tax_invoice" ] ?? '',
  142. 'invoice_email' => $shop_goods_list[ "invoice_email" ] ?? '',
  143. 'invoice_title_type' => $shop_goods_list[ "invoice_title_type" ] ?? 0,
  144. 'buyer_ask_delivery_time' => $shop_goods_list[ 'buyer_ask_delivery_time' ] ?? '',
  145. ];
  146. $order_id = model("order")->add($data_order);
  147. //订单项目表
  148. foreach ($shop_goods_list[ 'goods_list' ] as $k_order_goods => $order_goods) {
  149. $data_order_goods = array (
  150. 'order_id' => $order_id,
  151. 'site_id' => $shop_goods_list[ 'site_id' ],
  152. 'order_no' => $order_no,
  153. 'member_id' => $data[ 'member_id' ],
  154. 'sku_id' => $order_goods[ 'sku_id' ],
  155. 'sku_name' => $order_goods[ 'sku_name' ],
  156. 'sku_image' => $order_goods[ 'sku_image' ],
  157. 'sku_no' => $order_goods[ 'sku_no' ],
  158. 'is_virtual' => $order_goods[ 'is_virtual' ],
  159. 'goods_class' => $order_goods[ 'goods_class' ],
  160. 'goods_class_name' => $order_goods[ 'goods_class_name' ],
  161. 'price' => $order_goods[ 'price' ],
  162. 'cost_price' => $order_goods[ 'cost_price' ],
  163. 'num' => $order_goods[ 'num' ],
  164. 'goods_money' => $order_goods[ 'goods_money' ],
  165. 'cost_money' => $order_goods[ 'cost_price' ] * $order_goods[ 'num' ],
  166. 'goods_id' => $order_goods[ 'goods_id' ],
  167. 'delivery_status' => 0,
  168. 'delivery_status_name' => "未发货",
  169. "real_goods_money" => $order_goods[ "real_goods_money" ],
  170. 'coupon_money' => $order_goods[ "coupon_money" ] ?? 0,
  171. 'promotion_money' => $order_goods[ "promotion_money" ],
  172. 'goods_name' => $order_goods[ 'goods_name' ],
  173. 'sku_spec_format' => $order_goods[ 'sku_spec_format' ],
  174. );
  175. $res = model("order_goods")->add($data_order_goods);
  176. //库存变化
  177. $stock_result = $goods_stock_model->decStock([ "sku_id" => $order_goods[ 'sku_id' ], "num" => $order_goods[ 'num' ] ]);
  178. if ($stock_result[ "code" ] != 0) {
  179. model("order")->rollback();
  180. return $stock_result;
  181. }
  182. }
  183. //生成整体支付单据
  184. $pay->addPay($shop_goods_list[ 'site_id' ], $out_trade_no, $this->pay_type, $this->order_name, $this->order_name, $this->pay_money, '', 'GiftOrderPayNotify', '');
  185. $this->addOrderCronClose($order_id, $shop_goods_list[ 'site_id' ]);//增加关闭订单自动事件
  186. Cache::tag("order_create_giftcard_" . $data[ 'member_id' ])->clear();
  187. model("order")->commit();
  188. return $this->success($out_trade_no);
  189. } catch (\Exception $e) {
  190. model("order")->rollback();
  191. return $this->error('', $e->getMessage());
  192. }
  193. }
  194. public function verifyAreaOrStock($data){
  195. //查询出会员相关信息
  196. $calculate_data = $this->calculate($data);
  197. if (isset($calculate_data[ 'code' ]) && $calculate_data[ 'code' ] < 0)
  198. return $calculate_data;
  199. if ($this->error > 0) {
  200. return $this->error([ 'error_code' => $this->error ], $this->error_msg);
  201. }
  202. if(!empty($data['delivery']['delivery_type']) && $data['delivery']['delivery_type'] == 'store') {
  203. if (!empty($data['cart_ids'])) {
  204. //商品列表信息
  205. $shop_goods_list = $this->getOrderGoodsCalculate($data);
  206. } else {
  207. //商品列表信息
  208. $shop_goods_list = $this->getOrderGoodsCalculate($data);
  209. }
  210. $goods_lists = $shop_goods_list['goods_list'];
  211. $store_goods_sku_model = new StoreGoodsSku();
  212. if(addon_is_exit('store')){
  213. foreach ($goods_lists as $k => $v) {
  214. $condition = array(
  215. ['store_id', '=', $data['delivery']['store_id']],
  216. ['sku_id', '=', $v['sku_id']]
  217. );
  218. $store_sku_info = model("store_goods_sku")->getInfo($condition, 'id, goods_id, store_stock');
  219. if (empty($store_sku_info)) {
  220. return $store_goods_sku_model->error(['error_code'=>11], '当前门店库存不足,请选择其他门店');
  221. }
  222. if (($store_sku_info['store_stock'] - $v['num']) < 0) {
  223. return $store_goods_sku_model->error(['error_code'=>11], '当前门店库存不足,请选择其他门店');
  224. }
  225. }
  226. }
  227. }
  228. return $this->success(1);
  229. }
  230. /**
  231. * 订单计算
  232. * @param unknown $data
  233. */
  234. public function calculate($data)
  235. {
  236. $data = $this->initMemberAddress($data);
  237. $data = $this->initMemberAccount($data);//初始化会员账户
  238. //商品列表信息
  239. $shop_goods_list = $this->getOrderGoodsCalculate($data);
  240. $data[ 'shop_goods_list' ] = $this->shopOrderCalculate($shop_goods_list, $data);
  241. //总结计算
  242. $data[ 'delivery_money' ] = $this->delivery_money;
  243. $data[ 'adjust_money' ] = $this->adjust_money;
  244. $data[ 'order_money' ] = $this->order_money;
  245. $data[ 'balance_money' ] = $this->balance_money;
  246. $data[ 'pay_money' ] = $this->pay_money;
  247. $data['invoice_money'] = $this->invoice_money;
  248. $data[ 'goods_money' ] = $this->goods_money;
  249. $data[ 'goods_num' ] = $this->goods_num;
  250. $data[ 'is_virtual' ] = $this->is_virtual;
  251. return $data;
  252. }
  253. /**
  254. * 待付款订单
  255. * @param unknown $data
  256. */
  257. public function orderPayment($data)
  258. {
  259. $calculate_data = $this->calculate($data);
  260. $shop_goods_list = $calculate_data[ 'shop_goods_list' ];
  261. $calculate_data[ 'shop_goods_list' ][ "coupon_list" ] = [];
  262. $express_type = [];
  263. if ($this->is_virtual == 0) {
  264. foreach ($calculate_data[ 'shop_goods_list' ]['deliver_sort'] as $type) {
  265. // 物流
  266. if ($type == 'express' && $calculate_data[ 'shop_goods_list' ][ "express_config" ][ "is_use" ] == 1) {
  267. $title = $calculate_data[ 'shop_goods_list' ][ "express_config" ]['value']['express_name'];
  268. if($title == ""){
  269. $title = Express::express_type[ "express" ][ "title" ];
  270. }
  271. $express_type[] = [ "title" => $title, "name" => "express" ];
  272. }
  273. // 自提
  274. if ($type == 'store' && $calculate_data[ 'shop_goods_list' ][ "store_config" ][ "is_use" ] == 1) {
  275. //根据坐标查询门店
  276. $store_model = new Store();
  277. $store_condition = array (
  278. [ 'site_id', '=', $data[ 'site_id' ] ],
  279. [ 'is_pickup', '=', 1 ],
  280. [ 'status', '=', 1 ],
  281. [ 'is_frozen', '=', 0 ],
  282. );
  283. $latlng = array (
  284. 'lat' => $data[ 'latitude' ],
  285. 'lng' => $data[ 'longitude' ],
  286. );
  287. $store_list_result = $store_model->getLocationStoreList($store_condition, '*', $latlng);
  288. $store_list = $store_list_result[ "data" ];
  289. //如果用户默认选中了门店
  290. $store_id = 0;
  291. if ($data[ 'default_store_id' ] > 0) {
  292. if (!empty($store_list)) {
  293. $store_array = array_column($store_list, 'store_id');
  294. if (in_array($data[ 'default_store_id' ], $store_array)) {
  295. $store_id = $data[ 'default_store_id' ];
  296. } else {
  297. $store_condition = array (
  298. [ 'site_id', '=', $data[ 'site_id' ] ],
  299. [ 'is_pickup', '=', 1 ],
  300. [ 'status', '=', 1 ],
  301. [ 'is_frozen', '=', 0 ],
  302. [ 'store_id', '=', $data[ 'default_store_id' ] ],
  303. );
  304. $store_info_result = $store_model->getStoreInfo($store_condition, '*');
  305. $store_info = $store_info_result[ 'data' ];
  306. if (!empty($store_info)) {
  307. $store_id = $data[ 'default_store_id' ];
  308. $store_list[] = $store_info;
  309. }
  310. }
  311. }
  312. }
  313. $title = $calculate_data[ 'shop_goods_list' ][ "store_config" ]['value']['store_name'];
  314. if($title == ""){
  315. $title = Express::express_type[ "store" ][ "title" ];
  316. }
  317. $express_type[] = [ "title" => $title, "name" => "store", "store_list" => $store_list, 'store_id' => $store_id ];
  318. }
  319. // 外卖
  320. if ($type == 'local' && $calculate_data[ 'shop_goods_list' ][ "local_config" ][ "is_use" ] == 1) {
  321. //查询本店的通讯地址
  322. $title = $calculate_data[ 'shop_goods_list' ][ "local_config" ]['value']['local_name'];
  323. if($title == ""){
  324. $title = '外卖配送';
  325. }
  326. $express_type[] = [ "title" => $title, "name" => "local" ];
  327. }
  328. }
  329. }
  330. $calculate_data[ 'shop_goods_list' ][ "express_type" ] = $express_type;
  331. $payment_event_data = event('OrderPayment', $data);
  332. if (!empty($payment_event_data)) {
  333. $calculate_data = array_merge($calculate_data, ...$payment_event_data);
  334. }
  335. return $calculate_data;
  336. }
  337. /**
  338. * 获取商品信息
  339. * @param unknown $data
  340. */
  341. public function getOrderGoodsCalculate($data)
  342. {
  343. $goods_list = $this->getOrderGoodsGiftcard($data[ 'giftcard_id' ], $data[ 'sku_id' ], $data[ "site_id" ],$data);
  344. $goods_list[ 'promotion_money' ] = 0;
  345. $shop_goods_list = $goods_list;
  346. return $shop_goods_list;
  347. }
  348. /**
  349. * 获取礼品卡商品列表
  350. * @param unknown $data
  351. * @return multitype:string number unknown mixed
  352. */
  353. public function getOrderGoodsGiftcard($giftcard_id, $sku_id, $site_id, $data){
  354. $goods_model = new Goods();
  355. //组装商品列表
  356. $field = ' ngc.site_id, ngc.sku_id, ngc.num, ngc.giftcard_id, ngs.is_limit, ngs.limit_type, ngs.sku_name, ngs.sku_no,
  357. ngs.price, ngs.discount_price, ngs.cost_price, ngs.stock, ngs.weight, ngs.volume, ngs.sku_image,
  358. ngs.site_id, ngs.goods_state, ngs.is_virtual, ngs.shipping_template, ngs.goods_class, ngs.goods_class_name, ngs.goods_id,ns.site_name,ngs.sku_spec_format,ngs.goods_name,ngs.max_buy,ngs.min_buy,ngs.introduction';
  359. $alias = 'ngc';
  360. $join = [
  361. [
  362. 'goods_sku ngs',
  363. 'ngc.sku_id = ngs.sku_id',
  364. 'inner'
  365. ],
  366. [
  367. 'site ns',
  368. 'ngc.site_id = ns.site_id',
  369. 'inner'
  370. ]
  371. ];
  372. $goods_list = model("goods_giftcard")->getList([ [ 'ngc.sku_id', 'in', $sku_id ], [ 'giftcard_id', '=', $giftcard_id ] ], $field, '', $alias, $join);
  373. $shop_goods_list = [];
  374. $goods_money = 0;
  375. if (!empty($goods_list)) {
  376. foreach ($goods_list as $k => $v) {
  377. if ($v[ "site_id" ] != $site_id) {
  378. return $this->error([], "不存在的站点!");
  379. }
  380. $price_result = $goods_model->getGoodsPrice($v[ 'sku_id' ], $data['member_id']);
  381. $price_info = $price_result[ "data" ];
  382. $price = $price_info[ "price" ];
  383. $v[ 'price' ] = $price;
  384. $v[ 'goods_money' ] = $price * $v[ 'num' ];
  385. $v[ 'real_goods_money' ] = $v[ 'goods_money' ];
  386. $v[ 'is_free_shipping' ] = 1; //卡券赠送所有商品包邮
  387. $v[ 'coupon_money' ] = 0; //优惠券金额
  388. $v[ 'promotion_money' ] = 0; //优惠金额
  389. $shop_goods_list[ 'site_id' ] = $site_id;
  390. $shop_goods_list[ 'site_name' ] = $v[ 'site_name' ];
  391. $shop_goods_list[ 'is_giftcard' ] = 0;
  392. $goods_money += $v[ 'goods_money' ];
  393. $shop_goods_list[ 'goods_list_str' ] = $v[ 'sku_id' ] . ':' . $v[ 'num' ];
  394. $shop_goods_list[ 'order_name' ] = string_split("", ",", $v[ 'sku_name' ]);
  395. $shop_goods_list[ 'goods_num' ] = $v[ 'num' ];
  396. $shop_goods_list[ 'goods_list' ][] = $v;
  397. // 商品限购处理
  398. $shop_goods_list[ 'limit_purchase' ][ 'goods_' . $v[ 'goods_id' ] ] = [
  399. 'goods_id' => $v[ 'goods_id' ],
  400. 'goods_name' => $v[ 'sku_name' ],
  401. 'num' => $v[ 'num' ],
  402. 'is_limit' => $v[ 'is_limit' ],
  403. 'limit_type' => $v[ 'limit_type' ],
  404. 'max_buy' => $v[ 'max_buy' ],
  405. 'min_buy' => $v[ 'min_buy' ]
  406. ];
  407. }
  408. $shop_goods_list[ 'goods_money' ] = $goods_money;
  409. }
  410. return $shop_goods_list;
  411. }
  412. /**
  413. * 获取店铺订单计算
  414. * @param unknown $site_id 店铺id
  415. * @param unknown $goods_money 商品总价
  416. * @param unknown $goods_list 店铺商品列表
  417. * @param unknown $data 传输生成订单数据
  418. */
  419. public function shopOrderCalculate($shop_goods, $data)
  420. {
  421. $site_id = $data[ 'site_id' ];
  422. //交易配置
  423. $config_model = new Config();
  424. $order_config_result = $config_model->getOrderEventTimeConfig($site_id);
  425. $order_config = $order_config_result[ "data" ];
  426. $shop_goods[ 'order_config' ] = $order_config[ 'value' ] ?? [];
  427. //定义计算金额
  428. $goods_money = $shop_goods[ 'goods_money' ]; //商品金额
  429. $delivery_money = 0; //配送费用
  430. $adjust_money = 0; //调整金额
  431. $order_money = 0; //订单金额
  432. $balance_money = 0; //会员余额
  433. $pay_money = 0; //应付金额
  434. //计算邮费
  435. $express_config_model = new ExpressConfig();
  436. $deliver_type = $express_config_model->getDeliverTypeSort($site_id);
  437. $deliver_type = $deliver_type[ "data" ];
  438. $shop_goods[ "deliver_sort" ] = explode(',', $deliver_type['value']['deliver_type']);
  439. //查询店铺是否开启快递配送
  440. $express_config_result = $express_config_model->getExpressConfig($site_id);
  441. $express_config = $express_config_result[ "data" ];
  442. $shop_goods[ "express_config" ] = $express_config;
  443. //查询店铺是否开启门店自提
  444. $store_config_result = $express_config_model->getStoreConfig($site_id);
  445. $store_config = $store_config_result[ "data" ];
  446. $shop_goods[ "store_config" ] = $store_config;
  447. //查询店铺是否开启外卖配送
  448. $local_config_result = $express_config_model->getLocalDeliveryConfig($site_id);
  449. $local_config = $local_config_result[ "data" ];
  450. $shop_goods[ "local_config" ] = $local_config;
  451. //如果本地配送开启, 则查询出本地配送的配置
  452. if ($shop_goods[ "local_config" ][ 'is_use' ] == 1) {
  453. $local_model = new Local();
  454. $local_info_result = $local_model->getLocalInfo([ [ 'site_id', '=', $site_id ] ]);
  455. $local_info = $local_info_result[ 'data' ];
  456. $shop_goods[ "local_config" ][ 'info' ] = $local_info;
  457. }
  458. $delivery_array = $data[ 'delivery' ] ?? [];
  459. $delivery_type = $delivery_array[ "delivery_type" ] ?? 'express';
  460. if ($delivery_type == "store") {
  461. if (isset($data[ 'delivery' ][ "delivery_type" ]) && $data[ 'delivery' ][ "delivery_type" ] == "store") {
  462. //门店自提
  463. $shop_goods[ 'delivery' ][ 'delivery_type' ] = 'store';
  464. if ($shop_goods[ "store_config" ][ "is_use" ] == 0) {
  465. $this->error = 1;
  466. $this->error_msg = "门店自提方式未开启!";
  467. }
  468. if (empty($data[ 'delivery' ][ "store_id" ])) {
  469. $this->error = 1;
  470. $this->error_msg = "门店未选择!";
  471. }
  472. $shop_goods[ 'delivery' ][ 'store_id' ] = $data[ 'delivery' ][ "store_id" ];
  473. $shop_goods[ 'buyer_ask_delivery_time' ] = $data[ 'buyer_ask_delivery_time' ];
  474. $shop_goods = $this->storeOrderData($shop_goods, $data);
  475. }
  476. } else {
  477. if (empty($data[ 'member_address' ])) {
  478. $shop_goods[ 'delivery' ][ 'delivery_type' ] = 'express';
  479. $this->error = 1;
  480. $this->error_msg = "未配置默认收货地址!";
  481. } else {
  482. if (!isset($data[ 'delivery' ][ "delivery_type" ]) || $data[ 'delivery' ][ "delivery_type" ] == "express") {
  483. if ($shop_goods[ "express_config" ][ "is_use" ] == 1) {
  484. //物流配送
  485. $express = new Express();
  486. $express_fee_result = $express->calculate($shop_goods, $data);
  487. if ($express_fee_result[ "code" ] < 0) {
  488. $this->error = 1;
  489. $this->error_msg = $express_fee_result[ "message" ];
  490. $delivery_fee = 0;
  491. } else {
  492. $delivery_fee = $express_fee_result[ 'data' ][ 'delivery_fee' ];
  493. }
  494. } else {
  495. $this->error = 1;
  496. $this->error_msg = "物流配送方式未开启!";
  497. $delivery_fee = 0;
  498. }
  499. $shop_goods[ 'delivery' ][ 'delivery_type' ] = 'express';
  500. } else if ($data[ 'delivery' ][ "delivery_type" ] == "local") {
  501. $shop_goods[ 'delivery' ][ 'delivery_type' ] = 'local';
  502. if ($shop_goods[ "local_config" ][ "is_use" ] == 0) {
  503. $this->error = 1;
  504. $this->error_msg = "外卖配送方式未开启!";
  505. } else {
  506. $local_delivery_time = 0;
  507. if (!empty($data[ 'buyer_ask_delivery_time' ])) {
  508. $local_delivery_time = $data[ 'buyer_ask_delivery_time' ];
  509. }
  510. $shop_goods[ 'buyer_ask_delivery_time' ] = $local_delivery_time;
  511. $local_model = new Local();
  512. $local_result = $local_model->calculate($shop_goods, $data);
  513. if ($local_result[ 'code' ] < 0) {
  514. $this->error = $local_result[ 'data' ][ 'code' ];
  515. $this->error_msg = $local_result[ 'message' ];
  516. } else {
  517. if (!empty($local_result[ 'data' ][ 'error_code' ])) {
  518. $this->error = $local_result[ 'data' ][ 'code' ];
  519. $this->error_msg = $local_result[ 'data' ][ 'error' ];
  520. }
  521. }
  522. }
  523. }
  524. }
  525. }
  526. $this->member_balance_money -= $balance_money;//预减少账户余额
  527. $this->balance_money += $balance_money;//累计余额
  528. $this->invoice_money = 0;
  529. //总结计算
  530. $shop_goods[ 'goods_money' ] = $goods_money;
  531. $shop_goods[ 'delivery_money' ] = $delivery_money;
  532. $shop_goods[ 'adjust_money' ] = $adjust_money;
  533. $shop_goods[ 'order_money' ] = $order_money;
  534. $shop_goods[ 'pay_money' ] = 0;
  535. $this->goods_money += $goods_money;
  536. $this->delivery_money = $delivery_money;
  537. $this->adjust_money += $adjust_money;
  538. $this->order_money += $order_money;
  539. $this->pay_money += $pay_money;
  540. $this->goods_num += $shop_goods[ "goods_num" ];
  541. $this->order_name = string_split($this->order_name, ",", $shop_goods[ "order_name" ]);
  542. return $shop_goods;
  543. }
  544. }