OrderForm.php 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626
  1. <?php
  2. /**
  3. * OrderForm.php
  4. * todo 文件描述
  5. * Created on 2024/12/4 上午9:22
  6. * @author: hankaige
  7. */
  8. namespace app\modules\client\models\v1\cashier;
  9. use app\models\AggregateQrcode;
  10. use app\models\AggregateSaasQrcode;
  11. use app\models\Attr;
  12. use app\models\AttrGroup;
  13. use app\models\CashierActionLog;
  14. use app\models\Goods;
  15. use app\models\HangingOrder;
  16. use app\models\HangingOrderDetail;
  17. use app\models\MdGoods;
  18. use app\models\Option;
  19. use app\models\Order;
  20. use app\models\OrderDetail;
  21. use app\models\Store;
  22. use app\models\User;
  23. use app\modules\client\models\v1\common\CommonGoods;
  24. use app\utils\QrCode;
  25. use app\utils\ShareQrcode;
  26. use yii\base\Model;
  27. class OrderForm extends Model
  28. {
  29. public $store_id;
  30. public $md_id;
  31. // 直接收银金额
  32. public $price;
  33. // 操作挂单
  34. public $user_id;
  35. public $goods_list;
  36. public $hanging_order_id;
  37. // 挂单列表
  38. public $keywords;
  39. // 直接收银
  40. const IMMEDIATELY_PAY = 'immediately_pay';
  41. const HANGING_ORDER = 'hanging_order';
  42. const HANGING_ORDER_LIST = 'hanging_order_list';
  43. const HANGING_ORDER_DETAIL = 'hanging_order_detail';
  44. const DEL_HANGING_ORDER = 'del_hanging_order';
  45. const GET_HANGING_ORDER = 'get_hanging_order';
  46. const ORDER_LIST = 'order_list';
  47. public function rules(): array
  48. {
  49. return [
  50. [['store_id', 'user_id', 'hanging_order_id', 'md_id'], 'integer', 'on' => [self::IMMEDIATELY_PAY, self::HANGING_ORDER, self::HANGING_ORDER_DETAIL, self::DEL_HANGING_ORDER,self::GET_HANGING_ORDER]],
  51. ['price', 'number', 'on' => [self::IMMEDIATELY_PAY]],
  52. [['store_id', 'price'], 'required', 'on' => [self::IMMEDIATELY_PAY]],
  53. [['goods_list'], 'safe', 'on' => [self::HANGING_ORDER]],
  54. [['keywords'], 'string', 'on' => [self::HANGING_ORDER_LIST,self::ORDER_LIST]],
  55. ['hanging_order_id', 'required', 'on' => [self::HANGING_ORDER_DETAIL, self::DEL_HANGING_ORDER,self::GET_HANGING_ORDER]]
  56. ];
  57. }
  58. public function attributeLabels(): array
  59. {
  60. return [
  61. 'store_id' => '商城ID',
  62. 'price' => '收款金额'
  63. ];
  64. }
  65. public function getPayQrcode(): array
  66. {
  67. try {
  68. if (!$this->validate()) {
  69. throw new \Exception($this->getErrorSummary(FALSE)[0]);
  70. }
  71. $store_id = $this->store_id;
  72. $md_id = $this->md_id;
  73. $filename = md5('scan_' . $store_id . '_' . $this->price . '_md_id_' . $md_id);
  74. $ag = AggregateQrcode::findOne(['store_id' => $store_id]);
  75. $store = Store::findOne($store_id);
  76. $self_mini = Option::get('self_mini', $store_id, 'store', 0)['value'];
  77. $data = [];
  78. if (!\Yii::$app->isSaas()) {
  79. $data['mini_url'] = '/face-pay/face-pay/payOut';
  80. $data['param_url'] = 'https://' . \Yii::$app->request->hostName . '/web/face/pay/' . $store_id . '?p=' . $this->price . '&md_id=' . $md_id;
  81. }
  82. if (!empty($store) && ((int)$store->business_model !== 1 || (\Yii::$app->prod_is_dandianpu()) && !$self_mini)) {
  83. $asg = AggregateSaasQrcode::findOne(['store_id' => $store_id]);
  84. if (empty($asg->qrcode_url) || !file_exists(str_replace(\Yii::$app->request->hostInfo, \Yii::$app->basePath, $asg->qrcode_url))) {
  85. if (!empty($asg->param_url)) {
  86. $path = \Yii::$app->runtimePath . '/image/' . $filename . '.jpg';
  87. $pic_url = str_replace('http://', 'https://', \Yii::$app->request->hostInfo . '/runtime/image/' . $filename . '.jpg');
  88. $text = $asg->param_url . '?p=' . $this->price . '&md_id=' . $md_id;
  89. QrCode::image($text, 500, FALSE, 'L', 'JPEG', 0, ['255,255,255', '0,0,0'], 1, FALSE, $path);
  90. return [
  91. 'code' => 0,
  92. 'data' => [
  93. 'qr_url' => $pic_url,
  94. 'business_model' => $store->business_model,
  95. 'is_saas' => (int)\Yii::$app->isSaas(),
  96. 'data' => [
  97. 'param_url' => $pic_url
  98. ]
  99. ]
  100. ];
  101. }
  102. }
  103. $path = \Yii::$app->runtimePath . '/image/' . $filename . '.jpg';
  104. $pic_url = str_replace('http://', 'https://', \Yii::$app->request->hostInfo . '/runtime/image/' . $filename . '.jpg');
  105. if (file_exists($path)) {
  106. return [
  107. 'code' => 0,
  108. 'data' => [
  109. 'qr_url' => $pic_url,
  110. 'business_model' => $store->business_model,
  111. 'is_saas' => (int)\Yii::$app->isSaas(),
  112. 'data' => [
  113. 'param_url' => $pic_url
  114. ]
  115. ]
  116. ];
  117. }
  118. $text = 'store_id:' . $store_id . ',p:' . $this->price . ',md_id:' . $md_id;
  119. $app = ShareQrcode::setBussinessWechat();
  120. $response = $app->getUnlimit($text, [
  121. 'width' => 500,
  122. 'page' => "face-pay/face-pay/payOut"
  123. ]);
  124. if ($response instanceof \EasyWeChat\Kernel\Http\StreamResponse) {
  125. $filename = $response->save(\Yii::$app->runtimePath . '/image/', $filename);
  126. } else {
  127. return [
  128. 'code' => 1,
  129. 'data' => [
  130. 'response' => $response,
  131. 'business_model' => $store->business_model,
  132. ]
  133. ];
  134. }
  135. return [
  136. 'code' => 0,
  137. 'data' => [
  138. 'qr_url' => $pic_url,
  139. 'business_model' => $store->business_model,
  140. 'is_saas' => (int)\Yii::$app->isSaas(),
  141. 'data' => [
  142. 'param_url' => $pic_url
  143. ]
  144. ]
  145. ];
  146. } else if (empty($ag->param_url)) {
  147. $path = \Yii::$app->runtimePath . '/image/' . $filename . '.jpg';
  148. $pic_url = str_replace('http://', 'https://', \Yii::$app->request->hostInfo . '/runtime/image/' . $filename . '.jpg');
  149. if (file_exists($path)) {
  150. return [
  151. 'code' => 0,
  152. 'data' => [
  153. 'qr_url' => $pic_url,
  154. 'business_model' => $store->business_model,
  155. 'is_saas' => (int)\Yii::$app->isSaas(),
  156. 'data' => $data
  157. ]
  158. ];
  159. }
  160. //$text = str_replace('http://', 'https://', \Yii::$app->request->hostInfo . '/scan/' . $store_id);
  161. $text = str_replace('http://', 'https://', \Yii::$app->request->hostInfo . '/web/face/pay/' . $store_id . '?p=' . $this->price . '&md_id=' . $md_id);
  162. QrCode::image($text, 500, FALSE, 'L', 'JPEG', 0, ['255,255,255', '0,0,0'], 1, FALSE, $path);
  163. } else {
  164. //同步后端的聚合码
  165. $filename = md5(date('YmdHis') . $ag->id . $this->price);
  166. $path = \Yii::$app->runtimePath . '/image/' . $filename . '.jpg';
  167. $pic_url = str_replace('http://', 'https://', \Yii::$app->request->hostInfo . '/runtime/image/' . $filename . '.jpg');
  168. $ag = AggregateQrcode::find()->where(['id' => $ag->id])->select('param_url,id,qrcode_url')->one();
  169. if (empty($ag->qrcode_url) || !file_exists(str_replace(\Yii::$app->request->hostInfo, \Yii::$app->basePath, $ag->qrcode_url))) {
  170. if (!empty($ag->param_url)) {
  171. $text = $ag->param_url . '?p=' . $this->price . '&md_id=' . $md_id;
  172. QrCode::image($text, 500, FALSE, 'L', 'JPEG', 0, ['255,255,255', '0,0,0'], 1, FALSE, $path);
  173. }
  174. }
  175. }
  176. return [
  177. 'code' => 0,
  178. 'data' => [
  179. 'qr_url' => $pic_url,
  180. 'business_model' => $store->business_model,
  181. 'data' => [
  182. 'param_url' => $pic_url,
  183. ],
  184. 'is_saas' => (int)\Yii::$app->isSaas(),
  185. ]
  186. ];
  187. } catch (\Exception $e) {
  188. return ['code' => 1, 'msg' => $e->getMessage()];
  189. }
  190. }
  191. public function hangingOrder(): array
  192. {
  193. try {
  194. if (!$this->validate()) {
  195. throw new \Exception($this->getErrorSummary(FALSE)[0]);
  196. }
  197. $t = \Yii::$app->db->beginTransaction();
  198. // 需要下检测一下商品
  199. $totalPrice = 0;
  200. $orderGoods = [];
  201. $this->goods_list = json_decode($this->goods_list, TRUE);
  202. foreach ($this->goods_list as $value) {
  203. // 商品数据
  204. $goods = Goods::findOne($value['goods_id']);
  205. // 购买商品的规格数据
  206. $attr = [];
  207. foreach ($value['attr'] as $attrItem) {
  208. if (!empty($attrItem['attr_id'])) {
  209. $attr[] = intval($attrItem['attr_id']);
  210. }
  211. }
  212. // 根据规格获取商品的库存及规格价格信息
  213. $attr_info = $goods->getAttrInfo($attr);
  214. if (isset($value['new_price']) && $value['new_price'] > 0) {
  215. $goods->price = $attr_info['price'] = $value['new_price'];
  216. }
  217. $goodsPrice = sprintf('%.2f', ($value['new_price'] > 0 ? $value['new_price'] : ($goods->use_attr ? $attr_info['price'] : $goods->price)) * $value['num']);
  218. // 整理detail数据
  219. $dataItem = [
  220. 'goods_id' => $goods->id,
  221. 'goods_name' => $goods->name,
  222. 'num' => $value['num'],
  223. 'total_price' => $goodsPrice,
  224. 'attr' => json_encode($attr, JSON_UNESCAPED_UNICODE),
  225. 'new_price' => $value['new_price'] ?: 0
  226. ];
  227. $orderGoods[] = $dataItem;
  228. // 商品的价格乘以商品的数量
  229. $totalPrice += $goodsPrice;
  230. }
  231. if ($this->hanging_order_id > 0) {
  232. $hangingOrder = HangingOrder::findOne($this->hanging_order_id);
  233. } else {
  234. $hangingOrder = new HangingOrder();
  235. }
  236. if (!$this->user_id) {
  237. return [
  238. 'code' => 1,
  239. 'msg' => '生成挂单记录失败,挂单用户id不能为空'
  240. ];
  241. }
  242. $hangingOrder->store_id = $this->store_id;
  243. $hangingOrder->user_id = $this->user_id;
  244. $hangingOrder->md_id = 0;
  245. if ($this->hanging_order_id <= 0) {
  246. // 不修改原来的挂单订单编号
  247. $hangingOrder->order_no = self::createOrderNo();
  248. }
  249. $hangingOrder->total_price = $totalPrice;
  250. $hangingOrder->create_at = time();
  251. $hangingOrder->is_delete = 0;
  252. $hangingOrder->status = 0;
  253. if (!$hangingOrder->save()) {
  254. $t->rollBack();
  255. return [
  256. 'code' => 1,
  257. 'msg' => '生成挂单记录失败',
  258. 'data' => $hangingOrder->getErrors()
  259. ];
  260. }
  261. // 先删除之前所有挂单商品
  262. if ($this->hanging_order_id > 0) {
  263. HangingOrderDetail::updateAll(['is_delete' => 1], ['order_id' => $hangingOrder->id]);
  264. }
  265. // 处理挂单商品信息
  266. foreach ($orderGoods as $detailItem) {
  267. $hangingOrderDetail = new HangingOrderDetail();
  268. $hangingOrderDetail->order_id = $hangingOrder->id;
  269. $hangingOrderDetail->goods_id = $detailItem['goods_id'];
  270. $hangingOrderDetail->num = $detailItem['num'];
  271. $hangingOrderDetail->attr = $detailItem['attr'];
  272. $hangingOrderDetail->total_price = $detailItem['total_price'];
  273. $hangingOrderDetail->new_price = $detailItem['new_price'];
  274. $hangingOrderDetail->is_delete = 0;
  275. if (!$hangingOrderDetail->save()) {
  276. $t->rollBack();
  277. return [
  278. 'code' => 1,
  279. 'data' => $hangingOrderDetail->getErrors()
  280. ];
  281. }
  282. }
  283. // 生成操作记录
  284. CashierActionLog::setLog($this->store_id,get_user_id(),CashierActionLog::HANGINF_ORDER,'提交挂单信息', $hangingOrder->md_id);
  285. $t->commit();
  286. return [
  287. 'code' => 0,
  288. 'data' => '订单挂单成功'
  289. ];
  290. } catch (\Exception $e) {
  291. return [
  292. 'code' => 1,
  293. 'msg' => $e->getMessage()
  294. ];
  295. }
  296. }
  297. /**
  298. * 生成订单号
  299. * @return string
  300. * User: hankaige
  301. * DATE TIME: 2022/12/5 15:11
  302. */
  303. private static function createOrderNo(): string
  304. {
  305. $order_no = NULL;
  306. while (TRUE) {
  307. $order_no = HangingOrder::ORDER_PREFIX . date('YmdHis') . mt_rand(100000, 999999);
  308. $exist_order_no = HangingOrder::find()->where(['order_no' => $order_no])->exists();
  309. if (!$exist_order_no) {
  310. break;
  311. }
  312. }
  313. return $order_no;
  314. }
  315. /**
  316. * 获取挂单订单列表
  317. * @return array
  318. * User: hankaige
  319. * DATE TIME: 2022/12/6 09:31
  320. */
  321. public function getHangingOrderList(): array
  322. {
  323. $query = HangingOrder::find()->alias('ho')->leftJoin(['u' => User::tableName()], 'ho.user_id=u.id')->with(['orderDetail'])->where(['ho.is_delete' => 0, 'ho.store_id' => $this->store_id]);
  324. if (!empty($this->keywords)) {
  325. $query->andWhere(['or', ['u.nickname', 'like', $this->keywords], ['ho.order_no', 'like', $this->keywords], ['u.binding', 'like', $this->keywords]]);
  326. }
  327. $md_id = $this->md_id;
  328. if ($md_id < 0) {
  329. $md_id = [0, -1];
  330. }
  331. $query->andWhere(['ho.md_id' => $md_id]);
  332. $query->orderBy('ho.create_at DESC')->select('ho.*,u.nickname,u.binding,u.avatar_url,u.id as user_id');
  333. $list = pagination_make($query);
  334. foreach ($list['list'] as &$item) {
  335. foreach ($item['orderDetail'] as &$value) {
  336. $goods = Goods::findOne([
  337. 'id' => $value['goods_id'],
  338. 'is_delete' => 0,
  339. 'status' => 1,
  340. ]);
  341. if (!$goods) {
  342. continue;
  343. }
  344. $goods_id_list[] = $value['goods_id'];
  345. $attr_list = Attr::find()->alias('a')
  346. ->select('ag.attr_group_name,a.attr_name,a.id as attr_id,a.attr_group_id')
  347. ->leftJoin(['ag' => AttrGroup::tableName()], 'a.attr_group_id=ag.id')
  348. ->where(['a.id' => json_decode($value['attr'], TRUE)])
  349. ->asArray()->all();
  350. $attr = $goods->attr;
  351. $price = $goods->price;
  352. $goodsData = [
  353. 'attr' => $attr,
  354. 'price' => $price,
  355. 'is_level' => $goods->is_level,
  356. 'use_attr' => $goods->use_attr,
  357. ];
  358. $user_id = $item['user_id'];
  359. $user = User::findOne($user_id);
  360. // todo 忘记这里是干什么用的
  361. if ($user) {
  362. \Yii::$app->jwt->setUser($user);
  363. }
  364. $goods_attr_info = CommonGoods::currentGoodsAttr($goodsData, (array)json_decode($value['attr'], TRUE));
  365. $goods_pic = isset($goods_attr_info['pic']) && !empty($goods_attr_info['pic']) ? $goods->getGoodsPic(0)->pic_url : $goods->cover_pic;
  366. $value['total_price'] = sprintf('%.2f', $value['total_price']);
  367. $value['goods_name'] = $goods->name;
  368. $value['attr_list'] = $attr_list;
  369. $value['goods_pic'] = $goods_pic;
  370. }
  371. $total_price_arr = array_column($item['orderDetail'], 'total_price');
  372. $item['total_price'] = round(array_sum($total_price_arr), 2);
  373. $item['create_at'] = date('Y-m-d H:i:s', $item['create_at']);
  374. }
  375. return [
  376. 'code' => 0,
  377. 'data' => $list
  378. ];
  379. }
  380. // 获取挂单商品列表
  381. public function getHangingOrderDetail(): array
  382. {
  383. if (empty($this->hanging_order_id)) {
  384. return ['code' => 1, 'msg' => '挂单订单ID有误'];
  385. }
  386. $md_id = $this->md_id;
  387. $query = HangingOrderDetail::find()->alias('hod')->leftJoin(['g' => Goods::tableName()], 'hod.goods_id = g.id')->where(['hod.order_id' => $this->hanging_order_id, 'hod.is_delete' => 0]);
  388. $list = $query->select('hod.*,g.name')->asArray()->all();
  389. foreach ($list as &$value) {
  390. $goods = Goods::findOne([
  391. 'id' => $value['goods_id'],
  392. 'is_delete' => 0,
  393. 'status' => 1,
  394. ]);
  395. if (!$goods) {
  396. continue;
  397. }
  398. $goods_id_list[] = $value['goods_id'];
  399. $attr_list = Attr::find()->alias('a')
  400. ->select('ag.attr_group_name,a.attr_name,a.id as attr_id,a.attr_group_id')
  401. ->leftJoin(['ag' => AttrGroup::tableName()], 'a.attr_group_id=ag.id')
  402. ->where(['a.id' => json_decode($value['attr'], TRUE)])
  403. ->asArray()->all();
  404. $attr = $goods->attr;
  405. $price = $goods->price;
  406. if ($md_id > 0) {
  407. $mdGoods = MdGoods::findOne(['goods_id' => $value['goods_id'], 'md_id' => $md_id]);
  408. $attr = $mdGoods->attr;
  409. $price = $mdGoods->price;
  410. }
  411. if ($value['new_price'] > 0) {
  412. $mch_attr_id = json_decode($value['attr'], TRUE);
  413. sort($mch_attr_id);
  414. $attr_ = json_decode($attr, TRUE);
  415. foreach ($attr_ as &$goods_attr_item) {
  416. $goods_attr_id = array_column($goods_attr_item['attr_list'], 'attr_id');
  417. sort($goods_attr_id);
  418. if (!array_diff($goods_attr_id, $mch_attr_id)) {
  419. $goods_attr_item['price'] = $value['new_price'];
  420. }
  421. }
  422. $attr = json_encode($attr_, JSON_UNESCAPED_UNICODE);
  423. $price = $value['new_price'];
  424. }
  425. $goodsData = [
  426. 'attr' => $attr,
  427. 'price' => $price,
  428. 'is_level' => $goods->is_level,
  429. 'use_attr' => $goods->use_attr,
  430. ];
  431. $goods_attr_info = CommonGoods::currentGoodsAttr($goodsData, (array)json_decode($value['attr'], TRUE));
  432. $goods_pic = isset($goods_attr_info['pic']) && !empty($goods_attr_info['pic']) ? $goods->getGoodsPic(0)->pic_url : $goods->cover_pic;
  433. $value['goods_name'] = $goods->name;
  434. $value['attr_list'] = $attr_list;
  435. $value['price'] = isset($goods_attr_info['level_price']) && !empty($goods_attr_info['level_price']) ? $goods_attr_info['level_price'] : $goods->price;
  436. foreach ($attr_list as $m) {
  437. $value['attr_text'] .= $m['attr_name'] . ' ';
  438. }
  439. $warn_goods_timeout = Goods::warn_goods_timeout($goods->store_id);
  440. $value['timeout_day'] = $goods->time_made_day ? date('Y-m-d', $goods->time_made_day + 86400 * $goods->time_shelf_life) : '--';
  441. $value['is_warn_goods_timeout'] = ($goods->time_made_day && ($goods->time_made_day + 86400 * $goods->time_shelf_life) < (time() + $warn_goods_timeout * 86400)) ? 1 : 0;
  442. $value['total_price'] = $value['price'] * $value['num'];
  443. $value['pic'] = $goods_pic;
  444. }
  445. return [
  446. 'code' => 0,
  447. 'data' => $list
  448. ];
  449. }
  450. public function delHanging(): array
  451. {
  452. if (empty($this->hanging_order_id)) {
  453. return ['code' => 1, 'msg' => '订单ID错误'];
  454. }
  455. $hangingModel = HangingOrder::findOne($this->hanging_order_id);
  456. if (!$hangingModel) {
  457. return ['code' => 1, 'msg' => '挂单不存在,请刷新再试'];
  458. }
  459. $t = \Yii::$app->db->beginTransaction();
  460. try {
  461. $hangingModel->is_delete = 1;
  462. if (!$hangingModel->save()) {
  463. $t->rollBack();
  464. return ['code' => 1, 'msg' => '删除失败'];
  465. }
  466. HangingOrderDetail::updateAll(['is_delete' => 1], ['order_id' => $this->hanging_order_id]);
  467. // 生成操作记录
  468. CashierActionLog::setLog($this->store_id,get_user_id(),CashierActionLog::DEL_HANGINF_ORDER,'删除挂单信息', $hangingModel->md_id);
  469. $t->commit();
  470. return ['code' => 0, 'msg' => '挂单订单删除成功'];
  471. } catch (\Exception $e) {
  472. $t->rollBack();
  473. return ['code' => 1, 'msg' => '系统错误', 'data' => $e->getMessage()];
  474. }
  475. }
  476. public function getHangingOrder(){
  477. if(empty($this->hanging_order_id)){
  478. return ['code' => 1,'msg'=>'订单ID错误'];
  479. }
  480. $md_id = $this->md_id;
  481. $hangingOrder = HangingOrder::find()->where(['id'=>$this->hanging_order_id,'is_delete' => 0])->with(['orderDetail','user'])->asArray()->one();
  482. // if ($hangingOrder) {
  483. // $user_id = $hangingOrder['user_id'];
  484. // $user = User::findOne($user_id);
  485. // if ($user) {
  486. // \Yii::$app->jwt->setUser($user);
  487. // }
  488. // }
  489. if(empty($hangingOrder)){
  490. return ['code' => 0, 'msg' => '挂单信息不存在'];
  491. }
  492. // 处理商品规格
  493. foreach($hangingOrder['orderDetail'] as &$item){
  494. $goods = Goods::findOne($item['goods_id']);
  495. $item['attr_list'] = Attr::find()->alias('a')
  496. ->select('ag.attr_group_name,a.attr_name,a.id as attr_id,a.attr_group_id')
  497. ->leftJoin(['ag' => AttrGroup::tableName()], 'a.attr_group_id=ag.id')
  498. ->where(['a.id' => json_decode($item['attr'], true)])
  499. ->asArray()->all();
  500. $attr = $goods->attr;
  501. $price = $goods->price;
  502. $md_id = 0;
  503. if ($this->md_id > 0) {
  504. $md_id = $this->md_id;
  505. $mdGoods = MdGoods::findOne(['goods_id' => $item['goods_id'], 'md_id' => $md_id]);
  506. $attr = $mdGoods->attr;
  507. $price = $mdGoods->price;
  508. }
  509. $mch_attr_id = json_decode($item['attr'], true);
  510. sort($mch_attr_id);
  511. $attr_ = json_decode($attr, true);
  512. foreach ($attr_ as &$goods_attr_item) {
  513. $goods_attr_id = array_column($goods_attr_item['attr_list'], 'attr_id');
  514. sort($goods_attr_id);
  515. if (!array_diff($goods_attr_id, $mch_attr_id)) {
  516. $goods_attr_item['price'] = $item['new_price'];
  517. if ($goods_attr_item['old_price']) {
  518. $item['old_price'] = $goods_attr_item['old_price'];
  519. }
  520. }
  521. }
  522. $attr = json_encode($attr_, JSON_UNESCAPED_UNICODE);
  523. // $price = $item['new_price'];
  524. $goodsData = [
  525. 'attr' => $attr,
  526. 'price' => $price,
  527. 'is_level' => $goods->is_level,
  528. 'use_attr' => $goods->use_attr,
  529. 'md_id' => $md_id
  530. ];
  531. $goods_attr_info = CommonGoods::currentGoodsAttr($goodsData, (array) json_decode($item['attr'], true));
  532. $item['pic'] = isset($goods_attr_info['pic']) && !empty($goods_attr_info['pic']) ? $goods->getGoodsPic(0)->pic_url : $goods->cover_pic;
  533. $item['name'] = $goods->name;
  534. $item['price'] = isset($goods_attr_info['price']) && !empty($goods_attr_info['price']) ? $goods_attr_info['price'] : $goods->price;
  535. $item['goods_id'] = $goods->id;
  536. $item['level_price'] = sprintf('%.2f', $goods_attr_info['level_price']);
  537. }
  538. return [
  539. 'code'=>0,
  540. 'msg' => '获取数据成功',
  541. 'data'=> $hangingOrder
  542. ];
  543. }
  544. public function orderList():array
  545. {
  546. try {
  547. $query = Order::find()->alias('o')->leftJoin(['u' => User::tableName()],'o.user_id=u.id')->where(['u.store_id' => $this->store_id,'u.is_delete' => Order::IS_DELETE_FALSE,'o.trade_status' => [Order::ORDER_FLOW_NO_SEND,Order::ORDER_FLOW_SEND,Order::ORDER_FLOW_CONFIRM],'o.mch_id' => 0])->select('o.id,o.order_no,o.created_at,o.trade_status,o.pay_type,o.ready_money,o.user_id,u.nickname,u.avatar_url,u.binding,o.total_price,o.pay_price');
  548. if($this->keywords){
  549. $query->andWhere(['or',['like','o.order_no',$this->keywords],['like','u.nickname',$this->keywords],['like','u.binding',$this->keywords]]);
  550. }
  551. $md_id = $this->md_id;
  552. if ($this->md_id <= 0) {
  553. $md_id = [0, -1];
  554. }
  555. $query->andWhere(['o.md_id' => $md_id]);
  556. $result = pagination_make($query,TRUE,'created_at DESC');
  557. foreach($result['list'] as &$item){
  558. $item['ready_money'] = json_decode($item['ready_money']);
  559. $item['created_at'] = date('Y/m/d H:i:s',$item['created_at']);
  560. $item['trade_status_text'] = Order::TRADE_STATUS_TEXT[$item['trade_status']];
  561. $item['pay_type_text'] = Order::PAY_TYP_NAME[$item['pay_type']];
  562. $item['orderDetail'] = OrderDetail::find()->where(['order_id' => $item['id']])->select('id,order_id,goods_name,num,total_price,attr,pic')->all();
  563. foreach($item['orderDetail'] as &$orderDetail){
  564. $orderDetail['attr'] = json_decode($orderDetail['attr'],true);
  565. }
  566. }
  567. return [
  568. 'code' => 0,
  569. 'data' => $result
  570. ];
  571. }catch (\Exception $e){
  572. return ['code' => 1, 'msg' => $e->getMessage()];
  573. }
  574. }
  575. }