StoreOrderDao.php 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2016~2022 https://www.crmeb.com All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
  8. // +----------------------------------------------------------------------
  9. // | Author: CRMEB Team <admin@crmeb.com>
  10. // +----------------------------------------------------------------------
  11. namespace app\common\dao\store\order;
  12. use app\common\dao\BaseDao;
  13. use app\common\model\store\order\StoreOrder;
  14. use app\common\model\store\order\StoreOrderProduct;
  15. use app\common\model\store\order\StoreOrderStatus;
  16. use app\common\repositories\store\order\StoreOrderStatusRepository;
  17. use app\common\repositories\store\product\ProductAssistSetRepository;
  18. use app\common\repositories\store\product\ProductGroupBuyingRepository;
  19. use crmeb\jobs\SendSmsJob;
  20. use think\db\BaseQuery;
  21. use think\db\exception\DataNotFoundException;
  22. use think\db\exception\DbException;
  23. use think\db\exception\ModelNotFoundException;
  24. use think\facade\Db;
  25. use think\facade\Queue;
  26. use think\Model;
  27. /**
  28. * Class StoreOrderDao
  29. * @package app\common\dao\store\order
  30. * @author xaboy
  31. * @day 2020/6/8
  32. */
  33. class StoreOrderDao extends BaseDao
  34. {
  35. //订单状态(0:待发货;1:待收货;2:待评价;3:已完成; 9: 拼团中 10: 待付尾款 11:尾款超时未付 -1:已退款)
  36. const ORDER_STATUS_BE_SHIPPED = 0;
  37. const ORDER_STATUS_BE_RECEIVE = 1;
  38. const ORDER_STATUS_REPLY = 2;
  39. const ORDER_STATUS_SUCCESS = 3;
  40. const ORDER_STATUS_SPELL = 9;
  41. const ORDER_STATUS_TAIL = 10;
  42. const ORDER_STATUS_TAIL_FAIL = 11;
  43. const ORDER_STATUS_REFUND = -1;
  44. /**
  45. * @return string
  46. * @author xaboy
  47. * @day 2020/6/8
  48. */
  49. protected function getModel(): string
  50. {
  51. return StoreOrder::class;
  52. }
  53. /**
  54. * @param array $where
  55. * @param int $sysDel
  56. * @return BaseQuery
  57. * @author xaboyCRMEB
  58. * @day 2020/6/16
  59. */
  60. public function search(array $where, $sysDel = 0)
  61. {
  62. $query = StoreOrder::hasWhere('merchant', function ($query) use ($where) {
  63. if (isset($where['is_trader']) && $where['is_trader'] !== '') {
  64. $query->where('is_trader', $where['is_trader']);
  65. }
  66. $query->where('is_del',0);
  67. });
  68. $query->when(($sysDel !== null), function ($query) use ($sysDel) {
  69. $query->where('is_system_del', $sysDel);
  70. })
  71. ->when(isset($where['order_type']) && $where['order_type'] >= 0 && $where['order_type'] !== '', function ($query) use ($where) {
  72. if ($where['order_type'] == 2) {
  73. $query->where('is_virtual', 1);
  74. } else if($where['order_type'] == 0){ //实体发货订单
  75. $query->where('order_type', 0)->where('is_virtual',0);
  76. } else if($where['order_type'] == 3) { //发货订单
  77. $query->where('order_type', 0);
  78. } else {
  79. $query->where('order_type', $where['order_type']);
  80. }
  81. })
  82. ->when(isset($where['activity_type']) && $where['activity_type'] != '', function ($query) use ($where) {
  83. $query->where('activity_type', $where['activity_type']);
  84. })
  85. ->when(isset($where['status']) && $where['status'] !== '', function ($query) use ($where) {
  86. switch ($where['status']) {
  87. case 0 :
  88. $query->whereIn('StoreOrder.status', [0, 9]);
  89. break;
  90. case -2 :
  91. $query->where('paid', 1)->whereNotIn('StoreOrder.status', [10, 11]);
  92. break;
  93. case 10 :
  94. $query->where('paid', 1)->whereIn('StoreOrder.status', [10, 11]);
  95. break;
  96. default:
  97. $query->where('StoreOrder.status', $where['status']);
  98. break;
  99. }
  100. })
  101. ->when(isset($where['uid']) && $where['uid'] !== '', function ($query) use ($where) {
  102. $query->where('uid', $where['uid']);
  103. })
  104. ->when(isset($where['is_user']) && $where['is_user'] !== '', function ($query) use ($where) {
  105. $query->where(function($query) {
  106. $query->where('order_type',0)->whereOr(function($query){
  107. $query->where('order_type',1)->where('main_id',0);
  108. });
  109. });
  110. })
  111. //待核销订单
  112. ->when(isset($where['is_verify']) && $where['is_verify'], function ($query) use ($where) {
  113. $query->where('StoreOrder.order_type', 1)->where('StoreOrder.status',0);
  114. })
  115. ->when(isset($where['pay_type']) && $where['pay_type'] !== '', function ($query) use ($where) {
  116. $query->where('StoreOrder.pay_type', $where['pay_type']);
  117. })
  118. ->when(isset($where['order_ids']) && $where['order_ids'] !== '', function ($query) use ($where) {
  119. $query->whereIn('order_id', $where['order_ids']);
  120. })
  121. ->when(isset($where['order_id']) && $where['order_id'] !== '', function ($query) use ($where) {
  122. $query->where('order_id', $where['order_id']);
  123. })
  124. ->when(isset($where['take_order']) && $where['take_order'] != '', function ($query) use ($where) {
  125. $query->where('order_type', 1)->whereNotNull('verify_time');
  126. })
  127. ->when(isset($where['mer_id']) && $where['mer_id'] !== '', function ($query) use ($where) {
  128. $query->where('StoreOrder.mer_id', $where['mer_id']);
  129. })
  130. ->when(isset($where['date']) && $where['date'] !== '', function ($query) use ($where) {
  131. getModelTime($query, $where['date'], 'StoreOrder.create_time');
  132. })
  133. ->when(isset($where['verify_date']) && $where['verify_date'] !== '', function ($query) use ($where) {
  134. getModelTime($query, $where['verify_date'], 'verify_time');
  135. })
  136. ->when(isset($where['order_sn']) && $where['order_sn'] !== '', function ($query) use ($where) {
  137. $query->where('order_sn', 'like', '%' . $where['order_sn'] . '%');
  138. })
  139. ->when(isset($where['paid']) && $where['paid'] !== '', function ($query) use ($where) {
  140. $query->where('StoreOrder.paid', $where['paid']);
  141. })
  142. ->when(isset($where['is_del']) && $where['is_del'] !== '', function ($query) use ($where) {
  143. $query->where('StoreOrder.is_del', $where['is_del']);
  144. })
  145. ->when(isset($where['service_id']) && $where['service_id'] !== '', function ($query) use ($where) {
  146. $query->where('service_id', $where['service_id']);
  147. })
  148. ->when(isset($where['username']) && $where['username'] !== '', function ($query) use ($where) {
  149. $query->join('User U','StoreOrder.uid = U.uid')
  150. ->where(function($query) use($where) {
  151. $query->where('nickname', 'like', "%{$where['username']}%")
  152. ->whereOr('phone', 'like', "%{$where['username']}%")
  153. ->whereOr('user_phone', 'like', "%{$where['username']}%");
  154. });
  155. })
  156. ->when(isset($where['store_name']) && $where['store_name'] !== '', function ($query) use ($where) {
  157. $orderId = StoreOrderProduct::alias('op')
  158. ->join('storeProduct sp','op.product_id = sp.product_id')
  159. ->whereLike('store_name',"%{$where['store_name']}%")
  160. ->when((isset($where['sp.mer_id']) && $where['mer_id'] !== ''),function($query) use($where){
  161. $query->where('mer_id',$where['mer_id']);
  162. })->column('order_id');
  163. $query->whereIn('order_id',$orderId ?: '' );
  164. })
  165. ->when(isset($where['search']) && $where['search'] !== '', function ($query) use ($where) {
  166. $orderId = StoreOrderProduct::alias('op')
  167. ->join('storeProduct sp','op.product_id = sp.product_id')
  168. ->whereLike('store_name',"%{$where['search']}%")
  169. ->when((isset($where['sp.mer_id']) && $where['mer_id'] !== ''),function($query) use($where){
  170. $query->where('mer_id',$where['mer_id']);
  171. })->column('order_id');
  172. $query->where(function($query) use($orderId,$where){
  173. $query->whereIn('order_id',$orderId ? $orderId : '')
  174. ->whereOr('order_sn','like',"%{$where['search']}%")
  175. ->whereOr('user_phone','like',"%{$where['search']}%");
  176. });
  177. })
  178. ->when(isset($where['group_order_sn']) && $where['group_order_sn'] !== '', function ($query) use ($where) {
  179. $query->join('StoreGroupOrder GO','StoreOrder.group_order_id = GO.group_order_id')->where('group_order_sn',$where['group_order_sn']);
  180. })
  181. ->when(isset($where['keywords']) && $where['keywords'] !== '', function ($query) use ($where) {
  182. $query->where(function ($query) use ($where) {
  183. $query->whereLike('StoreOrder.real_name|StoreOrder.user_phone|order_sn', "%" . $where['keywords'] . "%");
  184. });
  185. })
  186. ->when(isset($where['reconciliation_type']) && $where['reconciliation_type'] !== '', function ($query) use ($where) {
  187. $query->when($where['reconciliation_type'], function ($query) use ($where) {
  188. $query->where('reconciliation_id', '<>', 0);
  189. }, function ($query) use ($where) {
  190. $query->where('reconciliation_id', 0);
  191. });
  192. })->order('StoreOrder.create_time DESC');
  193. return $query;
  194. }
  195. public function groupBuyingStatus(array $orderIds, $status)
  196. {
  197. if (!count($orderIds)) return 0;
  198. $make = app()->make(StoreOrderStatusRepository::class);
  199. foreach ($orderIds as $id){
  200. $make->status($id,$make::ORDER_STATUS_GROUP_SUCCESS,'拼团成功');
  201. }
  202. return StoreOrder::getDB()->whereIn('order_id', $orderIds)->update(compact('status'));
  203. }
  204. /**
  205. * @param $id
  206. * @param $uid
  207. * @return array|Model|null
  208. * @throws DataNotFoundException
  209. * @throws DbException
  210. * @throws ModelNotFoundException
  211. * @author xaboy
  212. * @day 2020/6/11
  213. */
  214. public function userOrder($id, $uid)
  215. {
  216. return StoreOrder::getDB()->where('order_id', $id)->where('uid', $uid)->where('is_del', 0)->where('paid', 1)->where('is_system_del', 0)->find();
  217. }
  218. /**
  219. * @param array $where
  220. * @param $ids
  221. * @return BaseQuery
  222. * @author xaboy
  223. * @day 2020/6/26
  224. */
  225. public function usersOrderQuery(array $where, $ids, $uid)
  226. {
  227. return StoreOrder::getDB()->where(function ($query) use ($uid, $ids) {
  228. $query->whereIn('uid', $ids)->whereOr(function ($query) use ($uid) {
  229. if ($uid) {
  230. $query->where('uid', $uid)->where('is_selfbuy', 1);
  231. }
  232. });
  233. })->when(isset($where['date']) && $where['date'] !== '', function ($query) use ($where) {
  234. getModelTime($query, $where['date'], 'pay_time');
  235. })->when(isset($where['keyword']) && $where['keyword'] !== '', function ($query) use ($where) {
  236. $query->whereLike('order_id|order_sn', "%{$where['keyword']}%");
  237. })->where('paid', 1)->order('pay_time DESC');
  238. }
  239. /**
  240. * @param $field
  241. * @param $value
  242. * @param int|null $except
  243. * @return bool
  244. * @author xaboy
  245. * @day 2020/6/11
  246. */
  247. public function fieldExists($field, $value, ?int $except = null): bool
  248. {
  249. return ($this->getModel()::getDB())->when($except, function ($query) use ($field, $except) {
  250. $query->where($field, '<>', $except);
  251. })->where($field, $value)->count() > 0;
  252. }
  253. /**
  254. * @param $id
  255. * @return mixed
  256. * @author xaboy
  257. * @day 2020/6/12
  258. */
  259. public function getMerId($id)
  260. {
  261. return StoreOrder::getDB()->where('order_id', $id)->value('mer_id');
  262. }
  263. /**
  264. * @param array $where
  265. * @return bool
  266. * @author Qinii
  267. * @day 2020-06-12
  268. */
  269. public function merFieldExists(array $where)
  270. {
  271. return ($this->getModel()::getDB())->where($where)->count() > 0;
  272. }
  273. /**
  274. * TODO
  275. * @param $reconciliation_id
  276. * @return mixed
  277. * @author Qinii
  278. * @day 2020-06-15
  279. */
  280. public function reconciliationUpdate($reconciliation_id)
  281. {
  282. return ($this->getModel()::getDB())->whereIn('reconciliation_id', $reconciliation_id)->update(['reconciliation_id' => 0]);
  283. }
  284. public function dayOrderNum($day, $merId = null)
  285. {
  286. return StoreOrder::getDB()->where('paid', 1)->when($merId, function ($query, $merId) {
  287. $query->where('mer_id', $merId);
  288. })->when($day, function ($query, $day) {
  289. getModelTime($query, $day, 'pay_time');
  290. })->count();
  291. }
  292. public function dayOrderPrice($day, $merId = null)
  293. {
  294. return getModelTime(StoreOrder::getDB()->where('paid', 1)->when($merId, function ($query, $merId) {
  295. $query->where('mer_id', $merId);
  296. }), $day, 'pay_time')->sum('pay_price');
  297. }
  298. public function dateOrderPrice($date, $merId = null)
  299. {
  300. return StoreOrder::getDB()->where('paid', 1)->when($merId, function ($query, $merId) {
  301. $query->where('mer_id', $merId);
  302. })->when($date, function ($query, $date) {
  303. getModelTime($query, $date, 'pay_time');
  304. })->sum('pay_price');
  305. }
  306. public function dateOrderNum($date, $merId = null)
  307. {
  308. return StoreOrder::getDB()->where('paid', 1)->when($merId, function ($query, $merId) {
  309. $query->where('mer_id', $merId);
  310. })->when($date, function ($query, $date) {
  311. getModelTime($query, $date, 'pay_time');
  312. })->count();
  313. }
  314. public function dayOrderUserNum($day, $merId = null)
  315. {
  316. return StoreOrder::getDB()->where('paid', 1)->when($merId, function ($query, $merId) {
  317. $query->where('mer_id', $merId);
  318. })->when($day, function ($query, $day) {
  319. getModelTime($query, $day, 'pay_time');
  320. })->group('uid')->count();
  321. }
  322. public function orderUserNum($date, $paid = null, $merId = null)
  323. {
  324. return StoreOrder::getDB()->when($paid, function ($query, $paid) {
  325. $query->where('paid', $paid);
  326. })->when($merId, function ($query, $merId) {
  327. $query->where('mer_id', $merId);
  328. })->when($date, function ($query, $date) use ($paid) {
  329. if (!$paid) {
  330. getModelTime($query, $date);
  331. // $query->where(function ($query) use ($date) {
  332. // $query->where(function ($query) use ($date) {
  333. // $query->where('paid', 1);
  334. // getModelTime($query, $date, 'pay_time');
  335. // })->whereOr(function ($query) use ($date) {
  336. // $query->where('paid', 0);
  337. // getModelTime($query, $date);
  338. // });
  339. // });
  340. } else
  341. getModelTime($query, $date, 'pay_time');
  342. })->group('uid')->count();
  343. }
  344. public function orderUserGroup($date, $paid = null, $merId = null)
  345. {
  346. return StoreOrder::getDB()->when($paid, function ($query, $paid) {
  347. $query->where('paid', $paid);
  348. })->when($merId, function ($query, $merId) {
  349. $query->where('mer_id', $merId);
  350. })->when($date, function ($query, $date) {
  351. getModelTime($query, $date, 'pay_time');
  352. })->group('uid')->field(Db::raw('uid,sum(pay_price) as pay_price,count(order_id) as total'))->select();
  353. }
  354. public function oldUserNum(array $ids, $merId = null)
  355. {
  356. return StoreOrder::getDB()->when($merId, function ($query, $merId) {
  357. $query->where('mer_id', $merId);
  358. })->whereIn('uid', $ids)->where('paid', 1)->group('uid')->count();
  359. }
  360. public function oldUserIds(array $ids, $merId = null)
  361. {
  362. return StoreOrder::getDB()->when($merId, function ($query, $merId) {
  363. $query->where('mer_id', $merId);
  364. })->whereIn('uid', $ids)->where('paid', 1)->group('uid')->column('uid');
  365. }
  366. public function orderPrice($date, $paid = null, $merId = null)
  367. {
  368. return StoreOrder::getDB()->when($paid, function ($query, $paid) {
  369. $query->where('paid', $paid);
  370. })->when($merId, function ($query, $merId) {
  371. $query->where('mer_id', $merId);
  372. })->when($date, function ($query, $date) use ($paid) {
  373. if (!$paid) {
  374. $query->where(function ($query) use ($date) {
  375. $query->where(function ($query) use ($date) {
  376. $query->where('paid', 1);
  377. getModelTime($query, $date, 'pay_time');
  378. })->whereOr(function ($query) use ($date) {
  379. $query->where('paid', 0);
  380. getModelTime($query, $date);
  381. });
  382. });
  383. } else
  384. getModelTime($query, $date, 'pay_time');
  385. })->sum('pay_price');
  386. }
  387. public function orderGroupNum($date, $merId = null)
  388. {
  389. $field = Db::raw('sum(pay_price) as pay_price,count(*) as total,count(distinct uid) as user,pay_time,from_unixtime(unix_timestamp(pay_time),\'%m-%d\') as `day`');
  390. if ($date == 'year'){
  391. $field = Db::raw('sum(pay_price) as pay_price,count(*) as total,count(distinct uid) as user,pay_time,from_unixtime(unix_timestamp(pay_time),\'%m\') as `day`');
  392. }
  393. $query = StoreOrder::getDB()->field($field)
  394. ->where('paid', 1)->when($date, function ($query, $date) {
  395. getModelTime($query, $date, 'pay_time');
  396. })->when($merId, function ($query, $merId) {
  397. $query->where('mer_id', $merId);
  398. });
  399. return $query->order('pay_time ASC')->group('day')->select();
  400. }
  401. public function orderGroupNumPage($where, $page, $limit, $merId = null)
  402. {
  403. return StoreOrder::getDB()->when(isset($where['dateRange']), function ($query) use ($where) {
  404. getModelTime($query, date('Y/m/d 00:00:00', $where['dateRange']['start']) . '-' . date('Y/m/d 00:00:00', $where['dateRange']['stop']), 'pay_time');
  405. })->field(Db::raw('sum(pay_price) as pay_price,count(*) as total,count(distinct uid) as user,pay_time,from_unixtime(unix_timestamp(pay_time),\'%m-%d\') as `day`'))
  406. ->where('paid', 1)->when($merId, function ($query, $merId) {
  407. $query->where('mer_id', $merId);
  408. })->order('pay_time DESC')->page($page, $limit)->group('day')->select();
  409. }
  410. public function dayOrderPriceGroup($date, $merId = null)
  411. {
  412. return StoreOrder::getDB()->field(Db::raw('sum(pay_price) as price, from_unixtime(unix_timestamp(pay_time),\'%H:%i\') as time'))
  413. ->where('paid', 1)->when($date, function ($query, $date) {
  414. getModelTime($query, $date, 'pay_time');
  415. })->when($merId, function ($query, $merId) {
  416. $query->where('mer_id', $merId);
  417. })->group('time')->select();
  418. }
  419. public function dayOrderNumGroup($date, $merId = null)
  420. {
  421. return StoreOrder::getDB()->field(Db::raw('count(*) as total, from_unixtime(unix_timestamp(pay_time),\'%H:%i\') as time'))
  422. ->where('paid', 1)->when($date, function ($query, $date) {
  423. getModelTime($query, $date, 'pay_time');
  424. })->when($merId, function ($query, $merId) {
  425. $query->where('mer_id', $merId);
  426. })->group('time')->select();
  427. }
  428. public function dayOrderUserGroup($date, $merId = null)
  429. {
  430. return StoreOrder::getDB()->field(Db::raw('count(DISTINCT uid) as total, from_unixtime(unix_timestamp(pay_time),\'%H:%i\') as time'))
  431. ->where('paid', 1)->when($date, function ($query, $date) {
  432. getModelTime($query, $date, 'pay_time');
  433. })->when($merId, function ($query, $merId) {
  434. $query->where('mer_id', $merId);
  435. })->group('time')->select();
  436. }
  437. /**
  438. * 获取当前时间到指定时间的支付金额 管理员
  439. * @param string $start 开始时间
  440. * @param string $stop 结束时间
  441. * @return mixed
  442. */
  443. public function chartTimePrice($start, $stop, $merId = null)
  444. {
  445. return StoreOrder::getDB()->where('paid', 1)
  446. ->where('pay_time', '>=', $start)
  447. ->where('pay_time', '<', $stop)
  448. ->when($merId, function ($query, $merId) {
  449. $query->where('mer_id', $merId);
  450. })
  451. ->field('sum(pay_price) as num,FROM_UNIXTIME(unix_timestamp(pay_time), \'%Y-%m-%d\') as time')
  452. ->group('time')
  453. ->order('pay_time ASC')->select()->toArray();
  454. }
  455. /**
  456. * @param $date
  457. * @param null $merId
  458. * @return mixed
  459. */
  460. public function chartTimeNum($date, $merId = null)
  461. {
  462. return StoreOrder::getDB()->where('paid', 1)->when($date, function ($query) use ($date) {
  463. getModelTime($query, $date, 'pay_time');
  464. })->when($merId, function ($query, $merId) {
  465. $query->where('mer_id', $merId);
  466. })->field('count(order_id) as num,FROM_UNIXTIME(unix_timestamp(pay_time), \'%Y-%m-%d\') as time')
  467. ->group('time')
  468. ->order('pay_time ASC')->select()->toArray();
  469. }
  470. /**
  471. * @param $end
  472. * @return mixed
  473. * @author xaboy
  474. * @day 2020/9/16
  475. */
  476. public function getFinishTimeoutIds($end)
  477. {
  478. return StoreOrderStatus::getDB()->alias('A')->leftJoin('StoreOrder B', 'A.order_id = B.order_id')
  479. ->where('A.change_type', 'take')
  480. ->where('A.change_time', '<', $end)->where('B.paid', 1)->where('B.status', 2)
  481. ->column('A.order_id');
  482. }
  483. /**
  484. * TODO 参与人数
  485. * @param array $data
  486. * @param int|null $uid
  487. * @return BaseQuery
  488. * @author Qinii
  489. * @day 2020-11-11
  490. */
  491. public function getTattendCount(array $data,?int $uid)
  492. {
  493. $query = StoreOrder::hasWhere('orderProduct',function($query)use($data,$uid){
  494. $query->when(isset($data['activity_id']),function ($query)use($data){
  495. $query->where('activity_id',$data['activity_id']);
  496. })
  497. ->when(isset($data['product_sku']),function ($query)use($data){
  498. $query->where('product_sku',$data['product_sku']);
  499. })
  500. ->when(isset($data['product_id']),function ($query)use($data){
  501. $query->where('product_id',$data['product_id']);
  502. })
  503. ->when(isset($data['exsits_id']),function ($query)use ($data){
  504. switch ($data['product_type']){
  505. case 3:
  506. $make = app()->make(ProductAssistSetRepository::class);
  507. $id = 'product_assist_id';
  508. break;
  509. case 4:
  510. $make = app()->make(ProductGroupBuyingRepository::class);
  511. $id = 'product_group_id';
  512. break;
  513. }
  514. $where = [$id => $data['exsits_id']];
  515. $activity_id = $make->getSearch($where)->column($make->getPk());
  516. if($activity_id) {
  517. $id = array_unique($activity_id);
  518. $query->where('activity_id','in',$id);
  519. }else{
  520. $query->where('activity_id','<',0);
  521. }
  522. })
  523. ->where('product_type',$data['product_type']);
  524. if($uid) $query->where('uid',$uid);
  525. });
  526. $query->where('activity_type',$data['product_type']);
  527. switch($data['product_type'])
  528. {
  529. case 0:
  530. $query->where(function($query){
  531. $query->where(function($query){
  532. $query->where('paid',1);
  533. })->whereOr(function($query){
  534. $query->where('paid',0)->where('is_del',0);
  535. });
  536. });
  537. break;
  538. case 1: //秒杀
  539. $query->where(function($query){
  540. $query->where(function($query){
  541. $query->where('paid',1);
  542. })->whereOr(function($query){
  543. $query->where('paid',0)->where('is_del',0);
  544. });
  545. })->when(isset($data['day']), function ($query) use ($data) {
  546. $query->whereDay('StoreOrder.create_time', $data['day']);
  547. });
  548. break;
  549. case 2: //预售
  550. /**
  551. * 第一阶段参与人数:所有人
  552. * 第二阶段参与人数:支付了第一阶段
  553. */
  554. //第二阶段
  555. if($data['type'] == 1){
  556. $query->where(function($query){
  557. $query->where('paid',1)->whereOr(function($query){
  558. $query->where('paid',0)->where('is_del',0);
  559. });
  560. });
  561. }
  562. if($data['type'] == 2) $query->where('paid',1)->where('status','in',[0,1,2,3,-1]);
  563. break;
  564. case 3: //助力
  565. $query->where(function($query){
  566. $query->where('paid',1)->whereOr(function($query){
  567. $query->where('paid',0)->where('is_del',0);
  568. });
  569. });
  570. break;
  571. case 4: //
  572. $query->where(function($query){
  573. $query->where('paid',1)->whereOr(function($query){
  574. $query->where('paid',0)->where('is_del',0);
  575. })
  576. ->where('status','>',-1);
  577. });
  578. break;
  579. }
  580. return $query;
  581. }
  582. /**
  583. * 未使用
  584. * TODO 成功支付人数
  585. * @param int $productType
  586. * @param int $activityId
  587. * @param int|null $uid
  588. * @param int|null $status
  589. * @author Qinii
  590. * @day 2020-10-30
  591. */
  592. public function getTattendSuccessCount($data,?int $uid)
  593. {
  594. $query = StoreOrder::hasWhere('orderProduct',function($query)use($data,$uid){
  595. $query->when(isset($data['activity_id']),function ($query)use($data){
  596. $query->where('activity_id',$data['activity_id']);
  597. })
  598. ->when(isset($data['product_sku']),function ($query)use($data){
  599. $query->where('product_sku',$data['product_sku']);
  600. })
  601. ->when(isset($data['product_id']),function ($query)use($data){
  602. $query->where('product_id',$data['product_id']);
  603. })
  604. ->when(isset($data['exsits_id']),function ($query)use ($data){
  605. switch ($data['product_type']){
  606. case 3:
  607. $make = app()->make(ProductAssistSetRepository::class);
  608. $id = 'product_assist_id';
  609. break;
  610. case 4:
  611. $make = app()->make(ProductGroupBuyingRepository::class);
  612. $id = 'product_group_id';
  613. break;
  614. }
  615. $where = [$id => $data['exsits_id']];
  616. $activity_id = $make->getSearch($where)->column($make->getPk());
  617. if($activity_id) {
  618. $id = array_unique($activity_id);
  619. $query->where('activity_id','in',$id);
  620. }else{
  621. $query->where('activity_id','<',0);
  622. }
  623. })
  624. ->where('product_type',$data['product_type']);
  625. if($uid) $query->where('uid',$uid);
  626. });
  627. $query->where('activity_type',$data['product_type'])->where('paid',1);
  628. switch($data['product_type'])
  629. {
  630. case 1: //秒杀
  631. $query->where(function($query){
  632. $query->where(function($query){
  633. $query->where('paid',1);
  634. });
  635. })->when(isset($data['day']), function ($query) use ($data) {
  636. $query->whereDay('StoreOrder.create_time', $data['day']);
  637. });
  638. break;
  639. case 2: //预售
  640. if($data['type'] == 1){ //第一阶段
  641. $query->where('status','in',[0,1,2,3,10]);
  642. } else { //第二阶段
  643. $query->where('status','in',[0,1,2,3]);
  644. }
  645. break;
  646. case 3: //助力
  647. break;
  648. case 4:
  649. break;
  650. }
  651. return $query;
  652. }
  653. /**
  654. * TODO 获取退款单数量
  655. * @param $where
  656. * @return mixed
  657. * @author Qinii
  658. * @day 1/4/21
  659. */
  660. public function getSeckillRefundCount($where,$type = 1)
  661. {
  662. $query = StoreOrderProduct::getDB()->alias('P')->join('StoreRefundOrder R','P.order_id = R.order_id');
  663. $query->join('StoreOrder O','O.order_id = P.order_id');
  664. $query
  665. ->when(isset($where['activity_id']),function ($query)use($where){
  666. $query->where('P.activity_id',$where['activity_id']);
  667. })
  668. ->when(isset($where['product_sku']),function ($query)use($where){
  669. $query->where('P.product_sku',$where['product_sku']);
  670. })
  671. ->when(isset($where['day']), function ($query) use ($where) {
  672. $query->whereDay('P.create_time', $where['day']);
  673. })
  674. ->when($type == 1, function ($query) use ($where) {
  675. $query->where('O.verify_time',null)->where('O.delivery_type',null);
  676. },function ($query){
  677. $query ->where('R.refund_type',2);
  678. })
  679. ->where('P.product_type',1)->where('R.status',3);
  680. return $query->count();
  681. }
  682. /**
  683. * TODO 用户的某个商品购买数量
  684. * @param int $uid
  685. * @param int $productId
  686. * @return int
  687. * @author Qinii
  688. * @day 2022/9/26
  689. */
  690. public function getMaxCountNumber(int $uid, int $productId)
  691. {
  692. return StoreOrder::hasWhere('orderProduct',function($query) use($productId){
  693. $query->where('product_id', $productId);
  694. })
  695. ->where(function($query) {
  696. $query->where('is_del',0)->whereOr(function($query){
  697. $query->where('is_del',1)->where('paid',1);
  698. });
  699. })->where('StoreOrder.uid',$uid)->count()
  700. ;
  701. }
  702. }