combinationOrder.php 27 KB

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