1008 lines
		
	
	
		
			34 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			1008 lines
		
	
	
		
			34 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| /*
 | |
|  * @Description  :
 | |
|  * @Version      : 1.0
 | |
|  * @Author       : Shiming
 | |
|  * @Date         : 2021-12-23 13:39:58
 | |
|  * @LastEditors  : Shiming
 | |
|  * @LastEditTime : 2022-04-20 14:48:08
 | |
|  * @FilePath     : \\tms-obc-web\\src\\app\\routes\\order-management\\components\\vehicle-detail-change\\vehicle-detail-change.component.ts
 | |
|  * Copyright (C) 2022 huzhenhong. All rights reserved.
 | |
|  */
 | |
| import { Component, OnInit, ViewChild } from '@angular/core';
 | |
| import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms';
 | |
| import { ActivatedRoute, Router } from '@angular/router';
 | |
| import { apiConf } from '@conf/api.conf';
 | |
| import { STColumn, STComponent } from '@delon/abc/st';
 | |
| import { SFComponent, SFSchema, SFSelectWidgetSchema, SFUISchema, SFUploadWidgetSchema } from '@delon/form';
 | |
| import { AmapPoiPickerComponent, AmapService, EACacheService, EAEnvironmentService, ShipperBaseService } from '@shared';
 | |
| import { NzCardComponent } from 'ng-zorro-antd/card';
 | |
| import { NzMessageService } from 'ng-zorro-antd/message';
 | |
| import { NzModalService } from 'ng-zorro-antd/modal';
 | |
| import { NzUploadChangeParam, NzUploadFile } from 'ng-zorro-antd/upload';
 | |
| import { Observable, Observer } from 'rxjs';
 | |
| import { map } from 'rxjs/operators';
 | |
| import format from 'date-fns/format';
 | |
| import { OrderManagementService } from '../../services/order-management.service';
 | |
| function getBase64(file: File): Promise<string | ArrayBuffer | null> {
 | |
|   return new Promise((resolve, reject) => {
 | |
|     const reader = new FileReader();
 | |
|     reader.readAsDataURL(file);
 | |
|     reader.onload = () => resolve(reader.result);
 | |
|     reader.onerror = error => reject(error);
 | |
|   });
 | |
| }
 | |
| @Component({
 | |
|   selector: 'app-supply-management-vehicle-detail-change',
 | |
|   templateUrl: './vehicle-detail-change.component.html',
 | |
|   styleUrls: ['./vehicle-detail-change.component.less', '../../../commom/less/trajectory.less']
 | |
| })
 | |
| export class OrderManagementVehicleDetailChangeComponent implements OnInit {
 | |
|   validateForm1: FormGroup;
 | |
|   id = this.route.snapshot.params.id;
 | |
|   @ViewChild('distannce3', { static: false })
 | |
|   i: any = { unLoadingPlaceList: [] };
 | |
|   totalDistance = 0.0; //总里程
 | |
|   totalTime = 0.0; //路程总时间
 | |
|   startInfo: any = []; // 装货信息
 | |
|   endInfo: any = []; // 卸货信息
 | |
|   unloadTime: any; // 货源单设置回显
 | |
|   loadTime: any; // 货源单设置回显
 | |
|   sf3data: any; // 货源单设置回显
 | |
|   sf4data: any; // 货源单设置回显
 | |
|   dirverPhone: any; // 货源单设置回显
 | |
|   dirverBankCard: any; // 货源单设置回显
 | |
|   listImagUrls: any[] = []; // 货源单设置回显
 | |
|   billExpenses: any[] = []; //运费信息表格信息
 | |
|   dirvingMessage = [];
 | |
|   modalcontent: any;
 | |
|   modalTitle: string = '';
 | |
|   attObj: any;
 | |
|   totalObj: any;
 | |
|   approvalLsit: any;
 | |
|   imges: any;
 | |
|   previewImage1 = '';
 | |
|   previewVisible1 = false;
 | |
|   @ViewChild('sf3', { static: false }) sf3!: SFComponent;
 | |
|   schema3: SFSchema = {};
 | |
|   ui3!: SFUISchema;
 | |
|   @ViewChild('st') st!: STComponent;
 | |
|   @ViewChild('sf4', { static: false }) sf4!: SFComponent;
 | |
|   schema4: SFSchema = {};
 | |
|   isVisible = false;
 | |
|   ui4!: SFUISchema;
 | |
|   formData: any;
 | |
|   @ViewChild('sf', { static: false }) sf!: SFComponent;
 | |
|   schema: SFSchema = {};
 | |
|   ui: SFUISchema = {};
 | |
|   logColumns: STColumn[] = [
 | |
|     { title: '款项', index: 'expenseCodeLabel' },
 | |
|     { title: '小计(元)', render: 'prices' },
 | |
|     { title: '运输费(元)', render: 'price' },
 | |
|     { title: '附加费(元)', render: 'surcharge' },
 | |
|     { title: '支付时间', index: 'paymentTime' },
 | |
|     {
 | |
|       title: '支付状态',
 | |
|       className: 'text-center',
 | |
|       index: 'paymentStatusLabel',
 | |
|     }
 | |
|   ];
 | |
|   trajectory = 'car';
 | |
|   mapList: any[] = []; //地图点位数据组
 | |
|   addressItems: any[] = []; //打点地址数据组
 | |
|   logColumns2: STColumn[] = [
 | |
|     { title: '时间', index: 'parkBte' },
 | |
|     { title: '地点', index: 'parkAdr' }
 | |
|   ];
 | |
|   constructor(
 | |
|     private route: ActivatedRoute,
 | |
|     private router: Router,
 | |
|     private msgSrv: NzMessageService,
 | |
|     public service: OrderManagementService,
 | |
|     private modalService: NzModalService,
 | |
|     private amapService: AmapService,
 | |
|     public shipperservice: ShipperBaseService,
 | |
|     private ar: ActivatedRoute,
 | |
|     fb: FormBuilder,
 | |
|     private envSrv: EAEnvironmentService
 | |
|   ) {
 | |
|     this.validateForm1 = fb.group({
 | |
|       loadTime: [null, []],
 | |
|       unloadTime: [null, []]
 | |
|     });
 | |
|   }
 | |
| 
 | |
|   ngOnInit(): void {
 | |
|     this.initData();
 | |
|     this.initSF3();
 | |
|     this.initSF4();
 | |
|     this.initSF();
 | |
|   }
 | |
|   initSF() {
 | |
|     this.schema = {
 | |
|       properties: {
 | |
|         loadingLadingBillFilePath: {
 | |
|           type: 'string',
 | |
|           title: '装货凭证',
 | |
|           // readOnly: this.i.billStatus !== '4' || this.i.billStatus !== '3',
 | |
|           ui: {
 | |
|             widget: 'upload',
 | |
|             action: apiConf.waterFileUpload,
 | |
|             fileType: 'image/png,image/jpeg,image/jpg,image/gif',
 | |
|             limit: 1,
 | |
|             limitFileCount: 1,
 | |
|             resReName: 'data.fullFileWatermarkPath',
 | |
|             urlReName: 'data.fullFileWatermarkPath',
 | |
|             descriptionI18n: '提货单',
 | |
|             data: {
 | |
|               appId: this.envSrv.env.appId,
 | |
|               content: [
 | |
|                 `上传用户:${this.i?.driverName}(${this.i?.driverTelephone})`,
 | |
|                 `上传位置:${this.i?.unLoadingPlaceList[0]?.province}`,
 | |
|                 `上传时间:${format(new Date(), 'yyyy-MM-dd HH:mm:ss')}`,
 | |
|               ],
 | |
|               position: '2',
 | |
|               fontSize: '100'
 | |
|             },
 | |
|             name: 'multipartFile',
 | |
|             beforeUpload: (file: any, fileList: any) => {
 | |
|               return new Observable((observer: Observer<boolean>) => {
 | |
|                 const isLt1M = file.size / 1024 / 1024 < 5;
 | |
|                 const fileType = 'image/png,image/jpeg';
 | |
|                 if (fileType.indexOf(file.type) === -1) {
 | |
|                   this.service.msgSrv.warning('图片格式不正确!');
 | |
|                   observer.complete();
 | |
|                   return;
 | |
|                 }
 | |
|                 if (!isLt1M) {
 | |
|                   this.service.msgSrv.warning('图片大小超过5M!');
 | |
|                   observer.complete();
 | |
|                   return;
 | |
|                 }
 | |
|                 observer.next(isLt1M);
 | |
|                 observer.complete();
 | |
|               });
 | |
|             },
 | |
|             multiple: false,
 | |
|             listType: 'picture-card'
 | |
|           } as SFUploadWidgetSchema
 | |
|         },
 | |
|         loadingPeopleVehiclesGoodsFilePath: {
 | |
|           type: 'string',
 | |
|           title: '',
 | |
|           // readOnly: this.i.billStatus !== '4' || this.i.billStatus !== '3',
 | |
|           ui: {
 | |
|             widget: 'upload',
 | |
|             action: apiConf.waterFileUpload,
 | |
|             fileType: 'image/png,image/jpeg,image/jpg,image/gif',
 | |
|             limit: 1,
 | |
|             limitFileCount: 1,
 | |
|             resReName: 'data.fullFileWatermarkPath',
 | |
|             urlReName: 'data.fullFileWatermarkPath',
 | |
|             descriptionI18n: '人车货照片',
 | |
|             data: {
 | |
|               appId: this.envSrv.env.appId,
 | |
|               content: [
 | |
|                 `上传用户:${this.i?.driverName}(${this.i?.driverTelephone})`,
 | |
|                 `上传位置:${this.i?.unLoadingPlaceList[0]?.province}`,
 | |
|                 `上传时间:${format(new Date(), 'yyyy-MM-dd HH:mm:ss')}`,
 | |
|               ],
 | |
|               position: '2',
 | |
|               fontSize: '100'
 | |
|             },
 | |
|             name: 'multipartFile',
 | |
|             beforeUpload: (file: any, fileList: any) => {
 | |
|               return new Observable((observer: Observer<boolean>) => {
 | |
|                 const isLt1M = file.size / 1024 / 1024 < 5;
 | |
|                 const fileType = 'image/png,image/jpeg';
 | |
|                 if (fileType.indexOf(file.type) === -1) {
 | |
|                   this.service.msgSrv.warning('图片格式不正确!');
 | |
|                   observer.complete();
 | |
|                   return;
 | |
|                 }
 | |
|                 if (!isLt1M) {
 | |
|                   this.service.msgSrv.warning('图片大小超过5M!');
 | |
|                   observer.complete();
 | |
|                   return;
 | |
|                 }
 | |
|                 observer.next(isLt1M);
 | |
|                 observer.complete();
 | |
|               });
 | |
|             },
 | |
|             multiple: false,
 | |
|             listType: 'picture-card'
 | |
|           } as SFUploadWidgetSchema
 | |
|         },
 | |
|         no7: {
 | |
|           type: 'string',
 | |
|           title: '',
 | |
|           ui: {
 | |
|             widget: 'text'
 | |
|           },
 | |
|           default: ''
 | |
|         },
 | |
|         unloadingLadingBillFilePath: {
 | |
|           type: 'string',
 | |
|           title: '卸货凭证',
 | |
|           // readOnly: this.i.billStatus !== '4' || this.i.billStatus !== '3',
 | |
|           ui: {
 | |
|             widget: 'upload',
 | |
|             action: apiConf.waterFileUpload,
 | |
|             fileType: 'image/png,image/jpeg,image/jpg,image/gif',
 | |
|             limit: 1,
 | |
|             limitFileCount: 1,
 | |
|             resReName: 'data.fullFileWatermarkPath',
 | |
|             urlReName: 'data.fullFileWatermarkPath',
 | |
|             descriptionI18n: '提货单',
 | |
|             data: {
 | |
|               appId: this.envSrv.env.appId,
 | |
|               content: [
 | |
|                 `上传用户:${this.i?.driverName}(${this.i?.driverTelephone})`,
 | |
|                 `上传位置:${this.i?.unLoadingPlaceList[1]?.province}`,
 | |
|                 `上传时间:${format(new Date(), 'yyyy-MM-dd HH:mm:ss')}`,
 | |
|               ],
 | |
|               position: '2',
 | |
|               fontSize: '100'
 | |
|             },
 | |
|             name: 'multipartFile',
 | |
|             beforeUpload: (file: any, fileList: any) => {
 | |
|               return new Observable((observer: Observer<boolean>) => {
 | |
|                 const isLt1M = file.size / 1024 / 1024 < 5;
 | |
|                 const fileType = 'image/png,image/jpeg';
 | |
|                 if (fileType.indexOf(file.type) === -1) {
 | |
|                   this.service.msgSrv.warning('图片格式不正确!');
 | |
|                   observer.complete();
 | |
|                   return;
 | |
|                 }
 | |
|                 if (!isLt1M) {
 | |
|                   this.service.msgSrv.warning('图片大小超过5M!');
 | |
|                   observer.complete();
 | |
|                   return;
 | |
|                 }
 | |
|                 observer.next(isLt1M);
 | |
|                 observer.complete();
 | |
|               });
 | |
|             },
 | |
|             multiple: false,
 | |
|             listType: 'picture-card'
 | |
|           } as SFUploadWidgetSchema
 | |
|         },
 | |
|         unloadingPeopleVehiclesGoodsFilePath: {
 | |
|           type: 'string',
 | |
|           title: '',
 | |
|           // readOnly: this.i.billStatus !== '4' || this.i.billStatus !== '3',
 | |
|           ui: {
 | |
|             widget: 'upload',
 | |
|             action: apiConf.waterFileUpload,
 | |
|             fileType: 'image/png,image/jpeg,image/jpg,image/gif',
 | |
|             limit: 1,
 | |
|             limitFileCount: 1,
 | |
|             resReName: 'data.fullFileWatermarkPath',
 | |
|             urlReName: 'data.fullFileWatermarkPath',
 | |
|             descriptionI18n: '人车货照片',
 | |
|             data: {
 | |
|               appId: this.envSrv.env.appId,
 | |
|               content: [
 | |
|                 `上传用户:${this.i?.driverName}(${this.i?.driverTelephone})`,
 | |
|                 `上传位置:${this.i?.unLoadingPlaceList[1]?.province}`,
 | |
|                 `上传时间:${format(new Date(), 'yyyy-MM-dd HH:mm:ss')}`,
 | |
|               ],
 | |
|               position: '2',
 | |
|               fontSize: '100'
 | |
|             },
 | |
|             name: 'multipartFile',
 | |
|             beforeUpload: (file: any, fileList: any) => {
 | |
|               return new Observable((observer: Observer<boolean>) => {
 | |
|                 const isLt1M = file.size / 1024 / 1024 < 5;
 | |
|                 const fileType = 'image/png,image/jpeg';
 | |
|                 if (fileType.indexOf(file.type) === -1) {
 | |
|                   this.service.msgSrv.warning('图片格式不正确!');
 | |
|                   observer.complete();
 | |
|                   return;
 | |
|                 }
 | |
|                 if (!isLt1M) {
 | |
|                   this.service.msgSrv.warning('图片大小超过5M!');
 | |
|                   observer.complete();
 | |
|                   return;
 | |
|                 }
 | |
|                 observer.next(isLt1M);
 | |
|                 observer.complete();
 | |
|               });
 | |
|             },
 | |
|             multiple: false,
 | |
|             listType: 'picture-card'
 | |
|           } as SFUploadWidgetSchema
 | |
|         },
 | |
|         no5: {
 | |
|           type: 'string',
 | |
|           title: '',
 | |
|           ui: {
 | |
|             widget: 'text'
 | |
|           },
 | |
|           default: ''
 | |
|         },
 | |
|         no6: {
 | |
|           type: 'string',
 | |
|           title: '',
 | |
|           ui: {
 | |
|             widget: 'text'
 | |
|           },
 | |
|           default: ''
 | |
|         }
 | |
|       },
 | |
|       required: ['loadingLadingBillFilePath', 'unloadingLadingBillFilePath']
 | |
|     };
 | |
|     this.ui = {
 | |
|       '*': {
 | |
|         spanLabelFixed: 100,
 | |
|         grid: { span: 20 }
 | |
|       },
 | |
|       $unloadingLadingBillFilePath: { grid: { span: 12 } },
 | |
|       $unloadingPeopleVehiclesGoodsFilePath: { grid: { span: 12 } },
 | |
|       $loadingLadingBillFilePath: { grid: { span: 12 } },
 | |
|       $loadingPeopleVehiclesGoodsFilePath: { grid: { span: 12 } },
 | |
|       $no4: { grid: { span: 24 } }
 | |
|     };
 | |
|   }
 | |
|   initData() {
 | |
|     this.service.request(this.service.$api_get_getWholeBillDetail, { id: this.id }).subscribe(res => {
 | |
|       // console.log(res);
 | |
|       // console.log(JSON.stringify(res));
 | |
|       if (res) {
 | |
|         this.i = res;
 | |
|         // this.initSF();
 | |
|         this.approvalLsit = res?.scheduleVOList;
 | |
|         this.billExpenses = this.i?.billExpenseDetails?.filter(
 | |
|           (data: any) => data.expenseCode === 'PRE' || data.expenseCode === 'RECE' || data.expenseCode === 'BACK'
 | |
|         );
 | |
|         this.approvalLsit.map((item: any, key: any) => {
 | |
|           if (item.displayStatus === 'HIDE') {
 | |
|             delete this?.approvalLsit?.[key];
 | |
|           }
 | |
|         });
 | |
|         // 对装货凭证进行初始化
 | |
|         let arr: any = [];
 | |
|         res?.receiptFilePath.forEach((element: any, index: any) => {
 | |
|           arr.push({
 | |
|             url: element,
 | |
|             status: 'done',
 | |
|             uid: index
 | |
|           });
 | |
|         });
 | |
|         this.listImagUrls = arr;
 | |
|         this.sf4data = res?.goodsInfoList?.[0];
 | |
|         this.sf3data = {
 | |
|           goodsTypeId: res?.goodsInfoList[0]?.goodsTypeId || '',
 | |
|           goodsTypeName: res?.goodsInfoList[0]?.goodsTypeName || '',
 | |
|           goodsNameId: res?.goodsInfoList[0]?.goodsNameId || '',
 | |
|           goodsName: res?.goodsInfoList[0]?.goodsName || ''
 | |
|         };
 | |
|         if (this.sf3data.goodsTypeName === '其它') {
 | |
|           this.sf3data.goodsName1 = res?.goodsInfoList[0]?.goodsName || '';
 | |
|         }
 | |
|         this.changeGoodsType(this.sf3data?.goodsTypeId, { label: this.sf3data?.goodsTypeName, value: this.sf3data?.goodsTypeId });
 | |
|         // 对装卸货信息进行初始化
 | |
|         res?.unLoadingPlaceList.forEach((element: any) => {
 | |
|           if (element.type === 1 || element.type === '1') {
 | |
|             const controlId = this.startInfo.length;
 | |
|             this.startInfo.push({
 | |
|               detailedAddress: element.detailedAddress,
 | |
|               appUserName: element.appUserName,
 | |
|               contractTelephone: element.contractTelephone,
 | |
|               latitude: element.latitude,
 | |
|               longitude: element.longitude,
 | |
|               province: element.province,
 | |
|               city: element.city,
 | |
|               area: element.area,
 | |
|               type: element.type,
 | |
|               id: element.id
 | |
|             });
 | |
|             this.validateForm1.addControl(`loadAddress${controlId}`, new FormControl(null, Validators.required));
 | |
|             this.validateForm1.addControl(`loadName${controlId}`, new FormControl(null, Validators.required));
 | |
|             this.validateForm1.addControl(`loadPhone${controlId}`, new FormControl(null, Validators.required));
 | |
|           } else if (element.type === 2 || element.type === '2') {
 | |
|             const controlId = this.endInfo.length;
 | |
|             this.endInfo.push({
 | |
|               detailedAddress: element?.detailedAddress,
 | |
|               appUserName: element?.appUserName,
 | |
|               contractTelephone: element?.contractTelephone,
 | |
|               latitude: element.latitude,
 | |
|               longitude: element.longitude,
 | |
|               province: element.province,
 | |
|               city: element.city,
 | |
|               area: element.area,
 | |
|               type: element.type,
 | |
|               id: element.id
 | |
|             });
 | |
|             this.validateForm1.addControl(`unloadAddress${controlId}`, new FormControl(null, Validators.required));
 | |
|             this.validateForm1.addControl(`unloadName${controlId}`, new FormControl(null, Validators.required));
 | |
|             this.validateForm1.addControl(`unloadPhone${controlId}`, new FormControl(null, Validators.required));
 | |
|           }
 | |
|         });
 | |
|         // 对装货凭证进行初始化
 | |
|         this.formData = {
 | |
|           loadingLadingBillFilePath: [
 | |
|             {
 | |
|               uid: 'logo',
 | |
|               name: 'LOGO',
 | |
|               status: 'done',
 | |
|               url: res?.loadingLadingBillFilePath,
 | |
|               response: {
 | |
|                 url: res?.loadingLadingBillFilePath
 | |
|               }
 | |
|             }
 | |
|           ],
 | |
|           loadingPeopleVehiclesGoodsFilePath: [
 | |
|             {
 | |
|               uid: 'logo',
 | |
|               name: 'LOGO',
 | |
|               status: 'done',
 | |
|               url: res?.loadingPeopleVehiclesGoodsFilePath,
 | |
|               response: {
 | |
|                 url: res?.loadingPeopleVehiclesGoodsFilePath,
 | |
|               }
 | |
|             }
 | |
|           ],
 | |
|           unloadingLadingBillFilePath: [
 | |
|             {
 | |
|               uid: 'logo',
 | |
|               name: 'LOGO',
 | |
|               status: 'done',
 | |
|               url: res?.unloadingLadingBillFilePath,
 | |
|               response: {
 | |
|                 url: res?.unloadingLadingBillFilePath
 | |
|               }
 | |
|             }
 | |
|           ],
 | |
|           unloadingPeopleVehiclesGoodsFilePath: [
 | |
|             {
 | |
|               uid: 'logo',
 | |
|               name: 'LOGO',
 | |
|               status: 'done',
 | |
|               url: res?.unloadingPeopleVehiclesGoodsFilePath,
 | |
|               response: {
 | |
|                 url: res?.unloadingPeopleVehiclesGoodsFilePath
 | |
|               }
 | |
|             }
 | |
|           ]
 | |
|         };
 | |
|         // 发车时间到车时间初始化
 | |
|         this.loadTime = res?.loadTime;
 | |
|         this.unloadTime = res?.unloadTime;
 | |
|         this.dirvingMessage = res?.billExpenseDetails;
 | |
|         // 计算里程,时间
 | |
|         if (this.startInfo?.[0]?.area && this.endInfo?.[0]?.area) {
 | |
|           this.amapService.drivingCompute([...this.startInfo], [...this.endInfo]).subscribe(res => {
 | |
|             this.totalDistance = res?.distance;
 | |
|             this.totalTime = res?.time;
 | |
|           });
 | |
|         }
 | |
|       }
 | |
|     });
 | |
|   }
 | |
| 
 | |
|   goBack() {
 | |
|     window.history.go(-1);
 | |
|   }
 | |
|   // 取消修改
 | |
|   cancelChange() {
 | |
|     window.history.go(-1);
 | |
|   }
 | |
|   // 保存修改
 | |
|   save() {
 | |
|     let imgList: any = [];
 | |
|     if (this.listImagUrls.length > 0) {
 | |
|       this.listImagUrls?.forEach((res: any) => {
 | |
|         if (res?.url) {
 | |
|           imgList.push(res?.url);
 | |
|         }
 | |
|       });
 | |
|     }
 | |
|     if (typeof this.unloadTime !== 'string') {
 | |
|       var c = new Date(this.unloadTime);
 | |
|       this.unloadTime =
 | |
|         c.getFullYear() +
 | |
|         '-' +
 | |
|         this.addPreZero(c.getMonth() + 1) +
 | |
|         '-' +
 | |
|         this.addPreZero(c.getDate()) +
 | |
|         ' ' +
 | |
|         this.addPreZero(c.getHours()) +
 | |
|         ':' +
 | |
|         this.addPreZero(c.getMinutes()) +
 | |
|         ':' +
 | |
|         this.addPreZero(c.getSeconds());
 | |
|     }
 | |
|     if (typeof this.loadTime !== 'string') {
 | |
|       var c = new Date(this.loadTime);
 | |
|       this.loadTime =
 | |
|         c.getFullYear() +
 | |
|         '-' +
 | |
|         this.addPreZero(c.getMonth() + 1) +
 | |
|         '-' +
 | |
|         this.addPreZero(c.getDate()) +
 | |
|         ' ' +
 | |
|         this.addPreZero(c.getHours()) +
 | |
|         ':' +
 | |
|         this.addPreZero(c.getMinutes()) +
 | |
|         ':' +
 | |
|         this.addPreZero(c.getSeconds());
 | |
|     }
 | |
|     const params = {
 | |
|       id: this.id,
 | |
|       unLoadingPlaceDTOList: [...this.startInfo, ...this.endInfo],
 | |
|       receiptFilePath: imgList,
 | |
|       goodsInfoDTOList: [
 | |
|         {
 | |
|           id: this.i?.goodsInfoList?.[0].id,
 | |
|           goodsName: this.sf3.value?.goodsName,
 | |
|           ...this.sf4.value
 | |
|         }
 | |
|       ],
 | |
|       // 运费信息
 | |
|       billExpenseDetailDTOList: this.st._data,
 | |
|       // 车队长
 | |
|       payeeId: this.dirverPhone,
 | |
|       dirverBankCard: this.dirverBankCard, // 银行卡
 | |
|       // 发车时间
 | |
|       loadTime: this.loadTime,
 | |
|       // 到车时间
 | |
|       unloadTime: this.unloadTime,
 | |
|       loadingLadingBillFilePath: this.sf.value?.loadingLadingBillFilePath?.data
 | |
|         ? this.sf.value?.loadingLadingBillFilePath.data.fullFilePath
 | |
|         : this.sf.value?.loadingLadingBillFilePath?.url,
 | |
| 
 | |
|       loadingPeopleVehiclesGoodsFilePath: this.sf.value?.loadingPeopleVehiclesGoodsFilePath?.data
 | |
|         ? this.sf.value?.loadingPeopleVehiclesGoodsFilePath.data.fullFilePath
 | |
|         : this.sf.value?.loadingPeopleVehiclesGoodsFilePath?.url,
 | |
| 
 | |
|       unloadingLadingBillFilePath: this.sf.value?.unloadingLadingBillFilePath?.data
 | |
|         ? this.sf.value?.unloadingLadingBillFilePath.data.fullFilePath
 | |
|         : this.sf.value?.unloadingLadingBillFilePath?.url,
 | |
| 
 | |
|       unloadingPeopleVehiclesGoodsFilePath: this.sf.value?.unloadingPeopleVehiclesGoodsFilePath?.data
 | |
|         ? this.sf.value?.unloadingPeopleVehiclesGoodsFilePath.data.fullFilePath
 | |
|         : this.sf.value?.unloadingPeopleVehiclesGoodsFilePath?.url
 | |
|     };
 | |
|     this.service.request(this.service.$api_set_modifyWholeOrder, params).subscribe((res: any) => {
 | |
|       if (res) {
 | |
|         this.service.msgSrv.success('修改成功!');
 | |
|         this.router.navigate(['/order-management/vehicle/vehicle-detail/', this.id], { relativeTo: this.ar });
 | |
|       } else {
 | |
|         this.service.msgSrv.error(res?.msg);
 | |
|       }
 | |
|     });
 | |
|   }
 | |
|   addPreZero(num: any) {
 | |
|     if (num < 10) {
 | |
|       return '0' + num;
 | |
|     } else {
 | |
|       return num;
 | |
|     }
 | |
|   }
 | |
|   // -------------------装卸货信息处理
 | |
|   // 打开地图
 | |
|   openMap(type: string, index: number, address: string) {
 | |
|     const modalRef = this.modalService.create({
 | |
|       nzTitle: '',
 | |
|       nzComponentParams: { selectedAddress: address },
 | |
|       nzContent: AmapPoiPickerComponent,
 | |
|       nzWidth: 900,
 | |
|       nzOnOk: item => {
 | |
|         if (item?.poi) {
 | |
|           const poi = item.poi;
 | |
|           const locList = poi.pois;
 | |
|           switch (type) {
 | |
|             case 'start':
 | |
|               this.startInfo[index].detailedAddress = poi.formattedAddress;
 | |
|               this.startInfo[index].longitude = locList[0];
 | |
|               this.startInfo[index].latitude = locList[1];
 | |
|               this.startInfo[index].province = poi.addressComponent.province;
 | |
|               this.startInfo[index].city = poi.addressComponent.city;
 | |
|               this.startInfo[index].area = poi.addressComponent.district;
 | |
|               this.startInfo[index].address = poi.formattedAddress;
 | |
|               break;
 | |
|             case 'end':
 | |
|               this.endInfo[index].detailedAddress = poi.formattedAddress;
 | |
|               this.endInfo[index].longitude = locList[0];
 | |
|               this.endInfo[index].latitude = locList[1];
 | |
|               this.endInfo[index].province = poi.addressComponent.province;
 | |
|               this.endInfo[index].city = poi.addressComponent.city;
 | |
|               this.endInfo[index].area = poi.addressComponent.district;
 | |
|               this.endInfo[index].address = poi.formattedAddress;
 | |
|               break;
 | |
|             default:
 | |
|               break;
 | |
|           }
 | |
| 
 | |
|           if (this.startInfo[0]?.area && this.endInfo[0]?.area) {
 | |
|             this.amapService.drivingCompute([...this.startInfo], [...this.endInfo]).subscribe((res: any) => {
 | |
|               this.totalDistance = res?.distance;
 | |
|               this.totalTime = res?.time;
 | |
|             });
 | |
|           }
 | |
|           return true
 | |
|         } else {
 | |
|           this.service.msgSrv.warning('请重新手动选择地址!')
 | |
|           return false
 | |
|         }
 | |
|       }
 | |
|     });
 | |
|   }
 | |
|   initSF3() {
 | |
|     this.schema3 = {
 | |
|       properties: {
 | |
|         goodsTypeId: {
 | |
|           type: 'string',
 | |
|           title: '货物名称',
 | |
|           ui: {
 | |
|             widget: 'select',
 | |
|             placeholder: '请选择',
 | |
|             errors: { required: '请选择货物类型' },
 | |
|             asyncData: () =>
 | |
|               this.shipperservice.loadConfigByKey('goods.name.config.type').pipe(
 | |
|                 map((data: any) => {
 | |
|                   return data[0].children?.map((m: any) => {
 | |
|                     return { label: m.name, value: m.id };
 | |
|                   });
 | |
|                 })
 | |
|               ),
 | |
|             change: (value: any, data: any) => {
 | |
|               this.changeGoodsType(value, data);
 | |
|               this.sf3.setValue('/goodsTypeName', data.label);
 | |
|             }
 | |
|           } as SFSelectWidgetSchema
 | |
|         },
 | |
|         goodsTypeName: {
 | |
|           type: 'string',
 | |
|           title: '',
 | |
|           ui: {
 | |
|             hidden: true
 | |
|           }
 | |
|         },
 | |
|         goodsNameId: {
 | |
|           type: 'string',
 | |
|           title: '',
 | |
|           ui: {
 | |
|             widget: 'select',
 | |
|             placeholder: '请选择',
 | |
|             errors: { required: '请填写货物名称' },
 | |
|             change: (_value: any, data: any) => {
 | |
|               this.sf3.setValue('/goodsName', data.label);
 | |
|             },
 | |
|             visibleIf: {
 | |
|               goodsTypeName: (value: any) => value && value !== '其它'
 | |
|             }
 | |
|           }
 | |
|         },
 | |
|         goodsName: {
 | |
|           type: 'string',
 | |
|           title: '',
 | |
|           ui: {
 | |
|             hidden: true,
 | |
|             visibleIf: {
 | |
|               goodsTypeName: (value: any) => value && value !== '其它'
 | |
|             }
 | |
|           }
 | |
|         },
 | |
|         goodsName1: {
 | |
|           type: 'string',
 | |
|           title: '',
 | |
|           ui: {
 | |
|             errors: { required: '请填写货物名称' },
 | |
|             visibleIf: {
 | |
|               goodsTypeName: (value: any) => value && value === '其它'
 | |
|             }
 | |
|           }
 | |
|         }
 | |
|       },
 | |
|       required: ['goodsTypeId', 'goodsName', 'goodsNameId']
 | |
|     };
 | |
|     this.ui3 = {
 | |
|       '*': {
 | |
|         spanLabelFixed: 110,
 | |
|         grid: { span: 12 }
 | |
|       }
 | |
|     };
 | |
|   }
 | |
|   changeGoodsType(value: string, data: any) {
 | |
|     if (data.label === '其它') return;
 | |
|     const params = {
 | |
|       pageIndex: 1,
 | |
|       pageSize: 100,
 | |
|       configId: value
 | |
|     };
 | |
|     this.service
 | |
|       .request(this.service.$api_get_config_item_page, params)
 | |
|       .pipe(
 | |
|         map(data => {
 | |
|           return data.records?.map((m: any) => {
 | |
|             return { label: m.name, value: m.id };
 | |
|           });
 | |
|         })
 | |
|       )
 | |
|       .subscribe(res => {
 | |
|         if (res) {
 | |
|           this.sf3.getProperty('/goodsNameId')!.schema.enum = res;
 | |
|           this.sf3.getProperty('/goodsNameId')!.widget?.reset(res);
 | |
|           if (this.sf3data.goodsNameId) {
 | |
|             this.sf3.setValue('/goodsNameId', this.sf3data.goodsNameId);
 | |
|           }
 | |
|         }
 | |
|       });
 | |
|   }
 | |
|   initSF4() {
 | |
|     this.schema4 = {
 | |
|       properties: {
 | |
|         weight: {
 | |
|           type: 'string',
 | |
|           title: '货物数量',
 | |
|           ui: {
 | |
|             widget: 'custom',
 | |
|             placeholder: '请输入',
 | |
|             errors: { required: '必填项' }
 | |
|           }
 | |
|         },
 | |
|         volume: {
 | |
|           type: 'string',
 | |
|           title: '',
 | |
|           ui: {
 | |
|             widget: 'custom',
 | |
|             placeholder: '请输入'
 | |
|           }
 | |
|         },
 | |
|         number: {
 | |
|           type: 'string',
 | |
|           title: '',
 | |
|           ui: {
 | |
|             widget: 'custom',
 | |
|             placeholder: '请输入'
 | |
|           }
 | |
|         },
 | |
|         carmand: {
 | |
|           type: 'string',
 | |
|           title: '用车需求',
 | |
|           ui: {
 | |
|             widget: 'custom',
 | |
|             placeholder: '请输入'
 | |
|           }
 | |
|         },
 | |
|         drivers: {
 | |
|           type: 'string',
 | |
|           title: '承运司机',
 | |
|           ui: {
 | |
|             widget: 'custom',
 | |
|             placeholder: '请输入'
 | |
|           }
 | |
|         },
 | |
|         weightModel: {
 | |
|           type: 'string',
 | |
|           title: '车型车长承重',
 | |
|           ui: {
 | |
|             widget: 'custom',
 | |
|             placeholder: '请输入'
 | |
|           }
 | |
|         },
 | |
|         loadTime: {
 | |
|           type: 'string',
 | |
|           title: '发车时间',
 | |
|           ui: {
 | |
|             widget: 'custom',
 | |
|             placeholder: '请输入'
 | |
|           }
 | |
|         },
 | |
|         unloadTime: {
 | |
|           type: 'string',
 | |
|           title: '到车时间',
 | |
|           ui: {
 | |
|             widget: 'custom',
 | |
|             placeholder: '请输入'
 | |
|           }
 | |
|         }
 | |
|       },
 | |
|       required: ['weight', 'loadPlanTime', 'unloadPlanTime']
 | |
|     };
 | |
|     this.ui4 = {
 | |
|       '*': {
 | |
|         spanLabelFixed: 110,
 | |
|         grid: { span: 24 }
 | |
|       },
 | |
|       $weight: {
 | |
|         grid: { span: 8 }
 | |
|       },
 | |
|       $volume: {
 | |
|         grid: { span: 8 }
 | |
|       },
 | |
|       $number: {
 | |
|         grid: { span: 8 }
 | |
|       },
 | |
|       $carmand: {
 | |
|         grid: { span: 24 }
 | |
|       },
 | |
|       $weightModel: {
 | |
|         spanLabelFixed: 120,
 | |
|         grid: { span: 12 }
 | |
|       },
 | |
|       $drivers: {
 | |
|         grid: { span: 12 }
 | |
|       },
 | |
|       $loadPlanTime: {
 | |
|         grid: { span: 12 }
 | |
|       },
 | |
|       $unloadPlanTime: {
 | |
|         grid: { span: 12 }
 | |
|       }
 | |
|     };
 | |
|   }
 | |
|   // 处理上传图片
 | |
|   handlePreview1 = async (file: NzUploadFile) => {
 | |
|     if (!file.url && !file.preview) {
 | |
|       file.preview = await getBase64(file.originFileObj!);
 | |
|     }
 | |
|     console.log('888888888');
 | |
| 
 | |
|     this.previewImage1 = file.url || file.preview;
 | |
|     this.previewVisible1 = true;
 | |
|   };
 | |
| 
 | |
|   handleChange1(info: NzUploadChangeParam): void {
 | |
|     switch (info.file.status) {
 | |
|       case 'uploading':
 | |
|         break;
 | |
|       case 'done':
 | |
|         let fileList = [...info.fileList];
 | |
|         // 2. Read from response and show file link
 | |
|         fileList = fileList.map((file: any) => {
 | |
|           if (file.response) {
 | |
|             file.url = file.response.data.fullFilePath;
 | |
|           }
 | |
|           return file;
 | |
|         });
 | |
|         break;
 | |
|       case 'error':
 | |
|         this.service.msgSrv.error('网络错误');
 | |
|         break;
 | |
|     }
 | |
|   }
 | |
|   beforeUpload = (file: NzUploadFile, _fileList: NzUploadFile[]) => {
 | |
|     return new Observable((observer: Observer<boolean>) => {
 | |
|       const isJpgOrPng = file.type === 'image/jpeg' || file.type === 'image/png' || file.type === 'image/gif' || file.type === 'image/bmp';
 | |
|       if (!isJpgOrPng) {
 | |
|         this.service.msgSrv.warning('只能上传图片!');
 | |
|         observer.complete();
 | |
|         return;
 | |
|       }
 | |
|       // tslint:disable-next-line: no-non-null-assertion
 | |
|       const isLt2M = file.size! / 1024 / 1024 < 3;
 | |
|       if (!isLt2M) {
 | |
|         this.service.msgSrv.warning('图片大小超过3兆!');
 | |
|         observer.complete();
 | |
|         return;
 | |
|       }
 | |
|       observer.next(isJpgOrPng && isLt2M);
 | |
|       observer.complete();
 | |
|     });
 | |
|   };
 | |
|   agreement(value: any) {
 | |
|     if (value === '1') {
 | |
|       this.modalTitle = '附件信息';
 | |
|       this.modalcontent = this.i?.contractContent?.contractContent;
 | |
| 
 | |
|     } else if (value === '2') {
 | |
|       this.modalTitle = '补充协议';
 | |
|       this.modalcontent = this.i?.supplementContent?.contractContent;
 | |
|     }
 | |
|     this.isVisible = true;
 | |
|   }
 | |
|   handleCancel() {
 | |
|     this.isVisible = false;
 | |
|   }
 | |
|   handleOK() {
 | |
|     this.isVisible = false;
 | |
|   }
 | |
|   goDistance(elf: any) {
 | |
|     if (elf) {
 | |
|       elf['elementRef'].nativeElement.scrollIntoView({ behavior: 'smooth', block: 'start', inline: 'start' });
 | |
|       // elf['elementRef'].nativeElement.className = 'target-fix'
 | |
|     }
 | |
|   }
 | |
|   // 装卸货地址互换
 | |
|   swapAddress() {
 | |
|     this.startInfo.forEach((element: any, index: any) => {
 | |
|       this.validateForm1.removeControl(`loadAddress${index}`);
 | |
|       this.validateForm1.removeControl(`loadName${index}`);
 | |
|       this.validateForm1.removeControl(`loadPhone${index}`);
 | |
|     });
 | |
|     this.endInfo.forEach((element: any, index: any) => {
 | |
|       this.validateForm1.removeControl(`unloadAddress${index}`);
 | |
|       this.validateForm1.removeControl(`unloadName${index}`);
 | |
|       this.validateForm1.removeControl(`unloadPhone${index}`);
 | |
|     });
 | |
| 
 | |
|     let item = this.startInfo;
 | |
|     this.startInfo = this.endInfo;
 | |
|     this.endInfo = item;
 | |
| 
 | |
|     this.startInfo.forEach((element: any, index: any) => {
 | |
|       element.type = '1';
 | |
|       this.validateForm1.addControl(`loadAddress${index}`, new FormControl(null, Validators.required));
 | |
|       this.validateForm1.addControl(`loadName${index}`, new FormControl(null, Validators.required));
 | |
|       this.validateForm1.addControl(`loadPhone${index}`, new FormControl(null, [Validators.required, Validators.pattern('^[0-9]*$')]));
 | |
|     });
 | |
|     this.endInfo.forEach((element: any, index: any) => {
 | |
|       element.type = '2';
 | |
|       this.validateForm1.addControl(`unloadAddress${index}`, new FormControl(null, Validators.required));
 | |
|       this.validateForm1.addControl(`unloadName${index}`, new FormControl(null, Validators.required));
 | |
|       this.validateForm1.addControl(`unloadPhone${index}`, new FormControl(null, [Validators.required, Validators.pattern('^[0-9]*$')]));
 | |
|     });
 | |
|     // 计算里程,时间
 | |
|     if (this.startInfo[0]?.area && this.endInfo[0]?.area) {
 | |
|       this.amapService.drivingCompute([...this.startInfo], [...this.endInfo]).subscribe(res => {
 | |
|         this.totalDistance = res?.distance;
 | |
|         this.totalTime = res?.time;
 | |
|       });
 | |
|     }
 | |
|   }
 | |
|   // 获取车辆轨迹
 | |
|   getTrajectory() {
 | |
|     this.service.request(this.service.$api_get_getTrajectory, { id: this.id }).subscribe(res => {
 | |
|       if (res) {
 | |
|         const points = res?.trackArray;
 | |
|         let list: any[] = [];
 | |
|         points?.forEach((item: any) => {
 | |
|           list.push({
 | |
|             name: item.hgt,
 | |
|             lnglat: [Number((Number(item.lon) / 600000).toFixed(6)), Number((Number(item.lat) / 600000).toFixed(6))],
 | |
|             time: item.gtm
 | |
|           });
 | |
|         });
 | |
|         this.mapList = list;
 | |
|         this.addressItems = res?.parkArray;
 | |
|         if (this.addressItems && this.addressItems.length > 0) {
 | |
|           this.addressItems.forEach(item => {
 | |
|             item.parkBte = this.getLocalTime(item.parkBte);
 | |
|           });
 | |
|         }
 | |
|       }
 | |
|     });
 | |
|   }
 | |
| 
 | |
|   // 获取司机轨迹
 | |
|   getDriverTrajectory() {
 | |
|     this.service.request(this.service.$api_get_getAppDriverPosition, { id: this.id }).subscribe(res => {
 | |
|       if (res) {
 | |
|         const points = res?.tracks;
 | |
|         let list: any[] = [];
 | |
|         points?.forEach((item: any) => {
 | |
|           list.push({
 | |
|             name: item.hgt,
 | |
|             lnglat: [Number((Number(item.lon) / 600000).toFixed(6)), Number((Number(item.lat) / 600000).toFixed(6))],
 | |
|             time: item.gtm
 | |
|           });
 | |
|         });
 | |
|         this.mapList = list;
 | |
|         const addressItems = [...res.tracks];
 | |
|         if (addressItems) {
 | |
|           addressItems.forEach(item => {
 | |
|             // item.parkBte = item.gtm;
 | |
|             item.parkBte = this.getLocalTime(item.gtm);
 | |
|             item.parkAdr = item.appAdress;
 | |
|           });
 | |
|           this.addressItems = [...addressItems];
 | |
|         } else {
 | |
|           this.addressItems = [];
 | |
|         }
 | |
|       }
 | |
|     });
 | |
|   }
 | |
|   trajectoryChange(event: any) {
 | |
|     if (event === 'car') {
 | |
|       this.getTrajectory();
 | |
|     } else if (event === 'driver') {
 | |
|       this.getDriverTrajectory();
 | |
|     }
 | |
|   }
 | |
|   getLocalTime(time: any) {
 | |
|     return format(new Date(parseInt(time)), 'yyyy-MM-dd HH:mm:ss');
 | |
|   }
 | |
| }
 |