GoodsController.php 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426
  1. <?php
  2. namespace app\controller;
  3. use app\business\GoodsBusiness;
  4. use app\business\StreamBusiness;
  5. use Illuminate\Support\Arr;
  6. use Respect\Validation\Validator;
  7. use support\Db;
  8. use support\Redis;
  9. use support\Request;
  10. use hg\apidoc\annotation as Apidoc;
  11. #[Apidoc\Title("项目管理")]
  12. #[Apidoc\Group("Goods")]
  13. #[Apidoc\Sort(3)]
  14. class GoodsController
  15. {
  16. #[Apidoc\Title("列表")]
  17. #[Apidoc\Url("api/goods/charity.html")]
  18. #[Apidoc\Method("POST")]
  19. #[Apidoc\Param("page", type: "int", require: true, desc: "页面", mock: 1)]
  20. #[Apidoc\Param("limit", type: "int", require: true, desc: "输出条数", mock: 10)]
  21. #[Apidoc\Param("type", type: "int", require: true, desc: "类型:1=国债债券,2=股权分红", mock: 1)]
  22. #[Apidoc\Returned(name: "id", type: "int", require: true, desc: '产品ID', default: '')]
  23. #[Apidoc\Returned(name: "name", type: "string", require: true, desc: '名称', default: '')]
  24. #[Apidoc\Returned(name: "pay_price", type: "string", require: true, desc: '支付金额', default: '')]
  25. #[Apidoc\Returned(name: "bonus", type: "string", require: true, desc: '日收益', default: '')]
  26. #[Apidoc\Returned(name: "balance", type: "string", require: true, desc: '赠送华润银联卡余额', default: '')]
  27. #[Apidoc\Returned(name: "bl", type: "string", require: true, desc: '日利率', default: '')]
  28. #[Apidoc\Returned(name: "img", type: "string", require: true, desc: '图片', default: '')]
  29. #[Apidoc\Returned(name: "total_num", type: "int", require: true, desc: '总数', default: '')]
  30. #[Apidoc\Returned(name: "num", type: "int", require: true, desc: '剩余数量', default: '')]
  31. public function charity(Request $request)
  32. {
  33. Db::beginTransaction();
  34. try {
  35. $param = $request->param_data;
  36. Validator::input($param, [
  37. 'type' => Validator::notEmpty()->intType()->setName('类型'),
  38. ]);
  39. $data = Db::table('wa_goods')
  40. ->where(function ($query) use ($param) {
  41. $query->where('state', 1);
  42. $query->where('type', Arr::get($param, 'type', 1));
  43. })
  44. ->orderBy('sort')
  45. ->paginate(Arr::get($param, 'limit', 10), ['*'], 'page', Arr::get($param, 'page'))
  46. ->toArray();
  47. foreach ($data['data'] as $k => $v) {
  48. $data['data'][$k]->img = imageToBase64($v->img);
  49. }
  50. } catch (\Throwable $exception) {
  51. Db::rollBack();
  52. return error($exception->getMessage());
  53. }
  54. Db::commit();
  55. return success($data);
  56. }
  57. #[Apidoc\Title("支付")]
  58. #[Apidoc\Url("api/goods/charity_buy.html")]
  59. #[Apidoc\Method("POST")]
  60. #[Apidoc\Header("token", type: "string", require: true, desc: "身份令牌Token", mock: "@token")]
  61. #[Apidoc\Param(name: "id", type: "int", require: true, desc: '产品ID', default: '')]
  62. #[Apidoc\Param(name: "pay_characteristic", type: "int", require: true, desc: '支付通道标识', default: '1')]
  63. #[Apidoc\Param(name: "num", type: "int", require: true, desc: '购买数量:默认1', default: '1')]
  64. #[Apidoc\Returned(name: "type", type: "int", require: true, desc: '类型 1直接购买 2支付通道', default: 2)]
  65. #[Apidoc\Returned(name: "url", type: "string", require: true, desc: '支付地址', default: 'https://www.baidu.com/')]
  66. #[Apidoc\Returned(name: "payOrderId", type: "string", require: true, desc: '订单号', default: '111')]
  67. public function charityBuy(Request $request)
  68. {
  69. Db::beginTransaction();
  70. try {
  71. $param = $request->param_data;
  72. $param['url'] = $request->header('origin');
  73. $param['user_data'] = $request->user_data;
  74. $param['num'] = Arr::get($param, 'num', 1);
  75. Validator::input($param, [
  76. 'id' => Validator::notEmpty()->intType()->setName('产品标识'),
  77. 'pay_characteristic' => Validator::notEmpty()->setName('支付标识'),
  78. ]);
  79. $goods = Db::table('wa_goods')->where('id', $param['id'])->first();
  80. if (empty($goods)) {
  81. throw new \Exception('产品不存在!');
  82. }
  83. $arr = GoodsBusiness::buyType1($param);
  84. } catch (\Throwable $exception) {
  85. Db::rollBack();
  86. return error($exception->getMessage());
  87. }
  88. Db::commit();
  89. return success($arr, '购买成功');
  90. }
  91. #[Apidoc\Title("商品列表")]
  92. #[Apidoc\Url("api/goods/exchange_goods.html")]
  93. #[Apidoc\Method("POST")]
  94. #[Apidoc\Param("page", type: "int", require: true, desc: "页面", mock: 1)]
  95. #[Apidoc\Param("limit", type: "int", require: true, desc: "输出条数", mock: 10)]
  96. #[Apidoc\Returned(name: "id", type: "int", require: true, desc: '产品ID', default: '')]
  97. #[Apidoc\Returned(name: "name", type: "string", require: true, desc: '名称', default: '')]
  98. #[Apidoc\Returned(name: "lowest_pay_price", type: "string", require: true, desc: '最低支付', default: '')]
  99. #[Apidoc\Returned(name: "highest_pay_price", type: "string", require: true, desc: '最高支付', default: '')]
  100. #[Apidoc\Returned(name: "describe", type: "string", require: true, desc: '描述', default: '')]
  101. #[Apidoc\Returned(name: "day", type: "string", require: true, desc: '周期', default: '')]
  102. #[Apidoc\Returned(name: "bl", type: "string", require: true, desc: '分红比例', default: '')]
  103. #[Apidoc\Returned(name: "img", type: "string", require: true, desc: '图片', default: '')]
  104. #[Apidoc\Returned(name: "total_num", type: "int", require: true, desc: '总数', default: '')]
  105. #[Apidoc\Returned(name: "num", type: "int", require: true, desc: '剩余数量', default: '')]
  106. public function exchangeGoods(Request $request)
  107. {
  108. Db::beginTransaction();
  109. try {
  110. $param = $request->param_data;
  111. $data = Db::table('wa_sign_goods')
  112. ->where('state', 1)
  113. ->where(function ($query) use ($param) {
  114. if (Arr::get($param, 'type')) {
  115. $query->where('type', $param['type']);
  116. }
  117. })
  118. ->orderBy('sort')
  119. ->paginate(Arr::get($param, 'limit', 10), ['*'], 'page', Arr::get($param, 'page'))
  120. ->toArray();
  121. foreach ($data['data'] as $k => $v) {
  122. $data['data'][$k]->img = imageToBase64($v->img);
  123. }
  124. } catch (\Throwable $exception) {
  125. Db::rollBack();
  126. return error($exception->getMessage());
  127. }
  128. Db::commit();
  129. return success($data);
  130. }
  131. #[Apidoc\Title("兑换")]
  132. #[Apidoc\Url("api/goods/exchange.html")]
  133. #[Apidoc\Method("POST")]
  134. #[Apidoc\Header("token", type: "string", require: true, desc: "身份令牌Token", mock: "@token")]
  135. #[Apidoc\Param("id", type: "int", require: true, desc: '产品ID', default: '')]
  136. #[Apidoc\Param("num", type: "int", require: true, desc: '购买数量:默认1', default: '1')]
  137. public function exchange(Request $request)
  138. {
  139. Db::beginTransaction();
  140. try {
  141. $param = $request->param_data;
  142. $param['user_data'] = $request->user_data;
  143. $param['num'] = Arr::get($param, 'num', 1);
  144. Validator::input($param, [
  145. 'id' => Validator::notEmpty()->intType()->setName('产品标识'),
  146. 'pay_price' => Validator::notEmpty()->intType()->setName('兑换USD'),
  147. ]);
  148. $goodsdata = Db::table('wa_sign_goods')->where('id', $param['id'])->first();
  149. if (!$goodsdata) {
  150. throw new \Exception('数据不存在!');
  151. }
  152. // if($goodsdata->highest_pay_price<=$param['pay_price'] && $param['pay_price']>=$goodsdata->lowest_pay_price){
  153. // $price_money = $param['pay_price'];
  154. // }else{
  155. // throw new \Exception('兑换USD不在兑换区间!');
  156. // }
  157. $price_money = $param['pay_price'];
  158. $userlist = Db::table('wa_users')->where('id', $param['user_data']['id'])->first();
  159. if ($goodsdata->type == 1) {
  160. // if ($userlist->raffle_num <= 0) {
  161. // throw new \Exception('助力次数不足!');
  162. // }
  163. if ($userlist->money < $price_money) {
  164. throw new \Exception('USD不足!');
  165. }
  166. if ($goodsdata->num <= $param['num']) {
  167. throw new \Exception('当前助力基金已完成!');
  168. }
  169. if (!empty(Redis::get($param['id'] . $request->user_data['id']))) {
  170. throw new \Exception('慢点操作');
  171. }
  172. Redis::setEx($param['id'] . $request->user_data['id'], 6, $request->user_data['id']);
  173. if (!empty($price_money)) {
  174. $signId = Db::table('wa_sign_record')->insertGetId([
  175. 'uid' => $param['user_data']['id'],
  176. 'goods_id' => $param['id'],
  177. 'num' => $param['num'],
  178. 'money' => $price_money,
  179. 'status' => 1,
  180. 'order_no' => date('YmdHis') . mt_rand(1000, 9999),
  181. 'created_at' => date('Y-m-d H:i:s'),
  182. 'updated_at' => date('Y-m-d H:i:s'),
  183. ]);
  184. StreamBusiness::delStream($param['user_data']['id'], $price_money, streamType16, moldType1, moldTypefild1, $signId);
  185. $thisDay = date('Y-m-d H:i:s');
  186. /** @var $futureDay 未来时间 */
  187. $futureDay = futureDay($goodsdata->day);
  188. if (!empty($goodsdata->bl)) {
  189. $bonus = bcmul($price_money, bcdiv($goodsdata->bl, 100, 2), 2);
  190. Db::table('wa_cron_task_sign')->insert([
  191. 'user_id' => $param['user_data']['id'],
  192. 'goods_id' => $goodsdata->id,
  193. 'order_id' => $signId,
  194. 'money' => $price_money,
  195. 'bonus' => $bonus,
  196. 'goods_type' => $goodsdata->type,
  197. 'day_dividend_time' => strtotime(date('Y-m-d', strtotime('+1 days')) . ' 00:30:00'),
  198. 'dividend_time' => strtotime($futureDay),
  199. 'created_at' => $thisDay,
  200. 'updated_at' => $thisDay,
  201. 'my_good_id' => $signId,
  202. ]);
  203. StreamBusiness::addStream($param['user_data']['id'], $bonus, streamType13, moldType2, moldTypefild2, $signId);
  204. }
  205. }
  206. // Db::table('wa_users')->where('id', $param['user_data']['id'])->decrement('raffle_num', 1);
  207. Db::table('wa_sign_goods')->where('id', $param['id'])->decrement('num', $param['num']);
  208. if ($userlist->is_boost == 0) {
  209. Db::table('wa_users')->where('id', $param['user_data']['id'])->update(['is_boost' => 1]);
  210. }
  211. $userdata = Db::table('wa_users')->where('id', $param['user_data']['id'])->first();
  212. if ($userdata->continuity >= 3 && $userdata->is_boost == 1 && $userdata->is_effective == 0 && !empty($request->user_data['pid'])) {
  213. Db::table('wa_users')->where('id', $request->user_data['pid'])->increment('effective_is_num', 1);
  214. Db::table('wa_users')->where(['id' => $request->user_data['id']])->update(['is_effective' => 1]);
  215. }
  216. }
  217. if ($goodsdata->type == 2) {
  218. // if ($userlist->buy_num <= 0) {
  219. // throw new \Exception('购买矿机台资格数不足!');
  220. // }
  221. if ($userlist->money < $price_money) {
  222. throw new \Exception('USD不足!');
  223. }
  224. if (!empty(Redis::get($param['id'] . $request->user_data['id']))) {
  225. throw new \Exception('慢点操作');
  226. }
  227. Redis::setEx($param['id'] . $request->user_data['id'], 6, $request->user_data['id']);
  228. if (!empty($price_money)) {
  229. $signId = Db::table('wa_sign_record')->insertGetId([
  230. 'uid' => $param['user_data']['id'],
  231. 'goods_id' => $param['id'],
  232. 'num' => $param['num'],
  233. 'money' => $price_money,
  234. 'type' => $goodsdata->type,
  235. 'status' => 1,
  236. 'order_no' => date('YmdHis') . mt_rand(1000, 9999),
  237. 'created_at' => date('Y-m-d H:i:s'),
  238. 'updated_at' => date('Y-m-d H:i:s'),
  239. ]);
  240. StreamBusiness::delStream($param['user_data']['id'], $price_money, streamType18, moldType1, moldTypefild1, $signId);
  241. $thisDay = date('Y-m-d H:i:s');
  242. /** @var $futureDay 未来时间 */
  243. $futureDay = futureDay($goodsdata->day);
  244. if (!empty($goodsdata->highest_pay_price)) {
  245. Db::table('wa_cron_task_sign_two')->insert([
  246. 'user_id' => $param['user_data']['id'],
  247. 'goods_id' => $goodsdata->id,
  248. 'order_id' => $signId,
  249. 'money' => $price_money,
  250. 'bonus' => 0,
  251. 'goods_type' => $goodsdata->type,
  252. 'day_dividend_time' => strtotime(date('Y-m-d', strtotime('+1 days')) . ' 01:00:00'),
  253. 'dividend_time' => strtotime($futureDay),
  254. 'created_at' => $thisDay,
  255. 'updated_at' => $thisDay,
  256. 'my_good_id' => $signId,
  257. 'highest_pay_price' => $goodsdata->highest_pay_price,
  258. 'day' => $goodsdata->day,
  259. 'bl' => $goodsdata->bl,
  260. 'progress' => $goodsdata->progress,
  261. ]);
  262. StreamBusiness::addStream($param['user_data']['id'], $goodsdata->highest_pay_price, streamType19, moldType5, moldTypefild5, $signId);
  263. StreamBusiness::addStream($param['user_data']['id'], $goodsdata->day, streamType19, moldType1, moldTypefild1, $signId);
  264. StreamBusiness::addStream($param['user_data']['id'], $goodsdata->progress, streamType19, moldType4, moldTypefild4, $signId);
  265. Db::table('wa_users')->where('id', $param['user_data']['id'])->increment('raffle_num', $goodsdata->bl);
  266. Db::table('wa_users')->where('id', $param['user_data']['id'])->increment('accumulate_raffle_num', $goodsdata->bl);
  267. }
  268. // $hasone = Db::table('wa_stream')
  269. // ->where('user_id', $param['user_data']['id'])
  270. // ->where('type', streamType20)
  271. // ->where('mold', moldType6)
  272. // ->whereBetween('add_time', [strtotime(date('Y-m-d') . ' 00:00:00'), strtotime(date('Y-m-d') . ' 23:59:59')])
  273. // ->exists();
  274. // if (empty($hasone)) {
  275. // StreamBusiness::addStream($param['user_data']['id'], 1, streamType20, moldType6, moldTypefild6);
  276. // }
  277. }
  278. Db::table('wa_users')->where('id', $param['user_data']['id'])->decrement('buy_num', 1);
  279. Db::table('wa_sign_goods')->where('id', $param['id'])->decrement('num', $param['num']);
  280. }
  281. } catch (\Throwable $exception) {
  282. Db::rollBack();
  283. return error($exception->getMessage());
  284. }
  285. Db::commit();
  286. return success([], '兑换成功');
  287. }
  288. #[Apidoc\Title("助力记录")]
  289. #[Apidoc\Url("api/goods/exchange_list.html")]
  290. #[Apidoc\Method("POST")]
  291. #[Apidoc\Header("token", type: "string", require: true, desc: "身份令牌Token", mock: "@token")]
  292. #[Apidoc\Param("page", type: "int", require: true, desc: "页面", mock: 1)]
  293. #[Apidoc\Param("limit", type: "int", require: true, desc: "输出条数", mock: 10)]
  294. #[Apidoc\Returned(name: "num", type: "int", require: true, desc: '购买数量:默认1', default: '1')]
  295. #[Apidoc\Returned(name: "goods_name", type: "int", require: true, desc: '商品名称', default: '')]
  296. #[Apidoc\Returned(name: "lowest_pay_price", type: "string", require: true, desc: '最低支付', default: '')]
  297. #[Apidoc\Returned(name: "highest_pay_price", type: "string", require: true, desc: '最高支付', default: '')]
  298. #[Apidoc\Returned(name: "describe", type: "string", require: true, desc: '描述', default: '')]
  299. #[Apidoc\Returned(name: "day", type: "string", require: true, desc: '周期', default: '')]
  300. #[Apidoc\Returned(name: "bl", type: "string", require: true, desc: '分红比例', default: '')]
  301. #[Apidoc\Returned(name: "pay_price", type: "int", require: true, desc: '支付积分', default: '')]
  302. #[Apidoc\Returned(name: "img", type: "int", require: true, desc: '图片', default: '')]
  303. #[Apidoc\Returned(name: "money", type: "int", require: true, desc: '总支付', default: '')]
  304. #[Apidoc\Returned(name: "num", type: "int", require: true, desc: '兑换数量', default: '')]
  305. #[Apidoc\Returned(name: "status", type: "int", require: true, desc: '状态:1=助力', default: '')]
  306. #[Apidoc\Returned(name: "order_no", type: "int", require: true, desc: '订单号', default: '')]
  307. public function exchangeList(Request $request)
  308. {
  309. Db::beginTransaction();
  310. try {
  311. $param = $request->param_data;
  312. $param['user_data'] = $request->user_data;
  313. $signdata = Db::table('wa_sign_record')
  314. ->where('uid', $param['user_data']['id'])
  315. ->where(function ($query) use ($param) {
  316. if (Arr::get($param, 'type')) {
  317. $query->where('type', $param['type']);
  318. }
  319. })
  320. ->orderByDesc('id')
  321. ->paginate(Arr::get($param, 'limit', 10), ['*'], 'page', Arr::get($param, 'page'))
  322. ->toArray();
  323. $arr = [];
  324. foreach ($signdata['data'] as $k => $v) {
  325. $wa_goods = Db::table('wa_sign_goods')->where('id', $v->goods_id)->first();
  326. $arr[] = [
  327. 'good_name' => $wa_goods->name,
  328. 'describe' => $wa_goods->describe,
  329. 'lowest_pay_price' => $wa_goods->lowest_pay_price,
  330. 'highest_pay_price' => $wa_goods->highest_pay_price,
  331. 'day' => $wa_goods->day,
  332. 'bl' => $wa_goods->bl,
  333. 'original_bl' => $wa_goods->original_bl,
  334. 'progress' => $wa_goods->progress,
  335. 'goods_id' => $v->goods_id,
  336. 'type' => $wa_goods->type,
  337. 'img' => imageToBase64($wa_goods->img),
  338. 'created_at' => date('Y-m-d H:i:s', strtotime($v->created_at)),
  339. 'pay_price' => $v->money,
  340. 'id' => $v->id,
  341. 'num' => $v->num,
  342. 'money' => $v->money,
  343. 'status' => $v->status,
  344. 'order_no' => $v->order_no,
  345. ];
  346. }
  347. } catch (\Throwable $exception) {
  348. Db::rollBack();
  349. return error($exception->getMessage());
  350. }
  351. Db::commit();
  352. return success($arr, '获取成功');
  353. }
  354. // #[Apidoc\Title("兑换商品地址编辑")]
  355. // #[Apidoc\Url("api/goods/edid_address.html")]
  356. // #[Apidoc\Method("POST")]
  357. // #[Apidoc\Header("token", type: "string", require: true, desc: "身份令牌Token", mock: "@token")]
  358. // #[Apidoc\Param("id", type: "int", require: true, desc: "ID", mock: "")]
  359. // #[Apidoc\Param("name", type: "string", require: true, desc: "姓名", mock: "")]
  360. // #[Apidoc\Param("mobile", type: "string", require: true, desc: "手机号", mock: "")]
  361. // #[Apidoc\Param("number", type: "string", require: true, desc: "身份证", mock: "")]
  362. // #[Apidoc\Param("address", type: "string", require: true, desc: "地址", mock: "")]
  363. // public function edid_address(Request $request)
  364. // {
  365. // $param = $request->param_data;
  366. // $param['user_data'] = $request->user_data;
  367. // Db::beginTransaction();
  368. // try {
  369. // Validator::input($param, [
  370. // 'id' => Validator::notEmpty()->setName('id'),
  371. // ]);
  372. // $datalist = Db::table('wa_sign_record')
  373. // ->where('uid', $param['user_data']['id'])
  374. // ->where('id', $param['id'])
  375. // ->first();
  376. // if (!$datalist) {
  377. // throw new \Exception('非法操作');
  378. // }
  379. // Db::table('wa_sign_record')->where('id', $datalist->id)->update([
  380. // 'mobile' => Arr::get($param, 'mobile', $param['user_data']['mobile']),
  381. // 'name' => Arr::get($param, 'name', $datalist->name),
  382. // 'address' => Arr::get($param, 'address', $datalist->address),
  383. // ]);
  384. //
  385. // } catch (\Throwable $exception) {
  386. // Db::rollBack();
  387. // return error($exception->getMessage());
  388. // }
  389. // Db::commit();
  390. // return success([], '操作成功');
  391. //
  392. // }
  393. }