combinationOrder.php 27 KB

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