appointment.blade.php 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385
  1. @extends('layouts.app')
  2. @section('title')入库预约@endsection
  3. @section('content')
  4. <div class="container-fluid" id="container">
  5. <h3 class="text-danger"> 当前功能已停用,请转至SWMS系统</h3>
  6. {{-- <div class="card">--}}
  7. {{-- <div class="card-body row">--}}
  8. {{-- <div class="offset-2 col-8">--}}
  9. {{-- <!-- <div class="card">--}}
  10. {{-- <div class="card-header">--}}
  11. {{-- <div class="row">--}}
  12. {{-- <label class="col-2">--}}
  13. {{-- <label class="text-danger font-weight-bold ml-2 h4">*</label>--}}
  14. {{-- </label>--}}
  15. {{-- <label class="col-2">车牌号</label>--}}
  16. {{-- <label class="col-2">车型</label>--}}
  17. {{-- <label class="col-2">司机姓名</label>--}}
  18. {{-- <label class="col-3">司机电话</label>--}}
  19. {{-- <label class="col-1">--}}
  20. {{-- <span class="fa fa-plus cursor-pointer text-primary" @click="addCar()">增加</span>--}}
  21. {{-- </label>--}}
  22. {{-- </div>--}}
  23. {{-- </div>--}}
  24. {{-- <div class="card-body">--}}
  25. {{-- <div class="row" v-for="(car,i) in model.cars">--}}
  26. {{-- <label class="col-2">车辆-@{{ i+1 }}</label>--}}
  27. {{-- <label class="col-2">--}}
  28. {{-- <input type="text" class="form-control" v-model="car.license_plate_number" :class="errors['cars.'+i+'.license_plate_number'] ? 'is-invalid' : ''">--}}
  29. {{-- </label>--}}
  30. {{-- <label class="col-2">--}}
  31. {{-- <div class="dropdown">--}}
  32. {{-- <input type="text" class="form-control" v-model="car.car_name" :id="'car-'+i" @input="searchCar(car.car_name)"--}}
  33. {{-- data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" @click="searchInit()">--}}
  34. {{-- <div class="dropdown-menu" :aria-labelledby="'car-'+i" v-show="haystack.length>0">--}}
  35. {{-- <span class="row offset-1 text-secondary" v-for="c in haystack" @click.stop="selectCar(c,i)">@{{ c.name }}<br></span>--}}
  36. {{-- </div>--}}
  37. {{-- </div>--}}
  38. {{-- </label>--}}
  39. {{-- <label class="col-2">--}}
  40. {{-- <input type="text" class="form-control" v-model="car.driver_name">--}}
  41. {{-- </label>--}}
  42. {{-- <label class="col-3">--}}
  43. {{-- <input type="text" class="form-control" v-model="car.driver_phone">--}}
  44. {{-- </label>--}}
  45. {{-- <label class="col-1" v-if="i!==0">--}}
  46. {{-- <span class="h4 font-weight-bold cursor-pointer text-danger" @click="delCar(i)">&times;</span>--}}
  47. {{-- </label>--}}
  48. {{-- <label v-if="errors['cars.'+i+'.license_plate_number']" class="col-2 offset-2 text-danger font-weight-bold small">--}}
  49. {{-- @{{ errors['cars.'+i+'.license_plate_number'][0] }}--}}
  50. {{-- </label>--}}
  51. {{-- </div>--}}
  52. {{-- </div>--}}
  53. {{-- </div>-->--}}
  54. {{-- <div class="row ml-1">--}}
  55. {{-- <div class="col-6">--}}
  56. {{-- <div class="row mt-4">--}}
  57. {{-- <label class="col-3" for="ownerId"><b class="text-danger">*&nbsp;</b>货主</label>--}}
  58. {{-- <select id="ownerId" v-model="model.owner_id" class="col-5 form-control" :class="errors.owner_id ? 'is-invalid' : ''">--}}
  59. {{-- <option v-for="owner in owners" :value="owner.id">@{{ owner.name }}</option>--}}
  60. {{-- </select>--}}
  61. {{-- <label class="col-4"><input class="form-control form-control-sm rounded-pill" placeholder="搜索货主" @input="seekOwner($event)"></label>--}}
  62. {{-- </div>--}}
  63. {{-- <label class="row mt-0 mb-0 ml-1" v-if="errors.owner_id">--}}
  64. {{-- <label class="offset-2 text-danger font-weight-bold small">@{{ errors.owner_id[0] }}</label>--}}
  65. {{-- </label>--}}
  66. {{-- <div class="row mt-2">--}}
  67. {{-- <label class="col-3" for="procurementNumber">采购单号</label>--}}
  68. {{-- <input class="col-9 form-control" type="text" id="procurementNumber" v-model="model.procurement_number" :class="errors.procurement_number ? 'is-invalid' : ''">--}}
  69. {{-- </div>--}}
  70. {{-- <div class="row mt-2">--}}
  71. {{-- <label class="col-3" for="asnNumber"><b class="text-danger">*&nbsp;</b>ASN单号</label>--}}
  72. {{-- <input class="col-9 form-control" placeholder="可以输入多个,使用空格或逗号分隔" @blur="verifyASN()"--}}
  73. {{-- type="text" id="asnNumber" v-model="model.asn_number" :class="errors.asn_number ? 'is-invalid' : ''">--}}
  74. {{-- </div>--}}
  75. {{-- <div class="row mt-2">--}}
  76. {{-- <label class="col-3" for="warehouse"><b class="text-danger">*&nbsp;</b>仓库</label>--}}
  77. {{-- <select id="warehouse" v-model="model.warehouse_id" class="col-6 form-control" :class="errors.warehouse_id ? 'is-invalid' : ''">--}}
  78. {{-- <option v-for="warehouse in warehouses" :value="warehouse.id">@{{ warehouse.name }}</option>--}}
  79. {{-- </select>--}}
  80. {{-- </div>--}}
  81. {{-- <label class="row mt-0 mb-0" v-if="errors.warehouse_id">--}}
  82. {{-- <label class="offset-2 text-danger font-weight-bold small">@{{ errors.warehouse_id[0] }}</label>--}}
  83. {{-- </label>--}}
  84. {{-- <div class="row mt-2">--}}
  85. {{-- <label class="col-3" for="cubic_meter"><b class="text-danger">*&nbsp;</b>立方</label>--}}
  86. {{-- <input class="col-3 form-control" type="number" step="0.01" min="0" id="cubic_meter" v-model="model.cubic_meter" :class="errors.cubic_meter ? 'is-invalid' : ''">--}}
  87. {{-- <label class="col-2 offset-1" for="tonne"><b class="text-danger">*&nbsp;</b>吨</label>--}}
  88. {{-- <input class="col-3 form-control" type="number" step="0.01" min="0" id="tonne" v-model="model.tonne" :class="errors.tonne ? 'is-invalid' : ''">--}}
  89. {{-- </div>--}}
  90. {{-- <label class="row mt-0 mb-0" v-if="errors.cubic_meter || errors.tonne">--}}
  91. {{-- <label class="offset-2 text-danger col-3 small"><b v-if="errors.cubic_meter">@{{ errors.cubic_meter[0] }}</b></label>--}}
  92. {{-- <label class="offset-3 text-danger font-weight-bold small" v-if="errors.tonne">@{{ errors.tonne[0] }}</label>--}}
  93. {{-- </label>--}}
  94. {{-- </div>--}}
  95. {{-- <div class="col-5 offset-1">--}}
  96. {{-- <div class="row mt-4">--}}
  97. {{-- <label class="col-3" for="isToC">输入车型</label>--}}
  98. {{-- <input content="col-4" id="isToC" type="checkbox" class="switch" v-model="model.isToC">--}}
  99. {{-- </div>--}}
  100. {{-- <div v-if="model.isToC">--}}
  101. {{-- <div class="row mt-2">--}}
  102. {{-- <label class="col-3" for="car_name">车型</label>--}}
  103. {{-- <div class="dropdown col-6 d-inline-block p-0">--}}
  104. {{-- <input type="text" class="form-control" v-model="model.cars[0].car_name" id="car-0" @input="searchCar(model.cars[0].car_name)"--}}
  105. {{-- data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" @click="searchInit()">--}}
  106. {{-- <div class="dropdown-menu" aria-labelledby="car-0" v-show="haystack.length>0">--}}
  107. {{-- <span class="row offset-1 text-secondary" v-for="c in haystack" @click.stop="selectCar(c,0)">@{{ c.name }}<br></span>--}}
  108. {{-- </div>--}}
  109. {{-- </div>--}}
  110. {{-- </div>--}}
  111. {{-- <div class="row mt-2">--}}
  112. {{-- <label class="col-3" for="license_plate_number">车牌号</label>--}}
  113. {{-- <input type="text" id="license_plate_number" class="col-9 form-control" v-model="model.cars[0].license_plate_number" :class="errors['cars.0.license_plate_number'] ? 'is-invalid' : ''">--}}
  114. {{-- </div>--}}
  115. {{-- </div>--}}
  116. {{-- <div v-else>--}}
  117. {{-- <div class="row mt-2">--}}
  118. {{-- <label class="col-3" for="logistic">快递公司</label>--}}
  119. {{-- <select id="logistic" v-model="model.logistic_id" class="col-6 form-control" :class="errors.logistic_id ? 'is-invalid' : ''">--}}
  120. {{-- <option v-for="logistic in logistics" :value="logistic.id">@{{ logistic.name }}</option>--}}
  121. {{-- </select>--}}
  122. {{-- </div>--}}
  123. {{-- <div class="row mt-2">--}}
  124. {{-- <label class="col-3" for="logistic_number">快递单号</label>--}}
  125. {{-- <input class="col-9 form-control" type="text" id="logistic_number" v-model="model.logistic_number" :class="errors.logistic_number ? 'is-invalid' : ''">--}}
  126. {{-- </div>--}}
  127. {{-- </div>--}}
  128. {{-- <div class="row mt-2">--}}
  129. {{-- <label class="col-3" for="box_amount">箱数</label>--}}
  130. {{-- <input class="col-6 form-control" step="1" min="0" type="number" id="box_amount" v-model="model.box_amount" :class="errors.box_amount ? 'is-invalid' : ''">--}}
  131. {{-- </div>--}}
  132. {{-- <label class="row mt-0 mb-0" v-if="errors.box_amount">--}}
  133. {{-- <label class="offset-2 text-danger font-weight-bold small">@{{ errors.box_amount[0] }}</label>--}}
  134. {{-- </label>--}}
  135. {{-- <div class="row mt-2">--}}
  136. {{-- <label class="col-3" for="isUpload">上传明细单</label>--}}
  137. {{-- <input content="col-4" id="isUpload" type="checkbox" class="switch" v-model="model.is_upload">--}}
  138. {{-- <button id="openFile" type="button" class="col-3 offset-1 btn btn-sm btn-info text-white"--}}
  139. {{-- title="表头必须包含:商品名称 数量 条码"--}}
  140. {{-- :data-toggle="errors.details ? 'popover' : 'tooltip'"--}}
  141. {{-- v-show="model.is_upload" @click="openFile()">--}}
  142. {{-- <span class="fa fa-cloud-upload"></span> 选择文件</button>--}}
  143. {{-- <span v-if="model.is_upload" class="text-secondary mt-1">&nbsp;@{{ fileName }}</span>--}}
  144. {{-- <label hidden><input type="file" id="file" accept=".csv, .xlsx, .xls" @change="selectedFile($event)"></label>--}}
  145. {{-- </div>--}}
  146. {{-- <div class="row mt-2">--}}
  147. {{-- <label class="col-3" for="remark">预约备注</label>--}}
  148. {{-- <textarea class="col-9 form-control" v-model="model.remark" id="remark"></textarea>--}}
  149. {{-- </div>--}}
  150. {{-- </div>--}}
  151. {{-- </div>--}}
  152. {{-- <div class="row mt-4 ml-1">--}}
  153. {{-- <button type="button" class="btn btn-success col-8 offset-2" @click="submit()">提 交 预 约</button>--}}
  154. {{-- </div>--}}
  155. {{-- </div>--}}
  156. {{-- @include("store.deliveryAppointment._selectDate")--}}
  157. {{-- </div>--}}
  158. {{-- </div>--}}
  159. </div>
  160. @stop
  161. @section("lastScript")
  162. <script>
  163. new Vue({
  164. el:"#container",
  165. data:{
  166. cars:[@foreach($cars as $car)@json($car),@endforeach],
  167. model:{
  168. cars:[{license_plate_number:"",car_id:"",driver_name:"",driver_phone:""}],
  169. },
  170. owners:[@foreach($owners as $owner)@json($owner),@endforeach],
  171. warehouses:[@foreach($warehouses as $warehouse)@json($warehouse),@endforeach],
  172. logistics:[@foreach($logistics as $logistic)@json($logistic),@endforeach],
  173. fileName:"",
  174. details:[],
  175. errors : {
  176. details:"",
  177. },
  178. haystack:[],
  179. capacities:[],
  180. selectDate:{},
  181. btnName:"确定预约",
  182. },
  183. mounted(){
  184. if (this.owners.length === 1)this.$set(this.model,"owner_id",this.owners[0].id);
  185. $('#openFile').tooltip();
  186. },
  187. methods:{
  188. searchInit(){
  189. let stack = [];
  190. this.cars.forEach(car=>{
  191. stack.push(car);
  192. });
  193. this.haystack = stack;
  194. },
  195. selectCar(car,index){
  196. this.model.cars[index].car_id = car.id;
  197. this.model.cars[index].car_name = car.name;
  198. this.haystack = [];
  199. },
  200. searchCar(name){
  201. if (!name){
  202. this.haystack = [];
  203. return;
  204. }
  205. let stack = [];
  206. this.cars.forEach(car=>{
  207. if (car.name.indexOf(name)!==-1)stack.push(car);
  208. });
  209. this.haystack = stack;
  210. },
  211. seekOwner(e){
  212. let val = e.target.value;
  213. this.owners.some(owner=>{
  214. if (owner.name.indexOf(val)!==-1){
  215. this.$set(this.model,"owner_id",owner.id);
  216. return true;
  217. }
  218. })
  219. },
  220. openFile(){
  221. $('#file').click();
  222. },
  223. selectedFile(e){
  224. window.tempTip.setDuration(3000);
  225. let file=e.target.files[0];
  226. if (!file)return;
  227. this.fileName = file.name;
  228. let formData = new FormData();
  229. formData.append("file",file);
  230. window.axios.post('{{url('store/deliveryAppointment/appointment/import')}}',formData,{
  231. 'Content-Type':'multipart/form-data'
  232. }).then(res=>{
  233. if (!res.data.success){
  234. window.tempTip.setDuration(3000);
  235. window.tempTip.show(res.data.data);
  236. }else{
  237. let arr = res.data.data;
  238. let details = [];
  239. for(let key in arr.data){
  240. let data=arr.data[key];
  241. details.push({name:data["商品名称"],amount:data["数量"],bar_code:data["条码"]});
  242. }
  243. this.details = details;
  244. if (Object.keys(arr.errors).length>0){
  245. let err = "<span class='text-danger'>";
  246. for(let key in arr.errors){
  247. let errors=arr.errors[key];
  248. err += "<b class='text-dark'>第"+key+"行</b>"+"<br>";
  249. errors.forEach(error=>{
  250. err += "&nbsp;&nbsp;&nbsp;&nbsp;"+error+"<br>";
  251. });
  252. }
  253. err += "</span>";
  254. this.errors.details = err;
  255. $('#openFile').tooltip('dispose').attr("title","明细错误信息").popover({
  256. html: true,
  257. content: err,
  258. placement:'right',
  259. trigger:'focus'
  260. }).popover('show');
  261. }else $('#openFile').popover('dispose').tooltip('show');
  262. }
  263. }).catch(err=> {
  264. window.tempTip.show("网络错误:"+err);
  265. })
  266. },
  267. addCar(){
  268. this.model.cars.push({});
  269. },
  270. delCar(index){
  271. this.$delete(this.model.cars,index);
  272. },
  273. submit(){
  274. let errors = {};
  275. if (!this.model.owner_id)errors.owner_id = ["不得为空"];
  276. if (!this.model.warehouse_id)errors.warehouse_id = ["不得为空"];
  277. if (!this.model.tonne && !this.model.cubic_meter){
  278. errors.tonne = ["吨与立方值至少填写一个"];
  279. errors.cubic_meter = ["立方值与吨至少填写一个"];
  280. }
  281. let change = [];
  282. let insert = [];
  283. this.model.cars.forEach((car,i)=>{
  284. //if (!car.license_plate_number) errors["cars."+i+".license_plate_number"] = ["不得为空"];
  285. if (!car.car_id && car.car_name){
  286. if (this.cars.every(c=>{
  287. if (c.name === car.car_name){
  288. car.car_id = c.id;
  289. return false;
  290. }
  291. return true;
  292. })){
  293. change.push({index:i,name:car.car_name});
  294. if (insert.indexOf(car.car_name)===-1)insert.push(car.car_name);
  295. }
  296. }
  297. });
  298. if (JSON.stringify(errors) !== "{}"){
  299. errors.details=this.errors.details;
  300. this.errors = errors;
  301. return
  302. }
  303. if (change.length>0)this._addCars(insert,change);
  304. let param = {
  305. model:this.model,
  306. detail_amount:this.details.length,
  307. };
  308. window.tempTip.postBasicRequest("{{url('store/deliveryAppointment/getCapacity')}}",param,res=>{
  309. if (res.errors) {
  310. this.errors = res.errors;
  311. return;
  312. }
  313. this.capacities = res;
  314. $("#modal").modal("show");
  315. });
  316. },
  317. _addCars(arr,change){
  318. window.tempTip.postBasicRequest("{{url('maintenance/carType/batchInsert')}}",{arr:arr},res=>{
  319. res.forEach(data=>{
  320. change.forEach(car=>{
  321. if (data.name === car.name)this.model.cars[car.index].car_id = data.id;
  322. });
  323. });
  324. });
  325. },
  326. selectPeriod(date,time,isSelect){
  327. if (isSelect) this.selectDate = {date:date,time:time};
  328. },
  329. submitAppointment(){
  330. window.tempTip.setDuration(3000);
  331. window.tempTip.setIndex(1099);
  332. if (!this.selectDate.date){
  333. window.tempTip.show("尚未选择预约时间");
  334. return;
  335. }
  336. let url = "{{url('store/deliveryAppointment/submitAppointment')}}";
  337. let param = {
  338. model:this.model,
  339. details:this.details,
  340. date:this.selectDate,
  341. };
  342. window.tempTip.postBasicRequest(url,param,res=>{
  343. if (res.errors){
  344. this.errors = res.errors;
  345. return;
  346. }
  347. if (res.isFail){
  348. this.capacities.some(capacity=>{
  349. if (capacity.date === this.selectDate.date){
  350. capacity.period.some(p=>{
  351. if (p.index === this.selectDate.time){
  352. p.isAvailable = false;
  353. return true;
  354. }
  355. });
  356. return true;
  357. }
  358. });
  359. this.selectDate={};
  360. window.tempTip.show("该预约时段已经被抢占了,请选择其他时段");
  361. return;
  362. }
  363. window.location.href = "{{url('store/deliveryAppointment/showAppointmentInfo?k=')}}"+res.key;
  364. },true);
  365. },
  366. verifyASN(){
  367. if (!this.model.asn_number)return;
  368. let url = "{{url('store/deliveryAppointment/verifyASN')}}";
  369. window.tempTip.postBasicRequest(url,{asn:this.model.asn_number},res=>{
  370. if (!res)return "ASN单不存在明细项";
  371. let details = [];
  372. res.forEach(item=>{
  373. details.push({name:"",amount:item.expected_amount,bar_code:"",commodity_id:item.commodity_id});
  374. });
  375. this.details = details;
  376. this.fileName = (details.length)+"条明细";
  377. return "成功匹配ASN,"+(details.length)+"条明细";
  378. })
  379. },
  380. },
  381. });
  382. </script>
  383. @stop