| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570 |
- <?php
- /**
- * Created by PhpStorm.
- * Author: 芸众商城 www.yunzshop.com
- * Date: 2017/3/4
- * Time: 上午9:09
- */
- namespace app\backend\modules\order\controllers;
- use app\backend\modules\goods\models\GoodsOption;
- use app\backend\modules\member\models\MemberParent;
- use app\backend\modules\order\models\Order;
- use app\backend\modules\order\models\OrderGoods;
- use app\backend\modules\order\models\OrderJoinOrderGoods;
- use app\common\components\BaseController;
- use app\common\helpers\PaginationHelper;
- use app\common\services\ExportService;
- use app\common\services\member\level\LevelUpgradeService;
- use app\common\services\OrderExportService;
- use Illuminate\Support\Facades\DB;
- use Yunshop\Diyform\models\DiyformDataModel;
- use Yunshop\Diyform\models\DiyformOrderContentModel;
- use Yunshop\Diyform\models\DiyformTypeModel;
- use Yunshop\Diyform\models\OrderGoodsDiyForm;
- use Yunshop\TeamDividend\models\TeamDividendLevelModel;
- class ListController extends BaseController
- {
- /**
- * 页码
- */
- const PAGE_SIZE = 10;
- /**
- * @var Order
- */
- protected $orderModel;
- public function preAction()
- {
- parent::preAction();
- $params = \YunShop::request()->get();
- $this->orderModel = $this->getOrder()->orders($params['search']);
- $order_sn = \YunShop::request()->get('order_sn');
- if ($order_sn)
- {
- $this->orderModel->where('order_sn',$order_sn)->get();
- }
- }
- protected function getOrder()
- {
- return Order::isPlugin()->pluginId();
- }
- /**
- * @return string
- * @throws \Throwable
- */
- public function index()
- {
- $this->export($this->orderModel);
- $this->directExport($this->orderModel);
- return view('order.index', $this->getData())->render();
- }
- /**
- * @return string
- * @throws \Throwable
- */
- public function waitPay()
- {
- $this->orderModel->waitPay();
- $this->export($this->orderModel->waitPay());
- $this->directExport($this->orderModel->waitPay());
- return view('order.index', $this->getData())->render();
- }
- /**
- * @return string
- * @throws \Throwable
- */
- public function waitSend()
- {
- // 会员排序
- $sort = request()->search['sort'];
- $condition = [];
- if ($sort == 1) {
- $condition['order_by'][] = [$this->orderModel->getModel()->getTable() . '.uid', 'desc'];
- $condition['order_by'][] = [$this->orderModel->getModel()->getTable() . '.id', 'desc'];
- }
- $this->orderModel->waitSend();
- $this->export($this->orderModel->waitSend());
- $this->directExport($this->orderModel->waitSend());
- return view('order.index', $this->getData($condition))->render();
- //return view('order.index', $this->getData())->render();
- }
- /**
- * 催发货
- * @return string
- */
- public function expeditingSend()
- {
- // 会员排序
- $sort = request()->search['sort'];
- $condition = [];
- if ($sort == 1) {
- $condition['order_by'][] = [$this->orderModel->getModel()->getTable() . '.uid', 'desc'];
- $condition['order_by'][] = [$this->orderModel->getModel()->getTable() . '.id', 'desc'];
- }
- $condition['expediting_delivery'] = 1;
- $this->orderModel->waitSend()->whereHas('hasOneExpeditingDelivery');
- $this->export($this->orderModel->waitSend()->whereHas('hasOneExpeditingDelivery'));
- $this->directExport($this->orderModel->waitSend()->whereHas('hasOneExpeditingDelivery'));
- return view('order.index', $this->getData($condition))->render();
- }
- /**
- * @return string
- * @throws \Throwable
- */
- public function waitReceive()
- {
- $this->orderModel->waitReceive();
- $this->export($this->orderModel->waitReceive());
- $this->directExport($this->orderModel->waitReceive());
- return view('order.index', $this->getData())->render();
- }
- /**
- * @return string
- * @throws \Throwable
- */
- public function completed()
- {
- $this->orderModel->completed();
- $this->export($this->orderModel->completed());
- $this->directExport($this->orderModel->completed());
- return view('order.index', $this->getData())->render();
- }
- /**
- * @return string
- * @throws \Throwable
- */
- public function cancelled()
- {
- $this->orderModel->cancelled();
- $this->export($this->orderModel->cancelled());
- $this->directExport($this->orderModel->cancelled());
- return view('order.index', $this->getData())->render();
- }
- protected function getData($condition = [])
- {
- $sort = request()->search['sort'];
- if ($sort == 1 && (!$condition || !$condition['order_by'])) {
- $condition['order_by'][] = [$this->orderModel->getModel()->getTable() . '.id', 'desc'];
- }
- /*$params = [
- 'search' => [
- 'ambiguous' => [
- 'field' => 'order_goods',
- 'string' => '春',
- ],
- 'pay_type' => 1,
- 'time_range' => [
- 'field' => 'create_time',
- 'range' => [1458425047, 1498425047]
- ]
- ]
- ];*/
- $requestSearch = \YunShop::request()->get('search');
- $requestSearch['plugin'] = 'fund';
- if ($requestSearch) {
- $requestSearch = array_filter($requestSearch, function ($item) {
- return !empty($item);
- });
- }
- $list['total_price'] = $this->orderModel->sum('yz_order.price');
- $list['dispatch_price'] = $this->orderModel->sum('yz_order.dispatch_price');
- $build = $this->orderModel;
- if ($condition['expediting_delivery']) {
- $build->whereHas('hasOneExpeditingDelivery');
- }
- if ($sort == 1) {
- foreach ($condition['order_by'] as $item) {
- $build->orderBy(...$item);
- }
- } else {
- $build->orderBy($this->orderModel->getModel()->getTable() . '.id', 'desc');
- }
- $page = $build->paginate(self::PAGE_SIZE);
- foreach ($page as $item) {
- $item->canRefund = $item->canRefund();
- }
- $list += $page->toArray();
- // foreach ($list['data'] as &$item){
- // $item['has_many_order_goods'][0]['thumb'] = $item['has_many_order_goods'][0]['thumb'] ?: yz_tomedia($list['data'][0]['has_many_order_goods'][0]['goods']['thumb']);
- // }
- // dd($list['data'][0]['has_many_order_goods'][0]['thumb'],yz_tomedia($list['data'][0]['has_many_order_goods'][0]['goods']['thumb']));
- //总数据数 页数 每页显示数据量
- $pager = PaginationHelper::show($list['total'], $list['current_page'], $list['per_page']);
- $data = [
- 'list' => $list,
- 'total_price' => $list['total_price'],
- 'dispatch_price' => $list['dispatch_price'],
- 'pager' => $pager,
- 'requestSearch' => $requestSearch,
- 'var' => \YunShop::app()->get(),
- 'url' => request('route'),
- 'include_ops' => 'order.ops',
- 'detail_url' => 'order.detail',
- 'route' => request()->route,
- ];
- return $data;
- }
- public function export($orders)
- {
- set_time_limit(30);
- if (\YunShop::request()->export == 1) {
- $export_page = request()->export_page ? request()->export_page : 1;
- //清除之前没有导出的文件
- if ($export_page == 1) {
- $fileNameArr = file_tree(storage_path('exports'));
- foreach ($fileNameArr as $val) {
- if (file_exists(storage_path('exports/' . basename($val)))) {
- unlink(storage_path('exports/') . basename($val)); // 路径+文件名称
- }
- }
- }
- $orders = $orders->with([
- 'discounts',
- 'deductions',
- ])->orderBy($this->orderModel->getModel()->getTable() . '.id', 'desc');
- $export_model = new OrderExportService($orders, $export_page);
- if (!$export_model->builder_model->isEmpty()) {
- $file_name = date('Ymdhis', time()) . '订单导出' . $export_page;//返现记录导出
- $export_data[0] = $this->getColumns();
- foreach ($export_model->builder_model->toArray() as $key => $item) {
- $address = explode(' ', $item['address']['address']);
- $fistOrder = $item['has_many_first_order'] ? '首单' : '';
- if ($item['dispatch_type_id'] == \app\common\models\DispatchType::PACKAGE_DELIVER && app('plugins')->isEnabled('package-deliver')) {
- $deliverOrder = \Yunshop\PackageDeliver\model\PackageDeliverOrder::where('order_id', $item['id'])
- ->with(['hasOneDeliver', 'hasOneDeliverClerk'])
- ->first();
- if ($deliverOrder->hasOneDeliverClerk) {
- $package_deliver_name = '[UID:' . $deliverOrder->hasOneDeliverClerk->uid . ']' . $deliverOrder->hasOneDeliverClerk->realname;
- } else {
- $package_deliver_name = '后台确认';
- }
- } else {
- $package_deliver_name = '';
- }
- $form = $this->getFormDataByOderId($item['id']);
- $goods = [];
- foreach ($item['has_many_order_goods'] as $v) {
- $goods[] = [
- $v['title'],
- $v['goods_option_title'],
- $v['goods_sn'],
- $v['total'],
- isset($form[$v['goods_id']]) ? $form[$v['goods_id']] : '',
- ];
- }
- $realname = $item['has_many_member_certified']['realname'] ?: $item['belongs_to_member']['realname'];
- $idcard = $item['has_many_member_certified']['idcard'] ?: $item['belongs_to_member']['idcard'];
- $export_data[$key + 1] = [
- $item['id'],
- $item['order_sn'],
- $item['has_one_order_pay']['pay_sn'],
- $item['belongs_to_member']['uid'],
- $this->getNickname($item['belongs_to_member']['nickname']),
- $item['address']['realname'],
- $item['address']['mobile'],
- !empty($address[0]) ? $address[0] : '',
- !empty($address[1]) ? $address[1] : '',
- !empty($address[2]) ? $address[2] : '',
- $item['address']['address'],
- $goods,
- $item['pay_type_name'],
- $this->getExportDiscount($item, 'deduction'),
- $this->getExportDiscount($item, 'coupon'),
- $this->getExportDiscount($item, 'enoughReduce'),
- $this->getExportDiscount($item, 'singleEnoughReduce'),
- $item['goods_price'],
- $item['dispatch_price'],
- $item['price'],
- $this->getGoods($item, 'cost_price'),
- $item['status_name'],
- $item['create_time'],
- !empty(strtotime($item['pay_time'])) ? $item['pay_time'] : '',
- !empty(strtotime($item['send_time'])) ? $item['send_time'] : '',
- !empty(strtotime($item['finish_time'])) ? $item['finish_time'] : '',
- $item['express']['express_company_name'],
- '[' . $item['express']['express_sn'] . ']',
- $item['has_one_order_remark']['remark'],
- $item['note'],
- $fistOrder,
- $realname,
- ' '.$idcard,
- $package_deliver_name,
- ];
- }
- $export_model->export($file_name, $export_data, 'order.list.index');
- }
- }
- }
- public function directExport($orders)
- {
- if (\YunShop::request()->direct_export == 1) {
- $export_page = request()->export_page ? request()->export_page : 1;
- $orders = $orders->with([
- 'discounts',
- 'deductions',
- 'hasManyParentTeam' => function ($q) {
- $q->whereHas('hasOneTeamDividend')
- ->with(['hasOneTeamDividend' => function ($q) {
- $q->with(['hasOneLevel']);
- },
- ])
- ->with('hasOneMember')
- // ->orderBy('id', 'desc')
- ->orderBy('level', 'asc');
- },
- ]);
- $export_model = new OrderExportService($orders, $export_page);
- $team_list = TeamDividendLevelModel::getList()->get();
- $levelId = [];
- $level_name = [];
- foreach ($team_list as $level) {
- $level_name[] = $level->level_name;
- $levelId[] = $level->id;
- }
- if (!$export_model->builder_model->isEmpty()) {
- $file_name = date('Ymdhis', time()) . '订单导出' . $export_page;//返现记录导出
- $export_data[0] = array_merge($level_name, $this->getColumns());
- foreach ($export_model->builder_model->toArray() as $key => $item) {
- $level = $this->getLevel($item, $levelId);
- $export_data[$key + 1] = $level;
- $address = explode(' ', $item['address']['address']);
- $form = $this->getFormDataByOderId($item['id']);
- $goods = [];
- foreach ($item['has_many_order_goods'] as $v) {
- $goods[] = [
- $v['title'],
- $v['goods_option_title'],
- $v['goods_sn'],
- $v['total'],
- isset($form[$v['goods_id']]) ? $form[$v['goods_id']] : '',
- ];
- }
- array_push($export_data[$key + 1],
- $item['id'],
- $item['order_sn'],
- $item['has_one_order_pay']['pay_sn'],
- $item['belongs_to_member']['uid'],
- $this->getNickname($item['belongs_to_member']['nickname']),
- $item['address']['realname'],
- $item['address']['mobile'],
- !empty($address[0]) ? $address[0] : '',
- !empty($address[1]) ? $address[1] : '',
- !empty($address[2]) ? $address[2] : '',
- $item['address']['address'],
- $goods,
- $item['pay_type_name'],
- $this->getExportDiscount($item, 'deduction'),
- $this->getExportDiscount($item, 'coupon'),
- $this->getExportDiscount($item, 'enoughReduce'),
- $this->getExportDiscount($item, 'singleEnoughReduce'),
- $item['goods_price'],
- $item['dispatch_price'],
- $item['price'],
- $this->getGoods($item, 'cost_price'),
- $item['status_name'],
- $item['create_time'],
- !empty(strtotime($item['pay_time'])) ? $item['pay_time'] : '',
- !empty(strtotime($item['send_time'])) ? $item['send_time'] : '',
- !empty(strtotime($item['finish_time'])) ? $item['finish_time'] : '',
- $item['express']['express_company_name'],
- '[' . $item['express']['express_sn'] . ']',
- $item['has_one_order_remark']['remark'],
- $item['note']
- );
- }
- $export_model->export($file_name, $export_data, 'order.list.index', 'direct_export');
- }
- }
- }
- public function getLevel($member, $levelId)
- {
- $data = [];
- foreach ($levelId as $k => $value) {
- foreach ($member['has_many_parent_team'] as $key => $parent) {
- if ($parent['has_one_team_dividend']['has_one_level']['id'] == $value) {
- $data[$k] = $parent['has_one_member']['nickname'] . ' ' . $parent['has_one_member']['realname'] . ' ' . $parent['has_one_member']['mobile'];
- break;
- }
- }
- $data[$k] = $data[$k] ? : '';
- }
- return $data;
- }
- public function getFormDataByOderId($order_id)
- {
- $result = [];
- $set = \app\common\modules\shop\ShopConfig::current()->get('shop-foundation.order.order_detail.diyform');
- if(!$set){
- return $result;
- }
- $orderGoods = \app\common\models\OrderGoods::where('order_id', $order_id)->get()->toArray();
- $orderGoodsIds = array_column($orderGoods, 'id');
- $orderGoods = array_column($orderGoods, null, 'id');
- $diyForms = OrderGoodsDiyForm::whereIn('order_goods_id', $orderGoodsIds)->get()->toArray();
- $dataIds = array_column($diyForms, 'diyform_data_id');
- $diyForms = array_column($diyForms, null, 'diyform_data_id');
- $datas = DiyformDataModel::whereIn('id', $dataIds)->get()->toArray();
- $item = [];
- foreach ($datas as $detail) {
- if ($detail) {
- $form = DiyformTypeModel::find($detail['form_id']);
- }
- $fields = iunserializer($form['fields']);
- foreach ($detail['form_data'] as $k => $v){
- if ($fields[$k]['data_type'] == 5) {
- continue;
- }
- if(is_array($v)){
- $v = implode(',', $v);
- }
- $item[] = $fields[$k]['tp_name'] . ':' . $v;
- }
- $result[$orderGoods[$diyForms[$detail['id']]['order_goods_id']]['goods_id']] = implode("\r\n", $item);
- }
- return $result;
- }
- protected function getColumns()
- {
- return ["订单id", "订单编号", "支付单号", "会员ID", "粉丝昵称", "会员姓名", "联系电话", '省', '市', '区', "收货地址",
- "商品名称", "商品规格", "商品编码", "商品数量", "自定义表单", "支付方式", '抵扣金额', '优惠券优惠', '全场满减优惠',
- '单品满减优惠', "商品小计", "运费", "应收款", "成本价", "状态", "下单时间", "付款时间", "发货时间", "完成时间",
- "快递公司", "快递单号", "订单备注", "用户备注", "首单", "真实姓名", "身份证", "核销员",
- ];
- }
- protected function getExportDiscount($order, $key)
- {
- $export_discount = [
- 'deduction' => 0, //抵扣金额
- 'coupon' => 0, //优惠券优惠
- 'enoughReduce' => 0, //全场满减优惠
- 'singleEnoughReduce' => 0, //单品满减优惠
- ];
- foreach ($order['discounts'] as $discount) {
- if ($discount['discount_code'] == $key) {
- $export_discount[$key] = $discount['amount'];
- }
- }
- if (!$export_discount['deduction']) {
- foreach ($order['deductions'] as $k => $v) {
- $export_discount['deduction'] += $v['amount'];
- }
- }
- return $export_discount[$key];
- }
- protected function getGoods($order, $key)
- {
- $goods_title = '';
- $goods_sn = '';
- $total = '';
- $cost_price = 0;
- foreach ($order['has_many_order_goods'] as $goods) {
- $res_title = $goods['title'];
- $res_title = str_replace('-', ',', $res_title);
- $res_title = str_replace('+', ',', $res_title);
- $res_title = str_replace('/', ',', $res_title);
- $res_title = str_replace('*', ',', $res_title);
- $res_title = str_replace('=', ',', $res_title);
- if ($goods['goods_option_title']) {
- $res_title .= '[' . $goods['goods_option_title'] . ']';
- }
- $order_goods = OrderGoods::find($goods['id']);
- if ($order_goods->goods_option_id) {
- $goods_option = GoodsOption::find($order_goods->goods_option_id);
- if ($goods_option) {
- $goods_sn .= '【' . $goods_option->goods_sn . '】';
- }
- } else {
- $goods_sn .= '【' . $goods['goods_sn'] . '】';
- }
- $goods_title .= '【' . $res_title . '*' . $goods['total'] . '】';
- $total .= '【' . $goods['total'] . '】';
- $cost_price += $goods['goods_cost_price'];
- }
- $res = [
- 'goods_title' => $goods_title,
- 'goods_sn' => $goods_sn,
- 'total' => $total,
- 'cost_price' => $cost_price,
- ];
- return $res[$key];
- }
- protected function getNickname($nickname)
- {
- if (substr($nickname, 0, strlen('=')) === '=') {
- $nickname = ',' . $nickname;
- }
- return $nickname;
- }
- }
|