OrderService.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388
  1. <?php
  2. namespace App\JsonRpc;
  3. use App\Model\Ad;
  4. use App\Model\AdPlace;
  5. use App\Model\Order;
  6. use App\Model\OrderAd;
  7. use App\Model\Website;
  8. use App\Tools\Result;
  9. use Hyperf\RpcServer\Annotation\RpcService;
  10. use Carbon\Carbon;
  11. use Hamcrest\Arrays\IsArray;
  12. use DateTime;
  13. use DateInterval;
  14. #[RpcService(name: "OrderService", protocol: "jsonrpc-http", server: "jsonrpc-http")]
  15. class OrderService implements OrderServiceInterface
  16. {
  17. /**
  18.  * 查询没有广告的广告位
  19.  * @param
  20.  * @return void
  21. */
  22. public function getAD(array $data): array
  23. {
  24. $where = [
  25. 'ad_place.width' => $data['width'],
  26. 'ad_place.height' => $data['height']
  27. ];
  28. $start=Carbon::parse($data['starttime']);
  29. $end=Carbon::parse($data['endtime']);
  30. $status = [
  31. 0=>'1',
  32. 1=>'4',
  33. 2=>'6'
  34. ];
  35. $ads = Ad::where('fromtime','<=',$start)->where('totime','>=',$end)->select('pid')->get()->all();
  36. $orderads = OrderAd::where('fromtime','<=',$start)->where('totime','>=',$end)->whereIn('status',$status)->select('pid')->get()->all();
  37. $pids = array_merge($ads, $orderads);
  38. $ad_pids = array_unique($pids);
  39. // $ad_pid = [1,2,3];
  40. if(!empty($ad_pids)){
  41. $pid = [];
  42. foreach($ad_pids as $val){
  43. array_push($pid,$val['pid']);
  44. }
  45. $placeids = AdPlace::whereNotIn('id',$pid)->where($where)->select('id')->get()->all();
  46. // 符合用户条件的空广告位
  47. $place_id = [];
  48. foreach($placeids as $val){
  49. array_push($place_id,$val['id']);
  50. }
  51. $rep = AdPlace::whereIn('ad_place.id',$place_id)
  52. ->leftJoin('website','ad_place.website_id','website.id')
  53. ->select('ad_place.*','website.website_name','website.id')
  54. ->selectSub('website.id', 'webid')
  55. ->selectSub('ad_place.id', 'pid')
  56. ->orderBy("website.id","asc")
  57. ->limit($data['pageSize'])
  58. ->offset(($data['page']-1)*$data['pageSize'])
  59. ->get();
  60. }else{
  61. $rep = AdPlace::where($where)
  62. ->leftJoin('website','ad_place.website_id','website.id')
  63. ->select('ad_place.*','website.website_name','website.id')
  64. ->selectSub('website.id', 'webid')
  65. ->selectSub('ad_place.id', 'pid')
  66. ->orderBy("website.id","asc")
  67. ->limit($data['pageSize'])
  68. ->offset(($data['page']-1)*$data['pageSize'])
  69. ->get();
  70. }
  71. $startTime = strtotime($data['starttime']);
  72. $endTime = strtotime($data['endtime']);
  73. $time = ($endTime - $startTime)/(24 * 60 * 60);
  74. $roundedValue = round($time, 2);
  75. $days = number_format($roundedValue, 2, '.', '');
  76. $count = count($rep);
  77. $data = [
  78. 'rows'=>$rep->toArray(),
  79. 'count'=>$count,
  80. 'days' => $days
  81. ];
  82. if(empty($rep)){
  83. return Result::error("暂时没有符合您条件的广告位");
  84. }
  85. return Result::success($data);
  86. }
  87. /**
  88.  * 根据用户条件及网站搜索没有广告的广告位
  89.  * @param
  90.  * @return void
  91. */
  92. public function getWebsiteAd(array $data): array
  93. {
  94. $where = [
  95. 'ad_place.width' => $data['width'],
  96. 'ad_place.height' => $data['height']
  97. ];
  98. $start=Carbon::parse($data['starttime']);
  99. $end=Carbon::parse($data['endtime']);
  100. $status = [
  101. 0=>'1',
  102. 1=>'4',
  103. 2=>'6'
  104. ];
  105. $ads = Ad::where('fromtime','<=',$start)->where('totime','>=',$end)->select('pid')->get()->all();
  106. $orderads = OrderAd::where('fromtime','<=',$start)->where('totime','>=',$end)->whereIn('status',$status)->select('pid')->get()->all();
  107. $pids = array_merge($ads, $orderads);
  108. $ad_pids = array_unique($pids);
  109. if(!empty($ad_pids)){
  110. $pid = [];
  111. foreach($ad_pids as $val){
  112. array_push($pid,$val['pid']);
  113. }
  114. $placeids = AdPlace::whereNotIn('id',$pid)->where($where)->select('id','website_id')->get()->all();
  115. if(!isset($data['website_id'])){
  116. $website_id = [];
  117. foreach($placeids as $v){
  118. array_push($website_id,$v['website_id']);
  119. }
  120. $result = Website::whereIn('id',$website_id)->get();
  121. }else{
  122. $place_id = [];
  123. foreach($placeids as $val){
  124. array_push($place_id,$val['id']);
  125. }
  126. $rep = AdPlace::where($where)
  127. ->whereIn('ad_place.id',$place_id)
  128. ->where('ad_place.website_id',$data['website_id'])
  129. ->leftJoin('website','ad_place.website_id','website.id')
  130. ->select('ad_place.*','website.website_name','website.id')
  131. ->selectSub('website.id', 'webid')
  132. ->selectSub('ad_place.id', 'pid')
  133. ->orderBy("website.id","asc")
  134. ->limit($data['pageSize'])
  135. ->offset(($data['page']-1)*$data['pageSize'])
  136. ->get();
  137. $count = count($rep);
  138. $result = [
  139. 'rows'=>$rep->toArray(),
  140. 'count'=>$count
  141. ];
  142. }
  143. }else{
  144. if(isset($data['website_id'])){
  145. $rep = AdPlace::where($where)
  146. ->where('ad_place.website_id',$data['website_id'])
  147. ->leftJoin('website','ad_place.website_id','website.id')
  148. ->select('ad_place.*','website.website_name','website.id')
  149. ->selectSub('website.id', 'webid')
  150. ->selectSub('ad_place.id', 'pid')
  151. ->orderBy("website.id","asc")
  152. ->limit($data['pageSize'])
  153. ->offset(($data['page']-1)*$data['pageSize'])
  154. ->get();
  155. $count = count($rep);
  156. $result = [
  157. 'rows'=>$rep->toArray(),
  158. 'count'=>$count
  159. ];
  160. }else{
  161. $place_all = AdPlace::where($where)->select('website_id')->get()->all();
  162. $place_allads = [];
  163. foreach($place_all as $v){
  164. array_push($place_allads,$v['website_id']);
  165. }
  166. $result = Website::whereIn('id',$place_allads)->get();
  167. }
  168. }
  169. if(empty($data)){
  170. return Result::error("暂时没有符合您条件的广告位");
  171. }
  172. $startTime = strtotime($data['starttime']);
  173. $endTime = strtotime($data['endtime']);
  174. $time = ($endTime - $startTime)/(24 * 60 * 60);
  175. $roundedValue = round($time, 2);
  176. $days = number_format($roundedValue, 2, '.', '');
  177. $count = count($rep);
  178. $result['days'] = $days;
  179. return Result::success($result);
  180. }
  181. /**
  182.  * 添加广告订单
  183.  * @param
  184.  * @return void
  185. */
  186. public function addAD(array $data): array
  187. {
  188. date_default_timezone_set('Asia/Shanghai');
  189. $time = time();
  190. $startTime = strtotime($data['starttime']);
  191. $endTime = strtotime($data['endtime']);
  192. $con_time = ($endTime - $startTime)/(24 * 60 * 60);
  193. $roundedValue = round($con_time, 2);
  194. $days = number_format($roundedValue, 2, '.', '');
  195. $timestamp = date('YmdHis',$time);
  196. $catetime = date('Y-m-d H:i:s',$time);
  197. $randomNumber = mt_rand(1000, 9999);
  198. $ordernum = $randomNumber . $timestamp; // 时间戳与随机数拼接
  199. // var_dump(($time));
  200. $order = [
  201. 'order_num' => $ordernum,
  202. 'sttime' => $data['starttime'],
  203. 'edtime' => $data['endtime'],
  204. 'user_id' => $data['user_id'],
  205. 'cttime' => $catetime,
  206. 'height' => $data['height'],
  207. 'width' => $data['width'],
  208. 'days' => $days
  209. ];
  210. $orderid = Order::insertGetId($order);
  211. $adplace = $data['pid'];
  212. if(is_array($data['pid'])){
  213. $adplace = AdPlace::whereIn('id',$data['pid'])->select('website_id','id')->get();
  214. foreach($adplace as $key => $ads){
  215. $order_ad[$key] = [
  216. 'order_id' => $orderid,
  217. 'order_num' => $ordernum,
  218. 'name' => $data['name'],
  219. 'fromtime' => $data['starttime'],
  220. 'totime' => $data['endtime'],
  221. 'image_src' => $data['imgsrc'],
  222. 'image_url' => $data['imgurl'],
  223. 'pid' => $ads['id'],
  224. 'website_id' => $ads['website_id']
  225. ];
  226. // $log = [
  227. // 'order_id' => $orderid,
  228. // 'user_id' => $data['user_id'],
  229. // 'pid' => $ads['id'],
  230. // 'website_id' => $ads['website_id'],
  231. // 'action' => '添加',
  232. // 'time' => $catetime
  233. // ];
  234. }
  235. }else{
  236. $order_ad = [
  237. 'order_id' => $orderid,
  238. 'order_num' => $ordernum,
  239. 'name' => $data['name'],
  240. 'website_id' => $adplace['website_id'],
  241. 'fromtime' => $data['starttime'],
  242. 'totime' => $data['endtime'],
  243. 'image_src' => $data['imgsrc'],
  244. 'image_url' => $data['imgurl'],
  245. 'pid' => $adplace
  246. ];
  247. // $log = [
  248. // 'order_id' => $orderid,
  249. // 'user_id' => $data['user_id'],
  250. // 'pid' => $adplace,
  251. // 'website_id' => $ads['website_id'],
  252. // 'action' => '添加',
  253. // 'time' => $catetime
  254. // ];
  255. }
  256. $orderad_id = OrderAd::insert($order_ad);
  257. // $log = AdLog::insert($log);
  258. if(empty($orderid) || !$orderad_id){
  259. return Result::error("添加失败");
  260. }
  261. $result = [
  262. 'order_id' => $orderid,
  263. 'orderad_id' => $orderad_id,
  264. 'name' => $data['name'],
  265. '$ordernum' => $ordernum,
  266. ];
  267. return Result::success($result);
  268. }
  269. /**
  270.  * 获取订单列表
  271.  * @param
  272.  * @return void
  273. */
  274. public function getOrderList(array $data): array
  275. {
  276. $where = [
  277. 'user_id' => $data['user_id'],
  278. 'user_del' => 2
  279. ];
  280. if(isset($data['status'])){
  281. $where['status'] = $data['status'];
  282. }
  283. $orders = Order::where($where)
  284. ->orderBy("id","asc")
  285. ->limit($data['pageSize'])
  286. ->offset(($data['page']-1)*$data['pageSize'])
  287. ->get();
  288. if(empty($orders)){
  289. return Result::error("您暂时还没有下单");
  290. }else{
  291. $count = count($orders);
  292. $data = [
  293. 'rows'=>$orders->toArray(),
  294. 'count'=>$count
  295. ];
  296. }
  297. return Result::success($data);
  298. }
  299. /**
  300.  * 获取订单详情
  301.  * @param
  302.  * @return void
  303. */
  304. public function getOrderDetail(array $data): array
  305. {
  306. $order = Order::where('id',$data['order_id'])->first();
  307. $orderads = OrderAd::where('order_ad.order_id',$data['order_id'])
  308. ->leftJoin('website','order_ad.website_id','website.id')
  309. ->select('order_ad.*','website.website_name','website.id')
  310. ->selectSub('website.id', 'webid')
  311. ->selectSub('order_ad.id', 'oid')
  312. ->orderBy("website.id","asc")
  313. ->limit($data['pageSize'])
  314. ->offset(($data['page']-1)*$data['pageSize'])
  315. ->get();
  316. if(empty($order)){
  317. return Result::error("订单id错误");
  318. }
  319. $result = [
  320. 'order' => $order,
  321. 'orderads' => $orderads
  322. ];
  323. return Result::success($result);
  324. }
  325. /**
  326.  * 撤回订单
  327.  * @param
  328.  * @return void
  329. */
  330. public function cancelOrder(array $data): array
  331. {
  332. date_default_timezone_set('Asia/Shanghai');
  333. $time = time();
  334. $timestamp = date('YmdHis',$time);
  335. $order = Order::where('id',$data['order_id'])->where('status',6)->where('edtime','>=',$timestamp)->update(['status' => 3,'ad_status'=>'3']);
  336. $ads = OrderAd::where('order_id',$data['order_id'])->where('status',6)->where('totime','>=',$timestamp)->update(['status' => 3]);
  337. if(!$order || !$ads){
  338. return Result::error("订单id错误");
  339. }
  340. $result = [
  341. 'order' => $order,
  342. 'ads' => $ads
  343. ];
  344. return Result::success($result);
  345. }
  346. /**
  347.  * 删除订单
  348.  * @param
  349.  * @return void
  350. */
  351. public function delOrderAD(array $data): array
  352. {
  353. $data['status'] = [
  354. 0 => 2,
  355. 1 => 3,
  356. 2 => 5,
  357. 3 => 7
  358. ];
  359. date_default_timezone_set('Asia/Shanghai');
  360. $time = time();
  361. $timestamp = date('YmdHis',$time);
  362. $where = [
  363. ['user_id','=',$data['user_id']],
  364. ['id','=',$data['order_id']]
  365. ];
  366. $time = [['edtime','<=',$timestamp]];
  367. $order = Order::where($where)->where($time)->update(['user_del' => 1]);
  368. if(empty($order)){
  369. $order = Order::where($where)->whereIn('status',$data['status'])->update(['user_del' => 1]);
  370. }
  371. //
  372. if($order == 0){
  373. return Result::error("订单id错误");
  374. }
  375. return Result::success($order);
  376. }
  377. }