Order.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365
  1. <?php
  2. /**
  3. * Niushop商城系统 - 团队十年电商经验汇集巨献!
  4. * =========================================================
  5. * Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
  6. * ----------------------------------------------
  7. * 官方网址: https://www.niushop.com
  8. * =========================================================
  9. */
  10. namespace addon\pointexchange\model;
  11. use addon\coupon\model\Coupon;
  12. use app\model\member\MemberAccount;
  13. use app\model\BaseModel;
  14. use app\model\order\VirtualOrder;
  15. use app\model\system\Pay;
  16. use app\model\order\OrderCreate;
  17. use app\model\order\Order as CommonOrder;
  18. use app\model\order\StoreOrder;
  19. use app\model\order\LocalOrder;
  20. use app\model\order\OrderCommon;
  21. use think\facade\Log;
  22. /**
  23. * 积分兑换订单
  24. */
  25. class Order extends BaseModel
  26. {
  27. /**
  28. * 支付订单
  29. * @param unknown $out_trade_no
  30. */
  31. public function orderPay($data)
  32. {
  33. $out_trade_no = $data[ "out_trade_no" ];
  34. $order_info = model("promotion_exchange_order")->getInfo([ [ 'out_trade_no', '=', $out_trade_no ] ], '*');
  35. if (empty($order_info)) {
  36. return $this->error([], "找不到可支付的订单");
  37. }
  38. if ($order_info[ "order_status" ] == 1) {
  39. return $this->error([], "当前订单已支付");
  40. }
  41. model("promotion_exchange_order")->startTrans();
  42. try {
  43. $order_data = array (
  44. "order_status" => 1,
  45. "pay_time" => time()
  46. );
  47. switch ( $order_info[ 'type' ] ) {
  48. case 1://商品
  49. //添加对应商品订单
  50. $order_create = new OrderCreate();
  51. $order_no = $order_create->createOrderNo($order_info[ 'site_id' ], $order_info[ 'member_id' ]);
  52. //查询兑换的商品信息
  53. $exchange_info = model("promotion_exchange")->getInfo([ [ 'id', '=', $order_info[ 'exchange_id' ] ] ], 'price,type_id');
  54. $sku_info = model('goods_sku')->getInfo([ [ 'sku_id', '=', $exchange_info[ 'type_id' ] ] ], 'sku_id,sku_name,sku_no,sku_image,is_virtual,goods_class,goods_class_name,cost_price,goods_id,goods_name,sku_spec_format');
  55. //订单类型
  56. $order_type = $this->orderType($order_info[ 'delivery_type' ], $sku_info[ 'is_virtual' ]);
  57. $data_order = [
  58. 'order_no' => $order_no,
  59. 'site_id' => $order_info[ 'site_id' ],
  60. 'site_name' => '',
  61. 'order_from' => $order_info[ 'order_from' ],
  62. 'order_from_name' => $order_info[ 'order_from_name' ],
  63. 'order_type' => $order_type[ 'order_type_id' ],
  64. 'order_type_name' => $order_type[ 'order_type_name' ],
  65. 'order_status_name' => $order_type[ 'order_status' ][ 'name' ],
  66. 'order_status_action' => json_encode($order_type[ 'order_status' ], JSON_UNESCAPED_UNICODE),
  67. 'out_trade_no' => $out_trade_no,
  68. 'member_id' => $order_info[ 'member_id' ],
  69. 'name' => $order_info[ 'name' ],
  70. 'mobile' => $order_info[ 'mobile' ],
  71. 'telephone' => $order_info[ 'telephone' ],
  72. 'province_id' => $order_info[ 'province_id' ],
  73. 'city_id' => $order_info[ 'city_id' ],
  74. 'district_id' => $order_info[ 'district_id' ],
  75. 'community_id' => $order_info[ 'community_id' ],
  76. 'address' => $order_info[ 'address' ],
  77. 'full_address' => $order_info[ 'full_address' ],
  78. 'longitude' => $order_info[ 'longitude' ],
  79. 'latitude' => $order_info[ 'latitude' ],
  80. 'buyer_ip' => '',
  81. 'goods_money' => $order_info[ 'exchange_price' ] * $order_info[ 'num' ],
  82. 'delivery_money' => $order_info[ 'delivery_price' ],
  83. 'coupon_id' => 0,
  84. 'coupon_money' => 0,
  85. 'adjust_money' => 0,
  86. 'invoice_money' => 0,
  87. 'promotion_money' => 0,
  88. 'order_money' => $order_info[ 'order_money' ],
  89. 'balance_money' => 0,
  90. 'pay_money' => $order_info[ 'order_money' ],
  91. 'create_time' => time(),
  92. 'is_enable_refund' => $order_type[ 'order_type_id' ] == 4 ? 0 : 1,
  93. 'order_name' => $order_info[ "exchange_name" ],
  94. 'goods_num' => $order_info[ 'num' ],
  95. 'delivery_type' => $order_info[ 'delivery_type' ],
  96. 'delivery_type_name' => $order_info[ 'delivery_type_name' ],
  97. 'delivery_store_id' => $order_info[ "delivery_store_id" ],
  98. "delivery_store_name" => $order_info[ "delivery_store_name" ],
  99. "delivery_store_info" => $order_info[ "delivery_store_info" ],
  100. "buyer_message" => $order_info[ "buyer_message" ],
  101. "invoice_delivery_money" => 0,
  102. "taxpayer_number" => '',
  103. "invoice_rate" => 0,
  104. "invoice_content" => '',
  105. "invoice_full_address" => '',
  106. "is_invoice" => 0,
  107. "invoice_type" => 0,
  108. "invoice_title" => '',
  109. 'is_tax_invoice' => '',
  110. 'invoice_email' => '',
  111. 'invoice_title_type' => 0,
  112. 'buyer_ask_delivery_time' => $order_info[ 'buyer_ask_delivery_time' ],//定时达
  113. 'promotion_type' => 'pointexchange',
  114. 'promotion_type_name' => '积分兑换',
  115. 'store_id' => $order_info['delivery_store_id']
  116. ];
  117. $order_id = model('order')->add($data_order);
  118. $order_data[ 'relate_order_id' ] = $order_id;
  119. $data_order_goods = array (
  120. 'order_id' => $order_id,
  121. 'site_id' => $order_info[ 'site_id' ],
  122. 'order_no' => $order_no,
  123. 'member_id' => $order_info[ 'member_id' ],
  124. 'sku_id' => $sku_info[ 'sku_id' ],
  125. 'sku_name' => $sku_info[ 'sku_name' ],
  126. 'sku_image' => $sku_info[ 'sku_image' ],
  127. 'sku_no' => $sku_info[ 'sku_no' ],
  128. 'is_virtual' => $sku_info[ 'is_virtual' ],
  129. 'goods_class' => $sku_info[ 'goods_class' ],
  130. 'goods_class_name' => $sku_info[ 'goods_class_name' ],
  131. 'price' => $order_info[ 'exchange_price' ],
  132. 'cost_price' => $sku_info[ 'cost_price' ],
  133. 'num' => $order_info[ 'num' ],
  134. 'goods_money' => $order_info[ 'exchange_price' ] * $order_info[ 'num' ],
  135. 'cost_money' => $sku_info[ 'cost_price' ] * $order_info[ 'num' ],
  136. 'goods_id' => $sku_info[ 'goods_id' ],
  137. 'delivery_status' => 0,
  138. 'delivery_status_name' => "未发货",
  139. "real_goods_money" => $order_info[ 'exchange_price' ] * $order_info[ 'num' ],
  140. 'coupon_money' => 0,
  141. 'promotion_money' => 0,
  142. 'goods_name' => $sku_info[ 'goods_name' ],
  143. 'sku_spec_format' => $sku_info[ 'sku_spec_format' ],
  144. 'store_id' => $order_info['delivery_store_id']
  145. );
  146. model('order_goods')->add($data_order_goods);
  147. $order_common = new OrderCommon();
  148. $pay = new Pay();
  149. $pay_info = $pay->getPayInfo($out_trade_no);
  150. $res = $order_common->orderOnlinePay($pay_info[ 'data' ]);
  151. if (isset($res['code']) && $res['code'] != 0) {
  152. Log::write('积分兑换商品订单支付失败:'.$res['message']);
  153. }
  154. break;
  155. case 2://优惠券
  156. $coupon_model = new Coupon();
  157. $res = $coupon_model->giveCoupon([ [ 'coupon_type_id' => $order_info[ "type_id" ], 'num' => 1 ] ], $order_info[ "site_id" ], $order_info[ "member_id" ], 7);
  158. break;
  159. case 3://红包
  160. $member_account_model = new MemberAccount();
  161. $res = $member_account_model->addMemberAccount($order_info[ "site_id" ], $order_info[ "member_id" ], "balance", $order_info[ "balance" ], "order", "积分兑换,", "积分兑换");
  162. break;
  163. }
  164. $res = model("promotion_exchange_order")->update($order_data, [ [ "order_id", "=", $order_info[ "order_id" ] ] ]);
  165. model("promotion_exchange_order")->commit();
  166. return $this->success();
  167. } catch (\Exception $e) {
  168. model("promotion_exchange_order")->rollback();
  169. return $this->error('', $e->getMessage());
  170. }
  171. }
  172. private function orderType($type_name, $is_virtual = 0)
  173. {
  174. if ($type_name == 'express') {
  175. $order = new CommonOrder();
  176. return [
  177. 'order_type_id' => 1,
  178. 'order_type_name' => '普通订单',
  179. 'order_status' => $order->order_status[ 0 ]
  180. ];
  181. } elseif ($type_name == 'store') {
  182. $order = new StoreOrder();
  183. return [
  184. 'order_type_id' => 2,
  185. 'order_type_name' => '自提订单',
  186. 'order_status' => $order->order_status[ 0 ]
  187. ];
  188. } elseif ($type_name == 'local') {
  189. $order = new LocalOrder();
  190. return [
  191. 'order_type_id' => 3,
  192. 'order_type_name' => '外卖订单',
  193. 'order_status' => $order->order_status[ 0 ]
  194. ];
  195. } elseif ($is_virtual) {
  196. $order = new VirtualOrder();
  197. return [
  198. 'order_type_id' => 4,
  199. 'order_type_name' => '虚拟订单',
  200. 'order_status' => $order->order_status[ 0 ]
  201. ];
  202. }
  203. }
  204. /**
  205. * 关闭订单
  206. * @param $order_id
  207. * @return array|int|mixed|void
  208. */
  209. public function closeOrder($order_id)
  210. {
  211. $order_info = model("promotion_exchange_order")->getInfo([ [ 'order_id', '=', $order_id ] ], '*');
  212. if (empty($order_info)) return $this->error();
  213. model("promotion_exchange_order")->startTrans();
  214. try {
  215. $data = array (
  216. "order_status" => -1,
  217. );
  218. $result = model("promotion_exchange_order")->update($data, [ [ "order_id", '=', $order_id ] ]);
  219. //返还积分
  220. $member_account_model = new MemberAccount();
  221. $member_account_result = $member_account_model->addMemberAccount($order_info[ 'site_id' ], $order_info[ "member_id" ], "point", $order_info[ "point" ], "pointexchangerefund", $order_id, "积分兑换关闭返还");
  222. if ($member_account_result[ "code" ] < 0) {
  223. model("promotion_exchange_order")->rollback();
  224. return $member_account_result;
  225. }
  226. //判断库存
  227. $exchange_model = new Exchange();
  228. switch ( $order_info[ "type" ] ) {//兑换类型
  229. case "1"://商品
  230. // $sku_info = model('goods_sku')->getInfo( [ ['sku_id','=',$order_info['type_id']] ], "");
  231. // if(!empty($sku_info)){
  232. // //库存变化
  233. // $goods_stock_model = new GoodsStock();
  234. // $stock_result = $goods_stock_model->incStock(["sku_id" => $order_info['type_id'], "num" => $order_info["num"]]);
  235. // if ($stock_result["code"] != 0) {
  236. // model("promotion_exchange_order")->rollback();
  237. // return $stock_result;
  238. // }
  239. // }
  240. break;
  241. case "2"://优惠券
  242. //返回优惠券库存
  243. $coupon_model = new Coupon();
  244. $coupon_info = $coupon_model->getCouponTypeInfo([ [ "coupon_type_id", '=', $order_info[ "type_id" ] ] ], 'coupon_type_id');
  245. if (!empty($coupon_info)) {
  246. $result = $coupon_model->incStock([ [ "coupon_type_id", '=', $order_info[ "type_id" ] ], [ "num", '=', $order_info[ "num" ] ] ]);
  247. }
  248. break;
  249. case "3"://红包
  250. break;
  251. }
  252. //返还套餐库存
  253. $exchange_model->incStock([ 'id' => $order_info[ 'exchange_id' ], 'num' => $order_info[ 'num' ] ]);
  254. if ($order_info[ 'type' ] == 1 && $order_info[ 'order_money' ] > 0 && $order_info[ 'order_status' ] == 0) {
  255. //关闭支付
  256. $pay_model = new Pay();
  257. $result = $pay_model->deletePay($order_info[ 'out_trade_no' ]);//关闭旧支付单据
  258. if ($result[ "code" ] < 0) {
  259. model("promotion_exchange_order")->rollback();
  260. return $result;
  261. }
  262. }
  263. model("promotion_exchange_order")->commit();
  264. return $this->success();
  265. } catch (\Exception $e) {
  266. model("promotion_exchange_order")->rollback();
  267. return $this->error('', $e->getMessage());
  268. }
  269. }
  270. /**
  271. * 获取积分兑换订单信息
  272. * @param $condition
  273. * @param string $field
  274. * @return array
  275. */
  276. public function getOrderInfo($condition, $field = '*')
  277. {
  278. $res = model('promotion_exchange_order')->getInfo($condition, $field);
  279. return $this->success($res);
  280. }
  281. /**
  282. * 获取订单列表
  283. * @param array $condition
  284. * @param string $field
  285. * @param string $order
  286. * @param null $limit
  287. * @return array
  288. */
  289. public function getOrderList($condition = [], $field = '*', $order = '', $limit = null)
  290. {
  291. $list = model('promotion_exchange_order')->getList($condition, $field, $order, '', '', '', $limit);
  292. return $this->success($list);
  293. }
  294. /**
  295. * 获取订单总和
  296. * @param array $where
  297. * @param string $field
  298. * @param string $alias
  299. * @param null $join
  300. * @return array
  301. */
  302. public function getOrderSum($where = [], $field = '', $alias = 'a', $join = null)
  303. {
  304. $data = model('promotion_exchange_order')->getSum($where, $field, $alias, $join);
  305. return $this->success($data);
  306. }
  307. /**
  308. * 获取积分兑换订单分页列表
  309. * @param array $condition
  310. * @param int $page
  311. * @param int $page_size
  312. * @param string $order
  313. * @param string $field
  314. * @return array
  315. */
  316. public function getExchangePageList($condition = [], $page = 1, $page_size = PAGE_LIST_ROWS, $order = '', $field = '*', $alias = '', $join = [])
  317. {
  318. $list = model('promotion_exchange_order')->pageList($condition, $field, $order, $page, $page_size, $alias, $join);
  319. return $this->success($list);
  320. }
  321. /**
  322. * 发货
  323. * @param $param
  324. * @return array
  325. */
  326. public function delivery($param)
  327. {
  328. $order_id = $param[ 'order_id' ];
  329. $delivery_code = $param[ 'delivery_code' ];
  330. $order_data = array (
  331. 'delivery_status' => 1,
  332. 'delivery_status_name' => '已发货',
  333. 'delivery_code' => $delivery_code
  334. );
  335. $res = model("promotion_exchange_order")->update($order_data, [ [ "order_id", "=", $order_id ] ]);
  336. return $this->success();
  337. }
  338. }