PriceModelController.php 66 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Components\AsyncResponse;
  4. use App\Imports\ExpressImport;
  5. use App\Imports\OwnerPriceDirectLogisticDetailImport;
  6. use App\Imports\OwnerPriceLogisticDetailImport;
  7. use App\Owner;
  8. use App\OwnerPriceDirectLogistic;
  9. use App\OwnerPriceDirectLogisticCar;
  10. use App\OwnerPriceExpress;
  11. use App\OwnerPriceExpressProvince;
  12. use App\OwnerPriceLogistic;
  13. use App\OwnerPriceLogisticDetail;
  14. use App\OwnerPriceOperation;
  15. use App\OwnerPriceOperationItem;
  16. use App\OwnerStoragePriceModel;
  17. use App\Services\common\BatchUpdateService;
  18. use App\Services\common\ExportService;
  19. use App\Services\LogService;
  20. use App\Services\OwnerPriceOperationItemService;
  21. use App\Services\OwnerPriceOperationService;
  22. use Illuminate\Database\Eloquent\Builder;
  23. use Illuminate\Database\Eloquent\Collection;
  24. use Illuminate\Http\Request;
  25. use Illuminate\Support\Facades\Cache;
  26. use Illuminate\Support\Facades\DB;
  27. use Illuminate\Support\Facades\Gate;
  28. use Illuminate\Support\Facades\Validator;
  29. use Maatwebsite\Excel\Facades\Excel;
  30. class PriceModelController extends Controller
  31. {
  32. use AsyncResponse;
  33. public function storageIndex(Request $request)
  34. {
  35. if(!Gate::allows('计费模型-仓储')){ return redirect('denied'); }
  36. $models = app('OwnerStoragePriceModelService')->paginate($request->input("id"),["unit"]);
  37. return response()->view('maintenance.priceModel.storage.index',compact("models"));
  38. }
  39. public function storageCreate()
  40. {
  41. if(!Gate::allows('计费模型-仓储-录入')){ return redirect('denied'); }
  42. $units = app('UnitService')->getSelection();
  43. return response()->view('maintenance.priceModel.storage.create',compact("units"));
  44. }
  45. public function storageStore(Request $request)
  46. {
  47. if(!Gate::allows('计费模型-仓储-录入')){ return redirect('denied'); }
  48. $this->storageValidator($request->input())->validate();
  49. app('OwnerStoragePriceModelService')->create($request->input());
  50. LogService::log(__METHOD__,"计费模型-创建仓储计费",json_encode($request->input(),JSON_UNESCAPED_UNICODE));
  51. return response()->redirectTo('maintenance/priceModel/storage')->with('successTip',"创建成功!");
  52. }
  53. public function storageEdit($id)
  54. {
  55. if(!Gate::allows('计费模型-仓储-编辑')){ return redirect('denied'); }
  56. $model = app('OwnerStoragePriceModelService')->find($id);
  57. $units = app('UnitService')->getSelection();
  58. return response()->view('maintenance.priceModel.storage.create',compact("units","model"));
  59. }
  60. public function storageUpdate(Request $request)
  61. {
  62. if(!Gate::allows('计费模型-仓储-编辑')){ return redirect('denied'); }
  63. app('OwnerStoragePriceModelService')->update(["id"=>$request->input("id")],[
  64. "counting_type" => $request->input("counting_type"),
  65. "name" => $request->input("name"),
  66. "using_type" => $request->input("using_type"),
  67. "minimum_area" => $request->input("minimum_area"),
  68. "price" => $request->input("price"),
  69. "discount_type" => $request->input("discount_type"),
  70. "discount_value"=> $request->input("discount_value"),
  71. "unit_id" => $request->input("unit_id"),
  72. ]);
  73. LogService::log(__METHOD__,"计费模型-修改仓储计费",json_encode($request->input(),JSON_UNESCAPED_UNICODE));
  74. return response()->redirectTo('maintenance/priceModel/storage')->with('successTip',"更新成功!");
  75. }
  76. public function storageDestroy($id)
  77. {
  78. app("OwnerStoragePriceModelService")->destroy($id);
  79. LogService::log(__METHOD__,"计费模型-删除仓储计费",$id);
  80. return ["success"=>true];
  81. }
  82. private function storageValidator(array $params)
  83. {
  84. return Validator::make($params,[
  85. 'name'=>['required'],
  86. 'counting_type'=>['required'],
  87. 'using_type'=>['required'],
  88. 'minimum_area'=>['nullable','numeric','min:0'],
  89. 'discount_value'=>['nullable','numeric','min:0'],
  90. 'price'=>['required','numeric','min:0'],
  91. 'discount_type'=>['required'],
  92. 'unit_id'=>['required','integer'],
  93. ],[
  94. 'required'=>':attribute 为必填项',
  95. 'min'=>':attribute 不得小于0',
  96. 'integer'=>':attribute 未选择',
  97. ],[
  98. 'name' =>"名称",
  99. 'counting_type' =>"计费类型",
  100. 'using_type' =>"用仓类型",
  101. 'minimum_area' =>"最低起租面积",
  102. 'price' =>"单价",
  103. 'discount_type' =>"减免类型",
  104. 'discount_value'=>"减免值",
  105. 'unit_id' =>"单位",
  106. ]);
  107. }
  108. public function operationIndex(Request $request){
  109. if(!Gate::allows('计费模型-作业-查询')){ return redirect('denied'); }
  110. $features = app("FeatureService")->getMapArray();
  111. OwnerPriceOperation::$features = $features;
  112. $models = app('OwnerPriceOperationService')->paginate($request->input(),["ownerPriceOperationOwners","items.unit"])->append("featureFormat");
  113. $owners = app("OwnerService")->getIntersectPermitting();
  114. return response()->view('maintenance.priceModel.operation.index',compact("models","owners"));
  115. }
  116. /* 获取出库模型规则 */
  117. public function getItems(Request $request)
  118. {
  119. if(!Gate::allows('计费模型-作业-查询')){ return ["success"=>false,"data"=>"无权操作"]; }
  120. /** @var OwnerPriceOperationItemService $service */
  121. $service = app('OwnerPriceOperationItemService');
  122. $items = $service->get(["owner_price_operation_id"=>$request->input("id")],["unit"],true)->append("featureFormat");
  123. return ["success"=>true,"data"=>$items];
  124. }
  125. /* 修改子规则 */
  126. public function updateItem(Request $request)
  127. {
  128. if(!Gate::allows('计费模型-作业-编辑')){ return ["success"=>false,"data"=>"无权操作"]; }
  129. /** @var OwnerPriceOperationItemService $service */
  130. $service = app('OwnerPriceOperationItemService');
  131. $row = $service->update(["id"=>$request->input("id")],[
  132. "amount"=>$request->input("amount"),
  133. "unit_id"=>$request->input("unit_id"),
  134. "priority"=>$request->input("priority"),
  135. "unit_price"=>$request->input("unit_price")]);
  136. if ($row == 1){
  137. LogService::log(__METHOD__,"计费模型-修改出库规则",json_encode($request->input()));
  138. return ["success"=>true];
  139. }
  140. return ["success"=>false,"data"=>"受影响数据数为:".$row];
  141. }
  142. public function createItem(Request $request)
  143. {
  144. if(!Gate::allows('计费模型-作业-编辑')){ return ["success"=>false,"data"=>"无权操作"]; }
  145. /** @var OwnerPriceOperationItemService $service */
  146. $service = app('OwnerPriceOperationItemService');
  147. switch ($request->input("strategy")){
  148. case "起步":
  149. $c = $service->isExist(["owner_price_operation_id"=>$request->input("owner_price_operation_id"),"strategy"=>"起步"]);
  150. if ($c > 0)return ["success"=>false,"data"=>"已存在起步策略"];
  151. break;
  152. case "默认":
  153. $c = $service->isExist(["owner_price_operation_id"=>$request->input("owner_price_operation_id"),"strategy"=>"默认"]);
  154. if ($c > 0)return ["success"=>false,"data"=>"已存在默认策略"];
  155. break;
  156. }
  157. $data = $service->create($request->input());
  158. $data->load("unit");
  159. return ["success"=>true,"data"=>$data];
  160. }
  161. public function getFeatures(Request $request)
  162. {
  163. return ["success"=>true,"data"=>app("FeatureService")->translationFeature($request->input("feature"))];
  164. }
  165. public function addFeature(Request $request)
  166. {
  167. if(!Gate::allows('计费模型-作业-编辑')){ return ["success"=>false,"data"=>"无权操作"]; }
  168. $id = $request->input("id");
  169. $features = $request->input("features");
  170. if (!$id || !$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. $row = app('OwnerPriceOperationItemService')->update(["id"=>$id],["feature"=>$feature]);
  184. if ($row != 1)return ["success"=>false,"data"=>"影响了“".$row."”行"];
  185. LogService::log(__METHOD__,"计费模型-修改出库特征",json_encode($request->input()));
  186. OwnerPriceOperationItem::$features = $result["map"];
  187. $rule = app('OwnerPriceOperationItemService')->find($id)->append("featureFormat");
  188. return ["success"=>true,"data"=>["featureFormat"=>$rule->featureFormat,"feature"=>$feature]];
  189. }
  190. public function getFeature(Request $request)
  191. {
  192. $features = $request->input("features");
  193. if (!$features)return ["success"=>false,"data"=>"非法参数"];
  194. $result = app("FeatureService")->analysisFeature($features);
  195. $feature = $result["feature"];
  196. $stack = [];
  197. if ($feature && ($feature[0]=='|' || $feature[0]=='&'))$feature=substr($feature,1);
  198. for ($i=0;$i<strlen($feature);$i++){
  199. if ($feature[$i] == '(')array_unshift($stack,'(');
  200. if ($feature[$i] == ')'){
  201. if (count($stack) == 0)return ["success"=>false,"data"=>"组标记错误,起始与结束标记必须对应"];
  202. array_shift($stack);
  203. }
  204. }
  205. if (count($stack) > 0)return ["success"=>false,"data"=>"组标记错误,起始与结束标记必须对应"];
  206. if ($request->has("isFormat"))$this->success(["feature"=>$feature,"featureFormat"=>app("FeatureService")->formatFeature($result["map"], $feature)]);
  207. $this->success($feature);
  208. }
  209. public function operationDestroy($id)
  210. {
  211. if(!Gate::allows('计费模型-作业-删除')){ return ["success"=>false,"data"=>"无权操作"]; }
  212. $row = app("OwnerPriceOperationService")->destroy($id);
  213. if ($row == 1){
  214. LogService::log(__METHOD__,"计费模型-删除作业计费",$id);
  215. return ["success"=>true];
  216. }
  217. return ["success"=>false,"data"=>"影响了“".$row."”行"];
  218. }
  219. public function operationCreate(){
  220. if(!Gate::allows('计费模型-作业-录入')){ return redirect('denied'); }
  221. $owners = app("OwnerService")->getIntersectPermitting();
  222. $units = app('UnitService')->getSelection();
  223. return response()->view('maintenance.priceModel.operation.create',compact("owners","units"));
  224. }
  225. public function operationStore(Request $request)
  226. {
  227. if(!Gate::allows('计费模型-作业-录入')){ return redirect('denied'); }
  228. $request->offsetSet("items",json_decode($request->input("items"),true));
  229. $request->offsetSet("owner_id",explode(',',$request->input("owner_id")));
  230. $this->operationValidator($request->input())->validate();
  231. //录入主表
  232. /** @var OwnerPriceOperationService $service */
  233. $service = app("OwnerPriceOperationService");
  234. $ownerPriceOperation = $service->create([
  235. "operation_type" => $request->input("operation_type"),
  236. "strategy" => $request->input("strategy"),
  237. "name" => $request->input("name"),
  238. "priority" => $request->input("priority"),
  239. "remark" => $request->input("remark"),
  240. "feature" => $request->input("feature"),
  241. ]);
  242. //录入子表
  243. $insert = [];
  244. foreach ($request->input("items") as $rule){
  245. $insert[] = [
  246. "owner_price_operation_id" => $ownerPriceOperation->id,
  247. "amount" => $rule["amount"],
  248. "unit_id" => $rule["unit_id"],
  249. "unit_price" => $rule["unit_price"],
  250. "strategy" => $rule["strategy"],
  251. "feature" => $rule["feature"],
  252. "priority" => $rule["priority"],
  253. ];
  254. }
  255. $service->insertItem($insert);
  256. //录入中间表
  257. /** @var OwnerPriceOperation $ownerPriceOperation */
  258. if ($request->input("owner_id"))$ownerPriceOperation->ownerPriceOperationOwners()->sync($request->input("owner_id"));
  259. LogService::log(__METHOD__,"计费模型-录入作业计费",json_encode($request->input(),JSON_UNESCAPED_UNICODE));
  260. return response()->redirectTo("maintenance/priceModel/operation")->with("successTip","创建“".$request->input("name")."”成功");
  261. }
  262. public function operationEdit($id)
  263. {
  264. if(!Gate::allows('计费模型-作业-编辑')){ return redirect('denied'); }
  265. $model = app('OwnerPriceOperationService')->find($id,["items"]);
  266. $owners = app("OwnerService")->getIntersectPermitting();
  267. $units = app('UnitService')->getSelection();
  268. return response()->view('maintenance.priceModel.operation.create',compact("owners","units","model"));
  269. }
  270. public function operationUpdate($id,Request $request)
  271. {
  272. if(!Gate::allows('计费模型-作业-编辑')){ return redirect('denied'); }
  273. $request->offsetSet("items",json_decode($request->input("items"),true));
  274. $request->offsetSet("owner_id",explode(',',$request->input("owner_id")));
  275. $this->operationValidator($request->input(),$id)->validate();
  276. /** @var OwnerPriceOperationService $service */
  277. $service = app("OwnerPriceOperationService");
  278. $model = $service->find($id);
  279. $service->findUpdate($model,[
  280. "name" => $request->input("name"),
  281. "priority" => $request->input("priority"),
  282. "remark" => $request->input("remark"),
  283. "feature" => $request->input("feature"),
  284. ]);
  285. $service->destroyItem($id);
  286. //录入子表
  287. $insert = [];
  288. foreach ($request->input("items") as $rule){
  289. $insert[] = [
  290. "owner_price_operation_id" => $model->id,
  291. "amount" => $rule["amount"],
  292. "unit_id" => $rule["unit_id"],
  293. "unit_price" => $rule["unit_price"],
  294. "strategy" => $rule["strategy"],
  295. "feature" => $rule["feature"],
  296. "priority" => $rule["priority"],
  297. ];
  298. }
  299. $service->insertItem($insert);
  300. //录入中间表
  301. /** @var OwnerPriceOperation $model */
  302. if ($request->input("owner_id"))$model->ownerPriceOperationOwners()->sync($request->input("owner_id"));
  303. LogService::log(__METHOD__,"计费模型-修改作业计费",json_encode($request->input(),JSON_UNESCAPED_UNICODE));
  304. return response()->redirectTo("maintenance/priceModel/operation")->with("successTip","修改“".$request->input("name")."”成功");
  305. }
  306. private function operationValidator(array $params, $id= null)
  307. {
  308. return Validator::make($params,[
  309. 'operation_type'=>['required'],
  310. 'owner_id'=>[function ($attribute, $value, $fail)use($params,$id) {
  311. if ($params["strategy"] == '默认'){
  312. $owners = Owner::query()->whereIn("id",$value)->withCount(["ownerPriceOperations"=>function($query)use($params,$id){
  313. if ($id)$query->where('id',"!=",$id);
  314. $query->where("strategy","默认")->where("operation_type",$params["operation_type"]);
  315. }])->get();
  316. $err = [];
  317. foreach ($owners as $owner){
  318. if ($owner->owner_price_operations_count > 0)$err[] = $owner->name;
  319. }
  320. if (count($err)>0)$fail("(".implode(',',$err).') 已经绑定'.$params["operation_type"].'的默认策略');
  321. }
  322. }],
  323. 'strategy'=>['required'],
  324. 'name'=>['required',$id?"unique:owner_price_operations,name,$id":'unique:owner_price_operations,name'],
  325. 'priority'=>['sometimes','required','integer','min:0','max:100'],
  326. 'items.*.strategy'=>['required'],
  327. 'items.*.amount'=>["required","integer"],
  328. 'items.*.unit_id'=>['required','integer'],
  329. 'items.*.unit_price'=>['required','numeric',"min:0"],
  330. ],[
  331. 'required'=>':attribute 为必填项',
  332. 'min'=>':attribute 不得小于0',
  333. 'integer'=>':attribute 必须为整数',
  334. 'numeric'=>':attribute 必须为数字',
  335. 'max'=>':attribute 超出最大值',
  336. 'required_if'=>':attribute 操作类型为出库时不得为空',
  337. ],[
  338. 'operation_type' =>"操作类型",
  339. 'strategy' =>"计费策略",
  340. 'name' =>"名称",
  341. ]);
  342. }
  343. public function expressIndex(Request $request){
  344. if(!Gate::allows('计费模型-快递-查询')){ return redirect('denied'); }
  345. $models = app('OwnerPriceExpressService')->paginate($request->input("id"));
  346. return response()->view('maintenance.priceModel.express.index',compact("models"));
  347. }
  348. public function expressGetDetail(Request $request)
  349. {
  350. if(!Gate::allows('计费模型-快递-查询')){ return ["success"=>false,"data"=>"无权操作"]; }
  351. $model = new OwnerPriceExpress();
  352. $model->id = $request->input("id");
  353. $model->load(["details"=>function($query){$query->with("province");}]);
  354. return ["success"=>true,"data"=>$model->details];
  355. }
  356. public function expressUpdateDetail(Request $request)
  357. {
  358. if(!Gate::allows('计费模型-快递-编辑')){ return ["success"=>false,"data"=>"无权操作"]; }
  359. $detail = $request->input("detail");
  360. if ($detail["id"]){
  361. app('OwnerPriceExpressService')->updateDetail(["id"=>$detail["id"]],[
  362. "additional_weight_price" => $detail["additional_weight_price"],
  363. "initial_weight_price" => $detail["initial_weight_price"],
  364. ]);
  365. }else{
  366. $row = app('OwnerPriceExpressService')->isExistDetail(["owner_price_express_id"=>$request->input("id"),"province_id"=>$detail["province_id"]]);
  367. if ($row>0)return ["success"=>false,"data"=>"已存在该省份计费模型"];
  368. /** @var OwnerPriceExpressProvince $detail */
  369. $detail = app('OwnerPriceExpressService')->createDetail([
  370. "owner_price_express_id" => $request->input("id"),
  371. "province_id" => $detail["province_id"],
  372. "additional_weight_price" => $detail["additional_weight_price"],
  373. "initial_weight_price" => $detail["initial_weight_price"],
  374. ]);
  375. $detail->load("province");
  376. }
  377. LogService::log(__METHOD__,"计费模型-修改快递计费",json_encode($request->input(),JSON_UNESCAPED_UNICODE));
  378. return ["success"=>true,"data"=>$detail];
  379. }
  380. public function expressDestroyDetail(Request $request)
  381. {
  382. if(!Gate::allows('计费模型-快递-删除')){ return ["success"=>false,"data"=>"无权操作"]; }
  383. $id = $request->input("id");
  384. if (!$id)return ["success"=>false,"data"=>"非法参数"];
  385. app("OwnerPriceExpressService")->destroyDetail($id);
  386. LogService::log(__METHOD__,"计费模型-删除快递计费",$id);
  387. return ["success"=>true];
  388. }
  389. public function expressImport(Request $request){
  390. if(!Gate::allows('计费模型-快递-录入')){ return ["success"=>false,"data"=>"无权操作"]; }
  391. $fileSuffix=$request->file('file')->getClientOriginalExtension();
  392. if ($fileSuffix != 'xlsx' && $fileSuffix != 'xls' && $fileSuffix != 'csv')
  393. return ['success'=>false,'data'=>'不支持该文件类型'];
  394. ini_set('max_execution_time',2500);
  395. ini_set('memory_limit','1526M');
  396. $fileSuffix = ucwords($fileSuffix);
  397. if (!$request->has("id")){
  398. Excel::import(new ExpressImport(null),$request->file('file')->path(),null,$fileSuffix);
  399. }else{
  400. /** @var OwnerPriceExpress $model */
  401. $model = app('OwnerPriceExpressService')->find($request->input("id"),["details"]);
  402. Excel::import(new ExpressImport($model),$request->file('file')->path(),null,$fileSuffix);
  403. }
  404. if (Cache::has('express'))return Cache::pull('express');
  405. return ["success"=>false,"data"=>"导入发生错误,数据无响应"];
  406. }
  407. public function expressCreate(){
  408. if(!Gate::allows('计费模型-快递-录入')){ return redirect('denied'); }
  409. $logistics = app("LogisticService")->getSelection();
  410. $owners = app("OwnerService")->getIntersectPermitting();
  411. return response()->view('maintenance.priceModel.express.create',compact("logistics","owners"));
  412. }
  413. public function expressStore(Request $request)
  414. {
  415. if(!Gate::allows('计费模型-快递-录入')){ return redirect('denied'); }
  416. $request->offsetSet("owner_id",explode(",",$request->input("owner_id")));
  417. $request->offsetSet("logistic_id",explode(",",$request->input("logistic_id")));
  418. $this->expressValidator($request->input())->validate();
  419. /** @var OwnerPriceExpress $model */
  420. $model = app("OwnerPriceExpressService")->create([
  421. "name" => $request->input("name"),
  422. "initial_weight" => $request->input("initial_weight"),
  423. "additional_weight" => $request->input("additional_weight"),
  424. ]);
  425. $model->owners()->sync($request->input("owner_id"));
  426. $model->logistics()->sync($request->input("logistic_id"));
  427. LogService::log(__METHOD__,"计费模型-录入快递计费",json_encode($request->input(),JSON_UNESCAPED_UNICODE));
  428. return response()->redirectTo("maintenance/priceModel/express")->with("successTip","录入“".$request->input("name")."”成功");
  429. }
  430. public function expressEdit($id)
  431. {
  432. if(!Gate::allows('计费模型-快递-编辑')){ return redirect('denied'); }
  433. /** @var OwnerPriceExpress $model */
  434. $model = app('OwnerPriceExpressService')->find($id)->append(["owner_id","logistic_id"]);
  435. $owners = app("OwnerService")->getIntersectPermitting();
  436. $logistics = app('LogisticService')->getSelection();
  437. return response()->view('maintenance.priceModel.express.create',compact("owners","logistics","model"));
  438. }
  439. public function expressUpdate($id,Request $request)
  440. {
  441. if(!Gate::allows('计费模型-快递-编辑')){ return redirect('denied'); }
  442. $request->offsetSet("owner_id",explode(",",$request->input("owner_id")));
  443. $request->offsetSet("logistic_id",explode(",",$request->input("logistic_id")));
  444. $this->expressValidator($request->input(),$id)->validate();
  445. /** @var OwnerPriceExpress $model */
  446. app("OwnerPriceExpressService")->update(["id"=>$id],[
  447. "name" => $request->input("name"),
  448. "initial_weight" => $request->input("initial_weight"),
  449. "additional_weight" => $request->input("additional_weight"),
  450. ]);
  451. $model = new OwnerPriceExpress();
  452. $model->id = $id;
  453. $model->owners()->sync($request->input("owner_id"));
  454. $model->logistics()->sync($request->input("logistic_id"));
  455. LogService::log(__METHOD__,"计费模型-修改快递计费",json_encode($request->input(),JSON_UNESCAPED_UNICODE));
  456. return response()->redirectTo("maintenance/priceModel/express")->with("successTip","修改“".$request->input("name")."”成功");
  457. }
  458. private function expressValidator(array $params, $id=null)
  459. {
  460. return Validator::make($params,[
  461. 'name'=>['required',$id?"unique:owner_price_expresses,name,$id":'unique:owner_price_expresses,name'],
  462. 'initial_weight'=>['required','numeric','min:0'],
  463. 'additional_weight'=>['required','numeric','min:0'],
  464. 'owner_id'=>[function ($attribute, $value, $fail)use($id,$params) {
  465. $owners = app("OwnerPriceExpressService")->getExistOwnerName($value,$params["logistic_id"] ?? [],$id);
  466. if ($owners)$fail("(".implode(',',$owners).') 已经绑定计费模型');
  467. }],
  468. /*'logistic_id'=>[function ($attribute, $value, $fail)use($id) {
  469. $logistics = app("OwnerPriceExpressService")->getExistLogisticName($value,$id);
  470. if ($logistics)$fail("(".implode(',',$logistics).') 已经绑定计费模型');
  471. }],*/
  472. 'items.*.province_id'=>['sometimes','required'],
  473. 'items.*.additional_weight_price'=>['sometimes','required','numeric',"min:0"],
  474. 'items.*.initial_weight_price'=>['sometimes','required','numeric',"min:0"],
  475. ],[
  476. 'required'=>':attribute 为必填项',
  477. 'unique' => ':attribute 已存在',
  478. 'min' => ':attribute 不得小于0',
  479. ],[
  480. 'name' =>"名称",
  481. 'initial_weight' =>"首重",
  482. 'additional_weight' =>"续重",
  483. "items.*.province_id"=>"省份",
  484. "items.*.additional_weight_price"=>"首重价格",
  485. "items.*.initial_weight_price"=>"续重价格",
  486. ]);
  487. }
  488. public function expressDestroy($id)
  489. {
  490. if(!Gate::allows('计费模型-快递-删除')){ return ["success"=>false,"data"=>"无权操作"]; };
  491. app("OwnerPriceExpressService")->destroy($id);
  492. LogService::log(__METHOD__,"计费模型-删除快递计费",$id);
  493. return ["success"=>true];
  494. }
  495. public function logisticIndex(Request $request)
  496. {
  497. if(!Gate::allows('计费模型-物流-查询')){ return redirect('denied'); }
  498. $models = app("OwnerPriceLogisticService")->paginate($request->input("id"))->append(["unit_range_json","other_unit_range_json"]);
  499. return response()->view('maintenance.priceModel.logistic.index',compact("models"));
  500. }
  501. public function logisticCreate()
  502. {
  503. if(!Gate::allows('计费模型-物流-录入')){ return redirect('denied'); }
  504. $owners = app("OwnerService")->getIntersectPermitting();
  505. $logistics = app('LogisticService')->getSelection();
  506. $units = app('UnitService')->getSelection();
  507. return response()->view('maintenance.priceModel.logistic.create',compact("owners","logistics","units"));
  508. }
  509. public function logisticStore(Request $request)
  510. {
  511. if(!Gate::allows('计费模型-物流-录入')){ return redirect('denied'); }
  512. $request->offsetSet("owner_id",explode(",",$request->input("owner_id")));
  513. $request->offsetSet("logistic_id",explode(",",$request->input("logistic_id")));
  514. $this->logisticValidator($request->input())->validate();
  515. /** @var OwnerPriceLogistic $model */
  516. $model = app("OwnerPriceLogisticService")->create([
  517. "name" => $request->input("name"),
  518. "pick_up_price" => $request->input("pick_up_price"),
  519. "fuel_price" => $request->input("fuel_price"),
  520. "service_price" => $request->input("service_price"),
  521. "unit_id" => $request->input("unit_id"),
  522. "unit_range" => $request->input("unit_range"),
  523. "other_unit_id" => $request->input("other_unit_id"),
  524. "other_unit_range" => $request->input("other_unit_range"),
  525. ]);
  526. $model->owners()->sync($request->input("owner_id"));
  527. $model->logistics()->sync($request->input("logistic_id"));
  528. LogService::log(__METHOD__,"计费模型-录入物流计费",json_encode($request->input(),JSON_UNESCAPED_UNICODE));
  529. return response()->redirectTo("maintenance/priceModel/logistic")->with("successTip","创建“".$request->input("name")."”成功");
  530. }
  531. public function logisticEdit($id)
  532. {
  533. if(!Gate::allows('计费模型-物流-编辑')){ return redirect('denied'); }
  534. $owners = app("OwnerService")->getIntersectPermitting();
  535. $logistics = app('LogisticService')->getSelection(['id','name'],'物流');
  536. $units = app('UnitService')->getSelection();
  537. $model = app("OwnerPriceLogisticService")->find($id)->append(["owner_id","logistic_id"]);
  538. return response()->view('maintenance.priceModel.logistic.create',compact("owners","logistics","units","model"));
  539. }
  540. public function logisticUpdate($id, Request $request)
  541. {
  542. if(!Gate::allows('计费模型-物流-编辑')){ return redirect('denied'); }
  543. $request->offsetSet("owner_id",explode(",",$request->input("owner_id")));
  544. $request->offsetSet("logistic_id",explode(",",$request->input("logistic_id")));
  545. $this->logisticValidator($request->input(),$id)->validate();
  546. app("OwnerPriceLogisticService")->update(["id"=>$id],[
  547. "name" => $request->input("name"),
  548. "pick_up_price" => $request->input("pick_up_price"),
  549. "fuel_price" => $request->input("fuel_price"),
  550. "service_price" => $request->input("service_price"),
  551. "unit_id" => $request->input("unit_id"),
  552. "unit_range" => $request->input("unit_range"),
  553. "other_unit_id" => $request->input("other_unit_id"),
  554. "other_unit_range" => $request->input("other_unit_range"),
  555. ]);
  556. $model = new OwnerPriceLogistic();
  557. $model->id = $id;
  558. $model->owners()->sync($request->input("owner_id"));
  559. $model->logistics()->sync($request->input("logistic_id"));
  560. LogService::log(__METHOD__,"计费模型-修改物流计费",json_encode($request->input(),JSON_UNESCAPED_UNICODE));
  561. return response()->redirectTo("maintenance/priceModel/logistic")->with("successTip","修改“".$request->input("name")."”成功");
  562. }
  563. public function logisticGetDetail(Request $request)
  564. {
  565. if(!Gate::allows('计费模型-物流-查询')){ return ["success"=>false,"data"=>"无权操作"]; }
  566. $model = new OwnerPriceLogistic();
  567. $model->id = $request->input("id");
  568. $model->load(["details"=>function($query){
  569. /** @var Builder $query */
  570. $query->with(["unit","province","city"]);
  571. }]);
  572. return ["success"=>true,"data"=>$model->details];
  573. }
  574. public function expressExport($id)
  575. {
  576. if(!Gate::allows('计费模型-快递-查询')){ return ["success"=>false,"data"=>"无权操作"]; }
  577. $model = app("OwnerPriceExpressService")->find($id,[
  578. "owners","logistics","details"=>function($query){
  579. /** @var Builder $query */
  580. $query->with("province");
  581. }]);
  582. $row = ["客户","首重","续重","承运商"];
  583. $list = [[
  584. implode(",",array_column($model->owners->toArray(),"name")),
  585. $model->initial_weight,
  586. $model->additional_weight,
  587. implode(",",array_column($model->logistics->toArray(),"name")),
  588. ],[
  589. "价格名称","省","首重价格","续重价格",
  590. ]];
  591. foreach ($model->details as $detail){
  592. $list[] = [
  593. $model->name,
  594. $detail->province ? $detail->province->name : '',
  595. $detail->initial_weight_price,
  596. $detail->additional_weight_price,
  597. ];
  598. }
  599. return app(ExportService::class)->json($row,$list,"快递计费模型");
  600. }
  601. public function logisticImport(Request $request)
  602. {
  603. if(!Gate::allows('计费模型-物流-录入')){ return ["success"=>false,"data"=>"无权操作"]; }
  604. $fileSuffix=$request->file('file')->getClientOriginalExtension();
  605. if ($fileSuffix != 'xlsx' && $fileSuffix != 'xls' && $fileSuffix != 'csv')
  606. return ['success'=>false,'data'=>'不支持该文件类型'];
  607. ini_set('max_execution_time',2500);
  608. ini_set('memory_limit','1526M');
  609. $fileSuffix = ucwords($fileSuffix);
  610. if (!$request->has("id")){
  611. Excel::import(new OwnerPriceLogisticDetailImport(null),$request->file('file')->path(),null,$fileSuffix);
  612. }else{
  613. /** @var OwnerPriceLogistic $model */
  614. $model = app('OwnerPriceLogisticService')->find($request->input("id"),["unit","otherUnit","details"]);
  615. Excel::import(new OwnerPriceLogisticDetailImport($model),$request->file('file')->path(),null,$fileSuffix);
  616. }
  617. if (Cache::has('logistic'))return Cache::pull('logistic');
  618. return ["success"=>false,"data"=>"导入发生错误,数据无响应"];
  619. }
  620. public function logisticExport($id)
  621. {
  622. if(!Gate::allows('计费模型-物流-查询')){ return ["success"=>false,"data"=>"无权操作"]; }
  623. $model = app("OwnerPriceLogisticService")->find($id,[
  624. "owners","logistics","unit","otherUnit","details"=>function($query){
  625. /** @var Builder $query */
  626. $query->with(["province","unit","city"]);
  627. }]);
  628. $row = ["客户","价格名称",
  629. "单位一区间/".($model->unit ? $model->unit->name : ''),
  630. "单位二区间/".($model->otherUnit ? $model->otherUnit->name : ''),
  631. "提货费","燃油附加费","信息服务费","创建时间","承运商"];
  632. $range = "";
  633. foreach (explode(",",$model->unit_range) as $str){
  634. $range .= $str."\r\n";
  635. }
  636. $otherRange = "";
  637. foreach (explode(",",$model->other_unit_range) as $str){
  638. $otherRange .= $str."\r\n";
  639. }
  640. $list = [[
  641. implode(",",array_column($model->owners->toArray(),"name")),
  642. $model->name,
  643. $range,
  644. $otherRange,
  645. $model->pick_up_price,
  646. $model->fuel_price,
  647. $model->service_price,
  648. $model->created_at,
  649. implode(",",array_column($model->logistics->toArray(),"name")),
  650. ],[
  651. "单位","区间","省份","市","单价","送货费","起始计费","起始计数","费率"
  652. ]];
  653. foreach ($model->details as $detail){
  654. $list[] = [
  655. $detail->unit ? $detail->unit->name : '',
  656. $detail->range,
  657. $detail->province ? $detail->province->name : '',
  658. $detail->city ? $detail->city->name : '',
  659. $detail->unit_price,
  660. $detail->delivery_fee,
  661. $detail->initial_fee,
  662. $detail->initial_amount,
  663. $detail->rate ? $detail->rate."%" : '',
  664. ];
  665. }
  666. return app(ExportService::class)->json($row,$list,"物流计费模型");
  667. }
  668. public function logisticUpdateDetail(Request $request)
  669. {
  670. if(!Gate::allows('计费模型-物流-编辑')){ return ["success"=>false,"data"=>"无权操作"]; }
  671. $detail = $request->input("detail");
  672. if ($detail["id"]){
  673. app('OwnerPriceLogisticService')->updateDetail(["id"=>$detail["id"]],[
  674. "unit_price" => $detail["unit_price"],
  675. "delivery_fee" => $detail["delivery_fee"],
  676. "initial_fee" => $detail["initial_fee"],
  677. "initial_amount" => $detail["initial_amount"],
  678. "rate" => $detail["rate"],
  679. ]);
  680. }else{
  681. $row = app('OwnerPriceLogisticService')->isExistDetail([
  682. "owner_price_logistic_id"=>$request->input("id"),
  683. "unit_id"=>$detail["unit_id"],
  684. "range"=>$detail["range"],
  685. "province_id"=>$detail["province_id"],
  686. "city_id"=>$detail["city_id"],
  687. ]);
  688. if ($row>0)return ["success"=>false,"data"=>"已存在该计费模型"];
  689. /** @var OwnerPriceExpressProvince $detail */
  690. $detail = app('OwnerPriceLogisticService')->createDetail([
  691. "owner_price_logistic_id"=>$request->input("id"),
  692. "unit_id"=>$detail["unit_id"],
  693. "range"=>$detail["range"],
  694. "province_id"=>$detail["province_id"],
  695. "city_id"=>$detail["city_id"],
  696. "unit_price" => $detail["unit_price"],
  697. "delivery_fee" => $detail["delivery_fee"],
  698. "initial_fee" => $detail["initial_fee"],
  699. "initial_amount" => $detail["initial_amount"],
  700. "rate" => $detail["rate"],
  701. ]);
  702. $detail->load("province","unit","city");
  703. }
  704. LogService::log(__METHOD__,"计费模型-修改物流计费详情",json_encode($request->input(),JSON_UNESCAPED_UNICODE));
  705. return ["success"=>true,"data"=>$detail];
  706. }
  707. public function logisticDestroyDetail(Request $request)
  708. {
  709. if(!Gate::allows('计费模型-物流-删除')){ return ["success"=>false,"data"=>"无权操作"]; }
  710. $id = $request->input("id");
  711. if (!$id)return ["success"=>false,"data"=>"非法参数"];
  712. app("OwnerPriceLogisticService")->destroyDetail($id);
  713. LogService::log(__METHOD__,"计费模型-删除物流计费详情",$id);
  714. return ["success"=>true];
  715. }
  716. public function logisticDestroy($id)
  717. {
  718. if(!Gate::allows('计费模型-物流-删除')){ return ["success"=>false,"data"=>"无权操作"]; }
  719. if (!$id)return ["success"=>false,"data"=>"非法参数"];
  720. app("OwnerPriceLogisticService")->destroy($id);
  721. LogService::log(__METHOD__,"计费模型-删除物流计费",$id);
  722. return ["success"=>true];
  723. }
  724. private function logisticValidator(array $params,$id = null)
  725. {
  726. return Validator::make($params,[
  727. 'name'=>['required',$id?"unique:owner_price_logistics,name,$id":'unique:owner_price_logistics,name'],
  728. 'pick_up_price'=>['nullable','numeric','min:0'],
  729. 'fuel_price'=>['nullable','numeric','min:0'],
  730. 'service_price'=>['nullable','numeric','min:0'],
  731. 'unit_id'=>['required'],
  732. 'unit_range'=>['required',function ($attribute, $value, $fail) {
  733. $bool = app("OwnerPriceLogisticService")->checkRange($value);
  734. if (!$bool)$fail("格式错误,值必须为连续的且最后一个值不允许封闭");
  735. }],
  736. 'other_unit_id'=>['required'],
  737. 'other_unit_range'=>['required',function ($attribute, $value, $fail) {
  738. $bool = app("OwnerPriceLogisticService")->checkRange($value);
  739. if (!$bool)$fail("格式错误,值必须为连续的且最后一个值不允许封闭");
  740. }],
  741. 'owner_id'=>[function ($attribute, $value, $fail)use($id,$params) {
  742. $owners = app("OwnerPriceExpressService")->getExistOwnerName($value,$params["logistic_id"] ?? [],$id,"ownerPriceLogistics");
  743. if ($owners)$fail("(".implode(',',$owners).') 已经绑定计费模型');
  744. }],
  745. 'items.*.unit_id'=>['sometimes','required'],
  746. 'items.*.range'=>['sometimes','required'],
  747. 'items.*.province_id'=>['sometimes','required'],
  748. 'items.*.city_id'=>['sometimes','required'],
  749. 'items.*.unit_price'=>['sometimes','nullable','numeric',"min:0"],
  750. 'items.*.delivery_fee'=>['sometimes','nullable','numeric',"min:0"],
  751. 'items.*.initial_fee'=>['sometimes','nullable','numeric',"min:0"],
  752. 'items.*.initial_amount'=>['sometimes','nullable','numeric',"min:0"],
  753. 'items.*.rate'=>['sometimes','nullable','numeric',"min:0"],
  754. ],[
  755. 'required'=>':attribute 为必填项',
  756. 'unique' => ':attribute 已存在',
  757. 'numeric' => ':attribute 必须为数字',
  758. 'min' => ':attribute 不得为负',
  759. ],[
  760. 'name' =>"名称",
  761. 'pick_up_price' =>"提货费",
  762. 'fuel_price' =>"燃油附加费",
  763. 'service_price' =>"信息服务费",
  764. 'unit_id' =>"单位一",
  765. 'unit_range' =>"区间值",
  766. 'other_unit_id' =>"单位二",
  767. 'other_unit_range' =>"区间值",
  768. 'items.*.unit_id'=>"单位",
  769. 'items.*.range'=>"区间",
  770. 'items.*.province_id'=>"省份",
  771. 'items.*.city_id'=>"城市",
  772. 'items.*.unit_price'=>"单价",
  773. 'items.*.delivery_fee'=>"送货费",
  774. 'items.*.initial_fee'=>"起始计费",
  775. 'items.*.initial_amount'=>"起始计数",
  776. 'items.*.rate'=>"费率",
  777. ]);
  778. }
  779. public function directLogisticIndex(Request $request){
  780. if(!Gate::allows('计费模型-直发-查询')){ return redirect('denied'); }
  781. $models = app("OwnerPriceDirectLogisticService")->paginate($request->input("id"));
  782. return response()->view('maintenance.priceModel.directLogistic.index',compact("models"));
  783. }
  784. public function directLogisticCreate(){
  785. if(!Gate::allows('计费模型-直发-录入')){ return redirect('denied'); }
  786. $owners = app("OwnerService")->getIntersectPermitting();
  787. return response()->view('maintenance.priceModel.directLogistic.create',compact("owners"));
  788. }
  789. public function directLogisticStore(Request $request)
  790. {
  791. if(!Gate::allows('计费模型-直发-录入')){ return redirect('denied'); }
  792. $request->offsetSet("owner_id",explode(",",$request->input("owner_id")));
  793. $this->directLogisticValidator($request->input())->validate();
  794. /** @var OwnerPriceDirectLogistic $model */
  795. $model = app("OwnerPriceDirectLogisticService")->create([
  796. "name" => $request->input("name"),
  797. "base_km" => $request->input("base_km"),
  798. ]);
  799. $model->owners()->sync($request->input("owner_id"));
  800. LogService::log(__METHOD__,"计费模型-录入直发车计费",json_encode($request->input(),JSON_UNESCAPED_UNICODE));
  801. return response()->redirectTo("maintenance/priceModel/directLogistic")->with("successTip","创建“".$request->input("name")."”成功");
  802. }
  803. public function directLogisticDestroy($id)
  804. {
  805. if(!Gate::allows('计费模型-直发-删除')){ return ["success"=>false,"data"=>"无权操作"]; }
  806. $row = app("OwnerPriceDirectLogisticService")->destroy($id);
  807. if ($row == 1){
  808. LogService::log(__METHOD__,"计费模型-删除直发车计费",$id);
  809. return ["success"=>true];
  810. }
  811. return ["success"=>false,"data"=>"影响了“".$row."”行"];
  812. }
  813. public function directLogisticEdit($id)
  814. {
  815. if(!Gate::allows('计费模型-直发-编辑')){ return redirect('denied'); }
  816. $owners = app("OwnerService")->getIntersectPermitting();
  817. $model = app("OwnerPriceDirectLogisticService")->find($id)->append("owner_id");
  818. return response()->view('maintenance.priceModel.directLogistic.create',compact("model","owners"));
  819. }
  820. public function directLogisticUpdate($id, Request $request)
  821. {
  822. if(!Gate::allows('计费模型-直发-编辑')){ return redirect('denied'); }
  823. $request->offsetSet("owner_id",explode(",",$request->input("owner_id")));
  824. $this->directLogisticValidator($request->input(),$id)->validate();
  825. app("OwnerPriceDirectLogisticService")->update(["id"=>$id],[
  826. "name" => $request->input("name"),
  827. "base_km" => $request->input("base_km"),
  828. ]);
  829. $model = new OwnerPriceDirectLogistic();
  830. $model->id = $id;
  831. $model->owners()->sync($request->input("owner_id"));
  832. LogService::log(__METHOD__,"计费模型-修改直发车计费",json_encode($request->input(),JSON_UNESCAPED_UNICODE));
  833. return response()->redirectTo("maintenance/priceModel/directLogistic")->with("successTip","修改“".$request->input("name")."”成功");
  834. }
  835. public function directLogisticGetDetail(Request $request)
  836. {
  837. if(!Gate::allows('计费模型-直发-查询')){ return ["success"=>false,"data"=>"无权操作"]; }
  838. $model = new OwnerPriceDirectLogistic();
  839. $model->id = $request->input("id");
  840. $model->load(["details"=>function($query){
  841. /** @var Builder $query */
  842. $query->with("carType");
  843. }]);
  844. return ["success"=>true,"data"=>$model->details];
  845. }
  846. public function directLogisticImport(Request $request)
  847. {
  848. if(!Gate::allows('计费模型-直发-录入')){ return ["success"=>false,"data"=>"无权操作"]; }
  849. $fileSuffix=$request->file('file')->getClientOriginalExtension();
  850. if ($fileSuffix != 'xlsx' && $fileSuffix != 'xls' && $fileSuffix != 'csv')
  851. return ['success'=>false,'data'=>'不支持该文件类型'];
  852. ini_set('max_execution_time',2500);
  853. ini_set('memory_limit','1526M');
  854. $fileSuffix = ucwords($fileSuffix);
  855. if (!$request->has("id")){
  856. Excel::import(new OwnerPriceDirectLogisticDetailImport(null),$request->file('file')->path(),null,$fileSuffix);
  857. }else{
  858. $model = new OwnerPriceDirectLogistic();
  859. $model->id = $request->input("id");
  860. $model->load("details");
  861. Excel::import(new OwnerPriceDirectLogisticDetailImport($model),$request->file('file')->path(),null,$fileSuffix);
  862. }
  863. if (Cache::has('directLogistic'))return Cache::pull('directLogistic');
  864. return ["success"=>false,"data"=>"导入发生错误,数据无响应"];
  865. }
  866. public function directLogisticUpdateDetail(Request $request)
  867. {
  868. if(!Gate::allows('计费模型-直发-编辑')){ return ["success"=>false,"data"=>"无权操作"]; }
  869. $detail = $request->input("detail");
  870. if ($detail["id"]){
  871. app('OwnerPriceDirectLogisticService')->updateDetail(["id"=>$detail["id"]],[
  872. "base_fee" => $detail["base_fee"],
  873. "additional_fee" => $detail["additional_fee"],
  874. ]);
  875. }else{
  876. $row = app('OwnerPriceDirectLogisticService')->isExistDetail([
  877. "owner_price_direct_logistic_id"=>$request->input("id"),
  878. "car_type_id"=>$detail["car_type_id"],
  879. ]);
  880. if ($row>0)return ["success"=>false,"data"=>"已存在该计费模型"];
  881. /** @var OwnerPriceExpressProvince $detail */
  882. $detail = app('OwnerPriceDirectLogisticService')->createDetail([
  883. "owner_price_direct_logistic_id"=>$request->input("id"),
  884. "car_type_id"=>$detail["car_type_id"],
  885. "base_fee" => $detail["base_fee"],
  886. "additional_fee" => $detail["additional_fee"],
  887. ]);
  888. $detail->load("carType");
  889. }
  890. LogService::log(__METHOD__,"计费模型-修改直发车计费详情",json_encode($request->input(),JSON_UNESCAPED_UNICODE));
  891. return ["success"=>true,"data"=>$detail];
  892. }
  893. public function directLogisticDestroyDetail(Request $request)
  894. {
  895. if(!Gate::allows('计费模型-直发-删除')){ return ["success"=>false,"data"=>"无权操作"]; }
  896. $id = $request->input("id");
  897. if (!$id)return ["success"=>false,"data"=>"非法参数"];
  898. app("OwnerPriceDirectLogisticService")->destroyDetail($id);
  899. LogService::log(__METHOD__,"计费模型-删除直发车计费详情",$id);
  900. return ["success"=>true];
  901. }
  902. private function directLogisticValidator(array $params, $id= null)
  903. {
  904. return Validator::make($params,[
  905. 'name'=>['required',$id?"unique:owner_price_direct_logistics,name,$id":'unique:owner_price_direct_logistics,name'],
  906. 'base_km'=>['required','numeric','min:0'],
  907. 'owner_id'=>[function ($attribute, $value, $fail)use($id) {
  908. $owners = app("OwnerPriceDirectLogisticService")->getExistOwnerName($value,$id);
  909. if ($owners)$fail("(".implode(',',$owners).') 已经绑定直发计费模型');
  910. }],
  911. ],[
  912. 'required'=>':attribute 为必填项',
  913. 'unique' => ':attribute 已存在',
  914. 'numeric' => ':attribute 必须为数字',
  915. 'min' => ':attribute 不得为负',
  916. ],[
  917. 'name' =>"名称",
  918. 'base_km' =>"起步公里数",
  919. ]);
  920. }
  921. public function apiStoreStorage()
  922. {
  923. $this->gate("客户管理-项目-录入");
  924. $errors = $this->storageValidator(request()->input())->errors();
  925. if (count($errors)>0)$this->success(["errors"=>$errors]);
  926. if (!request("owner_id"))$this->error("参数传递错误");
  927. $values = [
  928. "name" => request("name"),
  929. "counting_type" => request("counting_type"),
  930. "using_type" => request("using_type"),
  931. "minimum_area" => request("minimum_area"),
  932. "price" => request("price"),
  933. "discount_type" => request("discount_type"),
  934. "discount_value" => request("discount_value"),
  935. "unit_id" => request("unit_id"),
  936. ];
  937. if (request("id"))app('OwnerStoragePriceModelService')->update(["id"=>request("id")],$values);
  938. else{
  939. DB::transaction(function ()use(&$model,$values){
  940. $model = app('OwnerStoragePriceModelService')->create($values);
  941. DB::insert(DB::raw("INSERT INTO owner_storage_price_model_owner VALUES(?,?)"),[$model->id,request("owner_id")]);
  942. DB::commit();
  943. });
  944. $this->success($model->id);
  945. }
  946. $this->success();
  947. }
  948. public function apiStoreOperation()
  949. {
  950. $this->gate("客户管理-项目-录入");
  951. $params = request()->input();
  952. if (request("operation_type") == '入库'){
  953. foreach ($params["items"] as $index => $it){
  954. if (!$it || $it['strategy'] == '起步'){
  955. unset($params["items"][$index]);
  956. break;
  957. }
  958. }
  959. }
  960. $params["owner_id"] = [$params["owner_id"]];
  961. $errors = $this->operationValidator($params,request("id"))->errors();
  962. if (count($errors)>0)$this->success(["errors"=>$errors]);
  963. if (!request("owner_id"))$this->error("参数传递错误");
  964. if (request("id")){
  965. $model = app('OwnerPriceOperationService')->find(request("id"),["items"]);
  966. app('OwnerPriceOperationService')->findUpdate($model,[
  967. "name" => request("name"),
  968. "operation_type" => request("operation_type"),
  969. "strategy" => request("strategy"),
  970. "feature" => request("feature"),
  971. "remark" => request("remark"),
  972. ]);
  973. $delete = [];//需要删除子项
  974. $update = [["id","strategy","amount","unit_id","unit_price","feature"]];//需要更新子项
  975. $insert = [];//需要新增子项
  976. foreach ($params["items"] as $item){
  977. $obj = [
  978. "strategy" => $item["strategy"],
  979. "amount" => $item["amount"],
  980. "unit_id" => $item["unit_id"],
  981. "unit_price"=> $item["unit_price"],
  982. "feature" => $item["feature"],
  983. ];
  984. if (isset($item["id"])){
  985. $obj["id"] = $item["id"];
  986. $update[] = $obj;
  987. $delete[] = $item["id"];
  988. } else{
  989. $obj["owner_price_operation_id"] = $model->id;
  990. $obj["feature"] = $item["feature"] ?? null;
  991. $insert[] = $obj;
  992. }
  993. }
  994. $ids = array_column($model->items->toArray(),"id");
  995. $delete = array_diff($ids,$delete);
  996. if ($delete)app("OwnerPriceOperationItemService")->destroy($delete);
  997. if (count($update) > 1)app(BatchUpdateService::class)->batchUpdate("owner_price_operation_items",$update);
  998. if ($insert)app("OwnerPriceOperationItemService")->insert($insert);
  999. }else{
  1000. DB::transaction(function ()use(&$model,$params){
  1001. $model = app('OwnerPriceOperationService')->create([
  1002. "name" => request("name"),
  1003. "operation_type" => request("operation_type"),
  1004. "strategy" => request("strategy"),
  1005. "feature" => request("feature"),
  1006. "remark" => request("remark"),
  1007. ]);
  1008. foreach ($params["items"] as &$item){
  1009. $item["owner_price_operation_id"] = $model->id;
  1010. if (!isset($item["feature"]))$item["feature"] = null;
  1011. unset($item["features"]);
  1012. unset($item["featureFormat"]);
  1013. }
  1014. app("OwnerPriceOperationItemService")->insert($params["items"]);
  1015. DB::insert(DB::raw("INSERT INTO owner_price_operation_owner VALUES(?,?)"),[$model->id,request("owner_id")]);
  1016. DB::commit();
  1017. });
  1018. }
  1019. /** @var OwnerPriceOperation $model */
  1020. $model->load("items");
  1021. $this->success($model);
  1022. }
  1023. public function apiStoreExpress()
  1024. {
  1025. $this->gate("客户管理-项目-录入");
  1026. $params = request()->input();
  1027. $params["logistic_id"] = $params["logistics"];
  1028. $errors = $this->expressValidator($params)->errors();
  1029. $exist = [];
  1030. foreach ($params["items"] as $index => $item){
  1031. if (isset($exist[$item["province_id"]]))$errors["items.".$index.".province_id"] = ["已存在"];
  1032. else $exist[$item["province_id"]] = true;
  1033. }
  1034. if (count($errors)>0)$this->success(["errors"=>$errors]);
  1035. DB::transaction(function ()use(&$model,$params){
  1036. $model = app('OwnerPriceExpressService')->create([
  1037. "name" => request("name"),
  1038. "initial_weight" => request("initial_weight"),
  1039. "additional_weight" => request("additional_weight"),
  1040. ]);
  1041. foreach ($params["items"] as &$item)$item["owner_price_express_id"] = $model->id;
  1042. OwnerPriceExpressProvince::query()->insert($params["items"]);
  1043. DB::insert(DB::raw("INSERT INTO owner_price_express_owner VALUES(?,?)"),[$model->id,request("owner_id")]);
  1044. /** @var OwnerPriceExpress $model */
  1045. $model->logistics()->syncWithoutDetaching(request("logistics"));
  1046. DB::commit();
  1047. });
  1048. $model->load("details");
  1049. $this->success($model);
  1050. }
  1051. public function apiStoreLogistic()
  1052. {
  1053. $this->gate("客户管理-项目-录入");
  1054. $params = request()->input();
  1055. $params["owner_id"] = [$params["owner_id"]];
  1056. $params["logistic_id"] = $params["logistics"];
  1057. $errors = $this->logisticValidator($params)->errors();
  1058. $exist = [];
  1059. foreach ($params["items"] as $index => $item){
  1060. $key = $item["unit_id"]."-".$item["range"]."-".$item["province_id"]."-".$item["city_id"];
  1061. if (isset($exist[$key]))$errors["items.".$index.".unit_id"] = ["该条已存在"];
  1062. else $exist[$key] = true;
  1063. }
  1064. if (count($errors)>0)$this->success(["errors"=>$errors]);
  1065. DB::transaction(function ()use(&$model,$params){
  1066. $model = app("OwnerPriceLogisticService")->create([
  1067. "name" => request('name'),
  1068. "unit_range" => request('unit_range'),
  1069. "unit_id" => request('unit_id'),
  1070. "other_unit_range" => request('other_unit_range'),
  1071. "other_unit_id" => request('other_unit_id'),
  1072. "pick_up_price" => request('pick_up_price'),
  1073. "fuel_price" => request('fuel_price'),
  1074. "service_price" => request('service_price'),
  1075. ]);
  1076. foreach ($params["items"] as &$param)$param["owner_price_logistic_id"] = $model->id;
  1077. OwnerPriceLogisticDetail::query()->insert($params["items"]);
  1078. DB::insert(DB::raw("INSERT INTO owner_price_logistic_owner VALUES(?,?)"),[$model->id,request("owner_id")]);
  1079. /** @var OwnerPriceLogistic $model */
  1080. $model->logistics()->syncWithoutDetaching(request("logistics"));
  1081. DB::commit();
  1082. });
  1083. $model->load("details");
  1084. $this->success($model);
  1085. }
  1086. public function apiStoreDirectLogistic()
  1087. {
  1088. $this->gate("客户管理-项目-录入");
  1089. $errors = $this->directLogisticValidator(request()->input())->errors();
  1090. $exist = [];
  1091. foreach (request("items") as $index=>$item){
  1092. if (isset($exist[$item['car_type_id']]))$errors["items.".$index.".car_type_id"] = ["已存在"];
  1093. else $exist[$item['car_type_id']] = true;
  1094. }
  1095. if (count($errors)>0)$this->success(["errors"=>$errors]);
  1096. $items = request()->input("items");
  1097. DB::transaction(function ()use(&$model,$items){
  1098. $model = app("OwnerPriceDirectLogisticService")->create([
  1099. "name" => request("name"),
  1100. "base_km" => request("base_km"),
  1101. ]);
  1102. foreach ($items as &$item)$item["owner_price_direct_logistic_id"] = $model->id;
  1103. OwnerPriceDirectLogisticCar::query()->insert($items);
  1104. DB::insert(DB::raw("INSERT INTO owner_price_direct_logistic_owner VALUES(?,?)"),[$model->id,request("owner_id")]);
  1105. DB::commit();
  1106. });
  1107. $model->load("details");
  1108. $this->success($model);
  1109. }
  1110. public function getPriceModel()
  1111. {
  1112. $owner = new Owner();
  1113. $owner->id = request("id");
  1114. $owner->load(["ownerStoragePriceModels","ownerPriceOperations.items","ownerPriceExpresses"=>function($query){
  1115. /** @var Builder $query */
  1116. $query->with(["details","logistics"]);
  1117. },"ownerPriceLogistics"=>function($query){
  1118. /** @var Builder $query */
  1119. $query->with(["details","logistics"]);
  1120. },"ownerPriceDirectLogistics.details"]);
  1121. $features = app("FeatureService")->getMapArray();
  1122. OwnerPriceOperation::$features = $features;
  1123. OwnerPriceOperationItem::$features = $features;
  1124. foreach ($owner->ownerPriceOperations as &$operation){
  1125. $operation["featureFormat"] = $operation->featureFormat;
  1126. foreach ($operation->items as &$item){
  1127. $item["featureFormat"] = $item->featureFormat;
  1128. }
  1129. }
  1130. $this->success($owner);
  1131. }
  1132. public function apiGetStorage()
  1133. {
  1134. $this->gate("客户管理-项目-录入");
  1135. $models = OwnerStoragePriceModel::query();
  1136. if (request("customer_id")){
  1137. $customerId = request("customer_id");
  1138. $models->whereHas("owners",function ($query)use($customerId){
  1139. /** @var Builder $query */
  1140. $query->where("customer_id",$customerId);
  1141. });
  1142. }
  1143. if (request("owner_id")){
  1144. $ownerId = request("owner_id");
  1145. $models->whereHas("owners",function ($query)use($ownerId){
  1146. /** @var Builder $query */
  1147. $query->where("id",$ownerId);
  1148. });
  1149. }
  1150. if (request("name")){
  1151. $models->where("name","like","%".request("name")."%");
  1152. }
  1153. $this->success($models->get());
  1154. }
  1155. public function apiGetOperation()
  1156. {
  1157. $this->gate("客户管理-项目-录入");
  1158. $models = OwnerPriceOperation::query()->with("items");
  1159. if (request("customer_id")){
  1160. $customerId = request("customer_id");
  1161. $models->whereHas("ownerPriceOperationOwners",function ($query)use($customerId){
  1162. /** @var Builder $query */
  1163. $query->where("customer_id",$customerId);
  1164. });
  1165. }
  1166. if (request("owner_id")){
  1167. $ownerId = request("owner_id");
  1168. $models->whereHas("ownerPriceOperationOwners",function ($query)use($ownerId){
  1169. /** @var Builder $query */
  1170. $query->where("id",$ownerId);
  1171. });
  1172. }
  1173. if (request("name")){
  1174. $models->where("name","like","%".request("name")."%");
  1175. }
  1176. $features = app("FeatureService")->getMapArray();
  1177. OwnerPriceOperation::$features = $features;
  1178. OwnerPriceOperationItem::$features = $features;
  1179. $models = $models->get();
  1180. foreach ($models as &$operation){
  1181. $operation["featureFormat"] = $operation->featureFormat;
  1182. $items = [[],[]];
  1183. foreach ($operation->items as $item){
  1184. $obj = [
  1185. "strategy" => $item["strategy"],
  1186. "amount" => $item["amount"],
  1187. "unit_id" => $item["unit_id"],
  1188. "unit_price" => $item["unit_price"],
  1189. "feature" => $item["feature"],
  1190. "featureFormat" => $item->featureFormat,
  1191. ];
  1192. if ($item["strategy"] == '起步')$items[0] = $obj;
  1193. if ($item["strategy"] == '默认')$items[1] = $obj;
  1194. if ($item["strategy"] == '特征')$items[] = $obj;
  1195. }
  1196. if (!$items[0])$items[0] = [
  1197. "strategy" => "起步",
  1198. "amount" => "",
  1199. "unit_id" => "",
  1200. "unit_price" => "",
  1201. "feature" => "",
  1202. ];
  1203. if (!$items[1])$items[1] = [
  1204. "strategy" => "默认",
  1205. "amount" => "",
  1206. "unit_id" => "",
  1207. "unit_price" => "",
  1208. "feature" => "",
  1209. ];
  1210. unset($operation["items"]);
  1211. $operation["items"] = $items;
  1212. }
  1213. $this->success($models);
  1214. }
  1215. public function apiGetExpress()
  1216. {
  1217. $this->gate("客户管理-项目-录入");
  1218. $models = OwnerPriceExpress::query()->with(["details","logistics:id"]);
  1219. if (request("customer_id")){
  1220. $customerId = request("customer_id");
  1221. $models->whereHas("owners",function ($query)use($customerId){
  1222. /** @var Builder $query */
  1223. $query->where("customer_id",$customerId);
  1224. });
  1225. }
  1226. if (request("owner_id")){
  1227. $ownerId = request("owner_id");
  1228. $models->whereHas("owners",function ($query)use($ownerId){
  1229. /** @var Builder $query */
  1230. $query->where("id",$ownerId);
  1231. });
  1232. }
  1233. if (request("logistic_id")){
  1234. $logisticId = request("logistic_id");
  1235. $models->whereHas("logistics",function ($query)use($logisticId){
  1236. /** @var Builder $query */
  1237. $query->where("id",$logisticId);
  1238. });
  1239. }
  1240. if (request("name")){
  1241. $models->where("name","like","%".request("name")."%");
  1242. }
  1243. $this->success($models->get());
  1244. }
  1245. public function apiGetLogistic()
  1246. {
  1247. $this->gate("客户管理-项目-录入");
  1248. $models = OwnerPriceLogistic::query()->with(["details","logistics"]);
  1249. if (request("customer_id")){
  1250. $customerId = request("customer_id");
  1251. $models->whereHas("owners",function ($query)use($customerId){
  1252. /** @var Builder $query */
  1253. $query->where("customer_id",$customerId);
  1254. });
  1255. }
  1256. if (request("owner_id")){
  1257. $ownerId = request("owner_id");
  1258. $models->whereHas("owners",function ($query)use($ownerId){
  1259. /** @var Builder $query */
  1260. $query->where("id",$ownerId);
  1261. });
  1262. }
  1263. if (request("logistic_id")){
  1264. $logisticId = request("logistic_id");
  1265. $models->whereHas("logistics",function ($query)use($logisticId){
  1266. /** @var Builder $query */
  1267. $query->where("id",$logisticId);
  1268. });
  1269. }
  1270. if (request("name")){
  1271. $models->where("name","like","%".request("name")."%");
  1272. }
  1273. $this->success($models->get());
  1274. }
  1275. public function apiGetDirectLogistic()
  1276. {
  1277. $this->gate("客户管理-项目-录入");
  1278. $models = OwnerPriceDirectLogistic::query()->with("details");
  1279. if (request("customer_id")){
  1280. $customerId = request("customer_id");
  1281. $models->whereHas("owners",function ($query)use($customerId){
  1282. /** @var Builder $query */
  1283. $query->where("customer_id",$customerId);
  1284. });
  1285. }
  1286. if (request("owner_id")){
  1287. $ownerId = request("owner_id");
  1288. $models->whereHas("owners",function ($query)use($ownerId){
  1289. /** @var Builder $query */
  1290. $query->where("id",$ownerId);
  1291. });
  1292. }
  1293. if (request("name")){
  1294. $models->where("name","like","%".request("name")."%");
  1295. }
  1296. $this->success($models->get());
  1297. }
  1298. public function apiDelStorage()
  1299. {
  1300. $this->gate("客户管理-项目-录入");
  1301. if (!request("id"))$this->error("非法参数");
  1302. app("OwnerStoragePriceModelService")->destroy(request("id"));
  1303. $this->success();
  1304. }
  1305. public function apiDelOperation()
  1306. {
  1307. $this->gate("客户管理-项目-录入");
  1308. if (!request("id"))$this->error("非法参数");
  1309. app("OwnerPriceOperationService")->destroy(request("id"));
  1310. $this->success();
  1311. }
  1312. public function apiDelOperationItem()
  1313. {
  1314. $this->gate("客户管理-项目-录入");
  1315. if (!request("id"))$this->error("非法参数");
  1316. app("OwnerPriceOperationItemService")->destroy(request("id"));
  1317. $this->success();
  1318. }
  1319. public function apiDelExpress()
  1320. {
  1321. $this->gate("客户管理-项目-录入");
  1322. if (!request("id"))$this->error("非法参数");
  1323. app("OwnerPriceExpressService")->destroy(request("id"));
  1324. $this->success();
  1325. }
  1326. public function apiDelExpressItem()
  1327. {
  1328. $this->gate("客户管理-项目-录入");
  1329. if (!request("id"))$this->error("非法参数");
  1330. app("OwnerPriceExpressService")->destroyDetail(request("id"));
  1331. $this->success();
  1332. }
  1333. public function apiDelLogistic()
  1334. {
  1335. $this->gate("客户管理-项目-录入");
  1336. if (!request("id"))$this->error("非法参数");
  1337. app("OwnerPriceLogisticService")->destroy(request("id"));
  1338. $this->success();
  1339. }
  1340. public function apiDelLogisticItem()
  1341. {
  1342. $this->gate("客户管理-项目-录入");
  1343. if (!request("id"))$this->error("非法参数");
  1344. app("OwnerPriceLogisticService")->destroyDetail(request("id"));
  1345. $this->success();
  1346. }
  1347. public function apiDelDirectLogistic()
  1348. {
  1349. $this->gate("客户管理-项目-录入");
  1350. if (!request("id"))$this->error("非法参数");
  1351. app("OwnerPriceDirectLogisticService")->destroy(request("id"));
  1352. $this->success();
  1353. }
  1354. public function apiDelDirectLogisticItem()
  1355. {
  1356. $this->gate("客户管理-项目-录入");
  1357. if (!request("id"))$this->error("非法参数");
  1358. app("OwnerPriceDirectLogisticService")->destroyDetail(request("id"));
  1359. $this->success();
  1360. }
  1361. }