ShopAdminForm.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412
  1. <?php
  2. /**
  3. * 重庆赤晓店信息科技有限公司
  4. * https://www.chixiaodian.com
  5. * Copyright (c) 2023 赤店商城 All rights reserved.
  6. */
  7. /*
  8. * @Author: 凯
  9. * @Date: 2021-04-26 17:20:17
  10. * @LastEditTime: 2021-05-15 15:37:59
  11. * @LastEditors: Please set LastEditors
  12. * @Description: In User Settings Edit
  13. * @FilePath: \admin_php\modules\client\models\v1\ShopApplyForm.php
  14. */
  15. namespace app\modules\client\models\v1;
  16. use app\constants\OptionSetting;
  17. use app\models\Clerk;
  18. use app\models\Goods;
  19. use app\models\Mch;
  20. use app\models\MchStaff;
  21. use app\models\MdProfit;
  22. use app\models\Order;
  23. use app\models\OrderDetail;
  24. use app\models\OrderRefund;
  25. use app\models\OrderTransit;
  26. use app\models\Shop;
  27. use app\models\ShopShare;
  28. use app\models\User;
  29. use app\modules\admin\models\MerchantForm;
  30. use app\modules\client\models\ApiModel;
  31. use app\utils\Notice\NoticeSend;
  32. use yii\data\Pagination;
  33. use app\models\MdStaff;
  34. class ShopAdminForm extends ApiModel
  35. {
  36. public $status;
  37. public $page;
  38. public function search()
  39. {
  40. $user_id = get_user_id();
  41. $store_id = get_store_id();
  42. $shop = Shop::findOne(['user_id' => $user_id, 'store_id' => $store_id, 'is_delete' => 0, 'shop_audit' => 1]);
  43. if (empty($shop)) {
  44. return [
  45. 'code' => 0,
  46. 'data' => [
  47. 'shop' => null
  48. ]
  49. ];
  50. }
  51. $user = User::findOne($user_id);
  52. return [
  53. 'code' => 0,
  54. 'data' => [
  55. 'shop' => $shop,
  56. 'user' => [
  57. 'nickname' => $user->nickname,
  58. 'avatar_url' => $user->avatar_url
  59. ],
  60. 'tuan_price' => $user->tuan_price,
  61. 'day_price' => $this->dayPrice($shop->id),
  62. 'not_price' => $this->notPrice($shop->id),
  63. 'total_price' => $this->totalPrice($shop->id),
  64. 'order_1' => $this->orderNum(1),
  65. 'order_2' => $this->orderNum(2),
  66. ]
  67. ];
  68. }
  69. public function order()
  70. {
  71. $shop = Shop::findOne(['user_id'=>get_user_id(), 'store_id' => get_store_id(), 'is_delete' => 0,'shop_audit' => 1]);
  72. $query = Order::find()->where([
  73. 'is_delete' => 0,
  74. 'store_id' => get_store_id(),
  75. 'shop_id' => $shop->id,
  76. 'is_offline' => 1
  77. ])->andWhere([
  78. 'or',
  79. ['is_pay' => 1],
  80. ['=', 'pay_type' , 2]
  81. ]);
  82. if (isset($this->status) && $this->status > -1) {
  83. $query->andWhere([
  84. '<>', 'trade_status', Order::ORDER_FLOW_CANCEL
  85. ]);
  86. }
  87. if ($this->status == 1) {//待发货
  88. $query->andWhere([
  89. 'trade_status' => Order::ORDER_FLOW_NO_SEND,
  90. ])->andWhere(['or', ['is_pay' => 1], ['pay_type' => 2]]);
  91. }
  92. if ($this->status == 2) {//待收货
  93. $query->andWhere([
  94. 'trade_status' => Order::ORDER_FLOW_SEND,
  95. ]);
  96. }
  97. if ($this->status == 3) {//已完成
  98. $query->andWhere([
  99. 'trade_status' => Order::ORDER_FLOW_CONFIRM,
  100. ]);
  101. }
  102. $query->andWhere(['is_recycle' => 0]);
  103. $count = $query->count();
  104. $pagination = new Pagination(['totalCount' => $count, 'page' => $this->page - 1, 'pageSize' => 20]);
  105. $list = $query->limit($pagination->limit)->offset($pagination->offset)->orderBy('created_at DESC')->all();
  106. $new_list = [];
  107. foreach ($list as $order) {
  108. /**
  109. * @var Order $order
  110. */
  111. $order_detail_list = OrderDetail::findAll(['order_id' => $order->id, 'is_delete' => 0]);
  112. $goods_list = [];
  113. foreach ($order_detail_list as $order_detail) {
  114. $goods = Goods::findOne($order_detail->goods_id);
  115. if (!$goods) {
  116. continue;
  117. }
  118. $goods_pic = isset($order_detail->pic) ? $order_detail->pic ?: $goods->getGoodsPic(0)->pic_url : $goods->getGoodsPic(0)->pic_url;
  119. $goods_list[] = (object)[
  120. 'goods_id' => $goods->id,
  121. 'goods_pic' => $goods_pic,
  122. 'goods_name' => $goods->name,
  123. 'num' => $order_detail->num,
  124. 'price' => $order_detail->total_price,
  125. 'attr_list' => json_decode($order_detail->attr),
  126. ];
  127. }
  128. if ($order->mch_id) {
  129. $mch = Mch::findOne($order->mch_id);
  130. $mch = [
  131. 'id' => $mch->id,
  132. 'name' => $mch->name,
  133. 'logo' => $mch->logo,
  134. ];
  135. } else {
  136. $mch = [
  137. 'id' => 0,
  138. 'name' => '平台自营',
  139. 'logo' => '',
  140. ];
  141. }
  142. $orderRefund = OrderRefund::find()->where(['store_id' => $order->store_id, 'order_id' => $order->id])->exists();
  143. // 获取分销佣金
  144. $shopShare = ShopShare::findOne(['order_id' => $order->id, 'type' => 0, 'shop_id' => $shop->id]);
  145. $new_list[] = (object)[
  146. 'order_id' => $order->id,
  147. 'order_no' => $order->order_no,
  148. 'addtime' => date('Y-m-d H:i', $order->created_at),
  149. 'goods_list' => $goods_list,
  150. 'total_price' => $order->total_price,
  151. 'pay_price' => $order->pay_price,
  152. 'is_pay' => $order->is_pay,
  153. 'is_comment' => $order->is_comment,
  154. 'is_offline' => $order->is_offline,
  155. 'mch' => $mch,
  156. 'type' => $order->type,
  157. 'pay_type' => $order->pay_type,
  158. 'refund' => $orderRefund,
  159. 'shop_price' => $shopShare ? $shopShare->amount : 0,
  160. 'trade_status' => $order->trade_status
  161. ];
  162. }
  163. return [
  164. 'code' => 0,
  165. 'msg' => 'success',
  166. 'data' => [
  167. 'row_count' => $count,
  168. 'page_count' => $pagination->pageCount,
  169. 'list' => $new_list,
  170. ],
  171. ];
  172. }
  173. public function orderNum($status = 1)
  174. {
  175. $shop = Shop::findOne(['user_id'=>get_user_id(), 'store_id' => get_store_id(), 'is_delete' => 0,'shop_audit' => 1]);
  176. $query = Order::find()->where([
  177. 'is_delete' => 0,
  178. 'store_id' => get_store_id(),
  179. 'shop_id' => $shop->id,
  180. 'is_offline' => 1
  181. ])->andWhere([
  182. 'or',
  183. ['is_pay' => 1],
  184. ['=', 'pay_type' , 2]
  185. ]);
  186. if ($status == 1) {//待发货
  187. $query->andWhere([
  188. 'trade_status' => Order::ORDER_FLOW_NO_SEND,
  189. ])->andWhere(['or', ['is_pay' => 1], ['pay_type' => 2]]);
  190. }
  191. if ($status == 2) {//待收货
  192. $query->andWhere([
  193. 'trade_status' => Order::ORDER_FLOW_SEND,
  194. ]);
  195. }
  196. $query->andWhere(['is_recycle' => 0]);
  197. $count = $query->count();
  198. return $count;
  199. }
  200. /**
  201. * @description: 今日收入
  202. * @param {*}
  203. * @return {*}
  204. */
  205. private function dayPrice($shop_id)
  206. {
  207. $start_time = strtotime(date('Y-m-d',time()));
  208. $sum = ShopShare::find()->where([
  209. 'shop_id' => $shop_id
  210. ])->andWhere([
  211. '>',
  212. 'created_at',
  213. $start_time
  214. ])->andWhere([
  215. '>',
  216. 'amount',
  217. 0
  218. ])->sum('amount');
  219. return $sum;
  220. }
  221. /**
  222. * @description: 未结算佣金
  223. * @param {*} $shop_id
  224. * @return {*}
  225. */
  226. private function notPrice($shop_id)
  227. {
  228. $sum = ShopShare::find()->where([
  229. 'shop_id' => $shop_id,
  230. 'status' => 0
  231. ])->sum('amount');
  232. return $sum;
  233. }
  234. /**
  235. * @description: 累计佣金
  236. * @param {*} $shop_id
  237. * @return {*}
  238. */
  239. private function totalPrice($shop_id)
  240. {
  241. $sum = ShopShare::find()->where([
  242. 'shop_id' => $shop_id,
  243. 'status' => 1
  244. ])->andWhere([
  245. '>',
  246. 'amount',
  247. 0
  248. ])->sum('amount');
  249. return $sum;
  250. }
  251. public function confirm($order_id)
  252. {
  253. $t = \Yii::$app->db->beginTransaction();
  254. try {
  255. $order = Order::findOne([
  256. 'store_id' => get_store_id(),
  257. 'id' => $order_id,
  258. 'trade_status' => [Order::ORDER_FLOW_SEND, Order::ORDER_FLOW_NO_SEND],
  259. 'is_delete' => 0,
  260. ]);
  261. if (!$order) {
  262. throw new \Exception('订单不存在');
  263. }
  264. //如果订单已经取消
  265. if ($order->apply_delete == Order::ORDER_APPLY_DELETE || $order->trade_status == Order::ORDER_FLOW_CANCEL) {
  266. return [
  267. 'code' => 1,
  268. 'msg' => '订单已取消或申请取消中,不可核销'
  269. ];
  270. }
  271. if($order->mch_id){
  272. // 查一下是不是入住商的员工
  273. $mch_staff = MchStaff::findOne(['user_id' => get_user_id(), 'mch_id' => $order->mch_id, 'store_id' => get_store_id(), 'is_delete' => 0,'is_disable' => 0]);
  274. $mch = Mch::findOne(['saas_user_id' => get_saas_user_id(), 'id' => $order->mch_id, 'store_id' => get_store_id(), 'is_delete' => 0]);
  275. if (empty($mch) && empty($mch_staff)) {
  276. return [
  277. 'code' => 1,
  278. 'msg' => '您不是入驻商禁止核销'
  279. ];
  280. }
  281. }else{
  282. // 如果不是自提点管理员判断是否为核销元
  283. $staff = MdStaff::findOne(['saas_user_id'=> get_saas_user_id(), 'store_id' => get_store_id(), 'is_delete' => 0,'is_disable' => 0]);
  284. if (empty($staff)) {
  285. throw new \Exception('您不是核销员禁止核销');
  286. }
  287. }
  288. $orderTransitInfo = OrderTransit::find()->where(['order_id' => $order->id, "is_delete" => 0, 'status' => [0, 2]])->one();
  289. if ($orderTransitInfo) {
  290. throw new \Exception('云仓订单未发货或已收货');
  291. }
  292. $order->clerk_id = get_user_id();
  293. $order->trade_status = Order::ORDER_FLOW_CONFIRM;
  294. $order->confirm_time = time();
  295. if ($order->pay_type == 2) {
  296. $order->is_pay = 1;
  297. $order->pay_time = time();
  298. }
  299. if ($order->save()) {
  300. if ($staff) {
  301. $mdProfit = MdProfit::findOne(['order_id' => $order->id, 'is_send' => 0]);
  302. if ($mdProfit) {
  303. $mdProfit->clerk_id = $staff->id;
  304. $mdProfit->is_send = 1;
  305. if (!$mdProfit->save()) {
  306. throw new \Exception(json_encode($mdProfit->errors, JSON_UNESCAPED_UNICODE));
  307. }
  308. $md = \app\models\Md::findOne($mdProfit->md_id);
  309. $md->total_profit += $mdProfit->total_profit;
  310. $md->cash_profit += $mdProfit->total_profit;
  311. $md->clerk_profit += $mdProfit->clerk_profit;
  312. $md->save();
  313. }
  314. }
  315. //如果存在可转单
  316. // $orderTransitInfo = OrderTransit::find()->where(['order_id' => $order->id, "is_delete" => 0, 'status' => 1])->all();
  317. // if($orderTransitInfo){
  318. // // $cloud_store_token = $this->getCloudStoreToken($this->store_id);
  319. // $cloud_store_token = get_merchant_token(0, $order->store_id);
  320. // //$cloudInfo = StoreCloud::find()->where(['store_id'=>$this->store_id,"is_delete"=>0])->one();
  321. // if($cloud_store_token) {
  322. // foreach($orderTransitInfo as $val){
  323. // $form = new MerchantForm();
  324. // $data = $form->mchPurchaseOrderConfirm(0, $order->store_id, $val->attributes['cloud_order_id']);
  325. // if ((int)$data['code'] !== 0) {
  326. // return $data;
  327. // }
  328. // $val->status = 2;
  329. // $val->confirm_time = time();
  330. // $val->save();
  331. // if ($val->errors) {
  332. // return [
  333. // 'code' => 1,
  334. // 'msg' => implode(';', array_values($val->firstErrors))
  335. // ];
  336. // }
  337. // }
  338. // } else {
  339. // return [
  340. // 'code' => 1,
  341. // 'msg' => "token信息错误"
  342. // ];
  343. // }
  344. // }
  345. $t->commit();
  346. return [
  347. 'code' => 0,
  348. 'msg' => '已确认收货'
  349. ];
  350. } else {
  351. throw new \Exception('确认收货失败');
  352. }
  353. } catch (\Exception $e) {
  354. $t->rollBack();
  355. return [
  356. 'code' => 1,
  357. 'msg' => $e->getMessage()
  358. ];
  359. }
  360. }
  361. public function smsSend()
  362. {
  363. $shop = Shop::findOne(['user_id'=>get_user_id(), 'store_id' => get_store_id(), 'is_delete' => 0,'shop_audit' => 1]);
  364. $query = Order::find()->where([
  365. 'is_delete' => 0,
  366. 'store_id' => get_store_id(),
  367. 'shop_id' => $shop->id,
  368. 'is_offline' => 1
  369. ])->andWhere([
  370. 'or',
  371. ['is_pay' => 1],
  372. ['=', 'pay_type' , 2]
  373. ]);
  374. $query->andWhere([
  375. 'trade_status' => Order::ORDER_FLOW_SEND
  376. ]);
  377. $query->andWhere(['is_recycle' => 0]);
  378. $list = $query->orderBy('created_at DESC')->all();
  379. foreach ($list as $order) {
  380. /**
  381. * @var Order $order
  382. */
  383. NoticeSend::ShopOffline($order->user_id, $order->mobile, $order->order_no, $order->shop_id);
  384. }
  385. return [
  386. 'code' => 0,
  387. 'msg' => '通知成功'
  388. ];
  389. }
  390. }