CsOrdersController.php 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. <?php
  2. namespace addons\CloudStockTwo\api\modules\v1\controllers;
  3. use addons\CloudStockTwo\common\enums\CloudStockTwoEnum;
  4. use addons\CloudStockTwo\common\events\order\FillOrderConfirmEvent;
  5. use addons\CloudStockTwo\common\logic\order\PayNotify;
  6. use addons\CloudStockTwo\common\models\CloudStockTwoAgentOrder;
  7. use addons\CloudStockTwo\common\models\CloudStockTwoFillOrder;
  8. use addons\CloudStockTwo\common\models\CloudStockTwoGoods;
  9. use addons\CloudStockTwo\common\models\CloudStockTwoLevel;
  10. use common\enums\AddonsEnum;
  11. use common\enums\StatusEnum;
  12. use common\helpers\StringHelper;
  13. use common\models\goods\Goods;
  14. use common\models\user\User;
  15. class CsOrdersController extends BaseController
  16. {
  17. public $modelClass = '';
  18. /**
  19. * 不用进行登录验证的方法
  20. *
  21. * 例如: ['index', 'update', 'create', 'view', 'delete']
  22. * 默认全部需要验证
  23. *
  24. * @var array
  25. */
  26. protected $authOptional = [];
  27. /**
  28. * @name:
  29. * @msg: 代理商自提订单列表
  30. * @param {*}
  31. * @return {*}
  32. */
  33. public function actionList()
  34. {
  35. if (!\Yii::$app->request->isGet) {
  36. return $this->error('请求方式错误');
  37. }
  38. $page = \Yii::$app->request->get('page', 1);
  39. $limit = \Yii::$app->request->get('limit', $this->pageSize);
  40. $wheres[] = ['mall_id' => $this->mall_id, 'user_id' => $this->user_id, 'status' => StatusEnum::ENABLED];
  41. $params = [
  42. 'select' => 'id,mall_id,user_id,goods_id,num,address,express_no,express_code,send_status,mobile,name,created_at',
  43. 'where' => $wheres,
  44. 'order' => 'created_at desc',
  45. 'page' => $page,
  46. 'limit' => $limit,
  47. ];
  48. $orders = CloudStockTwoAgentOrder::listPage($params);
  49. if (empty($orders['list'])) {
  50. if (is_array($orders['list'])) {
  51. return $this->success('success', $orders);
  52. } else {
  53. return $this->error('获取自提订单失败:' . CloudStockTwoAgentOrder::getStaticError());
  54. }
  55. }
  56. $good_ids = array_column($orders['list'], 'goods_id');
  57. $goods = Goods::find()
  58. ->select('id,goods_name,price,cover_pic')
  59. ->where(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED, 'id' => $good_ids])
  60. ->asArray()
  61. ->indexBy('id')
  62. ->all();
  63. foreach ($orders['list'] as &$order) {
  64. $good = $goods[$order['goods_id']] ?? [];
  65. unset($good['id']);
  66. $order = array_merge($order, $good);
  67. }
  68. $send_status_map = CloudStockTwoEnum::getAgentOrdetStatusMap();
  69. $orders['send_status_map'] = $send_status_map;
  70. return $this->success('success', $orders);
  71. }
  72. /**
  73. * @name:
  74. * @msg: 订单详情
  75. * @param {*}
  76. * @return {*}
  77. */
  78. public function actionDetail()
  79. {
  80. if (!\Yii::$app->request->isGet) {
  81. return $this->error('请求方式错误');
  82. }
  83. $order_id = \Yii::$app->request->get('order_id');
  84. if (empty($order_id)) return $this->error('参数错误');
  85. $order = CloudStockTwoAgentOrder::find()
  86. ->select('id,mall_id,user_id,num,address,express_code,express_no,goods_id,mobile,name,created_at,send_status')
  87. ->where(['mall_id' => $this->mall_id, 'user_id' => $this->user_id, 'status' => StatusEnum::ENABLED, 'id' => $order_id])
  88. ->asArray()
  89. ->one();
  90. if (empty($order)) return $this->error('订单不存在');
  91. $good = Goods::find()
  92. ->select('id,goods_name,price,cover_pic')
  93. ->where(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED, 'id' => $order['goods_id']])
  94. ->asArray()
  95. ->one();
  96. unset($good['id']);
  97. $order = array_merge($order, $good);
  98. $send_status_map = CloudStockTwoEnum::getAgentOrdetStatusMap();
  99. return $this->success('success', ['order' => $order, 'send_status_map' => $send_status_map]);
  100. }
  101. /**
  102. * @name:
  103. * @msg: 确认收货
  104. * @param {integer} order_id 订单id
  105. * @return {*}
  106. */
  107. public function actionConfirm()
  108. {
  109. if (!\Yii::$app->request->isPost) {
  110. return $this->error('请求方式错误');
  111. }
  112. $order_id = \Yii::$app->request->post('order_id');
  113. if (empty($order_id)) return $this->error('参数错误');
  114. $agent_order = CloudStockTwoAgentOrder::findOne([
  115. 'id' => $order_id,
  116. 'mall_id' => $this->mall_id,
  117. 'user_id' => $this->user_id,
  118. 'status' => StatusEnum::ENABLED,
  119. 'send_status' => CloudStockTwoEnum::PICK_ORDER_STATUS1,
  120. ]);
  121. if (empty($agent_order)) return $this->error('订单不存在或者未发货');
  122. $params = [
  123. 'id' => $order_id,
  124. 'send_status' => CloudStockTwoEnum::PICK_ORDER_STATUS2,
  125. ];
  126. $res = CloudStockTwoAgentOrder::setData($this->mall_id, $params);
  127. if (false === $res) return $this->error(CloudStockTwoAgentOrder::getStaticError());
  128. // 自提订单确认收货事件
  129. $event = new FillOrderConfirmEvent($this->mall_id);
  130. $data = ['id' => $order_id];
  131. \Yii::$app->services->events->dispatch($event, $data, $event->listeners);
  132. return $this->success('操作成功');
  133. }
  134. /**
  135. * @name:
  136. * @msg: 创建订单
  137. * @param {integer} goods_id:商品 id
  138. * @param {integer} number:补货数量
  139. * @param {float} pay_money:支付金额
  140. * @param {string} pay_type:支付方式
  141. * @param {string} transaction_password:交易密码
  142. * @return {*}
  143. */
  144. public function actionCreate()
  145. {
  146. if (!\Yii::$app->request->isPost) {
  147. return $this->error('请求方式错误');
  148. }
  149. $post = \Yii::$app->request->post();
  150. $rules = [
  151. [['goods_id', 'number', 'pay_money'], 'required'],
  152. [['goods_id', 'number'], 'integer'],
  153. ['pay_money', 'number'],
  154. ];
  155. $res = \Yii::$app->services->validate->validate($post, $rules);
  156. if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage());
  157. // 当前会员是否可以补货当前商品
  158. $rr = CloudStockTwoGoods::canFillGood($this->mall_id, $post['goods_id'], $this->stock_agent->level, $this->user_id);
  159. if (false === $rr) {
  160. return $this->error('暂不能补货当前商品');
  161. }
  162. $agent_level = $this->stock_agent->level;
  163. $level_model = CloudStockTwoLevel::findOne(['mall_id'=>$this->mall_id,'level'=>$agent_level,'status'=>StatusEnum::ENABLED]);
  164. if(!empty($level_model['is_open_fill_min'])&&!empty($level_model['fill_min'])&&$post['number']<$level_model['fill_min']){
  165. return $this->error('每次补货的最低数量为'.$level_model['fill_min']);
  166. }
  167. $all_stocks = CloudStockTwoGoods::allPerantAgentGoodStocks($post['goods_id'], $this->user_id, $this->mall_id);
  168. if (false === $all_stocks) {
  169. return $this->error(CloudStockTwoGoods::getStaticError());
  170. } elseif ($post['number'] > $all_stocks) {
  171. return $this->error('补货数量超过了商品库存');
  172. }
  173. $stock_good = CloudStockTwoGoods::findOne(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED, 'goods_id' => $post['goods_id']]);
  174. if (empty($stock_good)) return $this->error('商品数据异常');
  175. $agent_price = json_decode($stock_good['agent_price'],true);
  176. $agent_price = array_column($agent_price,null,'level');
  177. $unit_price = 0;
  178. if(!empty($agent_price[$this->stock_agent->level])){
  179. $unit_price = $agent_price[$this->stock_agent->level]['price'];
  180. }
  181. $pay_money = bcmul($unit_price, $post['number'], 2);
  182. if ($pay_money != $post['pay_money']) return $this->error('支付金额错误');
  183. $order_no = StringHelper::generateOrderNo('CSF');
  184. //生成支付流水
  185. $order_trade_info[] = [
  186. 'order_no' => $order_no,
  187. 'amount' => $pay_money,
  188. 'title' => '云库存补货订单',
  189. 'notify_class' => PayNotify::class,
  190. 'order_type' => AddonsEnum::ADDONS_NAME_CLOUD_STOCK_TWO,
  191. ];
  192. $res_trade = \Yii::$app->services->pay->createTrade($this->mall_id, $this->user_id, $order_trade_info);
  193. if ($res_trade == false) return $this->error('生成支付流水失败');
  194. $params = [
  195. 'user_id' => $this->user_id,
  196. 'trade_id' => $res_trade['trade_id'],
  197. 'pay_money' => $pay_money,
  198. 'order_no' => $order_no,
  199. 'trade_no' => $res_trade['trade_no'],
  200. 'is_pay' => CloudStockTwoEnum::FILL_STATUS_NOT_PAY,
  201. 'goods_id' => $post['goods_id'],
  202. 'num' => $post['number'],
  203. ];
  204. $res_fill_order = CloudStockTwoFillOrder::setData($this->mall_id, $params);
  205. if (false === $res) return $this->error(CloudStockTwoFillOrder::getStaticError());
  206. return $this->success('订单创建成功', ['trade_no' => $res_trade['trade_no'], 'trade_id' => $res_trade['trade_id'], 'order_ids' => $res_fill_order->id]);
  207. }
  208. }