Order.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449
  1. <?php
  2. /**
  3. * Niushop商城系统 - 团队十年电商经验汇集巨献!
  4. * =========================================================
  5. * Copy right 2019-2029 山西牛酷信息科技有限公司, 保留所有权利。
  6. * ----------------------------------------------
  7. * 官方网址: https://www.niushop.com.cn
  8. * 这不是一个自由软件!您只能在不用于商业目的的前提下对程序代码进行修改和使用。
  9. * 任何企业和个人不允许对程序代码以任何形式任何目的再发布。
  10. * =========================================================
  11. */
  12. namespace app\model\order;
  13. use app\model\express\ExpressDelivery;
  14. use app\model\goods\GoodsStock;
  15. use app\model\system\Cron;
  16. use app\model\message\Message;
  17. /**
  18. * 普通(快递)订单
  19. *
  20. * @author Administrator
  21. *
  22. */
  23. class Order extends OrderCommon
  24. {
  25. /*****************************************************************************************订单状态***********************************************/
  26. // 订单创建
  27. const ORDER_CREATE = 0;
  28. // 订单已支付
  29. const ORDER_PAY = 1;
  30. // 订单备货中
  31. const ORDER_PENDING_DELIVERY = 2;
  32. // 订单已发货(配货)
  33. const ORDER_DELIVERY = 3;
  34. // 订单已收货
  35. const ORDER_TAKE_DELIVERY = 4;
  36. // 订单已结算完成
  37. const ORDER_COMPLETE = 10;
  38. // 订单已关闭
  39. const ORDER_CLOSE = -1;
  40. /**
  41. * 订单类型
  42. *
  43. * @var int
  44. */
  45. public $order_type = 1;
  46. /***********************************************************************************订单项 配送状态**************************************************/
  47. // 待发货
  48. const DELIVERY_WAIT = 0;
  49. // 已发货
  50. const DELIVERY_DOING = 1;
  51. // 已收货
  52. const DELIVERY_FINISH = 2;
  53. /**
  54. */
  55. public $order_status = [
  56. self::ORDER_CREATE => [
  57. 'status' => self::ORDER_CREATE,
  58. 'name' => '待支付',
  59. 'is_allow_refund' => 0,
  60. 'action' => [
  61. [
  62. 'action' => 'orderClose',
  63. 'title' => '关闭订单',
  64. 'color' => ''
  65. ],
  66. [
  67. 'action' => 'orderAddressUpdate',
  68. 'title' => '修改地址',
  69. 'color' => ''
  70. ],
  71. [
  72. 'action' => 'orderAdjustMoney',
  73. 'title' => '调整价格',
  74. 'color' => ''
  75. ],
  76. ],
  77. 'member_action' => [
  78. [
  79. 'action' => 'orderClose',
  80. 'title' => '关闭订单',
  81. 'color' => ''
  82. ],
  83. [
  84. 'action' => 'orderPay',
  85. 'title' => '支付',
  86. 'color' => ''
  87. ],
  88. ],
  89. 'color' => ''
  90. ],
  91. self::ORDER_PAY => [
  92. 'status' => self::ORDER_PAY,
  93. 'name' => '待发货',
  94. 'is_allow_refund' => 0,
  95. 'action' => [
  96. [
  97. 'action' => 'orderDelivery',
  98. 'title' => '发货',
  99. 'color' => ''
  100. ],
  101. [
  102. 'action' => 'orderAddressUpdate',
  103. 'title' => '修改地址',
  104. 'color' => ''
  105. ],
  106. ],
  107. 'member_action' => [
  108. ],
  109. 'color' => ''
  110. ],
  111. self::ORDER_DELIVERY => [
  112. 'status' => self::ORDER_DELIVERY,
  113. 'name' => '已发货',
  114. 'is_allow_refund' => 1,
  115. 'action' => [
  116. ],
  117. 'member_action' => [
  118. [
  119. 'action' => 'memberTakeDelivery',
  120. 'title' => '确认收货',
  121. 'color' => ''
  122. ],
  123. [
  124. 'action' => 'trace',
  125. 'title' => '查看物流',
  126. 'color' => ''
  127. ]
  128. ],
  129. 'color' => ''
  130. ],
  131. self::ORDER_TAKE_DELIVERY => [
  132. 'status' => self::ORDER_TAKE_DELIVERY,
  133. 'name' => '已收货',
  134. 'is_allow_refund' => 1,
  135. 'action' => [
  136. ],
  137. 'member_action' => [
  138. ],
  139. 'color' => ''
  140. ],
  141. self::ORDER_COMPLETE => [
  142. 'status' => self::ORDER_COMPLETE,
  143. 'name' => '已完成',
  144. 'is_allow_refund' => 1,
  145. 'action' => [
  146. ],
  147. 'member_action' => [
  148. ],
  149. 'color' => ''
  150. ],
  151. self::ORDER_CLOSE => [
  152. 'status' => self::ORDER_CLOSE,
  153. 'name' => '已关闭',
  154. 'is_allow_refund' => 0,
  155. 'action' => [
  156. ],
  157. 'member_action' => [
  158. ],
  159. 'color' => ''
  160. ]
  161. ];
  162. /**
  163. * 配送状态
  164. */
  165. public $delivery_status = [
  166. self::DELIVERY_WAIT => [
  167. 'status' => self::DELIVERY_WAIT,
  168. 'name' => '待发货',
  169. 'color' => ''
  170. ],
  171. self::DELIVERY_DOING => [
  172. 'status' => self::DELIVERY_DOING,
  173. 'name' => '已发货',
  174. 'color' => ''
  175. ],
  176. self::DELIVERY_FINISH => [
  177. 'status' => self::DELIVERY_FINISH,
  178. 'name' => '已收货',
  179. 'color' => ''
  180. ]
  181. ];
  182. /**
  183. * 订单支付
  184. * @param unknown $order_info
  185. */
  186. public function orderPay($order_info, $pay_type)
  187. {
  188. $pay_type_list = $this->getPayType();
  189. if ($order_info['order_status'] != 0) {
  190. return $this->error();
  191. }
  192. $condition = array(
  193. [ "order_id", "=", $order_info["order_id"] ],
  194. [ "order_status", "=", self::ORDER_CREATE ],
  195. );
  196. $data = array(
  197. "order_status" => self::ORDER_PAY,
  198. "order_status_name" => $this->order_status[ self::ORDER_PAY ]["name"],
  199. "pay_status" => 1,
  200. "order_status_action" => json_encode($this->order_status[ self::ORDER_PAY ], JSON_UNESCAPED_UNICODE),
  201. "pay_time" => time(),
  202. "is_enable_refund" => 1,
  203. "pay_type" => $pay_type,
  204. "pay_type_name" => $pay_type_list[ $pay_type ]
  205. );
  206. $result = model("order")->update($data, $condition);
  207. return $this->success($result);
  208. }
  209. /**
  210. * 订单项发货(物流)
  211. * @param unknown $param
  212. * @return multitype:unknown |multitype:number unknown
  213. */
  214. public function orderGoodsDelivery($param)
  215. {
  216. model('order_goods')->startTrans();
  217. try {
  218. $order_goods_ids = $param['order_goods_ids'];
  219. $delivery_no = $param["delivery_no"];//物流单号
  220. $delivery_type = $param["delivery_type"];
  221. if ($delivery_type == 0) {
  222. $express_company_id = 0;
  223. } else {
  224. $express_company_id = $param["express_company_id"] ?? 0;
  225. }
  226. $site_id = $param["site_id"];
  227. $order_goods_id_array = explode(",", $order_goods_ids);
  228. if (empty($order_goods_id_array))
  229. return $this->error('', "发送货物不可为空!");
  230. $order_id = 0;
  231. $member_id = 0;
  232. $goods_id_array = [];
  233. foreach ($order_goods_id_array as $k => $v) {
  234. $order_goods_info = model("order_goods")->getInfo([ [ "order_goods_id", "=", $v ], [ "site_id", "=", $site_id ] ], "sku_id,num,order_id,sku_name,sku_image,member_id,refund_status");
  235. //已退款的订单项不可发货
  236. if ($order_goods_info["refund_status"] == 3) {
  237. model('order_goods')->commit();
  238. return $this->error([], "ORDER_GOODS_IS_REFUND");
  239. }
  240. $order_id = $order_goods_info["order_id"];
  241. $member_id = $order_goods_info["member_id"];
  242. $goods_id_array[] = $order_goods_info["sku_id"] . ":" . $order_goods_info["num"] . ":" . $order_goods_info["sku_name"] . ":" . $order_goods_info["sku_image"];
  243. $data = [ "delivery_status" => self::DELIVERY_DOING, "delivery_status_name" => $this->delivery_status[ self::DELIVERY_DOING ]["name"] ];
  244. if (!empty($delivery_no)) {
  245. $data['delivery_no'] = $delivery_no;
  246. }
  247. $res = model('order_goods')->update($data, [
  248. [ 'order_goods_id', "=", $v ],
  249. [ 'delivery_status', "=", self::DELIVERY_WAIT ]
  250. ]);
  251. }
  252. //创建包裹
  253. $order_common_model = new OrderCommon();
  254. $lock_result = $order_common_model->verifyOrderLock($order_id);
  255. if ($lock_result["code"] < 0) {
  256. model('order_goods')->commit();
  257. return $lock_result;
  258. }
  259. $express_delivery_model = new ExpressDelivery();
  260. $delivery_data = array(
  261. "order_id" => $order_id,
  262. "order_goods_id_array" => $order_goods_id_array,
  263. "goods_id_array" => $goods_id_array,
  264. "goods_array" => $goods_id_array,
  265. "site_id" => $site_id,
  266. "delivery_no" => $delivery_no,
  267. "member_id" => $member_id,
  268. "express_company_id" => $express_company_id,
  269. "delivery_type" => $delivery_type
  270. );
  271. $result = $express_delivery_model->delivery($delivery_data);
  272. //检测整体, 订单中订单项是否全部发放完毕
  273. $res = $this->orderCommonDelivery($order_id);
  274. model('order_goods')->commit();
  275. return $this->success($res);
  276. } catch (\Exception $e) {
  277. model('order_goods')->rollback();
  278. return $this->error('', $e->getMessage());
  279. }
  280. }
  281. /**
  282. * 订单发货
  283. *
  284. * @param array $condition
  285. */
  286. public function orderDelivery($order_id)
  287. {
  288. //统计订单项目
  289. $count = model('order_goods')->getCount([ [ 'order_id', "=", $order_id ], [ 'delivery_status', "=", self::DELIVERY_WAIT ], [ "refund_status", "<>", 3 ] ], "order_goods_id");
  290. $delivery_count = model('order_goods')->getCount([ [ 'order_id', "=", $order_id ], [ 'delivery_status', "=", self::DELIVERY_DOING ], [ "refund_status", "<>", 3 ] ], "order_goods_id");
  291. if ($count == 0 && $delivery_count > 0) {
  292. //修改订单项的配送状态
  293. $order_data = array(
  294. 'order_status' => self::ORDER_DELIVERY,
  295. 'order_status_name' => $this->order_status[ self::ORDER_DELIVERY ]["name"],
  296. 'delivery_status' => self::DELIVERY_FINISH,
  297. 'delivery_status_name' => $this->delivery_status[ self::DELIVERY_FINISH ]["name"],
  298. 'order_status_action' => json_encode($this->order_status[ self::ORDER_DELIVERY ], JSON_UNESCAPED_UNICODE),
  299. 'delivery_time' => time()
  300. );
  301. $res = model('order')->update($order_data, [ [ 'order_id', "=", $order_id ] ]);
  302. //获取订单自动收货时间
  303. $config_model = new Config();
  304. $event_time_config_result = $config_model->getOrderEventTimeConfig();
  305. $event_time_config = $event_time_config_result["data"];
  306. $now_time = time();//当前时间
  307. if (!empty($event_time_config)) {
  308. $execute_time = $now_time + $event_time_config["value"]["auto_take_delivery"] * 86400;//自动收货时间
  309. } else {
  310. $execute_time = $now_time + 86400;//尚未配置 默认一天
  311. }
  312. //默认自动时间
  313. $cron_model = new Cron();
  314. $cron_model->addCron(1, 1, "订单自动收货", "CronOrderTakeDelivery", $execute_time, $order_id);
  315. event('OrderDelivery', [ 'order_id' => $order_id ]);
  316. //订单发货消息
  317. $message_model = new Message();
  318. $message_model->sendMessage([ 'keywords' => "ORDER_DELIVERY", 'order_id' => $order_id ]);
  319. return $res;
  320. } else {
  321. return $this->error();
  322. }
  323. }
  324. /**
  325. * 订单收货
  326. *
  327. * @param int $order_id
  328. */
  329. public function orderTakeDelivery($order_id)
  330. {
  331. return $this->success();
  332. }
  333. /**
  334. * 订单收货地址修改
  335. */
  336. public function orderAddressUpdate($param, $condition)
  337. {
  338. $province_id = $param["province_id"];
  339. $city_id = $param["city_id"];
  340. $district_id = $param["district_id"];
  341. $community_id = $param["community_id"];
  342. $address = $param["address"];
  343. $full_address = $param["full_address"];
  344. $longitude = $param["longitude"];
  345. $latitude = $param["latitude"];
  346. $mobile = $param["mobile"];
  347. $telephone = $param["telephone"];
  348. $name = $param["name"];
  349. $data = array(
  350. "province_id" => $province_id,
  351. "city_id" => $city_id,
  352. "district_id" => $district_id,
  353. "community_id" => $community_id,
  354. "address" => $address,
  355. "full_address" => $full_address,
  356. "longitude" => $longitude,
  357. "latitude" => $latitude,
  358. "mobile" => $mobile,
  359. "telephone" => $telephone,
  360. "name" => $name,
  361. );
  362. $order_info = model("order")->getInfo($condition, "order_status");
  363. $order_status_array = [ self::ORDER_PAY, self::ORDER_CREATE ];
  364. if (!in_array($order_info["order_status"], $order_status_array))
  365. return $this->error("", "当前订单状态不可编辑收货地址!");
  366. $result = model('order')->update($data, $condition);
  367. return $this->success($result);
  368. }
  369. /**
  370. * 退款完成操作
  371. * @param $order_info
  372. */
  373. public function refund($order_goods_info)
  374. {
  375. //是否入库
  376. if ($order_goods_info["is_refund_stock"] == 1) {
  377. $goods_stock_model = new GoodsStock();
  378. $item_param = array(
  379. "sku_id" => $order_goods_info["sku_id"],
  380. "num" => $order_goods_info["num"],
  381. );
  382. //返还库存
  383. $goods_stock_model->incStock($item_param);
  384. }
  385. //检测订单项是否否全部发放完毕
  386. $this->orderDelivery($order_goods_info["order_id"]);
  387. }
  388. /**
  389. * 订单详情
  390. * @param $order_info
  391. */
  392. public function orderDetail($order_info)
  393. {
  394. return [];
  395. }
  396. /**
  397. * 计算订单销售额
  398. * @param array $condition
  399. * @param string $field
  400. * @return array
  401. */
  402. public function getOrderMoneySum($condition = [], $field = 'order_money')
  403. {
  404. $res = model('order')->getSum($condition, $field);
  405. return $this->success($res);
  406. }
  407. }