车辆对接
This commit is contained in:
		| @ -0,0 +1,595 @@ | ||||
| import { Component, OnInit, ViewChild } from '@angular/core'; | ||||
| import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms'; | ||||
| import { ActivatedRoute, Router } from '@angular/router'; | ||||
| import { | ||||
|   SFArrayWidgetSchema, | ||||
|   SFComponent, | ||||
|   SFNumberWidgetSchema, | ||||
|   SFSchema, | ||||
|   SFSchemaEnum, | ||||
|   SFSelectWidgetSchema, | ||||
|   SFTextareaWidgetSchema, | ||||
|   SFUISchema | ||||
| } from '@delon/form'; | ||||
| import { SettingsService, _HttpClient } from '@delon/theme'; | ||||
| import format from 'date-fns/format'; | ||||
| import { NzModalRef, NzModalService } from 'ng-zorro-antd/modal'; | ||||
| import { of } from 'rxjs'; | ||||
| import { map } from 'rxjs/operators'; | ||||
| import { AmapPoiPickerComponent, AmapService } from 'src/app/shared/components/amap'; | ||||
| import { SupplyManagementService } from '../../services/supply-management.service'; | ||||
| import { PublishGoodsChooseFamifiarComponent } from '../choose-famifiar/choose-famifiar.component'; | ||||
|  | ||||
| // import { PublishGoodsChooseFamifiarComponent } from '../choose-famifiar-bulk/choose-famifiar.component'; | ||||
| import { PublishAddressListComponent } from '../onecar-publish/address-list/address-list.component'; | ||||
| import { PublishSuccessComponent } from '../onecar-publish/publish-success/publish-success.component'; | ||||
| // import { PublishSuccessComponent } from '../publish-success/publish-success.component'; | ||||
| @Component({ | ||||
|   selector: 'app-publish-goods-bulk-publish', | ||||
|   templateUrl: './bulk-release-publish.component.html', | ||||
|   styleUrls: ['./bulk-release-publish.component.less'] | ||||
| }) | ||||
| export class SupplyManagementBulkReleasePublishComponent implements OnInit { | ||||
|   validateForm1: FormGroup; | ||||
|   sf1data: any; // 货源单设置回显 | ||||
|   sf3data: any; // 货源单设置回显 | ||||
|   sf4data: any; // 货源单设置回显 | ||||
|   sf5data: any; // 货源单设置回显 | ||||
|   sf6data: any; // 货源单设置回显 | ||||
|   sf7data: any; // 货源单设置回显 | ||||
|   creatTime: any; // 货源单设置回显 | ||||
|   modifyTime: any; // 货源单设置回显 | ||||
|   totalFees: any; // 总数信息 | ||||
|   id = ''; | ||||
|   type = 'add'; | ||||
|   // // 单位 | ||||
|   unit1 = '吨'; | ||||
|   unit2 = '方'; | ||||
|   unit3 = '保价费金额'; | ||||
|   startInfo: any[] = []; | ||||
|   endInfo: any[] = []; | ||||
|  | ||||
|   totalDistance = 0.0; //总里程 | ||||
|   totalTime = 0.0; //路程总时间 | ||||
|  | ||||
|   currentGoodsTypeName: any; | ||||
|  | ||||
|   freightTypeOptions: any; | ||||
|   ruleOptions: any; | ||||
|   constructor( | ||||
|     private http: _HttpClient, | ||||
|     fb: FormBuilder, | ||||
|     private modalService: NzModalService, | ||||
|     private settingSrv: SettingsService, | ||||
|     private service: SupplyManagementService, | ||||
|     private router: Router, | ||||
|     private route: ActivatedRoute, | ||||
|     private amapService: AmapService | ||||
|   ) { | ||||
|     this.validateForm1 = fb.group({ | ||||
|       loadAddress0: [null, [Validators.required]], | ||||
|       loadName0: [null, [Validators.required]], | ||||
|       loadPhone0: [null, [Validators.required]], | ||||
|       unloadAddress0: [null, [Validators.required]], | ||||
|       unloadName0: [null, [Validators.required]], | ||||
|       unloadPhone0: [null, [Validators.required]] | ||||
|     }); | ||||
|   } | ||||
|  | ||||
|   @ViewChild('sf1', { static: false }) sf1!: SFComponent; | ||||
|   schema1: SFSchema = {}; | ||||
|   ui1!: SFUISchema; | ||||
|  | ||||
|   @ViewChild('sf3', { static: false }) sf3!: SFComponent; | ||||
|   schema3: SFSchema = {}; | ||||
|   ui3!: SFUISchema; | ||||
|  | ||||
|   @ViewChild('sf4', { static: false }) sf4!: SFComponent; | ||||
|   schema4: SFSchema = {}; | ||||
|   ui4!: SFUISchema; | ||||
|  | ||||
|   @ViewChild('sf6', { static: false }) sf6!: SFComponent; | ||||
|   schema6: SFSchema = {}; | ||||
|   ui6!: SFUISchema; | ||||
|  | ||||
|   ngOnInit(): void { | ||||
|     this.initSF1(); | ||||
|     this.initSF3(); | ||||
|     this.initSF4(); | ||||
|     this.initSF6(); | ||||
|     this.startInfo = [ | ||||
|         { | ||||
|           detailedAddress: '', | ||||
|           appUserName: '', | ||||
|           contractTelephone: '', | ||||
|           latitude: '', | ||||
|           longitude: '', | ||||
|           province: '', | ||||
|           city: '', | ||||
|           area: '', | ||||
|           type: '1' | ||||
|         } | ||||
|       ]; | ||||
|     this.endInfo = [ | ||||
|         { | ||||
|           detailedAddress: '', | ||||
|           appUserName: '', | ||||
|           contractTelephone: '', | ||||
|           latitude: '', | ||||
|           longitude: '', | ||||
|           province: '', | ||||
|           city: '', | ||||
|           area: '', | ||||
|           type: '2' | ||||
|         } | ||||
|       ] | ||||
|   } | ||||
|      | ||||
|      | ||||
|  | ||||
|   initSF1() { | ||||
|     this.schema1 = { | ||||
|       properties: { | ||||
|         shipperAppUserId: { | ||||
|           title: '货主', | ||||
|           type: 'string', | ||||
|           maxLength: 30, | ||||
|           ui: { | ||||
|             widget: 'select', | ||||
|             serverSearch: true, | ||||
|             searchDebounceTime: 300, | ||||
|             searchLoadingText: '搜索中...', | ||||
|             onSearch: (q: any) => { | ||||
|               if (!!q) { | ||||
|                 return this.service | ||||
|                   .request(this.service.$api_enterpriceList, { enterpriseName: q}) | ||||
|                   .pipe(map((res: any[]) => (res as any[]).map((i) => ({ label: i.enterpriseName, value: i.id } as SFSchemaEnum)))) | ||||
|                   .toPromise(); | ||||
|               } else { | ||||
|                 return of([]); | ||||
|               } | ||||
|             }, | ||||
|             change: (q: any) => { | ||||
|               this.getRegionCode(q) | ||||
|             }, | ||||
|             visibleIf: { | ||||
|               _$expand: (value: boolean) => value, | ||||
|             }, | ||||
|           } as SFSelectWidgetSchema, | ||||
|         },  | ||||
|         enterpriseProjectId: { | ||||
|           type: 'string', | ||||
|           title: '项目', | ||||
|           ui: { | ||||
|             widget: 'select', | ||||
|             placeholder: '请选择', | ||||
|             allowClear: true, | ||||
|           } as SFSelectWidgetSchema | ||||
|         }, | ||||
|         enterpriseInfoName: { | ||||
|           type: 'string', | ||||
|           title: '网络货运人', | ||||
|           ui: { | ||||
|             widget: 'custom' | ||||
|           }, | ||||
|           default: '天津市怡亚通XXXX有限公司' | ||||
|         }, | ||||
|         deadlineTime: { | ||||
|           title: '截至日期', | ||||
|           type: 'string', | ||||
|           format: 'date-time', | ||||
|           ui: { | ||||
|             placeholder: '请输入', | ||||
|             format: 'yyyy-MM-dd HH:mm:ss' | ||||
|           } | ||||
|         }, | ||||
|         dispatchId: { | ||||
|           type: 'string', | ||||
|           title: '调度员', | ||||
|           enum: [ | ||||
|             { label: '周涛', value: 1 }, | ||||
|             { label: '李诞', value: 2 } | ||||
|           ], | ||||
|           ui: { | ||||
|             widget: 'select', | ||||
|             placeholder: '请选择', | ||||
|             allowClear: true, | ||||
|             optionalHelp: '选择调度员,司机直接联系调度员 ; 不选择,司机直接联系您' | ||||
|             // asyncData: () => | ||||
|             //   this.service.loadChildData2('0', '2').pipe( | ||||
|             //     map((data: any) => { | ||||
|             //       return data.map((m: any) => { | ||||
|             //         return { label: m.name, value: m.id }; | ||||
|             //       }); | ||||
|             //     }), | ||||
|             //   ), | ||||
|             // change: (i) => this.updateCategory(i, '/categoryId2'), | ||||
|           } as SFSelectWidgetSchema | ||||
|         } | ||||
|       }, | ||||
|       required: ['deadlineTime'] | ||||
|     }; | ||||
|     this.ui1 = { | ||||
|       '*': { | ||||
|         spanLabelFixed: 90, | ||||
|         grid: { span: 12 } | ||||
|       }, | ||||
|       $enterpriseInfoName: { | ||||
|         grid: { span: 24 } | ||||
|       } | ||||
|     }; | ||||
|   } | ||||
|  | ||||
|   initSF3() { | ||||
|     this.schema3 = { | ||||
|       properties: { | ||||
|         goodsTypeId: { | ||||
|           type: 'string', | ||||
|           title: '货物名称', | ||||
|           enum: [ | ||||
|             { label: '服装', value: '1' }, | ||||
|             { label: '电子产品', value: '2' }, | ||||
|             { label: '其他', value: '3' } | ||||
|           ], | ||||
|           ui: { | ||||
|             widget: 'select', | ||||
|             placeholder: '请选择', | ||||
|             errors: { required: '请填写货物名称' }, | ||||
|             change: (value, data) => { | ||||
|               this.currentGoodsTypeName = data; | ||||
|             } | ||||
|             // asyncData: () => | ||||
|             //   this.categoryService.loadChildData2('0', '2').pipe( | ||||
|             //     map((data: any) => { | ||||
|             //       return data.map((m: any) => { | ||||
|             //         return { label: m.name, value: m.id }; | ||||
|             //       }); | ||||
|             //     }), | ||||
|             //   ), | ||||
|             // change: (i) => this.updateCategory(i, '/categoryId2'), | ||||
|           } as SFSelectWidgetSchema | ||||
|         }, | ||||
|         goodsName: { | ||||
|           type: 'string', | ||||
|           title: '', | ||||
|           maxLength: 20, | ||||
|           ui: { | ||||
|             errors: { required: '请填写货物名称' }, | ||||
|             visibleIf: { | ||||
|               goodsType: value => value === '其他' | ||||
|             } | ||||
|           } | ||||
|         } | ||||
|       }, | ||||
|       required: ['goodsTypeId', 'goodsName'] | ||||
|     }; | ||||
|     this.ui3 = { | ||||
|       '*': { | ||||
|         spanLabelFixed: 90, | ||||
|         grid: { span: 12 } | ||||
|       } | ||||
|     }; | ||||
|   } | ||||
|   initSF4() { | ||||
|     this.schema4 = { | ||||
|       properties: { | ||||
|         freightPrice: { | ||||
|           type: 'string', | ||||
|           title: '运费单价', | ||||
|           ui: { | ||||
|             errors: { required: '请选择运费单价' }, | ||||
|             widget: 'custom', | ||||
|             placeholder: '请输入' | ||||
|           } | ||||
|         }, | ||||
|         freightType: { | ||||
|           type: 'string', | ||||
|           title: '', | ||||
|           ui: { | ||||
|             hidden: true | ||||
|           }, | ||||
|           default: '1' | ||||
|         }, | ||||
|  | ||||
|         rule: { | ||||
|           type: 'string', | ||||
|           title: '', | ||||
|           ui: { | ||||
|             widget: 'custom', | ||||
|             errors: { required: '请选择运费取整规则' } | ||||
|           } | ||||
|         }, | ||||
|         settlementBasis: { | ||||
|           type: 'string', | ||||
|           title: '', | ||||
|           ui: { | ||||
|             widget: 'dict-select', | ||||
|             params: { dictKey: 'goodresource:settlement:type' }, | ||||
|             placeholder: '结算依据', | ||||
|             errors: { required: '请选择结算依据' } | ||||
|           } as SFSelectWidgetSchema | ||||
|         }, | ||||
|         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: '请输入' | ||||
|           } | ||||
|         }, | ||||
|         maxWeight: { | ||||
|           type: 'string', | ||||
|           title: '车型/车长', | ||||
|           default: [], | ||||
|           ui: { | ||||
|             widget: 'dict-select', | ||||
|             params: { dictKey: 'car:model' }, | ||||
|             mode: 'multiple', | ||||
|             placeholder: '请选择车型', | ||||
|             errors: { required: '请选择车型' } | ||||
|           } | ||||
|         }, | ||||
|         maxCube: { | ||||
|           type: 'string', | ||||
|           title: '', | ||||
|           default: [], | ||||
|           ui: { | ||||
|             widget: 'dict-select', | ||||
|             params: { dictKey: 'car:length' }, | ||||
|             mode: 'multiple', | ||||
|             placeholder: '请选择车长', | ||||
|             errors: { required: '请选择车长' } | ||||
|           } | ||||
|         } | ||||
|       }, | ||||
|       required: ['weight', 'maxWeight', 'maxCube', 'freightPrice', 'rule', 'settlementBasis'] | ||||
|     }; | ||||
|     this.ui4 = { | ||||
|       '*': { | ||||
|         spanLabelFixed: 90, | ||||
|         grid: { span: 24 } | ||||
|       }, | ||||
|       $freightPrice: { | ||||
|         grid: { span: 8 } | ||||
|       }, | ||||
|       $rule: { | ||||
|         grid: { span: 8 } | ||||
|       }, | ||||
|       $settlementBasis: { | ||||
|         grid: { span: 8 } | ||||
|       }, | ||||
|       $weight: { | ||||
|         grid: { span: 8 } | ||||
|       }, | ||||
|       $volume: { | ||||
|         grid: { span: 8 } | ||||
|       }, | ||||
|       $number: { | ||||
|         grid: { span: 8 } | ||||
|       }, | ||||
|       $maxWeight: { | ||||
|         grid: { span: 12 } | ||||
|       }, | ||||
|       $maxCube: { | ||||
|         grid: { span: 12 } | ||||
|       } | ||||
|     }; | ||||
|   } | ||||
|  | ||||
|   initSF6() { | ||||
|     this.schema6 = { | ||||
|       properties: { | ||||
|         paymentDays: { | ||||
|           type: 'string', | ||||
|           title: '到货后', | ||||
|           ui: { | ||||
|             widget: 'custom', | ||||
|             placeholder: '请输入', | ||||
|             errors: { required: '请输入付款承诺天数' } | ||||
|           } | ||||
|         }, | ||||
|         remarks: { | ||||
|           type: 'string', | ||||
|           title: '备注', | ||||
|           maxLength: 200, | ||||
|           ui: { | ||||
|             widget: 'textarea', | ||||
|             placeholder: '请输入', | ||||
|             autosize: { minRows: 3, maxRows: 3 } | ||||
|           } as SFTextareaWidgetSchema | ||||
|         } | ||||
|       }, | ||||
|       required: ['paymentDays'] | ||||
|     }; | ||||
|     this.ui6 = { | ||||
|       '*': { | ||||
|         spanLabelFixed: 90, | ||||
|         grid: { span: 24 } | ||||
|       } | ||||
|     }; | ||||
|   } | ||||
|  | ||||
|   //指派熟车 | ||||
|   chooseFamifiar(item: any) { | ||||
|     // this.modalService.create({ | ||||
|     //   nzTitle: '指派熟车', | ||||
|     //   nzContent: PublishGoodsChooseFamifiarComponent, | ||||
|     //   nzComponentParams: { | ||||
|     //     submitParams: item, | ||||
|     //     submitUrl: this.service.$api_save_bulk_assign | ||||
|     //   }, | ||||
|     //   nzWidth: 1300 | ||||
|     // }); | ||||
|   } | ||||
|   submit(submitType: string): void { | ||||
|     Object.keys(this.validateForm1.controls).forEach(key => { | ||||
|       this.validateForm1.controls[key].markAsDirty(); | ||||
|       this.validateForm1.controls[key].updateValueAndValidity(); | ||||
|     }); | ||||
|     this.sf1.validator({ emitError: true }); | ||||
|     this.sf3.validator({ emitError: true }); | ||||
|     this.sf4.validator({ emitError: true }); | ||||
|     this.sf6.validator({ emitError: true }); | ||||
|     if (this.validateForm1.invalid || !this.sf1.valid || !this.sf3.valid || !this.sf4.valid || !this.sf6.valid) { | ||||
|       return; | ||||
|     } | ||||
|  | ||||
|     // //装卸货信息 | ||||
|     const LoadingList = this.startInfo.concat(this.endInfo); | ||||
|     // // 货物信息 | ||||
|     const goodsInfoList = [ | ||||
|       { | ||||
|         ...this.sf3.value, | ||||
|         goodsTypeName: this.currentGoodsTypeName.label, | ||||
|         goodsName: '电子', | ||||
|         goodsNameId: '1', | ||||
|         ...this.sf4.value, | ||||
|         maxWeight: this.sf4.value.maxWeight.join(','), | ||||
|         maxCube: this.sf4.value.maxCube.join(',') | ||||
|       } | ||||
|     ]; | ||||
|     const params = { | ||||
|       id: '', | ||||
|       ...this.sf1.value, | ||||
|       unLoadingPlaceDTOList: LoadingList, | ||||
|       goodsInfoDTOList: goodsInfoList, | ||||
|       ...this.sf6.value | ||||
|     }; | ||||
|  | ||||
|     let reqUrl = this.service.$api_consignBulk; | ||||
|     if (submitType === 'assign') { | ||||
|       console.log('params', params); | ||||
|       this.chooseFamifiar(params); | ||||
|     } else { | ||||
|       this.service.request(reqUrl, params).subscribe(res => { | ||||
|         if (res) { | ||||
|           this.modalService.create({ | ||||
|             nzTitle: '', | ||||
|             nzContent: PublishSuccessComponent, | ||||
|             nzWidth: 900, | ||||
|             nzFooter: null, | ||||
|             nzComponentParams: { type: 'bulk' } | ||||
|           }); | ||||
|         } else { | ||||
|           this.service.msgSrv.error(res.msg); | ||||
|         } | ||||
|       }); | ||||
|     } | ||||
|   } | ||||
|   // 获取城市列表 | ||||
|   getRegionCode(regionCode: any) { | ||||
|     console.log(regionCode) | ||||
|     return this.service | ||||
|       .request(this.service.$api_get_enterprise_project, { id: regionCode }) | ||||
|       .pipe( | ||||
|         map((res) => | ||||
|           res.map((item: any) => ({ | ||||
|             label: item.projectName, | ||||
|             value: item.id, | ||||
|           })), | ||||
|         ), | ||||
|       ) | ||||
|       .subscribe((res) => { | ||||
|         this.sf1.getProperty('/enterpriseProjectId')!.schema.enum = res; | ||||
|         this.sf1.getProperty('/enterpriseProjectId')!.widget.reset(res); | ||||
|       }); | ||||
|   } | ||||
|   // 打开地图 | ||||
|   openMap(type: string, index: number) { | ||||
|     const modalRef = this.modalService.create({ | ||||
|       nzTitle: '', | ||||
|       nzContent: AmapPoiPickerComponent, | ||||
|       nzWidth: 900, | ||||
|       nzOnOk: item => { | ||||
|         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; | ||||
|             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; | ||||
|             break; | ||||
|           default: | ||||
|             break; | ||||
|         } | ||||
|         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; | ||||
|           }); | ||||
|         } | ||||
|       } | ||||
|     }); | ||||
|   } | ||||
|  | ||||
|   chooseAddress(index: number, type: string) { | ||||
|     const modalRef = this.modalService.create({ | ||||
|       nzTitle: '选择地址', | ||||
|       nzContent: PublishAddressListComponent, | ||||
|       nzWidth: 900, | ||||
|       nzComponentParams: { spuStatus: '1' }, | ||||
|       nzOnOk: item => { | ||||
|         const data = item.seleteData; | ||||
|         if (JSON.stringify(data) === '{}') return; | ||||
|         switch (type) { | ||||
|           case 'start': | ||||
|             this.startInfo[index] = { | ||||
|               detailedAddress: data.detailedAddress, | ||||
|               appUserName: data.contactName, | ||||
|               contractTelephone: data.contactTelephone, | ||||
|               latitude: data.contactTelephone, | ||||
|               longitude: data.latitude, | ||||
|               province: data.province, | ||||
|               city: data.city, | ||||
|               area: data.area, | ||||
|               type: '1' | ||||
|             }; | ||||
|             break; | ||||
|           case 'end': | ||||
|             this.endInfo[index] = { | ||||
|               detailedAddress: data.detailedAddress, | ||||
|               appUserName: data.contactName, | ||||
|               contractTelephone: data.contactTelephone, | ||||
|               latitude: data.contactTelephone, | ||||
|               longitude: data.latitude, | ||||
|               province: data.province, | ||||
|               city: data.city, | ||||
|               area: data.area, | ||||
|               type: '2' | ||||
|             }; | ||||
|             break; | ||||
|           default: | ||||
|             break; | ||||
|         } | ||||
|       } | ||||
|     }); | ||||
|   } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user