StoreOrderDao.php 31 KB

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