FinanceController.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354
  1. <?php
  2. namespace App\Http\Controllers\Admin;
  3. use App\Http\Models\Agent;
  4. use App\Http\Models\Invoice;
  5. use App\Http\Models\LadingBill;
  6. use App\Http\Models\Site;
  7. use App\Http\Models\SitePayment;
  8. use App\Http\Models\User;
  9. use Illuminate\Http\Request;
  10. use App\Http\Controllers\Controller;
  11. use Illuminate\Support\Facades\DB;
  12. use Illuminate\Support\Facades\Log;
  13. /**
  14. * 财务 之前提的需求 基本没啥用了
  15. * Class FinanceController
  16. * @package App\Http\Controllers\Admin
  17. */
  18. class FinanceController extends Controller
  19. {
  20. public function Save($id)
  21. {
  22. $sites_info =Site::query()->find($id);
  23. $site_payment=SitePayment::query()->where('site_id','=',$id)->first();
  24. $data = [
  25. 'cn_title'=>$sites_info->cn_title,
  26. ];
  27. return view('admin/finance/save', [
  28. 'data' => $sites_info,
  29. 'payment'=>$site_payment
  30. ]);
  31. }
  32. /**
  33. * 逾期未收款报表
  34. * @param Request $request
  35. * @return array|\Illuminate\Contracts\View\Factory|\Illuminate\Foundation\Application|\Illuminate\Http\JsonResponse|\Illuminate\View\View|mixed
  36. */
  37. public function finances_overdue (Request $request)
  38. {
  39. $total='0';
  40. $filters='';
  41. $inputs = $request->input();
  42. $keyword = $request->input('keyword');
  43. if (!$request->ajax()) {
  44. return view('admin/finance/finances_receivables', [
  45. 'sum_total' => $total
  46. ]);
  47. }
  48. $keyword = $request->input('keyword');
  49. $type_status =$request->input('type_status');
  50. $builder = Site::query()->with('sitePayment')->whereIn('status', [1, 2, 3, 4, 5, 6, 8, 9, 10]);
  51. if ($keyword) {
  52. $siteIds = Site::query()->where('cn_title', 'like', '%' . $keyword . '%')
  53. ->orWhere('domain', 'like', '%' . $keyword . '%')
  54. ->pluck('id')->toArray();
  55. $builder->WhereIn('id', $siteIds);
  56. }
  57. if ($type_status) {
  58. if($type_status=='1'){
  59. $siteIds = SitePayment::query()->where('head_type', '!=', '2')
  60. ->pluck('site_id')->toArray();
  61. }else if($type_status=='2'){
  62. $siteIds = SitePayment::query()->where('done_type', '!=', '1')
  63. ->pluck('site_id')->toArray();
  64. }else if($type_status=='3'){
  65. $siteIds = SitePayment::query()->where('reach_type', '!=', '1')
  66. ->pluck('site_id')->toArray();
  67. }else if($type_status=='4'){
  68. $siteIds = SitePayment::query()->where('service_final_payment_type', '!=', '1')
  69. ->pluck('site_id')->toArray();
  70. }else if($type_status=='5'){
  71. $siteIds = SitePayment::query()->where('renewal_type', '!=', '1')
  72. ->pluck('site_id')->toArray();
  73. }
  74. $builder->WhereIn('id', $siteIds);
  75. }
  76. $result = $builder->orderByDesc('id')
  77. ->paginate($request->input('pageSize') ?? TABLE_PAGE_SIZE);
  78. foreach($result as $key=>$value){
  79. $sit_pay_info = SitePayment::query()->where('site_id','=',$value->id)->first();
  80. $value->contract_total_fee=$sit_pay_info->contract_total_fee;
  81. $value->wiki_fee=$sit_pay_info->wiki_fee;
  82. $value->other_fee=$sit_pay_info->other_fee;
  83. $value->status_title=Site::STATUS_MAP[$value->status]?? '';
  84. }
  85. $items = $result->items();
  86. return response()->json([
  87. 'rows' => $items,
  88. 'total' => $result->total(),
  89. 'sum_total'=>$total
  90. ]);
  91. }
  92. /**
  93. * 应收款报表
  94. * @param Request $request
  95. * @return array|\Illuminate\Contracts\View\Factory|\Illuminate\Foundation\Application|\Illuminate\Http\JsonResponse|\Illuminate\View\View|mixed
  96. */
  97. public function finances_receivables(Request $request)
  98. {
  99. $total='0';
  100. $filters='';
  101. $inputs = $request->input();
  102. $keyword = $request->input('keyword');
  103. if (!$request->ajax()) {
  104. return view('admin/finance/finances_receivables', [
  105. 'sum_total' => $total
  106. ]);
  107. }
  108. $keyword = $request->input('keyword');
  109. $type_status =$request->input('type_status');
  110. $builder = Site::query()->with('sitePayment')->whereIn('status', [1, 2, 3, 4, 5, 6, 8, 9, 10]);
  111. if ($keyword) {
  112. $siteIds = Site::query()->where('cn_title', 'like', '%' . $keyword . '%')
  113. ->orWhere('domain', 'like', '%' . $keyword . '%')
  114. ->pluck('id')->toArray();
  115. $builder->WhereIn('id', $siteIds);
  116. }
  117. if ($type_status) {
  118. if($type_status=='1'){
  119. $siteIds = SitePayment::query()->where('head_type', '!=', '2')
  120. ->pluck('site_id')->toArray();
  121. }else if($type_status=='2'){
  122. $siteIds = SitePayment::query()->where('done_type', '!=', '1')
  123. ->pluck('site_id')->toArray();
  124. }else if($type_status=='3'){
  125. $siteIds = SitePayment::query()->where('reach_type', '!=', '1')
  126. ->pluck('site_id')->toArray();
  127. }else if($type_status=='4'){
  128. $siteIds = SitePayment::query()->where('service_final_payment_type', '!=', '1')
  129. ->pluck('site_id')->toArray();
  130. }else if($type_status=='5'){
  131. $siteIds = SitePayment::query()->where('renewal_type', '!=', '1')
  132. ->pluck('site_id')->toArray();
  133. }
  134. $builder->WhereIn('id', $siteIds);
  135. }
  136. $result = $builder->orderByDesc('id')
  137. ->paginate($request->input('pageSize') ?? TABLE_PAGE_SIZE);
  138. foreach($result as $key=>$value){
  139. $sit_pay_info = SitePayment::query()->where('site_id','=',$value->id)->first();
  140. $value->contract_total_fee=$sit_pay_info->contract_total_fee;
  141. $value->wiki_fee=$sit_pay_info->wiki_fee;
  142. $value->other_fee=$sit_pay_info->other_fee;
  143. $value->status_title=Site::STATUS_MAP[$value->status]?? '';
  144. }
  145. $items = $result->items();
  146. return response()->json([
  147. 'rows' => $items,
  148. 'total' => $result->total(),
  149. 'sum_total'=>$total
  150. ]);
  151. }
  152. /**
  153. * 收款报表
  154. * @param Request $request
  155. * @return array|\Illuminate\Contracts\View\Factory|\Illuminate\Foundation\Application|\Illuminate\Http\JsonResponse|\Illuminate\View\View|mixed
  156. */
  157. public function finances_collection(Request $request)
  158. {
  159. $total='0';
  160. $filters='';
  161. $inputs = $request->input();
  162. $keyword = $request->input('keyword');
  163. if($keyword){
  164. $condition1[] = ['s.domain', 'like', '%' . $keyword . '%'];
  165. $condition[] = ['s.cn_title', 'like', '%' . $keyword . '%'];
  166. }
  167. $total = DB::table('sites_payment as sp')
  168. ->leftJoin('sites as s', 'sp.site_id', '=', 's.id')
  169. ->where('s.status','!=','7')
  170. ->where($condition ?? [])
  171. ->orWhere($condition1 ?? [])
  172. ->where('s.deleted_at','=',Null)
  173. //->select();
  174. ->SUM('sp.contract_total_fee');
  175. if (!$request->ajax()) {
  176. return view('admin/finance/finances_collection', [
  177. 'sum_total' => $total
  178. ]);
  179. }
  180. $records = DB::table('sites_payment as sp')
  181. ->leftJoin('sites as s', 'sp.site_id', '=', 's.id')
  182. ->where('s.status','!=','7')
  183. ->where('s.deleted_at','=',Null)
  184. ->where($condition ?? [])
  185. ->orWhere($condition1 ?? [])
  186. ->orderByDesc('sp.site_id')
  187. ->paginate($request->input('pageSize') ?? TABLE_PAGE_SIZE);
  188. foreach($records as $key => $value){
  189. //$item['status_title'] = Site::STATUS_MAP[$item->status]?? '';
  190. $value->status_title = Site::STATUS_MAP[$value->status]?? '';
  191. }
  192. $items = $records->items();
  193. return response()->json([
  194. 'rows' => $items,
  195. 'total' => $records->total(),
  196. 'sum_total'=>$total
  197. ]);
  198. }
  199. public function index(Request $request)
  200. {
  201. if (!$request->ajax()) {
  202. return view('admin/finance/index');
  203. }
  204. $inputs = $request->input();
  205. !empty($inputs['start_at']) && $filters[] = ['created_at', '>=', $inputs['start_at']];
  206. !empty($inputs['end_at']) && $filters[] = ['created_at', '<=', $inputs['end_at']];
  207. $filters[] = ['is_settle', '=', 0];
  208. $records = LadingBill::query()->where($filters)->selectRaw('user_id,sum(amount) as total_amount,GROUP_CONCAT(id) as ids')
  209. ->groupBy('user_id')->paginate($request->input('pageSize') ?? TABLE_PAGE_SIZE);
  210. $items = $records->items();
  211. $userIds = array_column($items, 'user_id');
  212. $invoices = Agent::query()->whereIn('user_id', $userIds)
  213. ->select(['user_id', 'discount', 'cash_deposit'])->get()->keyBy('user_id')->toArray();
  214. $userMaps = User::query()->whereIn('id', $userIds)->pluck('username', 'id')->toArray();
  215. array_walk($items, function ($item) use ($invoices, $userMaps) {
  216. $item->settle_amount = bcadd($item->total_amount, ($invoices[$item->user_id]['discount']??0), 2);
  217. $item->settle_amount = bcmul($item->total_amount, ($invoices[$item->user_id]['discount'] ?? 100) / 100, 2);
  218. $item->username = $userMaps[$item->user_id] ?? '';
  219. $item->ids = explode(',', ($item->ids??''));
  220. });
  221. return response()->json([
  222. 'rows' => $items,
  223. 'total' => $records->total()
  224. ]);
  225. }
  226. /**
  227. * 结算
  228. * @param Request $request
  229. * @return \Illuminate\Http\JsonResponse
  230. */
  231. public function settle(Request $request)
  232. {
  233. $ids = $request->input('ids');
  234. $records = LadingBill::query()->with('agent')->whereIn('id', $ids)->get();
  235. foreach ($records as $record) {
  236. if (!empty($record->agent)) {
  237. $settleAmount = bcmul($record->amount, ($record->agent->discount ?? 100) / 100, 2);
  238. $record->update([
  239. 'settle_amount' => $settleAmount,
  240. 'is_settle' => 1,
  241. 'settle_at' => date('Y-m-d H:i:s')
  242. ]);
  243. }
  244. }
  245. return response()->json(['message' => '操作成功']);
  246. }
  247. /**
  248. * 结算历史
  249. * @param Request $request
  250. * @return \Illuminate\Contracts\View\Factory|\Illuminate\Http\JsonResponse|\Illuminate\View\View
  251. */
  252. public function history(Request $request)
  253. {
  254. if (!$request->ajax()) {
  255. $settleTotal = LadingBill::query()->where(['is_settle' => 1])->sum('settle_amount');
  256. return view('admin/finance/history', [
  257. 'settleTotal' => $settleTotal
  258. ]);
  259. }
  260. $inputs = $request->input();
  261. !empty($inputs['start_at']) && $filters[] = ['created_at', '>=', $inputs['start_at']];
  262. !empty($inputs['end_at']) && $filters[] = ['created_at', '<=', $inputs['end_at']];
  263. $filters[] = ['is_settle', '=', 1];
  264. $records = LadingBill::query()->where($filters)->selectRaw('user_id,sum(settle_amount) as settle_total_amount,GROUP_CONCAT(id) as ids')
  265. ->groupBy('user_id')->paginate($request->input('pageSize') ?? TABLE_PAGE_SIZE);
  266. $items = $records->items();
  267. $userIds = array_column($items, 'user_id');
  268. $invoices = Agent::query()->whereIn('user_id', $userIds)
  269. ->select(['user_id', 'discount', 'cash_deposit'])->get()->keyBy('user_id')->toArray();
  270. $userMaps = User::query()->whereIn('id', $userIds)->pluck('username', 'id')->toArray();
  271. array_walk($items, function ($item) use ($invoices, $userMaps) {
  272. $item->username = $userMaps[$item->user_id] ?? '';
  273. $item->ids = explode(',', $item->ids);
  274. });
  275. return response()->json([
  276. 'rows' => $items,
  277. 'total' => $records->total(),
  278. 'settle_total' => time()
  279. ]);
  280. }
  281. public function detail(Request $request)
  282. {
  283. $isSettle = $request->input('isSettle');
  284. $ladingBillIds = $request->input('ladingBillIds') ?? [];
  285. if (!$request->ajax()) {
  286. return view('admin/finance/detail', [
  287. 'ladingBillIds' => array_map(function ($item) {
  288. return intval($item);
  289. }, $ladingBillIds)
  290. ]);
  291. }
  292. $records = LadingBill::query()->with(['agent', 'site'])->whereIn('id', $ladingBillIds)
  293. ->paginate($request->input('pageSize') ?? TABLE_PAGE_SIZE);
  294. $items = $records->items();
  295. array_walk($items, function ($item) use ($isSettle) {
  296. if (!$isSettle) {
  297. $item->settle_amount = bcmul($item->amount, ($item->agent->discount ?? 100) / 100, 2);
  298. }
  299. $item->relate_site = $item->site->cn_title ?? '';
  300. });
  301. return response()->json([
  302. 'rows' => $items,
  303. 'total' => $records->total()
  304. ]);
  305. }
  306. }