import { Component, OnInit, ViewChild } from '@angular/core'; import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms'; import { ActivatedRoute, Router } from '@angular/router'; import { cacheConf } from '@conf/cache.conf'; import differenceInCalendarDays from 'date-fns/differenceInCalendarDays'; import { SFCheckboxWidgetSchema, SFComponent, SFNumberWidgetSchema, SFSchema, SFSchemaEnum, SFSelectWidgetSchema, SFTextareaWidgetSchema, SFUISchema } from '@delon/form'; import { SettingsService, _HttpClient } from '@delon/theme'; import { EACacheService, ShipperBaseService } from '@shared'; import format from 'date-fns/format'; import { 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 { SupplyManagementVehicleAssignedCarComponent } from '../assigned-car/assigned-car.component'; import { PublishAddressListComponent } from '../onecar-publish/address-list/address-list.component'; import { PublishSuccessComponent } from '../onecar-publish/publish-success/publish-success.component'; import { TranAgreementComponent } from '../tran-agreement/tran-agreement.component'; @Component({ selector: 'app-publish-goods-onecar-publish', templateUrl: './release-publish.component.html', styleUrls: ['./release-publish.component.less'] }) export class SupplyManagementReleasePublishComponent implements OnInit { // 环境信息 appId、tenantId envInfo = this.eaCacheSrv.get(cacheConf.env); validateForm1: FormGroup; sf1data: any; // 货源单设置回显 sf3data: any; // 货源单设置回显 sf4data: any; // 货源单设置回显 sf5data: any; // 货源单设置回显 sf55data: any; // 货源单设置回显 sf6data: any; // 货源单设置回显 sf7data: any; // 货源单设置回显 id = ''; envCache: any; type = 'add'; // // 单位 startInfo: any[] = []; endInfo: any[] = []; totalDistance = 0.0; //总里程 totalTime = 0.0; //路程总时间 currentRate = 0; //实时计算的费率 shipperName = ''; constructor( private http: _HttpClient, fb: FormBuilder, private modalService: NzModalService, private settingSrv: SettingsService, public service: SupplyManagementService, private router: Router, private route: ActivatedRoute, private eaCacheSrv: EACacheService, private amapService: AmapService, public shipperSrv: ShipperBaseService ) { this.validateForm1 = fb.group({ loadAddress0: [null, [Validators.required]], loadName0: [null, [Validators.required]], loadPhone0: [null, [Validators.required, Validators.pattern('^[0-9]*$')]], unloadAddress0: [null, [Validators.required]], unloadName0: [null, [Validators.required]], unloadPhone0: [null, [Validators.required, Validators.pattern('^[0-9]*$')]], loadingTime: [null, []], unloadingTime: [null, []] }); } @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('sf5', { static: false }) sf5!: SFComponent; schema5: SFSchema = {}; ui5!: SFUISchema; @ViewChild('sf55', { static: false }) sf55!: SFComponent; schema55: SFSchema = {}; ui55!: SFUISchema; @ViewChild('sf6', { static: false }) sf6!: SFComponent; schema6: SFSchema = {}; ui6!: SFUISchema; @ViewChild('sf7', { static: false }) sf7!: SFComponent; schema7: SFSchema = {}; ui7!: SFUISchema; limitValues = { maxWeight: 99999, maxVolume: 99999, maxPiece: 99999, maxDays: 999, intervalDays: 999, maxTimes: 5 }; formatterRmb = (value: number): string => { if (value === null || value === undefined) { return ''; } else { let value2 = Number(value).toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 }); return `¥${value2}`; } }; parserRmb = (value: string): string => value.replace('¥', '').replace(',', ''); // 页面初始化 ngOnInit(): void { this.initSF1(); this.initSF3(); this.initSF4(); this.initSF5(); this.initSF6(); this.initSF7(); this.addStartInfo(); this.addEndInfo(); this.getLimitvalue(); } initSF1() { this.schema1 = { properties: { shipperAppUserId: { title: '货主', type: 'string', maxLength: 30, ui: { widget: 'select', allowClear: true, searchDebounceTime: 300, searchLoadingText: '搜索中...', onSearch: (q: any) => { console.log(q === ' '); let str = q?.replace(/^\s+|\s+$/g, ''); if (str) { return this.service .request(this.service.$api_enterpriceList, { enterpriseName: str }) .pipe(map(res => (res as any[]).map(i => ({ label: i.enterpriseName, value: i.id } as SFSchemaEnum)))) .toPromise(); } else { return of([]); } }, change: (q: any, qs: any) => { let str = q?.replace(/^\s+|\s+$/g, ''); if (str) { this.getRegionCode(str); this.shipperName = qs?.label; this.payChange(); } } } as SFSelectWidgetSchema }, enterpriseProjectId: { type: 'string', title: '项目', ui: { widget: 'select', placeholder: '请选择', allowClear: true } as SFSelectWidgetSchema }, enterpriseInfoName: { type: 'string', title: '网络货运人', ui: { widget: 'select', placeholder: '请选择', allowClear: true, asyncData: () => this.shipperSrv.getNetworkFreightForwarder(), change: () => this.payChange() } }, externalResourceCode: { type: 'string', title: '外部货源号', maxLength: 30, ui: { placeholder: '请输入' } }, dispatchName: { type: 'string', title: '调度员姓名', maxLength: 30, ui: { optionalHelp: '选若未填写,司机直接联系您', placeholder: '请输入' } }, dispatchPhone: { type: 'string', title: '调度员手机号', maxLength: 30, ui: { placeholder: '请输入' } } }, required: ['shipperAppUserId', 'enterpriseProjectId', 'enterpriseInfoName'] }; this.ui1 = { '*': { spanLabelFixed: 115, grid: { span: 12 } }, $enterpriseInfoName: { grid: { span: 12 } }, $shipperAppUserId: { grid: { span: 12 } }, $enterpriseProjectId: { grid: { span: 12 } }, $dispatchId: { grid: { span: 12 } } }; } initSF3() { this.schema3 = { properties: { goodsTips: { type: 'string', title: '', ui: { widget: 'custom', class: 'goods_Tips_item', // visibleIf: { // goodsTypeName: (value: any) => value && value === '其它' // } } }, goodsTypeId: { type: 'string', title: '货物名称', ui: { widget: 'select', placeholder: '请选择', errors: { required: '请选择货物名称' }, asyncData: () => this.shipperSrv.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, 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: '', maxLength: 20, ui: { errors: { required: '请填写货物名称' }, visibleIf: { goodsTypeName: (value: any) => value && value === '其它' }, blur: (value: any) => { this.checkGoodsName(); } } } }, required: ['goodsTypeId', 'goodsName', 'goodsNameId', 'goodsName1'] }; this.ui3 = { '*': { spanLabelFixed: 115, grid: { span: 12 } }, $goodsTips: { grid: { span: 24 } } }; } initSF4() { this.schema4 = { properties: { weight: { type: 'string', title: '货物数量', ui: { widget: 'custom', placeholder: '请输入', errors: { required: '必填项' }, validator: val => this.customValidator(val) } }, volume: { type: 'string', title: '', ui: { widget: 'custom', placeholder: '请输入' } }, number: { type: 'string', title: '', ui: { widget: 'custom', placeholder: '请输入' } }, carModel: { type: 'string', title: '车型/车长', ui: { widget: 'select', mode: 'multiple', maxMultipleCount: 3, placeholder: '请选择车型', errors: { required: '请选择车型' }, asyncData: () => this.service.getDictOptions({ dictKey: 'car:model' }), change: (tag: any, org: any) => { if (tag.includes('999')) { this.sf4.setValue('/carModel', ['999']); } } } }, carLength: { type: 'string', title: '', ui: { widget: 'select', mode: 'multiple', maxMultipleCount: 3, placeholder: '请选择车长', errors: { required: '请选择车长' }, asyncData: () => this.service.getDictOptions({ dictKey: 'car:length' }), change: (tag: any, org: any) => { if (tag.includes('999')) { this.sf4.setValue('/carLength', ['999']); } } } }, hidenField: { type: 'string', title: '', default: ' ', ui: { widget: 'text' } }, insurancePackagedGoods: { type: 'string', title: '货物包装', ui: { widget: 'dict-select', params: { dictKey: 'insure:packaged:goods' }, containsAllLabel: false, validator: val => { if (this.sf5?.value?.insuranceType && this.sf5?.value?.insuranceType !== '3' && this.isEmpty(val)) { return [{ keyword: 'required', message: '必填项' }]; } else { return []; } } } as SFSelectWidgetSchema }, goodsValue: { type: 'string', title: '货物价值', ui: { widget: 'custom', validator: val => { if (this.sf5?.value?.insuranceType && this.sf5?.value?.insuranceType !== '3' && this.isEmpty(val)) { return [{ keyword: 'required', message: '必填项' }]; } else { return []; } } } } }, required: ['weight', 'carModel', 'carLength'] }; this.ui4 = { '*': { spanLabelFixed: 115, grid: { span: 8 } } }; } initSF5() { this.schema5 = { properties: { insuranceType: { type: 'string', title: '服务包', ui: { widget: 'select', asyncData: () => { return this.service.request(this.service.$api_getDictValue, { dictKey: 'bill:insurance:type' }).pipe( map((res: any) => { return [...res]; }) ); }, change: (tag: any, org: any) => { if (tag === '3') { this.sf5.setValue('/insurancePremium', null); this.sf5.setValue('/insuranceRate', null); } else { this.getInsurersPrice(tag); } } }, default: '3' }, type1: { type: 'string', title: '', ui: { widget: 'custom', visibleIf: { insuranceType: (value: string) => value === '0' } } }, type2: { type: 'string', title: '', ui: { widget: 'custom', visibleIf: { insuranceType: (value: string) => value === '1' } } }, insurancePremium: { type: 'string', title: '服务包费用', readOnly: true, ui: { visibleIf: { insuranceType: (value: string) => value !== '3' } } }, insuranceRate: { type: 'string', title: '保险费率', ui: { hidden: true } }, freeInsurance1: { type: 'string', title: '预投基本险', ui: { widget: 'custom', visibleIf: { insuranceType: (value: string) => value === '0' } } }, freeInsurance2: { type: 'string', title: '预投综合险', ui: { widget: 'custom', visibleIf: { insuranceType: (value: string) => value === '1' } } } }, required: ['insurancePremium'] }; this.ui5 = { '*': { spanLabelFixed: 115, grid: { span: 12 } }, $type1: { grid: { span: 24 } }, $type2: { grid: { span: 24 } }, $freeInsurance1: { grid: { span: 24 } }, $freeInsurance2: { grid: { span: 24 } } }; } initSF6() { this.schema6 = { properties: { stateReceipt: { type: 'string', title: '是否回单', enum: [ { label: '需要', value: true }, { label: '不需要', value: false } ], ui: { widget: 'select', errors: { required: '请选择' }, placeholder: '请选择' } }, receiptType: { type: 'string', title: '回单类型', ui: { widget: 'dict-select', params: { dictKey: 'receipt:type' }, containsAllLabel: false, placeholder: '请选择', errors: { required: '请选择' }, visibleIf: { stateReceipt: value => value === true } } }, receiptUserName: { type: 'string', title: '联系人', maxLength: 15, ui: { visibleIf: { receiptType: value => value === '2' } } }, receiptUserPhone: { type: 'string', title: '联系电话', format: 'mobile', maxLength: 11, ui: { errors: { format: '请输入正确联系电话格式' }, visibleIf: { receiptType: value => value === '2' } } }, receiptAddressArea: { type: 'string', title: '所在地区', maxLength: 30, ui: { visibleIf: { receiptType: value => value === '2' } } }, receiptAddress: { type: 'string', title: '详细地址', maxLength: 30, ui: { visibleIf: { receiptType: value => value === '2' } } }, remarks: { type: 'string', title: '备注', maxLength: 200, ui: { widget: 'textarea', placeholder: '请输入', autosize: { minRows: 3, maxRows: 3 } } as SFTextareaWidgetSchema } }, required: ['stateReceipt', 'receiptType', 'receiptUserName', 'receiptUserPhone', 'receiptAddressArea', 'receiptAddress'] }; this.ui6 = { '*': { spanLabelFixed: 90, grid: { span: 24 } } }; } initSF7() { this.schema7 = { properties: { prePay: { type: 'number', title: '预付', ui: { widget: 'custom' } }, toPay: { type: 'number', title: '到付', ui: { widget: 'custom' } }, receiptPay: { type: 'number', title: '回单付', ui: { widget: 'custom' } }, subtotal: { type: 'number', title: '小计', default: 0, ui: { widget: 'custom' } as SFNumberWidgetSchema }, appendFee: { type: 'number', title: '附加费', default: 0, ui: { widget: 'custom' } as SFNumberWidgetSchema }, total: { type: 'number', title: '总费用', default: 0, ui: { widget: 'custom' } as SFNumberWidgetSchema }, paymentDays: { type: 'string', title: '到货后', ui: { widget: 'custom', errors: { required: '请输入付款承诺天数' } } } }, required: ['paymentDays'] }; this.ui7 = { '*': { spanLabelFixed: 115, grid: { span: 24 } } }; } getLimitvalue() { // 货物核载信息最大值 // 货物运输费(小计)最大值 const getlimitvaluesParms = [ this.service.limitKeys?.weight, this.service.limitKeys?.volume, this.service.limitKeys?.piece, this.service.limitKeys?.maxDays, this.service.limitKeys?.intervalDays, this.service.limitKeys?.maxTimes ]; this.service.request(this.service.$api_findItemValueByItemKeys, getlimitvaluesParms).subscribe(res => { const maxWeight = res.filter((item: any) => item.itemKey === this.service.limitKeys?.weight)[0].itemValue; const maxVolume = res.filter((item: any) => item.itemKey === this.service.limitKeys?.volume)[0].itemValue; const maxPiece = res.filter((item: any) => item.itemKey === this.service.limitKeys?.piece)[0].itemValue; const maxDays = res.filter((item: any) => item.itemKey === this.service.limitKeys?.maxDays)[0].itemValue; const intervalDays = res.filter((item: any) => item.itemKey === this.service?.limitKeys?.intervalDays)[0].itemValue; const maxTimes = res.filter((item: any) => item.itemKey === this.service.limitKeys.maxTimes)[0]?.itemValue; this.limitValues = { maxWeight: Number(maxWeight), maxVolume: Number(maxVolume), maxPiece: Number(maxPiece), maxDays: Number(maxDays), intervalDays: Number(intervalDays), maxTimes: Number(maxTimes) }; }); } // 不可选择的时间 disabledDateStart = (current: Date): boolean => { return differenceInCalendarDays(new Date(), current) > 0; }; /** * 自定义校验数据 * @param val */ customValidator(val: number) { if (this.isEmpty(val)) { return [{ keyword: 'required', message: '不能为空' }]; } else { if (val <= 0) { return [{ keyword: 'required', message: '数值需大于0' }]; } return []; } } isEmpty(val: any) { return val === undefined || val === null || val.toString().trim() === ''; } // 获取城市列表 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); }); } payChange() { const prePay = this.sf7.value.prePay || 0; const toPay = this.sf7.value.toPay || 0; const receiptPay = this.sf7.value.receiptPay || 0; const oilCardPay = 0; const subtotal = prePay + toPay + receiptPay; const params = { shipperId: this?.sf1.value?.shipperAppUserId, enterpriseInfoId: this?.sf1.value?.enterpriseInfoName || '', totalFreight: subtotal, fuelCardAmount: oilCardPay, resourcetype: '1' }; this.service.request(this.service.$api_getCalculatedSurcharge, params).subscribe(res => { console.log('999'); console.log(this?.sf1.value); if (res) { this.sf7.setValue('/appendFee', res.surcharge); this.sf7.setValue('/subtotal', subtotal); this.sf7.setValue('/total', subtotal + res.surcharge); this.service .request( this.service.$api_getAdditionalRate + `?shipperId=${this?.sf1.value?.shipperAppUserId || ''}&enterpriseInfoId=${this?.sf1.value?.enterpriseInfoName || '' }&resourcetype='1'` ) .subscribe(res => { if (res) { this.currentRate = res.rate * 100; } }); } else { this.service.msgSrv.error(res.msg); } }); } // 添加 删除发货卸货地址 addStartInfo() { console.log(this.startInfo.length); console.log(this.limitValues.maxTimes); if (this.startInfo.length < this.limitValues.maxTimes) { const controlId = this.startInfo.length; this.startInfo.push({ detailedAddress: '', appUserName: '', contractTelephone: '', latitude: '', longitude: '', province: '', city: '', area: '', type: '1' }); 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, Validators.pattern('^[0-9]*$')])); } } // 添加 删除发货卸货地址 subStartInfo(event: any, index: number) { this.startInfo.splice(index, 1); this.validateForm1.removeControl(`loadAddress${index}`); this.validateForm1.removeControl(`loadName${index}`); this.validateForm1.removeControl(`loadPhone${index}`); } // 添加 删除发货卸货地址 addEndInfo() { if (this.endInfo.length < this.limitValues.maxTimes) { const controlId = this.endInfo.length; this.endInfo.push({ detailedAddress: '', appUserName: '', contractTelephone: '', latitude: '', longitude: '', province: '', city: '', area: '', type: '2' }); 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, Validators.pattern('^[0-9]*$')]) ); } } // 添加 删除发货卸货地址 subEndInfo(event: any, index: number) { this.endInfo.splice(index, 1); this.validateForm1.removeControl(`unloadAddress${index}`); this.validateForm1.removeControl(`unloadName${index}`); this.validateForm1.removeControl(`unloadPhone${index}`); } //指派熟车 chooseFamifiar(item: any) { console.log('999'); const modalRef = this.modalService.create({ nzTitle: '指派熟车', nzContent: SupplyManagementVehicleAssignedCarComponent, nzWidth: 1200, nzComponentParams: { status: 'new', url: this.service.$api_save_consignWholeAssign, params: item }, nzFooter: null }); modalRef.afterClose.subscribe(result => { if (result) { this.openFinishPage(result); } }); } // 提交前确认,委托运输协议弹窗 submitConfirm(submitType?: any) { 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.sf5.validator({ emitError: true }); this.sf6.validator({ emitError: true }); this.sf7.validator({ emitError: true }); console.log(!this.sf1.valid); console.log(this.sf1.value); if ( this.validateForm1.invalid || !this.sf3.valid || !this.sf1.valid || !this.sf4.valid || !this.sf5.valid || !this.sf6.valid || !this.sf7.valid ) { this.service.msgSrv.warning('请完善必填项!'); return; } if (this.totalDistance <= 0) { this.service.msgSrv.warning('起终点相同,请重新选择装卸货地址!'); return; } if (this.validateForm1.value.loadingTime < new Date()) { this.service.msgSrv.warning('装货时间必须大于当前时间!'); return; } if (this.validateForm1.value.loadingTime > this.validateForm1.value.unloadingTime) { this.service.msgSrv.warning('装货时间不能大于卸货时间!'); return; } if (this.sf7.value.total <= 0) { this.service.msgSrv.warning('总费用不能为0!'); return; } const num = (Number(this.validateForm1.value.unloadingTime) - Number(this.validateForm1.value.loadingTime)) / (24 * 60 * 60 * 1000); if (num > this.limitValues.maxDays) { this.service.msgSrv.error(`当前计划装卸货时间间隔已超出限定值【${this.limitValues.maxDays}天】`); return; } if ( this.sf4.value?.weight > this.limitValues?.maxWeight || this.sf4.value?.volume > this.limitValues?.maxVolume || this.sf4.value?.number > this.limitValues?.maxPiece ) { this.service.msgSrv.error( `当前货物核载信息已超出限定值【${this.limitValues?.maxWeight}吨、${this.limitValues?.maxVolume}方、${this.limitValues?.maxPiece}件】` ); return; } const getFreightParms = { carLengthKeys: this.sf4.value.carLength, km: this.totalDistance }; this.service.request(this.service.$api_getFreight, getFreightParms).subscribe(res => { if (this.sf7.value?.subtotal > res?.maxPrice) { this.service.msgSrv.error(`运费过高,请调整录入`); return; } else if (this.sf7.value?.subtotal > res?.ewPrice) { this.modalService.confirm({ nzTitle: '', nzContent: `您的录入的运费过高,可能会影响支付,请仔细确认`, nzOkText: '继续', nzCancelText: '取消', nzOnOk: () => { this.agreementConfirm(submitType); } }); } else { this.agreementConfirm(submitType); } }); } // 提交前协议弹窗 agreementConfirm(submitType?: string) { //装卸货信息 const LoadingList = this.startInfo.concat(this.endInfo); // 货物信息 const sf3Values = { ...this.sf3.value }; if (sf3Values.goodsTypeName === '其它') { sf3Values.goodsName = sf3Values.goodsName1; delete sf3Values.goodsName1; } if (this.sf4.value.carModel.includes('999')) { this.sf4.value.carModel = ['999']; } if (this.sf4.value.carLength.includes('999')) { this.sf4.value.carLength = ['999']; } const goodsInfoVOList = [ { ...sf3Values, ...this.sf4.value, carModel: this.sf4.value.carModel.join(','), carLength: this.sf4.value.carLength.join(',') } ]; // 运费信息 const expenseList = [ { expenseCode: 'PRE', expenseName: '预付', price: this.sf7.value.prePay || 0, id: this.sf7data?.prePayId || '' }, { expenseCode: 'RECE', expenseName: '到付', price: this.sf7.value.toPay || 0, id: this.sf7data?.toPayId || '' }, { expenseCode: 'BACK', expenseName: '回单付', price: this.sf7.value.receiptPay || 0, id: this.sf7data?.receiptPayId || '' } ]; const params = { id: '', ...this.sf1.value, unLoadingPlaceDTOList: LoadingList, unloadingTime: format(this.validateForm1.value.unloadingTime, 'yyyy-MM-dd HH:mm:ss'), loadingTime: format(this.validateForm1.value.loadingTime, 'yyyy-MM-dd HH:mm:ss'), goodsInfoDTOList: goodsInfoVOList, ...this.sf5.value, ...this.sf6.value, expenseDTOList: expenseList, paymentDays: this.sf7.value.paymentDays, subtotal: this.sf7.value.subtotal, total: this.sf7.value.total, estimatedKilometers: this.totalDistance, estimatedTravelTime: this.totalTime, insurancePackagedGoods: this.sf4.value.insurancePackagedGoods, goodsValue: this.sf4.value.goodsValue }; console.log(params); const modalRef = this.modalService.create({ nzTitle: '运输协议', nzContent: TranAgreementComponent, nzWidth: 900, nzFooter: null, nzComponentParams: { object: params, shipperName: this.shipperName, type: 'onecar' } }); modalRef.afterClose.subscribe(result => { if (result) { this.submit(submitType, params); } }); } // 提交 submit(submitType?: string, params?: any): void { let reqUrl = this.service.$api_consignWhole; if (submitType) { if (submitType == 'assign') { this.chooseFamifiar(params); return; } } this.service.request(reqUrl, params).subscribe((res: any) => { if (res) { this.openFinishPage(); } }); } // 打开地图 openMap(type: string, index: number) { const modalRef = this.modalService.create({ nzTitle: '', 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; 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]?.detailedAddress && this.endInfo[0]?.detailedAddress) { this.amapService.drivingCompute([...this.startInfo], [...this.endInfo]).subscribe(res => { this.totalDistance = res.distance; this.totalTime = res.time; this.getInsurersPrice(); // 计算保费金额 }); } return true; } else { this.service.msgSrv.warning('请重新手动选择地址!'); return false; } } }); } // 选择收回单地址 backBillChange() { const modalRef = this.modalService.create({ nzTitle: '选择收回单地址', nzContent: PublishAddressListComponent, nzWidth: 900, nzComponentParams: { spuStatus: '2' }, nzOnOk: item => { const data = item.seleteData; if (JSON.stringify(data) === '{}') return; this.sf6.setValue('/receiptAddressId', data.id); this.sf6.setValue('/receiptUserName', data.contactName); this.sf6.setValue('/phon', data.contactTelephone); this.sf6.setValue('/area', `${data.province}-${data.city}-${data.area}`); this.sf6.setValue('/address', data.detailedAddress); } }); } // 选择地址 chooseAddress(index: number, type: string) { const modalRef = this.modalService.create({ nzTitle: '选择地址', nzContent: PublishAddressListComponent, nzWidth: 900, nzComponentParams: { spuStatus: '1' }, nzOnOk: item => { console.log(item); console.log(type); 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; } // 计算里程,时间 if (this.startInfo[0]?.detailedAddress && this.endInfo[0]?.detailedAddress) { this.amapService.drivingCompute([...this.startInfo], [...this.endInfo]).subscribe(res => { this.totalDistance = res.distance; this.totalTime = res.time; this.getInsurersPrice(); //计算保费金额 }); } } }); } // 打开下单完成页面 openFinishPage(resourceObj: any = null) { this.modalService.create({ nzTitle: '', nzContent: PublishSuccessComponent, nzWidth: 900, nzFooter: null, nzComponentParams: { type: 'onecar', resourceObj } }); } 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); } } else { this.service.msgSrv.error(res.msg); } }); } // 返回上一页 goBack() { window.history.go(-1); } // 装卸货地址互换 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]?.detailedAddress && this.endInfo[0]?.detailedAddress) { this.amapService.drivingCompute([...this.startInfo], [...this.endInfo]).subscribe(res => { this.totalDistance = res.distance; this.totalTime = res.time; this.getInsurersPrice(); //计算保费金额 }); } } // 计算保价费金额 getInsurersPrice(insuranceType = this.sf5.value?.insuranceType) { console.log(insuranceType); console.log(this.totalDistance); if (insuranceType !== '3' && this.totalDistance > 0) { const params = { insuranceType, goodsValue: this.sf4.value.goodsValue, km: this.totalDistance }; this.service.request(this.service.$api_getWholeInsuranceInfo, params).subscribe(res => { if (res) { this.sf5.setValue('/insurancePremium', res.insurancePremium); this.sf5.setValue('/insuranceRate', res.insuranceRate); } else { this.sf5.setValue('/insurancePremium', null); this.sf5.setValue('/insuranceRate', null); } }); } } // 运费信息价格变更 priceChange(event: any, i: any) { i.setValue(event); if (event >= 99999) { this.modalService.warning({ nzTitle: '可输入的最大金额为99999元' }); } this.payChange(); } checkGoodsName() { const name = this.sf3.getValue('/goodsName1'); if (!name || name.trim().length === 0) { return; } this.service.request(this.service.$api_checkGoodsName, name).subscribe(res => { if (res === false) { const modalRef = this.modalService.error({ nzTitle: '货物名称含有违禁词,请重新输入!', }); modalRef.afterClose.subscribe(result => { // this.sf3.setValue('/goodsName1', null); }); } }); } }