SaasOrderForm.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. <?php
  2. /**
  3. * 重庆赤晓店信息科技有限公司
  4. * https://www.chixiaodian.com
  5. * Copyright (c) 2023 赤店商城 All rights reserved.
  6. */
  7. namespace app\modules\client\models\v1;
  8. use app\models\Goods;
  9. use app\models\Option;
  10. use app\models\Order;
  11. use app\models\OrderDetail;
  12. use app\plugins\food\models\FoodOrder;
  13. use app\plugins\food\models\FoodOrderDetail;
  14. use app\plugins\integral\models\SaasIntegralGoods;
  15. use app\plugins\integral\models\SaasIntegralOrder;
  16. use yii\base\Model;
  17. /**
  18. * Class SaasOrderForm
  19. * @package app\modules\client\models\v1
  20. */
  21. class SaasOrderForm extends Model
  22. {
  23. public $page = 1;
  24. public $limit = 12;
  25. public $user_id;
  26. // -1: 待付款,0:待发货,1:已取消,2:待收货 3:已完成
  27. public $status;
  28. public $validStatus = [-1, 0, 1, 2, 3];
  29. public $order_list = [];
  30. public function rules()
  31. {
  32. return [
  33. [['page', 'limit'], 'integer'],
  34. [['page'], 'default', 'value' => 1],
  35. [['limit'], 'default', 'value' => 12],
  36. ];
  37. }
  38. public function getList() {
  39. if (!$this->validate()) {
  40. return [
  41. 'code' => 1,
  42. 'msg' => $this->getErrorSummary(false)[0]
  43. ];
  44. }
  45. $this->getOrderList();
  46. $this->getIntegralOrderList();
  47. $this->getScanOrderList();
  48. $this->getFoodOrderList();
  49. $data = [];
  50. if (!empty($this->order_list)) {
  51. $time_keys = array_column($this->order_list, 'created_at');
  52. array_multisort($time_keys, SORT_DESC, $this->order_list);
  53. $data = array_slice($this->order_list, ($this->page - 1) * $this->limit, $this->limit);
  54. }
  55. return [
  56. 'code' => 0,
  57. 'msg' => 'success',
  58. 'data' => [
  59. 'row_count' => count($this->order_list),
  60. 'page_count' => ceil(count($this->order_list) / $this->limit),
  61. 'list' => $data,
  62. ],
  63. ];
  64. }
  65. /**
  66. * 普通订单
  67. */
  68. public function getOrderList() {
  69. $start_time = $this->get_total_millisecond();
  70. $query = Order::find()->where(['user_id' => $this->user_id, 'is_delete' => 0]);
  71. if (in_array($this->status, $this->validStatus)) {
  72. $query->andWhere(['trade_status' => $this->status]);
  73. }
  74. $list = $query->select('id, order_no, pay_price, created_at, trade_status, store_id')->asArray()->all();
  75. if (!empty($list)) {
  76. $new_list = [];
  77. foreach ($list as $order) {
  78. $tmp = [];
  79. $tmp['goods_list'] = OrderDetail::find()->where(['order_id' => $order['id']])->select('goods_id as id, goods_name as name, num, total_price as cost, pic')->limit(3)->asArray()->all();
  80. $tmp['unit'] = count($tmp['goods_list']);
  81. $tmp['id'] = $order['id'];
  82. $tmp['order_no'] = $order['order_no'];
  83. $tmp['cost'] = $order['pay_price'];
  84. $tmp['created_at'] = $order['created_at'];
  85. $tmp['time_format'] = date('Y-m-d H:i', $order['created_at']);
  86. $tmp['trade_status_text'] = $this->statusText($order['trade_status']);
  87. $tmp['store_info'] = [
  88. 'name' => Option::get('name', $order['store_id'], 'store')['value'],
  89. 'logo' => Option::get('web_log', $order['store_id'], 'web')['value'],
  90. ];
  91. $tmp['order_type'] = 0;
  92. $new_list[] = $tmp;
  93. }
  94. $this->order_list = array_merge($this->order_list, $new_list);
  95. }
  96. $end_time = $this->get_total_millisecond();
  97. \Yii::error(['<======== 普通订单时间测试 =======>:', $end_time, $start_time, $end_time - $start_time]);
  98. }
  99. /**
  100. * 积分订单
  101. */
  102. public function getIntegralOrderList() {
  103. $start_time = $this->get_total_millisecond();
  104. if (!is_null($this->status) && ($this->status == Order::ORDER_FLOW_NO_SEND || $this->status == Order::ORDER_FLOW_SEND || $this->status == Order::ORDER_FLOW_DEFAULT)) {
  105. return;
  106. }
  107. $query = SaasIntegralOrder::find()->where(['user_id' => $this->user_id, 'is_delete' => 0]);
  108. if ($this->status == Order::ORDER_FLOW_CONFIRM) {
  109. $query->andWhere(['is_clerk' => 1]);
  110. }
  111. $list = $query->select('id, order_no, cost, created_at, is_clerk, store_id, integral_goods_id, goods_id')->asArray()->all();
  112. if (!empty($list)) {
  113. $new_list = [];
  114. foreach ($list as $order) {
  115. $tmp = [];
  116. $pic = Goods::findOne($order['goods_id'])->cover_pic;
  117. $goods = SaasIntegralGoods::find()->where(['id' => $order['integral_goods_id']])->select('name, id')->asArray()->one();
  118. $goods['pic'] = $pic;
  119. $goods['num'] = 1;
  120. $goods['cost'] = $order['cost'];
  121. $tmp['goods_list'][] = $goods;
  122. $tmp['unit'] = 1;
  123. $tmp['id'] = $order['id'];
  124. $tmp['order_no'] = $order['order_no'];
  125. $tmp['cost'] = $order['cost'];
  126. $tmp['created_at'] = $order['created_at'];
  127. $tmp['time_format'] = date('Y-m-d H:i', $order['created_at']);
  128. $tmp['trade_status_text'] = $order['is_clerk'] == 1 ? '已核销' : '待核销';
  129. $tmp['store_info'] = [
  130. 'name' => Option::get('name', $order['store_id'], 'store')['value'],
  131. 'logo' => Option::get('web_log', $order['store_id'], 'web')['value'],
  132. ];
  133. $tmp['order_type'] = 1;
  134. $new_list[] = $tmp;
  135. }
  136. $this->order_list = array_merge($this->order_list, $new_list);
  137. }
  138. $end_time = $this->get_total_millisecond();
  139. \Yii::error(['<======== 积分订单时间测试 =======>:', $end_time, $start_time, $end_time - $start_time]);
  140. }
  141. /**
  142. * 当面付订单
  143. */
  144. public function getScanOrderList() {
  145. $start_time = $this->get_total_millisecond();
  146. if (!is_null($this->status) && ($this->status == Order::ORDER_FLOW_NO_SEND || $this->status == Order::ORDER_FLOW_SEND)) {
  147. return;
  148. }
  149. $query = \app\plugins\scanCodePay\models\Order::find()->where(['user_id' => $this->user_id, 'is_delete' => 0]);
  150. if (in_array($this->status, $this->validStatus)) {
  151. $query->andWhere(['trade_status' => $this->status]);
  152. }
  153. $list = $query->select('id, order_no, pay_price, created_at, trade_status, store_id')->asArray()->all();
  154. if (!empty($list)) {
  155. $new_list = [];
  156. foreach ($list as $order) {
  157. $tmp = [];
  158. $tmp['goods_list'] = \app\plugins\scanCodePay\models\OrderDetail::find()->where(['order_id' => $order['id']])->select('goods_id as id, goods_name as name, num, total_price as cost, pic')->asArray()->all();
  159. $tmp['unit'] = count($tmp['goods_list']);
  160. $tmp['id'] = $order['id'];
  161. $tmp['order_no'] = $order['order_no'];
  162. $tmp['cost'] = $order['pay_price'];
  163. $tmp['created_at'] = $order['created_at'];
  164. $tmp['time_format'] = date('Y-m-d H:i', $order['created_at']);
  165. $tmp['trade_status_text'] = $this->statusText($order['trade_status']);
  166. $tmp['store_info'] = [
  167. 'name' => Option::get('name', $order['store_id'], 'store')['value'],
  168. 'logo' => Option::get('web_log', $order['store_id'], 'web')['value'],
  169. ];
  170. $tmp['order_type'] = 2;
  171. $new_list[] = $tmp;
  172. }
  173. $this->order_list = array_merge($this->order_list, $new_list);
  174. }
  175. $end_time = $this->get_total_millisecond();
  176. \Yii::error(['<======== 当面付订单时间测试 =======>:', $end_time, $start_time, $end_time - $start_time]);
  177. }
  178. /**
  179. * 点餐订单
  180. */
  181. public function getFoodOrderList() {
  182. $start_time = $this->get_total_millisecond();
  183. if (!is_null($this->status) && ($this->status == Order::ORDER_FLOW_NO_SEND || $this->status == Order::ORDER_FLOW_SEND)) {
  184. return;
  185. }
  186. $query = FoodOrder::find()->where(['user_id' => $this->user_id, 'is_delete' => 0]);
  187. if ($this->status == -1) {
  188. $query->andWhere(['is_pay' => 0]);
  189. }
  190. if ($this->status == 3) {
  191. $query->andWhere(['is_pay' => 1]);
  192. }
  193. $list = $query->select('id, order_no, pay_price, created_at, is_pay, store_id')->asArray()->all();
  194. if (!empty($list)) {
  195. $new_list = [];
  196. foreach ($list as $order) {
  197. $tmp = [];
  198. $tmp['goods_list'] = FoodOrderDetail::find()->where(['order_id' => $order['id']])->select('goods_id as id, goods_name as name, num, total_price as cost, pic')->asArray()->all();
  199. $food_num = 0;
  200. foreach ($tmp['goods_list'] as $food) {
  201. $food_num += $food['num'];
  202. }
  203. $tmp['unit'] = $food_num;
  204. $tmp['id'] = $order['id'];
  205. $tmp['order_no'] = $order['order_no'];
  206. $tmp['cost'] = $order['pay_price'];
  207. $tmp['created_at'] = $order['created_at'];
  208. $tmp['time_format'] = date('Y-m-d H:i', $order['created_at']);
  209. $tmp['trade_status_text'] = $order['is_pay'] == 0 ? '待支付' : '已完成';
  210. $tmp['store_info'] = [
  211. 'name' => Option::getFoodBookConfig($order['store_id'])['name'],
  212. 'logo' => Option::getFoodBookConfig($order['store_id'])['logo'],
  213. ];
  214. $tmp['order_type'] = 3;
  215. $new_list[] = $tmp;
  216. }
  217. $this->order_list = array_merge($this->order_list, $new_list);
  218. }
  219. $end_time = $this->get_total_millisecond();
  220. \Yii::error(['<======== 点餐订单时间测试 =======>:', $end_time, $start_time, $end_time - $start_time]);
  221. }
  222. /**
  223. * 返回订单状态文字
  224. * @param integer $status
  225. * @return string $text
  226. */
  227. private function statusText($status) {
  228. switch ($status) {
  229. case -1:
  230. $text = '待支付';
  231. break;
  232. case 0:
  233. $text = '待发货';
  234. break;
  235. case 1:
  236. $text = '已取消';
  237. break;
  238. case 2:
  239. $text = '待收货';
  240. break;
  241. case 3:
  242. $text = '已完成';
  243. break;
  244. default:
  245. $text = '未知状态';
  246. break;
  247. }
  248. return $text;
  249. }
  250. private function get_total_millisecond()
  251. {
  252. list($s1, $s2) = explode(' ', microtime());
  253. return (float)sprintf('%.0f', (floatval($s1) + floatval($s2)) * 1000);
  254. }
  255. }