Order.php 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  1. <?php
  2. namespace app\api\controller\user;
  3. use app\api\controller\Controller;
  4. use app\api\model\order\Order as OrderModel;
  5. use app\api\model\settings\Setting as SettingModel;
  6. use app\common\enum\order\OrderPayTypeEnum;
  7. use app\common\enum\settings\SettingEnum;
  8. use app\common\model\settings\Setting;
  9. use app\common\service\qrcode\ExtractService;
  10. use app\shop\model\order\Deliver;
  11. use app\shop\model\settings\Express;
  12. use app\common\model\order\OrderAddress;
  13. use app\api\model\user\UserAddress;
  14. use think\facade\Validate;
  15. /**
  16. * 我的订单
  17. */
  18. class Order extends Controller
  19. {
  20. // user
  21. private $user;
  22. /**
  23. * 构造方法
  24. */
  25. public function initialize()
  26. {
  27. parent::initialize();
  28. $this->user = $this->getUser(); // 用户信息
  29. }
  30. /**
  31. * 修改收货地址
  32. */
  33. public function addressedit()
  34. {
  35. $data = $this->postData();
  36. if (empty($data['order_id'])) {
  37. return $this->renderError('订单id为空');
  38. }
  39. if (empty($data['address_id'])) {
  40. return $this->renderError('收货地址为空');
  41. }
  42. $order = OrderModel::getUserOrderDetail($data['order_id'], $this->user['user_id']);
  43. if ($order['delivery_status']['value'] == 20) {
  44. return $this->renderError('该订单已发货,不允许修改');
  45. }
  46. $useradd =(new UserAddress)->find($data['address_id']);
  47. if ($useradd['user_id'] != $this->user['user_id']) {
  48. return $this->renderError('收货地址信息错误');
  49. }
  50. $vall = [
  51. 'name' => $useradd['name'],
  52. 'phone' => $useradd['phone'],
  53. 'detail' => $useradd['detail'],
  54. 'province_id'=> $useradd['province_id'],
  55. 'city_id' => $useradd['city_id'],
  56. 'region_id' => $useradd['region_id'],
  57. ];
  58. (new OrderAddress)->where('order_id',$order['order_id'])->update($vall);
  59. $this->user->where('user_id',$this->user['user_id'])->update(['address_id'=>$data['address_id']]);
  60. return $this->renderSuccess('修改成功');
  61. }
  62. /**
  63. * 是否有未上传信息订单
  64. */
  65. public function borderorder()
  66. {
  67. $where = [
  68. ['user_id','=',$this->user['user_id']],
  69. ['is_border','=',20],
  70. ['order_status','in',"10,30"],
  71. ['pay_status','=',20],
  72. ['real_name','=',null],
  73. ];
  74. $order_id = (new OrderModel)->where($where)->value('order_id');
  75. if (empty($order_id)) {
  76. $data = [];
  77. }else{
  78. $data = ['order_id'=>$order_id];
  79. }
  80. return $this->renderSuccess('查询成功',$data);
  81. }
  82. /**
  83. * 跨境信息上传
  84. */
  85. public function crossborder()
  86. {
  87. $data = $this->postData();
  88. // $data = [
  89. // 'order_id' => 1,
  90. // 'real_name' => '葛云龙',
  91. // 'idcard' => '23018419910505303X',
  92. // 'card_front' => 'http://192.168.18.9:8009/uploads/20220408/3759c7b39b77fc40575172e864fc4489.jpg',
  93. // 'card_back' => 'http://192.168.18.9:8009/uploads/20220407/7ea9db666a9a95dd1f54e2a42e0ac3ed.png',
  94. // ];
  95. if (empty($data['order_id'])) {
  96. return $this->renderError('订单id为空');
  97. }
  98. if (empty($data['real_name'])) {
  99. return $this->renderError('请填写收货人真实姓名');
  100. }
  101. $order = OrderModel::getUserOrderDetail($data['order_id'], $this->user['user_id']);
  102. if (empty($order)) {
  103. return $this->renderError('订单信息错误');
  104. }
  105. if (!empty($order['card_front'])) {
  106. return $this->renderError('该订单信息已上传');
  107. }
  108. if ($order['address']['name'] != $data['real_name']) {
  109. return $this->renderError('收货人姓名信息错误');
  110. }
  111. if (empty($data['idcard'])) {
  112. return $this->renderError('请填写身份证号码');
  113. }
  114. $regIdCard = "/^(^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$)|(^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])((\d{4})|\d{3}[Xx])$)$/";
  115. if (!Validate::regex($data['idcard'],$regIdCard)){
  116. return $this->renderError('身份证号格式错误');
  117. return false;
  118. }
  119. if (empty($data['card_front'])) {
  120. return $this->renderError('请上传身份证正面照');
  121. }
  122. if (empty($data['card_back'])) {
  123. return $this->renderError('请上传身份证反面照');
  124. }
  125. $vall = [
  126. 'real_name' => $data['real_name'],
  127. 'idcard' => $data['idcard'],
  128. 'card_front' => $data['card_front'],
  129. 'card_back' => $data['card_back'],
  130. ];
  131. if ((new OrderModel)->where('order_id',$order['order_id'])->update($vall)) {
  132. return $this->renderSuccess('信息上传成功');
  133. }
  134. return $this->renderError('网络错误,请稍后再试');
  135. }
  136. /**
  137. * 我的订单列表
  138. */
  139. public function lists($dataType)
  140. {
  141. $data = $this->postData();
  142. $model = new OrderModel;
  143. $list = $model->getList($this->user['user_id'], $dataType, $data);
  144. $h5_alipay = Setting::getItem(SettingEnum::H5ALIPAY)['is_open'];
  145. return $this->renderSuccess('', compact('list', 'h5_alipay'));
  146. }
  147. /**
  148. * 订单详情信息
  149. */
  150. public function detail($order_id)
  151. {
  152. // 订单详情
  153. $model = OrderModel::getUserOrderDetail($order_id, $this->user['user_id']);
  154. // 剩余支付时间
  155. if($model['pay_status']['value'] == 10 && $model['order_status']['value'] != 20 && $model['pay_end_time'] != 0){
  156. $model['pay_end_time'] = $this->formatPayEndTime($model['pay_end_time'] - time());
  157. }else{
  158. $model['pay_end_time'] = '';
  159. }
  160. // 该订单是否允许申请售后
  161. $model['isAllowRefund'] = $model->isAllowRefund();
  162. $h5_alipay = Setting::getItem(SettingEnum::H5ALIPAY)['is_open'];
  163. return $this->renderSuccess('', [
  164. 'order' => $model, // 订单详情
  165. 'setting' => [
  166. // 积分名称
  167. 'points_name' => SettingModel::getPointsName(),
  168. ],
  169. 'h5_alipay' => $h5_alipay
  170. ]);
  171. }
  172. /**
  173. * 获取物流信息
  174. */
  175. public function express($order_id)
  176. {
  177. // 订单信息
  178. $order = OrderModel::getUserOrderDetail($order_id, $this->user['user_id']);
  179. if (!$order['express_no']) {
  180. return $this->renderError('没有物流信息');
  181. }
  182. // 获取物流信息
  183. $model = $order['express'];
  184. $express = $model->dynamic($model['express_name'], $model['express_code'], $order['express_no']);
  185. if ($express === false) {
  186. return $this->renderError($model->getError());
  187. }
  188. return $this->renderSuccess('', compact('express'));
  189. }
  190. /**
  191. * 取消订单
  192. */
  193. public function cancel($order_id)
  194. {
  195. $model = OrderModel::getUserOrderDetail($order_id, $this->user['user_id']);
  196. if ($model->cancel($this->user)) {
  197. return $this->renderSuccess('订单取消成功');
  198. }
  199. return $this->renderError($model->getError()?:'订单取消失败');
  200. }
  201. /**
  202. * 确认收货
  203. */
  204. public function receipt($order_id)
  205. {
  206. $model = OrderModel::getUserOrderDetail($order_id, $this->user['user_id']);
  207. if ($model->receipt()) {
  208. return $this->renderSuccess('收货成功');
  209. }
  210. return $this->renderError($model->getError()?:'收货失败');
  211. }
  212. /**
  213. * 立即支付
  214. */
  215. public function pay($order_id, $payType = OrderPayTypeEnum::WECHAT, $pay_source = 'wx')
  216. {
  217. // 获取订单详情
  218. $model = OrderModel::getUserOrderDetail($order_id, $this->user['user_id']);
  219. // 订单支付事件
  220. if (!$model->onPay($payType, $pay_source)) {
  221. return $this->renderError($model->getError() ?: '订单支付失败');
  222. }
  223. // 构建微信支付请求
  224. $payment = $model->onOrderPayment($this->user, $model, $payType, $pay_source);
  225. // 支付状态提醒
  226. return $this->renderSuccess('', [
  227. 'order_id' => $model['order_id'], // 订单id
  228. 'pay_type' => $payType, // 支付方式
  229. 'payment' => $payment // 微信支付参数
  230. ]);
  231. }
  232. /**
  233. * 获取订单核销二维码
  234. */
  235. public function qrcode($order_id, $source)
  236. {
  237. // 订单详情
  238. $order = OrderModel::getUserOrderDetail($order_id, $this->user['user_id']);
  239. // 判断是否为待核销订单
  240. if (!$order->checkExtractOrder($order)) {
  241. return $this->renderError($order->getError());
  242. }
  243. $Qrcode = new ExtractService(
  244. $this->app_id,
  245. $this->user,
  246. $order_id,
  247. $source,
  248. $order['order_no']
  249. );
  250. return $this->renderSuccess('',[
  251. 'qrcode' => $Qrcode->getImage(),
  252. ]);
  253. }
  254. private function formatPayEndTime($leftTime){
  255. if($leftTime <= 0){
  256. return '';
  257. }
  258. $str = '';
  259. $day = floor($leftTime/86400);
  260. $hour = floor(($leftTime - $day * 86400)/3600);
  261. $min = floor((($leftTime - $day * 86400) - $hour * 3600)/60);
  262. if ($day > 0) $str .= $day . '天';
  263. if ($hour > 0) $str .= $hour . '小时';
  264. if ($min > 0) $str .= $min . '分钟';
  265. return $str;
  266. }
  267. }