StoreOrder.php 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674
  1. <?php
  2. /**
  3. *
  4. * @author: xaboy<365615158@qq.com>
  5. * @day: 2017/11/11
  6. */
  7. namespace app\admin\controller\order;
  8. use Api\Express;
  9. use app\admin\controller\AuthController;
  10. use service\FormBuilder as Form;
  11. use app\admin\model\order\StoreOrderStatus;
  12. use app\admin\model\ump\StorePink;
  13. use app\admin\model\user\User;
  14. use app\admin\model\user\UserBill;
  15. use basic\ModelBasic;
  16. use behavior\admin\OrderBehavior;
  17. use behavior\wechat\PaymentBehavior;
  18. use EasyWeChat\Core\Exception;
  19. use service\CacheService;
  20. use service\HookService;
  21. use service\JsonService;
  22. use app\core\util\SystemConfigService;
  23. use service\UtilService as Util;
  24. use service\JsonService as Json;
  25. use think\Db;
  26. use think\Request;
  27. use think\Url;
  28. use app\admin\model\order\StoreOrder as StoreOrderModel;
  29. /**
  30. * 订单管理控制器 同一个订单表放在一个控制器
  31. * Class StoreOrder
  32. * @package app\admin\controller\store
  33. */
  34. class StoreOrder extends AuthController
  35. {
  36. /**
  37. * @return mixed
  38. */
  39. public function index()
  40. {
  41. $this->assign([
  42. 'year'=>getMonth('y'),
  43. 'real_name'=>$this->request->get('real_name',''),
  44. 'status'=>$this->request->param('status',''),
  45. 'orderCount'=>StoreOrderModel::orderCount(),
  46. ]);
  47. return $this->fetch();
  48. }
  49. /**
  50. * 获取头部订单金额等信息
  51. * return json
  52. *
  53. */
  54. public function getBadge(){
  55. $where = Util::postMore([
  56. ['status',''],
  57. ['real_name',''],
  58. ['is_del',0],
  59. ['data',''],
  60. ['type',''],
  61. ['order','']
  62. ]);
  63. return JsonService::successful(StoreOrderModel::getBadge($where));
  64. }
  65. /**
  66. * 获取订单列表
  67. * return json
  68. */
  69. public function order_list(){
  70. $where = Util::getMore([
  71. ['status',''],
  72. ['real_name',$this->request->param('real_name','')],
  73. ['is_del',0],
  74. ['data',''],
  75. ['type',''],
  76. ['order',''],
  77. ['page',1],
  78. ['limit',20],
  79. ['excel',0]
  80. ]);
  81. return JsonService::successlayui(StoreOrderModel::OrderList($where));
  82. }
  83. /*
  84. * 发送货
  85. * @param int $id
  86. * @return html
  87. * */
  88. public function order_goods($id = 0)
  89. {
  90. $list = Db::name('express')->where('is_show',1)->order('sort DESC')->column('id,name');
  91. $this->assign([
  92. 'list'=>$list,
  93. 'id'=>$id
  94. ]);
  95. return $this->fetch();
  96. }
  97. /*
  98. * 删除订单
  99. * */
  100. public function del_order($ids=[])
  101. {
  102. if(!count($ids)) return JsonService::fail('请选择需要删除的订单');
  103. if(StoreOrderModel::where('is_del',0)->where('id','in',$ids)->count()) return JsonService::fail('您选择的的订单存在用户未删除的订单,无法删除用户未删除的订单');
  104. $res=StoreOrderModel::where('id','in',$ids)->update(['is_system_del'=>1]);
  105. if($res)
  106. return JsonService::successful('删除成功');
  107. else
  108. return JsonService::fail('删除失败');
  109. }
  110. public function orderchart(){
  111. $where = Util::getMore([
  112. ['status',''],
  113. ['real_name',''],
  114. ['is_del',0],
  115. ['data',''],
  116. ['combination_id',''],
  117. ['export',0],
  118. ['order','id desc']
  119. ],$this->request);
  120. $limitTimeList = [
  121. 'today'=>implode(' - ',[date('Y/m/d'),date('Y/m/d',strtotime('+1 day'))]),
  122. 'week'=>implode(' - ',[
  123. date('Y/m/d', (time() - ((date('w') == 0 ? 7 : date('w')) - 1) * 24 * 3600)),
  124. date('Y-m-d', (time() + (7 - (date('w') == 0 ? 7 : date('w'))) * 24 * 3600))
  125. ]),
  126. 'month'=>implode(' - ',[date('Y/m').'/01',date('Y/m').'/'.date('t')]),
  127. 'quarter'=>implode(' - ',[
  128. date('Y').'/'.(ceil((date('n'))/3)*3-3+1).'/01',
  129. date('Y').'/'.(ceil((date('n'))/3)*3).'/'.date('t',mktime(0,0,0,(ceil((date('n'))/3)*3),1,date('Y')))
  130. ]),
  131. 'year'=>implode(' - ',[
  132. date('Y').'/01/01',date('Y/m/d',strtotime(date('Y').'/01/01 + 1year -1 day'))
  133. ])
  134. ];
  135. if($where['data'] == '') $where['data'] = $limitTimeList['today'];
  136. $orderCount = [
  137. urlencode('未支付')=>StoreOrderModel::getOrderWhere($where,StoreOrderModel::statusByWhere(0))->count(),
  138. urlencode('未发货')=>StoreOrderModel::getOrderWhere($where,StoreOrderModel::statusByWhere(1))->count(),
  139. urlencode('待收货')=>StoreOrderModel::getOrderWhere($where,StoreOrderModel::statusByWhere(2))->count(),
  140. urlencode('待评价')=>StoreOrderModel::getOrderWhere($where,StoreOrderModel::statusByWhere(3))->count(),
  141. urlencode('交易完成')=>StoreOrderModel::getOrderWhere($where,StoreOrderModel::statusByWhere(4))->count(),
  142. urlencode('退款中')=>StoreOrderModel::getOrderWhere($where,StoreOrderModel::statusByWhere(-1))->count(),
  143. urlencode('已退款')=>StoreOrderModel::getOrderWhere($where,StoreOrderModel::statusByWhere(-2))->count()
  144. ];
  145. $model = StoreOrderModel::getOrderWhere($where,new StoreOrderModel())->field('sum(total_num) total_num,count(*) count,sum(total_price) total_price,sum(refund_price) refund_price,from_unixtime(add_time,\'%Y-%m-%d\') add_time')
  146. ->group('from_unixtime(add_time,\'%Y-%m-%d\')');
  147. $orderPrice = $model->select()->toArray();
  148. $orderDays = [];
  149. $orderCategory = [
  150. ['name'=>'商品数','type'=>'line','data'=>[]],
  151. ['name'=>'订单数','type'=>'line','data'=>[]],
  152. ['name'=>'订单金额','type'=>'line','data'=>[]],
  153. ['name'=>'退款金额','type'=>'line','data'=>[]]
  154. ];
  155. foreach ($orderPrice as $price){
  156. $orderDays[] = $price['add_time'];
  157. $orderCategory[0]['data'][] = $price['total_num'];
  158. $orderCategory[1]['data'][] = $price['count'];
  159. $orderCategory[2]['data'][] = $price['total_price'];
  160. $orderCategory[3]['data'][] = $price['refund_price'];
  161. }
  162. $this->assign(StoreOrderModel::systemPage($where,$this->adminId));
  163. $this->assign('price',StoreOrderModel::getOrderPrice($where));
  164. $this->assign(compact('limitTimeList','where','orderCount','orderPrice','orderDays','orderCategory'));
  165. return $this->fetch();
  166. }
  167. /**
  168. * 修改支付金额等
  169. * @param $id
  170. * @return mixed|\think\response\Json|void
  171. */
  172. public function edit($id)
  173. {
  174. if(!$id) return $this->failed('数据不存在');
  175. $product = StoreOrderModel::get($id);
  176. if(!$product) return Json::fail('数据不存在!');
  177. $f = array();
  178. $f[] = Form::input('order_id','订单编号',$product->getData('order_id'))->disabled(1);
  179. $f[] = Form::number('total_price','商品总价',$product->getData('total_price'))->min(0);
  180. $f[] = Form::number('total_postage','原始邮费',$product->getData('total_postage'))->min(0);
  181. $f[] = Form::number('pay_price','实际支付金额',$product->getData('pay_price'))->min(0);
  182. $f[] = Form::number('pay_postage','实际支付邮费',$product->getData('pay_postage'));
  183. $f[] = Form::number('gain_integral','赠送积分',$product->getData('gain_integral'));
  184. // $f[] = Form::radio('status','状态',$product->getData('status'))->options([['label'=>'开启','value'=>1],['label'=>'关闭','value'=>0]]);
  185. $form = Form::make_post_form('修改订单',$f,Url::build('update',array('id'=>$id)));
  186. $this->assign(compact('form'));
  187. return $this->fetch('public/form-builder');
  188. }
  189. /** 修改订单提交更新
  190. * @param Request $request
  191. * @param $id
  192. */
  193. public function update(Request $request, $id)
  194. {
  195. $data = Util::postMore([
  196. 'order_id',
  197. 'total_price',
  198. 'total_postage',
  199. 'pay_price',
  200. 'pay_postage',
  201. 'gain_integral',
  202. ],$request);
  203. if($data['total_price'] <= 0) return Json::fail('请输入商品总价');
  204. if($data['pay_price'] <= 0) return Json::fail('请输入实际支付金额');
  205. $data['order_id'] = StoreOrderModel::changeOrderId($data['order_id']);
  206. StoreOrderModel::edit($data,$id);
  207. HookService::afterListen('store_product_order_edit',$data,$id,false,OrderBehavior::class);
  208. StoreOrderStatus::setStatus($id,'order_edit','修改商品总价为:'.$data['total_price'].' 实际支付金额'.$data['pay_price']);
  209. return Json::successful('修改成功!');
  210. }
  211. /**
  212. * TODO 填写送货信息
  213. * @param $id
  214. * @return mixed|void
  215. * @throws \think\exception\DbException
  216. */
  217. public function delivery($id){
  218. if(!$id) return $this->failed('数据不存在');
  219. $product = StoreOrderModel::get($id);
  220. if(!$product) return Json::fail('数据不存在!');
  221. if($product['paid'] == 1 && $product['status'] == 0) {
  222. $f = array();
  223. $f[] = Form::input('delivery_name','送货人姓名')->required('送货人姓名不能为空','required:true;');
  224. $f[] = Form::input('delivery_id','送货人电话')->required('请输入正确电话号码','telephone');
  225. $form = Form::make_post_form('修改订单',$f,Url::build('updateDelivery',array('id'=>$id)),7);
  226. $this->assign(compact('form'));
  227. return $this->fetch('public/form-builder');
  228. }
  229. else $this->failedNotice('订单状态错误');
  230. }
  231. /**
  232. * TODO 送货信息提交
  233. * @param Request $request
  234. * @param $id
  235. */
  236. public function update_delivery(Request $request, $id){
  237. $data = Util::postMore([
  238. ['type',1],
  239. 'delivery_name',
  240. 'delivery_id',
  241. ['sh_delivery_name',''],
  242. ['sh_delivery_id',''],
  243. ],$request);
  244. switch ((int)$data['type']){
  245. case 1:
  246. //发货
  247. $data['delivery_type'] = 'express';
  248. if(!$data['delivery_name']) return Json::fail('请选择快递公司');
  249. if(!$data['delivery_id']) return Json::fail('请输入快递单号');
  250. $data['status'] = 1;
  251. StoreOrderModel::edit($data,$id);
  252. HookService::afterListen('store_product_order_delivery_goods',$data,$id,false,OrderBehavior::class);
  253. StoreOrderStatus::setStatus($id,'delivery_goods','已发货 快递公司:'.$data['delivery_name'].' 快递单号:'.$data['delivery_id']);
  254. break;
  255. case 2:
  256. //送货
  257. $data['delivery_type'] = 'send';
  258. $data['delivery_name'] = $data['sh_delivery_name'];
  259. $data['delivery_id'] = $data['sh_delivery_id'];
  260. unset($data['sh_delivery_name'],$data['sh_delivery_id']);
  261. if(!$data['delivery_name']) return Json::fail('请输入送货人姓名');
  262. if(!(int)$data['delivery_id']) return Json::fail('请输入送货人电话号码');
  263. else if(!preg_match("/^1[3456789]{1}\d{9}$/",$data['delivery_id'])) return Json::fail('请输入正确的送货人电话号码');
  264. $data['status'] = 1;
  265. StoreOrderModel::edit($data,$id);
  266. HookService::afterListen('store_product_order_delivery',$data,$id,false,OrderBehavior::class);
  267. StoreOrderStatus::setStatus($id,'delivery','已配送 发货人:'.$data['delivery_name'].' 发货人电话:'.$data['delivery_id']);
  268. break;
  269. case 3:
  270. //虚拟发货
  271. $data['delivery_type'] = 'fictitious';
  272. $data['status'] = 1;
  273. StoreOrderModel::edit($data,$id);
  274. HookService::afterListen('store_product_order_delivery',$data,$id,false,OrderBehavior::class);
  275. StoreOrderStatus::setStatus($id,'delivery_fictitious','已虚拟发货');
  276. StoreOrderStatus::setStatus($id,'take_delivery','虚拟物品已收货');
  277. break;
  278. default:
  279. return Json::fail('暂时不支持其他发货类型');
  280. break;
  281. }
  282. return Json::successful('修改成功!');
  283. }
  284. /**
  285. * TODO 填写发货信息
  286. * @param $id
  287. * @return mixed|void
  288. * @throws \think\exception\DbException
  289. */
  290. public function deliver_goods($id){
  291. if(!$id) return $this->failed('数据不存在');
  292. $product = StoreOrderModel::get($id);
  293. if(!$product) return Json::fail('数据不存在!');
  294. if($product['paid'] == 1 && $product['status'] == 0){
  295. $f = array();
  296. $f[] = Form::select('delivery_name','快递公司')->setOptions(function(){
  297. $list = Db::name('express')->where('is_show',1)->order('sort DESC')->column('id,name');
  298. $menus = [];
  299. foreach ($list as $k=>$v){
  300. $menus[] = ['value'=>$v,'label'=>$v];
  301. }
  302. return $menus;
  303. })->filterable(1);
  304. $f[] = Form::input('delivery_id','快递单号');
  305. $form = Form::make_post_form('修改订单',$f,Url::build('updateDeliveryGoods',array('id'=>$id)),7);
  306. $this->assign(compact('form'));
  307. return $this->fetch('public/form-builder');
  308. }
  309. else return $this->failedNotice('订单状态错误');
  310. }
  311. /**
  312. * TODO 发货信息提交
  313. * @param Request $request
  314. * @param $id
  315. */
  316. public function updateDeliveryGoods(Request $request, $id){
  317. $data = Util::postMore([
  318. 'delivery_name',
  319. 'delivery_id',
  320. ],$request);
  321. $data['delivery_type'] = 'express';
  322. if(!$data['delivery_name']) return Json::fail('请选择快递公司');
  323. if(!$data['delivery_id']) return Json::fail('请输入快递单号');
  324. $data['status'] = 1;
  325. StoreOrderModel::edit($data,$id);
  326. HookService::afterListen('store_product_order_delivery_goods',$data,$id,false,OrderBehavior::class);
  327. StoreOrderStatus::setStatus($id,'delivery_goods','已发货 快递公司:'.$data['delivery_name'].' 快递单号:'.$data['delivery_id']);
  328. return Json::successful('修改成功!');
  329. }
  330. /**
  331. * 修改状态为已收货
  332. * @param $id
  333. * @return \think\response\Json|void
  334. */
  335. public function take_delivery($id){
  336. if(!$id) return $this->failed('数据不存在');
  337. $order = StoreOrderModel::get($id);
  338. if(!$order) return Json::fail('数据不存在!');
  339. if($order['status'] == 2) return Json::fail('不能重复收货!');
  340. if($order['paid'] == 1 && $order['status'] == 1) $data['status'] = 2;
  341. else if($order['pay_type'] == 'offline') $data['status'] = 2;
  342. else return Json::fail('请先发货或者送货!');
  343. if(!StoreOrderModel::edit($data,$id))
  344. return Json::fail(StoreOrderModel::getErrorInfo('收货失败,请稍候再试!'));
  345. else{
  346. try{
  347. HookService::listen('store_product_order_take_delivery',$order,$id,false,OrderBehavior::class);
  348. }catch (\Exception $e){
  349. return Json::fail($e->getMessage());
  350. }
  351. StoreOrderStatus::setStatus($id,'take_delivery','已收货');
  352. return Json::successful('收货成功!');
  353. }
  354. }
  355. /**
  356. * 修改退款状态
  357. * @param $id
  358. * @return \think\response\Json|void
  359. */
  360. public function refund_y($id){
  361. if(!$id) return $this->failed('数据不存在');
  362. $product = StoreOrderModel::get($id);
  363. if(!$product) return Json::fail('数据不存在!');
  364. if($product['paid'] == 1){
  365. $f = array();
  366. $f[] = Form::input('order_id','退款单号',$product->getData('order_id'))->disabled(1);
  367. $f[] = Form::number('refund_price','退款金额',$product->getData('pay_price'))->precision(2)->min(0.01);
  368. $f[] = Form::radio('type','状态',1)->options([['label'=>'直接退款','value'=>1],['label'=>'退款后,返回原状态','value'=>2]]);
  369. $form = Form::make_post_form('退款处理',$f,Url::build('updateRefundY',array('id'=>$id)),7);
  370. $this->assign(compact('form'));
  371. return $this->fetch('public/form-builder');
  372. }
  373. else return Json::fail('数据不存在!');
  374. }
  375. /**退款处理
  376. * @param Request $request
  377. * @param $id
  378. */
  379. public function updateRefundY(Request $request, $id){
  380. $data = Util::postMore([
  381. 'refund_price',
  382. ['type',1],
  383. ],$request);
  384. if(!$id) return $this->failed('数据不存在');
  385. $product = StoreOrderModel::get($id);
  386. if(!$product) return Json::fail('数据不存在!');
  387. if($product['pay_price'] == $product['refund_price']) return Json::fail('已退完支付金额!不能再退款了');
  388. if(!$data['refund_price']) return Json::fail('请输入退款金额');
  389. $refund_price = $data['refund_price'];
  390. $data['refund_price'] = bcadd($data['refund_price'],$product['refund_price'],2);
  391. $bj = bccomp((float)$product['pay_price'],(float)$data['refund_price'],2);
  392. if($bj < 0) return Json::fail('退款金额大于支付金额,请修改退款金额');
  393. if($data['type'] == 1){
  394. $data['refund_status'] = 2;
  395. }else if($data['type'] == 2){
  396. $data['refund_status'] = 0;
  397. }
  398. $type = $data['type'];
  399. unset($data['type']);
  400. $refund_data['pay_price'] = $product['pay_price'];
  401. $refund_data['refund_price'] = $refund_price;
  402. if($product['pay_type'] == 'weixin'){
  403. if($product['is_channel']){//小程序
  404. try{
  405. HookService::listen('routine_pay_order_refund',$product['order_id'],$refund_data,true,PaymentBehavior::class);
  406. }catch(\Exception $e){
  407. return Json::fail($e->getMessage());
  408. }
  409. }else{
  410. try{
  411. HookService::listen('wechat_pay_order_refund',$product['order_id'],$refund_data,true,PaymentBehavior::class);
  412. }catch(\Exception $e){
  413. return Json::fail($e->getMessage());
  414. }
  415. }
  416. }else if($product['pay_type'] == 'yue'){
  417. ModelBasic::beginTrans();
  418. $usermoney = User::where('uid',$product['uid'])->value('now_money');
  419. $res1 = User::bcInc($product['uid'],'now_money',$refund_price,'uid');
  420. $res2 = $res2 = UserBill::income('商品退款',$product['uid'],'now_money','pay_product_refund',$refund_price,$product['id'],bcadd($usermoney,$refund_price,2),'订单退款到余额'.floatval($refund_price).'元');
  421. try{
  422. HookService::listen('store_order_yue_refund',$product,$refund_data,false,OrderBehavior::class);
  423. }catch (\Exception $e){
  424. ModelBasic::rollbackTrans();
  425. return Json::fail($e->getMessage());
  426. }
  427. $res = $res1 && $res2;
  428. ModelBasic::checkTrans($res);
  429. if(!$res) return Json::fail('余额退款失败!');
  430. }
  431. $resEdit = StoreOrderModel::edit($data,$id);
  432. if($resEdit){
  433. $data['type'] = $type;
  434. if($data['type'] == 1) StorePink::setRefundPink($id);
  435. try{
  436. HookService::afterListen('store_product_order_refund_y',$data,$id,false,OrderBehavior::class);
  437. }catch (\Exception $e){
  438. ModelBasic::rollbackTrans();
  439. return Json::fail($e->getMessage());
  440. }
  441. StoreOrderStatus::setStatus($id,'refund_price','退款给用户'.$refund_price.'元');
  442. ModelBasic::commitTrans();
  443. return Json::successful('修改成功!');
  444. }else{
  445. StoreOrderStatus::setStatus($id,'refund_price','退款给用户'.$refund_price.'元失败');
  446. return Json::successful('修改失败!');
  447. }
  448. }
  449. public function order_info($oid = '')
  450. {
  451. if(!$oid || !($orderInfo = StoreOrderModel::get($oid)))
  452. return $this->failed('订单不存在!');
  453. $userInfo = User::getUserInfos($orderInfo['uid']);
  454. if($userInfo['spread_uid']){
  455. $spread = User::where('uid',$userInfo['spread_uid'])->value('nickname');
  456. }else{
  457. $spread ='';
  458. }
  459. $this->assign(compact('orderInfo','userInfo','spread'));
  460. return $this->fetch();
  461. }
  462. public function express($oid = '')
  463. {
  464. if(!$oid || !($order = StoreOrderModel::get($oid)))
  465. return $this->failed('订单不存在!');
  466. if($order['delivery_type'] != 'express' || !$order['delivery_id']) return $this->failed('该订单不存在快递单号!');
  467. $cacheName = $order['order_id'].$order['delivery_id'];
  468. $result = CacheService::get($cacheName,null);
  469. if($result === null || 1==1){
  470. $result = Express::query($order['delivery_id']);
  471. if(is_array($result) &&
  472. isset($result['result']) &&
  473. isset($result['result']['deliverystatus']) &&
  474. $result['result']['deliverystatus'] >= 3)
  475. $cacheTime = 0;
  476. else
  477. $cacheTime = 1800;
  478. CacheService::set($cacheName,$result,$cacheTime);
  479. }
  480. $this->assign([
  481. 'order'=>$order,
  482. 'express'=>$result
  483. ]);
  484. return $this->fetch();
  485. }
  486. /**
  487. * 修改配送信息
  488. * @param $id
  489. * @return mixed|\think\response\Json|void
  490. */
  491. public function distribution($id){
  492. if(!$id) return $this->failed('数据不存在');
  493. $product = StoreOrderModel::get($id);
  494. if(!$product) return Json::fail('数据不存在!');
  495. $f = array();
  496. $f[] = Form::input('order_id','退款单号',$product->getData('order_id'))->disabled(1);
  497. if($product['delivery_type'] == 'send'){
  498. $f[] = Form::input('delivery_name','送货人姓名',$product->getData('delivery_name'));
  499. $f[] = Form::input('delivery_id','送货人电话',$product->getData('delivery_id'));
  500. }else if($product['delivery_type'] == 'express'){
  501. $f[] = Form::select('delivery_name','快递公司',$product->getData('delivery_name'))->setOptions(function (){
  502. $list = Db::name('express')->where('is_show',1)->column('id,name');
  503. $menus = [];
  504. foreach ($list as $k=>$v){
  505. $menus[] = ['value'=>$v,'label'=>$v];
  506. }
  507. return $menus;
  508. });
  509. $f[] = Form::input('delivery_id','快递单号',$product->getData('delivery_id'));
  510. }
  511. $form = Form::make_post_form('配送信息',$f,Url::build('updateDistribution',array('id'=>$id)),7);
  512. $this->assign(compact('form'));
  513. return $this->fetch('public/form-builder');
  514. }
  515. /**修改配送信息
  516. * @param Request $request
  517. * @param $id
  518. */
  519. public function updateDistribution(Request $request, $id){
  520. $data = Util::postMore([
  521. 'delivery_name',
  522. 'delivery_id',
  523. ],$request);
  524. if(!$id) return $this->failed('数据不存在');
  525. $product = StoreOrderModel::get($id);
  526. if(!$product) return Json::fail('数据不存在!');
  527. if($product['delivery_type'] == 'send'){
  528. if(!$data['delivery_name']) return Json::fail('请输入送货人姓名');
  529. if(!(int)$data['delivery_id']) return Json::fail('请输入送货人电话号码');
  530. else if(!preg_match("/^1[3456789]{1}\d{9}$/",$data['delivery_id'])) return Json::fail('请输入正确的送货人电话号码');
  531. }else if($product['delivery_type'] == 'express'){
  532. if(!$data['delivery_name']) return Json::fail('请选择快递公司');
  533. if(!$data['delivery_id']) return Json::fail('请输入快递单号');
  534. }
  535. StoreOrderModel::edit($data,$id);
  536. HookService::afterListen('store_product_order_distribution',$data,$id,false,OrderBehavior::class);
  537. StoreOrderStatus::setStatus($id,'distribution','修改发货信息为'.$data['delivery_name'].'号'.$data['delivery_id']);
  538. return Json::successful('修改成功!');
  539. }
  540. /**
  541. * 修改退款状态
  542. * @param $id
  543. * @return mixed|\think\response\Json|void
  544. */
  545. public function refund_n($id){
  546. if(!$id) return $this->failed('数据不存在');
  547. $product = StoreOrderModel::get($id);
  548. if(!$product) return Json::fail('数据不存在!');
  549. $f[] = Form::input('order_id','退款单号',$product->getData('order_id'))->disabled(1);
  550. $f[] = Form::input('refund_reason','退款原因')->type('textarea');
  551. $form = Form::make_post_form('退款',$f,Url::build('updateRefundN',array('id'=>$id)));
  552. $this->assign(compact('form'));
  553. return $this->fetch('public/form-builder');
  554. }
  555. /**不退款原因
  556. * @param Request $request
  557. * @param $id
  558. */
  559. public function updateRefundN(Request $request, $id){
  560. $data = Util::postMore([
  561. 'refund_reason',
  562. ],$request);
  563. if(!$id) return $this->failed('数据不存在');
  564. $product = StoreOrderModel::get($id);
  565. if(!$product) return Json::fail('数据不存在!');
  566. if(!$data['refund_reason']) return Json::fail('请输入退款原因');
  567. $data['refund_status'] = 0;
  568. StoreOrderModel::edit($data,$id);
  569. HookService::afterListen('store_product_order_refund_n',$data['refund_reason'],$id,false,OrderBehavior::class);
  570. StoreOrderStatus::setStatus($id,'refund_n','不退款原因:'.$data['refund_reason']);
  571. return Json::successful('修改成功!');
  572. }
  573. /**
  574. * 立即支付
  575. * @param $id
  576. */
  577. public function offline($id){
  578. $res = StoreOrderModel::updateOffline($id);
  579. if($res){
  580. try{
  581. HookService::listen('store_product_order_offline',$id,false,OrderBehavior::class);
  582. }catch (Exception $e){
  583. return Json::fail($e->getMessage());
  584. }
  585. StoreOrderStatus::setStatus($id,'offline','线下付款');
  586. return Json::successful('修改成功!');
  587. }else{
  588. return Json::fail('修改失败!');
  589. }
  590. }
  591. /**
  592. * 修改积分和金额
  593. * @param $id
  594. * @return mixed|\think\response\Json|void
  595. */
  596. public function integral_back($id){
  597. if(!$id) return $this->failed('数据不存在');
  598. $product = StoreOrderModel::get($id);
  599. if(!$product) return Json::fail('数据不存在!');
  600. if($product['paid'] == 1){
  601. $f[] = Form::input('order_id','退款单号',$product->getData('order_id'))->disabled(1);
  602. $f[] = Form::number('use_integral','使用的积分',$product->getData('use_integral'))->min(0)->disabled(1);
  603. $f[] = Form::number('use_integrals','已退积分',$product->getData('back_integral'))->min(0)->disabled(1);
  604. $f[] = Form::number('back_integral','可退积分',bcsub($product->getData('use_integral'),$product->getData('use_integral')))->min(0);
  605. $form = Form::make_post_form('退积分',$f,Url::build('updateIntegralBack',array('id'=>$id)),7);
  606. $this->assign(compact('form'));
  607. return $this->fetch('public/form-builder');
  608. }else{
  609. return Json::fail('参数错误!');
  610. }
  611. return $this->fetch('public/form-builder');
  612. }
  613. /** 退积分保存
  614. * @param Request $request
  615. * @param $id
  616. */
  617. public function updateIntegralBack(Request $request, $id){
  618. $data = Util::postMore([
  619. 'back_integral',
  620. ],$request);
  621. if(!$id) return $this->failed('数据不存在');
  622. $product = StoreOrderModel::get($id);
  623. if(!$product) return Json::fail('数据不存在!');
  624. if($data['back_integral'] <= 0) return Json::fail('请输入积分');
  625. if($product['use_integral'] == $product['back_integral']) return Json::fail('已退完积分!不能再积分了');
  626. $back_integral = $data['back_integral'];
  627. $data['back_integral'] = bcadd($data['back_integral'],$product['back_integral'],2);
  628. $bj = bccomp((float)$product['use_integral'],(float)$data['back_integral'],2);
  629. if($bj < 0) return Json::fail('退积分大于支付积分,请修改退积分');
  630. ModelBasic::beginTrans();
  631. $integral = User::where('uid',$product['uid'])->value('integral');
  632. $res1 = User::bcInc($product['uid'],'integral',$back_integral,'uid');
  633. $res2 = UserBill::income('商品退积分',$product['uid'],'integral','pay_product_integral_back',$back_integral,$product['id'],bcadd($integral,$back_integral,2),'订单退积分'.floatval($back_integral).'积分到用户积分');
  634. try{
  635. HookService::listen('store_order_integral_back',$product,$back_integral,false,OrderBehavior::class);
  636. }catch (\Exception $e){
  637. ModelBasic::rollbackTrans();
  638. return Json::fail($e->getMessage());
  639. }
  640. $res = $res1 && $res2;
  641. ModelBasic::checkTrans($res);
  642. if(!$res) return Json::fail('退积分失败!');
  643. StoreOrderModel::edit($data,$id);
  644. StoreOrderStatus::setStatus($id,'integral_back','商品退积分:'.$data['back_integral']);
  645. return Json::successful('退积分成功!');
  646. }
  647. public function remark(Request $request){
  648. $data = Util::postMore(['id','remark'],$request);
  649. if(!$data['id']) return Json::fail('参数错误!');
  650. if($data['remark'] == '') return Json::fail('请输入要备注的内容!');
  651. $id = $data['id'];
  652. unset($data['id']);
  653. StoreOrderModel::edit($data,$id);
  654. return Json::successful('备注成功!');
  655. }
  656. public function order_status($oid){
  657. if(!$oid) return $this->failed('数据不存在');
  658. $this->assign(StoreOrderStatus::systemPage($oid));
  659. return $this->fetch();
  660. }
  661. }