| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354 | <?phpnamespace App\Http\Controllers\Admin;use App\Http\Models\Agent;use App\Http\Models\Invoice;use App\Http\Models\LadingBill;use App\Http\Models\Site;use App\Http\Models\SitePayment;use App\Http\Models\User;use Illuminate\Http\Request;use App\Http\Controllers\Controller;use Illuminate\Support\Facades\DB;use Illuminate\Support\Facades\Log;/** * 财务 之前提的需求 基本没啥用了 * Class FinanceController * @package App\Http\Controllers\Admin */class FinanceController extends Controller{    public function Save($id)    {        $sites_info =Site::query()->find($id);        $site_payment=SitePayment::query()->where('site_id','=',$id)->first();        $data = [            'cn_title'=>$sites_info->cn_title,        ];        return view('admin/finance/save', [            'data' => $sites_info,            'payment'=>$site_payment        ]);    }    /**     * 逾期未收款报表     * @param Request $request     * @return array|\Illuminate\Contracts\View\Factory|\Illuminate\Foundation\Application|\Illuminate\Http\JsonResponse|\Illuminate\View\View|mixed     */    public function finances_overdue (Request $request)    {        $total='0';        $filters='';        $inputs = $request->input();        $keyword = $request->input('keyword');        if (!$request->ajax()) {            return view('admin/finance/finances_receivables', [                'sum_total' => $total            ]);        }        $keyword = $request->input('keyword');        $type_status =$request->input('type_status');        $builder = Site::query()->with('sitePayment')->whereIn('status', [1, 2, 3, 4, 5, 6, 8, 9, 10]);        if ($keyword) {            $siteIds = Site::query()->where('cn_title', 'like', '%' . $keyword . '%')                ->orWhere('domain', 'like', '%' . $keyword . '%')                ->pluck('id')->toArray();            $builder->WhereIn('id', $siteIds);        }        if ($type_status) {            if($type_status=='1'){                $siteIds = SitePayment::query()->where('head_type', '!=', '2')                    ->pluck('site_id')->toArray();            }else if($type_status=='2'){                $siteIds = SitePayment::query()->where('done_type', '!=', '1')                    ->pluck('site_id')->toArray();            }else if($type_status=='3'){                $siteIds = SitePayment::query()->where('reach_type', '!=', '1')                    ->pluck('site_id')->toArray();            }else if($type_status=='4'){                $siteIds = SitePayment::query()->where('service_final_payment_type', '!=', '1')                    ->pluck('site_id')->toArray();            }else if($type_status=='5'){                $siteIds = SitePayment::query()->where('renewal_type', '!=', '1')                    ->pluck('site_id')->toArray();            }            $builder->WhereIn('id', $siteIds);        }        $result = $builder->orderByDesc('id')            ->paginate($request->input('pageSize') ?? TABLE_PAGE_SIZE);        foreach($result as $key=>$value){            $sit_pay_info = SitePayment::query()->where('site_id','=',$value->id)->first();            $value->contract_total_fee=$sit_pay_info->contract_total_fee;            $value->wiki_fee=$sit_pay_info->wiki_fee;            $value->other_fee=$sit_pay_info->other_fee;            $value->status_title=Site::STATUS_MAP[$value->status]?? '';        }        $items = $result->items();        return response()->json([            'rows' => $items,            'total' => $result->total(),            'sum_total'=>$total        ]);    }    /**     * 应收款报表     * @param Request $request     * @return array|\Illuminate\Contracts\View\Factory|\Illuminate\Foundation\Application|\Illuminate\Http\JsonResponse|\Illuminate\View\View|mixed     */    public function finances_receivables(Request $request)    {        $total='0';        $filters='';        $inputs = $request->input();        $keyword = $request->input('keyword');        if (!$request->ajax()) {            return view('admin/finance/finances_receivables', [                'sum_total' => $total            ]);        }        $keyword = $request->input('keyword');        $type_status =$request->input('type_status');        $builder = Site::query()->with('sitePayment')->whereIn('status', [1, 2, 3, 4, 5, 6, 8, 9, 10]);        if ($keyword) {            $siteIds = Site::query()->where('cn_title', 'like', '%' . $keyword . '%')                ->orWhere('domain', 'like', '%' . $keyword . '%')                ->pluck('id')->toArray();            $builder->WhereIn('id', $siteIds);        }        if ($type_status) {            if($type_status=='1'){                $siteIds = SitePayment::query()->where('head_type', '!=', '2')                    ->pluck('site_id')->toArray();            }else if($type_status=='2'){                $siteIds = SitePayment::query()->where('done_type', '!=', '1')                    ->pluck('site_id')->toArray();            }else if($type_status=='3'){                $siteIds = SitePayment::query()->where('reach_type', '!=', '1')                    ->pluck('site_id')->toArray();            }else if($type_status=='4'){                $siteIds = SitePayment::query()->where('service_final_payment_type', '!=', '1')                    ->pluck('site_id')->toArray();            }else if($type_status=='5'){                $siteIds = SitePayment::query()->where('renewal_type', '!=', '1')                    ->pluck('site_id')->toArray();            }            $builder->WhereIn('id', $siteIds);        }        $result = $builder->orderByDesc('id')            ->paginate($request->input('pageSize') ?? TABLE_PAGE_SIZE);        foreach($result as $key=>$value){            $sit_pay_info = SitePayment::query()->where('site_id','=',$value->id)->first();            $value->contract_total_fee=$sit_pay_info->contract_total_fee;            $value->wiki_fee=$sit_pay_info->wiki_fee;            $value->other_fee=$sit_pay_info->other_fee;            $value->status_title=Site::STATUS_MAP[$value->status]?? '';        }        $items = $result->items();        return response()->json([            'rows' => $items,            'total' => $result->total(),            'sum_total'=>$total        ]);    }    /**     * 收款报表     * @param Request $request     * @return array|\Illuminate\Contracts\View\Factory|\Illuminate\Foundation\Application|\Illuminate\Http\JsonResponse|\Illuminate\View\View|mixed     */    public function finances_collection(Request $request)    {        $total='0';        $filters='';        $inputs = $request->input();        $keyword = $request->input('keyword');        if($keyword){            $condition1[] = ['s.domain', 'like', '%' . $keyword . '%'];            $condition[] = ['s.cn_title', 'like', '%' . $keyword . '%'];        }        $total = DB::table('sites_payment as sp')            ->leftJoin('sites as s', 'sp.site_id', '=', 's.id')            ->where('s.status','!=','7')            ->where($condition ?? [])            ->orWhere($condition1 ?? [])            ->where('s.deleted_at','=',Null)            //->select();            ->SUM('sp.contract_total_fee');        if (!$request->ajax()) {            return view('admin/finance/finances_collection', [                'sum_total' => $total            ]);        }        $records = DB::table('sites_payment as sp')            ->leftJoin('sites as s', 'sp.site_id', '=', 's.id')            ->where('s.status','!=','7')            ->where('s.deleted_at','=',Null)            ->where($condition ?? [])            ->orWhere($condition1 ?? [])            ->orderByDesc('sp.site_id')            ->paginate($request->input('pageSize') ?? TABLE_PAGE_SIZE);        foreach($records as $key => $value){            //$item['status_title'] = Site::STATUS_MAP[$item->status]?? '';            $value->status_title = Site::STATUS_MAP[$value->status]?? '';        }        $items = $records->items();        return response()->json([            'rows' => $items,            'total' => $records->total(),            'sum_total'=>$total        ]);    }    public function index(Request $request)    {        if (!$request->ajax()) {            return view('admin/finance/index');        }        $inputs = $request->input();        !empty($inputs['start_at']) && $filters[] = ['created_at', '>=', $inputs['start_at']];        !empty($inputs['end_at']) && $filters[] = ['created_at', '<=', $inputs['end_at']];        $filters[] = ['is_settle', '=', 0];        $records = LadingBill::query()->where($filters)->selectRaw('user_id,sum(amount) as total_amount,GROUP_CONCAT(id) as ids')            ->groupBy('user_id')->paginate($request->input('pageSize') ?? TABLE_PAGE_SIZE);        $items = $records->items();        $userIds = array_column($items, 'user_id');        $invoices = Agent::query()->whereIn('user_id', $userIds)            ->select(['user_id', 'discount', 'cash_deposit'])->get()->keyBy('user_id')->toArray();        $userMaps = User::query()->whereIn('id', $userIds)->pluck('username', 'id')->toArray();        array_walk($items, function ($item) use ($invoices, $userMaps) {            $item->settle_amount = bcadd($item->total_amount, ($invoices[$item->user_id]['discount']??0), 2);            $item->settle_amount = bcmul($item->total_amount, ($invoices[$item->user_id]['discount'] ?? 100) / 100, 2);            $item->username = $userMaps[$item->user_id] ?? '';            $item->ids = explode(',', ($item->ids??''));        });        return response()->json([            'rows' => $items,            'total' => $records->total()        ]);    }    /**     * 结算     * @param Request $request     * @return \Illuminate\Http\JsonResponse     */    public function settle(Request $request)    {        $ids = $request->input('ids');        $records = LadingBill::query()->with('agent')->whereIn('id', $ids)->get();        foreach ($records as $record) {            if (!empty($record->agent)) {                $settleAmount = bcmul($record->amount, ($record->agent->discount ?? 100) / 100, 2);                $record->update([                    'settle_amount' => $settleAmount,                    'is_settle' => 1,                    'settle_at' => date('Y-m-d H:i:s')                ]);            }        }        return response()->json(['message' => '操作成功']);    }    /**     * 结算历史     * @param Request $request     * @return \Illuminate\Contracts\View\Factory|\Illuminate\Http\JsonResponse|\Illuminate\View\View     */    public function history(Request $request)    {        if (!$request->ajax()) {            $settleTotal = LadingBill::query()->where(['is_settle' => 1])->sum('settle_amount');            return view('admin/finance/history', [                'settleTotal' => $settleTotal            ]);        }        $inputs = $request->input();        !empty($inputs['start_at']) && $filters[] = ['created_at', '>=', $inputs['start_at']];        !empty($inputs['end_at']) && $filters[] = ['created_at', '<=', $inputs['end_at']];        $filters[] = ['is_settle', '=', 1];        $records = LadingBill::query()->where($filters)->selectRaw('user_id,sum(settle_amount) as settle_total_amount,GROUP_CONCAT(id) as ids')            ->groupBy('user_id')->paginate($request->input('pageSize') ?? TABLE_PAGE_SIZE);        $items = $records->items();        $userIds = array_column($items, 'user_id');        $invoices = Agent::query()->whereIn('user_id', $userIds)            ->select(['user_id', 'discount', 'cash_deposit'])->get()->keyBy('user_id')->toArray();        $userMaps = User::query()->whereIn('id', $userIds)->pluck('username', 'id')->toArray();        array_walk($items, function ($item) use ($invoices, $userMaps) {            $item->username = $userMaps[$item->user_id] ?? '';            $item->ids = explode(',', $item->ids);        });        return response()->json([            'rows' => $items,            'total' => $records->total(),            'settle_total' => time()        ]);    }    public function detail(Request $request)    {        $isSettle = $request->input('isSettle');        $ladingBillIds = $request->input('ladingBillIds') ?? [];        if (!$request->ajax()) {            return view('admin/finance/detail', [                'ladingBillIds' => array_map(function ($item) {                    return intval($item);                }, $ladingBillIds)            ]);        }        $records = LadingBill::query()->with(['agent', 'site'])->whereIn('id', $ladingBillIds)            ->paginate($request->input('pageSize') ?? TABLE_PAGE_SIZE);        $items = $records->items();        array_walk($items, function ($item) use ($isSettle) {            if (!$isSettle) {                $item->settle_amount = bcmul($item->amount, ($item->agent->discount ?? 100) / 100, 2);            }            $item->relate_site = $item->site->cn_title ?? '';        });        return response()->json([            'rows' => $items,            'total' => $records->total()        ]);    }}
 |