| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876 |
- <?php
- namespace addons\CloudStock\common\services;
- use addons\CloudStock\common\enums\CloudStockEnum;
- use addons\CloudStock\common\events\order\FillOrderPaidEvent;
- use addons\CloudStock\common\events\order\PriceDifferenceOrderPaidEvent;
- use addons\CloudStock\common\models\CloudStockAgent;
- use addons\CloudStock\common\models\CloudStockAgentOrder;
- use addons\CloudStock\common\models\CloudStockBuyingOrder;
- use addons\CloudStock\common\models\CloudStockDeductionDetail;
- use addons\CloudStock\common\models\CloudStockFillOrder;
- use addons\CloudStock\common\models\CloudStockFillOrderRelation;
- use addons\CloudStock\common\models\CloudStockGoods;
- use addons\CloudStock\common\models\CloudStockPriceDifferenceGiftPackage;
- use addons\CloudStock\common\models\CloudStockPriceDifferenceOrder;
- use addons\CloudStock\common\models\CloudStockPriceDifferenceOrderDetail;
- use addons\FireProtection\common\enums\FireProtectionEnum;
- use common\components\export\CsvTool;
- use common\enums\AppEnum;
- use common\enums\DownloadEnum;
- use common\enums\OrderStatusEnum;
- use common\enums\PayTypeEnum;
- use common\enums\PreviewTypeEnum;
- use common\enums\StatusEnum;
- use common\helpers\StringHelper;
- use common\logic\order\marketing\BaseMarketing;
- use common\logic\order\marketing\FreeShippingMarketing;
- use common\logic\order\OrderFormLogic;
- use common\logic\order\OrderInitDataLogic;
- use common\models\common\Download;
- use common\models\common\PaymentTrade;
- use common\models\goods\Goods;
- use common\models\order\Order;
- use common\models\user\User;
- use common\models\user\UserAddress;
- use common\models\user\UserPartitionRelationship;
- use Exception;
- use services\common\UserWalletService;
- use Yii;
- use function Clue\StreamFilter\fun;
- class CloudStockPriceDifferenceGiftPackageOrderService extends BaseService
- {
- public static $expire_time = 7 * 24 * 3600;//购物车内商品的有效期
- public static $key = 'cloud_stock_price_difference_gift_package_cart_';//购物车hash key
- public static $field = '';//字段
- public static $self_pickup = 'self_pickup';//字段
- public static $cloud_warehouse = 'cloud_warehouse';//字段
- public function getExportFields()
- {
- $fields = [
- 'user_id' => '用户ID',
- 'nickname' => '用户昵称',
- 'created_at' => '订单创建时间',
- 'order_no' => '订单编号',
- 'goods_name' => '商品名称',
- 'goods_price' => '价格',
- 'total_num' => '总数',
- 'self_pickup_num' => '自提',
- 'cloud_warehouse_num' => '云仓',
- 'pay_money' => '实际支付金额(元)',
- 'shipping_money' => '运费',
- 'from_user' => '补货上级',
- 'receiver_name' => '收货人',
- 'receiver_mobile' => '收货人手机号',
- 'address' => '收货地址',
- 'rand_fee' => '随机减金额(元)',
- 'payment_type' => '支付方式',
- ];
- return $fields;
- }
- public function index($params)
- {
- $params['where'] = $this->getQueryWhere($params);
- $params['order'] = 'id desc';
- $params['select'] = 'id,user_id,trade_id,address_id,pay_money,shipping_money,payment_type,created_at,address,receiver_name,receiver_mobile,order_no';
- $params['with'] = [
- 'detail' => function ($q) {
- $q->select('id,price_difference_order_id,self_pickup_num,cloud_warehouse_num,goods_price');
- },
- 'fillOrder' => function ($q) {
- $q->select('id,price_difference_order_id,price_difference_order_detail_id,order_no,goods_id')
- ->with(['goods' => function ($g) {
- $g->select('id,goods_name,cover_pic');
- }]);
- },
- 'user' => function ($q) {
- $q->select('id,nickname');
- },
- 'paymentTrade' => function ($q) {
- $q->select('id,rand_fee');
- }
- ];
- $pageData = CloudStockPriceDifferenceOrder::listPage($params, false);
- if (!empty($pageData['list'])) {
- $deduction_user_id_arr = [];
- $deduction_user_list = $this->getDeductionUserList($pageData, $deduction_user_id_arr);
- foreach ($pageData['list'] as &$item) {
- $item['rand_fee'] = $item['paymentTrade']['rand_fee'] ?? 0;
- $detail_list = array_column($item['detail'], null, 'id');
- foreach ($item['fillOrder'] as &$val) {
- $val['from_user'] = [];
- $val['self_pickup_num'] = $val['cloud_warehouse_num'] = $val['goods_price'] = 0;
- if (isset($detail_list[$val['price_difference_order_detail_id']])) {
- $val['self_pickup_num'] = $detail_list[$val['price_difference_order_detail_id']]['self_pickup_num'];
- $val['cloud_warehouse_num'] = $detail_list[$val['price_difference_order_detail_id']]['cloud_warehouse_num'];
- $val['goods_price'] = $detail_list[$val['price_difference_order_detail_id']]['goods_price'];
- }
- if (!isset($deduction_user_id_arr[$val['id']])) {
- continue;
- }
- foreach ($deduction_user_id_arr[$val['id']] as $uid) {
- if (!isset($deduction_user_list[$uid])) {
- continue;
- }
- $val['from_user'][] = [
- 'id' => $uid,
- 'nickname' => $deduction_user_list[$uid]['nickname'],
- 'mobile' => $deduction_user_list[$uid]['mobile'],
- 'avatar_url' => $deduction_user_list[$uid]['avatar_url'],
- ];
- }
- }
- unset($item['detail']);
- unset($item['paymentTrade']);
- }
- }
- $pageData['export_list'] = $this->getExportFields();
- $pageData['payment_type_list'] = PayTypeEnum::getMap();
- return $pageData;
- }
- public function getQueryWhere($params)
- {
- $where = [
- ['mall_id' => $this->mall_id],
- ['status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]],
- ['is_pay' => OrderStatusEnum::PAY],
- ];
- if (!empty($params['keyword'])) {
- $keyword = trim($params['keyword']);
- $user_id_arr = User::find()->where(['or',
- ['id' => $keyword],
- ['like', 'nickname', $keyword],
- ['like', 'mobile', $keyword]])
- ->select('id')->column();
- $where[] = ['user_id' => $user_id_arr];
- }
- if (!empty($params['goods_name'])) {
- $goods_name = trim($params['goods_name']);
- $goods_ids = Goods::find()->where(['and',
- ['mall_id' => $this->mall_id],
- ['like', 'goods_name', $goods_name]])
- ->select('id')->column();
- $price_difference_order_ids = CloudStockPriceDifferenceOrderDetail::find()->where(['goods_id' => $goods_ids])->select('price_difference_order_id')->column();
- $where[] = ['id' => $price_difference_order_ids];
- }
- if (!empty($params['start'])) {
- $where[] = ['>=', 'created_at', strtotime($params['start'])];
- }
- if (!empty($params['end'])) {
- $where[] = ['<=', 'created_at', strtotime($params['end'])];
- }
- if (!empty($params['payment_type'])) {
- $where[] = ['payment_type' => $params['payment_type']];
- }
- if (!empty($params['order_no'])) {
- $order_no = trim($params['order_no']);
- $price_difference_order_id = CloudStockFillOrder::find()->where(['and',
- ['mall_id' => $this->mall_id],
- ['like', 'order_no', $order_no]])
- ->select('price_difference_order_id')->column();
- $where[] = ['id' => $price_difference_order_id];
- }
- return $where;
- }
- public function getDeductionUserList($pageData, &$deduction_user_id_arr)
- {
- $fill_order_id_arr = [];
- foreach ($pageData['list'] as $item) {
- $item['rand_fee'] = $item['paymentTrade']['rand_fee'] ?? 0;
- foreach ($item['fillOrder'] as $val) {
- $fill_order_id_arr[] = $val['id'];
- }
- }
- $deduction_list = CloudStockDeductionDetail::lists([
- 'where' => [
- ['order_id' => $fill_order_id_arr],
- ['order_type' => CloudStockEnum::STOCK_ORDER_TYPE_REPLENISH],
- ['changes_type' => [CloudStockEnum::STOCK_CHANGE_TYPE200, CloudStockEnum::STOCK_CHANGE_TYPE202,]],
- ],
- 'select' => 'user_id,order_id',
- ]
- );
- $deduction_user_ids = array_column($deduction_list, 'user_id');
- foreach ($deduction_list as $val) {
- $deduction_user_id_arr[$val['order_id']][] = $val['user_id'];
- }
- $deduction_user_list = User::lists([
- 'where' => [
- ['id' => $deduction_user_ids]
- ],
- 'index' => 'id',
- 'select' => 'id,nickname,mobile,avatar_url',
- ]
- );
- $deduction_user_list[0] = ['id' => 0,
- 'nickname' => '平台',
- 'mobile' => '',
- 'avatar_url' => '',
- ];
- return $deduction_user_list;
- }
- public function addCart($params)
- {
- //传入的插件名和识别value
- $key = $this->getCacheKey($params['price_difference_gift_package_id']);
- $field = $this->getCacheField($params['type'], $params['goods_id']);
- if (empty($params['num'])) {
- $res = \Yii::$app->redis->hdel($key, $field);
- return true;
- }
- \Yii::$app->redis->hset($key, $field, json_encode($params));
- \Yii::$app->redis->expire($key, self::$expire_time);
- return true;
- }
- public function delCart($params)
- {
- //传入的插件名和识别value
- foreach ($params['goods_id'] as $goods_id) {
- $key = $this->getCacheKey($params['price_difference_gift_package_id']);
- $field = $this->getCacheField(self::$self_pickup, $goods_id);
- \Yii::$app->redis->hdel($key, $field);
- $field = $this->getCacheField(self::$cloud_warehouse, $goods_id);
- \Yii::$app->redis->hdel($key, $field);
- }
- return true;
- }
- public function indexCart($params)
- {
- $cart_list = $this->getCartAll($params['price_difference_gift_package_id']);
- $goods_ids = array_keys($cart_list);
- $main_goods_list = Goods::lists(['where' => [['id' => $goods_ids]], 'index' => 'id', 'select' => 'id,goods_name,cover_pic,price']);
- $list = [];
- $package = CloudStockPriceDifferenceGiftPackage::findOne(['id' => $params['price_difference_gift_package_id']]);
- $goods_ids = explode(',', $package['goods_id']);
- $obj = new CloudStockPriceDifferenceGiftPackageService(['user_id' => $this->user_id, 'mall_id' => $this->mall_id]);
- foreach ($main_goods_list as $item) {
- if (!in_array($item['id'], $goods_ids)) {
- continue;
- }
- $price = $item['price'];
- $obj->getPrice($item['id'], $goods_ids, $price, $package['level']);
- $list[] = [
- 'goods_id' => $item['id'],
- 'goods_name' => $item['goods_name'],
- 'price' => $price,
- 'cover_pic' => $item['cover_pic'],
- 'self_pickup_num' => $cart_list[$item['id']]['self_pickup'] ?? 0,
- 'cloud_warehouse_num' => $cart_list[$item['id']]['cloud_warehouse'] ?? 0,
- ];
- }
- return ['list' => $list];
- }
- public function getCacheKey($price_difference_gift_package_id)
- {
- return self::$key . ':' . $this->user_id . ':' . $price_difference_gift_package_id;
- }
- public function getCacheField($type, $goods_id)
- {
- return self::$field . $type . ':' . $goods_id;
- }
- public function orderPreview($params)
- {
- try {
- //传入的插件名和识别value
- $cart_list = $this->getCartAll($params['price_difference_gift_package_id']);
- if (empty($params['goods_ids'])) {
- throw new \Exception('请选择商品');
- }
- if (empty($cart_list)) {
- throw new \Exception('购物车为空');
- }
- $package = CloudStockPriceDifferenceGiftPackage::find()->where(['id' => $params['price_difference_gift_package_id']])->one();//所选的价差礼包
- if (empty($package)) {
- throw new \Exception('价差礼包不存在');
- }
- $cloud_stock_agent_level = 0;
- $cloud_stock_agent = CloudStockAgent::findOne(['mall_id' => $this->mall_id, 'user_id' => $this->user_id, 'status' => StatusEnum::ENABLED]);
- $goods_ids = array_keys($cart_list);
- $goods_ids = array_intersect($goods_ids, $params['goods_ids']);
- $main_goods_list = Goods::lists(['where' => [['id' => $goods_ids]], 'with' => ['attr'], 'index' => 'id', 'select' => 'id,goods_name,cover_pic,price']);
- if (!empty($cloud_stock_agent)) {
- $cloud_stock_agent_level = $cloud_stock_agent['level'];
- }
- $list = [];
- $is_show_address = 0;
- $pay_money = 0;
- $freight_attr = [];
- $obj = new CloudStockPriceDifferenceGiftPackageService(['user_id' => $this->user_id, 'mall_id' => $this->mall_id]);
- foreach ($main_goods_list as $item) {
- $price = $item['price'];
- $obj->getPrice($item['id'], $goods_ids, $price, $package['level']);
- $self_pickup_num = $cloud_warehouse_num = 0;
- if (isset($cart_list[$item['id']])) {
- $self_pickup_num = $cart_list[$item['id']][self::$self_pickup];
- $cloud_warehouse_num = $cart_list[$item['id']][self::$cloud_warehouse];
- }
- if ($self_pickup_num > 0) {
- $is_show_address = 1;
- $freight_attr[] = [
- 'attr_id' => $item['attr'][0]['id'],
- 'num' => $self_pickup_num,
- ];
- }
- $list[] = [
- 'goods_id' => $item['id'],
- 'goods_name' => $item['goods_name'],
- 'price' => $price,
- 'cover_pic' => $item['cover_pic'],
- 'self_pickup_num' => $self_pickup_num,
- 'cloud_warehouse_num' => $cloud_warehouse_num,
- ];
- $pay_money += $price * ($self_pickup_num + $cloud_warehouse_num);
- }
- $this->check($cloud_stock_agent_level, $package, $pay_money);
- $shipping_fee = 0;
- $address_info = [];
- if (!empty($freight_attr)) {
- $form = $this->getShippingFee($params, $freight_attr);//获取运费
- $shipping_fee = $form['marketing']['deduct']['shipping_fee']['money'] ?? 0;
- $address_info = UserAddress::getUserAddress($this->user_id, $params['address_id'] ?? 0);
- }
- return ['list' => $list, 'address_info' => $address_info, 'is_show_address' => $is_show_address, 'shipping_fee' => $shipping_fee, 'pay_money' => bcadd($pay_money, $shipping_fee, 2)];
- } catch (Exception $e) {
- throw new Exception($e->getMessage());
- }
- }
- /**
- * 获取价差
- * 购买时判断当前等级礼包与所选购礼包的金额价差,满足则可下单成功升级
- * ②若当前等级无设置礼包则往上找最近有设置礼包的等级取差价
- * ④若是普通用户不是代理商等级则取选购的礼包金额
- * @param $level
- * @param $package_price
- * @return string
- */
- public function priceDiff($level, $package_price)
- {
- $price_diff = $package_price;
- if ($level == 0) {
- return $price_diff;
- }
- $package_current = CloudStockPriceDifferenceGiftPackage::find()->where([
- 'mall_id' => $this->mall_id,
- 'status' => StatusEnum::ENABLED,
- ])->andWhere(['>=', 'level', $level])->orderBy('level asc')->one();
- if (!empty($package_current)) {
- $price_diff = bcsub($price_diff, $package_current['price'], 2);
- }
- return $price_diff;
- }
- public function orderCreate($params)
- {
- $t = Yii::$app->db->beginTransaction();
- try {
- //传入的插件名和识别value
- if (empty($params['goods_ids'])) {
- throw new \Exception('请选择商品');
- }
- $cart_list = $this->getCartAll($params['price_difference_gift_package_id']);
- if (empty($cart_list)) {
- throw new \Exception('购物车为空');
- }
- $package = CloudStockPriceDifferenceGiftPackage::find()->where(['id' => $params['price_difference_gift_package_id']])->one();
- if (empty($package)) {
- throw new \Exception('礼包不存在');
- }
- $cloud_stock_agent = CloudStockAgent::findOne(['mall_id' => $this->mall_id, 'user_id' => $this->user_id, 'status' => StatusEnum::ENABLED]);
- $goods_ids = array_keys($cart_list);
- $goods_ids = array_intersect($goods_ids, $params['goods_ids']);
- $main_goods_list = Goods::lists(['where' => [['id' => $goods_ids]], 'with' => ['attr'], 'index' => 'id', 'select' => 'id,goods_name,cover_pic,price']);
- $obj = new CloudStockPriceDifferenceGiftPackageService(['user_id' => $this->user_id, 'mall_id' => $this->mall_id]);
- $list = [];
- $pay_money = 0;
- $freight_attr = [];
- foreach ($main_goods_list as $item) {
- $price = $item['price'];
- $self_pickup_num = $cloud_warehouse_num = 0;
- $obj->getPrice($item['id'], $goods_ids, $price, $package['level']);
- if (isset($cart_list[$item['id']])) {
- $self_pickup_num = $cart_list[$item['id']][self::$self_pickup] ?? 0;
- $cloud_warehouse_num = $cart_list[$item['id']][self::$cloud_warehouse] ?? 0;
- }
- if ($self_pickup_num > 0) {
- $freight_attr[] = [
- 'attr_id' => $item['attr'][0]['id'],
- 'num' => $self_pickup_num,
- ];
- }
- $goods_price = $price * ($self_pickup_num + $cloud_warehouse_num);
- $list[] = [
- 'goods_id' => $item['id'],
- 'goods_name' => $item['goods_name'],
- 'price' => $price,
- 'goods_price' => $goods_price,
- 'cover_pic' => $item['cover_pic'],
- 'self_pickup_num' => $self_pickup_num,
- 'cloud_warehouse_num' => $cloud_warehouse_num,
- ];
- $pay_money += $goods_price;
- }
- $cloud_stock_agent_level = 0;
- if (!empty($cloud_stock_agent)) {
- $cloud_stock_agent_level = $cloud_stock_agent['level'];
- }
- $this->check($cloud_stock_agent_level, $package, $pay_money);
- if (!empty($params['address_id'])) {
- $user_address = UserAddress::findOne(['id' => $params['address_id'], 'user_id' => $this->user_id]);
- if (empty($user_address)) {
- throw new \Exception('地址不存在');
- }
- $params['address'] = $user_address['province'] . $user_address['city'] . $user_address['district'] . $user_address['town'] . $user_address['detail'];
- }
- $shipping_money = 0;
- if (!empty($freight_attr)) {
- $form = $this->getShippingFee($params, $freight_attr);//获取运费
- $shipping_money = $form['marketing']['deduct']['shipping_fee']['money'] ?? 0;
- }
- $pay_money = bcadd($pay_money, $shipping_money, 2);
- if ($pay_money == 0) {
- throw new \Exception('订单金额不能为0');
- }
- $params['shipping_money'] = $shipping_money;
- $params['pay_money'] = $pay_money;
- if (empty($params['address_id'])) {
- $params['address_id'] = 0;
- }
- if (empty($params['remark'])) {
- $params['remark'] = '';
- } else {
- $params['remark'] = (string)$params['remark'];
- }
- $params['receiver_mobile'] = (string)$params['receiver_mobile'];
- $order = $this->createOrder($params);
- $goods_name = '';
- foreach ($list as $k => $item) {
- if ($k == 0) {
- $goods_name = $item['goods_name'];
- }
- $add['price_difference_order_id'] = $order['id'];
- $add['goods_id'] = $item['goods_id'];
- $add['goods_price'] = $item['goods_price'];
- $add['self_pickup_num'] = $item['self_pickup_num'];
- $add['cloud_warehouse_num'] = $item['cloud_warehouse_num'];
- $this->createOrderDetail($add);
- }
- $order_trade_info[] = [
- 'order_id' => $order->id,
- 'order_type' => 'price_diff_order',
- 'order_no' => $order->order_no,
- 'amount' => $pay_money,
- 'title' => $goods_name,
- 'notify_class' => 'addons\CloudStock\common\logic\notify\CloudStockPriceDifferenceGiftPackageNotify',
- ];
- $res = \Yii::$app->services->pay->createTrade($this->mall_id, $this->user_id, $order_trade_info);
- if ($res == false) throw new \Exception('生成支付流水失败');
- $arr['transaction'] = $res;
- $t->commit();
- return $arr;
- } catch (Exception $e) {
- $t->rollBack();
- throw new \Exception($e->getMessage());
- }
- }
- public function getCartAll($price_difference_gift_package_id)
- {
- $key = $this->getCacheKey($price_difference_gift_package_id);
- $data = \Yii::$app->redis->hgetall($key);
- $list = [];
- foreach ($data as $item) {
- $item = json_decode($item, true);
- if (is_array($item)) {
- $list[$item['goods_id']][$item['type']] = $item['num'];
- }
- }
- return $list;
- }
- public function getCloudStockGoodsList($goods_ids)
- {
- $cloud_stock_goods_list = CloudStockGoods::lists([
- 'where' => [
- ['goods_id' => $goods_ids],
- ['status' => StatusEnum::ENABLED]
- ],
- 'index' => 'goods_id',
- 'select' => 'goods_id,agent_price'
- ]);
- foreach ($cloud_stock_goods_list as &$val) {
- $agent_price = json_decode($val['agent_price'], true);
- $val['agent_price'] = array_column($agent_price, null, 'level');
- }
- return $cloud_stock_goods_list;
- }
- public function check($cloud_stock_agent_level, $package, $pay_money)
- {
- $price_diff = $this->priceDiff($cloud_stock_agent_level, $package['price']);
- if ($pay_money < $price_diff) {
- throw new Exception('支付金额不能小于' . $price_diff);
- }
- }
- /**
- * 获取运费
- * @param $params
- * @param $freight_attr
- * @return bool|int|object
- * @throws \Exception
- */
- public function getShippingFee($params, $freight_attr)
- {
- if (empty($params['address_id'])) {
- return 0;
- }
- $orderFormLogic = new OrderFormLogic();
- $form = $orderFormLogic->getDefaultform($this->mall_id, $this->user_id);
- $form->attributes = [
- 'type' => PreviewTypeEnum::FREIGHT,
- 'data' => [
- 'shipping_type' => \common\enums\ShippingTypeEnum::LOGISTICS,
- 'freight_attr' => $freight_attr,
- 'address_id' => $params['address_id']
- ]
- ];
- $form['action'] = AppEnum::ACTION_CREATE;
- $orderInitDataLogic = new OrderInitDataLogic();
- $form = $orderInitDataLogic->execute($form, $form->type);
- if (empty($form['group_order_goods'])) {
- throw new \Exception('没有商品');
- }
- $group_order_goods = $form['group_order_goods'];
- $extra = [];
- foreach ($group_order_goods as &$item) {
- /** @var BaseMarketing $class */
- $item = FreeShippingMarketing::compute($item, $form, $extra);
- if ($item === false) throw new \Exception(FreeShippingMarketing::getStaticError());
- }
- return $form;
- }
- public function createOrder($params)
- {
- $params['user_id'] = $this->user_id;
- $params['mall_id'] = $this->mall_id;
- $model = new CloudStockPriceDifferenceOrder();
- $model->loadDefaultValues();
- $model->load($params, '');
- $model->is_pay = OrderStatusEnum::NOT_PAY;
- $model->order_no = StringHelper::generateOrderNo('pdgp');
- $res = $model->save();
- if ($res == false) {
- throw new \Exception($model->getErrorMessage());
- }
- return $model;
- }
- public function createOrderDetail($params)
- {
- $params['user_id'] = $this->user_id;
- $params['mall_id'] = $this->mall_id;
- $model = new CloudStockPriceDifferenceOrderDetail();
- $model->loadDefaultValues();
- $model->load($params, '');
- $model->save();
- return $model;
- }
- public function pay($order_no, $payment_type, $out_trade_no = '')
- {
- try {
- $model = CloudStockPriceDifferenceOrder::findOne(['order_no' => $order_no]);
- if (empty($model)) throw new \Exception('订单不存在或已删除');
- if ($model->is_pay != OrderStatusEnum::NOT_PAY) throw new Exception('订单已经被处理,无法进行支付');
- if ($model->is_pay == StatusEnum::ENABLED) throw new Exception('订单已支付,请不要重复支付');
- $model->is_pay = OrderStatusEnum::PAY;
- $model->payment_type = $payment_type;
- $model->pay_time = time();
- $model->trade_no = $out_trade_no ?? '';
- $res = $model->save();
- if ($res === false) throw new Exception('修改订单失败:' . $model->getErrorMessage());
- $event = new PriceDifferenceOrderPaidEvent($model['mall_id']);
- $order['id'] = $model['id'];
- Yii::$app->services->events->dispatch($event, $order, $event->listeners);
- return $model;
- } catch (Exception $e) {
- if (isset($trans)) $trans->rollback();
- self::$static_error = $e->getMessage();
- return false;
- }
- }
- public function createFillOrder($data)
- {
- $order_no = StringHelper::generateOrderNo('CSF');
- $params = [
- 'user_id' => $data['user_id'],
- 'trade_id' => $data['trade_id'],
- 'pay_money' => $data['goods_price'],
- 'order_no' => $order_no,
- 'trade_no' => $data['trade_no'],
- 'is_pay' => CloudStockEnum::FILL_STATUS_PAY,
- 'goods_id' => $data['goods_id'],
- 'price_difference_order_id' => $data['price_difference_order_id'],
- 'price_difference_order_detail_id' => $data['price_difference_order_detail_id'],
- 'num' => $data['self_pickup_num'] + $data['cloud_warehouse_num'],
- ];
- $res_fill_order = CloudStockFillOrder::setData($data['mall_id'], $params);
- // 触发云库存订单支付事件
- $event = new FillOrderPaidEvent($data['mall_id']);
- $data = ['id' => $res_fill_order['id']];
- \Yii::$app->services->events->dispatch($event, $data, $event->listeners);
- return $res_fill_order;
- }
- public function createOrderPick($data)
- {
- $data['order_type'] = 2;
- $res = CloudStockAgentOrder::pickOffline($data['mall_id'], $data);
- if (false === $res) {
- throw new \Exception('提货失败:' . CloudStockAgentOrder::getStaticError());
- }
- }
- /**
- * @param $fill_order
- * @param $package
- * @return array|true
- * @throws Exception推荐奖励
- */
- public function recommendReward($fill_order, $package)
- {
- if (empty($package)) {
- return [];
- }
- $recommend_reward_setting = json_decode($package['recommend_reward'], true);
- if (empty($recommend_reward_setting)) {
- return [];
- }
- $recommend_reward_setting = array_column($recommend_reward_setting, null, 'level');
- $user_id = $fill_order['user_id'];
- $mall_id = $fill_order['mall_id'];
- $parent_id_arr = UserPartitionRelationship::getParentIdArr($user_id);
- $parent_id_arr = array_reverse($parent_id_arr);
- $where = ['user_id' => $parent_id_arr, 'mall_id' => $mall_id, 'status' => StatusEnum::ENABLED];
- $cloud_agent_list = CloudStockAgent::find()->where($where)->indexBy('user_id')->all();
- $agent_list = [];
- foreach ($parent_id_arr as $parent_id) {
- if (!empty($cloud_agent_list[$parent_id])) $agent_list[] = $cloud_agent_list[$parent_id];//按照关系排序
- }
- $log_total_price = 0;
- $insert_wallet = [];
- $new_agent_list = [];
- $current_agent_level = 0;
- foreach ($agent_list as $key => $agent) {
- if ($agent['level'] > $current_agent_level) {
- $new_agent_list[$key] = $agent;
- $current_agent_level = $agent['level'];
- }
- }
- $is_range = 1;//走极差
- if (isset($package['is_range']) && $package['is_range'] == 0) {
- $is_range = 0; //不走极差,只给最近代理发放奖励
- }
- if ($is_range == 0) {
- $new_agent_list = $agent_list;
- }
- foreach ($new_agent_list as $k => $agent) {
- if ($is_range == 0 && $k > 0) {
- break;
- }
- if (!isset($recommend_reward_setting[$agent['level']])) {
- continue;
- }
- $recommend_reward = $recommend_reward_setting[$agent['level']]['reward_fee'] * $fill_order['pay_money'] / 100;
- if ($recommend_reward > 0) {
- $recommend_reward -= $log_total_price;
- }
- $log_total_price += $recommend_reward;
- $this->packData($mall_id, $fill_order['id'], $fill_order['order_no'], $agent['user_id'], $fill_order['user_id'], $recommend_reward, $fill_order['pay_money'], $insert_wallet);
- }
- return $insert_wallet;
- }
- public function packData($mall_id, $order_id, $order_no, $user_id, $buy_user_id, $price, $pay_money, &$insert_wallet)
- {
- if ($price > 0) {
- $prize_name = '推荐奖励';
- $desc = '用户(' . $user_id . '),获得订单(' . $order_no . ')收入,类型:' . $prize_name . ',金额:' . $price;
- $insert_wallet [] = ['mall_id' => $mall_id, 'user_id' => $user_id,
- 'is_frozen' => false,
- 'wallet_type' => 'commission',
- 'money' => $price,
- 'desc' => $desc,
- 'source_table' => CloudStockFillOrder::tableName(),
- 'source_table_id' => $order_id,
- 'from_type' => 'CloudStock',
- 'capital_type' => 'recommend_reward',
- 'order_no' => $order_no,
- 'contributor_name' => '',
- 'contributor_id' => $buy_user_id,
- 'contributor_money' => $pay_money,
- ];
- }
- }
- public function export(array $data)
- {
- $download_id = $data['download_id'] ?? 0;
- $download = Download::findOne(['id' => $download_id]);
- if ($download) {
- $this->mall_id = $data['mall_id'] ?? $download->mall_id;
- try {
- $params = json_decode($download->params, true);
- $filename = $download->name;
- $type = $download->type;
- $params['where'] = $this->getQueryWhere($params);
- $params['order'] = 'id desc';
- $params['select'] = 'id,user_id,trade_id,address_id,pay_money,shipping_money,payment_type,created_at,address,receiver_name,receiver_mobile';
- $params['with'] = [
- 'detail' => function ($q) {
- $q->select('id,price_difference_order_id,self_pickup_num,cloud_warehouse_num,goods_price');
- },
- 'fillOrder' => function ($q) {
- $q->select('id,price_difference_order_id,price_difference_order_detail_id,order_no,goods_id')
- ->with(['goods' => function ($g) {
- $g->select('id,goods_name,cover_pic');
- }]);
- },
- 'user' => function ($q) {
- $q->select('id,nickname');
- },
- 'paymentTrade' => function ($q) {
- $q->select('id,rand_fee');
- }
- ];
- $list = CloudStockPriceDifferenceOrder::lists($params, true);
- $payment_type_list = PayTypeEnum::getMap();
- $deduction_user_id_arr = [];
- $deduction_user_list = $this->getDeductionUserList(['list' => $list], $deduction_user_id_arr);
- $fields = $params['fields'];
- $fields_arr = $this->getExportFields();
- $have_select_field_arr = [];
- foreach ($fields as $value) {
- if (isset($fields_arr[$value])) $have_select_field_arr[] = $fields_arr[$value];
- }
- $csv = new CsvTool();
- $csv->filename = $filename;
- $csv->file_dirname = DownloadEnum::getTypeStorageDirMap($type);
- $csv->export_mode = CsvTool::EXPORT_MODE_ASYNC;
- $csv->header = $have_select_field_arr;
- $rows = [];
- foreach ($list as $order) {
- $detail_list = array_column($order['detail'], null, 'id');
- foreach ($order['fillOrder'] as $item) {
- $row = [];
- foreach ($fields as $field) {
- switch (true) {
- case ($field == 'nickname'):
- $row[] = $order['user'][$field] ?? '';
- break;
- case ($field == 'created_at'):
- $row[] = !empty($order[$field]) ? date('Y-m-d H:i:s', $order[$field]) : '';
- break;
- case ($field == 'order_no'):
- $row[] = $item[$field] ?? '';
- break;
- case ($field == 'rand_fee'):
- $row[] = $order['paymentTrade'][$field] ?? '';
- break;
- case ($field == 'goods_name'):
- $row[] = $item['goods']['goods_name'] ?? '';
- break;
- case ($field == 'goods_price'):
- $row[] = $detail_list[$item['price_difference_order_detail_id']]['goods_price'] ?? '';
- break;
- case ($field == 'total_num'):
- $self_pickup_num = $detail_list[$item['price_difference_order_detail_id']]['self_pickup_num'] ?? '';
- $cloud_warehouse_num = $detail_list[$item['price_difference_order_detail_id']]['cloud_warehouse_num'] ?? 0;
- $total_num = $self_pickup_num + $cloud_warehouse_num;
- $row[] = !empty($total_num) ? $total_num : '';
- break;
- case ($field == 'self_pickup_num'):
- $row[] = $detail_list[$item['price_difference_order_detail_id']]['self_pickup_num'] ?? '';
- break;
- case ($field == 'cloud_warehouse_num'):
- $row[] = $detail_list[$item['price_difference_order_detail_id']]['cloud_warehouse_num'] ?? '';
- break;
- case (in_array($field, ['user_id', 'shipping_money', 'pay_money', 'receiver_name', 'receiver_mobile', 'address'])):
- $row[] = $order[$field] ?? '';
- break;
- case ($field == 'payment_type'):
- $row[] = $payment_type_list[$order[$field]] ?? '';
- break;
- case ($field == 'from_user'):
- // 得到补货上级
- $fromUser = [];
- if (isset($deduction_user_id_arr[$item['id']])) {
- $deductionUserIds = array_unique($deduction_user_id_arr[$item['id']]);
- foreach ($deductionUserIds as $uid) {
- if (!isset($deduction_user_list[$uid])) {
- continue;
- }
- $fromUser[] = sprintf(
- '补货用户ID:"%s" 补货用户昵称:"%s"',
- $uid,
- $deduction_user_list[$uid]['nickname']
- );
- }
- }
- $row[] = implode(' ,', $fromUser);
- break;
- }
- }
- $rows[] = $row;
- }
- }
- $csv->data = $rows;
- $csv->export();
- $csv->updateDown($download, $params['mall_id']);
- } catch (\Exception $e) {
- $download->status = 3;
- $res = $download->save();
- var_dump($e->getMessage() . $e->getFile() . $e->getLine());
- self::setStaticError($e->getMessage());
- return $e->getMessage();
- }
- }
- }
- public function exportOrder(array $data)
- {
- $this->export($data);
- }
- }
|