BillingModelsController.php 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\BillingModel;
  4. use App\Carrier;
  5. use App\City;
  6. use App\Events\WaybillPriceModelEvent;
  7. use App\Imports\BillingModelsImport;
  8. use App\Province;
  9. use App\Unit;
  10. use function GuzzleHttp\Psr7\str;
  11. use Illuminate\Http\Request;
  12. use Illuminate\Support\Facades\Auth;
  13. use Illuminate\Support\Facades\Cache;
  14. use Illuminate\Support\Facades\Gate;
  15. use Illuminate\Support\Facades\Validator;
  16. use Maatwebsite\Excel\Facades\Excel;
  17. class BillingModelsController extends Controller
  18. {
  19. public function index(Request $request)
  20. {
  21. if(!Gate::allows('计费模型-查询')){ return redirect(url('/')); }
  22. $carriers=Carrier::get();
  23. $provinces=Province::get();
  24. $data=$request->input();
  25. if ($data){
  26. $billingModels= BillingModel::orderBy('id', 'DESC');
  27. if ($request->input('carrier_id')){
  28. $billingModels=$billingModels->where('carrier_id',$request->input('carrier_id'));
  29. }
  30. if ($request->input('province_id')){
  31. $billingModels=$billingModels->where('province_id',$request->input('province_id'));
  32. }
  33. $billingModels=$billingModels->paginate($request->input('paginate')?$request->input('paginate'):50);
  34. return view('waybill.billingModel.index',['billingModels'=>$billingModels,'carriers'=>$carriers,'provinces'=>$provinces,'filterData'=>$data]);
  35. }else{
  36. $billingModels= BillingModel::paginate(50);
  37. return view('waybill.billingModel.index',['billingModels'=>$billingModels,'carriers'=>$carriers,'provinces'=>$provinces,'filterData'=>$data]);
  38. }
  39. }
  40. public function create()
  41. {
  42. if(!Gate::allows('计费模型-录入')){ return redirect(url('/')); }
  43. $carriers=Carrier::get();
  44. $provinces=Province::get();
  45. $units=Unit::get();
  46. return view('waybill.billingModel.create',['carriers'=>$carriers,'provinces'=>$provinces,'units'=>$units]);
  47. }
  48. public function getCities($province_id){
  49. $cities=City::where('province_id',$province_id)->get();
  50. return ['cities'=>$cities];
  51. }
  52. public function store(Request $request)
  53. {
  54. if(!Gate::allows('计费模型-录入')){ return redirect(url('/')); }
  55. $this->validateBillingModel($request)->validate();
  56. $billingModel=$request->input('BillingModel');
  57. $billingModelIs=BillingModel::where('carrier_id',$billingModel['carrier_id'])->where('province_id',$billingModel['province_id'])->where('unit_id',$billingModel['unit_id']);
  58. if (isset($billingModel['city_id'])){
  59. $billingModelIs=$billingModelIs->where('city_id',$billingModel['city_id']);
  60. }
  61. if (isset($billingModel['range_min'])){
  62. $billingModelIs=$billingModelIs->where('range_min',$billingModel['range_min']);
  63. }
  64. if (isset($billingModel['range_max'])){
  65. $billingModelIs=$billingModelIs->where('range_max',$billingModel['range_max']);
  66. }
  67. $billingModelIs=$billingModelIs->first();
  68. if (!$billingModelIs){
  69. if (isset($billingModel['city_id'])){
  70. $billingModelProvince=BillingModel::whereRaw('carrier_id = ? AND province_id = ? AND city_id IS NULL',[$billingModel['carrier_id'],$billingModel['province_id']])->first();
  71. if ($billingModelProvince){
  72. return redirect()->back()->with('successTip','已存在省份模型,无需录入城市模型');
  73. }
  74. }else{
  75. $billingModelProvince=BillingModel::whereRaw('carrier_id = ? AND province_id = ? AND city_id IS NOT NULL',[$billingModel['carrier_id'],$billingModel['province_id']])->first();
  76. if ($billingModelProvince){
  77. return redirect()->back()->with('successTip','已存在城市模型,无法录入省份模型');
  78. }
  79. }
  80. $waybillPriceModel=BillingModel::create($billingModel);
  81. event(new WaybillPriceModelEvent($waybillPriceModel));
  82. $this->log(__METHOD__,__FUNCTION__,json_encode($request->toArray()),Auth::user()['id']);
  83. return redirect('billingModel')->with('successTip','新计费模型录入成功');
  84. }else{
  85. return redirect()->back()->with('successTip','该计费模型已存在');
  86. }
  87. }
  88. public function edit($id)
  89. {
  90. if(!Gate::allows('计费模型-编辑')){ return redirect(url('/')); }
  91. $billingModel=BillingModel::find($id);
  92. $carriers=Carrier::get();
  93. $provinces=Province::get();
  94. $cities=City::where('province_id',$billingModel->province_id)->get();
  95. $units=Unit::get();
  96. return view('waybill.billingModel.edit',['billingModel'=>$billingModel,'carriers'=>$carriers,'provinces'=>$provinces,'units'=>$units,'cities'=>$cities]);
  97. }
  98. public function update(Request $request, $id)
  99. {
  100. if(!Gate::allows('计费模型-编辑')){ return redirect(url('/')); }
  101. $this->validateBillingModel($request)->validate();
  102. $billingModel=BillingModel::find($id);
  103. $billingModel->fill($request->input('BillingModel'));
  104. if ($billingModel->save()){
  105. event(new WaybillPriceModelEvent($billingModel));
  106. $this->log(__METHOD__,__FUNCTION__,json_encode($request->toArray()),Auth::user()['id']);
  107. return redirect('billingModel')->with('successTip','新计费模型修改成功');
  108. }
  109. }
  110. public function destroy($id)
  111. {
  112. if(!Gate::allows('计费模型-删除')){ return redirect(url('/')); }
  113. $billingModel=BillingModel::find($id);
  114. $this->log(__METHOD__,__FUNCTION__,json_encode($billingModel),Auth::user()['id']);
  115. $result=$billingModel->delete();
  116. return ['success'=>$result];
  117. }
  118. public function import(Request $request){
  119. if(!Gate::allows('计费模型-录入')){ return redirect(url('/')); }
  120. $fileSuffix=$request->file('file')->getClientOriginalExtension();
  121. if ($fileSuffix=='xlsx'||$fileSuffix=='xlsm'||$fileSuffix=='xltx'||$fileSuffix=='xltm'||$fileSuffix=='xls'||$fileSuffix=='xlt'||$fileSuffix=='ods'||$fileSuffix=='ots'||$fileSuffix=='slk'
  122. ||$fileSuffix=='xml'||$fileSuffix=='gnumeric'||$fileSuffix=='htm'||$fileSuffix=='html'||$fileSuffix=='csv'||$fileSuffix=='tsv'){
  123. $isOverride = $request->input('isOverride');
  124. ini_set('max_execution_time',2100);
  125. ini_set('memory_limit','512M');
  126. $extension=$request->file()['file']->getClientOriginalExtension();
  127. $extension[0] = strtoupper($extension[0]);
  128. Excel::import(new BillingModelsImport($isOverride),$request->file()['file']->path(),null,$extension);
  129. if (Cache::has('error')){
  130. return '<h1 class="text-danger">导入Excel失败<br><p style="color: red">'.Cache::pull('error').'</p></h1>';
  131. }else{
  132. $exception=Cache::get('exception');
  133. $a='';
  134. for ($i=0;$i<count($exception);$i++){$a.=implode(',',$exception[$i]).'&#10'; };
  135. return '<h1 class="text-danger">导入Excel成功<br><textarea style="width: 50%;height: 50%">'.$a.'</textarea></h1>';
  136. }
  137. }else{
  138. return '<h1 class="text-danger">失败<br><p style="color: red">不支持该文件类型</p></h1>';
  139. }
  140. }
  141. protected function validateBillingModel(Request $request){
  142. $min = $request->input('BillingModel.range_min');
  143. $validator= Validator::make($request->input(),[
  144. 'BillingModel.province_id'=>'required|integer',
  145. 'BillingModel.carrier_id'=>'required|integer',
  146. 'BillingModel.unit_id'=>'required|integer',
  147. 'BillingModel.city_id'=>'nullable|Integer',
  148. 'BillingModel.range_min'=> 'nullable|min:0|numeric',
  149. 'BillingModel.range_max'=> "nullable|min:{$min}|numeric",
  150. 'BillingModel.unit_price'=>'required|min:0|numeric',
  151. 'BillingModel.base_fee'=>'nullable|min:0|numeric',
  152. 'BillingModel.initial_weight'=>'nullable|min:0|numeric',
  153. ],[
  154. 'required'=>':attribute 为必填项',
  155. 'min' =>':attribute 数值过小',
  156. 'max' => ':attribute 数值过大',
  157. 'numeric' =>':attribute 应为数字',
  158. 'integer'=> ':attribute 选择错误',
  159. ],[
  160. 'BillingModel.province_id'=>'省份',
  161. 'BillingModel.carrier_id'=>'承运商',
  162. 'BillingModel.unit_id'=>'计重单位',
  163. 'BillingModel.city_id'=>'城市',
  164. 'BillingModel.range_min'=>'价格区间最小值',
  165. 'BillingModel.range_max'=>'价格区间最大值',
  166. 'BillingModel.unit_price'=>'单价',
  167. 'BillingModel.base_fee'=>'起步费',
  168. 'BillingModel.initial_weight'=>'始重',
  169. ]);
  170. return $validator;
  171. }
  172. }