StoreAdminOrderForm.php 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005
  1. <?php
  2. /**
  3. * 重庆赤晓店信息科技有限公司
  4. * https://www.chixiaodian.com
  5. * Copyright (c) 2023 赤店商城 All rights reserved.
  6. */
  7. namespace app\modules\client\models\v1\store;
  8. use app\constants\OptionSetting;
  9. use app\models\common\ExpressDetail;
  10. use app\models\Express;
  11. use app\models\Goods;
  12. use app\models\Option;
  13. use app\models\Order;
  14. use app\models\OrderDetail;
  15. use app\models\OrderForm;
  16. use app\models\OrderGoodsCancel;
  17. use app\models\OrderRefund;
  18. use app\models\RefundAddress;
  19. use app\models\Store;
  20. use app\modules\admin\models\OrderRevokeForm;
  21. use app\utils\Notice\NoticeSend;
  22. use app\utils\PrintOrder;
  23. use yii\base\Model;
  24. use app\models\Md;
  25. use yii\helpers\Json as HelpersJson;
  26. class StoreAdminOrderForm extends Model
  27. {
  28. public $model;
  29. public $id;
  30. public $status;
  31. public $date_range;
  32. public $remark;
  33. public $type;
  34. public $mch_name;
  35. public $mch_mobile;
  36. public $mch_address;
  37. public $is_default;
  38. public $mch_id;
  39. public $price;
  40. public $express_price;
  41. public function __construct($config = [])
  42. {
  43. parent::__construct($config);
  44. $this->model = Order::find()->where(['store_id'=>get_store_id(), 'is_delete' => 0, 'is_recycle' => 0]);
  45. $whereMch = [];
  46. if($this->mch_id){
  47. $whereMch = ['mch_id' => $this->mch_id];
  48. $this->model->andWhere($whereMch);
  49. }
  50. }
  51. public function rules()
  52. {
  53. return [
  54. [['id', 'status', 'type', 'is_default'], 'integer'],
  55. [['date_range'], 'array'],
  56. [['price','express_price'], 'number'],
  57. [['mch_id'], 'safe'],
  58. [['remark', 'mch_name', 'mch_mobile', 'mch_address'], 'string']
  59. ];
  60. }
  61. //订单管理
  62. public function orderList(){
  63. $status = $this->status;
  64. $date_range = $this->date_range;
  65. $model = $this->model;
  66. $order_query = $model->select('id, order_no, total_price, pay_price, is_pay, trade_status, created_at, is_sale, trade_status, is_trans, md_id, pay_type')->with(['orderDetail'])->orderBy('created_at desc');
  67. //筛选状态
  68. switch ($status) {
  69. case 1:
  70. // $time = time() - 60 * 15;
  71. $order_query->andWhere(['OR', ['is_pay' => Order::IS_PAY_FALSE, 'trade_status' => Order::ORDER_FLOW_DEFAULT], ['AND', ['is_pay' => Order::IS_PAY_FALSE, 'pay_type' => Order::PAY_TYPE_COD], ['<>', 'trade_status', Order::ORDER_FLOW_CANCEL]]]); //未支付
  72. break;
  73. case 2:
  74. $order_query->andWhere(['OR', ['trade_status' => Order::ORDER_FLOW_NO_SEND], ['is_pay' => Order::IS_PAY_FALSE, 'pay_type' => Order::PAY_TYPE_COD, 'trade_status' => Order::ORDER_FLOW_DEFAULT]]); //待发货
  75. break;
  76. case 3:
  77. $order_query->andWhere(['trade_status' => 2]); //待收获
  78. break;
  79. }
  80. if (!empty($date_range)) {
  81. //获取开始结束时间
  82. $begin_time = strtotime($date_range['begin_time']);
  83. $end_time = strtotime($date_range['end_time']) + (60 * 60 * 24);
  84. $order_query->andWhere(['and', ['>', 'created_at', $begin_time], ['<', 'created_at', $end_time]]);
  85. }
  86. $page = pagination_make($order_query);
  87. $list = $page['list'];
  88. foreach ($list as &$item) {
  89. foreach ($item['orderDetail'] as &$od) {
  90. if (!empty($od['attr'])) {
  91. $od['attr'] = json_decode($od['attr'],true);
  92. }
  93. unset($od['goods_info']);
  94. unset($od['goods_attr']);
  95. }
  96. $item['status'] = (int)$item['trade_status'];
  97. if ($item['is_sale'] == 1) {
  98. $item['status'] = 4;
  99. }
  100. // if ($item['status'] === -1 && ($item['created_at'] + 60 * 15 < time()) && $item['is_pay'] == 0 && intval($item['pay_type']) !== 2) {
  101. // $item['status'] = 1;
  102. // }
  103. $item['pay_type'] = intval($item['pay_type']);
  104. //获取退款的总商品金额 / 获取最新一条的状态
  105. $cancel_info = [];
  106. $order_cancel = OrderGoodsCancel::find()->where(['order_id' => $item['id']])
  107. ->orderBy('id desc')->select('status')->asArray()->one();
  108. if ($order_cancel) {
  109. $cancel_info['refund_price'] = OrderGoodsCancel::find()->where(['order_id' => $item['id']])->sum('refund_price');
  110. $cancel_info['status_text'] = OrderGoodsCancel::$status_desc[$order_cancel['status']];
  111. }
  112. if ($cancel_info) {
  113. $cancel_info['cancel_list'] = OrderGoodsCancel::find()->alias('og')
  114. ->leftJoin(['od' => OrderDetail::tableName()], 'og.order_detail_id = od.id')
  115. ->where([
  116. 'og.order_id' => $item['id']
  117. ])
  118. ->orderBy('og.id desc')
  119. ->select('od.goods_name, og.status, og.num, og.refund_price, og.created_at, og.updated_at')
  120. ->asArray()
  121. ->all();
  122. foreach ($cancel_info['cancel_list'] as &$cancel_item) {
  123. $cancel_item['status_text'] = OrderGoodsCancel::$status_text[$cancel_item['status']];
  124. $cancel_item['status'] = intval($cancel_item['status']);
  125. if ($cancel_item['status'] === OrderGoodsCancel::STATUS_PAY) {
  126. $cancel_item['status'] = 1;
  127. }
  128. if ($cancel_item['status'] === OrderGoodsCancel::STATUS_PAY_FAIL) {
  129. $cancel_item['status'] = 0;
  130. }
  131. if ($cancel_item['status'] === OrderGoodsCancel::STATUS_CANCEL) {
  132. $cancel_item['status'] = 2;
  133. }
  134. $cancel_item['created_at'] = date('Y-m-d H:i:s', $cancel_item['created_at']);
  135. if (in_array($cancel_item['status'], [OrderGoodsCancel::STATUS_PASS, OrderGoodsCancel::STATUS_REFUSE])) {
  136. $cancel_item['created_at'] = date('Y-m-d H:i:s', $cancel_item['updated_at']);
  137. }
  138. }
  139. }
  140. $item['cancel_info'] = $cancel_info ?: null;
  141. //获取退款的总商品金额 / 获取最新一条的状态
  142. $handle_cancel = OrderGoodsCancel::find()->where(['order_id' => $item['id'], 'status' => [
  143. OrderGoodsCancel::STATUS_APPLY, OrderGoodsCancel::STATUS_PAY_FAIL
  144. ]])->select('SUM(num) as num, SUM(refund_price) as refund_price')->groupBy('order_id')
  145. ->asArray()->one() ?: null;
  146. $item['handle_cancel'] = $handle_cancel ?: null;
  147. unset($item['trade_status']);
  148. }
  149. //查询快递公司
  150. $express_list = Express::find()->where(['is_delete' => 0])->select('id, name')->all();
  151. return [
  152. 'code' => 0,
  153. 'msg' => "获取成功",
  154. 'data' => [
  155. 'list' => $list,
  156. 'express_list'=>$express_list,
  157. 'pageNo' => $page['pageNo'],
  158. 'totalCount' => $page['totalCount']
  159. ]
  160. ];
  161. }
  162. //取消订单
  163. public function orderCancel(){
  164. try {
  165. checkReplay($this->id);
  166. $id = $this->id;
  167. $model = $this->model;
  168. $remark = $this->remark;
  169. $order = $model->andWhere(['id' => $id])->select('id, remark, mch_id, user_id, mobile, order_no, pay_price, store_id')->one();
  170. if (!$order || $order->mch_id > 0) {
  171. throw new \Exception('订单不存在,请刷新页面后重试');
  172. }
  173. // 发送备注消息
  174. $order->remark = $remark??'';
  175. $order->first_price = 0;
  176. $order->second_price = 0;
  177. $order->third_price = 0;
  178. $form = new OrderRevokeForm();
  179. $form->order_id = $order->id;
  180. $form->delete_pass = true;
  181. $form->user_id = $order->user_id;
  182. $form->store_id = $order->store_id;
  183. $res = $form->save();
  184. if ($res['code'] == 0) {
  185. if (!$order->save()) {
  186. throw new \Exception(json_encode($order->errors));
  187. }
  188. $goods = Goods::findOne(OrderDetail::findOne(['order_id' => $order->id])->goods_id);
  189. //通知用户
  190. NoticeSend::OrderCancel($order->user_id, $order->mobile, $order->order_no, $order->pay_price, $goods->name);
  191. // 订单打印
  192. if ((int)$order->md_id === -1 || (int)$order->md_id === 0 || !isset($order->md_id)) {
  193. $order->md_id = 0;
  194. }
  195. //打印
  196. $printer_order = new PrintOrder($order->store_id, $order->id, 'confirm', 0, $order->md_id, 0, $order['mch_id']);
  197. $printer_order->is_refund = true;
  198. $res = $printer_order->print_order();
  199. if ($res['code'] != 0) {
  200. throw new \Exception($res['msg']);
  201. }
  202. return [
  203. 'code' => 0,
  204. 'msg' => '操作成功',
  205. ];
  206. } else {
  207. throw new \Exception($res['msg']);
  208. }
  209. } catch (\Exception $e) {
  210. return [
  211. 'code' => 1,
  212. 'msg' => $e->getMessage().$e->getLine()
  213. ];
  214. }
  215. }
  216. //售后订单
  217. public function orderRefund(){
  218. try {
  219. $whereMch = [];
  220. if($this->mch_id){
  221. $whereMch = ['mch_id' => $this->mch_id];
  222. }
  223. $status = $this->status;
  224. $date_range = $this->date_range;
  225. $query = OrderRefund::find()->alias('or')->where(['or.user_delete' => 0, 'or.store_id' => get_store_id(), 'or.md_id' => 0]);
  226. //商家信息
  227. $query->leftJoin(['s' => Store::tableName()], 's.id = or.store_id');
  228. //订单总金额信息
  229. $query->leftJoin(['o' => Order::tableName()], 'o.id = or.order_id')->andWhere($whereMch);
  230. $query->select('or.id, or.store_id, or.order_id, or.order_detail_id, or.status, or.is_agree, or.updated_at, s.name, o.pay_price all_price, o.mobile, or.created_at')->orderBy('created_at desc');
  231. switch ($status) {
  232. case 1: //处理中
  233. $query->andWhere(['or.status' => 0]);
  234. break;
  235. case 2: //已完成
  236. $query->andWhere(['or', ['or.status' => 1], ['or.status' => 2], ['or.status' => 3]]);
  237. break;
  238. }
  239. if (!empty($date_range)) {
  240. //获取开始结束时间
  241. $begin_time = strtotime($date_range['begin_time']);
  242. $end_time = strtotime($date_range['end_time']) + (60 * 60 * 24);
  243. $query->andWhere(['and', ['>', 'or.created_at', $begin_time], ['<', 'or.created_at', $end_time]]);
  244. }
  245. $page = pagination_make($query);
  246. $list = $page['list'];
  247. foreach($list as &$item){
  248. $order_detail_id = json_decode($item['order_detail_id'],true);
  249. $item['orderDetail'] = OrderDetail::find()->where(['id' => $order_detail_id])->select('id, goods_name name, num, total_price, attr, pic')->asArray()->all();
  250. foreach($item['orderDetail'] as &$od){
  251. $od['attr'] = json_decode($od['attr'], true);
  252. }
  253. if ($item['is_agree'] == 1 && $item['status'] == 0) { //已经同意,需要用户发货
  254. $item['status'] = 4;
  255. }
  256. if ($item['is_user_send'] == 1) { //用户已经发货 商家等待收货
  257. $item['status'] = 5;
  258. }
  259. }
  260. return [
  261. 'code' => 0,
  262. 'msg' => "获取成功",
  263. 'data' => [
  264. 'list' => $list,
  265. 'pageNo' => $page['pageNo'],
  266. 'totalCount' => $page['totalCount']
  267. ]
  268. ];
  269. } catch (\Exception $e) {
  270. return [
  271. 'code' => 0,
  272. 'msg' => $e->getMessage()
  273. ];
  274. }
  275. }
  276. //订单详情
  277. public function orderDetail(){
  278. try {
  279. $id = $this->id;
  280. $type = $this->type;
  281. // 判断是否为普通订单 or 售后订单
  282. if ($type == 0) {
  283. $model = Order::find()->where(['o.store_id'=>get_store_id(), 'o.is_delete' => 0])->alias('o');
  284. $model = $model->andWhere(['o.id' => $id])->with(['detail'=>function($query){
  285. $query->select('id, goods_name, pic, total_price, delivery_type, attr, num, order_id, goods_id, goods_info')->asArray();
  286. }])->leftJoin(['s' => Store::tableName()], 's.id = o.store_id')
  287. ->select('o.id, o.is_pay, o.md_id, o.is_trans, o.trade_status, o.order_type, o.name, o.mobile, o.address, o.store_id, o.order_no, o.created_at, o.pay_type, o.pay_price, o.express_price, o.send_time, o.express, o.express_no, s.name store_name, s.logo, o.is_offline, o.is_delivery, o.user_id,o.before_update_price')
  288. ->asArray()->one();
  289. if (empty($model)) {
  290. throw new \Exception("订单信息错误");
  291. }
  292. $model['md_name'] = '';
  293. if ($model['md_id'] > 0) {
  294. $model['md_name'] = Md::find()->where(['id' => $model['md_id']])->select('name')->scalar();
  295. }
  296. foreach ($model['detail'] as &$item) {
  297. $item['cancel_info'] = OrderGoodsCancel::find()->where(['order_detail_id' => $item['id'], 'status' => [
  298. OrderGoodsCancel::STATUS_APPLY, OrderGoodsCancel::STATUS_PAY_FAIL
  299. ]])->select('id, status, num, refund_price, created_at')->asArray()->one();
  300. if ($item['cancel_info']) {
  301. $item['cancel_info']['created_at'] = date('Y-m-d H:i:s', $item['cancel_info']['created_at']);
  302. $item['cancel_info']['status_text'] = OrderGoodsCancel::$status_text[$item['cancel_info']['status']];
  303. }
  304. $item['cancel_info'] = $item['cancel_info'] ?: null;
  305. $item['attr'] = json_decode($item['attr'], true);
  306. $goods = HelpersJson::decode($item['goods_info']);
  307. $item['order_form']['is_form'] = $goods['is_form'];
  308. $item['order_form']['name'] = $goods['form_name'];
  309. $item['order_form']['list'] = OrderForm::find()->where(['order_id' => $model['id'], 'goods_id' => $item['goods_id']])->asArray()->all();
  310. foreach ($item['order_form']['list'] as &$form_item) {
  311. $form_item['default'] = $form_item['value'];
  312. if ($form_item['type'] == "checkbox" || $form_item['type'] == "radio") {
  313. $list = explode(',', $form_item['value']);
  314. $list_arr = [];
  315. foreach ($list as &$list_item) {
  316. $arr = [];
  317. $arr['name'] = $list_item;
  318. $arr['checked'] = true;
  319. array_push($list_arr, $arr);
  320. }
  321. $form_item['default_list'] = $list_arr;
  322. }
  323. $form_item['name'] = $form_item['key'];
  324. unset($form_item['key']);
  325. }
  326. }
  327. $model['order_type'] = $model['order_type'] * 1;
  328. $model['status'] = $model['trade_status'] * 1;
  329. $model['goods_price'] = sprintf("%.2f", $model['pay_price'] - $model['express_price']);
  330. $model['delivery_type'] = $model['detail'][0]['delivery_type'];
  331. $model['created_at'] = date("Y-m-d H:i:s", $model['created_at']);
  332. //判断何时会自动收货
  333. $time = time();
  334. $delivery_time = Option::get(OptionSetting::STORE_DELIVERY_TIME)['value'];
  335. $delivery_time = $time - ($delivery_time * 86400);
  336. // 查询物流信息
  337. $express_detail = new ExpressDetail();
  338. $express_detail->express = $model['express'];
  339. $express_detail->express_no = $model['express_no'];
  340. $express_detail->receive_mobile = $model['mobile'];
  341. $express_detail->store_id = get_store_id();
  342. $res = $express_detail->search();
  343. $model['express_detail'] = null;
  344. if ($res['code'] != 0) {
  345. $model['express_detail']['list'] = [];
  346. $model['express_detail']['status'] = 0;
  347. $model['express_detail']['status_text'] = '未知';
  348. } else {
  349. $model['express_detail'] = $res['data'];
  350. }
  351. if ($model['status'] == 2) {
  352. $model['pay_time'] = $delivery_time;
  353. }
  354. $diy_shop_name = Option::get(OptionSetting::DIY_SHOP_NAME, get_store_id(), 'store', '自提配送')['value'] ?: '自提配送';
  355. $diy_shop_name = Option::get(OptionSetting::DIY_SHOP_NAME, get_store_id(), 'pay', $diy_shop_name)['value'];
  356. $diy_express_name = Option::get(OptionSetting::DIY_EXPRESS_NAME, get_store_id(), 'store', '快递配送')['value'] ?: '快递配送';
  357. $diy_express_name = Option::get(OptionSetting::DIY_EXPRESS_NAME, get_store_id(), 'pay', $diy_express_name)['value'];
  358. $diy_delivery_name = Option::get(OptionSetting::DIY_DELIVERY_NAME, get_store_id(), 'store', '同城配送')['value'] ?: '同城配送';
  359. $diy_delivery_name = Option::get(OptionSetting::DIY_DELIVERY_NAME, get_store_id(), 'pay', $diy_delivery_name)['value'];
  360. $model['diy_express_name'] = intval($model['is_offline']) === 1 ? $diy_shop_name : (intval($model['is_delivery']) === 1 ? $diy_delivery_name : $diy_express_name);
  361. $address = [];
  362. if ((int)$model['is_offline'] === 1) {
  363. if ($model['md_id'] > 0) {
  364. $md = Md::find()->where(['id' => $model['md_id']])->select('name, mobile, address')->asArray()->one();
  365. $model['name'] = $md['name'];
  366. $model['mobile'] = $md['mobile'];
  367. $model['address'] = $md['address'];
  368. }
  369. }
  370. $model['order_form'] = OrderForm::findAll(['order_id' => $model['id']]);
  371. //获取退款的总商品金额 / 获取最新一条的状态
  372. $handle_cancel = OrderGoodsCancel::find()->where(['order_id' => $model['id'], 'status' => [
  373. OrderGoodsCancel::STATUS_APPLY, OrderGoodsCancel::STATUS_PAY_FAIL
  374. ]])->select('SUM(num) as num, SUM(refund_price) as refund_price')->groupBy('order_id')->asArray()->one() ?: null;
  375. $model['handle_cancel'] = $handle_cancel ?: null;
  376. } else {
  377. $model = OrderRefund::find()->where(['store_id' => get_store_id(), 'is_delete' => 0, 'user_delete' => 0, 'id' => $id])
  378. ->select('id, store_id, user_id, order_detail_id, status, is_agree, order_refund_no, is_user_send, created_at, refuse_desc, address_id, pic_list, refund_price, desc, type, user_send_express, user_send_express_no')->asArray()->one();
  379. if (empty($model)) {
  380. throw new \Exception("订单信息错误");
  381. }
  382. $model['pic_list'] = json_decode($model['pic_list'], true);
  383. $order_detail_id = json_decode($model['order_detail_id'], true);
  384. $model['detail'] = OrderDetail::find()->where(['id' => $order_detail_id])->select('id, goods_name, num, total_price, attr, pic')->asArray()->all();
  385. foreach ($model['detail'] as &$item) {
  386. $item['attr'] = json_decode($item['attr'], true);
  387. $item['created_at'] = date("Y-m-d H:i:s", $item['created_at']);
  388. }
  389. $model['store'] = RefundAddress::find()->where(['id' => $model['address_id']])->select('id, name, address, mobile')->asArray()->one();
  390. \Yii::error($model['status'],"这是一个status");
  391. $model['status'] = $model['status'] * 1;
  392. if ($model['is_agree'] == 1 && $model['status'] == 0) { //已经同意,需要用户发货
  393. $model['status'] = 4;
  394. }
  395. if ($model['is_user_send'] == 1 && $model['status'] == 0) { //用户已经发货 商家等待收货
  396. $model['status'] = 5;
  397. }
  398. // 查询物流信息
  399. $express_detail = new ExpressDetail();
  400. $express_detail->express = $model['user_send_express'];
  401. $express_detail->express_no = $model['user_send_express_no'];
  402. $express_detail->store_id = get_store_id();
  403. $res = $express_detail->search();
  404. $model['express_detail'] = null;
  405. if ($res['code'] != 0) {
  406. $model['express_detail']['list'] = [];
  407. $model['express_detail']['status'] = 0;
  408. $model['express_detail']['status_text'] = '未知';
  409. } else {
  410. $model['express_detail'] = $res['data'];
  411. }
  412. //如果地址存在则用订单地址 如果不存在则用默认地址
  413. $where = ['id' => $model['address_id']];
  414. if (empty($model['address_id'])) {
  415. $where = ['is_default' => 1];
  416. }
  417. $address_one = RefundAddress::find()->where(['store_id' => get_store_id(), 'is_delete' => 0])->andWhere($where)->select('id, name, address, mobile')->asArray()->one();
  418. if (!empty($address_one)) {//'is_default' => 1
  419. $model['name'] = $address_one["name"];
  420. $model['mobile'] = $address_one["mobile"];
  421. $model['address'] = $address_one["address"];
  422. }
  423. $address = RefundAddress::find()->where(['store_id' => get_store_id(), 'is_delete' => 0])->select('id, name, address, mobile, is_default')->asArray()->all();
  424. }
  425. $model['user_mobile'] = '';
  426. $user = \app\models\User::findOne($model['user_id']);
  427. if ($user) {
  428. $model['user_mobile'] = $user->binding;
  429. }
  430. //查询快递公司
  431. $express_list = Express::find()->where(['is_delete' => 0])->select('id, name')->all();
  432. return [
  433. 'code' => 0,
  434. 'msg' => "获取成功",
  435. 'data' => [
  436. 'order' => $model,
  437. 'express' => $express_list,
  438. 'address' => $address
  439. ]
  440. ];
  441. } catch (\Exception $e) {
  442. return [
  443. 'code' => 1,
  444. 'msg' => $e->getMessage()
  445. ];
  446. }
  447. }
  448. //获取快递公司数据
  449. public function express(){
  450. $storeExpressList = Order::find()
  451. ->select('express')
  452. ->where([
  453. 'and',
  454. ['store_id' => get_store_id()],
  455. ['is_pay' => Order::IS_PAY_TRUE],
  456. ['in', 'trade_status', [Order::ORDER_FLOW_SEND, Order::ORDER_FLOW_CONFIRM]],
  457. ['!=', 'express', ''],
  458. ])->groupBy('express, send_time')->orderBy('send_time DESC')->limit(5)->asArray()->all();
  459. $expressLst = Express::getExpressList();
  460. $newStoreExpressList = [];
  461. foreach ($storeExpressList as $i => $item) {
  462. foreach ($expressLst as $value) {
  463. if ($value['name'] == $item['express']) {
  464. $newStoreExpressList[] = $item['express'];
  465. break;
  466. }
  467. }
  468. }
  469. $newPublicExpressList = [];
  470. foreach ($expressLst as $i => $item) {
  471. $newPublicExpressList[] = $item['name'];
  472. }
  473. $express_list = array_merge($newStoreExpressList, $newPublicExpressList);
  474. return [
  475. 'code' => 0,
  476. 'msg' => "获取成功",
  477. 'data' => [
  478. 'express' => $express_list,
  479. ]
  480. ];
  481. }
  482. //售后订单申请
  483. public function orderRefundApply(){
  484. try {
  485. $id = $this->id;
  486. $status = $this->status;
  487. $model = OrderRefund::find()->where(['id' => $id])->select('id, is_agree, status')->one();
  488. if (empty($model)) {
  489. throw new \Exception("订单信息错误");
  490. }
  491. //已同意
  492. if ($status == 1) {
  493. $model->status = 1;
  494. } elseif ($status == 2) { //商户拒绝
  495. $model->status = 3;
  496. }
  497. if ($model->save()) {
  498. throw new \Exception("取消申请失败");
  499. }
  500. return [
  501. 'code' => 0,
  502. 'msg' => "操作成功"
  503. ];
  504. } catch (\Exception $e) {
  505. return [
  506. 'code' => 1,
  507. 'msg' => $e->getMessage()
  508. ];
  509. }
  510. }
  511. //售后订单删除
  512. public function orderRefundDelete(){
  513. try {
  514. $id = $this->id;
  515. $model = OrderRefund::find()->where(['id' => $id])->select('id, is_delete')->one();
  516. if (empty($model)) {
  517. throw new \Exception("订单信息错误");
  518. }
  519. $model->is_delete = 1;
  520. if ($model->save()) {
  521. throw new \Exception("删除失败");
  522. }
  523. return [
  524. 'code' => 0,
  525. 'msg' => "删除成功"
  526. ];
  527. } catch (\Exception $e) {
  528. return [
  529. 'code' => 1,
  530. 'msg' => $e->getMessage()
  531. ];
  532. }
  533. }
  534. //商户收货地址保存
  535. public function refundAddressSave(){
  536. try {
  537. $id = $this->id;
  538. $model = RefundAddress::findOne($id)?:new RefundAddress();
  539. $model->store_id = get_store_id();
  540. $model->name = $this->mch_name;
  541. $model->mobile = $this->mch_mobile;
  542. $model->address = $this->mch_address;
  543. if (!$model->save()) {
  544. throw new \Exception("保存失败");
  545. }
  546. //是否默认
  547. if ($this->is_default) {
  548. $this->id = $model->id;
  549. $this->refundAddressDefault();
  550. }
  551. return [
  552. 'code' => 0,
  553. 'msg' => "保存成功",
  554. 'data' => [
  555. 'address_id' => $model->id
  556. ]
  557. ];
  558. } catch (\Exception $e) {
  559. return [
  560. 'code' => 1,
  561. 'msg' => $e->getMessage()
  562. ];
  563. }
  564. }
  565. //获取地址列表
  566. public function refundAddress(){
  567. try {
  568. $list = RefundAddress::find()->where(['store_id' => get_store_id(), 'mch_id' => 0, 'is_delete' => 0])->select('id, name, address, mobile, is_default')->asArray()->all();
  569. foreach ($list as &$item) {
  570. $item['is_default'] *= 1;
  571. }
  572. return [
  573. 'code' => 0,
  574. 'msg' => "获取成功",
  575. 'data' => $list
  576. ];
  577. } catch (\Exception $e) {
  578. return [
  579. 'code' => 1,
  580. 'msg' => $e->getMessage()
  581. ];
  582. }
  583. }
  584. //获取地址详情
  585. public function getAddressInfo(){
  586. try {
  587. $id = $this->id;
  588. $model = RefundAddress::findOne($id);
  589. return [
  590. 'code' => 0,
  591. 'msg' => "获取成功",
  592. 'data' => $model
  593. ];
  594. } catch (\Exception $e) {
  595. return [
  596. 'code' => 1,
  597. 'msg' => $e->getMessage()
  598. ];
  599. }
  600. }
  601. //设置默认地址
  602. public function refundAddressDefault(){
  603. try {
  604. $id = $this->id;
  605. RefundAddress::updateAll(['is_default' => 0],['store_id' => get_store_id()]);
  606. $model = RefundAddress::findOne($id);
  607. if (empty($model)) {
  608. throw new \Exception("查询不到地址信息");
  609. }
  610. $model->is_default = 1;
  611. if (!$model->save()) {
  612. throw new \Exception("设置失败");
  613. }
  614. return [
  615. 'code' => 0,
  616. 'msg' => "设置成功",
  617. ];
  618. } catch (\Exception $e) {
  619. return [
  620. 'code' => 1,
  621. 'msg' => $e->getMessage()
  622. ];
  623. }
  624. }
  625. //商户地址删除
  626. public function refundAddressDel(){
  627. try {
  628. $id = $this->id;
  629. $model = RefundAddress::findOne($id);
  630. if (empty($model)) {
  631. throw new \Exception("查询不到地址信息");
  632. }
  633. $model->is_delete = 1;
  634. if (!$model->save()) {
  635. throw new \Exception("删除失败");
  636. }
  637. return [
  638. 'code' => 0,
  639. 'msg' => "删除成功",
  640. ];
  641. } catch (\Exception $e) {
  642. return [
  643. 'code' => 1,
  644. 'msg' => $e->getMessage()
  645. ];
  646. }
  647. }
  648. //设置订单收货地址
  649. public function setRefundAddress(){
  650. try {
  651. $id = $this->id;
  652. $address_id = $this->mch_address;
  653. $model = OrderRefund::findOne($id);
  654. $model->address_id = $address_id;
  655. if (!$model->save()) {
  656. throw new \Exception("设置失败");
  657. }
  658. return [
  659. 'code' => 0,
  660. 'msg' => "设置成功",
  661. ];
  662. } catch (\Exception $e) {
  663. return [
  664. 'code' => 1,
  665. 'msg' => $e->getMessage()
  666. ];
  667. }
  668. }
  669. //修改订单价格
  670. public function ModifyPrice()
  671. {
  672. try {
  673. $order = Order::findOne([
  674. 'id' => $this->id,
  675. 'is_delete' => Order::IS_DELETE_FALSE,
  676. 'is_pay' => Order::IS_PAY_FALSE
  677. ]);
  678. if (!$order) {
  679. return [
  680. 'code' => 1,
  681. 'msg' => '订单错误'
  682. ];
  683. }
  684. $money = doubleval($order->pay_price);
  685. if ($this->price || $this->price == 0) {
  686. if ($this->price < 0) {
  687. return [
  688. 'code' => 1,
  689. 'msg' => '支付价格不能小于0'
  690. ];
  691. }
  692. if ($order->before_update_price) {
  693. } else {
  694. $order->before_update_price = $money;
  695. }
  696. $order->pay_price = $this->price + $order->express_price;
  697. }
  698. if ($order->save()) {
  699. $orderDetailList = OrderDetail::findAll(['order_id' => $order->id, 'is_delete' => 0]);
  700. $goodsTotalPrice = 0.00;
  701. $goodsTotalPayPrice = $order->pay_price - $order->express_price;
  702. foreach ($orderDetailList as $goods) {
  703. $goodsTotalPrice += $goods->total_price;
  704. }
  705. foreach ($orderDetailList as $goods) {
  706. if (in_array(get_plugin_type(), [0, 2])) {
  707. $goods->total_price = doubleval(sprintf('%.2f', $goodsTotalPayPrice * $goods->total_price / $goodsTotalPrice));
  708. }
  709. $goods->save();
  710. }
  711. return [
  712. 'code' => 0,
  713. 'msg' => '成功'
  714. ];
  715. } else {
  716. throw new \Exception($this->getErrorSummary(false)[0]);
  717. }
  718. }catch (\Exception $e) {
  719. return [
  720. 'code' => 1,
  721. 'msg' => $e->getMessage().$e->getLine(),
  722. 'trea'=>$e->getTraceAsString()
  723. ];
  724. }
  725. }
  726. //修改运费价格
  727. public function ExpressPrice()
  728. {
  729. try {
  730. $order = Order::findOne([
  731. 'id' => $this->id,
  732. 'is_delete' => Order::IS_DELETE_FALSE,
  733. 'is_pay' => Order::IS_PAY_FALSE
  734. ]);
  735. if (!$order) {
  736. return [
  737. 'code' => 1,
  738. 'msg' => '订单错误'
  739. ];
  740. }
  741. $money = doubleval($order->pay_price);//30
  742. $express = doubleval($order->express_price);//10
  743. if ($express != $this->express_price) {
  744. if ($this->express_price < 0) {
  745. return [
  746. 'code' => 1,
  747. 'msg' => '运费不能小于0'
  748. ];
  749. }
  750. $order->before_update_express = $express;
  751. // 计算新的支付总价 = 原支付总价 - 原运费 + 新运费
  752. $order->pay_price = $money - $express + $this->express_price;
  753. $order->express_price = $this->express_price; // 设置新运费
  754. }
  755. if ($order->save()) {
  756. $orderDetailList = OrderDetail::findAll(['order_id' => $order->id, 'is_delete' => 0]);
  757. $goodsTotalPrice = 0.00;
  758. $goodsTotalPayPrice = $order->pay_price - $order->express_price;
  759. foreach ($orderDetailList as $goods) {
  760. $goodsTotalPrice += $goods->total_price;
  761. }
  762. foreach ($orderDetailList as $goods) {
  763. if (in_array(get_plugin_type(), [0, 2])) {
  764. $goods->total_price = doubleval(sprintf('%.2f', $goodsTotalPayPrice * $goods->total_price / $goodsTotalPrice));
  765. }
  766. $goods->save();
  767. }
  768. return [
  769. 'code' => 0,
  770. 'msg' => '成功'
  771. ];
  772. } else {
  773. throw new \Exception($this->getErrorSummary(false)[0]);
  774. }
  775. }catch (\Exception $e) {
  776. return [
  777. 'code' => 1,
  778. 'msg' => $e->getMessage().$e->getLine(),
  779. 'trea'=>$e->getTraceAsString()
  780. ];
  781. }
  782. }
  783. //单品退款
  784. public function orderGoodsCancelList() {
  785. try {
  786. $status = $this->status;
  787. $query = OrderGoodsCancel::find()->where(['store_id' => get_store_id()]);
  788. if (isset($status) && in_array($status, [
  789. OrderGoodsCancel::STATUS_APPLY,
  790. OrderGoodsCancel::STATUS_PASS,
  791. OrderGoodsCancel::STATUS_REFUSE
  792. ])) {
  793. if (intval($status) === OrderGoodsCancel::STATUS_PASS) {
  794. $query->andWhere(['status' => [
  795. OrderGoodsCancel::STATUS_PASS,
  796. OrderGoodsCancel::STATUS_PAY,
  797. OrderGoodsCancel::STATUS_PAY_FAIL
  798. ]]);
  799. } else {
  800. $query->andWhere(['status' => $status]);
  801. }
  802. }
  803. $query = $query->select('id, status, order_id, order_detail_id, refund_price, created_at, num')
  804. ->orderBy('created_at DESC');
  805. $list = pagination_make($query);
  806. foreach ($list['list'] as &$item) {
  807. $order = Order::findOne($item['order_id']);
  808. $item['order_no'] = $order->order_no;
  809. $item['status'] = intval($item['status']);
  810. $item['status_text'] = OrderGoodsCancel::$status_text[$item['status']];
  811. $goods_list = OrderDetail::find()->where(['id' => $item['order_detail_id']])
  812. ->select('goods_name, pic, attr')->asArray()->all();
  813. foreach ($goods_list as &$goods_item) {
  814. $goods_item['attr'] = json_decode($goods_item['attr'], true);
  815. $goods_item['refund_price'] = $item['refund_price'];
  816. $goods_item['num'] = $item['num'];
  817. }
  818. $item['goods_list'] = $goods_list;
  819. }
  820. return [
  821. 'code' => 0,
  822. 'msg' => '',
  823. 'data' => $list
  824. ];
  825. } catch (\Exception $e) {
  826. return [
  827. 'code' => 1,
  828. 'msg' => $e->getMessage() . $e->getLine() . $e->getFile()
  829. ];
  830. }
  831. }
  832. }