StoreOrder.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334
  1. <?php
  2. /**
  3. * Niushop商城系统 - 团队十年电商经验汇集巨献!
  4. * =========================================================
  5. * Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
  6. * ----------------------------------------------
  7. * 官方网址: https://www.niushop.com
  8. * =========================================================
  9. */
  10. namespace app\model\order;
  11. use app\model\goods\GoodsStock;
  12. use app\model\message\Message;
  13. use app\model\verify\Verify;
  14. /**
  15. * 门店自提订单
  16. *
  17. * @author Administrator
  18. *
  19. */
  20. class StoreOrder extends OrderCommon
  21. {
  22. /*****************************************************************************************订单状态***********************************************/
  23. // 订单创建
  24. const ORDER_CREATE = 0;
  25. // 订单已支付
  26. const ORDER_PAY = 1;
  27. // 订单待提货
  28. const ORDER_PENDING_DELIVERY = 2;
  29. // 订单已发货(配货)
  30. const ORDER_DELIVERY = 3;
  31. // 订单已收货
  32. const ORDER_TAKE_DELIVERY = 4;
  33. // 订单已结算完成
  34. const ORDER_COMPLETE = 10;
  35. // 订单已关闭
  36. const ORDER_CLOSE = -1;
  37. /**
  38. * 订单类型
  39. *
  40. * @var int
  41. */
  42. public $order_type = 2;
  43. /**
  44. */
  45. public $order_status = [
  46. self::ORDER_CREATE => [
  47. 'status' => self::ORDER_CREATE,
  48. 'name' => '待支付',
  49. 'is_allow_refund' => 0,
  50. 'icon' => 'public/uniapp/order/order-icon.png',
  51. 'action' => [
  52. [
  53. 'action' => 'orderClose',
  54. 'title' => '关闭订单',
  55. 'color' => ''
  56. ],
  57. [
  58. 'action' => 'orderAdjustMoney',
  59. 'title' => '调整价格',
  60. 'color' => ''
  61. ],
  62. ],
  63. 'member_action' => [
  64. [
  65. 'action' => 'orderClose',
  66. 'title' => '关闭订单',
  67. 'color' => ''
  68. ],
  69. [
  70. 'action' => 'orderPay',
  71. 'title' => '支付',
  72. 'color' => ''
  73. ],
  74. ],
  75. 'color' => ''
  76. ],
  77. self::ORDER_PENDING_DELIVERY => [
  78. 'status' => self::ORDER_PENDING_DELIVERY,
  79. 'name' => '待提货',
  80. 'is_allow_refund' => 0,
  81. 'icon' => 'public/uniapp/order/order-icon-send.png',
  82. 'action' => [
  83. ],
  84. 'member_action' => [
  85. ],
  86. 'color' => ''
  87. ],
  88. self::ORDER_TAKE_DELIVERY => [
  89. 'status' => self::ORDER_TAKE_DELIVERY,
  90. 'name' => '已提货',
  91. 'is_allow_refund' => 1,
  92. 'icon' => 'public/uniapp/order/order-icon-received.png',
  93. 'action' => [
  94. ],
  95. 'member_action' => [
  96. ],
  97. 'color' => ''
  98. ],
  99. self::ORDER_COMPLETE => [
  100. 'status' => self::ORDER_COMPLETE,
  101. 'name' => '已完成',
  102. 'is_allow_refund' => 1,
  103. 'icon' => 'public/uniapp/order/order-icon-received.png',
  104. 'action' => [
  105. ],
  106. 'member_action' => [
  107. ],
  108. 'color' => ''
  109. ],
  110. self::ORDER_CLOSE => [
  111. 'status' => self::ORDER_CLOSE,
  112. 'name' => '已关闭',
  113. 'is_allow_refund' => 0,
  114. 'icon' => 'public/uniapp/order/order-icon-close.png',
  115. 'action' => [
  116. ],
  117. 'member_action' => [
  118. ],
  119. 'color' => ''
  120. ],
  121. ];
  122. /**
  123. * 订单支付
  124. * @param unknown $order_info
  125. */
  126. public function orderPay($order_info, $pay_type, $log_data = [])
  127. {
  128. $member_id = $order_info[ 'member_id' ] ?? 0;
  129. if ($order_info[ 'order_status' ] != 0) {
  130. return $this->error();
  131. }
  132. $condition = array (
  133. [ 'order_id', '=', $order_info[ 'order_id' ] ],
  134. [ 'order_status', '=', self::ORDER_CREATE ],
  135. );
  136. $verify = new Verify();
  137. $order_goods_list = model('order_goods')->getList([ [ 'order_id', '=', $order_info[ 'order_id' ] ] ], 'sku_image,sku_name,price,num,order_goods_id,goods_id,sku_id');
  138. $item_array = [];
  139. foreach ($order_goods_list as $k => $v) {
  140. $item_array[] = [
  141. 'img' => $v[ 'sku_image' ],
  142. 'name' => $v[ 'sku_name' ],
  143. 'price' => $v[ 'price' ],
  144. 'num' => numberFormat($v[ 'num' ]),
  145. 'order_goods_id' => $v[ 'order_goods_id' ],
  146. 'remark_array' => [
  147. ]
  148. ];
  149. // 增加门店商品销量
  150. model('store_goods')->setInc([ [ 'goods_id', '=', $v[ 'goods_id' ] ], [ 'store_id', '=', $order_info[ 'delivery_store_id' ] ] ], 'sale_num', $v[ 'num' ]);
  151. model('store_goods_sku')->setInc([ [ 'sku_id', '=', $v[ 'sku_id' ] ], [ 'store_id', '=', $order_info[ 'delivery_store_id' ] ] ], 'sale_num', $v[ 'num' ]);
  152. }
  153. $pay_time = time();
  154. $remark_array = array (
  155. [ 'title' => '订单金额', 'value' => $order_info[ 'order_money' ] ],
  156. [ 'title' => '订单编号', 'value' => $order_info[ 'order_no' ] ],
  157. [ 'title' => '创建时间', 'value' => time_to_date($order_info[ 'create_time' ]) ],
  158. [ 'title' => '付款时间', 'value' => time_to_date($pay_time) ],
  159. [ 'title' => '收货地址', 'value' => $order_info[ 'full_address' ] ],
  160. [ 'title' => '选择门店', 'value' => $order_info[ 'delivery_store_name' ] ],
  161. );
  162. $verify_content_json = $verify->getVerifyJson($item_array, $remark_array);
  163. $code = $verify->addVerify('pickup', $order_info[ 'site_id' ], $order_info[ 'site_name' ], $verify_content_json, 0, 1, $order_info[ 'delivery_store_id' ], $member_id);
  164. $pay_type_list = $this->getPayType();
  165. $data = array (
  166. 'order_status' => self::ORDER_PENDING_DELIVERY,
  167. 'order_status_name' => $this->order_status[ self::ORDER_PENDING_DELIVERY ][ 'name' ],
  168. 'pay_status' => 1,
  169. 'order_status_action' => json_encode($this->order_status[ self::ORDER_PENDING_DELIVERY ], JSON_UNESCAPED_UNICODE),
  170. 'delivery_code' => $code[ 'data' ][ 'verify_code' ],
  171. 'pay_time' => $pay_time,
  172. 'is_enable_refund' => 1,
  173. 'pay_type' => $pay_type,
  174. 'pay_type_name' => $pay_type_list[ $pay_type ]
  175. );
  176. //记录订单日志 start
  177. $action = '商家对订单进行了线下支付';
  178. //获取用户信息
  179. if (empty($log_data)) {
  180. $member_info = model('member')->getInfo([ 'member_id' => $order_info[ 'member_id' ] ], 'nickname');
  181. $log_data = [
  182. 'uid' => $order_info[ 'member_id' ],
  183. 'nick_name' => $member_info[ 'nickname' ],
  184. 'action_way' => 1
  185. ];
  186. $buyer_name = empty($member_info[ 'nickname' ]) ? '' : '【' . $member_info[ 'nickname' ] . '】';
  187. $action = '买家' . $buyer_name . '支付了订单';
  188. }
  189. $log_data = array_merge($log_data, [
  190. 'order_id' => $order_info[ 'order_id' ],
  191. 'action' => $action,
  192. 'order_status' => self::ORDER_PENDING_DELIVERY,
  193. 'order_status_name' => $this->order_status[ self::ORDER_PENDING_DELIVERY ][ 'name' ]
  194. ]);
  195. $this->addOrderLog($log_data);
  196. //记录订单日志 end
  197. $res = model('order')->update($data, $condition);
  198. $order_goods_data = array (
  199. 'delivery_status_name' => '待提货'
  200. );
  201. $res = model('order_goods')->update($order_goods_data, [ [ 'order_id', '=', $order_info[ 'order_id' ] ] ]);
  202. $verify->qrcode($code[ 'data' ][ 'verify_code' ], 'all', 'pickup', $order_info[ 'site_id' ], 'create');
  203. return $this->success($res);
  204. }
  205. /**
  206. * 主动提货
  207. * @param $delivery_code
  208. * @return \multitype
  209. */
  210. public function verify($delivery_code)
  211. {
  212. $order_info = model('order')->getInfo([ [ 'delivery_code', '=', $delivery_code ] ], 'order_id, order_type, sign_time, order_status, delivery_code,site_id');
  213. if (empty($order_info))
  214. return $this->error([], 'ORDER_EMPTY');
  215. $result = $this->activeTakeDelivery($order_info[ 'order_id' ]);
  216. if ($result[ 'code' ] < 0) {
  217. return $result;
  218. }
  219. //核销发送通知
  220. $message_model = new Message();
  221. $message_model->sendMessage([ 'keywords' => 'VERIFY', 'order_id' => $order_info[ 'order_id' ], 'site_id' => $order_info[ 'site_id' ] ]);
  222. return $result;
  223. }
  224. /**
  225. * 订单提货
  226. * @param unknown $order_id
  227. * @param unknown $delivery_code
  228. */
  229. public function orderTakeDelivery($order_id)
  230. {
  231. $res = model('order_goods')->update([ 'delivery_status' => 1, 'delivery_status_name' => '已提货' ], [ [ 'order_id', '=', $order_id ], [ 'refund_status', '<>', 3 ] ]);
  232. $order_goods_list = model('order_goods')->getList([ [ 'order_id', '=', $order_id ] ]);
  233. foreach ($order_goods_list as $k => $v) {
  234. $order_goods_list[ $k ][ 'num' ] = numberFormat($order_goods_list[ $k ][ 'num' ]);
  235. }
  236. //todo 默认先将提货的发货和收货一体化,将扣除库存统一放在这
  237. $order_stock_model = new OrderStock();
  238. $order_info = model('order')->getInfo([ [ 'order_id', '=', $order_id ] ], 'store_id,site_id');
  239. $stock_result = $order_stock_model->decOrderStock([
  240. 'store_id' => $order_info[ 'store_id' ],
  241. 'site_id' => $order_info[ 'site_id' ],
  242. 'goods_sku_list' => $order_goods_list
  243. ]);
  244. if ($stock_result[ 'code' ] < 0) {
  245. model('order')->rollback();
  246. return $stock_result;
  247. }
  248. return $this->success($res);
  249. }
  250. /**
  251. * 退款完成操作
  252. * @param $order_info
  253. */
  254. public function refund($order_goods_info)
  255. {
  256. //是否入库
  257. if ($order_goods_info[ 'is_refund_stock' ] == 1) {
  258. $order_stock_model = new OrderStock();
  259. $order_stock_model->incOrderStock($order_goods_info);
  260. }
  261. }
  262. /**
  263. * 订单详情
  264. * @param $order_info
  265. * @return array
  266. */
  267. public function orderDetail($order_info)
  268. {
  269. return [];
  270. }
  271. /**
  272. * 主动提货
  273. * @param $order_id
  274. */
  275. public function activeTakeDelivery($order_id)
  276. {
  277. $order_condition = array (
  278. [ 'order_id', '=', $order_id ],
  279. [ 'order_type', '=', 2 ]
  280. );
  281. $order_info = model('order')->getInfo($order_condition, 'delivery_code, order_status, site_id');
  282. //应该在这儿主动调用核销的方法函数
  283. if (empty($order_info))
  284. return $this->error();
  285. if ($order_info[ 'order_status' ] != self::ORDER_PENDING_DELIVERY)
  286. return $this->error([], '只有待提货状态的订单才可以提货');
  287. $result = $this->orderCommonTakeDelivery($order_id);
  288. if ($result[ 'code' ] < 0) {
  289. return $result;
  290. }
  291. //核销发送通知
  292. $message_model = new Message();
  293. $message_model->sendMessage([ 'keywords' => 'VERIFY', 'order_id' => $order_id, 'site_id' => $order_info[ 'site_id' ] ]);
  294. return $result;
  295. }
  296. }