You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

427 lines
16 KiB

7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
  1. <?php
  2. namespace App\Http\Logic;
  3. use Log;
  4. use DB;
  5. use App\Common\ReturnData;
  6. use App\Http\Model\Order;
  7. use App\Http\Requests\OrderRequest;
  8. use Validator;
  9. class OrderLogic extends BaseLogic
  10. {
  11. public function __construct()
  12. {
  13. parent::__construct();
  14. }
  15. public function getModel()
  16. {
  17. return new Order();
  18. }
  19. public function getValidate($data, $scene_name)
  20. {
  21. //数据验证
  22. $validate = new OrderRequest();
  23. return Validator::make($data, $validate->getSceneRules($scene_name), $validate->getSceneRulesMessages());
  24. }
  25. //列表
  26. public function getList($where = array(), $order = '', $field = '*', $offset = '', $limit = '')
  27. {
  28. $res = $this->getModel()->getList($where, $order, $field, $offset, $limit);
  29. if($res['count'] > 0)
  30. {
  31. foreach($res['list'] as $k=>$v)
  32. {
  33. $res['list'][$k] = $this->getDataView($v);
  34. $order_status_arr = $this->getModel()->getOrderStatusAttr($v);
  35. $res['list'][$k]->order_status_text = $order_status_arr?$order_status_arr['text']:'';
  36. $res['list'][$k]->order_status_num = $order_status_arr?$order_status_arr['num']:'';
  37. $res['list'][$k]->province_name = model('Region')->getRegionName(['id'=>$v->province]);
  38. $res['list'][$k]->city_name = model('Region')->getRegionName(['id'=>$v->city]);
  39. $res['list'][$k]->district_name = model('Region')->getRegionName(['id'=>$v->district]);
  40. $order_goods = model('OrderGoods')->getDb()->where(array('order_id'=>$v->id))->get();
  41. $res['list'][$k]->goods_list = $order_goods;
  42. }
  43. }
  44. return $res;
  45. }
  46. //分页html
  47. public function getPaginate($where = array(), $order = '', $field = '*', $limit = '')
  48. {
  49. $res = $this->getModel()->getPaginate($where, $order, $field, $limit);
  50. return $res;
  51. }
  52. //全部列表
  53. public function getAll($where = array(), $order = '', $field = '*', $limit = '')
  54. {
  55. $res = $this->getModel()->getAll($where, $order, $field, $limit);
  56. /* if($res)
  57. {
  58. foreach($res as $k=>$v)
  59. {
  60. $res[$k] = $this->getDataView($v);
  61. }
  62. } */
  63. return $res;
  64. }
  65. //详情
  66. public function getOne($where = array(), $field = '*')
  67. {
  68. $res = $this->getModel()->getOne($where, $field);
  69. if(!$res){return false;}
  70. $res = $this->getDataView($res);
  71. $order_status_arr = $this->getModel()->getOrderStatusAttr($res);
  72. $res->order_status_text = $order_status_arr['text'];
  73. $res->order_status_num = $order_status_arr['num'];
  74. $res->province_name = model('Region')->getRegionName(['id'=>$res->province]);
  75. $res->city_name = model('Region')->getRegionName(['id'=>$res->city]);
  76. $res->district_name = model('Region')->getRegionName(['id'=>$res->district]);
  77. $order_goods = model('OrderGoods')->getDb()->where(array('order_id'=>$res->id))->get();
  78. $res->goods_list = $order_goods;
  79. return $res;
  80. }
  81. /**
  82. * 生成订单
  83. * @param string $data['cartids'] 购物车商品id,格式:1_2_3
  84. * @param int $data['user_id'] 用户id
  85. * @param int $data['user_bonus_id'] 用户优惠券id
  86. * @param string $data['default_address_id'] 用户默认收货地址
  87. * @param float $data['shipping_costs'] 运费
  88. * @param string $data['message'] 备注
  89. * @param int $data['place_type'] 订单来源,1pc,2微信,3app
  90. * @return array
  91. */
  92. public function add($data = array(), $type=0)
  93. {
  94. if(empty($data)){return ReturnData::create(ReturnData::PARAMS_ERROR);}
  95. //总的验证规则
  96. $rules = [
  97. 'cartids' => 'required',
  98. 'user_id' => 'required|integer',
  99. 'user_bonus_id' => 'integer',
  100. 'default_address_id' => 'required|integer',
  101. 'shipping_costs' => ['regex:/^\d{0,10}(\.\d{0,2})?$/'],
  102. 'message' => 'max:150',
  103. 'place_type' => 'integer|between:0,5',
  104. ];
  105. //总的自定义错误信息
  106. $messages = [
  107. 'cartids.required' => '购物车商品id必填',
  108. 'user_id.required' => '用户ID必填',
  109. 'user_id.integer' => '用户ID必须为数字',
  110. 'user_bonus_id.integer' => '优惠券ID必须为数字',
  111. 'default_address_id.required' => '收货地址必填',
  112. 'default_address_id.integer' => '收货地址必须为数字',
  113. 'shipping_costs.regex' => '运费格式不正确,运费只能带2位小数的数字',
  114. 'message.max' => '备注不能超过150个字符',
  115. 'place_type.integer' => '订单来源必须是数字',
  116. 'place_type.between' => '订单来源,1pc,2微信,3app',
  117. ];
  118. $validator = Validator::make($data, $rules, $messages);
  119. if ($validator->fails()){return ReturnData::create(ReturnData::PARAMS_ERROR, null, $validator->errors()->first());}
  120. //获取订单商品列表
  121. $cartCheckoutGoods = logic('Cart')->cartCheckoutGoodsList(array('ids'=>$data['cartids'],'user_id'=>$data['user_id']));
  122. $order_goods = $cartCheckoutGoods['data'];
  123. if(empty($order_goods['list'])){return ReturnData::create(ReturnData::SYSTEM_FAIL,null,'订单商品不存在');}
  124. //获取收货地址
  125. $user_address = model('UserAddress')->getOne(['user_id'=>$data['user_id'],'id'=>$data['default_address_id']]);
  126. if(!$user_address){return ReturnData::create(ReturnData::SYSTEM_FAIL,null,'收货地址不存在');}
  127. //获取优惠券信息
  128. $user_bonus = logic('UserBonus')->getUserBonusByid(array('user_bonus_id'=>$data['user_bonus_id'],'user_id'=>$data['user_id']));
  129. $discount = !empty($user_bonus)?$user_bonus['money']:0.00; //优惠金额=优惠券
  130. $order_amount = $order_goods['total_price'] - $discount;
  131. $pay_status = 0; //未付款
  132. //如果各种优惠金额大于订单实际金额跟运费之和,则默认订单状态为已付款
  133. if($order_amount < 0)
  134. {
  135. $order_amount = 0;
  136. $pay_status = 1; //已付款
  137. }
  138. //构造订单字段
  139. $order_info = array(
  140. 'order_sn' => date('YmdHis').rand(1000,9999),
  141. 'add_time' => time(),
  142. 'pay_status' => $pay_status,
  143. 'user_id' => $data['user_id'],
  144. 'goods_amount' => $order_goods['total_price'], //商品的总金额
  145. 'order_amount' => $order_amount, //应付金额=商品总价+运费-优惠(积分、红包)
  146. 'discount' => $discount, //优惠金额
  147. 'name' => $user_address->name,
  148. //'country' => $user_address->country,
  149. 'province' => $user_address->province,
  150. 'city' => $user_address->city,
  151. 'district' => $user_address->district,
  152. 'address' => $user_address->address,
  153. 'zipcode' => $user_address->zipcode,
  154. 'mobile' => $user_address->mobile,
  155. 'place_type' => $data['place_type'], //订单来源
  156. 'bonus_id' => $user_bonus?$user_bonus['id']:0,
  157. 'bonus_money' => $user_bonus?$user_bonus['money']:0.00,
  158. 'message' => $data['message'] ? $data['message'] : '',
  159. );
  160. //插入订单
  161. $order_id = $this->getModel()->add($order_info);
  162. if ($order_id)
  163. {
  164. //订单生成成功之后,扣除用户的积分和改变优惠券的使用状态
  165. //改变优惠券使用状态
  166. model('UserBonus')->getDb()->where(array('user_id'=>$data['user_id'],'id'=>$data['user_bonus_id']))->update(array('status'=>1,'used_time'=>time()));
  167. //扣除用户积分,预留
  168. //$updateMember['validscore'] = $addressInfo['validscore']-$PointPay;
  169. //M("Member")->where(array('id'=>$CustomerSysNo))->save($updateMember);
  170. //增加一条积分支出记录,一条购物获取积分记录
  171. //插入订单商品
  172. $order_goods_list = array();
  173. foreach($order_goods['list'] as $k=>$v)
  174. {
  175. $temp_order_goods = array(
  176. 'order_id' => $order_id,
  177. 'goods_id' => $v->goods_id,
  178. 'goods_name' => $v->title,
  179. 'goods_number' => $v->goods_number,
  180. 'market_price' => $v->market_price,
  181. 'goods_price' => $v->final_price,
  182. //'goods_attr' => '', //商品属性,预留
  183. 'goods_img' => $v->litpic
  184. );
  185. array_push($order_goods_list,$temp_order_goods);
  186. //订单商品直接减库存操作
  187. model('Goods')->changeGoodsStock(array('goods_id'=>$v->goods_id,'goods_number'=>$v->goods_number));
  188. }
  189. $result = model('OrderGoods')->add($order_goods_list,1);
  190. if($result)
  191. {
  192. //删除购物对应的记录
  193. model('Cart')->getDb()->where(array('user_id'=>$data['user_id']))->whereIn('id', explode("_",$data['cartids']))->delete();
  194. return ReturnData::create(ReturnData::SUCCESS, $order_id);
  195. }
  196. else
  197. {
  198. return ReturnData::create(ReturnData::SYSTEM_FAIL,null,'订单商品添加失败');
  199. }
  200. }
  201. return ReturnData::create(ReturnData::SYSTEM_FAIL,null,'生成订单失败');
  202. }
  203. //修改
  204. public function edit($data, $where = array())
  205. {
  206. if(empty($data)){return ReturnData::create(ReturnData::SUCCESS);}
  207. $validator = $this->getValidate($data, 'edit');
  208. if ($validator->fails()){return ReturnData::create(ReturnData::PARAMS_ERROR, null, $validator->errors()->first());}
  209. $res = $this->getModel()->edit($data,$where);
  210. if($res){return ReturnData::create(ReturnData::SUCCESS,$res);}
  211. return ReturnData::create(ReturnData::FAIL);
  212. }
  213. //删除
  214. public function del($where)
  215. {
  216. if(empty($where)){return ReturnData::create(ReturnData::PARAMS_ERROR);}
  217. $validator = $this->getValidate($where,'del');
  218. if ($validator->fails()){return ReturnData::create(ReturnData::PARAMS_ERROR, null, $validator->errors()->first());}
  219. $where2 = function ($query) use ($where) {
  220. $query->where($where)->where(function ($query2) {$query2->where(array('order_status'=>3,'refund_status'=>0))->orWhere(array('order_status'=>1))->orWhere(array('order_status'=>2));});
  221. };
  222. $data['is_delete'] = 1;
  223. $res = $this->getModel()->edit($data, $where2);
  224. if($res){return ReturnData::create(ReturnData::SUCCESS,$res);}
  225. return ReturnData::create(ReturnData::FAIL);
  226. }
  227. /**
  228. * 用户-取消订单
  229. * @param int $data['id'] 订单id
  230. * @param int $data['user_id'] 用户id
  231. * @return array
  232. */
  233. public function userCancelOrder($where = array())
  234. {
  235. if(empty($where)){return ReturnData::create(ReturnData::SUCCESS);}
  236. $where['order_status'] = 0;
  237. $where['pay_status'] = 0;
  238. $order = $this->getModel()->getOne($where);
  239. if(!$order){return ReturnData::create(ReturnData::PARAMS_ERROR,null,'订单不存在');}
  240. $data['order_status'] = 1;
  241. $data['updated_at'] = time();
  242. $res = $this->getModel()->edit($data,$where);
  243. if($res){return ReturnData::create(ReturnData::SUCCESS,$res);}
  244. return ReturnData::create(ReturnData::FAIL);
  245. }
  246. /**
  247. * 订单-余额支付
  248. * @param int $data['id'] 订单id
  249. * @param int $data['user_id'] 用户id
  250. * @return array
  251. */
  252. public function orderYuepay($where = array())
  253. {
  254. if(empty($where)){return ReturnData::create(ReturnData::SUCCESS);}
  255. $where['order_status'] = 0;
  256. $where['pay_status'] = 0;
  257. $order = $this->getModel()->getOne($where);
  258. if(!$order){return ReturnData::create(ReturnData::PARAMS_ERROR,null,'订单不存在');}
  259. DB::beginTransaction();
  260. $data['pay_status'] = 1;
  261. $data['pay_money'] = $order->order_amount; //支付金额
  262. $data['pay_id'] = 1;
  263. $data['pay_time'] = time();
  264. $data['updated_at'] = time();
  265. $res = $this->getModel()->edit($data,$where);
  266. if($res)
  267. {
  268. $user_money_data['user_id'] = $where['user_id'];
  269. $user_money_data['type'] = 1;
  270. $user_money_data['money'] = $order->order_amount;
  271. $user_money_data['des'] = '订单余额支付';
  272. if(!logic('UserMoney')->add($user_money_data)){DB::rollBack();}
  273. DB::commit();
  274. return ReturnData::create(ReturnData::SUCCESS,$res,'支付成功');
  275. }
  276. DB::rollBack();
  277. return ReturnData::create(ReturnData::FAIL);
  278. }
  279. /**
  280. * 订单-确认收货
  281. * @param int $data['id'] 订单id
  282. * @param int $data['user_id'] 用户id
  283. * @return array
  284. */
  285. public function orderReceiptConfirm($where = array())
  286. {
  287. if(empty($where)){return ReturnData::create(ReturnData::PARAMS_ERROR);}
  288. //判断订单是否存在或本人
  289. $where['order_status'] = 0;
  290. $where['refund_status'] = 0;
  291. $where['pay_status'] = 1;
  292. $order = $this->getModel()->getOne($where);
  293. if(!$order){return ReturnData::create(ReturnData::PARAMS_ERROR,null,'订单不存在');}
  294. $data['order_status'] = 3;
  295. $data['shipping_status'] = 2;
  296. $data['refund_status'] = 0;
  297. $data['is_comment'] = 0;
  298. $data['updated_at'] = time();
  299. $res = $this->getModel()->edit($data,$where);
  300. if($res)
  301. {
  302. return ReturnData::create(ReturnData::SUCCESS);
  303. }
  304. return ReturnData::create(ReturnData::FAIL);
  305. }
  306. /**
  307. * 订单-退款退货
  308. * @param int $data['id'] 订单id
  309. * @param int $data['user_id'] 用户id
  310. * @return array
  311. */
  312. public function orderRefund($where = array())
  313. {
  314. if(empty($where)){return ReturnData::create(ReturnData::PARAMS_ERROR);}
  315. $where['order_status'] = 3;
  316. $where['refund_status'] = 0;
  317. $order = $this->getModel()->getOne($where);
  318. if(!$order){return ReturnData::create(ReturnData::PARAMS_ERROR,null,'订单不存在');}
  319. $data['refund_status'] = 1;
  320. $data['updated_at'] = time();
  321. $res = $this->getModel()->edit($data,$where);
  322. if($res)
  323. {
  324. return ReturnData::create(ReturnData::SUCCESS);
  325. }
  326. return ReturnData::create(ReturnData::FAIL);
  327. }
  328. /**
  329. * 订单-设为评价
  330. * @param int $data['id'] 订单id
  331. * @param int $data['user_id'] 用户id
  332. * @return array
  333. */
  334. public function orderSetComment($where = array())
  335. {
  336. if(empty($where)){return ReturnData::create(ReturnData::PARAMS_ERROR);}
  337. $where['order_status'] = 3;
  338. $where['refund_status'] = 0;
  339. $data['is_comment'] = Order::ORDER_UN_COMMENT;
  340. $order = $this->getModel()->getOne($where);
  341. if(!$order){return ReturnData::create(ReturnData::PARAMS_ERROR,null,'订单不存在,或已评价');}
  342. $data['is_comment'] = Order::ORDER_IS_COMMENT;
  343. $data['updated_at'] = time();
  344. $res = $this->getModel()->edit($data,$where);
  345. if($res)
  346. {
  347. return ReturnData::create(ReturnData::SUCCESS);
  348. }
  349. return ReturnData::create(ReturnData::FAIL);
  350. }
  351. /**
  352. * 数据获取器
  353. * @param array $data 要转化的数据
  354. * @return array
  355. */
  356. private function getDataView($data = array())
  357. {
  358. return getDataAttr($this->getModel(),$data);
  359. }
  360. }