PriceModelController.php 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Imports\ExpressImport;
  4. use App\Owner;
  5. use App\OwnerOutStorageRule;
  6. use App\OwnerPriceExpress;
  7. use App\OwnerPriceExpressProvince;
  8. use App\OwnerPriceLogistic;
  9. use App\OwnerPriceOperation;
  10. use App\Services\OwnerOutStorageRuleService;
  11. use App\Services\OwnerPriceOperationService;
  12. use Illuminate\Database\Eloquent\Builder;
  13. use Illuminate\Http\Request;
  14. use Illuminate\Support\Facades\Cache;
  15. use Illuminate\Support\Facades\Gate;
  16. use Illuminate\Support\Facades\Validator;
  17. use Maatwebsite\Excel\Facades\Excel;
  18. class PriceModelController extends Controller
  19. {
  20. public function storageIndex()
  21. {
  22. if(!Gate::allows('计费模型-仓储')){ return redirect('denied'); }
  23. $models = app('OwnerStoragePriceModelService')->paginate(["unit"]);
  24. return response()->view('maintenance.priceModel.storage.index',compact("models"));
  25. }
  26. public function storageCreate()
  27. {
  28. if(!Gate::allows('计费模型-仓储-录入')){ return redirect('denied'); }
  29. $units = app('UnitService')->getSelection();
  30. return response()->view('maintenance.priceModel.storage.create',compact("units"));
  31. }
  32. public function storageStore(Request $request)
  33. {
  34. if(!Gate::allows('计费模型-仓储-录入')){ return redirect('denied'); }
  35. $this->storageValidator($request->input())->validate();
  36. app('OwnerStoragePriceModelService')->create($request->input());
  37. return response()->redirectTo('maintenance/priceModel/storage')->with('successTip',"创建成功!");
  38. }
  39. public function storageEdit($id)
  40. {
  41. if(!Gate::allows('计费模型-仓储-编辑')){ return redirect('denied'); }
  42. $model = app('OwnerStoragePriceModelService')->find($id);
  43. $units = app('UnitService')->getSelection();
  44. return response()->view('maintenance.priceModel.storage.create',compact("units","model"));
  45. }
  46. public function storageUpdate(Request $request)
  47. {
  48. if(!Gate::allows('计费模型-仓储-编辑')){ return redirect('denied'); }
  49. app('OwnerStoragePriceModelService')->update(["id"=>$request->input("id")],[
  50. "counting_type" => $request->input("counting_type"),
  51. "using_type" => $request->input("using_type"),
  52. "minimum_area" => $request->input("minimum_area"),
  53. "price" => $request->input("price"),
  54. "discount_type" => $request->input("discount_type"),
  55. "discount_value"=> $request->input("discount_value"),
  56. "unit_id" => $request->input("unit_id"),
  57. ]);
  58. return response()->redirectTo('maintenance/priceModel/storage')->with('successTip',"更新成功!");
  59. }
  60. public function storageDestroy($id)
  61. {
  62. app("OwnerStoragePriceModelService")->destroy($id);
  63. return ["success"=>true];
  64. }
  65. private function storageValidator(array $params)
  66. {
  67. return Validator::make($params,[
  68. 'counting_type'=>['required'],
  69. 'using_type'=>['required'],
  70. 'minimum_area'=>['nullable','numeric','min:0'],
  71. 'discount_value'=>['nullable','numeric','min:0'],
  72. 'price'=>['required','numeric','min:0'],
  73. 'discount_type'=>['required'],
  74. 'unit_id'=>['required','integer'],
  75. ],[
  76. 'required'=>':attribute 为必填项',
  77. 'min'=>':attribute 不得小于0',
  78. 'integer'=>':attribute 未选择',
  79. ],[
  80. 'counting_type' =>"计费类型",
  81. 'using_type' =>"用仓类型",
  82. 'minimum_area' =>"最低起租面积",
  83. 'price' =>"单价",
  84. 'discount_type' =>"减免类型",
  85. 'discount_value'=>"减免值",
  86. 'unit_id' =>"单位",
  87. ]);
  88. }
  89. public function operationIndex(Request $request){
  90. if(!Gate::allows('计费模型-作业-查询')){ return redirect('denied'); }
  91. $features = app("FeatureService")->getMapArray();
  92. OwnerPriceOperation::$features = $features;
  93. $models = app('OwnerPriceOperationService')->paginate($request->input(),["ownerPriceOperationOwners","ownerInStorageRule"=>function($query){$query->with("unit");}])->append("featureFormat");
  94. $owners = app("OwnerService")->getSelection();
  95. return response()->view('maintenance.priceModel.operation.index',compact("models","owners"));
  96. }
  97. /* 获取出库模型规则 */
  98. public function operationGetOutStorageRule(Request $request)
  99. {
  100. if(!Gate::allows('计费模型-作业-查询')){ return ["success"=>false,"data"=>"无权操作"]; }
  101. /** @var OwnerOutStorageRuleService $service */
  102. $service = app('OwnerOutStorageRuleService');
  103. $ownerOutStorageRules = $service->get(["owner_price_operation_id"=>$request->input("id")],["unit"],true)->append("featureFormat");
  104. return ["success"=>true,"data"=>$ownerOutStorageRules];
  105. }
  106. /* 修改出库模型规则 */
  107. public function updateOutStorageRule(Request $request)
  108. {
  109. if(!Gate::allows('计费模型-作业-编辑')){ return ["success"=>false,"data"=>"无权操作"]; }
  110. /** @var OwnerOutStorageRuleService $service */
  111. $service = app('OwnerOutStorageRuleService');
  112. $row = $service->update(["id"=>$request->input("id")],[
  113. "amount"=>$request->input("amount"),
  114. "unit_id"=>$request->input("unit_id"),
  115. "priority"=>$request->input("priority"),
  116. "unit_price"=>$request->input("unit_price")]);
  117. if ($row == 1) return ["success"=>true];
  118. return ["success"=>false,"data"=>"受影响数据数为:".$row];
  119. }
  120. public function createOutStorageRule(Request $request)
  121. {
  122. if(!Gate::allows('计费模型-作业-编辑')){ return ["success"=>false,"data"=>"无权操作"]; }
  123. /** @var OwnerOutStorageRuleService $service */
  124. $service = app('OwnerOutStorageRuleService');
  125. switch ($request->input("strategy")){
  126. case "起步":
  127. $c = $service->isExist(["owner_price_operation_id"=>$request->input("owner_price_operation_id"),"strategy"=>"起步"]);
  128. if ($c > 0)return ["success"=>false,"data"=>"已存在起步策略"];
  129. break;
  130. case "默认":
  131. $c = $service->isExist(["owner_price_operation_id"=>$request->input("owner_price_operation_id"),"strategy"=>"默认"]);
  132. if ($c > 0)return ["success"=>false,"data"=>"已存在默认策略"];
  133. break;
  134. }
  135. $data = $service->create($request->input());
  136. $data->load("unit");
  137. return ["success"=>true,"data"=>$data];
  138. }
  139. public function getFeatures(Request $request)
  140. {
  141. return ["success"=>true,"data"=>app("FeatureService")->translationFeature($request->input("feature"))];
  142. }
  143. public function addFeature(Request $request)
  144. {
  145. if(!Gate::allows('计费模型-作业-编辑')){ return ["success"=>false,"data"=>"无权操作"]; }
  146. $id = $request->input("id");
  147. $features = $request->input("features");
  148. if (!$id || !$features)return ["success"=>false,"data"=>"非法参数"];
  149. $result = app("FeatureService")->analysisFeature($features);
  150. $feature = $result["feature"];
  151. $stack = [];
  152. if ($feature && ($feature[0]=='|' || $feature[0]=='&'))$feature=substr($feature,1);
  153. for ($i=0;$i<strlen($feature);$i++){
  154. if ($feature[$i] == '(')array_unshift($stack,'(');
  155. if ($feature[$i] == ')'){
  156. if (count($stack) == 0)return ["success"=>false,"data"=>"组标记错误,起始与结束标记必须对应"];
  157. array_shift($stack);
  158. }
  159. }
  160. if (count($stack) > 0)return ["success"=>false,"data"=>"组标记错误,起始与结束标记必须对应"];
  161. $row = app('OwnerOutStorageRuleService')->update(["id"=>$id],["feature"=>$feature]);
  162. if ($row != 1)return ["success"=>false,"data"=>"影响了“".$row."”行"];
  163. OwnerOutStorageRule::$features = $result["map"];
  164. $rule = app('OwnerOutStorageRuleService')->find($id)->append("featureFormat");
  165. return ["success"=>true,"data"=>["featureFormat"=>$rule->featureFormat,"feature"=>$feature]];
  166. }
  167. public function getFeature(Request $request)
  168. {
  169. $features = $request->input("features");
  170. if (!$features)return ["success"=>false,"data"=>"非法参数"];
  171. $result = app("FeatureService")->analysisFeature($features);
  172. $feature = $result["feature"];
  173. $stack = [];
  174. if ($feature && ($feature[0]=='|' || $feature[0]=='&'))$feature=substr($feature,1);
  175. for ($i=0;$i<strlen($feature);$i++){
  176. if ($feature[$i] == '(')array_unshift($stack,'(');
  177. if ($feature[$i] == ')'){
  178. if (count($stack) == 0)return ["success"=>false,"data"=>"组标记错误,起始与结束标记必须对应"];
  179. array_shift($stack);
  180. }
  181. }
  182. if (count($stack) > 0)return ["success"=>false,"data"=>"组标记错误,起始与结束标记必须对应"];
  183. return ["success"=>true,"data"=>$feature];
  184. }
  185. public function operationDestroy($id)
  186. {
  187. if(!Gate::allows('计费模型-作业-删除')){ return ["success"=>false,"data"=>"无权操作"]; }
  188. $row = app("OwnerPriceOperationService")->destroy($id);
  189. if ($row == 1)return ["success"=>true];
  190. return ["success"=>false,"data"=>"影响了“".$row."”行"];
  191. }
  192. public function operationCreate(){
  193. if(!Gate::allows('计费模型-作业-录入')){ return redirect('denied'); }
  194. $owners = app("OwnerService")->getSelection();
  195. $units = app('UnitService')->getSelection();
  196. return response()->view('maintenance.priceModel.operation.create',compact("owners","units"));
  197. }
  198. public function operationStore(Request $request)
  199. {
  200. if(!Gate::allows('计费模型-作业-录入')){ return redirect('denied'); }
  201. $request->offsetSet("rules",json_decode($request->input("rules"),true));
  202. $request->offsetSet("owner_id",explode(',',$request->input("owner_id")));
  203. $this->operationValidator($request->input())->validate();
  204. //录入主表
  205. /** @var OwnerPriceOperationService $service */
  206. $service = app("OwnerPriceOperationService");
  207. $ownerPriceOperation = $service->create([
  208. "operation_type" => $request->input("operation_type"),
  209. "strategy" => $request->input("strategy"),
  210. "name" => $request->input("name"),
  211. "priority" => $request->input("priority"),
  212. "remark" => $request->input("remark"),
  213. "feature" => $request->input("feature"),
  214. ]);
  215. //录入子表
  216. if ($request->input("operation_type") == '入库') $service->insertRule([
  217. "owner_price_operation_id" => $ownerPriceOperation->id,
  218. "amount" => $request->input("rules")[0]["amount"],
  219. "unit_id" => $request->input("rules")[0]["unit_id"],
  220. "unit_price" => $request->input("rules")[0]["unit_price"],
  221. ],"入库");
  222. else{
  223. $insert = [];
  224. foreach ($request->input("rules") as $rule){
  225. $insert[] = [
  226. "owner_price_operation_id" => $ownerPriceOperation->id,
  227. "amount" => $rule["amount"],
  228. "unit_id" => $rule["unit_id"],
  229. "unit_price" => $rule["unit_price"],
  230. "strategy" => $rule["strategy"],
  231. "feature" => $rule["feature"],
  232. "priority" => $rule["priority"],
  233. ];
  234. }
  235. $service->insertRule($insert);
  236. }
  237. //录入中间表
  238. /** @var OwnerPriceOperation $model */
  239. if ($request->input("owner_id"))$model->ownerPriceOperationOwners()->sync($request->input("owner_id"));
  240. return response()->redirectTo("maintenance/priceModel/operation")->with("successTip","创建“".$request->input("name")."”成功");
  241. }
  242. public function operationEdit($id)
  243. {
  244. if(!Gate::allows('计费模型-作业-编辑')){ return redirect('denied'); }
  245. $model = app('OwnerPriceOperationService')->find($id,true,["ownerPriceOperationOwners"]);
  246. $owners = app("OwnerService")->getSelection();
  247. $units = app('UnitService')->getSelection();
  248. return response()->view('maintenance.priceModel.operation.create',compact("owners","units","model"));
  249. }
  250. public function operationUpdate($id,Request $request)
  251. {
  252. if(!Gate::allows('计费模型-作业-编辑')){ return redirect('denied'); }
  253. $request->offsetSet("rules",json_decode($request->input("rules"),true));
  254. $request->offsetSet("owner_id",explode(',',$request->input("owner_id")));
  255. $this->operationValidator($request->input(),$id)->validate();
  256. /** @var OwnerPriceOperationService $service */
  257. $service = app("OwnerPriceOperationService");
  258. $model = $service->find($id);
  259. $service->findUpdate($model,[
  260. "name" => $request->input("name"),
  261. "priority" => $request->input("priority"),
  262. "remark" => $request->input("remark"),
  263. "feature" => $request->input("feature"),
  264. ]);
  265. $service->destroyRule($id, $model->operation_type);
  266. //录入子表
  267. if ($request->input("operation_type") == '入库') $service->insertRule([
  268. "owner_price_operation_id" => $model->id,
  269. "amount" => $request->input("rules")[0]["amount"],
  270. "unit_id" => $request->input("rules")[0]["unit_id"],
  271. "unit_price" => $request->input("rules")[0]["unit_price"],
  272. ],"入库");
  273. else{
  274. $insert = [];
  275. foreach ($request->input("rules") as $rule){
  276. $insert[] = [
  277. "owner_price_operation_id" => $model->id,
  278. "amount" => $rule["amount"],
  279. "unit_id" => $rule["unit_id"],
  280. "unit_price" => $rule["unit_price"],
  281. "strategy" => $rule["strategy"],
  282. "feature" => $rule["feature"],
  283. "priority" => $rule["priority"],
  284. ];
  285. }
  286. $service->insertRule($insert);
  287. }
  288. //录入中间表
  289. /** @var OwnerPriceOperation $model */
  290. if ($request->input("owner_id"))$model->ownerPriceOperationOwners()->sync($request->input("owner_id"));
  291. return response()->redirectTo("maintenance/priceModel/operation")->with("successTip","修改“".$request->input("name")."”成功");
  292. }
  293. private function operationValidator(array $params, $id= null)
  294. {
  295. return Validator::make($params,[
  296. //required_with:id
  297. 'operation_type'=>['required'],
  298. 'owner_id'=>[function ($attribute, $value, $fail)use($params,$id) {
  299. if ($params["strategy"] == '默认'){
  300. $owners = Owner::query()->whereIn("id",$value)->withCount(["ownerPriceOperations"=>function($query)use($params,$id){
  301. if ($id)$query->where('id',"!=",$id);
  302. $query->where("strategy","默认")->where("operation_type",$params["operation_type"]);
  303. }])->get();
  304. $err = [];
  305. foreach ($owners as $owner){
  306. if ($owner->owner_price_operations_count > 0)$err[] = $owner->name;
  307. }
  308. if (count($err)>0)$fail("(".implode(',',$err).') 已经绑定'.$params["operation_type"].'的默认策略');
  309. }
  310. }],
  311. 'strategy'=>['required'],
  312. 'name'=>['required',$id?"unique:owner_price_operations,name,$id":'unique:owner_price_operations,name'],
  313. 'priority'=>['required','integer','min:0','max:100'],
  314. 'rules.*.strategy'=>['required_if:operation_type,出库'],
  315. 'rules.*.amount'=>['required',"integer"],
  316. 'rules.*.unit_id'=>['required','integer'],
  317. 'rules.*.unit_price'=>['required','numeric',"min:0"],
  318. 'rules.*.priority'=>['required_if:operation_type,出库','integer','min:0','max:100'],
  319. ],[
  320. 'required'=>':attribute 为必填项',
  321. 'min'=>':attribute 不得小于0',
  322. 'integer'=>':attribute 必须为整数',
  323. 'numeric'=>':attribute 必须为数字',
  324. 'max'=>':attribute 超出最大值',
  325. 'required_if'=>':attribute 操作类型为出库时不得为空',
  326. ],[
  327. 'operation_type' =>"操作类型",
  328. 'strategy' =>"计费策略",
  329. 'name' =>"名称",
  330. 'priority' =>"优先级",
  331. ]);
  332. }
  333. public function expressIndex(){
  334. if(!Gate::allows('计费模型-快递-查询')){ return redirect('denied'); }
  335. $models = app('OwnerPriceExpressService')->paginate();
  336. return response()->view('maintenance.priceModel.express.index',compact("models"));
  337. }
  338. public function expressGetDetail(Request $request)
  339. {
  340. if(!Gate::allows('计费模型-快递-查询')){ return ["success"=>false,"data"=>"无权操作"]; }
  341. $model = new OwnerPriceExpress();
  342. $model->id = $request->input("id");
  343. $model->load(["details"=>function($query){$query->with("province");}]);
  344. return ["success"=>true,"data"=>$model->details];
  345. }
  346. public function expressUpdateDetail(Request $request)
  347. {
  348. if(!Gate::allows('计费模型-快递-编辑')){ return ["success"=>false,"data"=>"无权操作"]; }
  349. $detail = $request->input("detail");
  350. if ($detail["id"]){
  351. app('OwnerPriceExpressService')->updateDetail(["id"=>$detail["id"]],[
  352. "additional_weight_price" => $detail["additional_weight_price"],
  353. "initial_weight_price" => $detail["initial_weight_price"],
  354. ]);
  355. }else{
  356. $row = app('OwnerPriceExpressService')->isExistDetail(["owner_price_express_id"=>$request->input("id"),"province_id"=>$detail["province_id"]]);
  357. if ($row>0)return ["success"=>false,"data"=>"已存在该省份计费模型"];
  358. /** @var OwnerPriceExpressProvince $detail */
  359. $detail = app('OwnerPriceExpressService')->createDetail([
  360. "owner_price_express_id" => $request->input("id"),
  361. "province_id" => $detail["province_id"],
  362. "additional_weight_price" => $detail["additional_weight_price"],
  363. "initial_weight_price" => $detail["initial_weight_price"],
  364. ]);
  365. $detail->load("province");
  366. }
  367. return ["success"=>true,"data"=>$detail];
  368. }
  369. public function expressDestroyDetail(Request $request)
  370. {
  371. if(!Gate::allows('计费模型-快递-删除')){ return ["success"=>false,"data"=>"无权操作"]; }
  372. $id = $request->input("id");
  373. if (!$id)return ["success"=>false,"data"=>"非法参数"];
  374. app("OwnerPriceExpressService")->destroyDetail($id);
  375. return ["success"=>true];
  376. }
  377. public function expressImport(Request $request){
  378. if(!Gate::allows('计费模型-快递-录入')){ return ["success"=>false,"data"=>"无权操作"]; }
  379. $fileSuffix=$request->file('file')->getClientOriginalExtension();
  380. if ($fileSuffix != 'xlsx' && $fileSuffix != 'xls' && $fileSuffix != 'csv')
  381. return ['success'=>false,'data'=>'不支持该文件类型'];
  382. ini_set('max_execution_time',2500);
  383. ini_set('memory_limit','1526M');
  384. $fileSuffix = ucwords($fileSuffix);
  385. /** @var OwnerPriceExpress $model */
  386. $model = app('OwnerPriceExpressService')->find($request->input("id"),["details"]);
  387. Excel::import(new ExpressImport($model),$request->file('file')->path(),null,$fileSuffix);
  388. if (Cache::has('express'))return Cache::pull('express');
  389. return ["success"=>false,"data"=>"导入发生错误,数据无响应"];
  390. }
  391. public function expressCreate(){
  392. if(!Gate::allows('计费模型-快递-录入')){ return redirect('denied'); }
  393. $logistics = app("LogisticService")->getSelection();
  394. $owners = app("OwnerService")->getSelection();
  395. $units = app("UnitService")->getSelection();
  396. return response()->view('maintenance.priceModel.express.create',compact("logistics","owners","units"));
  397. }
  398. public function expressStore(Request $request)
  399. {
  400. if(!Gate::allows('计费模型-快递-录入')){ return redirect('denied'); }
  401. $request->offsetSet("owner_id",explode(",",$request->input("owner_id")));
  402. $request->offsetSet("logistic_id",explode(",",$request->input("logistic_id")));
  403. $this->expressValidator($request->input())->validate();
  404. /** @var OwnerPriceExpress $model */
  405. $model = app("OwnerPriceExpressService")->create([
  406. "name" => $request->input("name"),
  407. "initial_weight_unit_id" => $request->input("initial_weight_unit_id"),
  408. "additional_weight_unit_id" => $request->input("additional_weight_unit_id"),
  409. ]);
  410. $model->owners()->sync($request->input("owner_id"));
  411. $model->logistics()->sync($request->input("logistic_id"));
  412. return response()->redirectTo("maintenance/priceModel/express")->with("successTip","录入“".$request->input("name")."”成功");
  413. }
  414. public function expressEdit($id)
  415. {
  416. if(!Gate::allows('计费模型-快递-编辑')){ return redirect('denied'); }
  417. /** @var OwnerPriceExpress $model */
  418. $model = app('OwnerPriceExpressService')->find($id)->append(["owner_id","logistic_id"]);
  419. $owners = app("OwnerService")->getSelection();
  420. $logistics = app('LogisticService')->getSelection();
  421. $units = app('UnitService')->getSelection();
  422. return response()->view('maintenance.priceModel.express.create',compact("owners","logistics","model","units"));
  423. }
  424. public function expressUpdate($id,Request $request)
  425. {
  426. if(!Gate::allows('计费模型-快递-编辑')){ return redirect('denied'); }
  427. $request->offsetSet("owner_id",explode(",",$request->input("owner_id")));
  428. $request->offsetSet("logistic_id",explode(",",$request->input("logistic_id")));
  429. $this->expressValidator($request->input(),$id)->validate();
  430. /** @var OwnerPriceExpress $model */
  431. app("OwnerPriceExpressService")->update(["id"=>$id],[
  432. "name" => $request->input("name"),
  433. "initial_weight_unit_id" => $request->input("initial_weight_unit_id"),
  434. "additional_weight_unit_id" => $request->input("additional_weight_unit_id"),
  435. ]);
  436. $model = new OwnerPriceExpress();
  437. $model->id = $id;
  438. $model->owners()->sync($request->input("owner_id"));
  439. $model->logistics()->sync($request->input("logistic_id"));
  440. return response()->redirectTo("maintenance/priceModel/express")->with("successTip","修改“".$request->input("name")."”成功");
  441. }
  442. private function expressValidator(array $params, $id=null)
  443. {
  444. return Validator::make($params,[
  445. 'name'=>['required',$id?"unique:owner_price_expresses,name,$id":'unique:owner_price_expresses,name'],
  446. 'initial_weight_unit_id'=>['required'],
  447. 'additional_weight_unit_id'=>['required'],
  448. 'owner_id'=>[function ($attribute, $value, $fail)use($id) {
  449. $owners = app("OwnerPriceExpressService")->getExistOwnerName($value,$id);
  450. if ($owners)$fail("(".implode(',',$owners).') 已经绑定计费模型');
  451. }],
  452. 'logistic_id'=>[function ($attribute, $value, $fail)use($id) {
  453. $logistics = app("OwnerPriceExpressService")->getExistLogisticName($value,$id);
  454. if ($logistics)$fail("(".implode(',',$logistics).') 已经绑定计费模型');
  455. }],
  456. ],[
  457. 'required'=>':attribute 为必填项',
  458. 'unique' => ':attribute 已存在',
  459. ],[
  460. 'name' =>"名称",
  461. 'initial_weight_unit_id' =>"首重单位",
  462. 'additional_weight_unit_id' =>"续重单位",
  463. ]);
  464. }
  465. public function expressDestroy($id)
  466. {
  467. if(!Gate::allows('计费模型-快递-删除')){ return ["success"=>false,"data"=>"无权操作"]; };
  468. app("OwnerPriceExpressService")->destroy($id);
  469. return ["success"=>true];
  470. }
  471. public function logisticIndex()
  472. {
  473. if(!Gate::allows('计费模型-物流-查询')){ return redirect('denied'); }
  474. $models = app("OwnerPriceLogisticService")->paginate()->append(["unit_range_json","other_unit_range_json"]);
  475. return response()->view('maintenance.priceModel.logistic.index',compact("models"));
  476. }
  477. public function logisticCreate()
  478. {
  479. if(!Gate::allows('计费模型-物流-录入')){ return redirect('denied'); }
  480. $owners = app("OwnerService")->getSelection();
  481. $logistics = app('LogisticService')->getSelection();
  482. $units = app('UnitService')->getSelection();
  483. return response()->view('maintenance.priceModel.logistic.create',compact("owners","logistics","units"));
  484. }
  485. public function logisticStore(Request $request)
  486. {
  487. if(!Gate::allows('计费模型-物流-录入')){ return redirect('denied'); }
  488. $request->offsetSet("owner_id",explode(",",$request->input("owner_id")));
  489. $request->offsetSet("logistic_id",explode(",",$request->input("logistic_id")));
  490. $this->logisticValidator($request->input())->validate();
  491. /** @var OwnerPriceLogistic $model */
  492. $model = app("OwnerPriceLogisticService")->create([
  493. "name" => $request->input("name"),
  494. "pick_up_price" => $request->input("pick_up_price"),
  495. "fuel_price" => $request->input("fuel_price"),
  496. "service_price" => $request->input("service_price"),
  497. "unit_id" => $request->input("unit_id"),
  498. "unit_range" => $request->input("unit_range"),
  499. "other_unit_id" => $request->input("other_unit_id"),
  500. "other_unit_range" => $request->input("other_unit_range"),
  501. ]);
  502. $model->owners()->sync($request->input("owner_id"));
  503. $model->logistics()->sync($request->input("logistic_id"));
  504. return response()->redirectTo("maintenance/priceModel/logistic")->with("successTip","创建“".$request->input("name")."”成功");
  505. }
  506. public function logisticEdit($id)
  507. {
  508. if(!Gate::allows('计费模型-物流-编辑')){ return redirect('denied'); }
  509. $owners = app("OwnerService")->getSelection();
  510. $logistics = app('LogisticService')->getSelection();
  511. $units = app('UnitService')->getSelection();
  512. $model = app("OwnerPriceLogisticService")->find($id)->append(["owner_id","logistic_id"]);
  513. return response()->view('maintenance.priceModel.logistic.create',compact("owners","logistics","units","model"));
  514. }
  515. public function logisticUpdate($id, Request $request)
  516. {
  517. if(!Gate::allows('计费模型-物流-编辑')){ return redirect('denied'); }
  518. $request->offsetSet("owner_id",explode(",",$request->input("owner_id")));
  519. $request->offsetSet("logistic_id",explode(",",$request->input("logistic_id")));
  520. $this->logisticValidator($request->input(),$id)->validate();
  521. app("OwnerPriceLogisticService")->update(["id"=>$id],[
  522. "name" => $request->input("name"),
  523. "pick_up_price" => $request->input("pick_up_price"),
  524. "fuel_price" => $request->input("fuel_price"),
  525. "service_price" => $request->input("service_price"),
  526. "unit_id" => $request->input("unit_id"),
  527. "unit_range" => $request->input("unit_range"),
  528. "other_unit_id" => $request->input("other_unit_id"),
  529. "other_unit_range" => $request->input("other_unit_range"),
  530. ]);
  531. $model = new OwnerPriceLogistic();
  532. $model->id = $id;
  533. $model->owners()->sync($request->input("owner_id"));
  534. $model->logistics()->sync($request->input("logistic_id"));
  535. return response()->redirectTo("maintenance/priceModel/logistic")->with("successTip","修改“".$request->input("name")."”成功");
  536. }
  537. public function logisticGetDetail(Request $request)
  538. {
  539. if(!Gate::allows('计费模型-物流-查询')){ return ["success"=>false,"data"=>"无权操作"]; }
  540. $model = new OwnerPriceLogistic();
  541. $model->id = $request->input("id");
  542. $model->load(["details"=>function($query){
  543. /** @var Builder $query */
  544. $query->with(["unit","province","city"]);
  545. }]);
  546. return ["success"=>true,"data"=>$model->details];
  547. }
  548. public function expressExport($id)
  549. {
  550. }
  551. private function logisticValidator(array $params,$id = null)
  552. {
  553. return Validator::make($params,[
  554. 'name'=>['required',$id?"unique:owner_price_logistics,name,$id":'unique:owner_price_logistics,name'],
  555. 'pick_up_price'=>['nullable','numeric','min:0'],
  556. 'fuel_price'=>['nullable','numeric','min:0'],
  557. 'service_price'=>['nullable','numeric','min:0'],
  558. 'unit_id'=>['required'],
  559. 'unit_range'=>['required'],
  560. 'other_unit_id'=>['required'],
  561. 'other_unit_range'=>['required'],
  562. ],[
  563. 'required'=>':attribute 为必填项',
  564. 'unique' => ':attribute 已存在',
  565. 'numeric' => ':attribute 必须为数字',
  566. 'min' => ':attribute 不得为负',
  567. ],[
  568. 'name' =>"名称",
  569. 'pick_up_price' =>"提货费",
  570. 'fuel_price' =>"燃油附加费",
  571. 'service_price' =>"信息服务费",
  572. 'unit_id' =>"单位一",
  573. 'unit_range' =>"区间值",
  574. 'other_unit_id' =>"单位二",
  575. 'other_unit_range' =>"区间值",
  576. ]);
  577. }
  578. public function directLogisticIndex(){
  579. if(!Gate::allows('计费模型-直发-查询')){ return redirect('denied'); }
  580. return response()->view('maintenance.priceModel.directLogistic.index');
  581. }
  582. public function directLogisticCreate(){
  583. if(!Gate::allows('计费模型-直发-录入')){ return redirect('denied'); }
  584. return response()->view('maintenance.priceModel.directLogistic.create');
  585. }
  586. }