OrderForm.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. <?php
  2. /**
  3. * 重庆赤晓店信息科技有限公司
  4. * https://www.chixiaodian.com
  5. * Copyright (c) 2023 赤店商城 All rights reserved.
  6. */
  7. namespace app\plugins\food\models\client;
  8. use app\models\Option;
  9. use app\models\User;
  10. use app\plugins\food\models\FoodGoods;
  11. use app\plugins\food\models\FoodOrder;
  12. use app\plugins\food\models\FoodOrderDetail;
  13. use app\utils\Alipay\Alipay;
  14. use app\utils\Alipay\AlipayProfit;
  15. use app\utils\CloudPrint;
  16. use app\utils\OrderNo;
  17. use app\utils\Wechat\WechatNewPay;
  18. use app\utils\Wechat\WechatPay;
  19. use yii\base\BaseObject;
  20. use yii\base\Model;
  21. use yii\helpers\Json;
  22. use app\models\Store;
  23. class OrderForm extends Model
  24. {
  25. public $store_id;
  26. public $user_id;
  27. public $goods_list;
  28. public $table_num;
  29. public $order_id;
  30. public $pay_type;
  31. public function rules()
  32. {
  33. return [
  34. [['order_id', 'pay_type'], 'integer'],
  35. [['table_num'], 'string'],
  36. [['goods_list', 'table_num'], 'required'],
  37. ['goods_list', function ($attr, $params) {
  38. $data = Json::decode($this->goods_list);
  39. if (!$data) {
  40. $this->addError($attr, "{$attr}数据格式错误。");
  41. }
  42. $this->goods_list = $data;
  43. }],
  44. ['goods_list', function ($attr, $params) {
  45. foreach ($this->goods_list as $i => $goods) {
  46. if (!is_array($goods)) {
  47. $this->addError($attr, "{$goods}必须是一个数组。");
  48. return;
  49. }
  50. if (empty($goods['id'])) {
  51. $this->addError($attr, "{$goods}['id']不能为空。");
  52. return;
  53. }
  54. if (!is_array($goods['attr'])) {
  55. $this->addError($attr, "{$goods}['attr']必须是一个数组。");
  56. return;
  57. }
  58. if (empty($goods['num'])) {
  59. $this->addError($attr, "{$goods}['num']不能为空。");
  60. return;
  61. }
  62. }
  63. }],
  64. ];
  65. }
  66. public function submit() {
  67. if (!$this->validate()) {
  68. return [
  69. 'code' => 1,
  70. 'msg' => $this->getErrorSummary(false)[0]
  71. ];
  72. }
  73. $food_times = FoodOrderDetail::find()->where(['order_id' => $this->order_id])->groupBy('times')->select('times')->asArray()->all();
  74. $food_times = array_column($food_times, 'times');
  75. $user = get_user();
  76. // order_id存在说明已存在订单,执行加菜操作
  77. if (!empty($this->order_id)) {
  78. $food_order = FoodOrder::findOne(['store_id' => $this->store_id, 'id' => $this->order_id, 'is_pay' => FoodOrder::IS_PAY_FALSE]);
  79. if (!$food_order) {
  80. return [
  81. 'code' => 1,
  82. 'msg' => '订单异常'
  83. ];
  84. }
  85. $times = max($food_times);
  86. foreach ($this->goods_list as $key => $value) {
  87. $food_goods = FoodGoods::findOne(['id' => $value['id'], ['status' => FoodGoods::STATUS_NORMAL]]);
  88. if (!$food_goods) {
  89. unset($this->goods_list[$key]);
  90. continue;
  91. }
  92. $food_detail = new FoodOrderDetail();
  93. $food_detail->order_id = $this->order_id;
  94. $food_detail->goods_id = $value['id'];
  95. $food_detail->goods_name = $food_goods->name;
  96. $food_detail->num = $value['num'];
  97. $food_detail->total_price = $food_goods->price * $value['num'];
  98. $food_detail->created_at = time();
  99. $food_detail->times = $times + 1;
  100. $food_detail->attr = Json::encode($value['attr']);
  101. $food_detail->pic = $value['pic'];
  102. if (!$food_detail->save()) {
  103. return [
  104. 'code' => 1,
  105. 'msg' => 'goods_id: '. $value['id']. '-' .$food_detail->errors[0]
  106. ];
  107. } else {
  108. $food_order = FoodOrder::findOne($this->order_id);
  109. $food_order->pay_price += $food_goods->price * $value['num'];
  110. $food_order->total_price += $food_goods->price * $value['num'];
  111. $food_order->save();
  112. }
  113. }
  114. } else {
  115. $food_order = new FoodOrder();
  116. $food_order->store_id = $this->store_id;
  117. $food_order->user_id = $this->user_id;
  118. $food_order->order_no = OrderNo::getOrderNo(OrderNo::ORDER_ALIPAY_FOOD);
  119. $pay_price = 0;
  120. foreach ($this->goods_list as $key => $goods) {
  121. $food_goods = FoodGoods::findOne(['id' => $goods['id'], ['status' => FoodGoods::STATUS_NORMAL]]);
  122. if (!$food_goods) {
  123. unset($this->goods_list[$key]);
  124. continue;
  125. }
  126. $pay_price += floatval($food_goods->price * $goods['num']);
  127. }
  128. $total_price = $pay_price;
  129. $food_order->total_price = $total_price;
  130. $food_order->pay_price = $pay_price;
  131. $food_order->name = $user->nickname;
  132. $food_order->mobile = $user->binding;
  133. $food_order->remark = '';
  134. $food_order->is_pay = FoodOrder::IS_PAY_FALSE;
  135. $food_order->created_at = time();
  136. $food_order->table_num = $this->table_num;
  137. // 添加分销关系
  138. $share_setting = Option::get('share_basic_setting', $this->store_id);
  139. $share_setting = $share_setting ? Json::decode($share_setting['value']) : [];
  140. if (isset($share_setting['rebate']) && $share_setting['rebate']['value'] > 0) {
  141. // 一级
  142. $food_order->parent_id = $user->id;
  143. if ($user->parent_id) {
  144. // 二级
  145. $food_order->parent_id_1 = $user->parent_id;
  146. $user_final = User::findOne($user->parent_id);
  147. if ($user_final->parent_id) {
  148. // 三级
  149. $food_order->parent_id_2 = $user_final->parent_id;
  150. }
  151. }
  152. } else {
  153. if ($user->parent_id) {
  154. $food_order->parent_id = $user->parent_id;
  155. // 二级
  156. $user_second = User::findOne($user->parent_id);
  157. if ($user_second->parent_id) {
  158. $food_order->parent_id_1 = $user_second->parent_id;
  159. $user_final = User::findOne($user_second->parent_id);
  160. if ($user_final->parent_id) {
  161. // 三级
  162. $food_order->parent_id_2 = $user_final->parent_id;
  163. }
  164. }
  165. }
  166. }
  167. if (!$food_order->save()) {
  168. return [
  169. 'code' => 1,
  170. 'msg' => $food_order->errors[0]
  171. ];
  172. } else {
  173. $this->order_id = $food_order->id;
  174. foreach ($this->goods_list as $key => $value) {
  175. $food_goods = FoodGoods::findOne(['id' => $value['id'], ['status' => FoodGoods::STATUS_NORMAL]]);
  176. if (!$food_goods) {
  177. unset($this->goods_list[$key]);
  178. continue;
  179. }
  180. $food_detail = new FoodOrderDetail();
  181. $food_detail->order_id = $food_order->id;
  182. $food_detail->goods_id = $value['id'];
  183. $food_detail->goods_name = $food_goods->name;
  184. $food_detail->num = $value['num'];
  185. $food_detail->total_price = floatval($food_goods->price * $value['num']);
  186. $food_detail->created_at = time();
  187. $food_detail->times = 1;
  188. $food_detail->attr = Json::encode($value['attr']);
  189. $food_detail->pic = $value['pic'];
  190. if (!$food_detail->save()) {
  191. return [
  192. 'code' => 1,
  193. 'msg' => 'goods_id: '. $value['id']. '-' .$food_detail->errors[0]
  194. ];
  195. }
  196. }
  197. }
  198. }
  199. return [
  200. 'code' => 0,
  201. 'msg' => 'success',
  202. 'data' => $this->order_id
  203. ];
  204. }
  205. /**
  206. * @return array|\Yansongda\Supports\Collection
  207. */
  208. public function pay() {
  209. $goods_list = FoodOrderDetail::find()->where(['order_id' => $this->order_id])->asArray()->all();
  210. $goods_names = '';
  211. foreach ($goods_list as $goods) {
  212. $goods_names .= $goods['goods_name'] . ';';
  213. }
  214. $goods_names = mb_substr($goods_names, 0, 32, 'utf-8');
  215. $order = FoodOrder::findOne($this->order_id);
  216. // 供应链系统下单时是否使用平台商户号,1使用,0未使用
  217. if (\Yii::$app->prod_is_dandianpu() && !Store::hasIncoming($order->store_id)) {
  218. $order->is_use_platform_mch = 1;
  219. $order->save();
  220. }
  221. if ($this->pay_type == 1) {
  222. if (\Yii::$app->prod_is_dandianpu() && !Store::hasIncoming($order->store_id) && self_mini() === false) {
  223. $result = WechatPay::orderUnify($order,OrderNo::ORDER_MALL, $goods_names);
  224. } else {
  225. if (is_profit_pay()) {
  226. $result = WechatNewPay::orderUnify($order,OrderNo::ORDER_MALL, $goods_names);
  227. } else {
  228. $result = WechatPay::orderUnify($order,OrderNo::ORDER_MALL, $goods_names);
  229. }
  230. }
  231. if (isset($result['code']) && $result['code'] == 1) {
  232. return $result;
  233. }
  234. return [
  235. 'code' => 0,
  236. 'msg' => 'success',
  237. 'data' => (object)$result['data'],
  238. 'res' => $result['res'],
  239. 'body' => $goods_names
  240. ];
  241. } else {
  242. if (is_profit_pay('ali')) {
  243. $result = AlipayProfit::mini($order, $goods_names, get_user(), '', '', true);
  244. } else {
  245. $result = Alipay::mini($order, $goods_names, get_user());
  246. }
  247. if (isset($result['code']) && $result['code'] == 1) {
  248. return $result;
  249. }
  250. return [
  251. 'code' => 0,
  252. 'msg' => 'success',
  253. 'data' => $result['data']['trade_no'],
  254. 'body' => $goods_names
  255. ];
  256. }
  257. }
  258. }