YgOrderModel.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411
  1. <?php
  2. namespace app\common\model;
  3. use jobs\JpOrderJob;
  4. use jobs\ShopOrderJob;
  5. use think\db\exception\DbEventException;
  6. use think\Exception;
  7. use think\facade\Db;
  8. use think\Model;
  9. use utils\Queue;
  10. use function Qcloud\Cos\startWith;
  11. class YgOrderModel extends Model
  12. {
  13. protected $name = 'yg_order';
  14. public function orderSubmit($uid, $data){
  15. $order_sn = $data['order_sn'];
  16. $buy_price = $data['buy_price'];
  17. $jp_price = $data['jp_price'];
  18. if (empty($buy_price) || empty($jp_price) || empty($order_sn)){
  19. throw new Exception('参数错误');
  20. }
  21. if (!floatval($buy_price)>0){
  22. sr_throw('一口价输入非法');
  23. }
  24. if (!floatval($jp_price)>0){
  25. sr_throw('竞拍价输入非法');
  26. }
  27. if ($buy_price < $jp_price){
  28. sr_throw('一口价不能低于竞拍价');
  29. }
  30. $order_info = Db::name('shop_order')->where('order_sn', $order_sn)->find();
  31. if (!$order_info){
  32. throw new Exception('未找到订单');
  33. }
  34. if ($order_info['user_id'] != $uid){
  35. throw new Exception('不是你的订单');
  36. }
  37. if ($order_info['hg_status'] === 2){
  38. throw new Exception('订单已回购,请求重复提交');
  39. }
  40. if ($order_info['status'] != 1){
  41. throw new Exception('订单状态有误');
  42. }
  43. if ($order_info['hg_status'] == 2){
  44. throw new Exception('已回购商品不能二次回购,请联系客服');
  45. }
  46. $cur_time = time();
  47. if ($order_info['pay_type'] != 3){
  48. $pay_info = Db::name('payment')->where('order_type', 4)->where('remarks', $order_sn)->where('state', 6)->find();
  49. if (!$pay_info){
  50. throw new Exception('订单错误,或不是商城订单');
  51. }
  52. if ($order_info['hg_enable'] == 1){
  53. // 回购时间
  54. if ($cur_time - strtotime($pay_info['pay_at']) > env('APP.YG_BACK_EXPIRE', 3600)){
  55. throw new Exception('回购超时');
  56. }
  57. }else{
  58. sr_throw('该订单已回购,不能再次参与');
  59. }
  60. }
  61. if ($order_info['status'] != 1){
  62. throw new Exception('订单状态错误');
  63. }
  64. Db::name('shop_order')->where('order_sn', $order_sn)->save(['status'=>4, 'hg_status'=>2, 'hg_enable'=>2]);
  65. $order_goodsinfo = Db::name('shop_order_goods')->where('order_id', $order_info['order_id'])->find();
  66. $ygorder_id = Db::name('yg_order')->insertGetId([
  67. 'uid'=>$uid,
  68. 'status'=>1,
  69. 'order_sn'=>$order_sn,
  70. 'end_time'=>sr_getcurtime($cur_time+env('app.YG_ORDER_EXPIRED_TIME', 3600)),
  71. 'buy_price'=>$buy_price,
  72. 'jp_price'=>$jp_price,
  73. 'create_time'=>sr_getcurtime(time()),
  74. 'goods_id'=>$order_goodsinfo['goods_id'],
  75. 'num'=>$order_info['num']
  76. ]);
  77. // 定时任务
  78. // $ex_time = intval(env('APP.YG_ORDER_EXPIRED_TIME', 3600));
  79. // Queue::instance()->log('竞拍过期执行成功:'.$ygorder_id)->job(JpOrderJob::class)->do('YgOrderExpired')->secs($ex_time)->push([$ygorder_id]);
  80. }
  81. public function ygGoodsList($uid, $sort, $page, $limit, $status){
  82. $order = 'y.id desc';
  83. switch ($sort){
  84. case 1:
  85. $order = 'y.create_time asc';
  86. break;
  87. case 2:
  88. $order = 'y.create_time desc';
  89. break;
  90. case 3:
  91. $order = 'y.buy_price asc';
  92. break;
  93. case 4:
  94. $order = 'y.buy_price desc';
  95. break;
  96. case 5:
  97. $order = 'y.cur_price asc';
  98. break;
  99. case 6:
  100. $order = 'y.cur_price desc';
  101. break;
  102. }
  103. if ($status == 0){
  104. $status = [1,2,3];
  105. }else{
  106. $status = [$status];
  107. }
  108. $list = Db::name('yg_order')
  109. ->alias('y')
  110. ->leftJoin('shop_goods g', 'g.goods_id = y.goods_id')
  111. ->where('status', 'in', $status)
  112. ->withAttr('create_time', function ($val, $data){
  113. return sr_getcurtime(strtotime($val), 'Y-m-d H:i');
  114. })
  115. ->page($page, $limit)
  116. ->order($order)
  117. ->field('y.*,g.goods_name,g.goods_img')
  118. ->select()
  119. ->toArray();
  120. return $list;
  121. }
  122. public function ygGoodsDetail($yg_goodsid){
  123. $yg_goodsinfo = self::where('id', $yg_goodsid)->findOrEmpty()->toArray();
  124. if (!$yg_goodsinfo){
  125. sr_throw('查询失败');
  126. }
  127. if ($yg_goodsinfo['cur_price'] == 0){
  128. $yg_goodsinfo['cur_price'] = $yg_goodsinfo['jp_price'];
  129. }
  130. $goods_info = Db::name('shop_goods')->where('goods_id', $yg_goodsinfo['goods_id'])->field('goods_sn,goods_name,goods_remark,goods_img,goods_img_banner,price,rebate_score_most,rebate_score_lock')->find();
  131. // 查询goods_sn
  132. $yg_goodsinfo['goods_sn'] = $goods_info['goods_sn'];
  133. // 查询富文本
  134. $yg_goodsinfo['goods_name'] = $goods_info['goods_name'];
  135. $yg_goodsinfo['goods_remark'] = htmlspecialchars_decode($goods_info['goods_remark']);
  136. $yg_goodsinfo['goods_img'] = $goods_info['goods_img'];
  137. $yg_goodsinfo['goods_img_banner'] = $goods_info['goods_img_banner'];
  138. $yg_goodsinfo['price'] = $goods_info['price'] * $yg_goodsinfo['num'];
  139. $yg_goodsinfo['rebate_score_most'] = $goods_info['rebate_score_most'] * $yg_goodsinfo['num'];
  140. $yg_goodsinfo['rebate_score_lock'] = $goods_info['rebate_score_lock'] * $yg_goodsinfo['num'];
  141. return $yg_goodsinfo;
  142. }
  143. // is_all 1 不是全部 2全部
  144. public function ygGoodsJpList($yg_goodsid, $is_all, $uid){
  145. $list = Db::name('yg_buy_record')
  146. ->alias('r')
  147. ->leftJoin('user u', 'u.id = r.uid')
  148. ->where('yg_id', $yg_goodsid)
  149. ->field('r.*,u.nickname,u.avatar')
  150. ->withAttr('avatar', function ($val, $data){
  151. return getWebUrl().'/'.$val;
  152. })
  153. ->order('id desc')
  154. ->page(1, $is_all==2?10000:3)
  155. ->select()
  156. ->toArray();
  157. foreach ($list as $key=>$val){
  158. if ($val['uid'] == $uid){
  159. $list[$key]['nickname'] = '我';
  160. }
  161. }
  162. return $list;
  163. }
  164. // 竞拍购买
  165. public function joinYgWithXz($uid, $address_id, $money, $yg_goodsid){
  166. $user_info = Db::name('user')->where('id', $uid)->find();
  167. $yg_goodsinfo = self::where('id', $yg_goodsid)->find()->toArray();
  168. if (!floatval($money)>0){
  169. sr_throw('输入非法');
  170. }
  171. if ($yg_goodsinfo['status'] != 1){
  172. sr_throw('竞拍失败,商品已流拍或已结算');
  173. }
  174. if ($yg_goodsinfo['uid'] === $uid){
  175. sr_throw('不能参加自己的竞拍,竞拍失败');
  176. }
  177. $scale = get_user_shouxufei($uid);
  178. $shouxu_xz = number_format($scale*$money/100, '2', '.', '');
  179. $need_xz = $money + $shouxu_xz;
  180. if ($user_info['xz_num'] < $need_xz){
  181. sr_throw('您的星钻不足,竞拍失败');
  182. }
  183. if ($user_info['xz_num'] < (10+$need_xz)){
  184. sr_throw('参加失败,账户必须有10个星钻剩余');
  185. }
  186. if (!Db::name('user_address')->where('uid', $uid)->where('id', $address_id)->find()){
  187. sr_throw('地址校验失败');
  188. }
  189. // 五分钟之内有抢购在加5分钟延时
  190. $end_time = strtotime($yg_goodsinfo['end_time']);
  191. if (time() < $end_time){
  192. if ($end_time - time() < 300){
  193. self::where('id', $yg_goodsid)->save(['end_time'=>sr_getcurtime($end_time+300)]);
  194. }
  195. }else{
  196. throw new Exception('状态错误,请刷新数据', 344);
  197. }
  198. // 当前没人竞拍
  199. if ($yg_goodsinfo['jp_count'] == 0){
  200. if ($money < $yg_goodsinfo['jp_price']){
  201. sr_throw('第一次竞拍的价格必须大于等于竞拍价');
  202. }
  203. if ($money >= $yg_goodsinfo['buy_price']){
  204. sr_throw('第一次竞拍价格必须小于一口价');
  205. }
  206. }else{
  207. if ($money <= $yg_goodsinfo['cur_price']){
  208. throw new Exception('竞拍价格必须大于当前竞拍最大价格', 344);
  209. }
  210. if ($money >= $yg_goodsinfo['buy_price']){
  211. sr_throw('竞拍价格必须小于一口价');
  212. }
  213. $addmoney = intval(number_format(($money*100 - $yg_goodsinfo['cur_price']*100), '0', '.', ''));
  214. $need = env('APP.YG_ONCE_ADD') * 100;
  215. if (intval($need) > intval($addmoney)){
  216. sr_throw('当前加价幅度不能低于'.env('APP.YG_ONCE_ADD'));
  217. }
  218. $max_recordid = Db::name('yg_buy_record')->where('yg_id', $yg_goodsid)->max('id');
  219. $max_recordInfo = Db::name('yg_buy_record')->where('id', $max_recordid)->find();
  220. Db::name('yg_buy_record')->where('id', $max_recordid)->save([
  221. 'status'=>2
  222. ]);
  223. edit_user_xz(11, $max_recordInfo['uid'], $max_recordInfo['price']+$max_recordInfo['shouxu']);
  224. // $jg_regid = Db::name('user')->where('id', $max_recordInfo['uid'])->value('jg_regid');
  225. // JPushServicePushOneMsg(false, $jg_regid, '您的竞拍被别人拍下了,快去看看吧', ['type'=>2,'params'=>json_encode(['yg_id'=>$max_recordInfo['yg_id']])]);
  226. }
  227. Db::name('yg_order')->where('id', $yg_goodsid)->inc('jp_count', 1)->update();
  228. $r_id = Db::name('yg_buy_record')->insertGetId([
  229. 'uid'=>$uid,
  230. 'price'=>$money,
  231. 'shouxu'=>$shouxu_xz,
  232. 'yg_id'=>$yg_goodsid,
  233. 'status'=>1,
  234. 'type'=>2,
  235. 'create_time'=>sr_getcurtime(time()),
  236. 'address_id'=>$address_id,
  237. 'goods_id'=>$yg_goodsinfo['goods_id'],
  238. 'num'=>$yg_goodsinfo['num']
  239. ]);
  240. self::where('id', $yg_goodsid)->save([
  241. 'cur_price'=>$money,
  242. 'address_id'=>$address_id
  243. ]);
  244. // 扣除用户竞拍的星钻 并添加记录
  245. edit_user_xz(10, $uid, ($money+$shouxu_xz), $r_id, $shouxu_xz);
  246. }
  247. // 一口价购买
  248. public function joinYgWithBuy($uid, $address_id, $yg_goodsid){
  249. $user_info = Db::name('user')->where('id', $uid)->find();
  250. $yg_goodsinfo = self::where('id', $yg_goodsid)->find()->toArray();
  251. if ($yg_goodsinfo['status'] != 1){
  252. sr_throw('竞拍失败,商品已流拍或已结算');
  253. }
  254. if ($yg_goodsinfo['uid'] === $uid){
  255. sr_throw('不能参加自己的竞拍,竞拍失败');
  256. }
  257. $money = $yg_goodsinfo['buy_price'];
  258. $scale = get_user_shouxufei($uid);
  259. $shouxu_xz = number_format($scale*$money/100, '2', '.', '');
  260. if ($user_info['xz_num'] < ($money+$shouxu_xz)){
  261. sr_throw('您的星钻不足,购买失败');
  262. }
  263. if ($user_info['xz_num'] < (10+$money+$shouxu_xz)){
  264. sr_throw('参加失败,账户必须有10个星钻剩余');
  265. }
  266. if (!Db::name('user_address')->where('uid', $uid)->where('id', $address_id)->find()){
  267. sr_throw('地址校验失败');
  268. }
  269. // 订单状态改变
  270. Db::name('shop_order')->where('order_sn', $yg_goodsinfo['order_sn'])->save(['status'=>5,'hg_status'=>3]);
  271. Db::name('yg_order')->where('id', $yg_goodsid)->save(['status'=>2]);
  272. Db::name('yg_order')->where('id', $yg_goodsid)->inc('jp_count', 1)->update();
  273. if ($yg_goodsinfo['jp_count'] > 0){
  274. // 退回当前竞拍的最高价
  275. $max_recordid = Db::name('yg_buy_record')->where('yg_id', $yg_goodsid)->max('id');
  276. $max_recordInfo = Db::name('yg_buy_record')->where('id', $max_recordid)->find();
  277. Db::name('yg_buy_record')->where('id', $max_recordid)->save([
  278. 'status'=>2
  279. ]);
  280. edit_user_xz(11, $max_recordInfo['uid'], $max_recordInfo['price']+$max_recordInfo['shouxu']);
  281. }
  282. $r_id = Db::name('yg_buy_record')->insertGetId([
  283. 'uid'=>$uid,
  284. 'price'=>$yg_goodsinfo['buy_price'],
  285. 'yg_id'=>$yg_goodsid,
  286. 'status'=>3,
  287. 'type'=>1,
  288. 'create_time'=>sr_getcurtime(time()),
  289. 'address_id'=>$address_id,
  290. 'goods_id'=>$yg_goodsinfo['goods_id'],
  291. 'num'=>$yg_goodsinfo['num']
  292. ]);
  293. self::where('id', $yg_goodsid)->save([
  294. 'cur_price'=>$yg_goodsinfo['buy_price'],
  295. 'address_id'=>$address_id
  296. ]);
  297. // 扣除用户竞拍的星钻 并添加记录
  298. edit_user_xz(10, $uid, $money+$shouxu_xz, $r_id, $shouxu_xz);
  299. // 给回购人员结算
  300. // $demoney = number_format($yg_goodsinfo['buy_price']*(100-env('APP.YG_BACK_EXPIRE', 5))/100, '2', '.', '');
  301. // $shouxu = $yg_goodsinfo['buy_price']-$demoney;
  302. edit_user_xz(12, $yg_goodsinfo['uid'], $yg_goodsinfo['buy_price'], $yg_goodsinfo['order_sn'], 0);
  303. }
  304. public function joinYgOrderList($uid, $status, $page, $limit){
  305. $where = [];
  306. if (!(empty($status) || $status == 0)){
  307. $where[] = ['r.status', '=', $status];
  308. }else{
  309. $where[] = ['r.status', 'in', [1,2,3,4]];
  310. }
  311. $list = Db::name('yg_buy_record')
  312. ->alias('r')
  313. ->leftJoin('yg_order o', 'o.id = r.yg_id')
  314. ->leftJoin('shop_goods g', 'g.goods_id = r.goods_id')
  315. ->leftJoin('user_address a', 'a.id = r.address_id')
  316. ->where('r.uid', $uid)
  317. ->where($where)
  318. ->field('r.*,o.order_sn,g.goods_name,g.goods_img,a.name as reciver_name,a.mobile as reciver_mobile,a.mergename as reciver_remark')
  319. ->order('r.create_time desc')
  320. ->page($page, $limit)
  321. ->select()
  322. ->toArray();
  323. return $list;
  324. }
  325. }