StoreOrder.php 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600
  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 service\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. $config = SystemConfigService::more(['pay_routine_appid','pay_routine_appsecret','pay_routine_mchid','pay_routine_key','pay_routine_client_cert','pay_routine_client_key']);
  42. $this->assign([
  43. 'year'=>getMonth('y'),
  44. 'real_name'=>$this->request->get('real_name',''),
  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. public function orderchart(){
  84. $where = Util::getMore([
  85. ['status',''],
  86. ['real_name',''],
  87. ['is_del',0],
  88. ['data',''],
  89. ['combination_id',''],
  90. ['export',0],
  91. ['order','id desc']
  92. ],$this->request);
  93. $limitTimeList = [
  94. 'today'=>implode(' - ',[date('Y/m/d'),date('Y/m/d',strtotime('+1 day'))]),
  95. 'week'=>implode(' - ',[
  96. date('Y/m/d', (time() - ((date('w') == 0 ? 7 : date('w')) - 1) * 24 * 3600)),
  97. date('Y-m-d', (time() + (7 - (date('w') == 0 ? 7 : date('w'))) * 24 * 3600))
  98. ]),
  99. 'month'=>implode(' - ',[date('Y/m').'/01',date('Y/m').'/'.date('t')]),
  100. 'quarter'=>implode(' - ',[
  101. date('Y').'/'.(ceil((date('n'))/3)*3-3+1).'/01',
  102. date('Y').'/'.(ceil((date('n'))/3)*3).'/'.date('t',mktime(0,0,0,(ceil((date('n'))/3)*3),1,date('Y')))
  103. ]),
  104. 'year'=>implode(' - ',[
  105. date('Y').'/01/01',date('Y/m/d',strtotime(date('Y').'/01/01 + 1year -1 day'))
  106. ])
  107. ];
  108. if($where['data'] == '') $where['data'] = $limitTimeList['today'];
  109. $orderCount = [
  110. urlencode('未支付')=>StoreOrderModel::getOrderWhere($where,StoreOrderModel::statusByWhere(0))->count(),
  111. urlencode('未发货')=>StoreOrderModel::getOrderWhere($where,StoreOrderModel::statusByWhere(1))->count(),
  112. urlencode('待收货')=>StoreOrderModel::getOrderWhere($where,StoreOrderModel::statusByWhere(2))->count(),
  113. urlencode('待评价')=>StoreOrderModel::getOrderWhere($where,StoreOrderModel::statusByWhere(3))->count(),
  114. urlencode('交易完成')=>StoreOrderModel::getOrderWhere($where,StoreOrderModel::statusByWhere(4))->count(),
  115. urlencode('退款中')=>StoreOrderModel::getOrderWhere($where,StoreOrderModel::statusByWhere(-1))->count(),
  116. urlencode('已退款')=>StoreOrderModel::getOrderWhere($where,StoreOrderModel::statusByWhere(-2))->count()
  117. ];
  118. $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')
  119. ->group('from_unixtime(add_time,\'%Y-%m-%d\')');
  120. $orderPrice = $model->select()->toArray();
  121. $orderDays = [];
  122. $orderCategory = [
  123. ['name'=>'商品数','type'=>'line','data'=>[]],
  124. ['name'=>'订单数','type'=>'line','data'=>[]],
  125. ['name'=>'订单金额','type'=>'line','data'=>[]],
  126. ['name'=>'退款金额','type'=>'line','data'=>[]]
  127. ];
  128. foreach ($orderPrice as $price){
  129. $orderDays[] = $price['add_time'];
  130. $orderCategory[0]['data'][] = $price['total_num'];
  131. $orderCategory[1]['data'][] = $price['count'];
  132. $orderCategory[2]['data'][] = $price['total_price'];
  133. $orderCategory[3]['data'][] = $price['refund_price'];
  134. }
  135. $this->assign(StoreOrderModel::systemPage($where,$this->adminId));
  136. $this->assign('price',StoreOrderModel::getOrderPrice($where));
  137. $this->assign(compact('limitTimeList','where','orderCount','orderPrice','orderDays','orderCategory'));
  138. return $this->fetch();
  139. }
  140. /**
  141. * 修改支付金额等
  142. * @param $id
  143. * @return mixed|\think\response\Json|void
  144. */
  145. public function edit($id)
  146. {
  147. if(!$id) return $this->failed('数据不存在');
  148. $product = StoreOrderModel::get($id);
  149. if(!$product) return Json::fail('数据不存在!');
  150. $f = array();
  151. $f[] = Form::input('order_id','订单编号',$product->getData('order_id'))->disabled(1);
  152. $f[] = Form::number('total_price','商品总价',$product->getData('total_price'))->min(0);
  153. $f[] = Form::number('total_postage','原始邮费',$product->getData('total_postage'))->min(0);
  154. $f[] = Form::number('pay_price','实际支付金额',$product->getData('pay_price'))->min(0);
  155. $f[] = Form::number('pay_postage','实际支付邮费',$product->getData('pay_postage'));
  156. $f[] = Form::number('gain_integral','赠送积分',$product->getData('gain_integral'));
  157. // $f[] = Form::radio('status','状态',$product->getData('status'))->options([['label'=>'开启','value'=>1],['label'=>'关闭','value'=>0]]);
  158. $form = Form::make_post_form('修改订单',$f,Url::build('update',array('id'=>$id)));
  159. $this->assign(compact('form'));
  160. return $this->fetch('public/form-builder');
  161. }
  162. /** 修改订单提交更新
  163. * @param Request $request
  164. * @param $id
  165. */
  166. public function update(Request $request, $id)
  167. {
  168. $data = Util::postMore([
  169. 'order_id',
  170. 'total_price',
  171. 'total_postage',
  172. 'pay_price',
  173. 'pay_postage',
  174. 'gain_integral',
  175. ],$request);
  176. if($data['total_price'] <= 0) return Json::fail('请输入商品总价');
  177. if($data['pay_price'] <= 0) return Json::fail('请输入实际支付金额');
  178. $data['order_id'] = StoreOrderModel::changeOrderId($data['order_id']);
  179. StoreOrderModel::edit($data,$id);
  180. HookService::afterListen('store_product_order_edit',$data,$id,false,OrderBehavior::class);
  181. StoreOrderStatus::setStatus($id,'order_edit','修改商品总价为:'.$data['total_price'].' 实际支付金额'.$data['pay_price']);
  182. return Json::successful('修改成功!');
  183. }
  184. /**
  185. * 送货
  186. * @param $id
  187. * send
  188. */
  189. public function delivery($id){
  190. if(!$id) return $this->failed('数据不存在');
  191. $product = StoreOrderModel::get($id);
  192. if(!$product) return Json::fail('数据不存在!');
  193. if($product['paid'] == 1 && $product['status'] == 0) {
  194. $f = array();
  195. $f[] = Form::input('delivery_name','送货人姓名')->required('送货人姓名不能为空','required:true;');
  196. $f[] = Form::input('delivery_id','送货人电话')->required('请输入正确电话号码','telephone');
  197. $form = Form::make_post_form('修改订单',$f,Url::build('updateDelivery',array('id'=>$id)),5);
  198. $this->assign(compact('form'));
  199. return $this->fetch('public/form-builder');
  200. }
  201. else $this->failedNotice('订单状态错误');
  202. }
  203. /**送货
  204. * @param Request $request
  205. * @param $id
  206. */
  207. public function updateDelivery(Request $request, $id){
  208. $data = Util::postMore([
  209. 'delivery_name',
  210. 'delivery_id',
  211. ],$request);
  212. $data['delivery_type'] = 'send';
  213. if(!$data['delivery_name']) return Json::fail('请输入送货人姓名');
  214. if(!(int)$data['delivery_id']) return Json::fail('请输入送货人电话号码');
  215. else if(!preg_match("/^1[3456789]{1}\d{9}$/",$data['delivery_id'])) return Json::fail('请输入正确的送货人电话号码');
  216. $data['status'] = 1;
  217. StoreOrderModel::edit($data,$id);
  218. HookService::afterListen('store_product_order_delivery',$data,$id,false,OrderBehavior::class);
  219. StoreOrderStatus::setStatus($id,'delivery','已配送 发货人:'.$data['delivery_name'].' 发货人电话:'.$data['delivery_id']);
  220. return Json::successful('修改成功!');
  221. }
  222. /**
  223. * 发货
  224. * @param $id
  225. * express
  226. */
  227. public function deliver_goods($id){
  228. if(!$id) return $this->failed('数据不存在');
  229. $product = StoreOrderModel::get($id);
  230. if(!$product) return Json::fail('数据不存在!');
  231. if($product['paid'] == 1 && $product['status'] == 0){
  232. $f = array();
  233. $f[] = Form::select('delivery_name','快递公司')->setOptions(function(){
  234. $list = Db::name('express')->where('is_show',1)->order('sort DESC')->column('id,name');
  235. $menus = [];
  236. foreach ($list as $k=>$v){
  237. $menus[] = ['value'=>$v,'label'=>$v];
  238. }
  239. return $menus;
  240. })->filterable(1);
  241. $f[] = Form::input('delivery_id','快递单号');
  242. $form = Form::make_post_form('修改订单',$f,Url::build('updateDeliveryGoods',array('id'=>$id)),5);
  243. $this->assign(compact('form'));
  244. return $this->fetch('public/form-builder');
  245. }
  246. else return $this->failedNotice('订单状态错误');
  247. }
  248. /**发货保存
  249. * @param Request $request
  250. * @param $id
  251. */
  252. public function updateDeliveryGoods(Request $request, $id){
  253. $data = Util::postMore([
  254. 'delivery_name',
  255. 'delivery_id',
  256. ],$request);
  257. $data['delivery_type'] = 'express';
  258. if(!$data['delivery_name']) return Json::fail('请选择快递公司');
  259. if(!$data['delivery_id']) return Json::fail('请输入快递单号');
  260. $data['status'] = 1;
  261. StoreOrderModel::edit($data,$id);
  262. HookService::afterListen('store_product_order_delivery_goods',$data,$id,false,OrderBehavior::class);
  263. StoreOrderStatus::setStatus($id,'delivery_goods','已发货 快递公司:'.$data['delivery_name'].' 快递单号:'.$data['delivery_id']);
  264. return Json::successful('修改成功!');
  265. }
  266. /**
  267. * 修改状态为已收货
  268. * @param $id
  269. * @return \think\response\Json|void
  270. */
  271. public function take_delivery($id){
  272. if(!$id) return $this->failed('数据不存在');
  273. $order = StoreOrderModel::get($id);
  274. if(!$order) return Json::fail('数据不存在!');
  275. if($order['status'] == 2) return Json::fail('不能重复收货!');
  276. if($order['paid'] == 1 && $order['status'] == 1) $data['status'] = 2;
  277. else if($order['pay_type'] == 'offline') $data['status'] = 2;
  278. else return Json::fail('请先发货或者送货!');
  279. if(!StoreOrderModel::edit($data,$id))
  280. return Json::fail(StoreOrderModel::getErrorInfo('收货失败,请稍候再试!'));
  281. else{
  282. try{
  283. HookService::listen('store_product_order_take_delivery',$order,$id,false,OrderBehavior::class);
  284. }catch (\Exception $e){
  285. return Json::fail($e->getMessage());
  286. }
  287. StoreOrderStatus::setStatus($id,'take_delivery','已收货');
  288. return Json::successful('收货成功!');
  289. }
  290. }
  291. /**
  292. * 修改退款状态
  293. * @param $id
  294. * @return \think\response\Json|void
  295. */
  296. public function refund_y($id){
  297. if(!$id) return $this->failed('数据不存在');
  298. $product = StoreOrderModel::get($id);
  299. if(!$product) return Json::fail('数据不存在!');
  300. if($product['paid'] == 1){
  301. $f = array();
  302. $f[] = Form::input('order_id','退款单号',$product->getData('order_id'))->disabled(1);
  303. $f[] = Form::number('refund_price','退款金额',$product->getData('pay_price'))->precision(2)->min(0.01);
  304. $f[] = Form::radio('type','状态',1)->options([['label'=>'直接退款','value'=>1],['label'=>'退款后,返回原状态','value'=>2]]);
  305. $form = Form::make_post_form('退款处理',$f,Url::build('updateRefundY',array('id'=>$id)),5);
  306. $this->assign(compact('form'));
  307. return $this->fetch('public/form-builder');
  308. }
  309. else return Json::fail('数据不存在!');
  310. }
  311. /**退款处理
  312. * @param Request $request
  313. * @param $id
  314. */
  315. public function updateRefundY(Request $request, $id){
  316. $data = Util::postMore([
  317. 'refund_price',
  318. ['type',1],
  319. ],$request);
  320. if(!$id) return $this->failed('数据不存在');
  321. $product = StoreOrderModel::get($id);
  322. if(!$product) return Json::fail('数据不存在!');
  323. if($product['pay_price'] == $product['refund_price']) return Json::fail('已退完支付金额!不能再退款了');
  324. if(!$data['refund_price']) return Json::fail('请输入退款金额');
  325. $refund_price = $data['refund_price'];
  326. $data['refund_price'] = bcadd($data['refund_price'],$product['refund_price'],2);
  327. $bj = bccomp((float)$product['pay_price'],(float)$data['refund_price'],2);
  328. if($bj < 0) return Json::fail('退款金额大于支付金额,请修改退款金额');
  329. if($data['type'] == 1){
  330. $data['refund_status'] = 2;
  331. }else if($data['type'] == 2){
  332. $data['refund_status'] = 0;
  333. }
  334. $type = $data['type'];
  335. unset($data['type']);
  336. $refund_data['pay_price'] = $product['pay_price'];
  337. $refund_data['refund_price'] = $refund_price;
  338. if($product['pay_type'] == 'weixin'){
  339. if($product['is_channel']){//小程序
  340. try{
  341. HookService::listen('routine_pay_order_refund',$product['order_id'],$refund_data,true,PaymentBehavior::class);
  342. }catch(\Exception $e){
  343. return Json::fail($e->getMessage());
  344. }
  345. }else{
  346. try{
  347. HookService::listen('wechat_pay_order_refund',$product['order_id'],$refund_data,true,PaymentBehavior::class);
  348. }catch(\Exception $e){
  349. return Json::fail($e->getMessage());
  350. }
  351. }
  352. }else if($product['pay_type'] == 'yue'){
  353. ModelBasic::beginTrans();
  354. $usermoney = User::where('uid',$product['uid'])->value('now_money');
  355. $res1 = User::bcInc($product['uid'],'now_money',$refund_price,'uid');
  356. $res2 = $res2 = UserBill::income('商品退款',$product['uid'],'now_money','pay_product_refund',$refund_price,$product['id'],bcadd($usermoney,$refund_price,2),'订单退款到余额'.floatval($refund_price).'元');
  357. try{
  358. HookService::listen('store_order_yue_refund',$product,$refund_data,false,OrderBehavior::class);
  359. }catch (\Exception $e){
  360. ModelBasic::rollbackTrans();
  361. return Json::fail($e->getMessage());
  362. }
  363. $res = $res1 && $res2;
  364. ModelBasic::checkTrans($res);
  365. if(!$res) return Json::fail('余额退款失败!');
  366. }
  367. $resEdit = StoreOrderModel::edit($data,$id);
  368. if($resEdit){
  369. $data['type'] = $type;
  370. if($data['type'] == 1) StorePink::setRefundPink($id);
  371. HookService::afterListen('store_product_order_refund_y',$data,$id,false,OrderBehavior::class);
  372. StoreOrderStatus::setStatus($id,'refund_price','退款给用户'.$refund_price.'元');
  373. return Json::successful('修改成功!');
  374. }else{
  375. StoreOrderStatus::setStatus($id,'refund_price','退款给用户'.$refund_price.'元失败');
  376. return Json::successful('修改失败!');
  377. }
  378. }
  379. public function order_info($oid = '')
  380. {
  381. if(!$oid || !($orderInfo = StoreOrderModel::get($oid)))
  382. return $this->failed('订单不存在!');
  383. $userInfo = User::getUserInfos($orderInfo['uid']);
  384. if($userInfo['spread_uid']){
  385. $spread = User::where('uid',$userInfo['spread_uid'])->value('nickname');
  386. }else{
  387. $spread ='';
  388. }
  389. $this->assign(compact('orderInfo','userInfo','spread'));
  390. return $this->fetch();
  391. }
  392. public function express($oid = '')
  393. {
  394. if(!$oid || !($order = StoreOrderModel::get($oid)))
  395. return $this->failed('订单不存在!');
  396. if($order['delivery_type'] != 'express' || !$order['delivery_id']) return $this->failed('该订单不存在快递单号!');
  397. $cacheName = $order['order_id'].$order['delivery_id'];
  398. $result = CacheService::get($cacheName,null);
  399. if($result === null || 1==1){
  400. $result = Express::query($order['delivery_id']);
  401. if(is_array($result) &&
  402. isset($result['result']) &&
  403. isset($result['result']['deliverystatus']) &&
  404. $result['result']['deliverystatus'] >= 3)
  405. $cacheTime = 0;
  406. else
  407. $cacheTime = 1800;
  408. CacheService::set($cacheName,$result,$cacheTime);
  409. }
  410. $this->assign([
  411. 'order'=>$order,
  412. 'express'=>$result
  413. ]);
  414. return $this->fetch();
  415. }
  416. /**
  417. * 修改配送信息
  418. * @param $id
  419. * @return mixed|\think\response\Json|void
  420. */
  421. public function distribution($id){
  422. if(!$id) return $this->failed('数据不存在');
  423. $product = StoreOrderModel::get($id);
  424. if(!$product) return Json::fail('数据不存在!');
  425. $f = array();
  426. $f[] = Form::input('order_id','退款单号',$product->getData('order_id'))->disabled(1);
  427. if($product['delivery_type'] == 'send'){
  428. $f[] = Form::input('delivery_name','送货人姓名',$product->getData('delivery_name'));
  429. $f[] = Form::input('delivery_id','送货人电话',$product->getData('delivery_id'));
  430. }else if($product['delivery_type'] == 'express'){
  431. $f[] = Form::select('delivery_name','快递公司',$product->getData('delivery_name'))->setOptions(function (){
  432. $list = Db::name('express')->where('is_show',1)->column('id,name');
  433. $menus = [];
  434. foreach ($list as $k=>$v){
  435. $menus[] = ['value'=>$v,'label'=>$v];
  436. }
  437. return $menus;
  438. });
  439. $f[] = Form::input('delivery_id','快递单号',$product->getData('delivery_id'));
  440. }
  441. $form = Form::make_post_form('配送信息',$f,Url::build('updateDistribution',array('id'=>$id)),5);
  442. $this->assign(compact('form'));
  443. return $this->fetch('public/form-builder');
  444. }
  445. /**修改配送信息
  446. * @param Request $request
  447. * @param $id
  448. */
  449. public function updateDistribution(Request $request, $id){
  450. $data = Util::postMore([
  451. 'delivery_name',
  452. 'delivery_id',
  453. ],$request);
  454. if(!$id) return $this->failed('数据不存在');
  455. $product = StoreOrderModel::get($id);
  456. if(!$product) return Json::fail('数据不存在!');
  457. if($product['delivery_type'] == 'send'){
  458. if(!$data['delivery_name']) return Json::fail('请输入送货人姓名');
  459. if(!(int)$data['delivery_id']) return Json::fail('请输入送货人电话号码');
  460. else if(!preg_match("/^1[3456789]{1}\d{9}$/",$data['delivery_id'])) return Json::fail('请输入正确的送货人电话号码');
  461. }else if($product['delivery_type'] == 'express'){
  462. if(!$data['delivery_name']) return Json::fail('请选择快递公司');
  463. if(!$data['delivery_id']) return Json::fail('请输入快递单号');
  464. }
  465. StoreOrderModel::edit($data,$id);
  466. HookService::afterListen('store_product_order_distribution',$data,$id,false,OrderBehavior::class);
  467. StoreOrderStatus::setStatus($id,'distribution','修改发货信息为'.$data['delivery_name'].'号'.$data['delivery_id']);
  468. return Json::successful('修改成功!');
  469. }
  470. /**
  471. * 修改退款状态
  472. * @param $id
  473. * @return mixed|\think\response\Json|void
  474. */
  475. public function refund_n($id){
  476. if(!$id) return $this->failed('数据不存在');
  477. $product = StoreOrderModel::get($id);
  478. if(!$product) return Json::fail('数据不存在!');
  479. $f[] = Form::input('order_id','退款单号',$product->getData('order_id'))->disabled(1);
  480. $f[] = Form::input('refund_reason','退款原因')->type('textarea');
  481. $form = Form::make_post_form('退款',$f,Url::build('updateRefundN',array('id'=>$id)));
  482. $this->assign(compact('form'));
  483. return $this->fetch('public/form-builder');
  484. }
  485. /**不退款原因
  486. * @param Request $request
  487. * @param $id
  488. */
  489. public function updateRefundN(Request $request, $id){
  490. $data = Util::postMore([
  491. 'refund_reason',
  492. ],$request);
  493. if(!$id) return $this->failed('数据不存在');
  494. $product = StoreOrderModel::get($id);
  495. if(!$product) return Json::fail('数据不存在!');
  496. if(!$data['refund_reason']) return Json::fail('请输入退款原因');
  497. $data['refund_status'] = 0;
  498. StoreOrderModel::edit($data,$id);
  499. HookService::afterListen('store_product_order_refund_n',$data['refund_reason'],$id,false,OrderBehavior::class);
  500. StoreOrderStatus::setStatus($id,'refund_n','不退款原因:'.$data['refund_reason']);
  501. return Json::successful('修改成功!');
  502. }
  503. /**
  504. * 立即支付
  505. * @param $id
  506. */
  507. public function offline($id){
  508. $res = StoreOrderModel::updateOffline($id);
  509. if($res){
  510. try{
  511. HookService::listen('store_product_order_offline',$id,false,OrderBehavior::class);
  512. }catch (Exception $e){
  513. return Json::fail($e->getMessage());
  514. }
  515. StoreOrderStatus::setStatus($id,'offline','线下付款');
  516. return Json::successful('修改成功!');
  517. }else{
  518. return Json::fail('修改失败!');
  519. }
  520. }
  521. /**
  522. * 修改积分和金额
  523. * @param $id
  524. * @return mixed|\think\response\Json|void
  525. */
  526. public function integral_back($id){
  527. if(!$id) return $this->failed('数据不存在');
  528. $product = StoreOrderModel::get($id);
  529. if(!$product) return Json::fail('数据不存在!');
  530. if($product['paid'] == 1){
  531. $f[] = Form::input('order_id','退款单号',$product->getData('order_id'))->disabled(1);
  532. $f[] = Form::number('use_integral','使用的积分',$product->getData('use_integral'))->min(0)->disabled(1);
  533. $f[] = Form::number('use_integrals','已退积分',$product->getData('back_integral'))->min(0)->disabled(1);
  534. $f[] = Form::number('back_integral','可退积分',bcsub($product->getData('use_integral'),$product->getData('use_integral')))->min(0);
  535. $form = Form::make_post_form('退积分',$f,Url::build('updateIntegralBack',array('id'=>$id)));
  536. $this->assign(compact('form'));
  537. return $this->fetch('public/form-builder');
  538. }else{
  539. return Json::fail('参数错误!');
  540. }
  541. return $this->fetch('public/form-builder');
  542. }
  543. /** 退积分保存
  544. * @param Request $request
  545. * @param $id
  546. */
  547. public function updateIntegralBack(Request $request, $id){
  548. $data = Util::postMore([
  549. 'back_integral',
  550. ],$request);
  551. if(!$id) return $this->failed('数据不存在');
  552. $product = StoreOrderModel::get($id);
  553. if(!$product) return Json::fail('数据不存在!');
  554. if($data['back_integral'] <= 0) return Json::fail('请输入积分');
  555. if($product['use_integral'] == $product['back_integral']) return Json::fail('已退完积分!不能再积分了');
  556. $back_integral = $data['back_integral'];
  557. $data['back_integral'] = bcadd($data['back_integral'],$product['back_integral'],2);
  558. $bj = bccomp((float)$product['use_integral'],(float)$data['back_integral'],2);
  559. if($bj < 0) return Json::fail('退积分大于支付积分,请修改退积分');
  560. ModelBasic::beginTrans();
  561. $integral = User::where('uid',$product['uid'])->value('integral');
  562. $res1 = User::bcInc($product['uid'],'integral',$back_integral,'uid');
  563. $res2 = UserBill::income('商品退积分',$product['uid'],'integral','pay_product_integral_back',$back_integral,$product['id'],bcadd($integral,$back_integral,2),'订单退积分'.floatval($back_integral).'积分到用户积分');
  564. try{
  565. HookService::listen('store_order_integral_back',$product,$back_integral,false,OrderBehavior::class);
  566. }catch (\Exception $e){
  567. ModelBasic::rollbackTrans();
  568. return Json::fail($e->getMessage());
  569. }
  570. $res = $res1 && $res2;
  571. ModelBasic::checkTrans($res);
  572. if(!$res) return Json::fail('退积分失败!');
  573. StoreOrderModel::edit($data,$id);
  574. StoreOrderStatus::setStatus($id,'integral_back','商品退积分:'.$data['back_integral']);
  575. return Json::successful('退积分成功!');
  576. }
  577. public function remark(Request $request){
  578. $data = Util::postMore(['id','remark'],$request);
  579. if(!$data['id']) return Json::fail('参数错误!');
  580. if($data['remark'] == '') return Json::fail('请输入要备注的内容!');
  581. $id = $data['id'];
  582. unset($data['id']);
  583. StoreOrderModel::edit($data,$id);
  584. return Json::successful('备注成功!');
  585. }
  586. public function order_status($oid){
  587. if(!$oid) return $this->failed('数据不存在');
  588. $this->assign(StoreOrderStatus::systemPage($oid));
  589. return $this->fetch();
  590. }
  591. }