| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558 |
- <?php
- namespace addons\CloudStock\api\modules\v1\controllers;
- use addons\CloudStock\api\services\CloudStockFillCartService;
- use addons\CloudStock\api\services\CloudStockFillOrderService;
- use addons\CloudStock\api\services\CloudStockGoodsService;
- use addons\CloudStock\common\enums\CloudStockEnum;
- use addons\CloudStock\common\events\order\FillOrderConfirmEvent;
- use addons\CloudStock\common\logic\order\PayNotify;
- use addons\CloudStock\common\logic\order\RestrictPurchases;
- use addons\CloudStock\common\models\CloudStockAgent;
- use addons\CloudStock\common\models\CloudStockAgentOrder;
- use addons\CloudStock\common\models\CloudStockAgentOrderDetails;
- use addons\CloudStock\common\models\CloudStockDeductionDetail;
- use addons\CloudStock\common\models\CloudStockFillOrder;
- use addons\CloudStock\common\models\CloudStockGoods;
- use addons\CloudStock\common\models\CloudStockLevel;
- use addons\CloudStock\common\models\CloudStockAgentGoods;
- use addons\CloudStock\common\models\CloudStockGoodsStockLog;
- use addons\CloudStock\common\models\CloudStockIncreaseDetail;
- use addons\CloudStock\api\services\CloudStockAgentOrderService;
- use common\models\common\Express;
- use common\models\common\PaymentTrade;
- use common\enums\AddonsEnum;
- use common\enums\StatusEnum;
- use common\helpers\StringHelper;
- use common\models\goods\Goods;
- use common\models\user\User;
- class CsOrdersController extends BaseController
- {
- public $modelClass = '';
- /**
- * 不用进行登录验证的方法
- *
- * 例如: ['index', 'update', 'create', 'view', 'delete']
- * 默认全部需要验证
- *
- * @var array
- */
- protected $authOptional = [];
- /**
- * @name:
- * @msg: 代理商自提订单列表
- * @param {*}
- * @return {*}
- */
- public function actionList()
- {
- if (!\Yii::$app->request->isGet) {
- return $this->error('请求方式错误');
- }
- $page = \Yii::$app->request->get('page', 1);
- $limit = \Yii::$app->request->get('limit', $this->pageSize);
- $wheres[] = ['mall_id' => $this->mall_id, 'user_id' => $this->user_id, 'status' => StatusEnum::ENABLED];
- $params = [
- 'select' => 'id,mall_id,user_id,goods_id,num,address,express_no,express_code,send_status,mobile,name,created_at,remark,seller_remark',
- 'where' => $wheres,
- 'order' => 'created_at desc',
- 'page' => $page,
- 'limit' => $limit,
- 'with' => [
- 'details' => function ($query) {
- $query
- ->where(['status' => StatusEnum::ENABLED])
- ->select('goods_id, num, order_id')
- ->with([
- 'goods' => function ($query) {
- $query->select('id, goods_name, cover_pic');
- }
- ]);
- }
- ]
- ];
- $orders = CloudStockAgentOrder::listPage($params);
- if (empty($orders['list'])) {
- if (is_array($orders['list'])) {
- return $this->success('success', $orders);
- } else {
- return $this->error('获取自提订单失败:' . CloudStockAgentOrder::getStaticError());
- }
- }
- $send_status_map = CloudStockEnum::getAgentOrdetStatusMap();
- $orders['send_status_map'] = $send_status_map;
- $setting =\Yii::$app->services->setting->addons->get($this->mall_id, AddonsEnum::ADDONS_NAME_CLOUD_STOCK, 'basic');
- $orders['is_show_update_address'] = $setting['is_show_update_address'] ?: 0;
- return $this->success('success', $orders);
- }
- /**
- * @name:
- * @msg: 订单详情
- * @param {*}
- * @return {*}
- */
- public function actionDetail()
- {
- try {
- if (!\Yii::$app->request->isGet) {
- return $this->error('请求方式错误');
- }
- $order_id = \Yii::$app->request->get('order_id');
- if (empty($order_id)) return $this->error('参数错误');
- $order = CloudStockAgentOrder::find()
- ->select('id,mall_id,user_id,num,address,express_code,express_no,goods_id,mobile,name,created_at,send_status')
- ->where(['mall_id' => $this->mall_id, 'user_id' => $this->user_id, 'status' => StatusEnum::ENABLED, 'id' => $order_id])
- ->with([
- 'details' => function ($query) {
- $query
- ->where(['status' => StatusEnum::ENABLED])
- ->select('goods_id, num, order_id')
- ->with([
- 'goods' => function ($query) {
- $query->select('id, goods_name, cover_pic');
- }
- ]);
- }
- ])
- ->asArray()
- ->one();
- if (empty($order)) return $this->error('订单不存在');
- $send_status_map = CloudStockEnum::getAgentOrdetStatusMap();
- $traces = CloudStockAgentOrder::viewLogistics($order_id,$this->mall_id);
- $order['traces'] = $traces;
- $order['express_name'] = '';
- $express = Express::findOne(['code'=>$order['express_code'],'status'=>StatusEnum::ENABLED]);
- $order['express_name'] = $express ? $express['name'] : '';
- return $this->success('success', ['order' => $order, 'send_status_map' => $send_status_map]);
- }catch (\Exception $e){
- return $this->error($e->getMessage());
- }
- }
- /**
- * @name:
- * @msg: 确认收货
- * @param {integer} order_id 订单id
- * @return {*}
- */
- public function actionConfirm()
- {
- if (!\Yii::$app->request->isPost) {
- return $this->error('请求方式错误');
- }
- $order_id = \Yii::$app->request->post('order_id');
- if (empty($order_id)) return $this->error('参数错误');
- $agent_order = CloudStockAgentOrder::findOne([
- 'id' => $order_id,
- 'mall_id' => $this->mall_id,
- 'user_id' => $this->user_id,
- 'status' => StatusEnum::ENABLED,
- 'send_status' => CloudStockEnum::PICK_ORDER_STATUS1,
- ]);
- if (empty($agent_order)) return $this->error('订单不存在或者未发货');
- $params = [
- 'id' => $order_id,
- 'send_status' => CloudStockEnum::PICK_ORDER_STATUS2,
- ];
- $res = CloudStockAgentOrder::setData($this->mall_id, $params);
- if (false === $res) return $this->error(CloudStockAgentOrder::getStaticError());
- // 自提订单确认收货事件
- $event = new FillOrderConfirmEvent($this->mall_id);
- $data = ['id' => $order_id];
- \Yii::$app->services->events->dispatch($event, $data, $event->listeners);
- return $this->success('操作成功');
- }
- /**
- * @name:
- * @msg: 创建订单
- * @param {integer} goods_id:商品 id
- * @param {integer} number:补货数量
- * @param {float} pay_money:支付金额
- * @param {string} pay_type:支付方式
- * @param {string} transaction_password:交易密码
- * @return {*}
- */
- public function actionCreate()
- {
- if (!\Yii::$app->request->isPost) {
- return $this->error('请求方式错误');
- }
- $post = \Yii::$app->request->post();
- $rules = [
- [['goods_id', 'number', 'pay_money'], 'required'],
- [['goods_id', 'number'], 'integer'],
- ['pay_money', 'number'],
- ];
- $res = \Yii::$app->services->validate->validate($post, $rules);
- if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage());
- // 当前会员是否可以补货当前商品
- $rr = CloudStockGoods::canFillGood($this->mall_id, $post['goods_id'], $this->stock_agent->level, $this->user_id);
- if (false === $rr) {
- return $this->error('暂不能补货当前商品');
- }
- $agent_level = $this->stock_agent->level;
- $level_model = CloudStockLevel::findOne(['mall_id'=>$this->mall_id,'level'=>$agent_level,'status'=>StatusEnum::ENABLED]);
- if(!empty($level_model['is_open_fill_min'])&&!empty($level_model['fill_min'])&&$post['number']<$level_model['fill_min']){
- return $this->error('每次补货的最低数量为'.$level_model['fill_min']);
- }
- $all_stocks = CloudStockGoods::allPerantAgentGoodStocks($post['goods_id'], $this->user_id, $this->mall_id);
- if (false === $all_stocks) {
- return $this->error(CloudStockGoods::getStaticError());
- } elseif ($post['number'] > $all_stocks) {
- return $this->error('补货数量超过了商品库存');
- }
- $stock_good = CloudStockGoods::findOne(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED, 'goods_id' => $post['goods_id']]);
- if (empty($stock_good)) return $this->error('商品数据异常');
- if( !empty($stock_good['min_replenish']) && $post['number'] < $stock_good['min_replenish'] ) {
- return $this->error('最低补货数量:'.$stock_good['min_replenish']);
- }
- if(!empty($stock_good['restrict_permissions'])){
- $restrict_permissions = json_decode($stock_good['restrict_permissions'],true);
- if(!empty($restrict_permissions)){
- $cloud_stock_agent = CloudStockAgent::find()->where(['user_id'=>$this->user_id,'status'=>StatusEnum::ENABLED,'mall_id'=>$this->mall_id])->one();
- if(in_array($cloud_stock_agent['level'],$restrict_permissions)){
- return $this->error('您当前等级禁止购买此商品');
- }
- }
- }
- try {
- RestrictPurchases::check($this->mall_id,$this->user_id,[$post['goods_id']],$post['number']);
- }catch (\Exception $e){
- return $this->error($e->getMessage());
- }
- $agent_price = json_decode($stock_good['agent_price'],true);
- $agent_price = array_column($agent_price,null,'level');
- $unit_price = 0;
- if(!empty($agent_price[$this->stock_agent->level])){
- $unit_price = $agent_price[$this->stock_agent->level]['price'];
- if(!empty($stock_good['is_take_by_range'])){
- foreach($agent_price[$this->stock_agent->level]['price_list'] as $item){
- if($item['start_num'] <= $post['number'] && $post['number'] <= $item['end_num']){
- $unit_price = $item['price'];
- }
- }
- }
- }
- $pay_money = bcmul($unit_price, $post['number'], 2);
- if ($pay_money != $post['pay_money']) return $this->error('支付金额错误');
- $order_no = StringHelper::generateOrderNo('CSF');
- //生成支付流水
- $order_trade_info[] = [
- 'order_no' => $order_no,
- 'amount' => $pay_money,
- 'title' => '云库存补货订单',
- 'notify_class' => PayNotify::class,
- 'order_type' => AddonsEnum::ADDONS_NAME_CLOUD_STOCK,
- ];
- $res_trade = \Yii::$app->services->pay->createTrade($this->mall_id, $this->user_id, $order_trade_info);
- if ($res_trade == false) return $this->error('生成支付流水失败');
- $params = [
- 'user_id' => $this->user_id,
- 'trade_id' => $res_trade['trade_id'],
- 'pay_money' => $pay_money,
- 'order_no' => $order_no,
- 'trade_no' => $res_trade['trade_no'],
- 'is_pay' => CloudStockEnum::FILL_STATUS_NOT_PAY,
- 'goods_id' => $post['goods_id'],
- 'num' => $post['number'],
- ];
- $res_fill_order = CloudStockFillOrder::setData($this->mall_id, $params);
- if (false === $res) return $this->error(CloudStockFillOrder::getStaticError());
- // 获取设置
- $configs = \Yii::$app->services->setting->addons->get($this->mall_id, AddonsEnum::ADDONS_NAME_CLOUD_STOCK, 'basic');
- $is_enable_rand_fee = $configs['is_enable_rand_fee'] ?? 0;
- return $this->success('订单创建成功', ['trade_no' => $res_trade['trade_no'], 'trade_id' => $res_trade['trade_id'], 'order_ids' => $res_fill_order->id,'is_enable_rand_fee'=>$is_enable_rand_fee]);
- }
- /**
- * @name:
- * @msg: 取消自提订单
- */
- public function actionCancelAgentOrder()
- {
- if (!\Yii::$app->request->isPost) {
- return $this->error('请求方式错误');
- }
- $post = \Yii::$app->request->post();
- $rules = [
- [['id'], 'required'],
- [['id'], 'integer'],
- ];
- $res = \Yii::$app->services->validate->validate($post, $rules);
- if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage());
- $order = CloudStockAgentOrder::findOne($post['id']);
- if (empty($order)) {
- return $this->error('自提订单异常');
- }
- if($order->send_status != CloudStockEnum::PICK_ORDER_STATUS3){
- return $this->error('自提订单状态异常');
- }
- $details = CloudStockAgentOrderDetails::find()
- ->where(['status' => StatusEnum::ENABLED, 'order_id' => $order->id, 'mall_id' => $order->mall_id])
- ->select('num, goods_id')
- ->asArray()
- ->all();
- if (empty($details)) {
- return $this->error('自提订单异常');
- }
- $t = \Yii::$app->db->beginTransaction();
- try{
- foreach ($details as $detail) {
- $params_add = [
- 'goods_id' => $detail['goods_id'],
- 'changes_dir' => CloudStockEnum::STOCK_CHANGE_ADD,
- 'user_id' => $order['user_id'],
- 'order_id' => $order['id'],
- 'order_type' => 0,
- 'changes_type' => CloudStockEnum::CHANGE_TYPE_PICKOFFLINE_RETURN,
- 'num' => $detail['num'],
- 'status' => StatusEnum::ENABLED,
- ];
- $res_save_log = CloudStockGoodsStockLog::setData($this->mall_id, $params_add);
- if (false === $res_save_log) {
- throw new \Exception(CloudStockGoodsStockLog::getStaticError());
- }
- $add_params = [
- 'user_id' => $order['user_id'],
- 'num' => $detail['num'],
- 'mall_id'=>$this->mall_id,
- 'goods_id' => $detail['goods_id'],
- 'order_id' => $order['id'],
- 'order_type' => 0,
- 'changes_type' => CloudStockEnum::CHANGE_TYPE_PICKOFFLINE_RETURN,
- 'stock_log_id' => $res_save_log->id,
- 'status' => StatusEnum::ENABLED,
- ];
- $res_add = CloudStockIncreaseDetail::setData($add_params);
- if (false === $res_add) {
- throw new \Exception(CloudStockIncreaseDetail::getStaticError());
- }
- $cloud_stock_agent_goods_model = CloudStockAgentGoods::findOne(['mall_id' => $order['mall_id'], 'user_id' => $order['user_id'], 'goods_id' => $detail['goods_id'], 'status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]]);
- if (!empty($cloud_stock_agent_goods_model)) {
- $cloud_stock_agent_goods_model->num += $detail['num'];
- $res = $cloud_stock_agent_goods_model->save();
- if ($res == false) throw new \Exception($cloud_stock_agent_goods_model->getErrorMessage());
- }
- $cloud_stock_agent_model = CloudStockAgent::findOne(['mall_id' => $order['mall_id'], 'user_id' => $order['user_id'], 'status' => StatusEnum::ENABLED]);
- if (!empty($cloud_stock_agent_model)) {
- $cloud_stock_agent_model->stock += $detail['num'];
- $res = $cloud_stock_agent_model->save();
- if ($res == false) throw new \Exception($cloud_stock_agent_model->getErrorMessage());
- }
- $order->send_status = CloudStockEnum::PICK_ORDER_STATUS4;
- if (!$order->save()){
- throw new \Exception($order->getErrorMessage());
- }
- }
- $t->commit();
- return $this->success('取消成功');
- }catch(\Exception $e){
- $t->rollBack();
- return $this->error($e->getMessage());
- }
- }
- /**
- * @name:
- * @msg: 订单支付成功页面
- */
- public function actionPaySuccess(){
- if (!\Yii::$app->request->isGet) {
- return $this->error('请求方式错误');
- }
- $params = \Yii::$app->request->get();
- $rules = [
- [['trade_id'], 'required'],
- [['trade_id'], 'integer'],
- ];
- $res = \Yii::$app->services->validate->validate($params, $rules);
- if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage());
- // 获取设置
- $configs = \Yii::$app->services->setting->addons->get($this->mall_id, AddonsEnum::ADDONS_NAME_CLOUD_STOCK, 'basic');
- $detail['is_enable_rand_fee'] = $configs['is_enable_rand_fee'] ?? 0;
- $order = CloudStockFillOrder::find()
- ->select('order_no,created_at,num,pay_money as order_money,goods_id')
- ->where(['trade_id'=>$params['trade_id']])
- ->asArray()
- ->one();
- if(empty($order)) return $detail;
- $payment = PaymentTrade::find()
- ->select('is_pay,pay_time,pay_fee,rand_fee')
- ->where(['id'=>$params['trade_id']])
- ->asArray()
- ->one();
- $goods = Goods::find()
- ->select('cover_pic,goods_name,price')
- ->where(['id'=>$order['goods_id']])
- ->asArray()
- ->one();
- $detail = array_merge($detail,$order,$payment,$goods);
- $detail['created_at'] = date("Y-m-d H:i:s",$detail['created_at']);
- $detail['pay_time'] = date("Y-m-d H:i:s",$detail['pay_time']);
- return $this->success('请求成功',$detail);
- }
- /**
- * 批量补货预览
- *
- * @return void
- */
- public function actionBatchFillPreview()
- {
- $baseParams = ['user_id' => $this->user_id, 'mall_id' => $this->mall_id, 'stock_agent' => $this->stock_agent];
- $fillOrderService = new CloudStockFillOrderService($baseParams);
- $cartList = (new CloudStockFillCartService($baseParams))->getCartList();
- if (empty($cartList)) {
- $this->error('购物车商品为空');
- return;
- }
- $this->success('success', $fillOrderService->preview($cartList));
- }
- /**
- * 批量补货
- *
- * @return void
- */
- public function actionBatchFill()
- {
- $baseParams = ['user_id' => $this->user_id, 'mall_id' => $this->mall_id, 'stock_agent' => $this->stock_agent];
- $cartList = (new CloudStockFillCartService($baseParams))->getCartList();
- if (empty($cartList)) {
- $this->error('购物车商品为空');
- return;
- }
- try {
- $fillOrderService = new CloudStockFillOrderService($baseParams);
- $this->success('success', $fillOrderService->batchFill($cartList));
- }catch (\Exception $e) {
- $this->error($e->getMessage());
- }
- }
- /**
- * 批量下单订单详情
- *
- * @return array|mixed|void|null
- */
- public function actionGetBatchFillOrderDetails()
- {
- $batchOrderId = \Yii::$app->request->get('batch_order_id', 0);
- if (empty($batchOrderId)) {
- $this->error('参数错误');
- return;
- }
- $fillOrderService = new CloudStockFillOrderService(['mall_id' => $this->mall_id, 'user_id' => $this->user_id]);
- $this->success('success', $fillOrderService->getBatchFillOrderDetails($batchOrderId));
- }
- /**
- * 修改备注
- *
- * @return void
- */
- public function actionEditRemark()
- {
- $params = \Yii::$app->request->post();
- $rules = [
- [['id', 'remark'], 'required'],
- [['id'], 'integer'],
- [['remark'], 'string', 'max' => 255],
- ];
- $res = \Yii::$app->services->validate->validate($params, $rules);
- if ($res === false) {
- return $this->error(\Yii::$app->services->validate->getErrorMessage());
- }
- $service = new CloudStockAgentOrderService(['mall_id' => $this->mall_id]);
- if (
- !$service->modifyRemark(
- $params['id'],
- $params['remark'],
- false,
- function ($order) {
- if (!in_array($order['send_status'] ?? null, [CloudStockEnum::PICK_ORDER_STATUS0, CloudStockEnum::PICK_ORDER_STATUS3])) {
- throw new \RuntimeException('订单状态不允许修改备注');
- }
- if ($order['user_id'] != $this->user_id) {
- throw new \RuntimeException('订单不存在');
- }
- }
- )
- ) {
- $this->error($service->getError());
- return;
- }
- $this->success();
- }
- /**
- * 修改收货地址
- *
- * @return void
- */
- public function actionModifyAddress()
- {
- $params = \Yii::$app->request->post();
- $rules = [
- [['id', 'address_id'], 'required'],
- [['id', 'address_id'], 'integer'],
- ];
- $res = \Yii::$app->services->validate->validate($params, $rules);
- if ($res === false) {
- return $this->error(\Yii::$app->services->validate->getErrorMessage());
- }
- $service = new CloudStockAgentOrderService(['mall_id' => $this->mall_id, 'user_id' => $this->user_id]);
- if (!$service->modifyAddress(['id' => $params['id'], 'address_id' => $params['address_id']])) {
- $this->error($service->getError());
- return;
- }
- $this->success();
- }
- /**
- * 订单详情
- *
- * @return void
- */
- public function actionGetOrderDetail()
- {
- $params = \Yii::$app->request->get();
- $rules = [
- [['id'], 'required'],
- [['id'], 'integer'],
- ];
- $res = \Yii::$app->services->validate->validate($params, $rules);
- if ($res === false) {
- $this->error(\Yii::$app->services->validate->getErrorMessage());
- return;
- }
- $service = new CloudStockAgentOrderService(['mall_id' => $this->mall_id, 'user_id' => $this->user_id]);
- $this->success('success', $service->getOrderDetail($params['id']));
- }
- }
|