StoreOrder.php 30 KB

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