This commit is contained in:
linfso 2024-07-31 21:00:16 +08:00
parent d63a472046
commit 5a7deeaaa9
10 changed files with 478 additions and 61 deletions

View File

@ -9,6 +9,17 @@ export function parseAddress(content) {
})
}
// 物流轨迹查询
export function queryTraceInfo(mailno,tail4) {
return request({
url: '/oms2c/common/queryTraceInfo',
method: 'get',
params: {mailno:mailno,tail4:tail4}
})
}
// 获取app信息
export function getLastAppVersion() {
return request({

View File

@ -18,6 +18,15 @@ export function getSalemanList(query) {
})
}
export function listBindSalesmen(query) {
return request({
url: '/oms2c/emisWaybill/listBindSalesmen',
method: 'get',
params: query
})
}
// 获取回款
export function getPayeeList(query) {
return request({

View File

@ -130,6 +130,15 @@ export function preCalcWaybillFee(data) {
})
}
// 下单运费试算
export function calcProductFee(data) {
return request({
url: '/oms2c/emisWaybill/calcProductFee',
method: 'post',
data: data
})
}
// 结算重量计算
export function calcSetteldWeight(data) {
return request({

View File

@ -10,7 +10,7 @@ import getPageTitle from '@/utils/get-page-title'
NProgress.configure({ showSpinner: false })
const whiteList = ['/login', '/auth-redirect', '/bind', '/register','/tools','/loginBySSO']
const whiteList = ['/login', '/auth-redirect', '/bind', '/register','/tools','/loginBySSO','/queryTraceInfo']
router.beforeEach(async(to, from, next) => {
NProgress.start()

View File

@ -57,6 +57,14 @@ export const constantRoutes = [
title:'工具'
}
},
{
path: '/queryTraceInfo',
component: () => import('@/views/openpage/queryTraceInfo'),
hidden: true,
meta:{
title:'轨迹查询'
}
},
{
path: '/register',
component: () => import('@/views/register'),

View File

@ -9,7 +9,7 @@
no-data-text=""
:disabled="disabled"
auto-complete="off"
:placeholder="placeholder"
@change="onChange"
@click.native="onClick"

View File

@ -0,0 +1,236 @@
<template>
<div :id="createdId">
<el-popover
placement="bottom"
trigger="click"
ref="popoverRef"
:popper-options="{ boundariesElement: '.el-form', removeOnDestroy: true }"
>
<div >
<el-table
ref="comboGridTable"
v-loading="loading"
style="width: 100%;"
:data="optionItems"
@row-click="onRowClick"
:row-key="row => row.userId"
stripe
element-loading-text="Loading"
>
<el-table-column label="工号" align="left" prop="empCode" width="100" />
<el-table-column label="姓名" align="center" prop="empName" width="100" :show-overflow-tooltip="true" />
<el-table-column label="手机" align="center" prop="ownerSiteName" width="100" :show-overflow-tooltip="true" />
</el-table>
<!-- <el-pagination v-show="pagination" small
:total="total"
:page-size="5"
layout="prev, pager, next, total"
@current-change="changePage"
/> -->
<div>添加业务员</div>
</div>
<el-input
slot="reference"
ref="inputValue"
:value="slable"
:placeholder="placeholder"
@input="onInput"
@click.native="onClick"
@blur="onBlur"
@clear="onClear"
clearable
>
<template slot="suffix">
<!-- <i class="el-icon-arrow-down select-down" :class="visible&&'rotate180'"></i> -->
<i slot="suffix" class="el-icon-search"></i>
</template>
</el-input>
</el-popover>
</div>
</template>
<script>
import emitter from 'element-ui/src/mixins/emitter';
import { listBindSalesmen } from "@/api/oms/emisStaff";
export default {
name: "EmisUserSimplePicker",
mixins: [emitter],
props: {
value: {
type: String,
required: false
},
sideCode: {
type: String,
required: false
},
postCode:{
type: String,
required: false
},
placeholder:{
type: String,
required: false
},
disabled:{
type: [Boolean,String],
required: false
},
pagination: {
type: Boolean, default: true
},
},
data() {
return {
createdId: '0',
loading:false,
total:0,
optionItems: [],
// 缺省值
defaultTotal:0,
defaultItems:null,
svalue: this.value,
slable: null,
isInputing: false,
isInit:true,
queryParams:{
pageNum:1,
pageSize:50,
userId:null,
searchValue:null,
}
};
},
watch: {
value(newVal,oldVal) {
if(this.value!=null && this.isInit){
this.svalue=this.value;
this.queryData(null,this.svalue);
}
},
siteCode(newVal){
this.queryParams.ownerSiteCode=newVal;
this.defaultItems=null;
},
postCode(newVal){
this.queryParams.postCode=newVal;
this.defaultItems=null;
}
},
mounted() {
// 给个随机id 判断是否clickoutside
this.createdId = String(new Date().getTime())
},
created() {
if(this.value!=null && this.isInit){
this.svalue=this.value;
this.queryData(null,this.svalue);
}
},
methods: {
onClick(){
this.isInit=false;
// 第一次点击时需要初始化
if(!this.defaultItems){
this.queryParams.pageNum=1;
this.queryData(null,null);
}else{
this.total = this.defaultTotal;
this.optionItems = [...this.defaultItems];
}
// this.$refs.popoverRef.doShow();
},
onInput(val) {
if(val == null ) return;
this.isInputing = true;
this.slable = val;
this.queryParams.pageNum = 1
this.queryData(val,null)
},
onRowClick(row, column, event) {
this.svalue=row.userId;
this.slable=row.empName;
this.isInputing = false;
this.$emit("input", this.svalue);
this.$emit("onChange",row);
this.$refs.popoverRef.doClose();
},
isRed({ row }) {
if (row.userId == this.svalue) {
return {
"color": "red",
"font-weight": "bold",
};
}
},
onClear(el){
this.slable = null;
this.svalue = null;
this.$emit("input", this.svalue);
this.dispatch('ElFormItem', 'el.form.blur', [this.svalue]);
},
onBlur(el) {
// 如果编辑没有选择则清关历史记录
if( this.isInputing ){
this.svalue = null;
this.slable = null;
}
this.$emit("input", this.svalue);
this.dispatch('ElFormItem', 'el.form.blur', [this.svalue]);
},
changePage(cur) {
this.queryParams.pageNum = cur
this.queryData()
},
queryData(val,key) {
this.loading = true;
this.queryParams.searchValue = val;
this.queryParams.userId = key;
listBindSalesmen(this.queryParams).then(response => {
this.loading = false;
this.total = response.total;
this.optionItems = response.rows;
// 初始值存储
if(key==null && val==null){
this.defaultTotal = this.total+0;
this.defaultItems=[...this.optionItems]
}
if(!this.isInputing ){
let selectItem = response.rows.find(item => item.userId == this.svalue);
if(selectItem){
this.slable = selectItem.empName;
}
}
});
},
getIndex($index) {
return (this.queryParams.pageNum - 1) * this.queryParams.pageSize + $index + 1
},
}
};
</script>

View File

@ -46,7 +46,7 @@
padding: 5px 15px;
background: black;
font-size: 13px;
color: white;">{{ $t('发方信息') }}</span>
color: white;">{{ $t('寄') }}</span>
</div>
<div style="width:50%;text-align:right;padding-right: 15px;">
<!-- icon="el-icon-edit" -->
@ -87,7 +87,7 @@
<el-col :span="24">
<el-form-item :label="$t('发货地区')" prop="sender.province" >
<div style="display:inline-flex">
<province-picker1 v-model="form.sender.province" :countryCode="form.sender.country" style="margin-left:5px" @onChange="handleCalcSendSite"></province-picker1>
<province-picker1 v-model="form.sender.province" :countryCode="form.sender.country" @onChange="handleCalcSendSite"></province-picker1>
<city-picker1 v-model="form.sender.city" :parentCode="form.sender.province" style="margin-left:5px" @onChange="handleCalcSendSite"></city-picker1>
<district-picker1 v-model="form.sender.county" :parentCode="form.sender.city" style="margin-left:5px" @onChange="handleCalcSendSite"></district-picker1>
</div>
@ -99,12 +99,18 @@
</el-form-item>
</el-col>
<!-- <el-col :span="24">
<el-form-item :label="$t('发件网点')" prop="sendSiteCode">
<el-col :span="24" v-if="form.sendSiteName">
<el-form-item :label="$t('服务网点')" prop="sendSiteCode">
<el-input v-model="form.sendSiteName" placeholder="" disabled />
</el-form-item>
</el-col>
<!-- <el-col :span="24" >
<el-form-item :label="$t('业务员')" prop="takePieceEmployeeCode">
<TakeEmpPicker v-model="form.takePieceEmployeeCode" ></TakeEmpPicker>
</el-form-item>
</el-col> -->
</el-row>
</el-col>
@ -116,7 +122,7 @@
padding: 5px 15px;
background: #b12e29;
font-size: 13px;
color: white;"> {{ $t('收方信息') }}</span>
color: white;"> {{ $t('收') }}</span>
</div>
<div style="width:50%;text-align:right;padding-right: 15px;">
<el-button
@ -157,7 +163,7 @@
<el-col :span="24">
<el-form-item :label="$t('收货地区')" prop="reciever.province">
<div style="display:inline-flex">
<ProvincePicker2 v-model="form.reciever.province" :countryCode="form.reciever.country" style="margin-left:5px" @onChange="handleCalcDestSite" ></ProvincePicker2>
<ProvincePicker2 v-model="form.reciever.province" :countryCode="form.reciever.country" @onChange="handleCalcDestSite" ></ProvincePicker2>
<city-picker2 v-model="form.reciever.city" :parentCode="form.reciever.province" style="margin-left:5px" @onChange="handleCalcDestSite" ></city-picker2>
<district-picker2 v-model="form.reciever.county" :parentCode="form.reciever.city" style="margin-left:5px" @onChange="handleCalcDestSite" ></district-picker2>
</div>
@ -169,11 +175,11 @@
</el-form-item>
</el-col>
<!-- <el-col :span="24">
<el-col :span="24" v-if="form.dispatchUnderlingSiteName">
<el-form-item :label="$t('派件网点')" prop="dispatchUnderlingSiteName">
<el-input v-model="form.dispatchUnderlingSiteName" placeholder="" disabled />
</el-form-item>
</el-col> -->
</el-col>
</el-row>
</el-col>
@ -190,6 +196,11 @@
<el-row :gutter="0" style="display: flex;flex-wrap: wrap;">
<el-col :span="12">
<el-row :gutter="0" style="display: flex;flex-wrap: wrap;">
<el-col :span="24">
<el-form-item label="选择线路" prop="transLine">
<TransLinePicker v-model="form.transLine" :fromCountry="form.sender.country" :countryCode="form.reciever.country" isInitiated="true" @onChange="preCalcFee"></TransLinePicker>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item :label="$t('取件方式')" prop="pickupMethod">
<el-radio-group v-model="form.pickupMethod">
@ -208,11 +219,7 @@
<TimePicker v-model="form.pickTimeRange" ></TimePicker>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="选择线路" prop="transLine">
<TransLinePicker v-model="form.transLine" :fromCountry="form.sender.country" :countryCode="form.reciever.country" isInitiated="true" @onChange="preCalcFee"></TransLinePicker>
</el-form-item>
</el-col>
<el-col :span="24" v-if="form.pickupMethod==1">
<el-form-item :label="$t('选择仓库')" prop="intoWarehouseCode">
<WarehouseSimplePicker v-model="form.intoWarehouseCode" @onChange="onSelectWarehouse"></WarehouseSimplePicker>
@ -271,17 +278,7 @@
<el-col :span="12">
</el-col>
<el-col :span="24">
<el-form-item label="给快递员捎话" prop="orderRemark" >
<CustomerPrivEmpSimplePicker :placeholder="$t('专属业务员')" v-model="form.operateEmployeeCode" postCode="OP" ></CustomerPrivEmpSimplePicker>
<div style="width:100%;margin-bottom:5px">
<span class="goods-tag" @click="onQuickRemark($event)">请带纸箱</span>
<span class="goods-tag" @click="onQuickRemark($event)">需要爬楼</span>
<span class="goods-tag" @click="onQuickRemark($event)">来前电话</span>
</div>
<el-input v-model="form.orderRemark" type="textarea" :placeholder="$t('输入其他需求')" maxlength="150" show-word-limit />
</el-form-item>
</el-col>
</el-row>
</el-col>
<el-col :span="12">
@ -360,44 +357,45 @@
</el-form-item>
</el-col>
<el-col :span="24">
<div>
<!-- <div>产品类型</div> -->
<el-form-item :label="$t('产品选择')" prop="productType" >
<el-row :gutter="0" style="display: flex;flex-wrap: wrap;">
<el-col v-if="productFeeList&&productFeeList.length>0" :span="24" >
<div class="product-fee-select" style="display: flex;flex-wrap: wrap;">
<div v-for="(item,index) in productFeeList" :key="index" class="item" :class="form.productType == item.productType ? 'select' : ''" @click="onSelectProduct(item)">
<div class="shift">
{{item.productTypeName}}
</div>
<div class="">
{{ item.agingDesc }} <span style="font-size: 14px;font-weight:bold;color:red">¥{{ item.estFee }}</span>
</div>
</div>
</div>
</el-col>
<el-col v-else :span="12">
<TransProductPicker placeholder="产品类型" v-model="form.productType" :transLineCode="form.transLine"></TransProductPicker>
</el-col>
</el-row>
</el-form-item>
</div>
</el-col>
<el-col :span="12">
<!-- <el-col :span="12">
<el-form-item :label="$t('运费预估')" prop="freight" >
<span style="font-size:15px;color:red;font-weight:500">¥{{form.freight}}</span>
</el-form-item>
</el-col>
</el-col> -->
</el-row>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<div>
<!-- <div>产品类型</div> -->
<el-form-item :label="$t('产品选择')" prop="productType" >
<el-row :gutter="0" style="display: flex;flex-wrap: wrap;">
<el-col v-if="productFeeList&&productFeeList.length>0" :span="24" >
<div class="product-fee-select" style="display: flex;flex-wrap: wrap;">
<div v-for="(item,index) in productFeeList" :key="index" class="item" :class="form.productType == item.productType ? 'select' : ''" @click="onSelectProduct(item)">
<div class="shift">
{{item.productTypeName}}
</div>
<div class="">
{{ item.agingDesc }} <span style="font-size: 14px;font-weight:bold;color:red">¥{{ item.estFee }}</span>
</div>
</div>
</div>
</el-col>
<!-- <el-col v-else :span="12">
<TransProductPicker placeholder="产品类型" v-model="form.productType" :transLineCode="form.transLine"></TransProductPicker>
</el-col> -->
</el-row>
</el-form-item>
</div>
</el-col>
</el-row>
</div>
</el-collapse-item>
<!-- v-if="needDeclare==1" -->
<el-collapse-item title="" name="3" >
@ -566,6 +564,26 @@
</el-row>
</el-collapse-item>
<el-collapse-item title="" name="5" >
<template slot="title">
<div class="form-group-title"><span class="title">{{ $t('给快递员捎话') }}</span>
</div>
</template>
<el-row :gutter="0" style="display: flex;flex-wrap: wrap;">
<el-col :span="18">
<el-form-item label="给快递员捎话" prop="orderRemark" >
<!-- <CustomerPrivEmpSimplePicker :placeholder="$t('专属业务员')" v-model="form.operateEmployeeCode" postCode="OP" ></CustomerPrivEmpSimplePicker> -->
<div style="width:100%;margin-bottom:5px">
<span class="goods-tag" @click="onQuickRemark($event)">请带纸箱</span>
<span class="goods-tag" @click="onQuickRemark($event)">需要爬楼</span>
<span class="goods-tag" @click="onQuickRemark($event)">来前电话</span>
</div>
<el-input v-model="form.orderRemark" type="textarea" :placeholder="$t('输入其他需求')" maxlength="150" show-word-limit />
</el-form-item>
</el-col>
</el-row>
</el-collapse-item>
</el-collapse>
<!--
@ -576,6 +594,19 @@
</el-form-item>
</el-col> -->
<!-- <el-col :span="24">
<el-form-item label="给快递员捎话" prop="orderRemark" >
<CustomerPrivEmpSimplePicker :placeholder="$t('专属业务员')" v-model="form.operateEmployeeCode" postCode="OP" ></CustomerPrivEmpSimplePicker>
<div style="width:100%;margin-bottom:5px">
<span class="goods-tag" @click="onQuickRemark($event)">请带纸箱</span>
<span class="goods-tag" @click="onQuickRemark($event)">需要爬楼</span>
<span class="goods-tag" @click="onQuickRemark($event)">来前电话</span>
</div>
<el-input v-model="form.orderRemark" type="textarea" :placeholder="$t('输入其他需求')" maxlength="150" show-word-limit />
</el-form-item>
</el-col> -->
<div style="text-align: center;margin-top: 10px;margin-bottom: 100px;">
<div >
<el-checkbox style="font-size:400;margin-right:10px;color:black" v-model="form.blAgree" :true-label="'1'" :false-label="'0'"><span style="font-size:12px"> {{ $t('我已同意接受') }} </span> <span style="font-size:12px">《快递运单契约条款》</span></el-checkbox>
@ -600,10 +631,12 @@
<script>
import { realMatchWaybill } from "@/api/oms/emisCommon";
import { preCalcWaybillFee,getWaybillDetail,realSubmitOrder,calcWaybillFee,calcSetteldWeight,calcVolumeWeight} from "@/api/oms/emisWaybill";
import { calcProductFee,getWaybillDetail,realSubmitOrder,calcWaybillFee,calcSetteldWeight,calcVolumeWeight} from "@/api/oms/emisWaybill";
import { parseTime } from "@/utils/custom";
import { debounce } from 'throttle-debounce'
import { getDestSite,getSendSite } from "@/api/oms/emisDestination";
import { listSimpleEmisTransProduct } from "@/api/oms/emisTransProduct";
import DestinationPicker from '@/views/oms/EmisBaseTools/DestinationPicker.vue';
@ -648,6 +681,9 @@ import WarehouseSimplePicker from '@/views/oms/EmisBaseTools/WarehouseSimplePick
import PayeePicker from '@/views/oms/EmisBaseTools/PayeePicker.vue';
import SalemanPicker from '@/views/oms/EmisBaseTools/SalemanPicker.vue';
import TakeEmpPicker from '@/views/oms/EmisBaseTools/TakeEmpPicker.vue';
import TimePicker from '@/components/DatePickerAdv/TimePicker';
@ -699,14 +735,15 @@ components: {
GoodsTablePicker,
GoodsInput,
CustomerPrivEmpSimplePicker,
WarehouseSimplePicker
WarehouseSimplePicker,
TakeEmpPicker
},
dicts: ['emis_qujian_fangshi','emis_declare_mode','emis_customs_clear',
'emis_tab_packing_type','emis_tab_dispatch_mode','emis_payment_type',
'emis_calc_fee_type','emis_print_type'],
data() {
return {
activeNames:['1','2','3','4'],
activeNames:['1','2','3','4','5'],
billCode:null,
emisWaybillOptions: [],
addressType:null,
@ -1338,9 +1375,7 @@ methods: {
}
// 通过服务器其计算,保留自定义费用
preCalcWaybillFee(postData).then(response => {
console.log(response);
calcProductFee(postData).then(response => {
this.productFeeList = response.data;
if(!this.productFeeList || this.productFeeList.length==0){
this.$message.error(`无报价`);

View File

@ -904,6 +904,9 @@ export default {
resetQuery() {
this.resetForm("queryForm");
this.handleQuery();
},
handleInWarehouseConfirm(){
},
// 多选框选中数据
handleSelectionChange(selection) {

View File

@ -0,0 +1,106 @@
<template>
<div class="" style="background-color: #F3F4F8;padding:5px">
<div>
<div style="display: inline-flex;width: 100%;" class="panel">
<!-- <el-input v-model="billCode" placeholder="输入运单号查询物流详情" /> -->
<div style="width:85%">
<el-input v-model="billCode" clearable="" placeholder="输入运单号查询物流详情" @keyup.enter.native="queryTrace" >
<i slot="prefix" class="iconfont">&#xe656;</i>
</el-input>
</div>
<div style=" width: 15%;
text-align: center;
font-size: 14px;
line-height: 30px;" @click="queryTrace">查询</div>
</div>
</div>
<!-- <el-scrollbar style="height:400px;"> -->
<div style="min-height:50px;margin-top: 10px;" class="panel" >
<!-- <div style="font-weight: 600;margin-bottom: 20px;padding-left: 40px;">运单号:{{ billCode }}</div> -->
<el-timeline :reverse="reverse">
<el-timeline-item
v-for="(step, stepIndex) in traceInfoList"
:key="stepIndex"
:timestamp="step.time"
:type="stepIndex==0?'primary ':''"
>
{{step.content}}
</el-timeline-item>
</el-timeline>
</div>
<!-- </el-scrollbar> -->
</div>
</template>
<script>
import { queryTraceInfo } from "@/api/oms/emisCommon";
export default {
name: "queryTraceInfo",
props:{
// billCode:{
// type: String,
// }
},
dicts: [],
data() {
return {
billCode:null,
reverse: false,
// 遮罩层
loading: true,
// 地球洲表格数据
traceInfoList: []
};
},
created() {
// this.queryData();
},
watch: {
// "billCode": {
// handler (newValue, oldValue) {
// this.queryData();
// },
// deep: true
// }
},
methods: {
/** 查询地球洲列表 */
queryTrace() {
this.loading = true;
if(!this.billCode){
return this.$message.error("输入查询单号")
}
queryTraceInfo(this.billCode,"1234").then(response => {
this.traceInfoList = response.data;
console.log(this.traceInfoList);
this.loading = false;
});
},
}
};
</script>
<style rel="stylesheet/scss" lang="scss">
:deep #app{
background-color: #fff!important;
}
.el-input__inner:hover {
border-color: #eeeeee;
}
.panel {
background-color: #fff;
padding: 5px;
line-height: 30px;
}
</style>