Order.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345
  1. <?php
  2. namespace app\api\controller\v1;
  3. use app\BaseController;
  4. use app\model\api\ExpCost;
  5. use app\model\api\Member;
  6. use app\model\api\MemberDetail;
  7. use app\model\Api\MemberShop;
  8. use app\model\api\Order as OrderModel;
  9. use app\model\api\OrderInfo;
  10. use app\model\api\Product;
  11. use app\model\api\SiteProduct;
  12. use app\model\api\UserAddress;
  13. use app\model\api\Warehouse;
  14. use app\model\system\ProductAttr;
  15. use app\Request;
  16. use library\services\UtilService;
  17. use library\utils\Region;
  18. use think\db\exception\DbException;
  19. use think\facade\Db;
  20. class Order extends BaseController
  21. {
  22. /**
  23. * 获取产品信息
  24. */
  25. public function getProductInfo(Request $request){
  26. $where = UtilService::getMore([
  27. ['product_id', 0],
  28. ['unique', '']
  29. ], $request);
  30. $data = Db::name('ProductAttrValue')->where('product_id', $where['product_id'])->where('unique', $where['unique'])->find();
  31. if($data['price'] == '0.00'){
  32. $data['price'] = round($data['ot_price'] * 1.05, 2);
  33. }
  34. $data['store_name'] = Db::name('Product')->where('id', $where['product_id'])->value('store_name');
  35. return app('json')->success($data);
  36. }
  37. /**
  38. * 买样订单
  39. * @param Request $request
  40. */
  41. public function buyOrder(Request $request)
  42. {
  43. $data = UtilService::getMore([
  44. ['pro_id', '', 'empty', '参数错误'],
  45. ['unique', '', 'empty', '参数错误'],
  46. ['num', '', 'empty', '参数错误'],
  47. ['addressId', '', 'empty', '参数错误'],
  48. ['pro_price', 0],
  49. ['postage', 0],
  50. ['all_price', 0],
  51. ['mono', '']
  52. ], $request);
  53. try {
  54. OrderModel::beginTrans();
  55. $addressId = $data['addressId'];
  56. unset($data['addressId']);
  57. $data['order_id'] = 'TF' . time() . sprintf('%04d', rand(0, 1000)) . $request->user['uid']; //订单号
  58. $data['uid'] = $request->user['uid'];
  59. $data['time'] = time();
  60. $oId = OrderModel::insertGetId($data);
  61. $address = UserAddress::find($addressId);
  62. $save['o_id'] = $oId;
  63. $save['uid'] = $request->user['uid'];
  64. $save['name'] = $address['real_name'];
  65. $save['mobile'] = $address['phone'];
  66. $save['address'] = $address['province'] . $address['city'] . $address['district'] . $address['detail'];
  67. $save['money'] = $data['all_price'];
  68. $save['pro_price'] = $data['pro_price'];
  69. $save['pro_id'] = $data['pro_id'];
  70. $save['exp_price'] = $data['postage'];
  71. $save['time'] = time();
  72. OrderInfo::insert($save);
  73. OrderModel::commitTrans();
  74. } catch (DbException $db) {
  75. OrderModel::rollbackTrans();
  76. return app('json')->fail("下单失败,原因:" . $db->getMessage());
  77. }
  78. return app('json')->success([
  79. 'order_id' => $data['order_id'],
  80. 'price' => $data['all_price']
  81. ]);
  82. }
  83. /**
  84. * 代发订单
  85. * @param Request $request
  86. */
  87. public function subOrder(Request $request)
  88. {
  89. [$orderAr, $proId, $warehouseId, $expId, $platformId, $mono, $extraFreight] = UtilService::getMore([
  90. ['orderAr', '', 'empty', '参数错误'],
  91. ['proId', '', 'empty', '参数错误'],
  92. ['warehouseId', '', 'empty', '参数错误'],
  93. ['expId', '', 'empty', '请选择运送方式'],
  94. ['platformId', '', 'empty', '参数错误'],
  95. ['mono', ''],
  96. ['extraFreight', 0]
  97. ], $request, true);
  98. $expPrice = 0; //邮费费用
  99. $expressId = 0; //快递ID
  100. $siteExpCommission = 0;//分站佣金费用
  101. //检测数据
  102. $sitePro = (new SiteProduct)->getItem($proId);
  103. if ($sitePro['count'] <= 0 || count($orderAr) > $sitePro['count']) {
  104. return app('json')->fail("订单产品数量不足,请重新选择!");
  105. }
  106. //判断仓库是否可以下单
  107. $warehouseIds = explode(',',$sitePro['warehouse_ids']);
  108. if(!in_array($warehouseId,$warehouseIds)) {
  109. return app('json')->fail("请重新选择产品!");
  110. }
  111. $warehouse = (new Warehouse)->where('id',$warehouseId)->find();
  112. if(empty($warehouse) || empty($warehouse['status'])) {
  113. return app('json')->fail("分仓已下架,请选择其他分仓");
  114. }
  115. $region = new Region;
  116. //检查地址数据
  117. foreach ($orderAr as $k => $v) {
  118. $rData = $region->getRegion($v['address']);
  119. if (empty($rData['province']) ||
  120. empty($rData['city']) ||
  121. empty($rData['area'])
  122. ) {
  123. // return app('json')->fail('第' . (intval($k) + 1) .'行,'.$v['address'] .'地址信息有误,请重新检查省市区!');
  124. }
  125. }
  126. //订单总数
  127. $orderCount = count($orderAr);
  128. $price = $sitePro['price'] * $orderCount;
  129. $siteProCommission = $sitePro['price'] > $sitePro['commission'] ? ($sitePro['price'] - $sitePro['commission']) : 0;//分站佣金
  130. //快递信息
  131. $expCode = new ExpCost;
  132. $expCode->getExpCostData($request->site['sassid'], $request->user['levelid']);
  133. $expData = array_filter($expCode->getWareHouseExpCost($warehouseId, '*'), function ($item) use ($expId) {
  134. if ($item['id'] == $expId) {
  135. return true;
  136. }
  137. });
  138. //如果有快递信息,分析分账提成 || 用户推荐佣金
  139. if (!empty($expData)) {
  140. $expressId = $expData[0]['express_id'];
  141. $expPrice = $expData[0]['money'];
  142. //分站金额
  143. $money = $expCode->getSysExpCostPrice($expressId, $warehouseId, $request->site['sassid']);
  144. $siteExpCommission = empty($money) ? 0 : ($expPrice > $money ? ($expPrice - $money) : 0);
  145. }
  146. if (empty($expressId)) {
  147. return app('json')->fail("本次邮寄方式不存在,请重新选择邮寄方式。");
  148. }
  149. //获取低价
  150. $floorExp = $expCode
  151. ->where('warehouse_id', $warehouseId)
  152. ->where('express_id', $expressId)
  153. ->where('sassid', 0)
  154. ->where('level_id', -1)
  155. ->value('money');
  156. //会员店铺
  157. $shopAr = [];
  158. foreach ($orderAr as $v) {
  159. $shop_name = trim($v['shop_name']);
  160. if (!empty($shop_name)) {
  161. $shopAr[$shop_name] = ['name' => $shop_name];
  162. }
  163. }
  164. try {
  165. \app\model\api\Order::beginTrans();
  166. $mShop = new MemberShop;
  167. foreach ($shopAr as $k => $v) {
  168. $shopId = $mShop->where('name', $k)
  169. ->where('uid', $this->user['uid'])
  170. ->value('id');
  171. if (empty($shopId)) $shopId = $mShop->insertGetId(['name' => $k, 'uid' => $this->user['uid']]);
  172. $shopAr[$k]['id'] = $shopId;
  173. }
  174. //下单
  175. $save['order_id'] = 'TF' . time() . sprintf('%04d', rand(0, 1000)) . $request->user['uid'];//订单号
  176. $save['all_price'] = $price + $expPrice * $orderCount + $extraFreight;//总金额 [价格 + 快递*产品数量]
  177. $save['pro_site_commission'] = $siteProCommission * $orderCount;//产品分站佣金
  178. $save['exp_site_commission'] = $siteExpCommission * $orderCount;//快递分站佣金
  179. $save['site_commission'] = $save['pro_site_commission'] + $save['exp_site_commission'];//分站提成
  180. $save['pro_id'] = $sitePro['id'];//产品ID
  181. $save['platform_id'] = $platformId;//来源[拼多多,淘宝]
  182. $save['warehouse_id'] = $warehouseId;//仓库来源
  183. $save['status'] = 0;//状态
  184. $save['time'] = time();
  185. $save['express_id'] = $expressId;//快递类型
  186. $save['sassid'] = $request->site['sassid'];//分站
  187. $save['mono'] = $mono;//备注
  188. $save['pro_price'] = $price;//产品价格
  189. $save['uid'] = $request->user['uid'];
  190. $oId = (new Order)->insertGetId($save);
  191. foreach ($orderAr as $k => $v) {
  192. $shop_name = trim($v['shop_name']);
  193. $d = [];
  194. $d['o_id'] = $oId;
  195. $d['in_order_id'] = $save['order_id'] . '-' . ($k + 1);
  196. $d['out_order_id'] = $v['out_order_id'];
  197. $d['name'] = $v['name'];
  198. $d['mobile'] = $v['mobile'];
  199. $d['address'] = $v['address'];
  200. $d['pro_price'] = $sitePro['price'];
  201. $d['pro_id'] = $sitePro['id'];
  202. $d['exp_id'] = $expressId;
  203. if(strstr($d['address'], '北京')){
  204. $d['exp_price'] = $expPrice + $warehouse['beijing'];
  205. }else if(strstr($d['address'], '上海')){
  206. $d['exp_price'] = $expPrice + $warehouse['shanghai'];
  207. }else if(strstr($d['address'], '青海')){
  208. $d['exp_price'] = $expPrice + $warehouse['qinghai'];
  209. }else{
  210. $d['exp_price'] = $expPrice;
  211. }
  212. $d['money'] = $sitePro['price'] + $d['exp_price'];
  213. $d['sassid'] = $request->site['sassid'];
  214. $d['uid'] = $request->user['uid'];
  215. $d['time'] = time();
  216. $d['platform_id'] = $platformId;
  217. $d['warehouse_id'] = $warehouseId;
  218. $d['pro_site_commission'] = $siteProCommission;
  219. $d['exp_site_commission'] = $siteExpCommission;
  220. $d['site_commission'] = $siteProCommission + $siteExpCommission;
  221. $d['exp_floor_price'] = empty($floorExp) ? 0 : $floorExp;
  222. $d['shop_id'] = empty($shop_name) ? 0 : $shopAr[$shop_name]['id'];
  223. (new OrderInfo)->insert($d);
  224. }
  225. Order::commitTrans();
  226. } catch (DbException $db) {
  227. Order::rollbackTrans();
  228. return app('json')->fail("下单失败,理由:" . $db->getMessage());
  229. }
  230. return app('json')->success([
  231. 'order_id' => $save['order_id'],
  232. 'price' => $save['all_price'],
  233. ]);
  234. }
  235. /**
  236. * 余额支付
  237. * @param Request $request
  238. */
  239. public function balancePay(Request $request)
  240. {
  241. [$orderId] = UtilService::getMore([
  242. ['order_id', '', 'empty', '参数错误'],
  243. ], $request, true);
  244. $order = OrderModel::where('order_id', $orderId)->find();
  245. if (empty($order)) {
  246. return app('json')->fail('找不到订单信息');
  247. }
  248. //订单已付款
  249. if (!empty($order['is_pay'])) {
  250. return app('json')->fail('订单已经支付成功');
  251. }
  252. if ($order['all_price'] > $request->user['money']) {
  253. return app('json')->fail('余额不足!');
  254. }
  255. $res = (new MemberDetail)->consumption($order['all_price'], $request->user['uid'], [
  256. 'mobile' => $request->user['mobile'],
  257. 'order_id' => $orderId,
  258. 'money' => $order['all_price']
  259. ]);
  260. if ($res) {
  261. //减库存加销量
  262. (new Product)->where('id', $order['pro_id'])->dec('stock', $order['num'])->inc('sales', $order['num'])->update();
  263. Db::name('ProductAttrValue')->where('product_id', $order['pro_id'])->where('unique', $order['unique'])->dec('stock', $order['num'])->inc('sales', $order['num'])->update();
  264. //改订单状态
  265. OrderModel::where('order_id', $orderId)->save([
  266. 'status' => 1,
  267. 'is_pay' => 1,
  268. 'pay_type' => 'yue',
  269. 'pay_time' => time()
  270. ]);
  271. //改子订单状态
  272. OrderInfo::where('o_id', $order['id'])->save(['status' => 1,]);
  273. //设置维护人
  274. /*$last_con_time = (new Member)->where('uid', $request->user['uid'])->value('last_con_time');
  275. if($last_con_time == 0){
  276. $follow = (new MemberFollow)->where('uid', $request->user['uid'])->where('admin_id', 99)->find();
  277. if($follow){
  278. (new Member)->where('uid', $request->user['uid'])->save(['admin_id' => 99]);
  279. }else{
  280. (new Member)->where('uid', $request->user['uid'])->save(['admin_id' => 100]);
  281. }
  282. }*/
  283. (new Member)->where('uid', $request->user['uid'])->save(['last_con_time' => time()]);
  284. return app('json')->success(['msg' => '支付成功']);
  285. } else {
  286. return app('json')->fail('支付失败');
  287. }
  288. }
  289. /**
  290. * 获取订单列表
  291. * @param Request $request
  292. */
  293. public function getOrderList(Request $request)
  294. {
  295. $where = UtilService::getMore([
  296. ['type', ''],
  297. ['page', 0],
  298. ['limit', '']
  299. ], $request);
  300. $data = (new OrderModel)->getUserOrderList($request->user['uid'], $where);
  301. return app('json')->success($data);
  302. }
  303. /**
  304. * 取消订单
  305. * @param Request $request
  306. */
  307. public function cancelOrder(Request $request)
  308. {
  309. $post = UtilService::getMore([
  310. ['id', '', 'empty', '参数错误'],
  311. ], $request);
  312. $order = new OrderModel;
  313. $data = $order
  314. ->where('uid', $request->user['uid'])
  315. ->where('id', $post['id'])
  316. ->find();
  317. if (empty($data)) {
  318. return app('json')->fail('找不到订单信息');
  319. }
  320. //订单状态
  321. if ($data['status'] != 0) {
  322. return app('json')->fail('当前订单无法取消');
  323. }
  324. $order->where('id', $data['id'])->save(['status' => -1,]);
  325. (new OrderInfo)->where('o_id', $data['id'])->save(['status' => -1]);
  326. return app('json')->success(['msg' => '取消成功']);
  327. }
  328. }