Commit 5fa2c517 authored by 我在何方's avatar 我在何方

更新报表跟进

parent 1930fed3
import request from '@/utils/request'
// 创建报价单跟进日志
export function createOfferLog(data) {
return request({
url: '/ecw/offer-log/create',
method: 'post',
data: data
})
}
// 更新报价单跟进日志
export function updateOfferLog(data) {
return request({
url: '/ecw/offer-log/update',
method: 'put',
data: data
})
}
// 删除报价单跟进日志
export function deleteOfferLog(id) {
return request({
url: '/ecw/offer-log/delete?id=' + id,
method: 'delete'
})
}
// 获得报价单跟进日志
export function getOfferLog(id) {
return request({
url: '/ecw/offer-log/get?id=' + id,
method: 'get'
})
}
// 获得报价单跟进日志分页
export function getOfferLogPage(query) {
return request({
url: '/ecw/offer-log/page',
method: 'get',
params: query
})
}
// 导出报价单跟进日志 Excel
export function exportOfferLogExcel(query) {
return request({
url: '/ecw/offer-log/export-excel',
method: 'get',
params: query,
responseType: 'blob'
})
}
......@@ -10,6 +10,14 @@ export function listUser(query) {
})
}
// 根据岗位编码获取人员列表
export function userList(query) {
return request({
url: '/system/user/list-user/'+query,
method: 'get',
})
}
// 获取用户精简信息列表
export function listSimpleUsers() {
return request({
......
......@@ -93,6 +93,8 @@ export const DICT_TYPE = {
ECW_WAREHOUSING_TYPE: 'warehousing_type', // 入仓类型
ECW_OFFER_STATUS: 'offer_status', // 销售阶段(报价单)
ECW_IS_BRAND: 'is_brand', // 有无品牌
ECW_OFFER_TYPE: 'offer_type', // 跟进类型
ECW_OFFER_METHOD: 'offer_method', // 跟进方式
//--------ecw---------
CUSTOMER_STATUS: 'customer_status',
CUSTOMER_SOURCE: 'customer_source',
......@@ -123,7 +125,6 @@ export const DICT_TYPE = {
COMMISSION_UNIT:'commission_unit',//佣金货物单位
ECW_PORT_TYPE:'port_type', //港口类型
CERTIFICATE_TYPE:'certificate_type',//证件类型
//customer
CUSTOMER_CREDIT_RULE_TYPE: 'customer_credit_rule_type',
CUSTOMER_LEVEL_RULE_TYPE: 'customer_level_rule_type',
......
<template>
<div class="app-container">
<el-card>
<div slot="header" class="card-title">报表跟进</div>
<el-form ref="form" :model="form" :rules="rules" label-width="120px" label-position="left">
<el-form-item label="报价单号" prop="number" style="width: 46%;display: inline-block;">
<label>{{form.number}}</label>
<!-- <el-input :value="form.number" disabled placeholder="请输入报价单号" /> -->
</el-form-item>
<el-form-item label="跟进类型" prop="type" style="width: 46%;display: inline-block;margin-left:8%">
<el-radio v-model="form.type" label="2">商务洽谈</el-radio>
</el-form-item>
<el-form-item label="跟进时间" prop="followUpTime" style="width: 46%;display: inline-block">
<el-date-picker clearable v-model="form.followUpTime" value-format="yyyy-MM-dd HH:mm:ss" format="yyyy-MM-dd HH:mm:ss" type="datetime" placeholder="选择跟进时间" />
</el-form-item>
<el-form-item label="跟进业务员" prop="followUpSalesmanId" style="width: 46%;display: inline-block;;margin-left:8%">
<el-select v-model="form.followUpSalesmanId" placeholder="请选择跟进业务员">
<el-option v-for="item in creatorData"
:key="item.id" :label="item.nickname" :value="item.id"/>
</el-select>
</el-form-item>
<el-form-item label="联系人" prop="contacts" style="width: 46%;display: inline-block">
<el-select v-model="form.contacts" placeholder="请选择联系人">
<el-option v-for="item in contactsData"
:key="item.customerId" :label="item.name" :value="item.customerId"/>
</el-select>
</el-form-item>
<el-form-item label="跟进方式" prop="followUpMethod" style="width: 46%;display: inline-block;margin-left:8%">
<dict-selector
:type="DICT_TYPE.ECW_OFFER_METHOD"
placeholder="请选择跟进方式"
v-model="form.followUpMethod"
form-type="select"
/>
</el-form-item>
<el-form-item label="客户反馈" prop="customerFeedback">
<el-input type="textarea" :rows="3" v-model="form.customerFeedback" placeholder="请输入客户反馈" />
</el-form-item>
<el-form-item label="处理结果" prop="processingResults">
<el-input type="textarea" :rows="3" v-model="form.processingResults" placeholder="请输入处理结果" />
</el-form-item>
</el-form>
</el-card>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm">确 定</el-button>
</div>
</div>
</template>
<script>
import { createOfferLog } from "@/api/ecw/offerLog"
import { userList } from "@/api/system/user"
import { getCustomerContactsListByCustomer } from "@/api/ecw/customerContacts"
import {DICT_TYPE} from '@/utils/dict'
export default {
name: "OfferLog",
components: {
},
data() {
return {
// 遮罩层
loading: true,
open: false,
contactsData:[],
creatorData:[],
// 表单参数
form: {
type:'2',
offerId:0,
number:0
},
relationId:0,
// 表单校验
rules: {
type: [{ required: true, message: "请选择跟进类型", trigger: "change" }],
followUpTime: [{ required: true, message: "跟进时间不能为空", trigger: "blur" }],
followUpSalesmanId: [{ required: true, message: "跟进业务员不能为空", trigger: "change" }],
contacts: [{ required: true, message: "联系人不能为空", trigger: "blur" }],
followUpMethod: [{ required: true, message: "请选择跟进方式", trigger: "change" }],
customerFeedback: [{ required: true, message: "客户反馈不能为空", trigger: "blur" }],
processingResults: [{ required: true, message: "处理结果不能为空", trigger: "blur" }],
}
};
},
created() {
if(this.$route.query.offerId){
this.form.offerId = this.$route.query.offerId
}
if(this.$route.query.relationId){
this.relationId = this.$route.query.relationId
this.getContactsData()
}
if(this.$route.query.number){
this.form.number = this.$route.query.number
}
userList('salesman').then(res =>this.creatorData = res.data)
},
methods: {
getContactsData(){
getCustomerContactsListByCustomer({customerId:this.relationId}).then(response => {
this.contactsData = response.data
})
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (!valid) {
return;
}
// 添加的提交
this.form.type = parseInt(this.form.type)
this.form.followUpMethod = parseInt(this.form.followUpMethod)
createOfferLog(this.form).then(response => {
this.$modal.msgSuccess("新增成功");
this.open = false;
});
});
},
}
};
</script>
<style>
.dialog-footer{
padding: 40px;
}
</style>
<template>
<div class="app-container">
<el-card>
<div slot="header" class="card-title">报价单详情</div>
<!-- 列表 -->
<div class="offer-header">
<span style="font-size: 15px;">报价单号:{{list.number}}</span>
<div class="btns">
<el-button size="mini" type="primary" @click="$router.push('edit?id=' + offerId)">编辑</el-button>
<el-button type="primary" size="mini" @click="handleAdd"
>跟进</el-button>
<el-button type="primary" size="mini" @click="toResult"
>结果</el-button>
<el-button size="mini" type="primary">特价</el-button>
<el-button type="danger" size="mini" @click="handleDelete"
>删除</el-button>
</div>
</div>
<div>
<div class="title-font">
<label>报价单所属:发件人</label>
</div>
<el-descriptions :column="3" border class="card">
<el-descriptions-item label="发货人:">
{{consigneeData[0].name}}
</el-descriptions-item>
<el-descriptions-item label="手机号:">
{{consigneeData[0].defaultContactPhone}}
</el-descriptions-item>
<el-descriptions-item label="联系地址:">
{{consigneeData[0].address}}
</el-descriptions-item>
<el-descriptions-item label="客户来源:">
{{consigneeData[0].source}}
</el-descriptions-item>
<el-descriptions-item label="发货人公司名称:">
{{consigneeData[0].company}}
</el-descriptions-item>
<el-descriptions-item label="社交软件:">
{{consigneeData[0].defaultSocial?consigneeData[0].defaultSocial:''+' '+consigneeData[0].defaultSocialNumber?consigneeData[0].defaultSocialNumber:''}}
</el-descriptions-item>
</el-descriptions>
<el-descriptions :column="3" border class="card">
<el-descriptions-item label="收货人:">
{{consigneeData[1].name}}
</el-descriptions-item>
<el-descriptions-item label="手机号:">
{{consigneeData[1].defaultContactPhone}}
</el-descriptions-item>
<el-descriptions-item label="联系地址:">
{{consigneeData[1].address}}
</el-descriptions-item>
<el-descriptions-item label="客户来源:">
{{consigneeData[1].source}}
</el-descriptions-item>
<el-descriptions-item label="收货人公司名称:">
{{consigneeData[1].company}}
</el-descriptions-item>
<el-descriptions-item label="社交软件:">
{{consigneeData[1].defaultSocial?consigneeData[1].defaultSocial:''+' '+consigneeData[1].defaultSocialNumber?consigneeData[1].defaultSocialNumber:''}}
</el-descriptions-item>
</el-descriptions>
<div class="title-font">
<label>始发地:{{list.departureName}}</label>
<label>目的地:{{list.objectiveName}}</label>
</div>
</div>
</el-card>
<el-card class="card">
<div slot="header" class="card-title">商品信息</div>
<div style="overflow: auto;">
<el-table v-loading="loading" border :data="list.offerProdRespVOList">
<el-table-column label="序号" width="60px" fixed>
<template slot-scope="scope">
{{scope.$index + 1}}
</template>
</el-table-column>
<el-table-column label="商品类型" align="center" prop="goodsType" />
<el-table-column label="中文名" align="center" prop="prodTitleZh" />
<el-table-column label="英文名" align="center" prop="prodTitleEn" />
<el-table-column label="品牌" width="100px">
<template slot-scope="scope">
{{scope.row.brand?'':''}}
</template>
</el-table-column>
<el-table-column label="件数" width="90px" prop="num" />
<el-table-column label="包装单位">
<template slot-scope="scope">
<dict-tag :value="scope.row.unit" :type="DICT_TYPE.ECW_PACKAGE_TYPE" defaultable />
</template>
</el-table-column>
<el-table-column label="箱规(m)" width="120px" prop="boxGauge" />
<el-table-column label="体积(m³)" width="100px" prop="volume" />
<el-table-column label="重量(kg)" width="100px" prop="weight" />
<el-table-column label="货值(RMB)" width="100px" prop="worth">
<template slot-scope="scope">
{{scope.row.worth+scope.row.worthCurrency}}
</template>
</el-table-column>
<el-table-column label="商品特性" width="200px" prop="prodAttrName" />
<el-table-column label="运输方式" width="100px">
<template slot-scope="scope">
<dict-tag :type="DICT_TYPE.ECW_TRANSPORT_TYPE" :value="scope.row.transportId" />
</template>
</el-table-column>
<el-table-column label="出货渠道" width="100px" prop="channelName" />
<el-table-column label="线路" width="200px" prop="lineName" />
<el-table-column label="运费">
<template slot-scope="scope">
{{'运费'+scope.row.seaFreight+scope.row.seaFreightCurrency+'/'+ scope.row.seaFreightVolume+' 清关费'+scope.row.clearanceFreight+scope.row.clearanceFreightCurrency+'/'+ scope.row.clearanceFreightVolume}}
</template>
</el-table-column>
</el-table>
</div>
</el-card>
<el-card class="card">
<div slot="header" class="card-title">费用小计</div>
<el-descriptions border class="card">
<el-descriptions-item label="总件数:">
{{list.estCostVO.totalNum}}
</el-descriptions-item>
<el-descriptions-item label="总货值:">
{{list.estCostVO.totalWorth}}
</el-descriptions-item>
<el-descriptions-item label="报价费:">
{{list.estCostVO.insuranceFee}}
</el-descriptions-item>
</el-descriptions>
<!-- <el-descriptions border class="card">
<el-descriptions-item label="佣金类型" :span="2" class="card">
<dict-selector :type="DICT_TYPE.COMMISSION_TYPE" form-type="radio" fomtter="number" :value="list.commissionType" defaultable />
</el-descriptions-item>
</el-descriptions> -->
</el-card>
<el-card class="card" v-for="(item, i) in list.transportRespVOList">
<div slot="header" class="card-title">
<dict-tag :type="DICT_TYPE.ECW_TRANSPORT_TYPE" :value="item.transportId"></dict-tag>
</div>
<div class="line">
<el-descriptions v-for="(lineItem,k) in item.lineData">
<el-descriptions-item :label="[3,4].indexOf(item.transportId)>-1?('空运路线'+(k+1)):('海运路线'+(k+1))">
{{lineItem.warehouseLineDO.startTitleZh + ' >> >> >> ' + lineItem.warehouseLineDO.destTitleZh}}
</el-descriptions-item>
</el-descriptions>
<el-descriptions v-for="(channelItem,k) in item.channelData">
<el-descriptions-item :label="出货渠道+key">
{{channelItem.nameZh}}
</el-descriptions-item>
</el-descriptions>
</div>
<el-descriptions class="card" v-if="[2,3,4].indexOf(item.transportId) > -1">
<el-descriptions-item label="是否双清">
<dict-tag :type="DICT_TYPE.ECW_DOUBLE_CLEAR" :value="item.doubleClear"></dict-tag>
</el-descriptions-item>
</el-descriptions>
<el-descriptions v-if="[3,4].indexOf(item.transportId) > -1">
<el-descriptions-item label="航空公司">
{{item.airlineCompany}}
</el-descriptions-item>
</el-descriptions>
<el-descriptions v-if="item.transportId==2">
<el-descriptions-item label="船公司">
{{item.airlineCompany}}
</el-descriptions-item>
</el-descriptions>
<el-descriptions v-if="[2,3,4].indexOf(item.transportId) > -1">
<el-descriptions-item label="清关证书">
<dict-tag :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="item.customsClearCert"></dict-tag>
</el-descriptions-item>
</el-descriptions>
<el-descriptions v-if="[2,3,4].indexOf(item.transportId) > -1">
<el-descriptions-item label="清关证书备注">
{{item.remarks}}
</el-descriptions-item>
</el-descriptions>
<el-descriptions class="card" v-if="[3,4].indexOf(item.transportId) > -1">
<el-descriptions-item label="是否拆包">
<dict-tag :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="item.isUnpack"></dict-tag>
</el-descriptions-item>
</el-descriptions>
<el-descriptions v-if="[3,4].indexOf(item.transportId) > -1">
<el-descriptions-item label="单票立刻转运">
<dict-tag :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="item.isSingleTicketTransport"></dict-tag>
<span style="margin-left:10px;color: #0000FF;">注:若只有一件,货到仓库立即发,选“是”,多件需仓库集运待发,选“否”</span>
</el-descriptions-item>
</el-descriptions>
<el-descriptions v-if="[3,4].indexOf(item.transportId) > -1">
<el-descriptions-item label="包装类型">
<dict-selector form-type="checkbox" :type="DICT_TYPE.ECW_PACKAGE_TYPE" multiple v-model="item.packageType" />
</el-descriptions-item>
</el-descriptions>
<el-descriptions v-if="[3,4].indexOf(item.transportId) > -1">
<el-descriptions-item label="特需备注">
{{item.packageRemarks}}
</el-descriptions-item>
</el-descriptions>
</el-card>
<el-card class="card">
<div slot="header" class="card-title">通用信息</div>
<el-descriptions >
<el-descriptions-item label="唛头1">
{{list.marks}}
</el-descriptions-item>
<el-descriptions-item label="报关方式">
<dict-tag :type="DICT_TYPE.ECW_CUSTOMS_TYPE" :value="list.customsType"></dict-tag>
</el-descriptions-item>
</el-descriptions>
<el-descriptions :column="4">
<el-descriptions-item label="预计结束时间">
{{list.stopTime}}
</el-descriptions-item>
<el-descriptions-item label="控货">
{{list.control?'是':'否'}}
</el-descriptions-item>
<el-descriptions-item label="竞争对手">
{{list.competitor}}
</el-descriptions-item>
<el-descriptions-item label="重要程度">
<el-rate v-model="list.importance"></el-rate>
</el-descriptions-item>
</el-descriptions>
<el-descriptions >
<el-descriptions-item label="价格有效期">
{{list.startTime}} 至 {{list.endTime}}
</el-descriptions-item>
<el-descriptions-item label="交货方式">
<dict-tag :type="DICT_TYPE.ECW_TRADE_TYPE" :value="list.tradeType"></dict-tag>
{{list.tradeAdress}}
</el-descriptions-item>
</el-descriptions>
<el-descriptions >
<el-descriptions-item label="备注">
{{list.remarks}}
</el-descriptions-item>
</el-descriptions>
</el-card>
</div>
</template>
<script>
import {DICT_TYPE} from '@/utils/dict'
import {getOffer,deleteOffer} from '@/api/ecw/offer'
import {getProductAttrList} from '@/api/ecw/productAttr'
import {getProductPrice,getProductPriceList} from '@/api/ecw/productPrice'
import {getCustomerList,getCustomer} from '@/api/ecw/customer'
import {getChannelLists,getChannel} from '@/api/ecw/channel'
export default {
name: "detail",
components: {
},
data() {
return {
// 遮罩层
loading: false,
list: [],
types:'package,bag',
importance:1,
productAttrList:[],
offerId:134,
//发货/收货人信息
consigneeData:[]
};
},
created() {
getProductAttrList().then(res => this.productAttrList = res.data)
if(this.$route.query.offerId){
this.offerId = this.$route.query.offerId
this.getList();
}
this.getList();
},
methods: {
/** 查询列表 */
getList() {
let that = this
that.loading = true;
// 执行查询
getOffer(that.offerId).then(response => {
that.list = response.data;
that.list.transportRespVOList.forEach((item)=>{
if(item.channelIds){
getChannelLists({ids:item.channelIds}).then(res=>{
item.channelData = res.data
})
}
if(item.lineId){
getProductPriceList(item.lineIds).then(res=>{
item.lineData = res.data
})
}
})
var num = 0
that.list.offerProdRespVOList.forEach((item)=>{
if(item.channelId){
getChannel(item.channelId).then(res=>{
item.channelName = res.data.nameZh
})
}
if(item.lineId){
getProductPrice(item.lineId).then(res=>{
item.lineName = res.data.warehouseLineDO.startTitleZh + ' >> ' + res.data.warehouseLineDO.destTitleZh
})
}
var arr = item.prodAttrIds.split(',')
var prodAttrName = []
arr.forEach((itemValue)=>{
var prodAttrCenter = this.productAttrList.filter(items=>items.id==itemValue)
if(prodAttrCenter.length>0){
prodAttrName.push(prodAttrCenter[0].attrName)
}
})
item.prodAttrName = prodAttrName.join(',')
// num += item.num
})
that.loading = false;
that.getCnsigneeData()
});
},
// 获取发货/收货人
getCnsigneeData(){
let that = this
let ids = that.list.consignorId+','+ that.list.consigneeId
getCustomerList({ids:ids}).then(res => {
that.consigneeData = res.data
getCustomer(that.list.consignorId).then(res=>{
that.consigneeData[0] = Object.assign(that.consigneeData[0],res.data)
})
getCustomer(that.list.consigneeId).then(res=>{
that.consigneeData[1] = Object.assign(that.consigneeData[1],res.data)
})
})
},
/** 跟进按钮操作 */
handleAdd() {
this.$router.push({
path: "/offer/logList",
query:{
offerId:this.offerId,
relationId:this.list.consignorId
}
});
},
toResult(){
this.$router.push({
path: "/offer/result",
query:{
offerId:this.offerId,
number:this.list.number
}
});
},
/** 删除按钮操作 */
handleDelete() {
const offerId = this.offerId;
this.$modal.confirm('是否确认删除报价单管理编号为"' + offerId + '"的数据项?').then(function() {
return deleteOffer(offerId);
}).then(() => {
this.$router.push({
path: "/offer/result"
});
this.$modal.msgSuccess("删除成功");
}).catch(() => {});
},
}
};
</script>
<style>
.card-title{
font-size: 18px;
font-weight: bold;
margin-top: 10px;
}
.offer-header{
padding-bottom: 16px;
display: flex;
align-items: center;
justify-content: space-between;
}
.line{
display: flex;
align-items: center;
}
.line el-descriptions{
flex: 1;
}
.btn{
width: 60%;
display: flex;
align-items: center;
justify-content: space-around;
}
.title-font{
font-size: 16px;
font-weight: 600;
margin-top: 20px;
}
.title-font label{
margin-right: 20px;
}
.card{
margin-top: 20px;
}
</style>
<template>
<div class="app-container">
<el-card>
<div slot="header" class="card-title">跟进记录列表</div>
<!-- 列表 -->
<div class="offer-header">
<span style="font-size: 15px;">报价单号:{{list.length>0?list[0].number:''}}</span>
<el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
>新增</el-button>
</div>
<el-table v-loading="loading" :data="list">
<el-table-column label="序号" align="center" prop="id" type="index">
<template slot-scope="scope">
<span>{{scope.$index + 1}}</span>
</template>
</el-table-column>
<el-table-column label="跟进类型" align="center" prop="type" >
<template slot-scope="scope">
<dict-tag :type="DICT_TYPE.ECW_OFFER_TYPE" :value="scope.row.type"></dict-tag>
</template>
</el-table-column>
<el-table-column label="联系人" align="center" prop="contactName" />
<el-table-column label="跟进方式" align="center" prop="followUpMethod">
<template slot-scope="scope">
<dict-tag :type="DICT_TYPE.ECW_OFFER_METHOD" :value="scope.row.followUpMethod"></dict-tag>
</template>
</el-table-column>
<el-table-column label="跟进时间" align="center" prop="followUpTime" width="180">
<template slot-scope="scope">
<span>{{ scope.row.followUpTime}}</span>
</template>
</el-table-column>
<el-table-column label="客户反馈" align="center" prop="customerFeedback" />
<el-table-column label="处理结果" align="center" prop="processingResults" />
<el-table-column label="跟进业务员" align="center" prop="followUpSalesmanName" />
</el-table>
<pagination v-show="total > 0" :total="total" :page.sync="params.page" :limit.sync="params.rows"
@pagination="getList"/>
</el-card>
</div>
</template>
<script>
import {getOfferLogPage} from "@/api/ecw/offerLog";
import {DICT_TYPE} from '@/utils/dict'
export default {
name: "OfferLog",
components: {
},
data() {
return {
// 遮罩层
loading: true,
list: [],
total:0,
params:{
page:1,
rows:20,
offerId:0,
type:2
},
relationId:0,
creatorName:'test',
};
},
created() {
if(this.$route.query.offerId){
this.params.offerId = this.$route.query.offerId
this.relationId = this.$route.query.relationId
this.getList();
}
},
methods: {
/** 查询列表 */
getList() {
this.loading = true;
let params = {...this.params};
// 执行查询
getOfferLogPage(params).then(response => {
this.list = response.data.list;
this.total = response.data.total;
this.loading = false;
});
},
/** 新增按钮操作 */
handleAdd() {
this.$router.push({
path: "/offer/createLog",
query:{
offerId:this.params.offerId,
number:this.list[0].number,
relationId:this.relationId,
}
});
},
}
};
</script>
<style>
.card-title{
font-size: 18px;
font-weight: bold;
}
.offer-header{
padding-bottom: 16px;
display: flex;
align-items: center;
justify-content: space-between;
}
</style>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment