Order.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  1. <?php
  2. namespace app\api\controller;
  3. use app\common\controller\Api;
  4. use app\common\model\Config;
  5. use app\common\model\Goods;
  6. use app\common\model\MoneyLog;
  7. use app\common\model\Order AS OrderModel;
  8. use app\common\model\Users;
  9. use app\common\model\UsersPath;
  10. use think\Db;
  11. use think\Exception;
  12. /**
  13. * 首页接口
  14. */
  15. class Order extends Api
  16. {
  17. protected $noNeedLogin = [];
  18. protected $noNeedRight = ['*'];
  19. /**
  20. * 订单列表
  21. * @return void
  22. * @throws \think\exception\DbException
  23. */
  24. public function base()
  25. {
  26. $user = $this->auth->getUser();
  27. $data['banner_list'] = 'https://dapp-static.oss-cn-shenzhen.aliyuncs.com/jue-jin-lu/3.pnggS02ouwrJfiF65979ec74db73';
  28. $data['day_tasks_num'] = (new Config())->getValue('day_tasks_num');//每日任务数
  29. $data['task_income'] = (new Config())->getValue('task_income');//单次任务收益
  30. $data['task_num'] = $user['task_num'];//今日已做任务
  31. $data['balance'] = $user['freeze'] < 0 ? $user['freeze']: $user['balance'];
  32. $data['bonus_sum'] = $user['bonus_sum'];
  33. $data['bonus_today'] = (new OrderModel())
  34. ->where('user_id', $user['id'])
  35. ->where('status', OrderModel::Success)
  36. ->whereTime('create_time', '>=', strtotime('today'))
  37. ->sum('bonus');
  38. $this->success('', $data);
  39. }
  40. /**
  41. * 订单列表
  42. * @return void
  43. * @throws \think\exception\DbException
  44. */
  45. public function list()
  46. {
  47. $user = $this->auth->getUser();
  48. $paginator = OrderModel::where('user_id', $user['id'])
  49. ->field('order_no,amount,bonus,status,create_time')
  50. ->order('id DESC')
  51. ->paginate($this->pageSize);
  52. foreach ($paginator as $k => $v) {
  53. $paginator[$k]['status_name'] = (new OrderModel())->getStatusNames($v['status']);
  54. }
  55. $res_data = $this->buildResp($paginator->total(), $paginator->currentPage(), $paginator->items());
  56. $res_data['bonus_sum'] = $user['bonus_sum'];
  57. $this->success('', $res_data);
  58. }
  59. /**
  60. * 获取订单
  61. * @return void
  62. * @throws \think\exception\DbException
  63. */
  64. public function get()
  65. {
  66. $user = $this->auth->getUser();
  67. if($user['open_task'] != 1){
  68. $this->error(__('暂停抢单'));
  69. }
  70. if(bccomp($user['freeze'], 0, 2) ===-1){
  71. //冻结金额< 0时,需要充值
  72. $this->error(__('余额不足'), '', 401);
  73. }
  74. if(!($user['balance'] > 0)){
  75. $this->error(__('余额不足'), '', 401);
  76. }
  77. $balance_mini = (new Config())->getValue('balance_mini');//允许做单的最低余额
  78. if($user['balance'] < $balance_mini){
  79. $this->error(__('余额不足'), '', 401);
  80. }
  81. $day_tasks_num = (new Config())->getValue('day_tasks_num');//单日任务数
  82. $task_income = (new Config())->getValue('task_income');//单次收益
  83. $amount_mini = $user['balance'] * 0.4;
  84. $amount_max = $user['balance'] * 0.8;
  85. if($user['task_num'] >= $day_tasks_num){
  86. if(!empty($user['task_last_time']) && (date('md',time()) != date('md', $user['task_last_time']))){
  87. //当日接单量 >= 任务数时,最后一次接单时间和当前不是同一天,则重置当日接单量
  88. $user['task_num'] = 0;
  89. Users::where('id', $user['id'])->update([
  90. 'task_num' => 0
  91. ]);
  92. }else{
  93. $this->error(__('今日任务已完成'));
  94. }
  95. }
  96. $check_order = (new OrderModel)
  97. ->where('user_id', $user['id'])
  98. ->where('status', '<', OrderModel::Success)
  99. ->count();
  100. if($check_order){
  101. $this->error(__('有未完成订单'));
  102. }
  103. $freeze = false; //是否有冻结金额
  104. if($user['is_limit_task'] == 1){
  105. //卡单 limit_task 字段值为json {"which_start":"7","min_amount":"100","max_amount":"1000","income_multiple":"2"}
  106. $limit_task = json_decode($user['limit_task'], true);
  107. if(empty($limit_task)){
  108. $this->error(__('参数错误'));
  109. }
  110. $val_arr = array_column($limit_task, 'which_start');
  111. $key = array_search($user['task_num'] + 1, $val_arr);
  112. if($key !== false){
  113. //从这单开始卡单
  114. if(!($user['freeze'] < 0)){
  115. //冻结金额不小于0时,说明未卡单,则进行卡单操作:向用户展示余额时,显示 负的订单金额
  116. $freeze = true;
  117. }
  118. $task_income = $task_income * $limit_task[$key]['income_multiple'];//单次收益
  119. $amount_mini = $limit_task[$key]['min_amount'];
  120. $amount_max = $limit_task[$key]['max_amount'];
  121. }
  122. }
  123. $goods_info = (new Goods())
  124. ->fetchSql(false)
  125. ->whereBetween('price', [$amount_mini, $amount_max])
  126. ->where('status', 1)
  127. ->orderRaw("RAND()")
  128. ->find();
  129. if(empty($goods_info)){
  130. $this->error(__('未匹配到商品'));
  131. }
  132. $order_data = [
  133. 'order_no' => 'O' . $user['id'] . time(),
  134. 'user_id' => $user['id'],
  135. 'title' => $goods_info['title'],
  136. 'amount' => $goods_info['price'],
  137. 'bonus' => $goods_info['price'] * $task_income,
  138. 'user_type' => $user['user_type'],
  139. 'status' => OrderModel::Pending,
  140. ];
  141. // 启动事务
  142. Db::startTrans();
  143. try {
  144. // if($freeze){
  145. // //卡单操作,不扣款,只冻结订单金额
  146. // $freeze = Users::where('id', $user['id'])->update(['freeze' => -$goods_info['price']]);
  147. // $order_data['status'] = OrderModel::Default;
  148. // }else{
  149. // //正常订单 账变
  150. // (new MoneyLog())->change($user['id'], -$goods_info['price'], MoneyLog::Pay, '', '');
  151. // }
  152. //正常订单 账变
  153. (new MoneyLog())->change($user['id'], -$goods_info['price'], MoneyLog::Pay, '', '');
  154. // 创建订单
  155. OrderModel::create($order_data);
  156. // 提交事务
  157. Db::commit();
  158. } catch (Exception $e) {
  159. // 回滚事务
  160. Db::rollback();
  161. $this->error($e->getMessage());
  162. }
  163. unset($order_data['user_type']);
  164. unset($order_data['status']);
  165. $order_data['img_url']= $goods_info['img_url'];
  166. $this->success('', $order_data);
  167. }
  168. /**
  169. * 提交订单
  170. * @return void
  171. * @throws \think\exception\DbException
  172. */
  173. public function submit()
  174. {
  175. $user = $this->auth->getUser();
  176. $order_no = $this->request->post('order_no');
  177. if(empty($order_no)){
  178. $this->error(__('参数有误'));
  179. }
  180. $order_info = (new OrderModel)
  181. ->where('user_id', $user['id'])
  182. ->where('order_no', $order_no)
  183. ->find();
  184. if(empty($order_info)){
  185. $this->error(__('参数有误'));
  186. }
  187. if($user['balance'] < 0){
  188. $this->error(__('余额不足'), '', 401);
  189. }
  190. if($user['freeze'] < 0){
  191. $this->error(__('余额不足'), '', 401);
  192. }
  193. if($order_info['status'] == OrderModel::Success){
  194. $this->success('');
  195. }
  196. sleep(1);//防止并发重复提交
  197. // 启动事务
  198. Db::startTrans();
  199. try {
  200. // 更新订单
  201. $rs = (new OrderModel)
  202. ->where('id', $order_info['id'])
  203. ->update([
  204. 'status' => OrderModel::Success
  205. ]);
  206. if(!$rs){
  207. $this->error(__('失败'));
  208. }
  209. if($order_info['status'] == OrderModel::Default){
  210. //卡单订单不扣款,不返款,直接发佣金
  211. //订单佣金
  212. (new MoneyLog())->change($user['id'], $order_info['bonus'], MoneyLog::OrderBonus, '', '卡单订单');
  213. }else{
  214. //账变
  215. (new MoneyLog())->change($user['id'], $order_info['amount'], MoneyLog::PayBack, '', '');
  216. //订单佣金
  217. (new MoneyLog())->change($user['id'], $order_info['bonus'], MoneyLog::OrderBonus, '', '');
  218. }
  219. //累积佣金和任务次数
  220. (new Users())
  221. ->where('id', $user['id'])
  222. ->update([
  223. 'task_num' => Db::raw('task_num + 1'),
  224. 'bonus_sum' => Db::raw('bonus_sum + ' .$order_info['bonus']),
  225. 'task_last_time'=> time()
  226. ]);
  227. //向上级发放
  228. $parent_ids = (new UsersPath())->where('user_id', $user['id'])->order('distance')->column('parent_id');
  229. if(!empty($parent_ids)){
  230. for($i = 1; $i <= 3; $i++){
  231. if(!isset($parent_ids[$i - 1])){
  232. //没设置就跳出
  233. break;
  234. }
  235. $radio = (new Config())->getValue('bonus_share_' . $i);
  236. if(!empty($radio) && $radio > 0 && $radio < 1){
  237. $bonus = $radio * $order_info['bonus'];
  238. if($bonus > 0.01){
  239. //上级佣金
  240. (new MoneyLog())->change($parent_ids[$i - 1], $bonus, MoneyLog::Commission, $user['id'], $i . '代会员奖励');
  241. }
  242. }
  243. }
  244. }
  245. // 提交事务
  246. Db::commit();
  247. } catch (Exception $e) {
  248. // 回滚事务
  249. Db::rollback();
  250. $this->error($e->getMessage());
  251. }
  252. $this->success('');
  253. }
  254. }