PtActivityOrderForm.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320
  1. <?php
  2. /**
  3. * 重庆赤晓店信息科技有限公司
  4. * https://www.chixiaodian.com
  5. * Copyright (c) 2023 赤店商城 All rights reserved.
  6. */
  7. namespace app\modules\alliance\models\pt;
  8. use app\models\Goods;
  9. use app\models\Order;
  10. use app\models\PtActivity;
  11. use app\models\PtActivityBanner;
  12. use app\models\PtActivityGoods;
  13. use app\models\PtActivityGoodsCat;
  14. use app\models\PtActivityOrder;
  15. use app\models\PtActivityOrderDetail;
  16. use app\models\SaasUser;
  17. use app\models\User;
  18. use app\modules\client\models\v1\pt\order\OrderForm;
  19. use yii\base\Model;
  20. class PtActivityOrderForm extends Model
  21. {
  22. //状态
  23. public $status;
  24. //拼团号
  25. public $pt_number;
  26. public $pt_order_id;
  27. public $store_id;
  28. public function rules()
  29. {
  30. return [
  31. [['status', 'pt_number', 'pt_order_id', 'store_id'],'integer'],
  32. ];
  33. }
  34. //获取订单列表
  35. public function search() {
  36. try {
  37. $status = $this->status;
  38. $pay_end_time = time() - (60 * 15);
  39. $saas_user = get_saas_user();
  40. $where = ['is_platform' => 1, 'saas_id' => $saas_user->id];
  41. // if ($this->store_id > 0) {
  42. // $user = User::findOne(['binding' => $saas_user->mobile, 'is_delete' => 0, 'store_id' => $this->store_id]);
  43. // $user_id = 0;
  44. // if ($user) {
  45. // $user_id = $user->id;
  46. // }
  47. // $where = ['store_id' => $this->store_id, 'user_id' => $user_id, 'is_pay' => 1];
  48. // }
  49. $query = PtActivityOrder::find()->where($where);
  50. switch ($status) {
  51. case 1:
  52. $query->andWhere(['AND', ['is_pay' => 0], ['<>' ,'trade_status', 1]]);
  53. break;
  54. case 2:
  55. $query->andWhere(['AND', ['is_pay' => 1], ['is_pt_finish' => 0]]);
  56. break;
  57. case 3:
  58. $query->andWhere(['AND', ['is_pt_finish' => 1], ['is_winner' => 1]]);
  59. break;
  60. case 4:
  61. $query->andWhere(['OR', ['AND', ['is_pt_finish' => 1], ['is_winner' => 0]], ['AND', ['<', 'created_at', $pay_end_time], ['is_pay' => 0]], ['is_pt_finish' => 2]]);
  62. break;
  63. }
  64. $query->select("id, pay_price, pt_number, is_pay, is_pt_finish, is_winner, pay_time, trade_status, created_at, store_id")->orderBy('created_at desc');
  65. $list = pagination_make($query);
  66. foreach ($list['list'] as &$item) {
  67. if (!empty($item['pt_number'])) {
  68. //获取开团订单信息
  69. $first_order = PtActivityOrder::findOne($item['pt_number']);
  70. $item['pay_time'] = $first_order->pay_time;
  71. }
  72. $item['surplus_num'] = 0;
  73. $item['end_time'] = 0;
  74. //商品数据 活动数据
  75. $item['goods_list'] = PtActivityOrderDetail::find()->where(['order_id' => $item['id']])
  76. ->select('id, goods_id, pic, goods_name, attr, num, activity_id, total_price')->asArray()->one();
  77. $pt_number = $item['id'];
  78. if ((int)$item['pt_number'] > 0) {
  79. $pt_number = $item['pt_number'];
  80. }
  81. if (!empty($item['goods_list'])) {
  82. $pic = $item['goods_list']['pic'];
  83. $index = strstr($pic, 'http');
  84. if (!$index) {
  85. $pic = 'https:' . $pic;
  86. }
  87. $item['goods_list']['pic'] = \str_replace('http://', 'https://', $pic);
  88. $item['goods_list']['attr'] = json_decode($item['goods_list']['attr'], true);
  89. $pt_activity = PtActivity::findOne($item['goods_list']['activity_id']);
  90. if ($pt_activity) {
  91. //拼团剩余数据
  92. $end_time = (($pt_activity->split_time * 60 * 60) + $item['pay_time']) - time();
  93. $item['end_time'] = ($end_time > 0) ? $end_time : 0;
  94. if ((int)$item['is_pt_finish'] !== 0) {
  95. $item['end_time'] = 0;
  96. }
  97. $order_num = PtActivityOrder::find()->where(['is_pay' => 1])
  98. ->andWhere(['OR' , ['id' => $pt_number], ['pt_number' => $pt_number]])
  99. ->select('id')->count();
  100. $item['surplus_num'] = ($pt_activity->party_size - $order_num);
  101. $item['party_type'] = $pt_activity['party_type'];
  102. $item['surplus_num_goods'] = 0;
  103. if($pt_activity['party_type'] == 1){
  104. $goodsCountQuery = PtActivityOrderDetail::find()->alias('pod')
  105. ->leftJoin(['po' => PtActivityOrder::tableName()], 'pod.order_id = po.id')
  106. ->where(['po.is_pay' => 1, 'pod.is_delete' => 0])
  107. ->andWhere(['OR' , ['po.id' => $pt_number], ['po.pt_number' => $pt_number]]);
  108. $goodsCount = $goodsCountQuery->sum('pod.num');
  109. $item['surplus_num_goods'] = $pt_activity['party_goods_count'] - (int)$goodsCount;
  110. }
  111. }
  112. }
  113. $item['order_id'] = 0;
  114. if ((int)$item['is_pay'] === 0 && (int)$item['trade_status'] !== 1) { //待付款
  115. $item['status'] = 1;
  116. $order_form = new OrderForm();
  117. $item['pay_type_list'] = $order_form->getPayTypeList();
  118. $item['createdDate'] = $item['created_at'];
  119. }
  120. if ((int)$item['is_pay'] === 1 && (int)$item['is_pt_finish'] === 0) { //进行中
  121. $item['status'] = 2;
  122. }
  123. if ((int)$item['is_pt_finish'] === 1 && (int)$item['is_winner'] === 1) { //已成功
  124. $item['status'] = 3;
  125. $order = Order::findOne(['pt_order_id' => $item['id']]);
  126. $item['order_id'] = $order->id ?? 0;
  127. }
  128. if (((int)$item['is_pt_finish'] === 1 && (int)$item['is_winner'] === 0) || ($item['created_at'] < $pay_end_time && (int)$item['is_pay'] === 0) || (int)$item['is_pt_finish'] === 2) { //已失败
  129. $item['status'] = 4;
  130. }
  131. $item['pt_number'] = (int)$pt_number;
  132. $item['is_pt_finish'] = intval($item['is_pt_finish']);
  133. unset($item['is_pay'], $item['trade_status'], $item['is_winner'], $item['pay_time']);
  134. }
  135. return [
  136. 'code' => 0,
  137. 'msg' => '',
  138. 'data' => [
  139. 'list' => $list['list'] ?? [],
  140. 'pageNo' => $list['pageNo'] ?? 0,
  141. 'totalCount' => $list['totalCount'] ?? 0
  142. ]
  143. ];
  144. } catch (\Exception $e) {
  145. return [
  146. 'code' => 1,
  147. 'msg' => $e->getMessage()
  148. ];
  149. }
  150. }
  151. /**
  152. * 拼团信息 成功 失败 进行中
  153. */
  154. public function orderInfo() {
  155. try {
  156. $pt_number = $this->pt_number;
  157. $pt_order_id = $this->pt_order_id;
  158. if (empty($pt_number)) {
  159. throw new \Exception("缺少必要参数");
  160. }
  161. $order = PtActivityOrder::findOne(['id' => $pt_number, 'is_pay' => 1]);
  162. if (empty($order)) {
  163. throw new \Exception("未找到对应的拼团数据");
  164. }
  165. //商品信息
  166. $order_detail = PtActivityOrderDetail::findOne(['order_id' => $pt_number]);
  167. $goods_id = $order_detail->goods_id;
  168. $activity_id = $order_detail->activity_id;
  169. $pt_goods = PtActivityGoods::findOne(['goods_id' => $goods_id, 'is_delete' => 0, 'activity_id' => $activity_id]);
  170. $activity = PtActivity::findOne($activity_id);
  171. $party_size = $activity->party_size;
  172. $activity_time = ($activity->split_time * 60 * 60);
  173. $goods_info = Goods::findOne($pt_goods->goods_id);
  174. if (empty($order_detail) || empty($pt_goods) || empty($activity) || empty($goods_info)) {
  175. throw new \Exception("拼团数据错误");
  176. }
  177. $goods = [
  178. 'name' => $order_detail->goods_name,
  179. 'id' => $goods_id,
  180. 'party_size' => $party_size,
  181. 'activity_id' => $activity_id,
  182. 'party_type' => $activity->party_type,
  183. 'party_goods_count' => $activity->party_goods_count,
  184. 'sale_num' => ($pt_goods->sale_num + $pt_goods->virtual_sales),
  185. 'pt_price' => $pt_goods->pt_price,
  186. 'price' => $goods_info->price,
  187. 'cover_pic' => $goods_info->cover_pic,
  188. 'num' => $goods_info->goods_num,
  189. 'store_id' => $goods_info->store_id
  190. ];
  191. $pt_attr = json_decode($pt_goods->attr, true);
  192. $pt_price_arr = array_column($pt_attr, 'pt_price');
  193. $pt_price_arr = array_filter($pt_price_arr);
  194. $goods['pt_price'] = sprintf("%.2f", min($pt_price_arr));
  195. //最高省的钱
  196. $diff_price = sprintf("%.2f", $goods_info->price - $goods['pt_price']);
  197. $pt_order = PtActivityOrder::find()->alias('o')
  198. ->where(['o.is_pay' => 1])
  199. ->leftJoin(['u' => User::tableName()], 'o.user_id = u.id')
  200. ->leftJoin(['su' => SaasUser::tableName()], 'u.binding = su.mobile')
  201. ->andWhere(['OR', ['o.id' => $pt_number], ['o.pt_number' => $pt_number]])
  202. ->select('su.name, su.avatar, o.id, o.is_winner')
  203. ->orderBy('o.pt_number asc')->asArray()->all();
  204. // $winner_order_id = 0;
  205. // foreach ($pt_order as $value) {
  206. // if ((int)$value['is_winner'] === 1) {
  207. // $winner_order_id = $value['id'];
  208. // }
  209. // }
  210. $current_num = count($pt_order);
  211. $surplus_num = $activity->party_type == 0 ? ($party_size - $current_num) : 0;
  212. $surplus_num_goods = 0;
  213. if($activity->party_type == 1){
  214. $goodsCountQuery = PtActivityOrderDetail::find()->alias('pod')
  215. ->leftJoin(['po' => PtActivityOrder::tableName()], 'pod.order_id = po.id')
  216. ->where(['po.is_pay' => 1, 'pod.is_delete' => 0])
  217. ->andWhere(['OR' , ['po.id' => $pt_number], ['po.pt_number' => $pt_number]]);
  218. $goodsCount = $goodsCountQuery->sum('pod.num');
  219. $surplus_num_goods = $activity->party_goods_count - (int)$goodsCount;
  220. }
  221. $end_time = 0;
  222. if ((int)$order->is_pt_finish === 0) {
  223. $end_time = ($order->pay_time + $activity_time) - time();
  224. $end_time = $end_time > 0 ? $end_time : 0;
  225. }
  226. $user_id = 0;
  227. $saas_user = get_saas_user();
  228. $user = User::findOne(['binding' => $saas_user->mobile, 'is_delete' => 0, 'store_id' => $activity->store_id]);
  229. if ($user) {
  230. $user_id = $user->id;
  231. }
  232. //查自己是否拼团成功
  233. $once_order = PtActivityOrder::find()->where(['is_pay' => 1, 'user_id' => $user_id])
  234. ->andWhere(['OR', ['id' => $pt_number], ['pt_number' => $pt_number]])
  235. ->select('is_winner, is_pt_finish')->asArray()->one();
  236. $status = 0;
  237. if (!empty($once_order)) {
  238. if ((int)$once_order['is_pt_finish'] === 0) { //进行中
  239. $status = 2;
  240. }
  241. if ((int)$once_order['is_pt_finish'] === 1 && (int)$once_order['is_winner'] === 1) {//成功
  242. $status = 3;
  243. }
  244. if (((int)$once_order['is_pt_finish'] === 1 && (int)$once_order['is_winner'] === 0) || $once_order['is_pt_finish'] === 2) {//失败
  245. $status = 4;
  246. }
  247. }
  248. //获取拼团成功人员
  249. $pt_msg = PtActivityOrder::find()->alias('o')->where(['is_winner' => 1])
  250. ->leftJoin(['u' => User::tableName()], 'o.user_id = u.id')
  251. ->leftJoin(['su' => SaasUser::tableName()], 'u.binding = su.mobile')
  252. ->leftJoin(['od' => PtActivityOrderDetail::tableName()], 'od.order_id = o.id')
  253. ->leftJoin(['g' => Goods::tableName()], 'od.goods_id = g.id')
  254. ->select('o.total_price, su.avatar, su.name, g.price, o.id')->orderBy('o.created_at desc')
  255. ->limit(1)
  256. ->asArray()->one();
  257. // foreach ($pt_msg as &$msg) {
  258. // $msg['diff_price'] = sprintf("%.2f", ($msg['price'] - $msg['total_price']));
  259. // }
  260. $order = Order::findOne(['pt_order_id' => $pt_number]);
  261. if (!$pt_msg) {
  262. $pt_msg = null;
  263. } else {
  264. $pt_msg['diff_price'] = sprintf("%.2f", ($pt_msg['price'] - $pt_msg['total_price']));
  265. }
  266. $pt_order_id = PtActivityOrder::find()->where(['OR', ['id' => $pt_number], ['pt_number' => $pt_number]])
  267. ->andWhere(['is_winner' => 1, 'saas_id' => get_saas_user_id()])->select('id')->asArray()->one();
  268. $order = Order::findOne(['pt_order_id' => $pt_order_id]);
  269. $order = [
  270. 'user_list' => $pt_order,
  271. 'diff_price' => $diff_price,
  272. 'party_type' => $activity->party_type,
  273. 'surplus_num_goods' => $surplus_num_goods,
  274. 'surplus_num' => $surplus_num,
  275. 'end_time' => $end_time,
  276. 'status' => $status,
  277. 'order_id' => $order->id
  278. ];
  279. return [
  280. 'code' => 0,
  281. 'msg' => "获取成功",
  282. 'data' => [
  283. 'goods' => $goods,
  284. 'order' => $order,
  285. 'pt_msg' => $pt_msg
  286. ]
  287. ];
  288. } catch (\Exception $e) {
  289. return [
  290. 'code' => 1,
  291. 'msg' => $e->getMessage()
  292. ];
  293. }
  294. }
  295. }